OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxユーザーとグループ管理コマンド - ユーザー属性の変更


# ユーザー属性の変更

`usermod` コマンドはユーザー属性を変更するために使用されます。

## フォーマット：
```
usermod [options] LOGIN
```

## よく使うオプション
- `-c` | `--comment COMMENT` # コメントを変更する
- `-d` | `--home HOME_DIR` # ホームディレクトリを変更する
- `-e` | `--expiredate EXPIRE_DATE` # アカウントの有効期限日を変更する（YYYY-MM-DD 形式）
- `-f` | `--inactive INACTIVE` # パスワードが期限切れになった後、アカウントが完全に無効になるまでの日数（0はパスワード期限切れと同時に無効、-1はこの機能を使用しない）
- `-g` | `--gid GROUP` # グループを変更する
- `-G` | `--groups GROUPS` # groupName|GID... 新しい追加グループ、元の追加グループは上書きされる；元のを保持するには`-a`オプションも同時に使用する
- `-a` | `--append GROUP` # ユーザーを上記の `-G` に記載された追加グループに追加する（他のグループからこのユーザーを削除しない）
- `-l` | `--login LOGIN` # 新しいログイン名
- `-L` | `--lock` # ユーザーアカウントをロックする／`/etc/shadow`のパスワード欄に`!`が追加される
- `-m` | `--move-home` # ホームディレクトリの内容を新しい場所に移動する、`-d`と一緒に使う
- `-o` | `--non-unique` # 重複する（ユニークではない）UIDを許可する
- `-p` | `--password PASSWORD` # パスワードを変更するが、ここでは平文が必要、この場でパスワードを変更するには暗号化された文字列を使う
- `-s` | `--shell SHELL` # ログインシェルを変更する
- `-u` | `--uid UID` # UIDを変更する
- `-U` | `--unlock` # ユーザーアカウントのロックを解除する、`/etc/shadow`のパスワード欄の`!`を削除する

## ユーザー情報の変更例

```shell
[root@rocky8 ~]# id tom
uid=1003(tom) gid=1003(tom) groups=1003(tom)

[root@rocky8 ~]# usermod -c "tom to jerry" -l jerry tom

[root@rocky8 ~]# id jerry
uid=1003(jerry) gid=1003(tom) groups=1003(tom)
```

## ユーザーのロック

ロックされたユーザーはログインできなくなります。

```shell
[root@rocky8 ~]# getent shadow jose
jose:$6$1gfAZcky1hjTfVX0$dcImV6yr9xWzfcfeUI0zXH3p0t0OG71nzUcqD7MoLID8bzsoPKS60Cu
oGbWv.e.qXzzXknAqTfTWvMlZzpp.i/:19158:0:99999:7:::

[root@rocky8 ~]# usermod -L jose

[root@rocky8 ~]# getent shadow jose
jose:!$6$1gfAZcky1hjTfVX0$dcImV6yr9xWzfcfeUI0zXH3p0t0OG71nzUcqD7MoLID8bzsoPKS60C
uoGbWv.e.qXzzXknAqTfTWvMlZzpp.i/:19158:0:99999:7:::
```

## ユーザーのロック解除

```shell
[root@rocky8 ~]# usermod -U jose

[root@rocky8 ~]# getent shadow jose
jose:$6$1gfAZcky1hjTfVX0$dcImV6yr9xWzfcfeUI0zXH3p0t0OG71nzUcqD7MoLID8bzsoPKS60Cu
oGbWv.e.qXzzXknAqTfTWvMlZzpp.i/:19158:0:99999:7:::
```

CentOSはパスワードのないユーザーのログインを許可しているため、`!!`が2つあります。これは `-U` オプションでロックを解除することはできません。

言い換えると、ロック解除はパスワードがあるユーザーにのみ関係がありますが、直接 `/etc/shadow` ファイルを編集してパスワード欄を空にし、パスワードのないユーザーを作ることができます。

```shell
[root@rocky8 ~]# getent shadow jerry
jerry:!!:19168:0:99999:7:::

[root@rocky8 ~]# usermod -U jerry
usermod: unlocking the user's password would result in a passwordless account.
You should set a password with usermod -p to unlock this user's password.

[root@rocky8 ~]# getent shadow jerry
jerry:!!:19168:0:99999:7:::
```
devcontainer + doker-compose環境でkeycloakでrealmをインポートする

KeycloakのVersion 18を利用しています。

devcontainerでkeycloakを使いたかったので、devcontainer起動時にexportしておいたrealmのimportをしようとしたところ、調べて出てきた`KEYCLOAK_IMPORT` が `KC_IMPORT` が動きませんでした。


調べてみると以下のような情報が出てきました。上記の変数は利用できなくなっているようです。

https://github.com/keycloak/keycloak/issues/10216


情報を整理したところ以下の方法で実現できました。


### Export
以下のコマンドでexportするとユーザも含めてrealmをexportできます。

```sh
/opt/keycloak/bin/kc.sh export --realm myrealm --users realm_file --file /tmp/realm.json
```
### 自動Import
devcontainerのworkspaceに `./keycloak` というディレクトリを作って上記でexportした`realm.json`を配置して以下の定義からdevcontainerを起動します。

- `./keycloak`を`/opt/keycloak/data/import` にマウントします
- start-devに `--import-realm` の引数を付けます

```yaml
  keycloak:
    image: quay.io/keycloak/keycloak:18.0.2
    restart: unless-stopped
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
    volumes:
      - ${LOCAL_WORKSPACE_FOLDER:-./keycloak}:/opt/keycloak/data/import:ro
    command: ["start-dev","--import-realm"]
    networks:
      - datacatalog-network
```

コンテナのログを確認するとインポートされていることが確認できます。

```sh
keycloak_1  | 2024-03-05 14:04:47,840 INFO  [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm
keycloak_1  | 2024-03-05 14:04:49,964 INFO  [org.keycloak.services] (main) KC-SERVICES0004: Imported realm myrealm from file /opt/keycloak/bin/../data/import/realm.json.
```
WindowsServerで、SQL Serverのファイアウォール設定について

複数の名前付きインスタンスを運用する場合、ポート番号を固定して接続するのは運用的に難しい場合があります。
特定のネットワークのみ、SQLServerへの接続を許可したいのですが、Windows Defender ファイアウォールの設定をどのようにしたらいいのかを記載します。

受信規則で、以下のプログラムの接続を許可し、作成した規則のプロパティから、スコープのリモートアドレスを設定すればいいようです。
%ProgramFiles% (x86)\Microsoft SQL Server\90\Shared\sqlbrowser.exe
%ProgramFiles%\Microsoft SQL Server\<バージョン>.<インスタンス名>\MSSQL\Binn\sqlservr.exe

| | バージョン |
|:-----------|:------------:|
|SQL Server2022|MSSQL16|
|SQL Server2019|MSSQL15|
|SQL Server2017|MSSQL14|
|SQL Server2016|MSSQL13|
|SQL Server2014|MSSQL12|
Azure Synapse Analytics 専用SQLプールでのテーブル名、カラム型、カラム名変更など

表題の件、構文がバラバラだったので備忘録としてまとめておこうと思います。
※2024/03/05現在の情報。今後より良い方法ができたり機能が削除されたりする可能性あり。

```sql
-- テーブル名変更
rename object SCM01.TBL_A to TBL_B;
-- カラム型変更
alter table SCM01.TBL_B alter column COL_A NVARCHAR(10); 
-- カラム名変更
sp_rename 'SCM01.TBL_B.COL_A', 'COL_B', 'COLUMN';
```
構成要素を持つ型 Part.2

構成要素を持つ型 Part.2
構造体(struct)編
---
構造体（struct）とは,クラス同様同じような処理を集めた箱のようなものです！
classとstructの使い分け↓
```
アプリに新しいデータ型を追加するときに意味のあるオプションを選択するために、次の推奨事項を検討してください。

・基本的にはstructを使用する。
・Objective-Cの相互運用性が必要な場合は、classを使用する。
・データのIDを制御する必要がある場合は、classを使用する。
・継承をモデル化し共有するために、structとprotocolを使用する。
```

https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes

↑Apple参考

初期値なし
---
structはclassと同様インスタンスを作成してよびだします。structに初期値が設定されていない場合はインスタンス作成時に初期値を指定する！

サンプルプログラム1
```
//structの定義
struct VegetablesPrice {
    var asparagus:Int;
    var potato:Int;
    var onion:Int;
    var tomato:Int;
    var paprika:Int;
}

//インスタンスを作成して初期値を指定する
let price = VegetablesPrice(asparagus: 100, potato: 150, onion: 190, tomato: 170, paprika: 160)

print("asparagus : (price.asparagus)")  
print("potato : (price.potato)")
print("onion : (price.onion)")
print("tomato : (price.tomato)")
print("paprika : (price.paprika)")
```
実行結果：
```
asparagus:100
potato:150
onion:190
tomato:170
paprika:160
```

初期値あり
---
structに値が設定されてる場合は、インスタンス作成時に引数を指定しなくてよい!

