OmniAICreator/Qiita-1.07M huggingface dataset:
直列リアクトルと高調波

# はじめに
系統に並列接続される電力用コンデンサと高調波について考察する。パワエレ機器を接続すると系統に高調波電流が流れる。その場合、コンデンサのような高周波数領域でインピーダンスが激減する機器に高調波電流が流れる。そうするとコンデンサが熱により破損してしまう可能性がある。ゆえに、コンデンサに直列リアクトルを接続させることでコンデンサの破損を防ぐ。一方で、コンデンサ外部の系統に高調波電流をあまり流出させないといった効果も直列リアクトルは保持している。ここで、第五調波,第七調波に反応しやすいのは、6%リアクトルと13%リアクトルである。今回は、2つの直列リアクトルが系統に高調波を流出するのをどのように防いでいるのかを調査した。結果、以下のようなグラフになった。このグラフよりターゲットとなる高調波が外部に流出するのを直列リアクトルが防止してくれているということがわかる。

![高調波と電力用コンデンサと直列リアクトル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/63f3a545-3375-37ff-6101-3d01a8f3890e.png)


# 回路設定
## 単線結線図
以下に、今回調査する系統の単線結線図を載せる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/344c7eef-9b80-78bf-df16-e96af275ff7f.png)

これから分かるように、高調波の発生源となる電流源から系統側と電力コンデンサ側に電流が分流していることが分かる。なので、配電系統側に流出する高調波電流を小さくするためには、分流比を上手く制御すればよいことが分かる。

## 等価回路
上記の考察により、以下のような等価回路を書くことが可能になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/c1e8e301-cc55-526f-cb30-ca4b6872ddd6.png)

したがって、系統に流出してしまう高調波電流$I$は$I_{total}$を用いて以下のように表すことができる。（分流の式）

```math

\dot{I}=\frac{jnX_L-\frac{1}{n}jX_C}{jX_1+(jnX_L-\frac{1}{n}jX_C)}I_{total}

```

# プログラム
さて、$I$の式においてn（高調波の次数）を変化させた場合、どのような挙動を示すのか、プログラムによって解析したい。したがって、以下のようなプログラムを書いた。これは、6%と13%リアクトルの場合をそれぞれ示している。


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

m=10
f=50
omega = 2*math.pi*f

I_total=10

n=np.linspace(1,10,m)

#負荷側
X_1=10

X_C0=100
X_L1=X_C0*0.13
X_L2=X_C0*0.06
#電力用コンデンサ

X_C1= n*X_L1-(1/n)*X_C0
X_C2= n*X_L2-(1/n)*X_C0
I_1=abs((1j*X_C1)/(1j*X_1+1j*X_C1)*I_total)
I_2=abs((1j*X_C2)/(1j*X_1+1j*X_C2)*I_total)




plt.xlabel("高調波の次数")
plt.ylabel("負荷に流れる高調波電流")

plt.plot(n,I_1,color="red", label="13%")
plt.plot(n,I_2,color="blue", label="6%")

# 凡例表示
plt.legend(loc = 'upper right') 

plt.savefig("高調波と電力用コンデンサと直列リアクトル.png")

plt.show()
```
これを実行すると、以下のようなグラフが出力される。

![高調波と電力用コンデンサと直列リアクトル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/63f3a545-3375-37ff-6101-3d01a8f3890e.png)

このグラフから、ターゲットとなる次数周辺で系統に流出する高調波は減少するということが分かる。

# まとめ

今回は、電力コンデンサに付随する直列リアクトルについて述べた。
直列リアクトルには、コンデンサの破損を防ぐ役割と外部系統にターゲット次数の高調波を流出させないという目的がある。今回は、後者の目的について、プログラムを用いることで検証した。結果、ターゲット次数の周辺では、系統に流出する高調波は減少するということが分かった。

# 参考文献

https://amzn.asia/d/064kvlsD
100MB を超えるファイルをプッシュするにはGit LFS を使用する

# はじめに
Gitに作成したアプリをプッシュしようとしたところ、下記のエラーが出ました。
**ファイルの容量が大きすぎた**ようです。
```
Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
```


# Git Large File Storage (LFS) を使ってみる

**インストール（Ubuntu）**
```
sudo apt-get install git-lfs
```

**対象リポジトリ下で初期化**
```
git lfs install
```

**対象ファイル（要領の大きいファイル）をLFSに追加**
```
git lfs track "対象ファイル"
```
**.gitattributes ファイルをコミット**
```
git add .gitattributes
git commit -m "Track large files with Git LFS"
```

**対象ファイルをコミット**
```
git add .{LFSに追加した対象ファイル}
git commit -m "Add large files"
```

**プッシュ**
```
git push
```
# おわりに
Git上で管理をする必要のないファイルなのであれば、.gitignoreに追記して追跡対象外にしましょう。
また、コミット・プッシュはこまめに行いましょう・・
# 参考

https://qiita.com/ikmski/items/5cc8b8832336b8d85429
ラグランジュ関数の最小値を求める手順

# ラグランジュの未定乗数法とは
ラグランジュの未定乗数法は、制約条件付きの最適化問題を解く一般的な方法です。SVMでも使われています。
今回は、制約条件を持つ関数の最小値を求めるラグランジュ未定乗数法を解く例を説明します。


## 問題の設定
以下のような最適化問題を考えます：
minimize $f(x, y)$
subject to $g(x, y) = 0$

ここで、$f(x, y)$ は目的関数で、$g(x, y)$ は制約条件を表す関数です。

## ラグランジュ関数の定義
ラグランジュ関数 $\mathcal{L}$ は、目的関数と制約条件を組み合わせたものです：
$$
\mathcal{L}(x, y, \lambda) = f(x, y) + \lambda \cdot g(x, y)
$$
ここで、$\lambda$ はラグランジュ乗数です。

## 手順
ラグランジュ関数の偏微分:
ラグランジュ関数 $\mathcal{L}$ を $x$, $y$, および $\lambda$ について偏微分します。
$$
\frac{\partial \mathcal{L}}{\partial x} = \frac{\partial f}{\partial x} + \lambda \frac{\partial g}{\partial x} = 0
$$
$$
\frac{\partial \mathcal{L}}{\partial y} = \frac{\partial f}{\partial y} + \lambda \frac{\partial g}{\partial y} = 0
$$
$$
\frac{\partial \mathcal{L}}{\partial \lambda} = g(x, y) = 0
$$

## 方程式の解
上記の偏微分方程式を連立方程式として解きます。これにより、変数 $x$, $y$, $\lambda$ の値を求めます。

## 候補点の確認
解いた連立方程式の解から得られる $(x, y)$ が候補点です。この候補点が制約条件を満たし、目的関数の最小値となるかを確認します。

## 例題
minimize $ f(x,y) = x^2 + y^2 $ 
subject to $ x + y - 1 = 0 $

### ラグランジュ関数の定義
ラグランジュ関数は以下のように定義されます：
$$
\mathcal{L}(x,y,\lambda) = x^2 + y^2 + \lambda (x + y - 1)
$$

### 偏微分方程式
ラグランジュ関数を $ x , y , $ および $ \lambda $について偏微分します。
$$
\frac{\partial \mathcal{L}}{\partial x} = 2x + \lambda = 0
$$
$$
\frac{\partial \mathcal{L}}{\partial y} = 2y + \lambda = 0
$$
$$
\frac{\partial \mathcal{L}}{\partial \lambda} = x + y - 1 = 0
$$

### 連立方程式の解
$$
2x + \lambda = 0 \implies \lambda = -2x
$$
$$
2y + \lambda = 0 \implies \lambda = -2y
$$

よって、
$$
-2x = -2y \implies x = y
$$
$$
x + y - 1 = 0 \implies 2x - 1 = 0 \implies x = \frac{1}{2}, y = \frac{1}{2}
$$

### 確認
候補点 $ (x, y) = \left(\frac{1}{2}, \frac{1}{2}\right) $ が制約条件を満たし、目的関数 \( f \) の値は
$$
f \left(\frac{1}{2}, \frac{1}{2}\right) = \left(\frac{1}{2}\right)^2 + \left(\frac{1}{2}\right)^2 = \frac{1}{4} + \frac{1}{4} = \frac{1}{2}
$$

したがって、目的関数 $ f(x,y) = x^2 + y^2 $ は制約条件 $ x + y - 1 = 0 $の下で最小値 $ \frac{1}{2} $をとります。
【Python3】ハノイの塔 (paizaランク A 相当)：アルゴリズム付きの解説

https://paiza.jp/works/mondai/real_event/hanoi

**要求分析**
- 3つの杭（A、B、C）があり、杭Aには `n` 個の円盤が大きい順に積まれている。
- `n` 個の円盤を最短手順で杭Aから杭Cに移動させる。
- `t` 回の移動後の各杭の状態を出力する。

**アルゴリズム**
1. 初期状態を設定し、各杭に円盤を配置。
2. 再帰的に円盤を移動する関数 `move_disks` を定義。
3. 移動後の各杭の状態を出力する。

以下は実装例です。

```python
def hanoi(n, t):
    # 初期状態の設定
    pegs = [list(range(n, 0, -1)), [], []]
    moves = []

    # ハノイの塔の再帰的な移動関数
    def move_disks(num_disks, from_peg, to_peg, aux_peg):
        if num_disks == 0:
            return
        move_disks(num_disks - 1, from_peg, aux_peg, to_peg)
        if len(moves) < t:
            disk = pegs[from_peg].pop()
            pegs[to_peg].append(disk)
            moves.append((from_peg, to_peg))
        move_disks(num_disks - 1, aux_peg, to_peg, from_peg)

    # 再帰的に円盤を動かす
    move_disks(n, 0, 2, 1)

    # 各杭の状態を出力
    for peg in pegs:
        if peg:
            print(" ".join(map(str, peg)))
        else:
            print("-")

