OmniAICreator/Qiita-1.07M huggingface dataset:
20220323 その１ Pythonの面白い記事、 Linux（Ubuntu on WSL2）でコマンドラインタイマー

### python

#### おもしろい記事：「a is not None」 と 「not a is None」の違い
[「a is not None」と「not a is None」は違うのか #Python - Qiita](https://qiita.com/junjis0203/items/25959074a8b642db7368)

### Linux(Ubuntu on WSL2)、コマンドラインでタイマー

お湯を沸かしている3分をはかりたい、キッチンタイマー使えよ、という気もするが足が生えているのかしょっちゅうどこかに行くので探すのが面倒だし、接触不良を（アルミホイルで）直し直し使ってるのでたまにボタン押しても反応が鈍い
高校生のときに買った100均のをこんなに長年に使っている人も少ないだろう😤

参考：
* [Linuxでアラームを設定する方法](https://ja.linux-console.net/?p=10196)
* [Linux Alarm Guide: How to Set Your Reminders or Wake-up Times](https://linuxiac.com/how-to-set-alarm-on-linux/) → atをつかってやる方法もある、わざわざdaemonうごかしたくないから使ってない

Linuxのコマンドラインでのやりかた
 ```
 $ sleep 3m && ./playsound.sh sounds/chimes.wav &
 ```
三分後にchimes.wavというのを鳴らす、chimes.wavはWindowsにあったやつ

もし、エラー(?)出力や終わったときに`Done ～～`がでてうっとおしいという場合はこんな風にする
参考： [Preventing bash from displaying "Done" when a background command finishes executing - Super User](https://superuser.com/questions/305933/preventing-bash-from-displaying-done-when-a-background-command-finishes-execut)
```
$ (sleep 3s && ./playsound.sh ./sounds/chimes.wav 2>1 >/dev/null &)
```

なお、playsounds.shはこんなの
```bash:playsound.sh
#!/bin/bash

PULSE_SERVER=unix:/mnt/wslg/PulseServer aplay $1
```
aplayってどうやって使えるようにしたんだっけ？
覚えてない
wavを再生するのにすごく苦労してあれこれ調べて、alsaがどうこう、でなにかをインストールした記憶もあるし、.bashrcにこんな設定もしていた（けどshで改めてやっているから.bashrcのは不要なはず）
```bash:.bashrc
# Audio
# export HOST_IP="$(ip route | awk '/^default/{print $3}')"
# export PULSE_SERVER="tcp:$HOST_IP"
export PULSE_SERVER=unix:/mnt/wslg/PulseServer
```
このあたり見たんだっけなあ？なにか記憶にあるのと違うけど
参考：
* [WSL2で音を鳴らす | web0](https://xshigee.github.io/web0/md/WSL2_Audio.html)
* [WSL2 でサウンド (PulseAudio) を動作させる方法 – digistart](https://elsefix.com/ja/how-to-get-the-sound-pulseaudio-to-work-on-wsl2.html)

backgroundで実行、とか究極にめんどいので、alarmというスクリプトにした
```bash:alarm
#!/bin/bash

DEFAULT_SOUND="./sounds/chimes.wav"
if [ "$1" = "" ]; then
  echo "Usage: alarm TIME [WAV FILE]"
  exit 0
fi
time=$1 && [ "$2" = "" ] && sound=$DEFAULT_SOUND || sound=$2

(sleep $time && PULSE_SERVER=unix:/mnt/wslg/PulseServer aplay $sound 2>1 >/dev/null &)
```

`$2="なにか"`みたいなことできないのかな、、、

大変参考にさせてもらいました
参考：
* [Bashの便利な構文だがよく忘れてしまうものの備忘録 #Linux - Qiita](https://qiita.com/Ping/items/57fd75465dfada76e633)
* [testコマンドの使い方: UNIX/Linuxの部屋](http://x68000.q-e-d.net/~68user/unix/pickup?test)
* [シェルスクリプトの三項演算子で注意するべきこと #ShellScript - Qiita](https://qiita.com/kokorinosoba/items/2f95ffd897b8ba2fe0de)

### アイデア
#### Google Spreadsheetでピクセルアート
PNGでもなんでも読み込ませて、ピクセルアートにするようなやつ、そんなGASを作りたい
すでにあった
[超便利スプレッドシートのアドオンとは？ 使い方や注意点、おすすめアドオンも紹介 [Google スプレッドシートの使い方] All About](https://allabout.co.jp/gm/gc/488033/)
Logi Options+のインストールができないときの対処法

OS：Windows 11

LogicoolのマウスのボタンをカスタマイズしたくてLogi Options+インストーラーをダウンロードするもののインストールができず、、
試しに管理者権限で実行してみてもできない

そんなときの対処法は**PCを再起動して再度インストーラーを実行するだけ**
筆者は管理者権限で実行することもなく、再起動してログインしたら右下にLogi Options+をインストールしますかとのポップアップが表示されました
それをクリックしたら無事そのままインストールすることができました

同じWindows11の他のPCでインストールするときは問題なかったので、稀に発生する現象だとは思いますが対応していただきたいですね、、、
Gemini API サンプルコード

```
import os

import google.generativeai as gemini
from dotenv import load_dotenv
from pathlib import Path

# .env ファイルを読み込む
load_dotenv()
# Gemini API キーを設定
gemini.configure(api_key=os.getenv("API_KEY"))

# モデルを準備
model = gemini.GenerativeModel("gemini-pro")
response = model.generate_content("鯖の塩焼きの健康効果を教えてください。")
print(response.text)
# プロンプトに画像を使用するためのモデルを準備
model = gemini.GenerativeModel("gemini-pro-vision")

img = [
    {
        "mime_type": "image/png",
        "data": Path(
            "/Users/username/Desktop/sample_gemini/hogehoge.png"
        ).read_bytes(),
    }
]

prompt = "画像には何が写っていますか？"
response = model.generate_content(contents=[prompt, img[0]])
print(response.text)

```
Salesforce認定アドミニストレーター過去問+時々解説　Q51 ~ Q60

## Q51. 所有権を一括移行できる標準オブジェクトはどれ？2つ選べ.

A リード
B 商談
C 取引先
D ケース

<details><summary>解答</summary>
A, C

解説: クイック検索から[所有権の一括変更]を見ると, 解答の通り記述がある. 
</details>

## Q52. メール-to-ケースに関する正しい説明はどれ？

A 25MB以上の添付ファイルを受信する事はできない
B メール-to-ケースエージェントをインストールする必要がある
C メールトラフィックをファイアウォール内に留める事ができる
D メール-to-ケースは有効後、無効にできない

<details><summary>解答</summary>
B, C, D

解説: メール-to-ケースの他に, オンデマンドメール-to-ケースがあり, それとの対比で考える. 
Aは, オンデマンドメール-to-ケースについての説明. メール-to-ケースは25MB以上を受信できる.
Bは, メール-to-ケースのみで必要.
Cも, メール-to-ケースで必要.
Dは, メール-to-ケースにおいてそうである. オンデマンドメール-to-ケースでは無効にすることもできる.
</details>

## Q53. Salesforceにレコードをインポートする前に, システム管理者が考慮すべきことは何ですか？答えを2つ選べ.

A インポートファイルには、各レコードに対する所有者が含まれていること
B 通貨項目の値は、デフォルトではレコード所有者となるユーザの個人の通貨が設定される
C インポートを実行する前に、インポートファイル内に重複するデータは削除しておく
D インポートウィザードを使ってデータをインポートするときは、入力規則はトリガされない

<details><summary>解答</summary>
A, C

解説: インポートを行う際に所有者を選択しないと, インポート主が所有者となる. また, 重複したデータをインポートすると, 重複データの削除作業など面倒なことが起こるから注意.
</details>

## Q54. 製品と価格表について, 正しい説明はどれですか？

A 製品の標準価格とリスト価格は複数の通貨で記載できます
B 製品は異なる価格表で異なる定価を持つことができます
C 資産を含む価格表に製品を含めることはできません
D 価格のない製品は自動的に標準価格表に追加されます

<details><summary>解答</summary>
A, B
</details>

## Q55. 営業ユーザが休暇を取る時に同僚へ簡単に知らせたいと考えています. 管理者はどのようにこの要件を実現しますか？

A Chatterの「不在メッセージ」機能を有効にします。
B Outlook SyncとSalesforceを有効にします。
C Process Builderを使用して、ユーザの休暇日を部門カレンダーに追加します。
D ワークフロールールを作成して、ユーザの休暇日に関する電子メールアラートを送信します。

<details><summary>解答</summary>
A

解説: Chatterプロファイル設置を行うと, 自分の名前の横に(例:　太郎(有給休暇中:3月10日~3月20日))と表示されるようになる. この設定により, 同僚へ簡単に休暇を知らせることができる.
</details>

## Q56. 次のうち, プロファイルで設定できないものは？

A ユーザライセンス
B ページレイアウト
C レコードタイプの設定
D 項目レベルセキュリティ
E ロール

<details><summary>解答</summary>
E

解説: ロールは[ロール]という設定する場所がある.
プロファイルでは, ユーザーが「見れるもの」と「できること」の決定を行う.
</details>

## Q57. ユーザグループに対して, オブジェクトごとにレコードへのアクセス権限を付与するものはどれ？

A 拡張リスト
B 共有ルール
C 割り当てルール
D ワークフロールール

<details><summary>解答</summary>
B

解説: レコードアクセス権というのは, 個々のレコードを見たりいじったりするための裏付けとなる権限であり, それは, 共有モデルによって決定される. 
試験対策としては, 共有モデル=レコードアクセス権とセットで覚えてもいいかも.
</details>

## Q58. 組織の共有設定でオブジェクトが「公開/参照・更新可能」に設定されている場合, 共有ルールの設定は必要ないですか？

A はい
B いいえ

<details><summary>解答</summary>
A

解説: レコードアクセス権においてまず初めに組織の共有設定を行うのだが, そこでは「非公開」「公開/参照のみ」「公開/参照・更新可能」の3つが設定でき, この段階で「公開/参照・更新可能」を選択している場合は, 公開されているし参照できるし更新できるというすでにオープンな状態なので, わざわざ共有ルールを設ける必要がない.
</details>

## Q59. 活動（Todoと行動）で実行することができる設定はどれですか？3つ選択してください.

A 項目トラッキング
B 検証ルール(入力規則)
C 割り当て
D ワークフロールール
E カスタム項目

<details><summary>解答</summary>
B, C, D

解説: そもそもTodoとは, やるべきことの「期限」や「担当者」を設定するところで, そのやるべきことに対する具体的な行動のことを「行動」という. それらには検証ルールや割り当て, ワークフロールールによる自動化が必要である.
</details>

## Q60. カスタムアプリケーションへのアクセス権を制限するために, システム管理者はどの機能を利用すればいい？

A プロファイル
B 共有ルール
C Webタブ
D ページレイアウト

<details><summary>解答</summary>
A
</details>

## Q61~Q70
https://qiita.com/taiga-shiokawa/items/d98b145d5ed20afcfdd4
カーソルの変更方法


# はじめに

カーソルの変更方法について説明します．
環境は windows11 です．

カーソルの種類や詳細については，[こちら](https://qiita.com/magix/items/e985f7d0a79105bc2085)を参照してください．

# 設定からカーソルを変更する

### 設定画面を開く

設定 -> 個人用設定 -> テーマ -> カーソルをクリックします．

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/b2e0c135-34c3-e776-acb0-1b0b207fc129.png">

カーソルの設定画面が表示されます．

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/88655f51-c49c-02aa-8676-fde7c4c96aad.png">

### カーソルの変更

変更したいカーソルの種類を選択し，ダブルクリックまたは参照ボタンをクリックしてカーソルを変更します．

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/8e2a85d9-b255-daf1-3463-55c69658f9d2.png">

:::note info
デフォルトのカーソルは，`C:\Windows\Cursors`に保存されています．
作成したカーソルもここに保存するのが良いでしょう．
:::

### カーソルグループの保存

:::note info
「名前を付けて保存」とすることで，現在設定されているカーソルを新たな種類として保存することができます．

また，保存したカーソルグループはプルダウンから変更することができます．

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/715d776f-0973-3ac3-23bf-a3243dcd28cb.png">

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/6c381783-e933-dbff-70ce-5563a65577e3.png">

:::

### 変更の適用

最後に，**適用ボタン**をクリックすることで，変更が適用されます．

**OK ボタン**をクリックすることで，設定画面を閉じることができます．

# RealCursorEditor を使ってカーソルを作成する

RealCursorEditor を開き，カスタマイズタブを選択します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/aa9c1674-3f48-44d7-03cd-8c16b944b028.png)

変更したいカーソルの種類を選択し，参照ボタンをクリックしてカーソルを変更します．
**ドラックアンドドロップ**でも行うことができます．

:::note info
設定でカーソルを変更した場合は，RealCursorEditor を再起動することで変更が反映されます．
:::

変更したら適用ボタンをクリックすることで，変更が適用されます．

::: note warn
RealCursorEditor では，カーソルグループを作成することができません．
作成したい場合は，設定からカーソルを変更する方法を参照してください．
:::
ReactアプリをGitHub Pagesに公開する手順

# はじめに
手順としては全く複雑ではないものの、勘違いからデプロイ完了までに時間がかかってしまったので、今回は備忘録として記事を書くことにしました。

# 手順
## gh-pagesをインストール
以下のコマンドを入力してライブラリをインストールしましょう
```
npm install gh-pages --save-dev
```

## package.jsonを修正
package.jsonの以下のように修正してください
```package.json
略
  },
  "homepage": "https://<GitHubのユーザー名>.github.io/<リポジトリ名>/",
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "predeploy": "npm run build",
    "deploy": "gh-pages -d build"
  },
略
```
今回は``homepage``と``predeploy``と``deploy``を追記しました。
ここで注意点として、homepageに記載するURLは後述するGitHub Pagesが発行するURLとは違う場合があります(大文字と小文字の違いに注意)。私の場合はユーザー名には大文字の箇所があったのですが、発行されたURLはすべて小文字になっており、その違いに気づかず一時間以上使ってしまいました。
```
今回間違えていた点)
"homepage": "https://Test-User.github.io/test/",

Github Pagesが発行するURL: "https://test-user.github.io/test/",
```

## デプロイ
次のコマンドを入力してデプロイしましょう
```
npm run deploy
```

## GitHubでセッティング
GitHubにプッシュ後、リポジトリのSettingsでPagesにアクセスします。gh-pagesを使用したことでgh-pagesブランチが作成されていると思うので、今回はそれを用いてSaveを行なってください(隣の設定は``/root``のまま)。しばらくするとURLが発行されると思うので、そこにアクセスして確認しましょう。

以上が手順になります。
WSLのDockerで開発していたらめちゃくちゃ重くなった話

## 状況
勉強用にWSLを利用したDockerで環境構築し、開発を進めていた。
フロントエンドにはViteを導入し、ホットリロード（ファイルに変更があると自動でブラウザも更新）機能が使える！と思ったが、一向に更新されない。

というか、**ブラウザを更新してみたら何分もかかる...**。
これはおかしいと思い、解決した際の備忘録

## 原因
- ソースコードを、WSL(Linux)のファイルシステム上に配置していなかったこと
<br>
この状態になっていると、LinuxであるDockerコンテナに対してリクエストが行われた際にWindowsOS上のコードを参照するため、都度Windows→Linuxへのファイル変換が行われてしまいます。

僕はLaravel+React+Viteの環境で開発していたのですが、Laravelの大量コードを都度変換していると考えると、そりゃ激重になりますわな。

## 解決策
ファイル変換が起きないようにすればよい！
<br>

てなわけで、WSLのLinux環境内にソースコードを配置するだけです。
```
\\wsl.localhost\Ubuntu\home\[username]
```
こちらのパスをエクスプローラで表示するとWSL上のファイルを参照できるので、このパスの配下にプロジェクトフォルダを移動させます。
毎回入力するのがめんどくさい人はクイックアクセスにピン止めするのをお勧めします。
<br>

僕は[username]配下にプロジェクトを配置しました。
すると、激重ブラウザも解消されてホットリロードも効くようになりました！！


## おわりに
WSL環境を使い慣れている人にとっては当たり前のことかもしれませんが、同じようにつまずいている人は多いのでは？とおもって書いてみましたとさ。

### 参考
https://zenn.dev/conbrio/articles/fcf937c4049132
JIS G5502球状黒鉛鋳鉄品の黒鉛球状化率の測定（ブラウザ上で行う）

以前の記事で、JIS G5502の黒鉛球状化率の測定をJIS法とISO法で行うプログラムをPython＋OpenCVで作成して下のURLで公開しました。しかし、このプログラムの実行にはPythonの環境構築が必要になり、使える人が限定されてしまいます。

https://qiita.com/_Moony/items/2faf01955b7b88873066

そこで今回は、ブラウザで動くプログラムを作成しました。作成したプログラムは以下のJIS法、ISO法のURLで実行できます。

JIS法

https://repositoryfiles.github.io/Nodularity-WebApp/nodularity_JIS.html

ISO法

https://repositoryfiles.github.io/Nodularity-WebApp/nodularity_ISO.html

Readme

https://repositoryfiles.github.io/Nodularity-WebApp/

ソースファイルはこちらにあります。使い方や注意事項についてはREADMEをご参照ください。

https://github.com/repositoryfiles/Nodularity-WebApp

何かのご参考になれば幸いです。
カーソルの種類


# はじめに

カーソルを趣味で作成しており，その際にカーソルについていろいろと調べたので，その中で見つけた情報を共有します．

## カーソルの種類

ウィンドウズの変更可能なカーソルは，以下の種類があります．

| カーソルの種類           | 説明                                         | css         |
| ------------------------ | -------------------------------------------- | ----------- |
| 通常の選択               | 通常の選択                                   | default     |
| ヘルプの選択             | ヘルプボタンがある際に使われる．**レア**     | help        |
| バックグラウンドで作業中 | 作業自体は可                                 | progress    |
| 待ち状態                 | 別の作業も不可                               | wait        |
| 領域選択                 | 画面の一部のスクリーンショットなどで使われる | crosshair   |
| テキスト選択             | テキスト選択                                 | text        |
| 手書き                   | 手書きの際**レア**                           |             |
| 利用不可                 | 禁止の行動のときに使われる                   | not-allowed |
| 上下に拡大/縮小          |                                              | ns-resize   |
| 左右に拡大/縮小          |                                              | ew-resize   |
| 斜めに拡大/縮小 1        | 北西方向に拡大/縮小                          | nwse-resize |
| 縦横に拡大/縮小 2        | 北東方向に拡大/縮小                          | nesw-resize |
| 移動                     | コンテンツの移動                             | move        |
| 代替選択                 | おそらくもう使われていない                   |             |
| リンクの選択             | デフォでは通常の選択と同じことが多い         | pointer     |
| 場所の選択               | ほとんど使われていない                       |             |
| 人の選択                 | ほとんど使われていない                       |             |

## カーソルの指定

これらは，上記の表のとおり，css の`cursor`プロパティで指定できます．

```css
/* ヘルプの選択の場合  */
body {
  cursor: help;
}
```

:::note warn
css で指定できないカーソルの種類もあります．
:::

## カーソルの確認

どのようなカーソルの種類があるか見たい時ができたので，このページを作成しました．

https://soranjiro.github.io/cursor/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670528/c2feba4f-dd65-495b-89e7-01991a87fb80.png)

それぞれの枠内にカーソルを合わせると，そのカーソルの種類が表示されます．

:::note warn
赤色背景の枠は，css で指定できないカーソルの種類です．
:::

簡単に，カーソルの種類を確認できるので，趣味でカーソルを作成している人などは，よければ参考にしてみてください．

ソースも公開しているので，興味があれば見てみてください．

https://github.com/soranjiro/cursor
AppStoreのページを開こうとすると「ページを開けません。アドレスが無効です。」と表示される話

単純に知らなかっただけの話ですが、アプリの新しいバージョンがあればストアページを開く処理を実装時のミスのお話です。

通常、各プラットフォームのストアのURLで開くことができます。
iOS(例　code: jp, appID: 999999)
```
https://apps.apple.com/${code}/app/id${appID}
```
Android(例　appID: com.example.app_name)
```
https://play.google.com/store/apps/details?id=${appID}
```

ですが、今回はiOSの場合だけ、ストアを開こうとすると「ページを開けません。アドレスが無効です。」と表示される問題が発生しました。
調べても、モバイルデータ通信をオンにするとか設定周りの事しか書かれていない為、結構時間を食いました。

結論から言うと、実装を簡易確認（URLが正しいか）する為にシミュレータで行っていたためでした。
恐らくシミュレータには、AppStoreのアプリが入っていないのでそれが原因のようです。
実機では、正しく動作しました。

知っていれば、こんな単純なミスは無いと思いますが同じ問題で時間を取られない様にメモっておきます。
アポロニウスの円の軌跡とPython

# はじめに 
二定点からの距離の比率が等しいという条件を課した場合の軌跡は円になる。これをアポロニウスの円というのだが、今回はこのことについて、証明したのち、Pythonを用いてシミュレーションをしてみる。具体的に前半は、ユークリッド距離の定義式を用いて証明について議論し、後半ではPythonの複素数機能を用いてプログラムを実装することとする。
# アポロニウスの円
## 導入
定点A,Bに関してAP:PB=一定という条件を課したときに点Pの軌跡は円または直線（AP=BPのとき）を描くというものである。
## 証明
$A(a,0),B(b,0)$として$P(x,y)$とした場合、APとBPは以下のようにして表すことができる。

```math
AP=\sqrt{(x-a)^2+y^2}
```
```math
BP=\sqrt{(x-b)^2+y^2}
```

したがって、Cを定数とした場合、

```math
\frac{AP}{BP}=C
```
が成立することから、

```math
\frac{AP^2}{BP^2}=C^2
```

ゆえに、AP,BPを代入すると以下のようになる。


```math
(x-a)^2+y^2=C^2\{(x-b)^2+y^2\}
```

これを解くと以下のようになる


```math
(C^2-1)x^2+(C^2-1)y^2-2(bC^2-a)x+(b^2C^2-1^2)=0
```
$C^2-1\ne 0$とすると、上式は円の軌跡を描く。

# プログラム
さて、距離の比率が一定という条件を課した場合、アポロニウスの円を描くかどうかを調べるために、以下の制約条件で点をプロットするプログラムを書いた。

```math
\frac{AP}{BP}+\frac{BP}{AP}=C_1
```

ただし、$C_1$は定数である。


このような条件に対応するプログラムをいかに示す。


```python apo_cir.py
import numpy as np
import matplotlib.pyplot as plt
import math
import japanize_matplotlib

m=2
n=100

#座標空間の設定
x=np.linspace(0,m,n)
y=np.linspace(0,m,n)

X,Y=np.meshgrid(x,y)

#2定点の設定
Z_0=0
Z_1=1
#複素数平面の導入
Z=X+1j*Y
#2つのユークリッド距離の設定
d0=abs(Z-Z_0)
d1=abs(Z-Z_1)

d=d1/d0+d0/d1
#等高線図の描写3nは等高線の本数
plt.contour(X,Y,d,3*n)
plt.colorbar(label="距離の比率")
plt.savefig("アポロニウスの円.png")
plt.show()
```
このプログラムを実行した場合、以下のような画像が出力される。
したがって、このような条件を課すると円の軌跡を描くということがシミュレーションにおいても確認することができた。

![アポロニウスの円.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/3be156e7-7ca7-9709-8fd9-faccf9978cd5.png)

# まとめ
2定点からの距離の比率が一定となるような軌跡をアポロニウスの円といい、今回は実際に証明し、Pythonを用いてシミュレーションを行った。すると、2点間に円の軌跡を描くということが分かった。
Amazon Bedrockを利用できるデスクトップアプリ「Amazon Bedrock Client for Mac」を試してみた

# これはなに

Amazon Bedrockを利用できるMac用デスクトップアプリがAWSのGitHubリポジトリで公開されていたので試してみました（[v1.1.6](https://github.com/aws-samples/amazon-bedrock-client-for-mac/releases/tag/v1.1.6)時点）！

https://github.com/aws-samples/amazon-bedrock-client-for-mac

# インストール、セットアップ

インストール手順は[README.md](https://github.com/aws-samples/amazon-bedrock-client-for-mac/blob/b91af5b5d2b8e45acf9046960bb474455d4142e9/README.md)に記載されています。

Bedrockへの接続にはローカルに構成したIAMユーザー情報（`~/.aws/credentials`）が使われます。
アプリ側ではプロファイルを切り替えることができず、デフォルトプロファイルを使うようになっているので注意しましょう。

IAMユーザーには`IAMAmazonBedrockReadOnly`ポリシーと`bedrock:InvokeModel*`権限を与えておけば一通りの動作確認はできました。

# 使ってみる

画面の立ち上がりはこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/66f37b10-7136-c6eb-aac8-d5283a51c144.png)

モデルアクセスを有効にしているものから選んでチャットを始めることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/ddc70088-96f5-d93d-7720-05be4c8cb3f9.png)

Claude 3 Sonnetを試してみました。画像のアップロードにも対応しているのでマルチモーダル問い合わせも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/dae735ba-ae87-c652-c6de-f50cb86f0a3e.png)

New Chatからまた新しい会話を始めることができます。
今度はClaude 3 Haikuに同じことを聞いてみました。

デスクトップアプリらしくタブ機能が付いているので、複数のモデルを比較しながら回答を眺めることができるのはいいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/639ae800-ff36-c118-a89d-191d6923e815.png)

画像生成モデルも問題なく利用できますが、プレイグラウンドのように生成時のパラメータは制御できないようです。

# 感想

Bedrockで利用できる生成AIモデルとの対話はマネジメントコンソールのプレイグラウンドからもできますが、いちいちマネコンを開く必要があったり、あくまで試すだけの機能なので会話ごとの履歴を保存しておいたりといったChatGPTライクな使い方はできません。

このアプリがあれば、デスクトップから手軽にBedrockの豊富なモデルを切り替えて生成AIと対話することができるので、Bedrockを純粋に作業補助に役立てることができそうです！

---

https://github.com/aws-samples/generative-ai-use-cases-jp

AWSの提供するBedrockのユースケースサンプルとしては↑こちらも素晴らしい出来栄えで、このような実用的な実装例をOSSで出してもらえるのはとてもありがたいですね。
監視カメラでの雪の影響の除去

車載分野では、自動運転のためのカメラ画像の利用が進んでいる。

雪が降っているの状況で、性能がでるかが気になる。

監視カメラの分野では、画像鮮明化の1例として降雪中の状況での視界の改善がなされてきた。
まあ、知るべき人は既に知っている中身だろうが書いてみた。

## 読んでほしい方々
- 車載カメラでの自動運転の画像認識の開発者
- 上記のための学習用・評価用データの作成者

## 解決するべき課題の明確化
- 降雪中の視界が悪化する状況が自動運転のシーンの中にもある。
- 降雪環境のデータを無視すると起こりうること：
    - 降雪中の雪が作り出す視界の欠損のために、対象物を検出できない
    - 降雪中の雪の存在のために近距離に物体があると判定してしまうこと

- [雪の日に気を付けたい。カメラ式先進運転支援システムの弱点とは](https://yamamotosinya.livedoor.blog/archives/52576125.html)
- [周辺にある対象物との距離や位置を測定するLiDARは雪の影響を受けやすいため自動運転の安全性が低下](https://cobby.jp/snow-selfdriving.html)
- 一般社団法人　日本自動車工業会[自動運転の安全性評価フレームワーク Ver2.0](https://www.jama.or.jp/operation/safety/automated_driving/pdf/framework_ver_2_0.pdf)
この中にも落ち葉の影響についての記述がある。



## 降雪時の画像鮮明化の既存例
- [降雪画像アルゴリズム](http://www.isc-net.co.jp/case/post-22/)

- [鮮明化内蔵ネットワークカメラ](https://www.lad.co.jp/product/lisr-ipc1/)

- pdf [雨・雪に強い監視カメラ用前景分離アルゴリズム](https://www.seeds.sd.tmu.ac.jp/assets/files/download/abst/2008-17-1400B-7.pdf)

- pdf [画像鮮明化技術と操作支援ソリューションへの応用](https://www.jstage.jst.go.jp/article/iieej/44/3/44_544/_pdf)

- [画像鮮明化ユニット - 企業7社の製品一覧](https://www.ipros.jp/cg2/%E7%94%BB%E5%83%8F%E9%AE%AE%E6%98%8E%E5%8C%96%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88/)

- [雪道走行の視界をリアルタイムに“除雪”！ 岩崎が「Clear Drive」を開発](https://kenkey.jp/news/article/1855?page=2)

- [ステレオカメラを用いたADAS機能の降雨環境下における認識性能に関する研究](https://www.jstage.jst.go.jp/article/jsaeronbun/54/6/54_20234605/_pdf)
C++/Java系言語で1文字だけでコメントアウトするブロックを切り替える

# 概要

プログラミングをしていると実装の方式を試してみることがあると思います。あるいは、別の実装でうまくいくか自信のない時、今あるものはコメントアウトしておいて別の実装を試してみたり。そんな場合、今時はエディターの機能で簡単にブロックをコメントアウトしたりできますが、言語仕様をうまく使って一文字編集するだけでコードブロックをコメントアウトする小技を大昔に思いついていて今でも使うことがあるので紹介します。実装中の試行錯誤の時には便利です。

この技はC++/Java/Javascript系の、ブロックコメント`/* ... */`とインラインコメント`//`がサポートされている言語で利用できます。

# ブロックを`/`の削除でコメントアウトする

以下のように書いておくと、一番最初の`/`を削除すると最初の行がインラインコメントからブロックコメントに切り替わり、ブロック全体がコメントアウトされます。

```javascript
//*
var x = foo;
//*/
```

先頭行が`//`で始まると、最初と最後の行がどちらもインラインコメントになり、`/*`で始まるとそこから一番最後の`*/`までがブロックコメントになるわけですね。

![commentout-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628554/a040cec4-7834-9e38-8271-9683e101ff1b.gif)


# コメントアウトするブロックを切り替える

先ほどのテクニックの応用編で、二つのブロックのうち、どちらを利用するのかを先頭の`/`で切り替えます。

```javascript
//*
var x = "foo";
/*/
var x = "bar";
//*/
```

真ん中にある`/*/`がポイントで、最初がブロックコメントになっていたらそちらとペアになって前半をブロックコメントにし、なっていなかったらそこからブロックコメントが始まって最後の`*/`で閉じる、というふうに動きます。

![commentout-3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2628554/0fba2ba2-a5d9-9fea-f10b-29c461ceaad3.gif)


# まとめ

結構便利で思いついた時には変な満足感がありました。ただしご覧の通りこれ以上ないくらい小手先のテクニックで、当然ながらリポジトリにコミットする場合には消しておくべきコメントですので、レビュワーから怒られる前にきちんと削除してコミットしましょう。
stable-diffusion-webui The NVIDIA driver on your system is too old 対策 windows

## stable-diffusion-webuiを更新したらNVIDIA driverのバージョンが違うので怒られた
windows環境。  
```
RuntimeError: The NVIDIA driver on your system is too old (found version 11070). 
Please update your GPU driver by downloading and installing a new version from the URL:
http://www.nvidia.com/Download/index.aspx Alternatively,
go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver.
 ```

 書いてあることはお前のNVIDIA driverバージョンはversion 11070だから古いぞ
 NVIDIA driverのバージョンをあげるかpytorchのバージョンを合わせろってことです。

 ## NVIDIAドライバーの更新はしたくないのでPyTorchのバージョンを揃えよう
 まず自分が使ってるCUDAのバージョンを確認する
 コマンドプロンプトで
 ```
 nvidia-smi
 ```
 を実行
いろいろ出てくるけど上の方にCUDA Versionが書いてあって
CUDA Version: 11.7だとわかりました。

## pytorchのCUDA 11.7に適したやつを探す
公式サイト↓(https://pytorch.org )に行って

 https://pytorch.org

11.7で検索すると
```
pytorch==2.0.1 torchvision==0.15.2
```
を
```
https://download.pytorch.org/whl/cu117
```
から落とせって書いてある。

##  stable-diffusion-webuiでpytorchのバージョンを指定してあるところを編集する
TORCH_COMMANDでGrep検索すると
stable-diffusion-webui\modules\launch_utils.pyの318行目くらいに
```
torch_index_url = os.environ.get('TORCH_INDEX_URL', "https://download.pytorch.org/whl/cu121")
torch_command = os.environ.get('TORCH_COMMAND', f"pip install torch==2.1.2 torchvision==0.16.2 --extra-index-url {torch_index_url}")
```
があってここで torch==2.1.2を指定してあるぽいので
```
torch_index_url = os.environ.get('TORCH_INDEX_URL', "https://download.pytorch.org/whl/cu117")
torch_command = os.environ.get('TORCH_COMMAND', f"pip install torch==2.0.1+cu117 torchvision==0.15.2+cu117 --extra-index-url {torch_index_url}")
```
に書き換える。

stable-diffusion-webui直下のwebui-macos-env.shに
```
export TORCH_COMMAND="pip install torch==2.1.0 torchvision==0.16.0"
```
って書いてあってwindowsだからここ参照してなさそうだけど一応
```
export TORCH_COMMAND="pip install torch==2.0.1+cu117 torchvision==0.15.2+cu117 --extra-index-url https://download.pytorch.org/whl/cu117"
```
にしておく


## webui実行ファイルの設定を変えてpytorchの再インストールをする
webui-user.bat
```
set COMMANDLINE_ARGS=--skip-torch-cuda-test --reinstall-torch 
```
を書き込む。もしかしてここでTORCH_COMMANDをSETしてもいいのかもしれない
これでwebui-user.batを実行するとpytorchの再インストールが始まって2.0.1にできた。

webuiもうまく動いてそうである。めでたしめでたし。
OCI - HPC Cluster: queues.conf v2.10.4.1

:::note info
本ページは [OCI: HPC Cluster](https://qiita.com/itokazu/items/63d2e3cebdcdda5afce0) のサブページになります。
:::

queues.conf ファイルの内容は以下のようにな YAML 形式で記述されています。これらの値を必要に応じて変更します。

```
  queues:
    - name: compute
      default: true
      instance_types:
        - name: hpc-default
          default: true
          shape: BM.Optimized3.36
          instance_keyword: hpc
          permanent: false
          cluster_network: true
          compute_cluster: false
          max_number_nodes: 1000
          max_cluster_size: 50
          max_cluster_count: 1
          region: ap-tokyo-1
          ad: LZML:AP-TOKYO-1-AD-1
          private_subnet: 172.16.4.0/22
          private_subnet_id: ocid1.subnet.oc1...
          image: ocid1.image.oc1..
          targetCompartment: ocid1.compartment.oc1..
          boot_volume_size: 100
          use_marketplace_image: true
          use_compute_agent: true
          instance_pool_ocpus: 2
          instance_pool_memory: 16
          instance_pool_custom_memory: false
          marketplace_listing: HPC_OL8
          hyperthreading: false
```

queues.conf の各項目と内容は以下のようになっています。
| 大項目 | 項目 | 設定値 |設定内容 |
|:-|:-|:-|:-|
| queues  | name  | 文字列 | キュー名 (重複不可。ハイフン使用不可)  |
|   | default  | 文字列 | デフォルトのキューとするかの指定  |
| instance_types  | 文字列 | name  | 定義するインスタンスの名前 (重複不可。英字、数字、ハイフンのみ。FQDN と同じルール)   |
|   | default  | true/false | デフォルトのインスタンスタイプとするかの指定  |
|   | shape  | shape 名 | Shape の指定 |
|   | instance_keyword  | 文字列 |キーワードの指定 (重複不可。英字、数字、ハイフンのみ。FQDN と同じルール)  |
|   | permanent  | true/false |常時起動(true) または Autoscaling(false) の指定  |
|   | cluster_network  | true/false|Cluster Network の利用の有無 |
|   | cluster_network  | true/false|Compute Cluster の利用の有無(Cluster Networkがtrueが条件) |
|   | max_number_nodes  | 数値 | 最大ノード数の指定  |
|   | max_cluster_size  | 数値 | 1クラスタ内の最大ノード数の指定  |
|   | max_cluster_count | 数値 | 最大クラスタ数の指定 |
|   | ad  | AD 文字列 | デプロイ先の AD の指定  |
|   | image  | ID 文字列 | 利用する OS のイメージ ID の指定  |
|   | targetCompartment  | ID 文字列 |デプロイ先のコンパートメント ID の指定  |
|   | boot_volume_size  | 数値(50〜) |boot volume サイズの指定  |
|   | use_marketplace_image  | true/false |Marketplace 提供の OS 利用について  |
|   | instance_pool_ocpus  | 数値 | Flex インスタンスを利用する際の OCPU 数  |
|   | instance_pool_memory | 数値 |Flex インスタンスを利用する際のメモリ容量  |
|   | instance_pool_custom_memory  | 数値 | Flex インスタンスを利用する際に  |
|   | marketplace_listing  | イメージ名称 |利用するイメージの名称  |
|   | hyperthreading  | true/false | Hyperthreading の設定(BMのみ有効)  |
「ソース・フォルダーは java プロジェクトではありません」というEclipse上のエラーを解決する

結論 : プロジェクトファセットを編集する
```
対象プロジェクトを右クリック
[プロパティ] -> 
[プロジェクトファセット] -> 
[ファセットフォームに変換] -> 
[Java] ->
適用して閉じる
```

Q. プロジェクトファセットとは
ランタイム（EclipseがJavaプロジェクトをビルドするのに必要な要素）の一つ。
多分この設定をしないと、きちんとビルドが走って警告とエラーが表示されなくなるっぽい。

参考
[よくわからんQAのサイト](https://www.web-dev-qa-db-ja.com/ja/java/「ソースフォルダーはeclipseでjavaプロジェクト」エラーではありません/1067882357/)
[ibmのプロジェクトファセットについて](https://www.ibm.com/docs/ja/rsas/7.5.0?topic=projects-project-facets)
[Oracle](https://docs.oracle.com/cd/F25597_01/document/products/workshop/docs92/ws_platform/ideuserguide/conFacets.html)

余談
きちんと調べて書きたかったけど、時間が経ってそこまでの興味が持てなくなったので、一旦解決方法だけで投稿しています。
OCI - HPC Cluster: queues.conf v2.9.2

:::note info
本ページは [OCI: HPC Cluster](https://qiita.com/itokazu/items/63d2e3cebdcdda5afce0) のサブページになります。
:::

queues.conf ファイルの内容は以下のようにな YAML 形式で記述されています。これらの値を必要に応じて変更します。

```
 queues:
    - name: compute
      default: true
      instance_types:					
        - name: hpc-default
          default: true
          shape: BM.Optimized3.36
          instance_keyword: hpc
          permanent: false
          cluster_network: true
          max_number_nodes: 2
          max_cluster_size: 2
          max_cluster_count: 1
          ad: LZML:AP-TOKYO-1-AD-1
          image: ocid1.image.oc1..
          targetCompartment: ocid1.compartment.oc1..
          boot_volume_size: 50
          use_marketplace_image: true
          instance_pool_ocpus: 2
          instance_pool_memory: 16
          instance_pool_custom_memory: false
          marketplace_listing: 4. Oracle Linux 7.9 OFED 5.0-2.1.8.0 RHCK 20210709
          hyperthreading: false
```

queues.conf の各項目と内容は以下のようになっています。
| 大項目 | 項目 | 設定値 |設定内容 |
|:-|:-|:-|:-|
| queues  | name  | 文字列 | キュー名 (重複不可。ハイフン使用不可)  |
|   | default  | 文字列 | デフォルトのキューとするかの指定  |
| instance_types  | 文字列 | name  | 定義するインスタンスの名前 (重複不可。英字、数字、ハイフンのみ。FQDN と同じルール)   |
|   | default  | true/false | デフォルトのインスタンスタイプとするかの指定  |
|   | shape  | shape 名 | Shape の指定 |
|   | instance_keyword  | 文字列 |キーワードの指定 (重複不可。英字、数字、ハイフンのみ。FQDN と同じルール)  |
|   | permanent  | true/false |常時起動(true) または Autoscaling(false) の指定  |
|   | cluster_network  | true/false|Cluster Network の利用の有無 |
|   | max_number_nodes  | 数値 | 最大ノード数の指定  |
|   | max_cluster_size  | 数値 | 1クラスタ内の最大ノード数の指定  |
|   | max_cluster_count | 数値 | 最大クラスタ数の指定 |
|   | ad  | AD 文字列 | デプロイ先の AD の指定  |
|   | image  | ID 文字列 | 利用する OS のイメージ ID の指定  |
|   | targetCompartment  | ID 文字列 |デプロイ先のコンパートメント ID の指定  |
|   | boot_volume_size  | 数値(50〜) |boot volume サイズの指定  |
|   | use_marketplace_image  | true/false |Marketplace 提供の OS 利用について  |
|   | instance_pool_ocpus  | 数値 | Flex インスタンスを利用する際の OCPU 数  |
|   |  instance_pool_memory | 数値 |Flex インスタンスを利用する際のメモリ容量  |
|   | instance_pool_custom_memory  | 数値 | Flex インスタンスを利用する際に  |
|   | marketplace_listing  | イメージ名称 |利用するイメージの名称  |
|   | hyperthreading  | true/false | Hyperthreading の設定(BMのみ有効)  |
Windows環境下で、VSCodeのGit Bash内にパスを通す

# 背景
客先常駐をしていると、大概Windowsを使う必要に迫られます。
Cmdを使うのであれば、Windows内の設定からパスを通せば良いのでかなり簡単です。
ただ、ど〜しても宗教上の問題でCmdを使いたくない、Bashがあるならそれが良い…。
まぁただ単に、CmdよりもUnix系のシェルの方が馴染み深いので、色々試行錯誤してみました。

# 設定の前提
VScodeのシェルの設定にはこのあたりがきちんと書いてなかったので、勘で設定する必要があります。
ちなみに、GitBashを立ち上げてその中で環境変数の設定を打ち込んでも、永続化されません。このあたりは、VSCode内のシェルが立ち上がる時に読み込んでいる設定ファイルが通常のシェルとは違った経由で起動することが原因のようです。
VSCodeのSettings.jsonに設定を書き込むことで、パスの永続化を図れるので、そうやります。

# 本題
```Settings.json
"terminal.integrated.env.windows": {
    "PATH": "D:/develop/node:$PATH"
}
```
`:$PATH`大事なのはこの部分でした。
こんな感じでパスを通すことで、nodeコマンドがGitBashから素早く起動することができます。

# 参考にしたもの
ChatGPT （試行錯誤したやつを送ったら、いい感じに教えてくれました。何参考にして回答出てきたんだろ。）
[VSCodeの公式ドキュメント](https://code.visualstudio.com/docs/terminal/profiles)

# 余談
ちなみにですが、Git Bashをターミナルのデフォに設定する方法は公式ドキュメントに書いてあります。
【JavaScript】変数の宣言

# 変数の宣言
JavaScriptにおける変数の宣言には、`const`、`let`、`var`の3つがあります。

1. `const`:
   `const`キーワードは、ブロックスコープ内でのみ有効な定数を宣言するために使用されます。`const`で宣言された変数は再代入も再宣言もできません。

   ```javascript
   const x = 10;
   // x = 20; // エラー: 再代入はできない
   ```

2. `let`:
   `let`キーワードは、ブロックスコープ内でのみ有効な変数を宣言するために使用されます。`let`で宣言された変数は再宣言ができませんが、再代入は可能です。

   ```javascript
   let x = 10;
   x = 20; // 再代入が可能
   ```

3. `var`:
   `var`キーワードは、古いバージョンのJavaScriptで使用されている変数宣言方法です。関数スコープまたはグローバルスコープでのみ有効であり、ブロックスコープではないため、変数が宣言されたブロックの外からでもアクセス可能です。`var`で宣言された変数は再宣言が可能です。

   ```javascript
   var x = 10;
   var y = 20;
   ```

# まとめ
変数の宣言は基本的に`const`か`let`を使用することが推奨されます。`var`は古い構文であり、ブロックスコープを無視するなどの問題があるため、可能な限り避けるべきです。常に変数のスコープと再代入可能性を考慮して適切なキーワードを選択することが重要です。
【Rails】テーブルのリレーションを柔軟に設定する

## これはなに？

テーブル設計において、リレーションは大切な要素です。
一般的には`belongs_to`や`has_many`等で紐づけをします。
モデル内で紐づけるテーブルを指定することでこれを実現することができます。

本記事は、紐づけるテーブルを柔軟に設定できる「ポリモーフィック関連付け」という方法を学んだのでそのアウトプットです。

## どんなことができるようになるのか？

結論、ポリモーフィック関連付けを活用するには、テーブル内に2つのカラムが必要となります。

- xx_type: 紐づけるテーブルを指定
- xx_id: 紐づけ先のid

xxは、関連付けるモデル名に基づいて命名されます。

例えば今、以下の3つのテーブルがあるとします。

- 子（関連付けられるテーブル）: hoge
- 親（関連付け候補のテーブル）: fuga
- 親（関連付け候補のテーブル）: piyo

ここでhoge, fuga, piyoテーブルはそれぞれポリモーフィック関連付けされているとします。

hogeテーブルに`foo_type`と`foo_id`というカラムを用意したとき、それぞれのインスタンスにて

- foo_type: fuga とするとfugaテーブルと紐付き、foo_idはfugaテーブルのidを参照します。
- foo_type: piyo とするとpiyoテーブルと紐付き、foo_idはpiyoテーブルのidを参照します。

このとき、@hoge.foo によってfoo_idと一致するidを持つfuga（またはpiyo）のインスタンスを呼び出すことが可能となります。

つまり、**子が紐づけられる親を選べるようになる**ということです。

## 実装例

ポリモーフィック関連付けをRailsで実現するには、親と子のモデルを以下のように実装します。

### 子

```ruby:Hoge
class Hoge < ApplicationRecord
  belongs_to :foo, polymorphic: true
end
```

ポイントは、以下の2点です。

- 関連付けの命名
  - 関連付け名をbelongs_toで指定します。今回はfooとしたので、このモデルにはfoo_typeとfoo_idカラムが存在します。
- polymorphic: trueの指定
  - これにより、Hogeモデルが複数のモデルに属することを指定できます。

### 親

```ruby:Fuga
class Fuga < ApplicationRecord
  has_one :hoge, as: :foo
end
```

ポイントは以下の2点です。

- 紐づけモデルの指定
  - 通常のリレーションと同様に、has_oneで紐づけを指定します。
- 関連付けの指定
  - as: で、関連付け名を指定します。今回はfooを指定しているので、子モデルのfoo_typeにfugaが指定されたら紐づけされます。


## 実装例

例として、Userが登録するときに、Twitterアカウントで登録するかGitHubアカウントで登録するかで紐づけテーブルを変える場合を考えます。

Userが持つカラム
- id
- name
- account_type
- account_id

Twitterが持つカラム
- id
- twitter_id
- twitter_name

GitHubが持つカラム
- id
- github_id
- github_url

で、それぞれのモデルを作成します。

### モデルファイル

```ruby
# app/models/user.rb
class User < ApplicationRecord
  belongs_to :account, polymorphic: true
end

# app/models/twitter.rb
class Twitter < ApplicationRecord
  has_one :user, as: :account
end

# app/models/github.rb
class GitHub < ApplicationRecord
  has_one :user, as: :account
end
```

### マイグレーションファイル

```ruby
class AddAccountToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :account_type, :string
    add_column :users, :account_id, :integer
    add_index :users, [:account_type, :account_id]
  end
end
```

### 使用例

```ruby
# 新規のTwitterアカウントを作成する
twitter_account = Twitter.create(twitter_id: "12345", twitter_name: "example")

# twitter_accountと紐づくUserを作成
user = User.create(name: "Example User", account: twitter_account)
# このとき、account: twitter_accountによって紐づけられるTwitterモデルのオブジェクトが設定される

# user情報からTwitter名を取得
name = user.account.twitter_name
# => "example"
```

## 詳細に知りたい方向け

https://railsguides.jp/association_basics.html#%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91
Nano Piをいじる（その３）

# 文鎮化されたNano Pi復活劇（大げさ）
久しぶりのNano Pi投稿。実は下記コマンド（ブートローダー領域クリア）を実施して、文鎮化してしまっていた。
```
dd if=/dev/zero of=/dev/mmcblk2 bs=8M count=1
```

## 背景
### SDカードブートNG
当初、SDカードブートができず、上記のコマンドを実施（本家サイト情報）してブートローダー領域を初期化すれば、SDカードブートができるだろうと思っていたが、それもできず、しばらく文鎮化していた。

### 調べると意外な結果
半年レベルのブランクを経て、再度トライすることに。購入先はアマゾン「[NanoPi R5S RK3568 4GBメモリ 16GB eMMC トリプルLANポート](https://www.amazon.co.jp/NanoPi-R5S-RK3568-4GB%E3%83%A1%E3%83%A2%E3%83%AA-%E3%83%88%E3%83%AA%E3%83%97%E3%83%ABLAN%E3%83%9D%E3%83%BC%E3%83%88/dp/B0C191942K/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3G9AGIB51KRMB&keywords=NANO+PI&qid=1688990518&sprefix=nano+pi%2Caps%2C238&sr=8-3)」とあった。ものをよく見ると（分解も実施）、実はR5Sではなく、「NanoPi R6S」であった。HDMIケーブルの差し口が、R5SとR6Sとでは異なることで判明。つまり、R5S用のイメージでずっと試していたため、動作するわけがない。

なお、R6Sのほうが１万円ほど高価である。アマゾンに出していた店舗が誤って送付したのであろう。

## 文鎮からの復活
わかってしまえが簡単なことだったが、イメージ書き込みには紆余曲折があった。以降、「NanoPi R6S」のイメージ書き込みを記録。

### USB経由での書き込み
基本的には、本家サイト
- [4.5.3.3 Option 3: Install OS via USB](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R6S#Option_3:_Install_OS_via_USB)

に従う。実際には、書き込み用ツールの英語の説明書と中国語のUIを比べながら実施。
- PCにドライバのインストール（DriverAssitant）
- 書き込み用ツール（RKDevTool）の利用
- イメージのダウンロード（[https://download.friendlyelec.com/NanoPiR6S](https://download.friendlyelec.com/NanoPiR6S)）および書き込み

#### イメージ（01_Official images/03_USB upgrade images）
”03_USB upgrade images”にあるイメージ（*.zip）をダウンロードして解凍する。回答したフォルダー内にある「RKDevTool」を起動（下記赤枠）。
![Captureのコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b78edf5b-89cc-629f-c4fb-04ec67ba47d7.png)
起動後、下記赤をクリック。
![ConfigLoadのコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d02f846b-00d0-1646-dd67-0786bf81c1ef.png)
するとファイル選択の画面になり、
![ConfigLoad2のコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f2793a13-b731-0737-12e4-7f9c39ca557b.png)
”config.cfg”を選択する。次に、USBケーブルを接続（右側）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/9ff54ddd-62d1-86ac-eb73-f6eeff3a1137.png", width=60%>
Maskを押しながら起動する（サイトでは３秒程度とあったが相当長めの方がよさそうであった）。すると、下記の青枠のように、”MASKROM”云々のメッセージが表示される。
![MaskRomModeのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6b750633-4f5c-9574-796d-0e76f1372ba0.png)
ここで、赤枠をクリックすると、イメージが書き込まれる。
![UpdateOKのコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/577b1ca0-8684-a809-36c8-b70053c8e12d.png)
上記赤枠のように”完成”が表示されればよい。また、”完成”後は、青枠のように”MASKROM”が見えなくなる。書き込みモードではないのであろう。

### SDカードによる書き込み
本家サイトの説明は下記となる。
- [4.5.3 Install OS to eMMC](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R6S#Install_OS_to_eMMC)

こちらに従って、イメージを書き込んだSDカードからブートするのみ。書き込み中の画面が下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/13d53089-9694-3fea-35b8-259c1c71be4d.png)
書き込みが終わると下記表示となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/696ef171-0a08-7424-0db0-144392cde111.png)
書き込み終了時の本体の様子は下記となった。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/66518a22-deef-8168-d018-a7663a8ed7df.png", width=60%>

## 終わりに
買ったものが何かを確認しよう。
JAWS大阪にてAWSのボードゲームで楽しんだ！

皆さん、このたびAWSユーザーコミュニティであるJAWSのイベントにて**AWSのボードゲーム**で遊んできましたので共有したいと思います😊

なんのことかと思うかもしれませんが少々お付き合いください、、

#### 1.「AWS BuilderCards」

題の通り、ボードゲームの名前は「AWS BuilderCards」と言います。

しかし、このボードゲームはAWSのイベントで配布されているため非売品になります🤣
AWS Summit Japan 2024で手に入れたいです！
(会社でチームビルディングとかに使えそうです）

今回のJAWSで遊ばせてもらった日本語版のカードもJAWS-UG方々のご尽力でJAWS DAYS 2024で初披露されたそうです。

#### 2.参加までの流れなど

JAWS-UG 大阪のイベントを以下のサイトでウォッチしていたところ、楽しそうなイベントを発見しました。

https://jawsugosaka.doorkeeper.jp/

そこで早速申し込みました。
今回のイベントは満員だったので、早めに申し込んでよかったです😂
会社のトレーナーの先輩も誘ったのですが間に合いませんでした、、

https://jawsugosaka.doorkeeper.jp/events/170442

当日はそこまで時間がなかったので、１ゲーム２０分でやりました。
２０分だと大抵最後まで終わりません笑

なので短期決戦で勝つために少しゲームの方向性が変わってしまうということが起こっている所もありました🤣

#### 3. ゲームについて

イメージを持っていただけるように当日の写真を載せます！

こちらが自分のデッキになります。
![IMG_4776.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/c68d437e-4b50-3574-6343-3bb3dfe05e63.jpeg)

そしてこちらが机の中央に置いている「AWS marketplace」上のカードになります。
基本的にこの「AWS marketplace」からカードを買っていくという流れになります。
買う際にAWSの知識があるとどのサービスを組み合わせると強いか・相性がいいかなどがわかるので有利です😎
![IMG_4778.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583957/de1cbad6-316c-3154-09ea-dce70eda0238.jpeg)

私は１回プレーしましたが、完璧にはルールを理解できていないので次の機会までにYoutube等で理解を深めたいと思います！！

#### 4.おわりに
今回はボードゲームのイベントに参加しましたが、JAWsでは様々なイベントが企画されています。
そして年齢を問わず勉強意識の高い方々と出会えるので、ぜひ行って欲しいです！
最初は緊張すると思いますが、そんな時は会社の同期や先輩・上司を巻き込んでいくといいかもですね😊
[Unity]Firebaseのアップデート(.tgzファイルを使用する場合)

# 概要
UnityでFirebaseを扱う場合、方法がいくつかあります。今回は.tgzファイルを使用してアップデートする場合の手順を共有します。初めてのインストールの場合でもほぼ同じ手順でいけると思います。

# 最初に
自分のプロジェクトはFirebaseのインストールに.tgzファイルを使ったかどうか忘れてしまった場合、プロジェクトフォルダのPackages/manifest.jsonファイルを開いて**com.google.firebase〜.tgz**の記述があるかどうかで確認する事が出来ます。

Firebaseを扱う方式は**混在**させる事が出来ません。ここに書いている手順が使えるのは.tgzでインストールをしてあるプロジェクトの場合だけです。



# 本文
## 前準備
Firebase最新版のバージョンはここで確認できます。→ [Firebase Unity SDK Release Notes](https://firebase.google.com/support/release-notes/unity?_gl=1*yosfxh*_up*MQ..*_ga*MTQyOTA1NzY2Mi4xNzExMDc3MTY4*_ga_CW55HF8NVT*MTcxMTA3NzE2OC4xLjAuMTcxMTA3NzE2OC4wLjAuMA..)

![スクリーンショット 2024-03-23 7.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/468fa003-3556-defc-1b1b-e4b933aaefae.png)


.tgzファイルを使ってインストールをしていた場合、最新バージョンが更新されてもPackageManagerには最新版へのアップデートボタンが表示されません。
![スクリーンショット 2024-03-22 13.06.40のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/03c494e5-b208-e8ab-1e9e-6409f054397e.png)



最新版のパッケージをダウンロードします。→ [Download Google packages for Unity](https://developers.google.com/unity/archive?hl=en)

ページ右側の目次を参考にするか、キーワードで検索して必要なファイルをダウンロードしていきます。

:::note warn
Firebaseを扱うときは各プロダクトのバージョンを同じにする必要があります。バージョンをバラバラにすると不具合に繋がるので必ず統一します。
:::

今回はExternal Dependency Manager、Firebase Core、その他プロダクトをダウンロードしました。

![スクリーンショット 2024-03-23 7.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/be4424d8-651c-f3c0-f276-159316d8a243.png)

:::note warn
もし初めてFirebaseをインストールする場合は
１External Dependency Manager
２Firebase Core
３その他プロダクト
の順番を守ってインポートする必要があります。
（アップデートの場合は気にしなくても大丈夫です）
:::

## インポート
プロジェクトフォルダ直下にGooglePackagesフォルダがあると思います（初めてのインストールの場合はフォルダを作成してください）。その中にある.tgzファイルを今回ダウンロードした最新バージョンのものに置き換えます。


![スクリーンショット 2024-03-23 7.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c0ffa99c-4d00-c380-79d4-d7d634aeff44.png)

次にプロジェクトフォルダのPackages/manifest.jsonファイルを開いてFirebase各プロダクトのバージョンを最新のものに書き変えて保存します。（初めてのインストールの場合はこの記述を追加してください）

```json

{
  "dependencies": {
    "com.google.external-dependency-manager": "file:../GooglePackages/com.google.external-dependency-manager-1.2.179.tgz",
    "com.google.firebase.analytics": "file:../GooglePackages/com.google.firebase.analytics-11.8.0.tgz",
    "com.google.firebase.app": "file:../GooglePackages/com.google.firebase.app-11.8.0.tgz",
    "com.google.firebase.crashlytics": "file:../GooglePackages/com.google.firebase.crashlytics-11.8.0.tgz",
    // 以下、com.unity package 関連の記述
  },
}
```

この後Unityがアクティブになるとパッケージのインポートが行われて無事作業は完了になります！

![スクリーンショット 2024-03-22 14.54.50のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/d99f0bbd-6b2d-076e-6868-728fda124573.png)

# 補足1
必要ないと思いますが、念のためUnityEditorを再起動しておくとなお良いと思います！

# 補足2
[参考にした公式の手順](https://firebase.google.com/docs/unity/setup-alternative?hl=ja#open-close-manifest)
【Salesforce】カスタム表示ラベルの設定

# カスタム表示ラベルとは

カスタム表示ラベルは、Apex クラス、Visualforce ページ、または Lightning コンポーネントからアクセスできるカスタムテキスト値です。テキスト値は、Salesforce でサポートされるすべての言語に翻訳することができます。


組織では、最大 5,000 個のカスタム表示ラベルを作成でき、長さは最大 1,000 文字です。管理パッケージのカスタム表示ラベルは、この制限に含まれません。

カスタム表示ラベルにアクセスするには、[設定] から、[クイック検索] ボックスに「カスタム表示ラベル」と入力し、[カスタム表示ラベル] を選択します。

# カスタム表示ラベルの設定

設定から「カスタム表示ラベル」と検索します。
新規カスタム表示ラベルを押下します。

![00カスタム表示ラベルの検索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/d80ddf63-047e-b0c3-d06c-fcd5067a3c66.png)

簡単な説明、名前を入力して、値に表示させたい内容（デフォルトの値）を入力します。

![01カスタム表示ラベルの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/672b330a-1d0b-7dfa-2408-cf685dd9144e.png)

新規カスタム表示ラベルを押下します。

![02カスタム表示ラベルの設定完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/66f0dc65-b1ab-5b32-5aef-24463af1a09e.png)

# カスタム項目の設定
試しにカスタム項目を作成します。

![03カスタム項目の作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/a701caf2-5540-918d-654c-8e7372532425.png)

デフォルト値を設定します。
差し込み項目の種類で、$Labelを選択します。
項目の挿入で該当のカスタム表示ラベルを選択します。

![04カスタム項目の数式準備.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/b93c0214-13b9-36a2-f5db-87b1aa00bf9f.png)

```
デフォルト値
$Label.PhoneDefaultValue
```

![04.5デフォルト値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/eef57e97-71e2-603d-47c5-edf14b5f381f.png)

# 取引先の新規作成
取引先を新規作成してみます。
先ほど作成した担当電話に、デフォルトで値が入力されました。

![05取引先の新規作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/186b5012-7cdd-a7a9-5853-d7e130ef43d7.png)

# Apex構文

Apex では、System.Label.Label_name 構文を使用します。
System.Label クラスでメソッドを使用して、翻訳された表示ラベルを確認および取得することもできます。

# Apexで確認
Apexデバッグでも確認してみます。

![05.5Apexデバッグテスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/94a15656-49d2-6ff6-f9b3-ae612ec8426c.png)

該当するラベルが表示されました。

![06Apexデバッグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/6b72ad01-e690-9999-2956-7b7cfe4da244.png)

いかがでしたでしょうか。
頻繁に使用するテキストをカスタム表示ラベルとして作成しておき、項目やApexで使用することにより、表記のブレや、修正の反映漏れを防ぐことができるかと思います。

参考URL

https://help.salesforce.com/s/articleView?id=sf.cl_about.htm&type=5
Salesforceメジャーリリース時の準備と手順

# はじめに
Salesforceでは年3回のメジャーリリースがあり、Salesforceを運用する上で避けては通れません。
しかし、その手順や準備はなかなか複雑で大変なものです。
今回は、メジャーリリース時の準備と手順についてまとめてみました。

# Salesforceのメジャーリリースとは
Salesforceをアップデートすることを目的に定期的に実施されるリリースです。このリリースでは新規の追加、パフォーマンスやセキュリティの改善、総合的なシステムのアップデートを目的に実施されます。
リリースは年3回、2月、6月、10月に実施されます。それぞれのリリースに下記のような名称がついています。
| リリース月 |名称|
|:-:|:-:|
| 2024年2月 | Spring'24 |
| 2024年6月 | Summer'24 |
| 2024年10月 | Winter'25 |

10月のリリースは2024年なのに「'25」となる点がややこしい..

# メジャーリリースに伴うリグレッションテスト
リリース実施前には、リリースが既存機能に与える影響を確認するためのテストを実施する必要があります。
テストを実施することで、リリースが業務に及ぼす影響を事前に把握し、対処することができます。リリースによって想定外の不具合を発生させないためにも非常に重要な作業となります。
リグレッションテストの主な確認事項は下記になります。
- 開発部品の動作確認
フロー、Apex、Visualforce、外部システムとの連携機能等
- 重要処理の動作確認
主要業務フローのシナリオテスト実施
- メジャーリリースによる変更の確認
UIの変更内容の確認や、自動的に有効化される新機能の確認

 # スケジュール
 メジャーリリースのおおよそのスケジュール感は下記のようになります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674790/d896d6f4-3d6e-4ba6-335f-bc1df1790199.png)
※参考：https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D53A00002zDi3CSAS
[JP]-Salesforce メジャーリリースにおけるテストの考え方.pdf
　　
Sandboxプレビュー期間というものが設けられています。この期間にSandbox上にのみリリース内容が反映されるので、リグレッションテストを実施します。
尚、Sandbox上にリリース内容を反映するためにはsandboxプレビュー参加対応期限までにプレビュー用Sandboxを用意する必要がありますのでご注意ください。

# リリース手順
具体的なリリース手順について解説していきます。
### リリース分析
1. 英語版リリースノートが公開されたら内容を確認し、想定される影響範囲を調査します。
日本語版リリースノートはSandboxプレビュー期間中の公開になってしまうので、英語版でおおよその内容を把握する必要があります。
翻訳しながら確認していきましょう。
2. リリースノートの内容を踏まえてテスト観点・テスト範囲を整理しましょう。
3. Sandboxプレビュー期間の確認をしましょう。
リリース日はインスタンス毎に異なるため、該当するインスタンスのメンテナンス情報を下記URLから確認します。
URL：https://status.salesforce.com/
### テスト計画
1. テストケース・スケジュールの作成
2. Sandboxのリフレッシュ
現新比較のために、プレビュー用と未プレビュー用の2種類のSandboxを用意することが望ましいです。
プレビュー用のSandboxはSandboxプレビュー参加対応期限までに用意しましょう。
### テスト実行
1. 作成したテスト計画を元にリグレッションテストを実施します。
2. 不具合があった場合は、本番リリース日までに修正対応します。
修正が間に合わない場合は原因の新機能を無効にする等の対応が必要になります。
### ユーザー通知
1. リリーススケジュールの説明、新機能や変更点の説明、社内ヘルプデスクや管理ユーザーへの教育等を実施し、ユーザーに必要事項を通知します。
### 本番リリース
1. リリース時間帯に起動するバッチが起動することのないように確認します。
2. リリース後に本番環境で基本的な動作確認テストを実施します。
3. 動作確認で問題がなければ、ユーザーへリリース完了通知を実施します。

# おわりに
リリース手順についてまとめさせていただきました。
リリース手順は注意点が多く複雑ですが、Salesforceを運用する上で非常に重要です。
ご参考になれば嬉しいです。
【Flutter】androidのデバッグをしようとしたらこけちゃった話


androidでもエミュレータを使用してデバッグしようとしたら上手く立ち上がらない…困ったもんだ。

## Execution failed for task ':app:mapDebugSourceSetPaths'

デバッグを実行したら、つらつらと下記の状態が流れてきた。
![スクリーンショット 2024-03-22 15.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669888/53f9ebbb-a844-817e-5225-60629f04771e.png)



んー、よくわからん。実行に失敗してるのは伝わるが、なにが良くないかさっぱりなので、検索してみる。

### `com.google.gms:google-services`のバージョンを上げる

[こちらのサイト](https://punaime.jp/flutter-firebase-initial-setup-guide/)に詳しく書かれていた。
依存関係の問題で、`com.google.gms:google-services`のバージョンを上げると解決する。

`android/build.gradle`
```
buildscript {
  dependencies {
    classpath 'com.android.tools.build:gradle:7.3.0'  
    // START: FlutterFire Configuration  
    // classpath 'com.google.gms:google-services:4.3.10' // ここを変更 
    classpath 'com.google.gms:google-services:4.3.14'  // 変更後
    // END: FlutterFire Configuration  
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}
```

## Execution failed for task ':app:compileDebugKotlin'.

上記を変更して、もう一度デバッグを実行したら今度は表題のエラーが発生。
内容は以下の通り。
![スクリーンショット 2024-03-22 15.40.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669888/caf0132a-374d-48f0-b52d-6344a35bbaf2.png)

白枠の中を見てみると、Kotlinは最新バージョンが必要だから更新しなさいと書いているので、[Kotlinの公式ドキュメント](https://kotlinlang.org/docs/releases.html#release-details)を確認しに行く。

そうすると、`android/build.gradle`に書かれているバージョンと最新のバージョンが違っていた。（投稿日時点での最新は1.9.23）
ので、その部分を変更してみる。
`android/build.gradle`
```
buildscript {
  // ext.kotlin_version = '1.7.10' //変更前
  ext.kotlin_version = '1.9.23' // 変更後
}
```

## 成功！
やったね！

![スクリーンショット 2024-03-22 15.47.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669888/fd74ab72-7a65-a522-2404-cfe9df61b53a.png)


参考

https://punaime.jp/flutter-firebase-initial-setup-guide/
ググるときに使う英単語

# はじめに

ググるときの武器はなんぼあってもいいですからね〜

ということで、自分語りさせていただきます。よろしくお願いします。

# 一次情報・公式：`documentation` / `reference`

例：`ruby length size documentation` / `ruby length size reference`

公式・一次情報を探すときに使います。

例では`ruby`の`length`と`size`について検索しています。（`ruby`の`Array`クラスにおいて、`length`と`size`は同じものです。）

`documentation`と`reference`の違いですが、イメージとして
- `documentation`は「チュートリアル」などの一連の流れがあるもの。端的に言えば初心者〜向け
- `reference`はメソッドひとつひとつについての解説など、辞書的なもの。端的に言えば中級者〜向け

こんなイメージがあります。間違っていたら教えて下さい。

# 語源：`etymology`

例：`volume etymology`

語源を探します。

<font color="LimeGreen">単語の意味を理解したい時、理解を深めたいときに使います。</font>

例では、`volume`という言葉の語源を探しています。
`volume`は一般的に「音量」「量がある」の意味がありますが、他に「巻数」の意味があります（vol.1など）
さらに、プログラミングにおいては「保管場所」を指します（`/Volumes`ディレクトリ・Dockerの`volume`）。

この語源は「巻物」のようです。
転じて、
- 「巻く（動詞）」
- 「本」→「本の厚さ」→「大きさ・量」→「大きい・量のある」
- 「情報の保管場所」

このような意味になったようです。つながってるんですね〜
# 略語：`abbreviation`

例：`arguments abbreviation`

略語を探します。
例では、`arguments`（引数）の略語を探していますね。
検索したところ、`args`が良さそうと出てきました。

<font color="LimeGreen">主に、変数や関数（アクション）・引数の命名を行う際に使います。</font>
短くてかっこいい、英語としても間違ってない名前をつけたい！
# ソースコードを見る：`github`

例：`ruby github`
これはちょっと変わり種ですが、直接ソースコードを覗くという方法もあります。

実際、先程紹介した`ruby` `Array`クラスの`length` `size`の違いがわからず、直接ソースコードを覗いて解決したということがありました。

https://qiita.com/kohki_takatama/items/c8236b6a2e267e2dad20
# おわりに

今回紹介した語句は一字一句覚えようとしなくて大丈夫です。
例えば`documentaion`なら`doc...`くらい覚えとけば、検索候補に出てきます。
`ethymology`も`ety...`で大丈夫。
`abbreviation`も`abb...`で大丈夫です。

さて、次は何を書こうかしら・・・
Dockerコンテナ間のAPI通信でハマった話 - host.docker.internalの存在

## 追記(2024/07/16)

本記事はフロントエンドのNext.jsをSSRで使用する場合に該当します。CSRの場合は問題がありませんでした。

## 前提知識

- Dockerを使って、フロントエンドとバックエンドを別々のコンテナで開発していた
- フロントエンドにはNext.js14(AppRouter)、バックエンドにはRails7を使用

## 問題

フロントエンドからバックエンドへのAPI呼び出しを行おうとしたが、うまく通信ができなかった。
フロントエンドのコードでは、バックエンドのAPIエンドポイントを`http://localhost:3000/api/...`のように指定していた。

## 原因

Dockerコンテナ内では`localhost`が指すのはコンテナ自身であり、別のコンテナを指すことができない。そのため、フロントエンドのコンテナから`localhost`を使ってバックエンドのコンテナにアクセスしようとしても、正しく通信ができなかった。

## 解決方法

### Next.jsコンテナの設定

Dockerコンテナ間で通信を行う際には、`host.docker.internal`を使用する。`host.docker.internal`は、Dockerコンテナから見たホストマシンのIPアドレスを表す特殊なDNS名である。

フロントエンドのコードを以下のように修正する。

```javascript
// 修正前
const apiEndpoint = 'http://localhost:3000/api/...';

// 修正後
const apiEndpoint = 'http://host.docker.internal:3000/api/...';
```

### Railsコンテナの設定

Railsコンテナ側では、`config/environments/development.rb`ファイルに以下の設定を追加する。

```ruby
config.hosts << "host.docker.internal"
```

この設定により、RailsがDocker外部からのリクエストを受け付けるようになる。

これらの修正によって、Next.jsのコンテナからRailsのコンテナへの通信が正常に行えるようになる。

## まとめ

- Dockerコンテナ間でAPI通信を行う際は、`localhost`ではなく`host.docker.internal`を使用する必要がある
- `host.docker.internal`は、Dockerコンテナから見たホストマシンのIPアドレスを表す特殊なDNS名
- Next.jsコンテナではAPIエンドポイントの指定を`host.docker.internal`に変更し、Railsコンテナでは`config.hosts`に`host.docker.internal`を追加する
- Dockerを使った開発では、コンテナ間の通信方法を正しく理解しておくことが重要