サンプルプログラム2
```
//structの定義
struct VegetablesPrice {
    var asparagus:100;
    var potato:150;
    var onion:190;
    var tomato:170;
    var paprika:160;
}

//インスタンスを作成
let price = VegetablesPrice();

print("asparagus : (price.asparagus)")  
print("potato : (price.potato)")
print("onion : (price.onion)")
print("tomato : (price.tomato)")
print("paprika : (price.paprika)")
```
実行結果:
```
asparagus:100
potato:150
onion:190
tomato:170
paprika:160
```

構成要素を持つ型 Part.1 ↓

https://qiita.com/jgatmjgawpjga/items/53487ddbe88d44c23627
【Rails】Bootstrap5系の画面遷移後の動作がうまくいかない問題を解決！

こんばんは！
最近Bootstrap最新版を導入し、新しい機能を追加して浮かれていたところ『あれ？うまくいかないな』と思う部分がありました。
具体的には、リロード後は問題ないのですが画面遷移などをした後にオフキャンバスやドロップダウンなどの機能が作動しないといったものでした。
メンターさんに質問し、なぜそうなっていたのか理解できたので共有してみようと思います。

## 環境
Rails 6系
Bootstrap 最新版(5.3?)
Cloud9

## 原因
ズバリ、Rails特有のターボリンク(Turbolinks)が画面遷移後にBootstrapのJavascriptを使っている部分を読み込めなくしているとのことでした。そういえば、普通にRailsでjsファイルに書き込むときはターボリンク無効化する記述しているのになんでBootstrapではその発想が思いつかなかったんだ！と自分の技量不足に反省しつつ、、、
そもそもターボリンクとは？という方は[こちら](https://zenn.dev/ganmo3/articles/d234583bdc876f)を参考にしてみてください。

ターボリンクは最初にページを読み込むときにしかhead内とjsファイルなどを読み込まず読み込み速度を高速化させる性質があるので、画面遷移後にBootstrapがうまく動いていなかったようです。ただ、メンターさんによればターボリンクはそこまで高速化してくれてるかというとそうでもないらしいので、解決方法としては

::: note info
アプリ内のターボリンクをすべて無効化する！
:::

がいいようです。たしかに実際ターボリンクを無効化してみて最初の画面を読み込むときだけ少し時間かかるかも？ぐらいでした。正直あまり変わっていない印象なので、この解決方法で納得できました。

部分的に無効化することもできますがBootstrapを使っていると、すべてに記述していくのはとても大変なので、、、

## 具体的な解決方法
app/javascript/packs/application.jsを開き、ターボリンクの記述をコメントアウトすることで、ターボリンクを無効化します。
```js:app/javascript/packs/application.js
Rails.start()
// Turbolinks.start() 
ActiveStorage.start()
```
このように`Turbolinks.start()`という記述をコメントアウトしてください。
そのあとサーバーを起動してみると、なんということでしょう！すべて動きます:sob:
教えてくださったメンターさんに大感謝です！！

### 最後に
今日は一日の終わりにため込んだ質問をメンターさんにお聞きしたのですが、解決が早くその分説明に時間をかけてくださる方で本当に感動しました！この感謝をどう伝えていいやら。

PF作成を初めて数日ですが、初めての自分の好きなように作っていい機会(ある程度の決まりはありますが)でとても楽しく取り組めています。また、過去の人々が書いてくださった記事に本当にお世話になっています。いつか自分の記事も誰かの役に立てますように～:pray:

ということで今回は以上です！お疲れ様でした！
SharePoint リストの複数選択可能な選択肢列やユーザー列がデータテーブルやギャラリーでエラーになる原因と対処法

# はじめに
ごきげんよう、ゆりみーです。
SharePoint リストの選択肢列やユーザー列で複数選択を許可すると、Power Apps のデータテーブルで「Ojbect」と表示されてしまう現象について解説していきます。

# 症状

SharePoint リストではこんな感じで複数選択の値がちゃんと表示されているのに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/3192505f-1276-c707-fcac-1fc9dbbfbc60.png)

Power Apps のデータテーブルでは「Object」と表示されてしまって、何が入っているのか分からないし、しかもエラーが発生している💦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/dec46ced-23d7-1a25-8b9b-f5e3564408c0.png)

ギャラリーでもエラーが出て、表示されない💦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/58bcbbca-b761-f856-2a48-c0a373d7cb16.png)

# 原因

データテーブルも、ギャラリーも原因は同じです。
複数選択可能な選択肢列やユーザー列は値をテーブル型で持ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/d0aae77c-2316-6fde-6d73-0c7a0503e0d3.png)

その為、テキスト型のデータテーブルの列やギャラリー内のラベルでは型が不一致で、エラーになっています。

# 対処法

まず選択肢列の値がどのように入っているかを見ていきます。
もう1つデータテーブルを作成して、Items プロパティに１つ目のデータテーブルで選択したレコードの複数可の選択肢列を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/d6ef2a27-922e-1719-9399-387618655f04.png)

で、フィールドを設定するとこんな感じで値が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/76fedf49-76d1-eef8-5964-a2f3fce30a1a.png)

ここまでで選択肢の値は Value という列に格納されているというのが分かります。
で１つ目のデータテーブルをよーく見ると、Object と Object の間にカンマがありますね？　ここでおそらく値が区切られているというのが推測できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/c63a5254-7aec-34a8-5c43-132a26b24dda.png)

なので、この区切り記号を利用して、選択肢列の値同士を結合し、テーブル型→テキスト型に変換するというのが対処法です。
データテーブルの中で複数選択可能な列を選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/256c2416-313e-5223-5446-fec6423a429a.png)

Text プロパティを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/8a4ae221-763a-3c4d-e3aa-44b920fe2631.png)

この式では Concat 関数を使用して、選択されている値を結合しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/0c820488-18ea-352e-9438-4ef393294289.png)
その結果、SharePoint リスト側から見たのと同じ値が取得できるようになりました。

ユーザー列に関しても同じですが、ユーザー列は結構色々な値を持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/4202fb91-2d44-516e-2721-a25affd6c267.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/72e2e6ab-0b4a-5352-dea0-2ef847a493dd.png)
※これでも一部です。

なので、この中から欲しい値を指定しましょう。
データテーブルの中で複数選択を許可したユーザー列を選択して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/0028ee26-28d1-6c46-be2d-9cb0e68a1d55.png)

Textプロパティを変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/cdf06e01-6cae-ef21-a050-3c290cb7941d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/81fec434-8a42-6e63-69a9-9914aaefaf4b.png)

ギャラリーもラベルのTextプロパティをConcat 関数でいじってあげれば、エラーが解消されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/ec73d4e7-0be4-2a0e-9f4c-c27ba22379c2.png)

# 終わりに
表示がおかしいときは大体、型が異なることが多いです。
落ち着いてエラー表示を確認し、型を合わせることに注力しましょう。
それではごきげんよう✨
shell 特殊記号

メモ用。Shellには特殊記号というものが存在する。
## ①$#
コマンドラインの引数の数を表す
$#を使用して、入力項目数チェックを製造できる
```
if [$# -gt 3]; then
    echo '3より大きいです'
fi 
```
## $@ 
$0以外のすべての引数を表す。
$@を使用して、関数に渡す引数を決めること制御できる
```
qiita.sh $"{@:2}"
```
qiita.shに2つ目以降の引数を渡す。

また、$#も使用して、qiita.shに渡す引数の数を制御できる。
```
cmd xxxx 1 2 3 4 5 6
qiita.sh $"{@:2:($#-1)}"
```
引数の数はxxxxから数えはじめる。
$#-1は引数の数から1引いた数なので、6になる。
qiita.shに"1"から"5"までを渡すことになる
MQTTのWillについてざっくり理解する

# はじめに
MQTTはHTTPと比較すると軽量で双方向通信が可能なため、計算リソースの乏しいデバイスを使わざるを得ないことが多いIoTの分野に向いているとされる通信プロトコルです。AWSではAWS IoTというサービスでマネージドでサーバーレスなMQTTブローカー（MQTTサーバー）が提供されています。ちなみにGoogle CloudでもGoogle Cloud IoT Coreという名称で同様のサービスが提供されていましたが、残念ながら2023年8月にサービス提供終了となってしまいました。
さて、MQTTの機能の1つにWillという機能がありますが、最近どんなものだったっけ？となったので調べてみました。
※この記事の内容は、MQTT V3.1.1、5の両方に当てはまる内容です。

# Willとは何か
クライアントとMQTTブローカー間の接続が切断されたしまったときにPublishするメッセージを予めMQTTブローカーに登録しておける機能です。メッセージと一緒に登録するMQTTトピックをSubscribeしておいた別のクライアントは、このメッセージを受け取ることができます。
いつ死んでも（？）良いようにメッセージを残しておく機能を遺書と表現したのは言い得て妙ですね。

# 動作イメージ
では具体的にどのような動作となるのか、シーケンス図でイメージを掴みたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138405/31b79acc-4a51-4fde-effa-e7efc563e295.png)