# 標準入力からの入力を受け取る
import sys
input = sys.stdin.read().strip()
n, t = map(int, input.split())

# ハノイの塔のシミュレーションと出力
hanoi(n, t)
```

このコードは、以下のように動作します。

**入力例1:**
```
3 4
```
**出力例1:**
```
-
2 1
3
```

**入力例2:**
```
4 6
```
**出力例2:**
```
4 1
3 2
-
```

### 解説
1. `n` と `t` を標準入力から読み込む。
2. `pegs` は3つの杭を表し、初期状態では全ての円盤が `pegs[0]` に積まれている。
3. `moves` リストは円盤の移動を記録し、`t` 回移動する。
4. `move_disks` 関数は再帰的に円盤を移動する。
5. 最終的な各杭の状態を出力する。

このコードは指定された `t` 回の移動後の杭の状態を正確に出力します。
暴風雨の後の屋根修理方法

暴風雨が過ぎ去った後、屋根にダメージが発生することがあります。迅速に対応し、適切な修理を行うことで、家の構造を守り、さらなる被害を防ぐことができます。ここでは、暴風雨の後の屋根修理方法について説明します。

被害の確認
まず、暴風雨による被害を確認することが重要です。屋根全体を点検し、損傷箇所を特定しましょう。

今すぐプロのサービスで屋根を新品同様に - 詳しくはhttps://roof-restore.com.au/。

屋根の点検ポイント
* 破損したシングル: 剥がれたり、割れたり、反ったりしているシングルがないか確認します。
* フラッシングの損傷: 煙突や通気口、天窓周辺のフラッシングに隙間や錆びがないか点検します。
* 雨どいの詰まり: 雨どいに詰まりがないか確認し、必要に応じて清掃します。

応急処置
被害が大きい場合は、応急処置を施し、さらなる被害を防ぎます。

応急処置の方法
* タープの設置: 屋根の破損部分にタープを張り、一時的に雨水の侵入を防ぎます。
* シーラントの使用: 小さな隙間や亀裂にはシーラントを使用し、一時的な防水対策を行います。

修理の計画
応急処置が完了したら、正式な修理の計画を立てます。必要な材料と工具を準備しましょう。

修理に必要な材料と工具
* シングル: 破損したシングルを交換するための新しいシングル。
* フラッシング: 損傷したフラッシングを交換するための新しいフラッシング。
* シーラント: 防水用のシーラント。
* 工具: ハンマー、釘、プライバー、梯子など。

修理作業
修理作業は慎重に行う必要があります。安全を確保しながら、以下の手順で修理を進めましょう。

修理手順
* 破損したシングルの取り外し: プライバーを使って破損したシングルを取り外します。
* 新しいシングルの取り付け: 新しいシングルを所定の位置に釘で固定します。
* フラッシングの修理: 損傷したフラッシングを取り外し、新しいフラッシングを取り付けます。
* シーラントの塗布: すべての接合部にシーラントを塗り、防水効果を高めます。

予防策
今後の暴風雨に備えて、予防策を講じることが重要です。定期的な点検とメンテナンスを行いましょう。

予防のためのヒント
* 定期点検: 屋根を年に2回、春と秋に点検します。
* 樹木の管理: 屋根の上に枝がかからないように樹木を剪定します。
* 雨どいの清掃: 雨どいを定期的に清掃し、詰まりを防ぎます。

専門家への依頼
自分で修理が難しい場合や、被害が大きい場合は、専門家に依頼することを検討しましょう。

専門家に依頼する利点
* 安全性: 高所作業のリスクを避けることができます。
* 専門知識: 専門家は適切な修理方法を熟知しています。
* 長期的な信頼性: 専門家による修理は長期的に信頼性があります。

当社のプロフェッショナルなサービスで屋根を修復しましょう。詳しくはhttps://roof-restore.com.au/roof-restorations-wantirna-south/.

暴風雨の後の屋根修理は、迅速かつ適切に行うことが重要です。被害の確認から応急処置、修理作業、予防策まで、しっかりとした手順を踏むことで、家の安全と屋根の寿命を延ばすことができます。必要に応じて専門家に依頼し、安全で確実な修理を行いましょう。
MATLABで「中央に点をつけた記号」を用いたグラフを作成する

# はじめに
MATLABで「中央に点をつけた記号」を用いたグラフを作成ための関数を作成しました．
以下のようなグラフ（見覚えのある方，仲間です）を作成するのに利用してください．

![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/cde7096d-b322-3baf-2a74-6a50d043d5ed.png)

# ダウンロード
以下のページからダウンロードするか，末尾に記載の実装をコピーしてください．
https://www.mathworks.com/matlabcentral/fileexchange/170111-overlaycenterdots

# 使い方
1. 現在のフォルダに `overlayCenterDots.m` をコピー
1. データをプロットし，軸ラベル等を指定
1. 凡例に表示するオブジェクトを適当な名前（ここでは`subset`）の配列に格納
1. `subset` を指定して`legend`を作成
1. `subset` ，および中央に点をつけたいオブジェクトのインデックス `targetIdx` を指定して`overlayCenterDot`を実行
1. 直後にグラフを書き出し

# 使用例
```MATLAB
figure; 
x = 1:10;
hold on;
h1 = plot(x,   x,                    "k-");
h2 = plot(x, 2*x,                    "k--");
h3 = plot(x,   x+0.5*randn(size(x)), "ko",  MarkerFaceColor="w");
h4 = plot(x, 2*x+0.5*randn(size(x)), "k^",  MarkerFaceColor="w");
xlabel("x-axis");
ylabel("y-axis");

subset    = [ h1    h2    h3    h4 ]; % objects displayed in legend
label     = ["h1", "h2", "h3", "h4"]; % labels for objects
targetIdx = [3 4];                    % target for adding dots

% Create legend and overlay center dots specifying the same subset
legend           (subset, label, Location="northwest");
overlayCenterDots(subset, targetIdx);

exportgraphics(gcf, "example.png"); % export
```

# 仕組み
職人技ですが，ダミーの座標軸や凡例を追加し，点以外の全てを非表示にしています．関数の中身はこちらです．

```MATLAB
function [dummyPlots, dummyAxes, dummyLegend] = overlayCenterDots(subset, targetIdx)

% Get the original axes and legend
originalAxes   = gca;
originalLegend = originalAxes.Legend;

% Create dummy axes
dummyAxes = axes(Position = originalAxes.Position, ...
                 XScale   = originalAxes.XScale, ...
                 YScale   = originalAxes.YScale);

% Plot data on the dummy axes
hold on;
for i = 1:numel(subset)
    if ~isempty(find(targetIdx(:) == i, 1)) 
        % If it's the target for overlay, add a black dot
        dummyPlots(i) = plot(subset(i).XData, subset(i).YData, 'k.');
    else
        % If it's not the target for overlay, add dummy data
        dummyPlots(i) = plot(nan, nan, '', Color = 'none');
    end
end
hold off

% Link the dummy axes to the original axes
linkaxes([originalAxes, dummyAxes]);

% Hide the dummy axes
axis off

% Create the dummy legend
dummyLegend = legend( ...
    Position    = originalLegend.Position,    ... % Match the legend
    NumColumns  = originalLegend.NumColumns,  ...
    FontAngle   = originalLegend.FontAngle,   ...
    FontName    = originalLegend.FontName,    ...
    FontSize    = originalLegend.FontSize,    ...
    FontWeight  = originalLegend.FontWeight,  ...
    Orientation = originalLegend.Orientation, ...
    Interpreter = originalLegend.Interpreter, ...
    String      = originalLegend.String,      ...
    Units       = originalLegend.Units,       ...
    Box         = 'off',  ... % Hide the legend box
    Color       = 'none', ...
    TextColor   = 'none');

% Add title for dummy legend
title(dummyLegend, originalLegend.Title.String);

end
```
TKCのFXクラウドをUSBドライブが使えない仮想マシンやRDP接続先のWindowsにインストールする方法

RDP接続先やVMなどUSBドライブが接続できないWindowsマシンに、TKCのFXクラウドをインストールするための手順をご紹介します。ここでは、`USB Image Tool`を使ってUSBドライブをイメージ化し、`OSFMount`を使ってVirtualマシンにそのイメージをマウントする方法を説明します。

### 手順概要

1. **USB Image Toolを使用してUSBドライブをイメージ化**
2. **イメージファイルをクラウドVirtualマシンに転送**
3. **OSFMountを使用してイメージファイルをマウント**
4. **TKCのFXクラウドをインストール**

### 1. USB Image Toolを使用してUSBドライブをイメージ化

まず、物理的なPCでUSBドライブのイメージを作成します。

1. [USB Image Tool](http://www.alexpage.de/usb-image-tool/download/)をダウンロードしてインストールします。
2. USBドライブをPCに接続します。
3. USB Image Toolを起動します。
4. 「Backup」タブを選択し、イメージを作成したいUSBドライブを選択します。
5. 「Backup」ボタンをクリックし、保存先とファイル名（例：`image.img`）を指定してイメージファイルを作成します。

### 2. イメージファイルをクラウドVirtualマシンに転送

作成したイメージファイルをクラウドVirtualマシンに転送します。以下の方法が考えられます：

- ファイル転送サービス（例：Google Drive、Dropboxなど）を利用する。
- SSHやSCPを利用して直接転送する。

### 3. OSFMountを使用してイメージファイルをマウント

クラウドVirtualマシン上で、OSFMountを使用してイメージファイルをマウントします。

1. [OSFMount](https://www.osforensics.com/tools/mount-disk-images.html)をダウンロードしてインストールします。
2. OSFMountを起動し、「Mount new...」をクリックします。
3. 「Image File」に転送したイメージファイルのパスを指定し、「Next」をクリックします。
4. マウントされたドライブにアクセスできることを確認します。

### 4. TKCのFXクラウドをインストール

マウントされたドライブからTKCのFXクラウドのインストーラを実行し、通常通りインストールを進めます。

1. マウントされたドライブにアクセスし、インストーラをダブルクリックします。
2. インストーラの指示に従ってインストールを完了します。

### まとめ

この方法を使えば、USBドライブを直接クラウドVirtualマシンに接続できない環境でも、イメージファイルを使用してソフトウェアをインストールすることができます。`USB Image Tool`と`OSFMount`を活用することで、スムーズにインストール作業を行うことが可能です。
なお、インストールファイルは5MB程度しかないので、なるべく容量の少ないUSBドライブを使うとイメージの転送が楽です。
【Python3】Fizz Buzz (paizaランク C 相当)：アルゴリズム付きの解説

https://paiza.jp/works/mondai/c_rank_skillcheck_sample/fizz-buzz

以下の要件を満たす「Fizz Buzz」アルゴリズムを作成します。

**要求分析**
- 標準入力から整数 `N` を読み込む。
- 1から `N` までの整数を順に処理し、特定の条件に従って出力を変更する。

**アルゴリズム**
1. `N` を標準入力から読み込む。
2. 1から `N` までの整数を順に処理する。
3. 各整数 `i` に対して以下を行う:
   - `i` が3の倍数かつ5の倍数の場合、`"Fizz Buzz"` を出力。
   - `i` が3の倍数の場合、`"Fizz"` を出力。
   - `i` が5の倍数の場合、`"Buzz"` を出力。
   - その他の場合、整数 `i` をそのまま出力。

以下は実装例です。

```python
# 標準入力から整数Nを読み込む
N = int(input().strip())

# 1からNまでの整数を順に処理
for i in range(1, N + 1):
    # 3の倍数かつ5の倍数のとき
    if i % 3 == 0 and i % 5 == 0:
        print("Fizz Buzz")
    # 3の倍数のとき
    elif i % 3 == 0:
        print("Fizz")
    # 5の倍数のとき
    elif i % 5 == 0:
        print("Buzz")
    # その他の数値のとき
    else:
        print(i)
```

このコードは、以下の条件を満たすテストケースに対して正しい出力を生成します。

**入力例1:**
```
5
```
**出力例1:**
```
1
2
Fizz
4
Buzz
```

**入力例2:**
```
20
```
**出力例2:**
```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz
```

このコードは、1から `N` までの整数を順に処理し、指定された条件に従って出力を変更します。
分散型VPN（dVPN）とは？



この記事では、分散型VPN（dVPN）という概念と、従来のVPNとの違いについて詳しく解説します。

## 分散型VPNの概要

私たちのオンラインプライバシーは、データ漏洩や監視の脅威にさらされています。従来のVPNはインターネットトラフィックを暗号化し、再ルーティングすることで匿名性と安全性を提供してきましたが、集中型のアーキテクチャがセキュリティリスクを招く可能性があります。分散型VPN（dVPN）は、ユーザーデータを分散化し、暗号化することで、単一障害点や攻撃点を回避し、VPN技術の利点を活かしています。

## dVPNの機能と利点

dVPNを使用することで、以下のような利点があります：

- **分散化によるプライバシー強化**: データを複数のノードに分散し、中央の制御ポイントがないため、セキュリティリスクが低減します。
- **暗号化とマルチホップルーティング**: データの暗号化と複数のホップを使用して監視を回避します。
- **信頼不要の自律性**: VPN企業への信頼なしで、ユーザーのプライバシーとセキュリティを維持します。
- **検閲への耐性**: 検閲を回避するための継続的な耐性を提供します。

## dVPNと従来のVPNの違い

### データのルーティング

従来のVPNは中央サーバーを使用してデータをルーティングし、VPNサーバーを通じてトラフィックを暗号化します。一方、dVPNは複数のノードを使用してデータを分散化し、パズルのように分割されたデータを複数の場所で管理します。

### 中央集権型 vs 分散型アーキテクチャ

- **従来のVPN**: 中央のサーバーがデータを管理し、集中型の制御ポイントと障害点を持ちます。
- **dVPN**: 複数の独立したノードがデータを管理し、中央集権的なリスクを排除します。

## dVPNの仕組み

- **分散化**: データは複数のノードを通過し、ランダム化されて暗号化されます。
- **暗号化**: AESやRSAなどの強力なアルゴリズムでデータを保護します。
- **トラストレス（trustless）**: データが集中管理されないため、プライバシーとセキュリティが強化されます。

## 分散型VPN vs ノーログポリシー

ノーログポリシーを持つVPNは、ユーザーのデータをログに記録しないと約束しますが、データの管理が集中しているため、結局はVPN事業者を信頼しなければならないということになります。dVPNはデータを分散化することでこの信頼問題を解決し（構造上データを保持しない）、プライバシーをより確実に保護します。

## dVPNの課題

- **パフォーマンス**: 分散型ネットワークによる速度低下や接続の不安定さがある場合があります。NymVPNなどの新しいサービスは、トークンエコノミーを用いてこの問題に対処しています。
- **検閲**: dVPNも検閲を完全に回避できるわけではなく、一部のサービスは政府によってブロックされることがあります。

## 最適な分散型VPNの選択

以下の分散型VPNプラットフォームがあります：

- **Orchid Protocol**: ブロックチェーン技術を用いたマルチホップdVPN。OXTトークンでVPN帯域幅を支払い可能。
- **Mysterium Network**: ブロックチェーン上の「no-log」dVPN。世界最大級のネットワークを持つが、一部の国でブロックされることがあります。
- **Sentinel**: オープンソースのブロックチェーンdVPN。2つのルーティングプロトコルから選択可能。
- **NymVPN**: アルファおよびベータモードでローンチ予定の新しいミックスネットdVPN。2ホップおよび5ホップモードを提供。

## 結論

従来のVPN（中央集権型VPN）は一定のセキュリティを提供しましたが、分散型VPNは中央集権型技術に対する重要な改善策を提供します。dVPNはオンラインプライバシーとセキュリティを強化し、データ漏洩や検閲に対抗するための有力なツールとなります。

# sponsor

HStorageは、高度なセキュリティ機能を提供しているオンラインストレージサービスです。

![Screenshot 2024-08-07 at 2.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672851/82985efd-ae04-b64f-49eb-502d257897c3.png)
https://hstorage.io/

# 参考リンク

- [Nym公式サイト](https://nymtech.net/)
- [Nymのミキシングネットワーク - Wikipedia](https://ja.wikipedia.org/wiki/Nymミックスネット)
- [Nymホワイトペーパー](https://nymtech.net/nym-whitepaper.pdf)
- [分散型VPN と中央集権型VPN:違いの全て](https://note.com/koko_crypto/n/n71fe7e92b68a)
- [ミックスネットとは何か？ VPNによる比類なきオンラインプライバシー](https://note.com/koko_crypto/n/n302e7516f691?magazine_key=m0129d65e3526)
- [Sphinx暗号-Nymを支える匿名データフォーマット](https://qiita.com/pseudonym2/items/107cf005e9cab0b165b6)
- [ココナッツ認証（Coconut Credentials）とは？- プライバシーを保護するゼロ知識証明技術](https://qiita.com/pseudonym2/items/b2739ae32f4fb29de0b6)

# コミュニティ

- [Nym日本コミュニティ - Telegram](https://t.me/nymjapanese)
- [Nym日本コミュニティ - Discord](https://discord.com/invite/nym)
- [Nym日本コミュニティ - LINEオープンチャット](https://line.me/ti/g2/0YGYYq4EoQZ8fL5FYQmqU4O9SRuE_a6YX19GtA?utm_source=invitation&utm_medium=link_copy&utm_campaign=default)
- [Nym 公式LINE(現在非稼働)](https://line.me/R/ti/p/@986ytsdx?from=page&accountId=986ytsdx)
- [Nymプロジェクト日本語アカウント - X](https://x.com/nymproject_jp)
dockerでNext.jsを構築する

環境　Ubuntu24.04 WSL2

dockerはデフォルトのやつを使いました。
ただdocker-compose入れないといけないので


```
sudo curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/libexec/docker/cli-plugins/docker-compose

# 実行権限付与
$ sudo chmod +x /usr/libexec/docker/cli-plugins/docker-compose