まずはWill Messsageを残すクライアントAの動作です。クライアントAは接続要求のパケット（CONNECT）に、Will Flag（1にセット）、Will Message、Will Topicを含めてMQTTブローカーに送信します。このパケットを受け取ったMQTTブローカーはWill MessageとWill Topicの情報を保持しておきます。

次に、Will Messageを受け取りたいクライアントBは、Will TopicをSubscribeしておきます。

この状態でMQTTブローカーが接続断を検知すると、MQTTブローカーはWill TopicをSubscribeしているクライアントBに対し、保持していたWill MessageをPublishします。

ちなみに、クライアントからDISCONNECTパケットを送信し正常に接続が切断された場合は、Will MessageはPublishされません。

# Will MessageがPublishされる接続断のケース
では、実際にどのような場合にWill MessageがPublishされるのでしょうか。例えば以下のようなケースがあります。
- MQTTブローカーがTCP/IPにおける接続断を検知した場合
- MQTTのKeep Aliveタイムアウトが発生した場合
	- MQTTクライアントはMQTTブローカーに対しKeep Aliveに設定した間隔（この設定はCONNECTパケットに含まれます）でPINGREQパケットを送信することで自身が「生きていること」を知らせます。PINGREQを送信しないままKeep Aliveに指定した時間（MQTTの仕様としてはKeep Aliveに指定した時間の1.5倍）を超過してしまうと、MQTTブローカーはクライアントとの接続が失われたと判断し、接続を切断します。