# バージョン確認
$ docker compose version
Docker Compose version v2.5.0
```

ツリー構造
```
|-- Dockerfile(フロント用）
|-- backend
|-- docker-compose.yml
`-- frontend
    |-- README.md
    |-- app
    |-- next-env.d.ts
    |-- next.config.mjs
    |-- node_modules
    |-- package.json
    |-- postcss.config.mjs
    |-- public
    |-- tailwind.config.ts
    |-- tsconfig.json
    `-- yarn.lock
```

```Dockerfile:frontend/Dockerfile
FROM node:20
WORKDIR /app
```

```docker-compose:docker-compose.yml
version: '3.8'
services:
  frontend:
    build:
      context: ./frontend/
      dockerfile: Dockerfile
    volumes:
      - ./frontend:/app
    command: 'yarn dev'
    ports:
      - '3001:3001'
```

ポート番号を 3001 に変更するために package.json を編集
```package.json

"scripts": {
    "dev": "next dev -p 3001",
    "build": "next build",
    "start": "next start -p 3001",
    "lint": "next lint"
  },
```

```
docker compose run --rm frontend yarn create next-app .
docker compose up
```
これでlocalhost:3001で見れるようになる。

*基本next.jsでプロジェクトを作る際聞かれる質問はyesにしています
Would you like to use TypeScript?  Yes
Would you like to use ESLint?  Yes
Would you like to use Tailwind CSS?  Yes
Would you like to use `src/` directory? No これだけNo
Would you like to use App Router? (recommended) Yes
Would you like to customize the default import alias (@/*)?  Yes
What import alias would you like configured? @/*
【Laravel11】Handlerを利用したエラーの上書き方法

## 概要
- 以前行った方法ではHandlerを利用できなかったため、利用する方法を簡単にまとめる

## Laravel10の方法？

https://qiita.com/koinunopochi/items/64f79d67843bc02d0da0

:::note warn
この時のインストール方法が違うことで、実施手順に必要な内容が増えた可能性がある
:::


今回の手順は、上記の記事で作成した内容を反映しようとした場合にうまく反映されなかった場合に確かめるポイントといえるかもしれない

## ファイルの作成
    ```bash
    php artisan make:exception Handler
    ```

先ほど提示した記事からコピペ（必要な内容は後程調整をお願いします）

## /bootstrap/app.php

```php:元のファイル
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
```

```php:更新したファイル
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

$app = Application::configure(basePath: dirname(__DIR__))
  ->withRouting(
    web: __DIR__ . '/../routes/web.php',
    commands: __DIR__ . '/../routes/console.php',
    health: '/up',
  )
  ->withMiddleware(function (Middleware $middleware) {
    //
  })
  ->withExceptions(function (Exceptions $exceptions) {
  })->create();

$app->singleton(
  Illuminate\Contracts\Debug\ExceptionHandler::class,
  App\Exceptions\Handler::class
);

return $app;
```

下記を追記・変更することで上書きが可能となるっぽい
>$app->singleton(
  Illuminate\Contracts\Debug\ExceptionHandler::class,
  App\Exceptions\Handler::class
);

## まとめ
新しくプロジェクトを導入したところ、最小構成で入れてしまったぽいので時々設定が必要になりそうであるが、気合を入れて頑張りたいと思う
Pythonで新しいデータ型を作成する

## データ型の設計図：クラスの作成
多面体のサイコロを3回振って、数字の大きい方が勝ちという設定のゲームを作るよ。面の数はユーザーに選択してもらう設計にするよ。

まずはサイコロのデータ型を作成するよ。
### クラスの作成
新しいデータ型を作成するには、`class`を作っていけばいいよ。新しく作成するデータ型の名前は大文字で始める習慣があるよ。
```python
class Dice: 
```
### データ属性の追加
データ属性を追加したい場合は、このようにインデントを下げて記載するよ。
```python
class Dice:
    face_num = 8
```

### メソッドの作成
次にメソッドを書いていくよ。
関数の最初は`def`を付けて、`関数名（引数）`最後に`:`を付けてあとは処理をインデントを下げて書くよ。例えば`func`という関数名で、引数`arg1`,`arg2`なら、下のように書くよ。

```python
def func(arg1, arg2):
    # 処理１
    # 処理２
```
メソッドは常に引数を1つ以上持たないといけないので、引数が不要なメソッドでも慣習的に`self`と書くよ。
```python
# 引数が不要なメソッドfunc
def func(self):
    # 処理
```
今回は、8面のサイコロのクラスを作って、1~8の数字をランダムで取得して、3回分の値を返すメソッドを作成するよ。初期化メソッドを変更したい場合は、`__init__`というメソッドで書くよ。特に変更しないなら、書かなくてもいいよ。
今回は、ユーザーが面の数を`4,6,8,12,20`から選択してもらうようにするよ。プレイヤーが選択した面の数を`val`という引数で受け取って、`face_num`というデータ属性にセットするよ。もし、指定でない数字を入力した場合は、エラーになるようにするよ。
```python
# 整数をランダムに返すモジュールをインポート
import random

class Dice:
    # 初期化メソッド
    # valが不正な値の場合は終了し、正しい値の場合は面の数を設定する
    def __init__(self, val):
        if val not in [4, 6, 8, 12, 20]: 
            print(f'{val}は不正な値です。指定の数字で入力してください。')
            exit()
        self.face_num = val


    # サイコロを3回振って合計値を返すメソッド
    def shoot(self):
        result = list()
        for i in range(3):
           result.append(random.randint(1, self.face_num))

        return result[0] + result[1] + result[2]
```
これでDiceクラスの設計は完了だよ。
このクラスを`dice.py`として保存してね。

## サイコロゲームを作る
ここからは、先ほど作成したDiceクラスを利用して、ゲームを行うよ。
コンピュータ（CPU）とプレイヤー（player）で出た目の合計が大きい方が勝ちというゲームを作っていくよ。

```python
# 先ほど作成したdice.pyをインポート
import dice


print("ゲームを開始します。")
print("あなたの名前を入力して下さい。")
player_name = input()

print("サイコロの目の数は4, 6, 8, 12, 20のどれにしますか？")
num = input()

# 文字列を整数に変換し、失敗した場合は終了する
try:
    int_num = int (num)
except:
    print(f'"{num}"は不正な値です。算用数字で入力してください。')
    exit()

# Diceクラスの初期化メソッドの呼び出し
player_dice = dice.Dice(int_num)
cpu_dice = dice.Dice(int_num)

# Diceクラスのメソッドshoot()の呼び出し
player_dice_sum = player_dice.shoot()
cpu_dice_sum = cpu_dice.shoot()

# 勝敗の判定
print(f'CPU: {cpu_dice_sum} / {player_name}: {player_dice_sum}')
if player_dice_sum > cpu_dice_sum:
    print(f'{player_name}の勝ちです。')
elif player_dice_sum < cpu_dice_sum:
    print(f'{player_name}の負けです。')
else:
    print("引き分けです。")
```

これで、簡単なサイコロゲームを作成できたよ。
まだそんなレビューをしているの？AI時代を生き抜くコードレビュー

## え？まだそんなコードレビューしているの？時間の無駄

AIが割と一般化した昨今、本当にエンジニアの生産性が一気に何倍にもスピードアップしているのを目の当たりにする昨今です。まさに鉄砲伝来とか黒船襲来というべきか、AIを使った開発が出来ないと、一方的にやられてしまう、そんな時代が到来しています。

その1つがコードレビュー。AIにコードを見てもらうと、かなり良い感じに指摘してくれます。AIにレビューをさせることで

- 爆速でレビューしてくれて
- 他人の作業を待つこと無く
- 綺麗なコードにすることが出来る

ようになっています。

逆に**AIレベルが30秒で出来るレベルのコードレビューしかしてこなかった貴方、業界での存在価値が消えかかっています**。そこで、今回はAI時代を生き抜くコードレビューは一体何かというのを、私なりに考えてみました。

## AI時代のコードレビュー

### 基本的な考え方
今回はざっくりわかりやすさの為に機械的と抽象的（概念的）の軸で考えて見ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/bc62c9dc-4792-2aa1-4c96-5071b06bec9e.png)

現在、より機械的な物から自動化されていっています。ここ10年くらいで静的コード解析ツール(Rubyだとrubocop、JavascriptだとESLintなど)が一気に普及しました。そして、ここ1年程度の大規模言語モデルを用いたAIにより、自動化の幅が広がって来ています。

### (2024年現在)AIが得意なこと

1つのファイルだけを見て、可読性や保守性などの書き方、命名規則、負荷への懸念、DRY化などの機械的な箇所はAIがかなり指摘してくれるようになってきています。完璧とはいかないまでも、時間対効果を考えると物凄い高度なサジェストをしてくれます。

### (2024年現在)AIが苦手なこと=人がやるべきこと

大規模プロダクトの全てのファイルを見て、それを解析して、機能要件やデータの構造や複数ファイルに跨る情報を理解し、その上で最適なコードをサジェストする…なんてのは今現在ではまだまだ出来ません。故に抽象度の高い提案はAIには不向きで、人間の目でしっかり見る必要があります。

ミドルやシニア層は今まで細かなレビューにかけていた時間を、機能理解や今後のプロダクトの未来を考えた戦略的な部分にフォーカスして思考を巡らせる事で、よりクールで将来性のあるプロダクトが出来ることでしょう。

逆に、綺麗なコードが手早くかける、そのためのお作法を知っている、というのがエンジニアの武器としては最早弱くなりつつある様に感じます。それこそ、それ専門に研究し、最先端で言語の開発の仕様に携わっているレベルでないと、コードの記述に関する専門性は無いに等しいレベルかもしれません。

## 具体的なAIの活用方法

### 先ずは考え方のレビュー

実装の前に、「こういう方針で実装していこうと思う」というのを、担当者と一緒に言語化して、それをレビュー（チームで意見だし）するようにしています。その結果、よりカチッと各種構成や実装のイメージ出来るようになり、作り直しの手間が減ります。ここは、AIに使ったほうが良いライブラリとかのサジェストをもらったりもすることもあるが、基本的には人と人との会話を重視しています。

### AIを使ったコードレビュー

他の方が記事にされていたりするので、参考にしてみてください。まだまだ黎明期なので、これといった回答があるわけではありませんので、また、機会があれば私も記事にしてみたいと思います。

https://qiita.com/c_hammerhead/items/1d67b523d2ee93aa4f45

https://qiita.com/oc-arimura/items/de164487fc60fe981bb2

### AIレビューの組織的な活用

現在、我々チームでは全員にGithubCopilotを配っています。また、GithubCopilotのやり取りをプルリクのコメントで書くようにしています。その事で、レビューの二度手間が省けますし、他にも「こういう観点でもAIに聞いてみよう」など、レビューしています。チーム全体で、AI先生の活用方法を溜め、より効果的なレビュー方法を確立するのも、今の時代ならではでしょう。


## 実際にAIレビューをしてみた感想

レビュー作業は時間を要する割に、機能要件から技術的な指摘まで幅広く行う必要があったので、結構な手間でした。AIを通すことで、体感レビューの作業が半分程度になっていると言っても過言ではありません。また、AIのレビューは使っている限り結構良い線を行っています。レビューの見る範囲が小さくなり、より機能や先を見据えたレビューに専念出来るようになりました。今後とも、チームで知見をためて、爆速度でプロダクトの機能開発を出来るような組織にしていくのが、今のミドルマネージャーに求められる1つの仕事なのかな、と思っている昨今でした。
view/devise/passwords/edit.html.erbとview/users/edit.html.erbの違い

# ①app/view/devise/passwords/edit.html.erb
## 目的
このファイルは、パスワードをリセットするためのビューを提供するためのもの。
ユーザーが「パスワードを忘れた」場合に、メールで送信されたリンクを使って新しいパスワードを設定するためのフォームとなる。

## 主な機能
・パスワードリセットトークンの入力
・新しいパスワードの入力
・パスワードの確認
・フォームの例

## 実装例
```ruby:app/view/devise/passwords/edit.html.erb

<h2>Change your password</h2>

<%= form_with(model: resource, url: password_path(resource_name), method: :put, local: true) do |f| %>
  <%= devise_error_messages! %>

  <div class="field">
    <%= f.label :password, "New password" %>
    <%= f.password_field :password, autocomplete: "off" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation, "Confirm new password" %>
    <%= f.password_field :password_confirmation, autocomplete: "off" %>
  </div>

  <div class="actions">
    <%= f.submit "Change my password" %>
  </div>
<% end %>
```

# ②app/views/users/edit.html.erb
## 目的
このファイルは、ユーザーが自分のプロフィール情報（例：ニックネーム、メールアドレス、パスワードなど）を編集するためのビューを提供します。

## 主な機能
・ニックネームの編集
・メールアドレスの編集
・パスワードの変更
・パスワード確認
・現在のパスワードの入力（変更確認用）
・フォームの例

## 実装例
```ruby:app/views/users/edit.html.erb
<h2>ユーザー情報編集</h2>

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
        <% @user.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :nickname %>
    <%= f.text_field :nickname %>
  </div>

  <div class="field">
    <%= f.label :email %>
    <%= f.email_field :email %>
  </div>

  <div class="field">
    <%= f.label :password %> <i>(変更しない場合は空欄のまま)</i>
    <%= f.password_field :password, autocomplete: "off" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %>
    <%= f.password_field :password_confirmation, autocomplete: "off" %>
  </div>

  <div class="field">
    <%= f.label :current_password %> <i>(確認のため現在のパスワードを入力してください)</i>
    <%= f.password_field :current_password, autocomplete: "off" %>
  </div>

  <div class="actions">
    <%= f.submit "更新" %>
  </div>
<% end %>

```

# 違いのまとめ
## 目的
devise/passwords/edit.html.erbはパスワードリセット用、users/edit.html.erbはユーザー情報の編集用です。
## 機能
devise/passwords/edit.html.erbは新しいパスワードの設定、users/edit.html.erbはユーザーのプロファイル全般の編集を行います。
## フォームの内容
devise/passwords/edit.html.erbはパスワードリセットに必要なフィールドのみを持ちますが、users/edit.html.erbはニックネーム、メールアドレス、パスワード、現在のパスワードなどのフィールドを持ちます。
それぞれのファイルは、、その目的に応じたフォームを提供し、ユーザーが必要な操作を行えるように設計されています。
VScode／MarkdownPreviewEnhanced／PuppeteerのPDF出力で用紙設定を「ちゃんと」行う

## 結論

Format指定は **A4** ではなく **a4** と書きます
(大文字ではありません小文字です)

以下に例示します

```
---
puppeteer:
  format: "a4"              # 用紙フォーマット指定 a0 ～ a6, letter, legal...
  landscape: false          # 用紙方向
  # printBackground: false  # 背景画像
  # margin:                 # マージン
  #   top: 10mm
  #   bottom: 10mm
  #   left: 10mm
  #   right: 10mm
---
```

## 経緯
と、これだけで終わってもかまわんのですが、一応
MPEのサイズ指定は検索をするといくらでも出てきます
本家にも例示されています

```
---
puppeteer:
  landscape: true
  format: "A4"
  timeout: 3000 # <= Special config, which means waitFor 3000 ms
---
```

しかし、この通り書いても出力されるpdfの用紙サイズは**US レター**のままです

大抵のアプリではどうもプリンタの用紙設定に寄せてくれるようでエラーは出ないのですが、私が普段使用してる`PDF-XChange Editor` は `US レター`のまま出力してくれますので印刷のたびに「用紙サイズが違います」とエラーが出てしまいます
その度にプリンタまで行ってエラー解除、印刷再開するのが大変面倒なので精神的にも、物理的にも重い腰を上げて調べることにしました

世の中のWEBの記事のほとんどは**きちんと検証されていない**様子で、本家と同様の記述となっております

で、実際のオプションを指定しているgithubの`puppeteer/src/common/PDFOptions.ts`を調べてみました

* [puppeteer/src/common/PDFOptions.ts](https://github.com/puppeteer/puppeteer/blob/9fdf2ba280fd59e4a41cfd7f7e1c3ef963ef3737/src/common/PDFOptions.ts)

その中で用紙サイズのオプション部分が以下になります

```
export type PaperFormat =
  | 'letter'
  | 'legal'
  | 'tabloid'
  | 'ledger'
  | 'a0'
  | 'a1'
  | 'a2'
  | 'a3'
  | 'a4'
  | 'a5'
  | 'a6';
```

**小文字**だよ。orz

まぁ、本家から間違えてるし、大概のアプリは用紙サイズの差異を吸収してくれるしで困ってない人の方が多いのでしょうが、記事を書くならもう少し検証してほしいなぁ、と思った本日のTipsでした。

お粗末！
「時間ドロボウを撃退せよ！効率的な時間管理の秘訣」

![title](https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/1000007604.jpg)


# 「時間ドロボウを撃退せよ！効率的な時間管理の秘訣」

## 時間ドロボウによくある状況

自分のタイムマネージメントが出来ないのは構わない｡(他人に影響を与えないのなら)

定例の打ち合わせ時間のみならず、臨時の打ち合わせもそうだが他人の時間を使っている以上、手短に要点と要求を話し、即時に返答出来ない質問であれば持ち帰り、後で返答すればよいのに…

毎回、同じことで
```
「この課題、何だっけ？」
「このタスク、何で終わらないんだっけ」
「確認なんだけど…」
「一応、聞くけど…」…｡
```

いい加減、覚えてくれ！そして、他の人の時間を奪わないでくれ！

その人のために時間を奪われている状況を察してくれ！そして、その時間はコストに反映されていることを認識してくれ！

## 時間ドロボウとはどんな人？

* 遅刻を平気でする人。
* 躊躇なく予定をドタキャンする人。
* 多くの人を集めた場(会議など)で無駄な会話を始める人。
* 生産性のない会話をしたがる人。

## 時間ドロボウとはどう付き合えばいいか？

これらの人種は、相手の時間を奪っているということに気付いてません。
それどころか、指摘しても逆ギレされるだけです。

俗に時間ドロボウと呼ばれる人と付き合っていては、自分の時間をただただ奪われるばかり。

もちろん、時間にルーズに見えてもよっぽど効率的に仕事ができる人はさて置いて、時間を有効活用するなら、時間ドロボウとの付き合いは避けるべきです。

どんな人でも時間は、平等に1日24時間与えられています。
これは言い換えれば、どんなに優秀でも24時間しか使えないということです。

だからこそ時間ドロボウを避け、優先順位をつけて話す相手を選ぶべきなのです。


## 『アウェー率』を上げよう！

 サッカーの試合と同じように、仕事にも『ホーム』と『アウェー』がある。

慣れ親しんだ『ホーム』では、お互いに知った仲間ばかりとなり、ついつい話が脱線し、どうでもいい会話になってしまいがちです。

年をとり、キャリアを重ねるにつれ、新しいことに挑戦する『アウェー率』が減ってきてしまう。

新しいことに挑戦すると人は、脳が活性化し集中力が増すものです。

## 陥ってはいけない時間の使い方

仕事は、凄い出来る人なのに常に忙しい人って、結構いますよね？
意外とそんな人の方が突然、病気になったりして…

時間の考え方として、『愛するということ新訳版』という本の引用ですが、

```
計画的に生きることは、現在という
時間の質を問うことを禁止する。
だからこそ時間を貯蓄するといった
発想が成り立つのである。
現在という時間を犠牲にして
将来のためにためておく。
```

確かに時間を貯蓄するという発想は、今を否定してますよね！

```
集中するとは、今ここで、
全身で現在を生きることである。
今何かをやっているあいだは、
次にやることは考えていない。
```

確かに、集中している時って今しか考えてないですよね。

## では、時間をどう使うか？

私は、自分のやりたいことを今、一生懸命にやることが時間のいい使い方だと思ってます。

今一度、今やっている仕事が本当にやりたいことなのか、時より考える必要があるのではないでしょうか？
親の教え、、知ったかぶりについて

## はじめに
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/9efe64cd-f42e-d33b-9d0d-78219df6d284.png">

お散歩してるとき、ふと子供の時のことを思い出しました。
皆さんは親からの教え、よく言われていたこと、注意されていたことなどありますか？
私はあります。そのうちの一つを今回紹介したいと思います。大人の今にも通ずる話なので。大切なことなのではないかと感じたので。

## 知ったかぶり
「知ったかぶりはだめだよ」
私はそう言われていました。おそらく小学生の頃。

![通学小学生.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/2476c948-7fe8-cf5a-38da-ac0fe6983043.jpeg)

実際小学生の時に私自身が知ったかぶりをしたせいでよくない思い出があります。

アニメ好きの友人Aが「○○知ってる？」というのに対し、私は全く知らないのに「しっている」といってしまいました。
そして無理やり話しを合わせようと、なんとなくの回答をし続けていたら、その友人Aは不信そうな表情をしてしまいました。
その後、その友人Aはいつの間にか友人ではなくなってしまいました。

### なぜ知ったかぶりをしたのか
今だから当時の私を振り返ることができます
- 共通の話題を持ちたかったから
- ほかにアニメの話をする人がいなくて、アニメの話をしてくれる人がいてうれしかったから
- 他人に認められたい
- 自分だけ知らないと仲間外れにされるのではないかという不安

## 似ている現象
- 自己呈示（セルフ・プレゼンテーション）
他人に対して自分を良く見せたいという願望から、自分の能力や知識を実際よりも高く見せようとする行動

- 虚勢を張る
自信がない場合でも、自分が強くて賢いと見せるために強がる行動。特にプレッシャーやストレスの多い状況で見られることがある

- インポスター症候群（Impostor Syndrome）
実際には高い能力や成果を持っているにもかかわらず、自分は詐欺師のように感じ、他人が自分を過大評価していると思い込む現象。これに対抗するために、さらに知識を誇示しようとすることがある。

- プライドの保護
自分の知識や能力に対するプライドを保護するために、知らないことを知らないと認めるのが難しいことがある

- 集団圧力（Peer Pressure）
周囲の人々に合わせるために、知っているふりをすることがある。特に、友人や同僚が多くの知識を持っている場合、自分も同じように見られたいと感じることがある

- カラーバス効果（Dunning-Kruger Effect）
自分の知識や能力を過大評価し、本当の実力以上に自分を有能だと信じている現象。この効果により、自分が知らないことを知っているふりをすることがある


## 大人でもいえるよね？
人々が他人にどう見られるかを気にする心理的な動機や、自分の自己評価を保護するための行動…。大人の方でも見られる行動ではないかと思っています。

自分を守ることは確かに大切ですが、知ったかぶり=嘘？！

その時は確かにやり過ごせるかもしれませんが、最後には必ずぼろがでる…。
悲しい、つらいはなしですが、世の中そんなに甘くない。

**プログラミング学習や面接でもいえる事**
「少しくらいいいでしょ」があだとなる

自分を誇張しすぎない
誠実に答える
自分の言葉でしっかり話す

そういうエンジニアになりたい・・なる
![purogurama-.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/d40502c8-a894-f5c2-ecac-e52efb20f075.jpeg)
ChatGPTとコンテンツ制作の未来

人工知能（AI）の進歩により、コンテンツ制作の状況は急速に進化している。その最前線にあるのが、OpenAIが開発した言語モデル「ChatGPT」だ。ChatGPTは、クリエイター、企業、消費者に新たな機会と課題を提供し、コンテンツ制作のあり方を変革する可能性を秘めています。

ChatGPTによるコンテンツ制作の強化

ChatGPTのようなAIをコンテンツ制作に組み込む主なメリットの1つは、高品質なテキストを迅速かつ効率的に生成できることです。ブログ記事であれ、記事であれ、ソーシャルメディアの更新であれ、マーケティングコピーであれ、ChatGPTは一貫性があり、文脈に即したコンテンツの作成を支援することができます。この機能により、コンテンツ制作に必要な時間と労力を大幅に削減し、クリエイターは戦略や創造性など、他の側面に集中することができます。

コンテンツ制作プロセスにおいてChatGPTの活用を検討している方にとって、プラットフォームへのアクセスは簡単です。まずは、chatgpt ログイン (https://chatgpt-japanese.jp/) をご覧ください。

パーソナライゼーションとオーディエンスのエンゲージメント

パーソナライゼーションは、コンテンツ制作における重要なトレンドです。ChatGPTは、ユーザーデータを分析し、特定の視聴者層に響くパーソナライズされたコンテンツを生成することで、この分野を得意としています。例えば、ユーザー行動、デモグラフィック、過去のインタラクションに基づいてターゲットマーケティングメッセージを作成し、エンゲージメントとコンバージョン率を向上させることができます。

さらに、ChatGPTは、チャットの応答や顧客サービスとの対話など、リアルタイムのコンテンツ作成を支援することができます。即座に、関連性のある、パーソナライズされた応答を提供することで、ユーザーエクスペリエンスを向上させ、ブランドとオーディエンスとのより深いつながりを育みます。

ライターズ・ブロックとアイデアの克服

ライターズブロックはコンテンツクリエイターにとって共通の課題ですが、ChatGPTはアイデアとインスピレーションを生み出すことで解決策を提供します。いくつかのキーワードやトピックを入力することで、クリエイターは潜在的なアングル、見出し、アウトラインのリストを受け取ることができ、ライティングプロセスを開始することができます。この機能はブレインストーミングに特に有効で、より多様で革新的なコンテンツを生み出すことができます。

さらに、ChatGPTの複数の原稿やコンテンツのバリエーションを生成する機能は、クリエイターが異なるスタイルやトーンを試すことを可能にします。この柔軟性は、より創造性を高め、最終的なコンテンツが望ましいブランドボイスやメッセージングに沿ったものであることを保証するのに役立ちます。

倫理的配慮と品質管理

ChatGPTは多くの利点を提供する一方で、重要な倫理的考慮事項も提起している。AIが生成したコンテンツが誤った情報を拡散したり、偏ったシナリオを作成したりする可能性は重大な懸念事項です。コンテンツ制作者や企業は、ChatGPTによって生成されたコンテンツの正確性と完全性を確保するために、強固な品質管理対策を実施する必要があります。

さらに、コンテンツ制作におけるAIの使用に関する透明性は極めて重要です。視聴者は、コンテンツがAIによって生成または支援された場合、信頼と信用を維持するために通知されるべきである。このような透明性は、コンテンツ制作におけるAIの役割に対する幅広い理解と受容を促進することもできる。

コンテンツ制作の未来

ChatGPTや同様のAIテクノロジーを活用したコンテンツ制作の未来は有望だ。AIが進化を続けるにつれ、人間の言語、口調、文脈を理解し、模倣することにますます長けていくだろう。この進歩により、人間が作成したテキストに近い、より洗練されたニュアンスのコンテンツが生まれるだろう。

さらに、コンテンツ制作におけるAIの統合は、人間とAIのコラボレーションを促進するように設計されたツールやプラットフォームによって、よりシームレスになっていくだろう。この相乗効果により、コンテンツ制作者は人間の創造性とAIの効率性の両方の強みを活用できるようになり、より短時間でより質の高いコンテンツが制作されるようになるだろう。

結論として、ChatGPTはコンテンツ制作の現場を一変させ、効率性の向上、パーソナライズ化、アイデア発想のサポートなど多くのメリットを提供する。しかし、倫理的な意味合いや品質管理について慎重に検討する必要もある。これらの進歩を責任を持って受け入れることで、コンテンツ制作者や企業は新たな可能性を引き出し、視聴者とのエンゲージメントを高めることができる。
一つのビットが -1,0,1の値を持つ3 state 整数について

一つのビットが-1,0,1を取る3 state整数について。

表現の仕方は３ビットで十分なので。
nnnのnは1,0,-1の3つの値を取り、
2＾2の位、2^1の位、2^0の位で、
```
  1  1  1 =  7
  1  1  0 =  6
  1  0  1 =  5
  1  0  0 =  4
  0  1  1 =  3
  0  1  0 =  2
  0  0  1 =  1
  0  0  0 =  0
  0  0 -1 = -1
  0 -1  0 = -2
  0 -1 -1 = -3
 -1  0  0 = -4
 -1  0 -1 = -5
 -1 -1  0 = -6
 -1 -1 -1 = -7
```
とする。
実は、2ビットで十分です。

僕は、出題されて、計算して、この表現の仕方で完全だと直観しましたが、後で聞いてみると、完全だそうです。
証明はどこかに転がってると思いますが、ネットにあるかどうか分かりません。
一つの数の表現の仕方のビットの並びの状態がユニークではないため、証明は少し難しいような気がします。

test program
```tr.py
#!/usr/bin/python3
#
# 一つのビットが-1,0,1を持つtristate integer
#
def add(a,b):
    return a+b

def sub(a,b):
    return a-b

def printtri(a):
    s=""
    if a<0:
        a=-a
        while a:
            if a&1:
                s="-1 "+s
            else:
                s=" 0 "+s
            a=a//2
    else:
        while a:
            if a&1:
                s=" 1 "+s
            else:
                s=" 0 "+s
            a=a//2
    print(s)
    return

def main(a,b):
    printtri(a)
    printtri(b)
    print("add:",end='')
    printtri(add(a,b))
    return

if __name__=="__main__":
    a=int(input("Input integer number 1:"))
    b=int(input("Input integer number 2:"))
    main(a,b)
    exit(0)

```
【Python3】文字列収集 (paizaランク S 相当)をやってみた

https://paiza.jp/works/mondai/real_event/word_collection

以下に、【問題】に対応するPythonソースコードを作成し、解説を行います。

```python
# 入力の読み込み
import sys
input = sys.stdin.read

# 入力データを一括で読み込む
data = input().split()

# NとMを取得
N = int(data[0])
M = int(data[1])

# N個の文字列とその価格を格納するリスト
strings = []
prices = []

# N個の文字列と価格をリストに分割して格納
index = 2
for _ in range(N):
    strings.append(data[index])
    prices.append(int(data[index + 1]))
    index += 2

# M個のクエリを格納するリスト
queries = []
for _ in range(M):
    queries.append(data[index])
    index += 1

# クエリごとに合計金額を計算して出力
for query in queries:
    total_price = 0
    for i in range(N):
        # クエリ文字列が対象文字列の先頭に一致するかを確認
        if strings[i].startswith(query):
            total_price += prices[i]
    print(total_price)
```

### 解説

このプログラムは、与えられた文字列と価格のリストから、特定のクエリ文字列で始まる文字列の総価格を計算します。

1. **入力の読み込み**:
   - `sys.stdin.read` を使用して、すべての入力を一度に読み込みます。
   - `input().split()` で読み込んだデータを空白で分割し、リスト `data` に格納します。

2. **NとMの取得**:
   - `N` と `M` を `data` の最初の2つの要素から取得します。

3. **文字列と価格の格納**:
   - `strings` と `prices` というリストを作成し、`data` のインデックスを使って、文字列とその価格をそれぞれのリストに格納します。

4. **クエリの格納**:
   - `queries` というリストを作成し、`data` のインデックスを使って、クエリ文字列を格納します。

5. **クエリごとに合計金額を計算**:
   - 各クエリに対して、`strings` リストの各文字列がそのクエリ文字列で始まるかを確認します。
   - 一致する場合、その文字列の価格を合計金額に加算します。
   - クエリごとの合計金額を出力します。

### 実行例
以下は、入力例1の結果を示す実行例です：

```python
# 入力例1
6 5
bcac 3
abcd 14
abccjg 92
bcaddgie 2
abcd 6
cb 200
b
a
abcd
gagioheo
cb
```

出力結果は以下の通りです：

```
5
112
20
0
200
```

このプログラムは、各クエリに対して、対応する文字列の総価格を計算し、出力します。入力のサイズが最大10,000であるため、パフォーマンスを考慮してシンプルなループを使用しています。
Anacondaの仮想環境を作ったら速攻入れるべきパッケージ

# Anacondaって？
- Pythonなどのプログラミングをする環境と，よく使われるパッケージを一括で容易に用意できる道具です！
- 仮想環境を作成して，自分に必要なライブラリ，パッケージをインストールして使うことができます★ 便利！

- ．．．恥ずかしながら，今回自分の愛用していた仮想環境を壊してしまい，またイチから仮想環境を構築する羽目になりました．
- また，将来の後輩にも基本的なことなので，いつか役立つだろうと思い，それなら記事にしちゃおうと思い立ったわけです．
    - と言ってみますが，98%は自分の備忘録のため．．

# 対象になりそうな人
- ネットワーク分析をよくやる人
- 大学生，大学院生などで，よくデータを扱う研究室に配属された人
- 理系大学生
などなど．．
# まず必要だと思われるパッケージ
※ 持論です（異論は大いに認めます）
- pandas
- numpy
- scipy
- networkx
- matplotlib
- seaborn
    - matplotlibとセットで使うことが多いです．

# 私的な次点
## もしかしたら人によっては役立つかも？というやつ．
- igraph
    - networkxは全てPython上で完結する一方で，igraphはC言語に外部委託して計算するので，処理がかなり高速化できます．
    - 特に，大規模問題ではかなり変わります！
- gurobi
    - ライセンス取得も必要！
    - 線形の最適化問題（一部の非線形も）は任せておけ！な，さいつよソルバー．（私的）

# 補足
- MacユーザーはHomebrewという選択肢もあると思います．
    - パッケージ管理がし易いと思うので，そちらをメインに据えるのが良さそうです．
Google AppScriptを使ってスプレッドシートをWebサイトで見れるようにする

スプレッドシートをWebサイトで見れるようにしました。
こちらのサイトを参考にしているのでこちらも是非参考にしてください。

https://www2.kobe-u.ac.jp/~tnishida/programming/GAS-02.html

Code.jsのスクリプト
```
function doGet() {
  // (2) Spreadsheet からデータを読み込む
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var templateSheet = spreadsheet.getSheetByName("シートの名前"); //シートの名前が一致するものを取得

    // セルの値を取得
  var range = templateSheet.getRange('A1'); //セルの座標を指定
  var value = range.getValue();


  // (3) テンプレートを使ってHTML文書を作って return
  let template = HtmlService.createTemplateFromFile("list");
  template.link = value; // こうしておくとテンプレートの方で link という変数に値が入った状態で使える
  return template.evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);; //gasは標準で組み込みが出来ないようになっているのでそれを修正
}

```

list.html内のすプリプと
```
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
     <h1><?= link ?></h1>

  </body>
</html>
```

ものすごく単純だが、これをするとデプロイ後、A1に書かれた内容を取得して表示することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2971002/09e38619-c983-9f22-2a32-92c01b1e9b16.png)

デプロイは右上の「Deploy」を押し、New deploymentからすることができる。
【SwiftUI】TextField をテンプレート化しておく

毎回、試行錯誤するのはもういやだ。


![sc 2024-07-23 at 18.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/78edc5ad-ecf4-f3c9-eff1-5b9eadfcdccd.png)


```swift
ZStack(alignment: .trailing) {
  TextField("+ clear button", text: $text)
    .textFieldStyle(.roundedBorder)
    .background()
    .overlay {
      RoundedRectangle(cornerRadius: 6)
        .stroke(.secondary, lineWidth: 0.5)
    }

    Button {
      text = ""
    } label: {
      Image(systemName: "xmark.circle.fill")
        .foregroundStyle(.secondary)
    }
    .buttonStyle(.plain)
    .padding(.trailing, 6)
    .opacity(text.isEmpty ? 0 : 1)
    .animation(.default, value: text.isEmpty)
}
```

![sc 2024-07-23 at 18.33.34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/949bdcd6-02fd-8021-33b0-d6eb00ac96fa.gif)

# 🧑🏻‍💻 参考

https://x.com/maochanz/status/1815680503363846643
【IntelliJ】データベースツールウィンドウでテーブルやカラムのコメントを表示したい

# はじめに
データベースにテーブルを追加するときや、カラムを追加する時にコメントを書くようにしていて、普段使っている IntelliJ のデータベースツールウィンドウでそのコメントが見たかったので調べて設定してみた。

# やりかた
1. IntelliJ で、データベースツールウィンドウを開き、上部にある目のマークを押す
1. Node Details 内の Comments にチェックを入れる
1. 以上！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/3c2f7057-cefc-1988-815a-febfe5b26366.png)

設定するとこんな感じでテーブルやカラムの横にコメントが表示される
(ちょっと隠すため、画像編集してます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/f5a24f0c-70b7-e076-0a8c-71485a2264cc.png)


案外簡単ですぐできてしまいました (笑)
他にもポチポチできそうなので、いじってみると面白いかも？

# 参考

https://pleiades.io/help/idea/database-tool-window.html
このスクリプトを実行することで、現在のディレクトリの空き容量が500MB未満の場合にエラーメッセージが表示されます。

```
#!/bin/bash