# 使い所
MQTTクライアントとの間の正常ではない接続断を検知できるため、普通に考えるとMQTTクライアントの死活監視でしょうか。例えばAWSであればWill Topicに対するメッセージをルーティングするIoTルールを作成すれば、どこかに通知するなど柔軟に処理できそうです。
# 参考
- [MQTT Version 3.1.1](https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html)
- [MQTT Version 5.0](https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html)
- [docs.aws.amazon.com/ja\_jp/iot/](https://docs.aws.amazon.com/ja_jp/iot/)
try-catch のfinallyっていつ使うねん、ていう話

# はじめに

例外処理を実装するにあたって欠かせないのが`try-catch`文です。これを使うことで、ランタイムエラーが発生しても処理を継続できたりするわけです。

ところで`try-catch`文では`finally`というものを使うこともできます。これは`try`ブロックの中が正常に完了しても、`catch`に進んだとしても、最後に実行される処理を書く場所です。

```tsx
try {
	// 何らかの処理
	console.log('tryで実行');
} catch {
	// エラー次の処理
	console.log('catchで実行');
} finally {
	// 最後に必ず行う処理
	console.log('最後に必ず実行');
}
```

ところで、わざわざ`finally`って使う必要ありますか？

`try`完了後（あるいは`catch`完了後）に何かの処理を実行させたいなら、以下のように書けばいいはずです。

```tsx
try {
	// 何らかの処理
	console.log('tryで実行');
} catch {
	// エラー次の処理
	console.log('catchで実行');
} 
// 最後に必ず行う処理
console.log('最後に必ず実行');
```

わざわざ`finally`が用意されているのはなぜでしょうか。

# 例外が持つ大域脱出

実は、**脱出に割り込む**ことは`finally`にしかできません。

`try-catch`文は例外処理と合わせて使われることが多いですが、例外は**大域脱出**という特徴を持っています。大域脱出は、その場でプログラムの実行を中断して別の場所にプログラムの制御を移すことを指します。

```tsx
try {
	throwError();
	
	//　throwError()で例外が投げられてたので、これは実行されない
	console.log('実行されない');
} catch (error) {
	console.log(error);
}

function throwError () {
	const error = new Error('エラーが発生しました');
	throw error;

	// 例外が投げられたので、これは実行されない
	console.log('実行されない');
}
```

大域脱出には、複数箇所で発生した例外を１箇所で処理できるというメリットがあります。

# finallyだけができること

この脱出に`finally`は割り込むことができます。

```tsx
try {
	// 何らかの処理
	console.log('tryで実行');
	throwError();
} finally {
	// エラー次の処理
	console.log('最後に実行');
} 
```

上記のコードを実行すると、以下のような結果になります。

```
tryで実行
最後に実行
Uncaught Error: エラーが発生しました
  at throwError (<anonymous>:2:16)
  at <anonymous>:9:2
```
![スクリーンショット 2024-03-05 21.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527059/c0675252-f69d-de61-c43b-275a82cf7cb7.png)


`try`→`finally`という順に処理は進むはずなので、順番的には`Uncaught Error`の後に「最後に実行」が出力されそう（正確にはその前にランタイムエラーが発生しているので出力はされない）ですが、実際にはこのような結果になります。

これは、`try`文から脱出する際に`finally`が実行されたことを意味しています。

このように、`finally`は脱出に割り込むことができるという特性を持っています。

# 最後に

とはいえ`finally`を使う機会はあまりないと思います。
Git ブランチ戦略 - feature/cool-featureをdevに統合するフロー

## はじめに

Gitの典型的なブランチ戦略における、feature/cool-featureブランチからdevブランチへの変更統合プロセスを説明します

## 1. feature/cool-feature ブランチの作成と作業
mainから新しい機能ブランチfeature/cool-featureを作成し、そこで開発作業を行います。

```text
[main]
   |
   |---[feature/cool-feature]  ← ここで新機能に関する作業を行う
   |
   |---[dev]
```
```shell
git checkout main
git pull origin main
git checkout -b feature/cool-feature
# feature/cool-featureで作業し、コミットを行う
```

## 2. devブランチの更新

作業が完了したら、devブランチを最新の状態に更新します

```text
[main]
   |
   |---[feature/cool-feature]  ← 作業完了
   |
   |---[dev]  ← 最新の状態に更新
```
```shell
git checkout dev
git pull origin dev
```

## 3. feature/cool-featureのリベース

feature/cool-featureブランチをdevにリベースして、devの最新の変更を取り込みます。

```text
[main]
   |
   |---[feature/cool-feature]  ← devの最新の変更を取り込むためにリベース
   |
   |---[dev]
```
```shell
git checkout feature/cool-feature
git rebase dev
# コンフリクトがあれば解決
```

## 4. feature/cool-featureの変更をdevにマージ

devブランチに切り替え、feature/cool-featureの変更をマージします。

```text
[main]
   |
   |---[feature/cool-feature]
   |
   |---[dev]  ← feature/cool-featureの変更をマージ
```
```shell
git checkout dev
git merge feature/cool-feature
```

## 5. devブランチの変更をリモートにプッシュ

最後に、devブランチの変更をリモートにプッシュします。

```text
[main]
   |
   |---[feature/cool-feature]
   |
   |---[dev]  ← リモートにプッシュ
```
```shell
git push origin dev
```

このフローに従うことで、feature/cool-featureでの変更がdevに適切に統合され、その後リモートのdevブランチにプッシュされます
Edge の IE モードで INET_E_RESOURCE_NOT_FOUND が発生して WSL2 上の Docker コンテナなどにアクセスできない時に読むページ

Edge の IE モードで WSL2（含 Docker コンテナ）にアクセスしようとすると、以下エラーとなってアクセスできないケースがあります。

```plaintext
エラー コード: INET_E_RESOURCE_NOT_FOUND
```

![INET_E_RESOURCE_NOT_FOUND.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/95ce8a05-7fc4-0904-002a-e93703200933.png)
 [^1]

[^1]: 画像はイメージです。

Chrome や Firefox はもちろん IE モードでない Edge でも問題なくアクセスできるため、IE モードと WSL2、あるいは筆者の環境も合わせた複合要因で発生すると考えられます。[WSL 2 の GitHub レポジトリ](https://github.com/microsoft/WSL/issues?q=INET_E_RESOURCE_NOT_FOUND)にも Issue が見つからなかったので相当レアな状況の可能性もありますが、ワークアラウンドを発見できたので記事としました。[^2]

[^2]: 自分でも別環境では事象を再現できていないため情報不足と判断し、Issue は立てていません。

## WSL2 に IP アドレスで直接アクセスする

何やら名前解決に失敗しているらしいので、IP アドレスで直接アクセスしてしまえば解決です。

```powershell
# 既定のディストリビューションからIPアドレスを取得する
bash -c "ip -4 a show eth0 | grep -oP '(?<=inet\s)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'"
```

![ItWorksFromIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/ac1f507e-d678-3794-6dbb-ef3f270556f6.png)

同様の問題に関する情報が見つからない理由は、回避法が単純すぎたからでしょうか。とはいえ、誰かの役に立つ可能性に賭けてここにメモを残しておくことにします。

## 参考リンク

* [WSL2 上のアプリケーションに別ホストからアクセスする方法（管理者権限なし）](https://qiita.com/yokra9/items/cc81b2869ec1e9bda950)
LazyVimのターミナルに枠をつける


LazyVimはいい感じである。いい感じではあるのだが、残念なことに、ターミナル周りはいい感じではない。いい感じにしたい。する。

## いい感じじゃないとは

ターミナルのポップアップには枠がない。それどころか隙間もないので、デフォルトだと以下のように文字列が連結してしまう。google-anyenvなどという興味深い単語の爆誕である。

非常に見づらい。

![Pasted image 20240305210906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188872/2200b67b-1448-3fd0-11e8-5435d26c4dd6.png)

また個人的にclearのショートカットである`<C-l>`を多用するのだが、これがターミナルモードでもウィンドウ移動に割り当てられているため、うっかり押してしまうとフォーカスが裏側のウィンドウに行ってしまう。ターミナルに隠されているウィンドウに移動してもうれしいことはないので、これを無効化したい。

## いい感じとは

枠を付けて見やすくし、

![Pasted image 20240305210956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188872/6c9aba5d-807a-55fc-b45e-814ad752ea9b.png)

`<C-l>`を無効化して使いやすくする。

## 設定ファイル

`~/.config/nvim/lua/config/keymaps.lua`に以下の内容を加えると、

```lua
local Util = require("lazyvim.util")
local map = vim.keymap.set

-- ターミナルにおいてのC-hjklを無効化する。
vim.cmd([[
  tunmap <C-h>
  tunmap <C-j>
  tunmap <C-k>
  tunmap <C-l>
]])

-- ターミナルにボーダーを追加する。
local lazyterm = function()
  Util.terminal(nil, { cwd = Util.root(), border = "rounded" })
end
map("n", "<leader>ft", lazyterm, { desc = "Terminal (root dir)" })
map("n", "<C-/>", lazyterm, { desc = "Terminal (root dir)" })
map("n", "<C-_>", lazyterm, { desc = "which_key_ignore" })
```

いい感じになった。
BNeT 後継新サービスについて。

## BNeT後継新サービスについて
名前は、総合コミュニケーションツール"Talkit"に決定しました。
また、Talkitの設置により、以下のサービスが閉鎖・新設されます。
・BNeT(閉鎖)
　・TalkNeT(新設)…ログイン後すぐに表示されるダッシュボード上で利用ができます。
・Bch (閉鎖)
　・Talking(新設)…Bchのボードデータを完全に引き継いだ掲示板。
システムは変わりません。
・教えトーク(新設)
質問掲示板です。
Talkingと同じシステムを使用しています。
・WriteingBlog(新設)
自分の好きな内容でブログを書くサイト。考えた事や、思い出などを共有することができます。
今回の目的は、
・運営の人的リソース削減(お問い合わせを減らすことで、サービスの作成、修正等にリソースを費やす)
・アカウントの統一
システムごとにアカウントを作成する必要を無くす
☆移行に関して☆
・公開:4月1日
・BNeT閉鎖:6月1日
BNeTは、4月~6月の間の「移行期間」は使用可能です。5月1日からは投稿を禁止し、6月1日から一年間リダイレクトを設定します。
・Bch閉鎖:4月1日
3月末の深夜11時からアクセスを遮断し、データを転送し、BNeTと同じ様に1年間リダイレクトを設定します。
・URL変更
任意団体なんでやねんのトップページ・運営中サービスページを現行bnet.ie-t.net(BNeTが主役サービスだったため)からnandeyanen.ie-t.netに変更されます。こちらもリダイレクトを設定します。
・ロゴマーク等について:
現在の箱入りリラーは変更されません。
今後、Talkitの開発には、ChatGPTをフル活用していく予定です。
また、開発日記を日々記録していこうとおもいます。
Ledger CLI コマンド備忘録

# コマンド備忘録

私がzshの記録に頼るのが脆弱と思いここに書き写すコマンド例です。`-X CHF`はコモディティをCHFに変換するコマンドなので日本にいるなら`-X JPY`とかか外貨あんまりないなら`--market`がいい気がします。

## B/Sがわかるやつ

2023 Q3時点での B/S。家計簿の場合Equity (純資産)にほぼ意味はないので割愛しています。

oneliner
```shell
$ ledger -f root.ledger bal -X CHF "^Assets:" "^Liabilities:" --current --now=2023-10-01
```

改行あり
```shell
$ ledger -f root.ledger bal "^Assets:" "^Liabilities:" \
  -X CHF \
  --current \
  --now=2023-10-01
```

`--now=...` を削除したら現時点での数字になる。

## 一年のP/L

:::note warn
このコマンドは現在Ledgerのバグで適切に動作しません。
https://github.com/ledger/ledger/issues/2343
おそらく、Ledger CLIがstack-use-after-returnを起こしまくってる以上、そう簡単に治ると思えません。
私の作っている[okane](https://github.com/xkikeg/okane)は現在この結果を出せることを目標に開発しています。
:::


oneliner
```shell
ledger -f filter/profit_loss.ledger reg --historical --period "from 2023-01-01 to 2024-01-01" ^Expenses: ^Income: -X CHF -M --format="%(quoted(date)),%(quoted(display_account)),%(quoted(quantity(scrub(display_amount))))\n" > /tmp/2023.csv
```

改行あり

```shell
ledger -f filter/profit_loss.ledger \
  reg ^Expenses: ^Income: \
  --historical \
  --period "from 2023-01-01 to 2024-01-01" \
  -X CHF -M \
  --format="%(quoted(date)),%(quoted(display_account)),%(quoted(quantity(scrub(display_amount))))\n" > /tmp/2023.csv
```

### 解説

`filter/profit_loss.ledger`に`alias`を使って費用の分類を仕込んでる。`-M`(`--monthly`)は月ごとの集計を出すコマンド。

`--historical`はレートが変動しても再計算しないオプション。B/Sなら再計算する意味はあるけどP/Lなら意味ないのでつけたほうがいい。

## 値付きタグでの絞り込み

```shell
$ ledger -f root.ledger reg --limit '(tag(/travel/) =~ /202302-foobar/)' -X CHF --historical
```

同じくP/Lなので`--historical`をつけている。
Rails 暗号化まとめ

アプリケーションがアクセスするのは暗号化されていないデータですが，データベースには暗号化されたデータが保存されます．
もし機密情報が漏れたとしても，暗号化しておくことで流出した情報を解読することは困難です．

オブジェクトがDBに暗号化されず保存されている時，万が一個人を特定できるデータが流出すると大変です．
そのために暗号化が標準ライブラリとして用意されています．
RailsでActiveRecordを使って暗号化するにあたり，よく使いそうなものをまとめました．

# 利用方法

## セットアップ
```console
$ bin/rails db:encryption:init
```
出力：
```console
active_record_encryption:
  primary_key: <生成されたキー>
  deterministic_key: <生成されたキー>
  key_derivation_salt: <生成されたキー>
```
```rb:application.rb
class Application < Rails::Application
  config.active_record.encryption.primary_key = ENV['PRIMARY_KEY']
  config.active_record.encryption.deterministic_key = ENV['DETERMINISTIC_KEY']
  config.active_record.encryption.key_derivation_salt = ENV['KEY_DERIVATION_SALT']
end
```

## 暗号化
暗号化したい属性に対して，モデルレベルで定義します．
このライブラリは，属性をDBへ保存する前に暗号化し，取得時に複号化します．
### データの暗号化
```rb:model
class Article < ApplicationRecord
  encrypts :title
end
```

### 暗号化データのクエリ検索
※findメソッドを使用しない場合は非推奨
```rb:model
encrypts :email, deterministic: true
```

### 小文字に揃える
```rb:model
encrypts :email, downcase: true
```
### 文字の大小の区別を失わず，クエリでのみ区別しない
※ただし，`ignore_case`を追加する場合は，`original_<カラム名>`というカラムを個別に作成する必要有
```rb:model
encrypts :name, deterministic: true, ignore_case: true
```

### 以前の暗号化スキームを属性ごとに設定する
```rb:model
encrypts :title, deterministic: true, previous: { deterministic: false }
```

### 一意性（非決定的暗号化）
同じクエリから異なる暗号文を生成する．
```rb:model
encrypts :title, deterministic: { fixed: false }
```


## 決定論的暗号化と非決定的暗号化

| 暗号化 | 特徴 |
|:-:|:-:|
| **非決定論的暗号化**  | 常に最新（現在）の暗号化スキームによって暗号化される  |
| **決定論的暗号化**  | 常にデフォルトで最も古い暗号化スキームによって暗号化される  |

※決定論的暗号化では，同じクエリを通すと常に同じ暗号文になる．


# 注意事項
暗号化では十分な容量が必要です．UTF-8を利用しているDBのカラムは，バイト数で見ると、そのサイズの4倍まで容量が増加する可能性があります

例：
| 暗号化するコンテンツ | 元のカラムサイズ | 暗号化カラムの推奨サイズ | ストレージのオーバーヘッド（最大） |
|:-:|:-:|:-:|:-:|
|  メールアドレス |  string(255) |  string(510) | 255 bytes  |
|  絵文字の短いシーケンス | string(255)  | string(1020)  | 255 bytes  |
|非西洋アルファベットのサマリーテキスト|  string(500) | string(2000)  | 255 bytes  |
|  任意の巨大テキスト |text|text|無視可能|


# 参考
https://railsguides.jp/active_record_encryption.html
PHP 高速かつ省メモリなCSVダウンロード機能の作り方

高速かつ省メモリなCSVダウンロード機能の作り方です。

一時ファイルを生成せずに、標準出力に垂れ流すことで、オーバーヘッドを減らしています。

ただし、headerにContent-Lengthを含めることができないので、ダウンロードまでの残り時間をブラウザに表示させることができなくなります。

# データ生成の方法

## yieldを使う方法
yieldを使うと、メモリを節約できます。
ただし、こんなふうに直接固定データを返す実装は少なく、多くのケースでは、SQLで、データを取りにいき、その結果をCSVとして返すという実装が多いことと思います。
その場合、問い合わせ回数が増えるので、遅くなる可能性があります。

```php
<?php
function getUsers()
{
    yield ['id' => '1', 'name' => '田中一郎'];
    yield ['id' => '2', 'name' => '山田二郎'];
    yield ['id' => '3', 'name' => '佐藤三郎'];
}
```

## 普通に配列を返す方法
この場合は、メモリを大量に消費する可能性があります。
メモリを拡張する必要が生じる可能性もあります。

```php
<?php
function getUsers()
{
    return [
        ['id' => '1', 'name' => '田中一郎'],
        ['id' => '2', 'name' => '山田二郎'],
        ['id' => '3', 'name' => '佐藤三郎'],
    ];
}
```

## CSVダウンロード処理実体
```php
<?php
function download()
{
    // ファイルを作成すると遅くなってしまうので、標準出力に流していく
    $stream = fopen('php://output', 'w');
    
    // CSVはExcelで開かれるケースが多いので、デフォルトで文字化けしないように、CP932に変換。
    // UTF-8のままで良いなら不要です。
    stream_filter_append($stream, 'convert.iconv.utf-8/cp932//TRANSLIT');
    
    // ダウンロードを強制する。
    header('Content-Type: application/octet-stream');
    
    // ファイル名の指定
    header('Content-Disposition: attachment; filename=users.csv');

    // ヘッダーだけまずは標準出力に流す。
    fputcsv($stream, ['id', 'name']);

    // データを標準出力に流す
    foreach (getUsers() as $user) {
        fputcsv($stream, [$user['id'], $user['name']]);
    }

    fclose($stream);
}
download();
```


さらに良い方法があれば、ぜひコメントをお願いします！
mindの研究 その73

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
mindで、ファイルを読め。

# サンプルコード

```

メモ帳は　ファイル。

メインとは
　行は　文字列
　「test.txt」で　メモ帳を　オープンし
　エラー？
　ならば
　　エラー文字列で　重大エラーにし
　つぎに
　ここから
　　メモ帳から　一行読み出し　行に　入れ
　　データ終り？
　　ならば
　　　打ち切り
　　つぎに
　　「行 = [」を　表示し　行を　表示し　「]」を　一行表示し
　繰り返し
　メモ帳を　クローズする。



```

# 実行結果

```
>rf0
行 = [1 kuku 55 d]
行 = [2 alice 14 s]
行 = [3 kent 30 d]
行 = [4 dend 47 d]
行 = [5 yuki 22 d]

```


以上。
ICP-NFT 収支計算 GPTs

GPTsを作った。

*   ICP NFT 収支計算サポート<br>
    <https://chat.openai.com/g/g-H34oYZDkb-icp-nft-shou-zhi-ji-suan-sapoto>


昔、自分の計算用で作ったメモした以下をGPTsにした感じ。

*   ICP-NFT 収支計算 備忘録<br>
    <https://hide.ac/articles/MCWQPvFyQ>


ドメインの取り方は以下を参考にした。

*   GPTs公開時の名前を変更する3つの方法【おすすめは独自ドメインを設定】<br>
    <https://www.value-domain.com/media/gpts-name/>


# 流れ

始めの欄にも書いてるが、NFTgeekからcsvを取得して、ここに貼る感じ。

複数csvを対応します。

![](https://pbs.twimg.com/media/GH53IkraMAAja0Y?format=jpg\&name=medium)

細切れで進めるようにしているので、"続けて" を指示してください。こんな感じ。

![](https://pbs.twimg.com/media/GH54DsDaoAAQnam?format=png\&name=900x900)

計算結果は、要求すればもちろんcsvでもくれます。

# 注意

注意事項として、ICタートルやクラファンなど、mint時の情報がCSVファイルに含まれていないNFTも存在します。このため、実際の収支が計算結果よりも過剰にプラスに見える場合があります。また、mint時の情報が欠けている他のNFTも存在する可能性がありますので、この計算結果は参考としてご利用ください。

***

NFTの収支計算の参考までに。
Minikube で使い捨て Kubernetes

Rancher Desktop にも Kubernetes が入っているので不要かもしれないけど、何となく minikube も使ってみた。

```shell
$ brew install minikube
$ minikube start
```

自動的に `minikube` という context が出来て選択されている。

```shell
$ kubectl config get-contexts
CURRENT   NAME              CLUSTER           AUTHINFO               NAMESPACE
*         minikube          minikube          minikube               default
          rancher-desktop   rancher-desktop   rancher-desktop        
```

削除する。

```shell
$ minikube delete --all

$ kubectl config get-contexts   
CURRENT   NAME              CLUSTER           AUTHINFO               NAMESPACE
          rancher-desktop   rancher-desktop   rancher-desktop
```

綺麗さっぱり消えている！これは便利でいいかも。

## 参考

* [minikube start | minikube](https://minikube.sigs.k8s.io/docs/start/)
GitHub PagesでWEBページを公開する

## GitHub Pages とは
GitHub のリポジトリから HTML、CSS、および JavaScript ファイル を直接取得し、任意でビルドプロセスを通じてファイルを実行し、ウェブサイトを公開できる静的なサイトホスティングサービスです。

https://docs.github.com/ja/pages/getting-started-with-github-pages/about-github-pages

## 公開手順
### 1. GitHubアカウントの作成

https://github.co.jp/

上記サイトの「GitHubに登録する」もしくは「サインアップ」よりアカウントを作成します。

### 2. リポジトリの作成
公開するため専用のリポジトリの作成を行います。
リポジトリはGitHubの右上「+」から「new repository」を選択します。

Repository nameにリポジトリの任意の名前を入力し、それ以外の項目は変更せず、「Create repository」をクリックします。

### 3. 公開したい内容をコミットする
公開したい内容をHTMLなどで作成し、作成したリポジトリにコミットします。

### 4. 公開設定を行う
リポジトリの「Setting」から「Pages」画面を開きます。
Branchに公開対象のブランチを選択し「Save」をクリックします。

### 5. GitHub Pagesを公開する
公開できる状態になると「Pages」画面の上部に「Your site ・・・」と表示されます。
表示された「Visit site」ボタンをクリックすると、リポジトリにコミットした内容が表示されます。

このURLを共有することでWEBサイトを誰でも閲覧することができます。


## 補足

リポジトリを作成するときにPublic / Privateの選択を行うことができます。
- Public： 公開したURLを知っている人は誰でもWEBサイトを閲覧することができる
- Private：　リポジトリにアクセスできる人のみWEBサイトを閲覧することができる
Excelで非表示があってもそのまま「コピー」「貼り付け」「塗りつぶし」できる

エンジニアになって1日目に知りたかったショートカット
```
[Alt]+[;]
```
出会うのに3カ月かかりました。

Excelで非表示行列がある時に「コピー」「貼り付け」「塗りつぶし」をすると
あーーーそこはいいんです、辞めてくださいごめんなさい、ってなる時ありますよね。

[Alt]+[;]を使うと、表示されているセルに対してのみ操作が有効になって
作業スピードが上がるので是非使ってみてください。

<b>各パターンのデフォルト</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/c5dea22f-1657-c8f8-b9b1-d4f9d40b9394.png)

## コピーの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/23715bdd-5635-b8f9-9405-c5aa7a68b687.png)
[Alt]+[;]なしもありも、同じ4セル分範囲選択しています。
[Alt]+[;]ありの方だけ、範囲選択して[Alt]+[;]を押してからコピーしています（画像のような破線になります）
結果はこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/00aedc95-763f-46f4-bb80-f29ccb6068db.png)

## 貼り付けの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/5b2a6c86-c95a-c4bb-7358-73ae635cd061.png)
[Alt]+[;]ありの方は、貼り付けたい範囲を選択して[Alt]+[;]後に貼り付けをしています。
結果はこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/ba0f4152-003d-6c32-a25d-d4ed7b157e18.png)

## 塗りつぶしの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/f479154b-7813-5fd0-66dd-04c455dce918.png)
範囲選択　→　[Alt]+[;]　→　セルの塗りつぶし
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/b49069cf-e6c9-a736-fc55-e1aa09823ba2.png)

## さいごに
作業スピードアップ、ストレスを軽減できるショートカットがあればまた投稿したいと思います！
STM32C011「printf()」で遊ぶ。(PA8ハードウェアシリアル)(STM32C011J4M7)


目的
printfがサポートされているので使ってみる

結果

![o_cop978.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/34e53da4-61ba-1b17-27b3-2c457c9b8db3.jpeg)



プログラム


```c++



//SER_PA8_printf_C011_1


//初期化
void setup() {

  Serial.setTx(PA8);
  Serial.setHalfDuplex();
  Serial.begin(9600);

  //ピンの初期化 PB8
  pinMode(PB7, OUTPUT);

} //setup


//メインループ
void loop() {

  //「46」を出力
  Serial.printf("%d\r\n",46);
  
  digitalWrite(PB7, HIGH);//PB7をオン
  delay(1000); //1秒待つ

  digitalWrite(PB7, LOW);//PB7をオフ
  delay(1000); //1秒待つ

} //loop


```
Googleスプレッドシート PDF書出し　不要なファイル名をPowerShellで一括置き換え

Googleスプレッドシートで、PDFを書き出した際に、ファイル名に「xlsx」が記載されてしまう。
複数ファイルがあり、手入力でのリネーム作業を避けたいと思ったので、一括リネームを試みたのでメモします。

１.任意のフォルダにリネームしたいファイル群を置く。
２.PowerShellを立ち上げる
３.下記を打ち込んでエンター
```
Get-ChildItem【対象のパス】 | Rename-Item -NewName { $_.Name -replace '置換えしたい文字','置換え後の文字' }
```

参考：
[参考先](https://orebibou.com/ja/home/201507/20150707_001/)
fatal: detected dubious ownership in repository at

# 事象 : safe.directoryに設定してあるWSL2上のディレクトリをSourceTreeで見たらエラーになった
- 環境
    - Windows11 Pro バージョン23H2
    - SourceTree Version 3.4.15
    - git version 2.42.0.windows.2
    - WSL2にあるディレクトリにリポジトリをクローンしている

WSL2のUbuntuにあるディレクトリをSourceTreeで開いたらエラーになりました。
しかし、このディレクトリは`safe.directory`に設定してあります。
なので、VS Codeのターミナル上ではエラーなくコマンド操作できています。

```
---------------------------
エラーが発生しました
---------------------------
'git log' がコード 128 で終了しました: fatal: detected dubious ownership in repository at '//wsl.localhost/Ubuntu/path/to/repository-name'
To add an exception for this directory, call:
    git config --global --add safe.directory '%(prefix)///wsl.localhost/Ubuntu/path/to/repository-name'
 (\\wsl.localhost\Ubuntu\usr\local\src\repository-name)
```

そもそも、このエラーが出力される経緯は・・・
複数ユーザーが使用できる環境上で悪意のある人に.gitが作成されて操作される可能性があるというGitの脆弱性がありました。

> This vulnerability affects users working on multi-user machines where a malicious actor could create a `.git` directory in a shared location above a victim’s current working directory. 
> [Git security vulnerability announced - The GitHub Blog](https://github.blog/2022-04-12-git-security-vulnerability-announced/)

その対策として.gitを探すときに所有者を確認するようになりました。

> **Stricter repository ownership checks**
> ...省略...
> Beginning in Git 2.35.2, Git changed its default behavior to prevent you from executing `git` commands in a repository owned by a different user than the current one. This is designed to prevent `git` invocations from unintentionally executing commands which the repository owner configured.
> [Highlights from Git 2.36 - The GitHub Blog](https://github.blog/2022-04-18-highlights-from-git-2-36/)

なので、「所有者が違うよ」ってエラーになりますが、「安全なディレクトリだよ」と設定しておけばエラーにならなくなります。

> **safe.directory**
> These config entries specify Git-tracked directories that are considered safe even if they are owned by someone other than the current user.
> [Git - git-config Documentation](https://git-scm.com/docs/git-config/2.35.2#Documentation/git-config.txt-safedirectory)

しかし！もう`safe.directory`には設定済みでした。なぜエラーに？

```bash
$ git config --global -l | grep 'safe.directory'
safe.directory=%(prefix)///wsl$/Ubuntu/path/to/repository-name
```

## 原因 : 「wsl.localhost」で設定していないから
エラーメッセージをよぉぉぉく見てみると「wsl.localhost」がエラーになっていました。
設定してあるのは「wsl$」でした。
そういえば「[Error: UNC host 'wsl$' access is not allowed - Qiita](https://qiita.com/chovin/items/de972dda73afd498fd3b)」の時も「wsl$」だけじゃなく「wsl.localhost」も設定していました。

「wsl.localhost」と「wsl$」の違いというか使い分けがわからないです。

### 対応 : 「wsl.localhost」でsafe.directoryに設定する
無事、SourceTreeでエラーが解消しました。

```bash
# 「wsl.localhost」でsafe.directoryに設定する
$ git config --global --add safe.directory '%(prefix)///wsl.localhost/Ubuntu/path/to/repository-name'
# 設定できた
$ git config --global -l | grep 'safe.directory'
safe.directory=%(prefix)///wsl$/Ubuntu/path/to/repository-name
safe.directory=%(prefix)///wsl.localhost/Ubuntu/path/to/repository-name
```
Pythonで「int関数/float関数の使い方(文字列を数値に変換する)」の動作を確認してみた

# 概要

Pythonで「int関数/float関数の使い方(文字列を数値に変換する)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/function/index3.html

# 実装

以下のファイルを作成しました。
```sample.py
print(int(17.58))
print(int("1011", 2))
print(int("A4", base=16))

print(float(19))
print(float("78.225"))
print(float("-7.52e-3"))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
17
11
164
19.0
78.225
-0.00752
```

# まとめ

何かの役に立てばと。
「service "web" is not running container #1」というエラーが出た


Dockerを使ってPHP,nginx,MySQLの環境構築でwebサーバーとなるnginxのコンテナ作成をしていた時に
`service "web" is not running container #1`というエラーに遭遇したので、その解決策を備忘録として残します。


# やっていたこと
[DockerでPHP（Laravel）+ nginx + MySQLのLEMP環境を構築する](https://qiita.com/hinako_n/items/f15646ea548bcdc8ac6c)
こちらの記事を参考に環境構築に取り組んでいました。
PHPのコンテナを立ち上げるところまでは順調でしたがnginxのコンテナを立ち上げるときにエラーに遭遇しました。
# エラーログを確認

![スクリーンショット 2024-03-05 19.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655001/59847f9d-4ad9-0deb-70d2-f1701e044f10.png)
本来であればPHPのコンテナとnginxのコンテナどちらも立ち上がっていて欲しいのだが`docker-compose ps`コマンドで確認したところnginxのコンテナが立ち上がっていなかった。
もちろん、`docker-compose exec web nginx -v`コマンドが機能するわけもなく、、
```
$ docker-compose up -d --build
// 略
$ docker-compose ps           
NAME                   IMAGE                COMMAND                  SERVICE             CREATED             STATUS              PORTS
docker_handson-app-1   docker_handson-app   "docker-php-entrypoi…"   app  
$ docker-compose exec web nginx -v
service "web" is not running container #1
```
こんな時はログを確認してみよう。
```
docker logs docker_handson-web-1
中略
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/03/05 19:34:05 [emerg] 1#1: unknown directive "//" in /etc/nginx/conf.d/default.conf:6
nginx: [emerg] unknown directive "//" in /etc/nginx/conf.d/default.conf:6
~/program/2024/docker_handson (main *)
```
ふむふむ、よくわからんがdefault.confファイルの`//`の部分が怪しいと。

```default.conf
server {
    listen 80;
    server_name example.com;
    root /app/public;    // 書き換え

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";
    略
```
コードを見るとコメントアウトの`//`が悪さしてるかも？？
と思い削除してみたら、案の定こいつでした。
```
$ docker-compose ps               
NAME                   IMAGE                COMMAND                  SERVICE             CREATED             STATUS              PORTS
docker_handson-app-1   docker_handson-app   "docker-php-entrypoi…"   app                 19 minutes ago      Up 19 minutes       9000/tcp
docker_handson-web-1   docker_handson-web   "/docker-entrypoint.…"   web                 10 seconds ago      Up 9 seconds        0.0.0.0:8081->80/tcp
```

# まとめ
原因がよくわからない時はログを確認しよう。
AWS Certified Solutions Architect - Associate (SAA-C03) 合格体験記


# はじめに

今回は、AWS Certified Solutions Architect - Associate (SAA-C03) に合格したので、勉強方法をまとめてみました。AWS については知識を体系的に学んだことはなかったので、とても勉強になりました。

# 受験前の状況
- エンジニア2年目の冬に受験
- 2024年の目標にAWS の資格取得を掲げ、勉強開始
- 1月はAWS CLF の資格を取り、その流れでSAA の勉強を進めた

CLF については、こちらの記事でまとめています

https://qiita.com/hugin/items/e220cf1bc56d4c3863cc


# 購入したもの
- [【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/share/101WKk3@AThsw87qxDb9dvrOS5gIvDjEgR4jHlgjtzNnX4YAu5y-mtNkWktrgnxd_PcGmsM_wQ==/)

- [【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/share/101rfM3@wjMpx4cigi1HC2HtBdfHQ9gkPj4G0wPYcDISpnOjP6Rz3uDqPF3NiGU2tZHJw4gk-w==/)

※通常7600円のところセールの時は1600円で買えるので、セールの時を狙うのがおすすめです。

Udemy の動画教材を選んだ理由は、C01やC02 と時期によって出題範囲や内容が変わるので、変更内容に対応できるものを選びました

# 勉強方法
## ながれ
1. Udemy の動画で一通り学習
2. Udemy の問題集を周回

## Udemy の動画で一通り学習
- [【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/share/101WKk3@AThsw87qxDb9dvrOS5gIvDjEgR4jHlgjtzNnX4YAu5y-mtNkWktrgnxd_PcGmsM_wQ==/)

テスト範囲のサービスのハンズオンを含む講座です
すごくボリューミーな内容で、受講しきるまでに1カ月半くらいかかりました(;^_^A

1/3 くらいCLF と似たような内容で、これはサラッと内容を把握する感じで
理解しきるよりもサービスの設定やこうやってつなげていくんだ
といった感じで流し見しました


## Udemy の問題集を周回
- [【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/share/101rfM3@wjMpx4cigi1HC2HtBdfHQ9gkPj4G0wPYcDISpnOjP6Rz3uDqPF3NiGU2tZHJw4gk-w==/)

実際のテストに即した形の問題集です

間違えた問題や理解が浅い部分を、ノートにまとめて復習しながら解いていきました
解説で分からなかった部分を、chatGPT とかに質問しながら勉強してみたら、めっちゃ便利でした（笑）

1回目は普通に正答率50％切るくらいが多くて、2回目以降70％を超えていきました
大体どの回も2周くらい行って、正答率80％以上を目安に取り組みました

Udemy の問題集は実際のテストと、難易度的には同じくらいに感じました
ただ、間違った内容をしっかりつぶしていけば、十分合格できるレベル感だと思います


# まとめ
AWS SAA の試験はCLF と比べると、知識量的にはあまり差は少ないと感じました

ただ問題文がとても多く、文章の読解力や適切なサービスの組み合わせなど
どれだけユースケースを知っているかが重要だと感じました
ー＞模擬問題をひたすらに解く

試験終わった直後は、受かるか五分五分くらいと不安に思っていましたが
その日の21時ごろに無事に合格がわかってよかったです
（試験は午前11時から受けました）

受験日を問題集を取り組むあたりで予約したので、締め切り効果もあり
緊張感をもって勉強できました

次はUdemy の勉強講座がありませんが（笑）
AWS DVA を取ろうと思うので、勉強を頑張りたいと思います


![aws-certified-solutions-architect-associate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658875/b980244f-903a-9a1c-cd10-3573b379f08f.png)
Databricks Searchの新機能を試す

こちらの記事をウォークスルーします。

https://www.databricks.com/blog/adding-intelligence-to-databricks-search

# Databricks SearchがAI生成メタデータを活用

検索機能の対象には、Unity Catalogで管理されるテーブルにおいて生成AIが作り出すテーブルやコメントのカラムも含まれています。
![Screenshot 2024-03-05 at 19.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a3043bc3-34d3-8bcc-bff3-c2177b2cf2b7.png)

# 新機能のウォークスルー

検索を行うとページ全体に結果が表示され、クイックにフィルタリングすることができます。

## フルページの検索画面

検索結果がページ全体に表示されます。

![](https://lh7-us.googleusercontent.com/1FjUofUrI32gTAw5nFRZCKxgZejNUYOTNwGAzRSmNU1_ZPVF3Gr78hPwlTS0cTVJ6hQ38_hN7XLK_7zbHiCbCHOjoJIyjeuW4UXA4CcPv7K19LgThlGh0ISzVmg6K7cVTzIivdobj89I6zS6OjbUYMk)

テーブルだけではなく、ノートブックやクエリーなども検索できます。
![Screenshot 2024-03-05 at 19.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/806b825b-e4fc-a9ff-3825-6722e782d3e8.png)

## セマンティック検索

キーワードマッチの検索に加えて、自然言語での検索もサポートされています。

![Screenshot 2024-03-05 at 19.49.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/06fb75ce-9f6c-35c5-b531-98c62a6d35ea.png)

## 関連性だけではなく人気度で並び替え

よく利用されているアセットを上位に表示することができます。
![Screenshot 2024-03-05 at 19.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b3e9f347-5411-88e4-285b-6e35f9e8b7e1.png)

## URLの活用

検索パラメータはURLに含まれるので、ブックマークしておくことで簡単に検索結果にアクセスできます。

```
xxxx.databricks.com/search?q=covid_cases+type%3Amarketplace&o=xxxxxx
```

# その他の機能

- **最近のアセット**: 検索バーをクリックした際に、過去に参照したアセットがドロップダウンに表示されます。
![Screenshot 2024-03-05 at 19.56.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c2aa31de-a7b5-cd24-a193-4f8e882dfdca.png)
- **キーボードショートカット**: “CMD+P” (Mac) / “CTRL+P” (Windows)で検索バーに移動できます。
- **新規タブで検索ページをオープン**: 検索でEnterを押すのではなく、“CMD+Enter” (Mac) / “CTRL+Enter” (Windows)を押すと、検索結果が新規タブで開きます。
- **空の検索条件で検索**: 特定のフィルター条件で全てのオブジェクトを表示したい場合には、検索条件を入力しないで検索を行います。
![Screenshot 2024-03-05 at 19.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1e291b63-dbc3-99cb-5b38-4887d3420640.png)
- **コードの検索**: ノートブックやクエリーを名称だけでなくコンテンツで検索できます。
![Screenshot 2024-03-05 at 20.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0900cdc8-8501-fe18-09a0-b29bd49b22b6.png)


マニュアルは[こちら](https://docs.databricks.com/ja/search/index.html)です。是非ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
達人に学ぶDB設計徹底指南書を読んで

# はじめに
今回は、達人に学ぶDB設計徹底指南書を読んだので、その感想をまとめてみました。

## 良かったところ
 - DB設計に関してすごい難しい印象があったけど、わかりやすく説明されているので、苦手意識がなくなった。
 - 具体的なコードは、あまり出てこないが、その分図と言葉で上手く説明してあり、例えもわかりやすかった


## 学んだこと
### データベース
- データを整合的に保持して、いつでも簡単に利用できる状態にし、データの集まりを**データベース**という

- データベースを管理するためのシステムを**DBMS**と呼ぶ

- データとは、ある形式（フォーマット）に添えられた事実のことである

### リレーショナルデータベース
現在最も広く使用されているデータベース。
特徴は、データを人間が理解しやすい二次元素の形式で管理するため、直感的で簡単である。

### システム開発の設計工程
1. 要件定義
　 システムの機能やサービスの水準を決める

2. 設計
決められた要件を満たすために必要なシステムを作るための設計（デザイン）を行う

3. 開発（実装）
設計書に従ってシステムを実際に作る

4. テスト
出来上がったシステムが、実用に耐える品質であるか試験する

- DOA（データ中心アプローチ）
プログラムを作る前に、データの設計から始める方法。複数のプログラムを共有できるため、要件の仕様変更にも柔軟に対応できる。
近年では、こちらが主流。

- POA（プロセス中心アプローチ）
DOAと反対で、プログラムから作り始める方法。複数のプロジェクト毎にデータを管理する必要がある。

### 　論理設計と物理設計
データーベース設計は、論理設計(概念スキーマ)と物理設計(内部スキーマ）に分けられる。

論理設計は、現実世界に存在する数多くのデータから、リレーショナルデータベースにおいて、何を、どのようなフォーマットで保存するかを決めることです。

- 具体的な4つのタスク
1. エンティティの抽出
2. エンティティの定義
3. 正規化
4. ER図の作成

物理設計は、論理設計の結果を受けて、データを格納するための物理的な領域や格納方法を決める工程です。

1. テーブル定義
2. インデックス定義
3. ハードウェアのサイジング
4. ストレージの冗長構成決定
5. ファイルの物理配置決定

### 正規化
正規化は、エンティティ（テーブル）について、システムの利用がスムーズに行えるように整理する作業です。論理設計において、最も理解を深めておくべき概念です


### 正規形
正規形とは、データベースで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式です。

**第1正規形**
非正規形から、1つのセルに1つの値が格納されている状態の事です

**第2正規形**
第1正規形から、部分関数従属を解消し、完全関数従属になっている状態のことです。

**第３正規形**
第2正規形から、推移的関数従属を解消し、非キー列はキー列に対してのみ従属するようにする

### バックアップ
**フルバックアップ**
フルバックアップまたは完全バックアップは、フルという言葉とうり、ある時点でそのシステムで保持されているすべてのデータをバックアップする方式です。

**差分バックアップ**
差分バックアップとは、変更分だけをバックアップする方式です。例えば、毎週月曜日にフルバックアップするとして、月曜日からの変更分のみバックアップを取得します。このようにすることで、バックアップのデータ容量が減り、節約できます。

**増分バックアップ**
増分バックアップとは、その日の変更分だけバックアップする方式です。差分バックアップよりさらにデータ量が少なく済みます。コスト的に優れた方法です。

### インデックス
インデックスはSQLのパフォーマンス改善のための非常によく使われる手段です。

**アプリケーション透過的**
インデックスを使うかどうかは、DBMSが自動的に判断します。なので、インデックスを使う場合、データベース側にインデックスを作成すればいいだけで、アプリケーションプログラムの変更が必要ありません。このように**存在を意識しなくていい**という性質を『透過性』と呼びます。

**データ透過性**
インデックスを作成することで、デーブルに格納されているデータの中身が影響を受ける事がありません。デーブル構造も変化することはありません。

**大きな性能効果**
インデックスの性能が、データ量に対してゆるくしか劣化しません。
多くの場合において、デメリットをメリットが大きく上回ります。

## 難しかったこと
- SQLで木構造を扱うの部分の入れ子構造の部分は、難しくて理解しにくかった。本当に実務で使うとなると大変そうだと思った。
- 初心者がいきなり読むのは難しいと思います。ある程度の基礎知識は必要。 

## 参考文献
https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6DB%E8%A8%AD%E8%A8%88-%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798124702/ref=sr_1_1?crid=1MB2CFLXQN70E&keywords=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6db%E8%A8%AD%E8%A8%88&qid=1700350893&sprefix=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%2Caps%2C203&sr=8-1
トランザクションについて

### 初めに
WEBサイトを制作している際に、DBのトランザクションを意識せずコードを書いていたところ、コードレビューで指摘されたため、本記事を作成する。
トランザクションという言葉は知っていたが実際にコードを書くのは初めてで理解が浅かった。

### トランザクションとは
データベース（DB）登録の実装におけるトランザクションは、データベース操作が一連の一貫した処理として扱われる仕組みのこと。
例えば途中までクエリが成功していて、途中で失敗した場合、トランザクションを実装していなければ、その途中までの処理がDBに対して実行されてしまう。
それを防ぐためトランザクションを実装し、途中で失敗した場合は、ロールバック(元に戻す)され、何も処理が実行されなかったときの状態を保つ。

### まとめ
トランザクションとは、データベースに情報を登録するときの一連の作業のセットで、全部が成功するか失敗するかというように管理する仕組み。


[参考サイト]
・https://wa3.i-3-i.info/word142.html
・https://corp.rakuten.co.jp/event/rakutentech/blockchain/transaction.html
GPT4より性能高いモデルが公開されました？：Claude 3

昨日、AnthropicがClaude 3を発表しました。ベンチマークではChatGPT4を上回っています。(⇩図)
![3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/57ab83ef-b9a5-33a9-952c-11d9c60f4b8d.png)

ベンチマーク結果に対して、数学問題の解決能力とコード生成能力は特に注目すべきところだと思います。
 
LLMが数学問題を解決する能力はいつも性能を検証する上で非常に重要な指標です。（一部の意見では、モデルが数学の問題を得意とするほど、ロジカルシンキング能力が高く、知能が高いとされています）
 
例えば、図に書いてる”math problem-solving”項目について、スコアだけを見ると、Claude 3はGPT-4を数%だけ越えてるようですが、実はそれだけではなくポイントとなっているのは、Claude 3が数学の問題に対して全て0-shotで答えたです（一方でChatGPT4は4-shotです）。これは非常に大きな進化だと思います。つまり、モデルが人間の解法を参照する必要がなく、ある程度自ら数学問題を正確に解けるようになったことを示しています。
 
もう一つのコード生成について、こちらのスコアは67％から84％へ上げてますし、私が今日実際にコードを書いてみたところ、確かにChatGPT4より精度が高いと感じてました。（ChatGPTから生成されたコードは基本的にdebugする前提で使用していますが、Claude3は、今日試した限り、基本的には一発で実行できるコードを生成されました）
 
あとは、Claude 3は日本語能力も向上されたと言われています（これはまだ感じていません。多分私は外国人からかもしれません）。
 
興味ある方試してみてください：（最新モデル使うためにはProにアップグレードする必要があります。料金はGPT-4と同じく月20ドルです）

https://claude.ai/chats
点電荷による電場解析

# はじめに
クーロンの法則により、点電荷の電場と電位は解析することができる。しかし、一般の形のある電荷を持つ物体によって働く電場や電位を求めるのは難しい。

そこで、今回は物体を点電荷の集合体と考えることによって広さ有限の平面コンデンサに働く、電場と電位についてPythonを用いて解析することができるかまず考察する。

次に、円筒型コンデンサの電場と電位についても同様の方法で調査する。
ただし、電場と電位の図示にmatplotlibを用いて、電場の計算にnumpyのgradientを用いた。

# 平面板コンデンサ
## プログラム
電極平板を微小の点電荷に分解して独自にクーロン法則を立てて、最後に加算することで電位を求めるという方法を用いる。以下のようなプログラムを作成する。

```python con_E.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

coords,ds = np.linspace(-0.6,0.6,100,retstep=True)


#XY領域の作成
X,Y = np.meshgrid(coords,coords)

k = 9.0*10**9
#微小区間の電荷の大きさ
q1=1

d=0.1
n=10000
#電極の範囲（長さ0.4の電極平板の作成）
x=np.linspace(-0.2,+0.2,n)
Z=0

for i in range(n):
  #電極の図示
  plt.plot(x[i],-d,'o',color='blue')
  plt.plot(x[i],d,'o',color='red')
  #電位の計算
  Z=Z-  k*q1/((X-x[i])**2+(Y+d)**2)**0.5+k*q1/((X-x[i])**2+(Y-d)**2)**0.5



n=100
#電位のグラフ 等高線n本
plt.contour(X,Y,Z,n)
plt.colorbar()


#勾配の配列は行方向、列方向の順で返されるので注意
#勾配つまり傾きを求める
dY,dX=np.gradient(Z,ds)
#電場
Ex=-dX
Ey=-dY

#電場のグラフ
plt.streamplot(X,Y,Ex,Ey)

# ax.quiver(X,Y,dX,dY)

plt.savefig("異符号の電場と電位_コンデンサ.png")

plt.show()
```

これを実行すると以下のような画像が出力される。

![異符号の電場と電位_コンデンサ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/c0ef52f7-9eec-d174-e65a-315a4d6b618e.png)

等電位面は等高線で示してあり、電場はベクトル図として表してある。ここで分かることは、有限の大きさのコンデンサ平板なので、電場はまっすぐでなく若干曲がってしまうということである。そのせいか、電位も電極の形に依存してしまっている。また、無限平面のコンデンサならば、コンデンサ外部の空間に働く電場の大きさは0となるはずであるが、今回は若干電場が存在してしまっている。

# 円筒形コンデンサ
半径が$r_1$と$r_2$の電極板をモデルにした円筒形コンデンサを考える。ただし、$r_1 < r_2$として、電極の符号はそれぞれ正と負である。

# プログラム

```python con_E_en.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import math
coords,ds = np.linspace(-0.6,0.6,100,retstep=True)


#XY領域の作成
X,Y = np.meshgrid(coords,coords)

k = 9.0*10**9
#微小区間の電荷の大きさ
q1=1*10**(-10)

n=1000
#電極の範囲（長さ0.4の電極平板の作成）
theta=np.linspace(0,2*math.pi,n)

r1=0.1
r2=0.55

Z=0

for i in range(n):
  #電極の図示
  x1= r1*np.cos(theta[i])
  x2= r2*np.cos(theta[i])

  y1= r1*np.sin(theta[i])
  y2= r2*np.sin(theta[i])

  plt.plot(x1,y1,'o',color='red')
  plt.plot(x2,y2,'o',color='blue')
  #電位の計算
  Z=Z+  k*q1/((X-x1)**2+(Y-y1)**2)**0.5-k*q1/((X-x2)**2+(Y-y2)**2)**0.5



n=100
#電位のグラフ 等高線n本
plt.contour(X,Y,Z,n)
plt.colorbar()


#勾配の配列は行方向、列方向の順で返されるので注意
#勾配つまり傾きを求める
dY,dX=np.gradient(Z,ds)
#電場
Ex=-dX
Ey=-dY

#電場のグラフ
plt.streamplot(X,Y,Ex,Ey)

# ax.quiver(X,Y,dX,dY)

plt.savefig("異符号の電場と電位_コンデンサ.png")

plt.show()

```

![異符号の電場と電位_コンデンサ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/c90d61b3-1242-aedc-c83d-5cc8840b8b61.png)

この図から分かるように、正の電極から負の電極にむけて電場ベクトルが描写されている。


# まとめ
今回は、前半で有限の広さを持つコンデンサ平板に電荷を与えたときに生じる電場と電位について解析した。解析方法としては、点電荷の集合体として考えることによってクーロンの法則により電位を重ね合わせて、それを微分することによって電場を求めた。すると中央付近の電場は電極とほぼ垂直であったが、端の方では歪んでしまった。したがって、コンデンサ内の電場を制御するためには、電極の形状が重要であるということが分かる。
また、後半では、円筒型コンデンサについても同様な方法でシミュレートした。この場合も、電場ベクトルと等電位面は垂直であり、電場ベクトルは正の電極から負の電極に向けて存在しているということがわかった。