# Get available disk space in the current directory
available_space=$(df -h . | awk 'NR==2 {print $4}')

# Convert available space to MB
available_space_mb=$(echo $available_space | grep -o '[0-9]\+')

# Check if the unit is GB, MB, or KB
if [[ $available_space == *G ]]; then
    available_space_mb=$(echo "$available_space_mb * 1024" | bc)
elif [[ $available_space == *K ]]; then
    available_space_mb=$(echo "$available_space_mb / 1024" | bc)
fi

# Check if available space is less than 500 MB
if (( $(echo "$available_space_mb < 500" | bc -l) )); then
    echo "Error: Not enough space. Available space is ${available_space}."
    exit 1
else
    echo "Sufficient space available: ${available_space}."
fi

スクリプトの説明
空き容量の取得:

bash
コードをコピーする
available_space=$(df -h . | awk 'NR==2 {print $4}')
df -h . コマンドを使用して、現在のディレクトリの空き容量を取得し、awkを使用してその値を抽出します。

空き容量の数値部分の抽出:

bash
コードをコピーする
available_space_mb=$(echo $available_space | grep -o '[0-9]\+')
grepを使用して空き容量の数値部分を抽出します。

単位の確認と変換:

空き容量がGB単位の場合、MBに変換します。
空き容量がKB単位の場合、MBに変換します。
空き容量のチェック:

bash
コードをコピーする
if (( $(echo "$available_space_mb < 500" | bc -l) )); then
    echo "Error: Not enough space. Available space is ${available_space}."
    exit 1
else
    echo "Sufficient space available: ${available_space}."
fi
bcコマンドを使用して空き容量が500MB未満かどうかをチェックし、条件に応じてエラーメッセージを表示します。

スクリプトの実行方法
スクリプトをファイル（例えば check_space.sh）に保存します。
スクリプトに実行権限を与えます。
bash
コードをコピーする
chmod +x check_space.sh
スクリプトを実行します。
bash
コードをコピーする
./check_space.sh
このスクリプトを実行することで、現在のディレクトリの空き容量が500MB未満の場合にエラーメッセージが表示されます。
GORM UpdateColumnsはUpdatedAtを更新しない

## メモ
gormのUpdateColumnsはUpdatedAtを更新しない。
その仕組みを実際のコードとともに整理してみた。

その他のUpdateメソッドの挙動はついでに以下に整理した。
https://qiita.com/yukiyoshimura/items/a6fa5ac9ff1bd8d03be5

## 背景
gormの `UpdateColumns`を使っていたところUpdatedAtが更新されてないことに気づいた。
以下にHookメソッドをスキップするときに使ってねみたいなのが書いてある。Hookメソッド内でUpdatedAtを更新しているのだろうか・・・ちょっとはっきりしたものは見つけられないが、フックをスキップしているところを追ってみる。
https://gorm.io/docs/update.html#Without-Hooks-x2F-Time-Tracking


### 実際にコードをみてみる
UpdateColumnsの処理をみる。
`tx.Statement.SkipHooks = true` でskipセットしている。
https://github.com/go-gorm/gorm/blob/master/finisher_api.go#L421
```go:finisher_api.go
func (db *DB) UpdateColumns(values interface{}) (tx *DB) {
	tx = db.getInstance()
	tx.Statement.Dest = values
	tx.Statement.SkipHooks = true
	return tx.callbacks.Update().Execute(tx)
}
```

UpdateColumnsから呼ばれる。Updateの処理を見る。
https://github.com/go-gorm/gorm/blob/master/callbacks/update.go#L56
```go:update.go
// Update update hook
func Update(config *Config) func(db *gorm.DB) {
	supportReturning := utils.Contains(config.UpdateClauses, "RETURNING")
//
//
// ここの処理は今回は特に気にする必要はない。Hookはこの関数の実行後に呼ばれる
```

最後にhookで呼ばれる処理を見る
https://github.com/go-gorm/gorm/blob/master/callbacks/update.go#L108
`!db.Statement.SkipHooks` あった！これでスキップされることを確認できた。

```go:update.go
// AfterUpdate after update hooks
func AfterUpdate(db *gorm.DB) {
	if db.Error == nil && db.Statement.Schema != nil && !db.Statement.SkipHooks && (db.Statement.Schema.AfterSave || db.Statement.Schema.AfterUpdate) {
		callMethod(db, func(value interface{}, tx *gorm.DB) (called bool) {

  ```

  以上
【応用情報技術者試験】「チャネル」とつくワードのまとめ

# 概要
応用情報技術者試験にでてくる「チェネル」とつくワードを纏めました。
チャネルは「経路」「手段」という意味です。

# 目次
- [オムニチャネル](#オムニチャネル)
- [サイドチャネル攻撃](#サイドチャネル攻撃)
- [チャネル制御方式](#チャネル制御方式)
- [マーケティングチャネル](#マーケティングチャネル)

## オムニチャネル
企業と顧客の販売経路を統合して、総合的に顧客へアプローチする方法。
「マルチチャネル」という言葉があり、これは「オムニチャネル」の手前の段階のイメージ。例えば実店舗の他にECサイトでも商品を購入できるようにするといった状態を指す。他にも、SNSやテレビのCM等、色々なチャネルから消費者にアプローチする。ただこの段階では、それぞれのチャネルは独立していて、統合や連携はされていない。
「オムニチャネル」は「マルチチャネル」の状態から、例えば店舗で得たポイントをECサイトでも利用できたり、スマホアプリのクーポンを店舗で使用出来たりと、色々なチャネルを結び付けることを目的としている。
「オムニチャネル戦略」は小売業を中心に大きく広がっている販売戦略のひとつ。

## サイドチェネル攻撃
暗号化された情報を解読する手法のひとつ。
ICカードや半導体等から周囲に漏れている電磁波や処理によって異なる消費電力の差、発生する熱や音を観測して内部の情報を得る。
非破壊型の物理的攻撃のことを総称してサイドチャネル攻撃と呼ぶ。

## チャネル制御方式
入出力装置と主記憶装置の間のデータ転送を行う方式。
チャネルといわれる装置を使用する。
DMA制御方式よりも複雑な処理ができる。また、チャネルプログラムを記述することもでき、プログラム内で条件分岐等も行える。

## マーケティングチャネル
製品が生産者から消費者に届くまでに関わる全ての経路や組織・媒体のことを指す。
近年は店舗に赴かなくてもECサイトで商品を購入したり、ネットの情報で競合する商品を比較して店舗に足を運んだりと、購入までのプロセスが多様化している。そのため、生産者はこれまでの販売方法にとらわれず、どのようにして効率よく消費者に商品を届けるかを検討する「マーケティングチャネル戦略」が重要になっている。

***
**[記載した応用情報技術者試験の記事まとめ](https://qiita.com/MetroOsamu/items/550001240d76e24f505f)**
reStructuredTextでネストされた箇条書きを書く

# 環境
* Python 3.12.1
    * sphinx 7.4.7
    * pydata-sphinx-theme 0.15.4


# はじめに
MarkDownでは、ネストされた箇条書きは以下のように書けます。

```
* A
* B
* C
    * X
    * Y
* D
```

下図は、Visual Studio CodeのMarkdown拡張で表示した結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/f6d9c03d-0272-55d6-c90b-be92b261ad46.png)


# reStructuredTextの場合

## MarkDownと同じ内容の場合

上記のテキストをreStructuredTextとしてsphinxでビルドしたら、以下のHTMLが出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/8e021eb1-a2ea-4781-0340-11a1f9af5118.png)

ネストされていますが、HTMLの`dt`タグによって`C`だけ太字になっていました。


```html
<ul class="simple">
<li><p>A</p></li>
<li><p>B</p></li>
<li><dl class="simple">
<dt>C</dt><dd><ul>
<li><p>X</p></li>
<li><p>Y</p></li>
</ul>
</dd>
</dl>
</li>
<li><p>D</p></li>
</ul>
```

reStructuredTextのDefinition listとしてみなされているようです。

https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#definition-lists


### ネストされている部分に空行を入れる

公式ドキュメントには、

>ネストされたリストも使用できますが、親のリストとは空白行で区切る必要があります:

とあるので、空行を入れてみました。

https://www.sphinx-doc.org/ja/master/usage/restructuredtext/basics.html#lists-and-quote-like-blocks



```
* A
* B
* C

    * X
    * Y

* D
```

`X`,`Y`はネストされずに、引用された形式になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/8a29f895-f858-6e40-c9d9-f94940e4fee0.png)


```html
<ul>
<li><p>A</p></li>
<li><p>B</p></li>
<li><p>C</p>
<blockquote>
<div><ul class="simple">
<li><p>X</p></li>
<li><p>Y</p></li>
</ul>
</div></blockquote>
</li>
<li><p>D</p></li>
</ul>
```


Sphinxのドキュメントには、

>前の段落より１段インデントが深い段落は引用になります。:

と書いてあったので、インデントが「引用」とみなされたようです。

https://planset-study-sphinx.readthedocs.io/ja/latest/04.html#id7


### インデントを空白4文字から空白2文字にする
空白を入れずに、インデントを空白4文字から空白2文字にしました。

```
* A
* B
* C
  * X
  * Y
* D
```

`X`と`Y`は箇条書きとみなされませんでした。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/08ed041e-f064-7f07-d7d7-93d89948ad5e.png)



```html
<ul class="simple">
<li><p>A</p></li>
<li><p>B</p></li>
<li><p>C
* X
* Y</p></li>
<li><p>D</p></li>
</ul>
```


### 空行を入れて、インデントを空白4文字から空白2文字にする

```
* A
* B
* C

  * X
  * Y

* D
```

期待通り、`X`と`Y`はネストされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/8a59ae5a-9195-58a6-5c7b-a0332d683e0c.png)


```html
<ul class="simple">
<li><p>A</p></li>
<li><p>B</p></li>
<li><p>C</p>
<ul>
<li><p>X</p></li>
<li><p>Y</p></li>
</ul>
</li>
<li><p>D</p></li>
</ul>
```


# まとめ
reStructuredTextでネストされた箇条書きを書く場合は、ネストされている箇条書きの上下に空行を入れて、インデントは空白2文字にします。