OmniAICreator/Qiita-1.07M huggingface dataset:
【プログラミング言語】プログラミングパラダイムを理解する

# プログラミングパラダイムとは
「プログラミングパラダイム」とは、プログラミングの考え方，規範，記述方法の枠組みのこと。以下にその枠組みの簡単な親子関係を記載する。また、図の下の説明文の各文末には、それぞれの特徴を持つ言語で0-10までの加算結果を出力するプログラムを参考に載せている。

![programmingparadigm](https://github.com/user-attachments/assets/d830bc3f-7c5b-4688-80b4-3ef8fd9f1c21)

## 命令型言語
#### 手続き型言語
特徴：小さな関数の塊を組み合わせて記述される。プログラムは文の並びであり、逐次的に実行していく。目で追って理解しやすいシンプルなコードが特徴的だが、反対に複雑な構造を持つ大規模なWebサービスの開発等には不向き。しかし、電卓アプリなどで必要となる計算処理やデータ処理能力には優れている。

主な言語：`C言語`，`COBOL`，`Fortran`など

```sum.c
int sum = 0;
for (int i = 0; i <= 10; i++) {
    sum += i;
}
printf("%d", sum);
```
#### オブジェクト指向言語（OO言語）
特徴：OO言語の根本的な考えは、システムのあらゆる対象をオブジェクトとして捉える点にある。複雑でコード量も増えてしまうが、反対に複雑な構造を持つ大規模なWebサービスの開発等には適している。また、オブジェクトの追加・変更が容易であるため、コードの再利用性や拡張性が高いといった特徴もある。

主な言語：`Java`，`Python`，`C#`など

```sum.py
sum = 0
for i in range(11):
    sum += i
print(sum) 
```
## 宣言型言語
#### 関数型言語
特徴：関数型言語で扱う関数とは、命令型言語の関数とは意味合いが違い、数学的な関数の意味合いを持つ。関数を中心として組み立てられるため、数学的・論理的側面が強い。ラムダ記法が特徴的であり、とても利便性が高いため、命令型言語で紹介した`Java`にも一部取り入れられている。

主な言語：`Lisp`，`Standard ML`，`Haskell`など

```sum.lsp
(define sum (lambda (n)
  (if (= n 0) 0 (+ n (sum (- n 1))))))
(display (sum 10))
```
#### 論理型言語
特徴：関数型言語と同様に手続きを記述しない言語であるが、論理型言語では呼んで字の如く、論理式を組み合わせてプログラムを表現する。「事実」と「ルール」を積み重ねていき、条件を与えることで、その条件下での解を得るプログラミング言語である。

主な言語：`Prolog`など

```sum.pl
sum(0, 0) :- !.
sum(N, R) :- N1 is N - 1, sum(N1, Rt), R is Rt + N.
?- sum(10, X).
```
2025年11月〜2025年12月のハッカソン開催情報まとめ!

2025年06月23日 19:05更新
2025年11月〜2025年12月のハッカソン・ゲームジャム・開発合宿の開催情報を定期的に紹介!!
※こちらは自動的に集めたものになります。
# これから開催されるイベント

### [RPG Maker Themed Game Jam #13: Lair of the Frost Wyrm](https://itch.io/jam/rpg-maker-themed-game-jam-13)
<img width="300" height="229" alt="RPG Maker Themed Game Jam #13: Lair of the Frost Wyrm" src="https://img.itch.zone/aW1nLzE4MTk2ODE5LnBuZw==/original/UuPc2u.png" />

2025年11月14日
Online
[](https://www.google.co.jp/maps?q=,)
2025年06月23日 10:05現在 7人参加中

### [RPG Maker Horror Game Jam #13: Frozen Heart](https://itch.io/jam/rpg-maker-horror-game-jam-13)
<img width="300" height="229" alt="RPG Maker Horror Game Jam #13: Frozen Heart" src="https://img.itch.zone/aW1nLzE4MTk2ODI2LnBuZw==/original/dyq%2FZF.png" />

2025年11月14日
Online
[](https://www.google.co.jp/maps?q=,)
2025年06月23日 10:05現在 8人参加中

### [12 Seconds of Christmas Game Jam 2025](https://itch.io/jam/12-seconds-of-christmas-game-jam-2025)
<img width="300" height="238" alt="12 Seconds of Christmas Game Jam 2025" src="https://img.itch.zone/aW1nLzIwNzY4NzM1LnBuZw==/original/uOzG6b.png" />

2025年12月01日
Online
[](https://www.google.co.jp/maps?q=,)
2025年06月23日 10:05現在 2人参加中

### [Asspire Game Jam 2025](https://itch.io/jam/asspire-game-jam-2025)
<img width="300" height="238" alt="Asspire Game Jam 2025" src="https://img.itch.zone/aW1nLzIwMzU4NjQ1LnBuZw==/original/nGAYwN.png" />

2025年12月01日
Online
[](https://www.google.co.jp/maps?q=,)
2025年06月23日 10:05現在 3人参加中

### [Grassroots Game Jam 2025](https://itch.io/jam/grassroots-game-jam-2025)
<img width="300" height="180" alt="Grassroots Game Jam 2025" src="https://img.itch.zone/aW1nLzIwMjU5NTU5LmpwZw==/original/njucw3.jpg" />

2025年12月05日
Online
[](https://www.google.co.jp/maps?q=,)
2025年06月23日 10:05現在 17人参加中
Windows の VS Code で サーバに SSH接続する手順書

# 背景
なんもしてないのに動かなくなった。
# VS CodeからサーバーにSSH接続する方法
VS Codeを使用してサーバーにSSH接続するための手順
1. Remote - SSH 拡張機能のインストール
- VS Codeを開く
- 左側の拡張機能アイコン（四角形のアイコン）をクリック
- 検索バーに「Remote - SSH」と入力
- Microsoft製の「Remote - SSH」拡張機能を見つけてインストール
2. SSH設定の準備
- SSH接続に必要な設定を~/.ssh/configファイルに追加
- ファイルが存在しない場合は作成
- config.txt にならないように注意
```config:config
Host myserver
    HostName your.server.com
    User your_username
    Port 22
    IdentityFile ~/.ssh/id_rsa_suffix
```
- Host: 任意のホスト名。後でVS Codeから接続する際に使用します
- HostName: 接続先のサーバーのドメイン名またはIPアドレス
- User: サーバーに接続する際のユーザー名
- Port: SSHのポート番号（通常は22）
- IdentityFile: SSHキーのパス。デフォルトでは~/.ssh/id_rsaを使用しますが、異なる場合は適宜変更してください
# 3. SSHキーの生成（必要な場合）
- まだSSHキーを持っていない場合は、以下のコマンドで生成します。
- .sshフォルダで作業
```Bash:Bash
# cd ..\..\Users\your_username\.ssh\
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f id_rsa_suffix
```
### SSHエージェントにキーを追加
SSHキーがエージェントに登録されていない場合、以下のコマンドを実行して追加します。
```Bash:Bash
ssh-add　id_rsa_suffix
```
### 公開鍵をサーバに配置
- 生成した公開鍵（id_rsa_suffix.pub）を接続先サーバーの ~/.ssh/authorized_keys に追加
- .ssh フォルダで作業
```Bash:Bash
cat id_rsa_suffix.pub | ssh your_username@your.server.com 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'　
```
# 4. VS CodeからSSH接続する
- 左下の緑色のリモートアイコンをクリック
- 「Remote-SSH: Connect to Host...」を選択
- リストから先ほどconfigファイルに追加したmyserverを選択
- 接続が確立されると、リモートサーバー上でVS Codeが起動

# 5. ターミナルから接続
```bash:Bash
 ssh myserver
 ```

以上。
Bashにおけるforループとwhileループの違いについて

# 概要
forループで、下記のようにcsvファイルからリストを格納しようとすると、行が分割されてしまい上手く格納できなかったのでchatgptに聞いてみた。

~~~
for list in `cat list.csv`
do
 LINE=`echo $list |awk -F, ‘{print $2}’`
 echo $LINE
done
~~~

下記に回答を転載する。

for ループと while ループで異なる動作が起きる理由は、シェルの構造とテキストの処理方法の違いによります。

# 1. for ループの場合
for ループでは、次のように cat list.csv の出力全体が一度に読み込まれ、空白（改行も含む）で分割されます。そのため、各行を個別に扱うというより、各「単語」を処理してしまいます。
~~~
for item in `cat list.csv`
do
  echo $item
done
~~~
例えば、list.csv に改行が含まれていると、for ループが改行を区切り文字と解釈せず、各行を連続した単語として扱ってしまいます。その結果、1行ごとではなく、カンマやスペースなどで区切られたすべての単語が順に処理されてしまいます。

# 2. while ループと < file の使用
一方、while ループで < list.csv のようにファイルリダイレクトを使うと、シェルが list.csv の内容を行単位で読み込み、各行を順番に read コマンドに渡します。
~~~
while IFS=, read -r col1 col2 col3; do
  echo "$col2"
done < list.csv
~~~
この方法では、改行ごとに1行ずつ処理されるので、1行ずつ正しく読み取れるわけです。

# まとめ
- for ループ：単語単位で処理するため、行ごとに扱えない。
- while ループ + read：行単位で処理できるため、CSVなどの行ごとのデータ処理に適している。
このような理由から、行単位の処理が必要な場合は while ループを使うのが一般的です。
メモリ制限で動画が表示されないエラーを解消

```php
return response($recordingFile)->header('Content-type', 'video/mp4; charset=binary');
```

```php
return new StreamedResponse(function () use ($s3FilePath) {
    $stream = Storage::disk('s3')->readStream($s3FilePath);
    fpassthru($stream);
    fclose($stream);
}, 200, [
    'Content-Type' => 'video/mp4',
    'Content-Disposition' => 'inline; filename="' . basename($s3FilePath) . '"',
]);
```

このように変更しました

## StreamedResponseとは
LaravelやSymfonyのフレームワークで使用されるHTTPレスポンスの一種。
大量のデータやリアルタイムなデータを効率よくクライアントに送信する目的で使用されます。

## 2つのコードの違い

通常のレスポンスでは、すべてのデータが一度に生成され、メモリに保持されてからクライアントに送信されますが、StreamedResponse はデータをチャンク（小さな部分）に分割してストリームとして送信します。
これにより、大量のデータを一度に処理せず、少しずつ送信できるため、メモリ効率が良くなるようです。
StreamedResponseを使わない理由がないように見えますが、何かデメリットはあるんでしょうかね。


| 特徴                   | `response()`                     | `StreamedResponse`               |
|------------------------|----------------------------------|----------------------------------|
| **ファイルの取得方法** | メモリに全体を読み込む           | ストリームで少しずつ読み込む     |
| **メモリ使用量**       | 高い（ファイルサイズに依存）     | 低い（ストリーミング処理）       |
| **大容量ファイル対応** | 不向き                           | 適している                       |
| **パフォーマンス**     | ファイルが大きいと遅くなる可能性 | メモリ効率が良く、パフォーマンスが安定する |
「お名前」で独自ドメイン、「さくら」でサイト、「XServer」でメールのキメラサイト

# はじめに
かなり特殊な事例を経験したので、忘れないように自分用メモと同じ状況になった方のお助けになれば幸いです。

# 状況説明
・独自ドメインで管理は「お名前.com」（以下お名前）
・サイトを管理するサーバーは「さくらのレンタルサーバ」（以下さくら）
・メールサーバーはずっと使い続けてる「XServer」（以下エックス）

# 大まかな手順
1、独自ドメインのDNSレコードを「お名前」で設定
2、独自ドメインを「さくら」でも登録
3、「さくら」で登録したドメインの「メールドメイン設定」を変更

# DNSの変更
そもそも「お名前」でDNSレコードを反映する際は、「お名前」のネームサーバーにする必要があります。ここを変更しておかないと、どうやらDNSレコードの設定は反映されないようです。

![b8dfc349-8974-4a39-93a9-d98612a4dcaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562901/c6aa37ac-3843-936d-fb5e-86aa0ab85af3.png)


# DNSレコード設定
結論からいうと詳細設定は下記の画像になります。
※独自ドメインを「testsite.com」とした場合

![ss01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562901/3f9c17e8-6ab2-d952-862c-d96594cc061b.png)


## Aレコード（サイトサーバーの向き先）
+ 独自ドメイン・A・3600・「さくら」の該当サーバーIPアドレス（IPV4）
+ 独自ドメイン（www付き）・A・3600・「さくら」の該当サーバーIPアドレス（IPV4）


**「さくら」のIPアドレス記載場所**
![7adf6948-f463-42e9-9841-045059128ecf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562901/402cb641-4986-1c63-0e18-487fe1eca73a.png)

## MXレコード（メールサーバーの向き先）
+ 独自ドメイン・MX・3600・「XServerホスト名」・10

**「エックス」のホスト名記載場所**
![0b0811da-dbef-4340-a403-4c2a38690d66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562901/8fbc7e54-089e-4e3c-ab75-874472856e77.png)

## TXTレコード（スパム対策用のレコード）
・v=spf1 +a:XServerホスト名 +a:独自ドメイン +mx ~all
・v=spf1 +a:sv12345.xserver.jp +a:testsite.com +mx ~all　（例)

:::note warn
このレコード設定をしておかないと、Gmail, hitmailなど大手フリーメールアドレスにメールが届きません。
:::




# 「さくら」でドメインの登録
**「ドメイン/SSL」→「ドメイン新規追加」→「他社で取得したドメインを移管せずに使う」**
「さくら」側で使用するドメインの登録を行います。

# メールドメイン機能を無効にする
:::note alert
かなり特殊な例ですが、この設定をしないと「エックス」側でメールを受け取れないことがあります
:::

**「ユーザ/メール」→「メールドメイン」→「対象のドメイン」→「メールドメイン設定」**
「さくら」に登録したドメインのメールとして機能を無効化しておきましょう。

![d3013dfb-5c5a-445f-8ae3-797f761cbaf9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562901/eac56b26-eef4-24b9-3ca2-9db99c96280a.png)

# 注意ポイント
かなり特殊な例になってしまいますが、下記は自分がはまって時間を奪われた例です。
気がつけば簡単ですが、参考資料が少ないため大まかな予想になります。

### 設定例

```
「さくら　メールアドレス」 ：hogehoge@test.com
「エックス　メールアドレス」：hogehoge@test.com
```

いくらDNSレコードでメールサーバーを指定していても、「さくら」と「エックス」に上記のように全く同じメールアドレスの設定が存在する時…

<font color="red">**メールドメイン機能を無効にしてないと、「さくら」側にメールがきてしまいます！**</font>

ありがた迷惑なことに「さくら」側で一度メールアドレスが存在してないか、巡回して確認する仕様のようです。「さくら」側にメールアドレスがない場合は、何も設定しなくても「エックス」にメールがいくみたいですが、かなり迷惑な仕様です。
Kotlin Coroutines StateFlowのonEach(またはcollect)が停止する

# 背景
* StateFlowのonEach処理が意図せず停止することがある
# 原因
* onEach(collect)内でSharedFlowへのemit時にsuspendしていた

# onEach(collect)が停止するパターン
```kotlin
// MutableSharedFlowはデフォルトではバッファリングできないためコンシューマが存在しない場合emit()時にsuspendする
private val _events = MutableSharedFlow<Events>()
val events = _events.asSharedFlow()

var timeOutJob: Job? = null

batteryReceiver.batteryReceiver.onEach {
    when (it) {
        Intent.ACTION_POWER_CONNECTED    -> {
            timeOutJob?.cancel()
            // ここでeventsのconsumerがいないタイミングでsuspendしていたのが原因
            _events.emit(Events.ChargeConnected)
        }
        Intent.ACTION_POWER_DISCONNECTED -> {
            // 遅延実行
            timeOutJob = defaultScope.launch {
                delay(5000)
                _events.emit(Events.ChargeDisconnected)
            }
        }
    }
}.launchIn(defaultScope)
```

# onEach(collect)が停止しないパターン
```kotlin
// replay=1を指定してバッファリング(consumerの収集開始時に過去1件の値を再送信する)
// onBufferOverflow=BufferOverflow.DROP_OLDESTを指定し、最も古いアイテムをドロップして、新しいアイテムをバッファに追加する
private val _events = MutableSharedFlow<Events>(
    replay = 1,
    onBufferOverflow = BufferOverflow.DROP_OLDEST
)
val events = _events.asSharedFlow()

var timeOutJob: Job? = null

batteryReceiver.batteryReceiver.onEach {
    when (it) {
        Intent.ACTION_POWER_CONNECTED    -> {
            timeOutJob?.cancel()
            // eventsのconsumerがいない場合でもsuspendしなくなる
            _events.emit(Events.ChargeConnected)
        }
        Intent.ACTION_POWER_DISCONNECTED -> {
            // 遅延実行
            timeOutJob = defaultScope.launch {
                delay(5000)
                _events.emit(Events.ChargeDisconnected)
            }
        }
    }
}.launchIn(defaultScope)
```
Error connecting to agent: No such file or directory の解決方法

# Error log
```
Error connecting to agent: No such file or directory
```
# 原因
- SSHエージェントが実行されていない
- SSHの設定が適切に設定されていない
# 解決策
## 1. SSHの確認と開始
### サービスの状態確認
1. PowerShell を管理者で実行
2. 以下のコマンドを実行して、ssh-agent サービスの状態を確認
```Powershell:Powershell
 Get-Service ssh-agent
```
### サービスの開始
サービスが停止している場合は、以下のコマンドで開始
```Powershell:Powershell
 Start-Service ssh-agent
```
### サービスの自動起動設定
毎回手動で開始する手間を省くために、サービスを自動起動に設定
```Powershell:Powershell
Set-Service -Name ssh-agent -StartupType Automatic
```
# 2. SSHキーの追加
サービスが実行されていることを確認したら、再度SSHキーを追加
```Powershell:Powershell
ssh-add C:\Users\hogehoge\.ssh\id_rsa_foobar
```
# 3. OpenSSHがインストールされているか確認
```Powershell:Powershell
ssh -V
```
## ない場合、OpenSSHをインストールする
```Powershell:Powershell
dd-WindowsCapability -Online -Name OpenSSH.Client
# 管理者特権で行う
```
# 4. PowerShellの再起動
これでうごくはず。
__pycache__が生成されるディレクトリが指定できるようになっていた件

Pythonの`__pycache__`ディレクトリは、Pythonファイルをコンパイルしたバイトコード（`.pyc`ファイル）をキャッシュするために自動生成されます。このディレクトリの場所を明示的に指定する方法は、Python標準には直接は存在しませんが、いくつかの方法で`__pycache__`の管理やディレクトリの扱いを調整することはできます。

### 1. `PYTHONPYCACHEPREFIX` 環境変数を使う
Python 3.8以降では、`PYTHONPYCACHEPREFIX`環境変数を使って`__pycache__`ディレクトリの保存場所を変更できます。この変数にカスタムのディレクトリパスを指定すると、すべてのバイトコードキャッシュがその場所に保存されます。

#### 使い方
以下の例では、キャッシュを`/path/to/custom/cache`に保存します。

**Linux/macOS**
```bash
export PYTHONPYCACHEPREFIX=/path/to/custom/cache
python your_script.py
```

**Windows**
```cmd
set PYTHONPYCACHEPREFIX=C:\path\to\custom\cache
python your_script.py
```

これで`__pycache__`フォルダが指定したディレクトリに生成され、スクリプト実行ごとにその場所にバイトコードキャッシュが保存されます。

### 2. プログラム内で`sys`モジュールを使って設定
`PYTHONPYCACHEPREFIX`をプログラム内で設定したい場合は、次のように`os.environ`を使用します。

```python
import os
import sys

os.environ['PYTHONPYCACHEPREFIX'] = '/path/to/custom/cache'

# これで以降のインポートやコンパイル時にカスタムキャッシュディレクトリが使われます
```

### 3. `__pycache__`ディレクトリを削除または無視する方法
`__pycache__`ディレクトリを生成させたくない場合や、キャッシュを保持したくない場合、以下の方法もあります：

- **実行時にキャッシュを無効にする**: スクリプト実行時にキャッシュを生成させない場合は、`PYTHONDONTWRITEBYTECODE`環境変数を設定します。

   ```bash
   export PYTHONDONTWRITEBYTECODE=1  # Linux/macOS
   set PYTHONDONTWRITEBYTECODE=1     # Windows
   ```

- **`.pyc`ファイルをクリーンアップ**: 不要になった`__pycache__`フォルダをクリーンアップするには、以下のコマンドを実行します。

   ```bash
   find . -name "__pycache__" -type d -exec rm -r {} +
   ```

これらの方法で、`__pycache__`ディレクトリの管理を柔軟に行えます。
Microsoft Fabricの監査

## はじめに
Microsoft Fabricでユーザーの操作ログを表示する、監査の方法をまとめました。

## 各方法の比較
|  | Purview監査 | Get-PowerBIActivityEvent | 管理者監視<br>ワークスペース |
|:-:|:-:|:-:|:-:|
|内容|Fabricを含むM365製品全ての監査ログ|監査ログからFabricに関するログのみを抽出したもの|Fabricのアクティビティログをレポート化したもの|
| 監査人  | グローバル管理者<br>監査人  | グローバル管理者<br>Fabric管理者<br>Power Platform管理者  | グローバル管理者<br>Fabric管理者<br>アクセス権を持つユーザ  |
| 利用方法  | 管理ポータル>>監査ログ>>M365管理センター | PowerShellで<br>コマンド実行 |ワークスペース>>Admin monitoringワークスペース>>FeatureUsage And Adoptionレポート   |
| 保存期間  |180日間 ※1 | 30日間  | 30日間  |
|参考|[Purview監査](https://learn.microsoft.com/ja-jp/fabric/admin/track-user-activities)|[PowerBIActivityEvent](https://learn.microsoft.com/ja-jp/powershell/module/microsoftpowerbimgmt.admin/get-powerbiactivityevent?view=powerbi-ps)|[管理者監視<br>ワークスペース](https://learn.microsoft.com/ja-jp/fabric/admin/monitoring-workspace)|


※1
https://learn.microsoft.com/ja-jp/purview/audit-solutions-overview
![スクリーンショット 2024-11-15 111717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/47c0936d-db73-1441-cc32-93a09f7a3b2a.png)


## Purview監査
![監査ログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/e1392990-a95c-6575-6db1-1eda364b7a95.png)

![監査ログ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/7e096446-b050-1c1a-7403-3afa69f91b67.png)

## Get-PowerBIActivityEvent
以下は2024年6月20日のテナント内での全てのアクティビティを取得するコマンドです。
<pre><code class="language-powershell">
$Date = '2024-06-20'
Get-PowerBIActivityEvent -StartDateTime "$Date`T00:00:00.000+09:00" -EndDateTime "$Date`T23:59:59.999+09:00"
</code></pre>
結果はJSON形式で出力されます。
取得できるログは1回で1日分なので、StartDateTime と EndDateTime はどちらも同じ UTC 日内である必要があります。

## 管理者監視ワークスペース
管理者管理ワークスペースのFeatureUsage And Adoptionでは、3つのレポートを表示できます。

#### Activity Overview
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/d0e9caf2-9b57-fa7a-8e26-423ce268070f.png)

#### Analysis
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/c3382d5c-786b-f2db-e04b-489128ab2760.png)

#### Inventory
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850932/0a75c454-63bd-ea1a-3576-f963f0d9b509.png)
クラスの継承

### 基本はスーパークラスは一つだけ
`>Rubyの継承は単一継承`です。つまり、継承できるスーパークラスは一つだけになります（ただし、Rubyはミックスインという多重継承に似た機能を持っています。

### 継承関係の頂点のクラス
>`継承関係の頂点にいるのはBasicObjectクラス`です。それをObjectクラスが継承しています。StringクラスやArrayクラスといったこれまでに説明してきた代表的なクラスは、全てObjectクラスを継承しています。

### 継承されていることを観察する
```rb
irb(main):001* class User
irb(main):002> end
=> nil
irb(main):003> user = User.new
=> #<User:0x000000010d0c5ec8>
irb(main):004> user.to_s
=> "#<User:0x000000010d0c5ec8>"
irb(main):005> user.nil?
=> false
irb(main):006> User.superclass
=> Object
```
>Userクラスのオブジェクトはto_sメソッドやnil?メソッドを呼び出すことができます。
...
これはUserクラスがObjectクラスを継承しているためです

* objectクラスを継承していることがわかる
```rb
irb(main):007> user.methods.sort
=>
[:!,
 :!=,
 :!~,
 :<=>,
 :==,
 :===,
 :=~,
 :__id__,
 :__send__,
 :class,
 :clone,
 :define_singleton_method,
 :display,
 :dup,
 :enum_for,
 ...
 ```
 >Objectクラスから継承したメソッドの一覧を確認

### インスタンスのクラスを調べる
 ```rb
irb(main):008> user.class
=> User
irb(main):010> user.instance_of?(User)
=> true
irb(main):011> user.instance_of?(String)
=> false
````
* インスタンスのクラスを調べられる
* Userクラスかどうかを確認できる

```rb
irb(main):012> user.is_a?(User)
=> true
irb(main):013> user.is_a?(Object)
=> true
irb(main):014> user.is_a?(BasicObject)
=> true
irb(main):015> user.is_a?(String)
=> false
```
* is_aの関係にあるかどうかも調べられる

### クラスを継承させる
```rb
irb(main):001* class Product
irb(main):002> end
=> nil
irb(main):003* class DVD < Product
irb(main):004> end
=> nil
irb(main):005> dvd = DVD.new
=> #<DVD:0x0000000113d35ba8>
irb(main):006> dvd.is_a?(DVD)
=> true
irb(main):007> dvd.is_a?(Product)
=> true
```
* `DVD < Product`と書くと親子関係になる

https://gihyo.jp/book/2017/978-4-7741-9397-7

# Ruby on Rails APIで確かめてみる

ActionDispatch::AssertionResponse < Object

https://api.rubyonrails.org/classes/ActionDispatch.html#:~:text=ActionDispatch%3A%3AAssertionResponse%20%3C%20Object

objectクラスがスーパークラスなのがわかる
E2Eテストを自動化するときに大事なこと

# はじめに
MagicPodを使ってE2Eテストを自動化してから2年ほどが経ちました。
これまでE2Eの自動テストを作成しメンテナンスしてきた中で大事だなと思ったのは以下の2点です。

- ソースコードの変更に強いテストにする
- テストの実行時間をできるだけ短くする

E2Eテストに限らず言えることだと思いますが、E2Eテストは他のテストレベルのものよりも実行コストが高く不安定になりがちなので、特に大事だと感じています。

変更に弱いテストだと、画面の見た目が変わっていないけどソースコードの内部構造が変わった場合になぜかテストが失敗することがあります。テストが失敗しやすくなるとテストの信頼性が下がったり、失敗したテストのメンテナンスにコストがかかったりしてしまいます。
また、テストの実行時間は長くなればなるほどリリースしてよいかの判断に時間がかかってしまうことになります。

ではどのようにすれば上記2点をE2Eの自動テストで実現できるのか、いくつかポイントを紹介したいと思います。

# ソースコードの変更に強いロケータを使う
ロケータとは画面を構成する要素の識別子で、HTMLタグのidや、xpath、cssセレクタなどを様々なものを使うことができます。画面の構成が変更されるたびにロケータも変更しないといけない作りになっていると、テストは失敗しやすくなります。そのため、画面の構成が変更されてもロケータは変更されないような作りにするべきです。

ロケータに関してはこちらの記事がとても参考になります。

https://speakerdeck.com/nozomiito/roketawoxue-ndetesutozi-dong-hua-shang-ji-zhe-womu-zhi-sou

## data-testid
まずは、ロケータとしてdata-testid属性を使うことが一番だと思います。要素に対して与えるテストのための属性なので、その要素がなくならない限りdata-testid属性もなくならない（変わらない）はずです。

ただ、これはソースコードにdata-testid属性を組み込まないといけません。テストケースをどう作るかだけの問題ではないので、開発者との連携が必要になります。

## cssセレクタ
cssセレクタはcssの属性名が変わらない限りロケータも変わらないので、data-testidを使えない場合などにおすすめです。私たちのチームでは、基本的にcssセレクタを使うようにしています。

## accessibility id
ネイティブアプリの場合は、iOSとAndroidとで共通で使えるaccessibility idもおすすめです。共通のロケータを使うことで、iOSとAndroidとで指定するロケータが同じになりテストが失敗する可能性も低くなります。

https://support.magic-pod.com/hc/ja/articles/16904866116249-1%E3%81%A4%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%A7iOS%E3%81%A8Android%E3%82%A2%E3%83%97%E3%83%AA%E4%B8%A1%E6%96%B9%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E8%A1%8C%E3%81%84%E3%81%9F%E3%81%84#assign_common_accessibility_id

## テキスト
そもそもE2Eテストの考え方として、ユーザ視点でテストをすることが重要です。そのため、ユーザが見えるテキストをロケータとして指定するのがよいとされています。
テキストも、そのテキストが指す要素の機能が変わらない限りロケータも変わらないはずです。
例えば送信ボタンのロケータのテキスト"送信"は、その送信ボタンの機能が変わる（なくなる）までテキストは基本変わりませんよね。

また、テキストを完全一致で指定するのではなくcontainsを使って指定するのもおすすめです。MagicPodではロケータを選択肢の一覧から選択することができますが、自分で自由に書くこともできます。

https://support.magic-pod.com/hc/ja/articles/4408903612825

- テキストを完全一致で指定する
```xpath
xpath=//div[text()='送信']
```
- テキストをcontainsで指定する
```xpath
xpath=//div[contains(text(), '送信')]
```

実際にあったのは、ソースコードにフォーマッタをかけたらテキストにスペースが入るようになってしまい、テストケースのロケータを変更しないといけなくなる事象が発生しました。。
containsでテキストを指定すれば、上記のような場合にロケータを変更する必要はなくなります。他にも動的なテキストをロケータとして使いたい場合にも使えそうです。

# 「秒間待つ」を使わず「要素が表示（存在）するまで待つ」を使う

とりあえず「秒間待つ」を使うのはよくないと思っています。「秒間待つ」としてしまうと、無駄な待ち時間が発生する可能性があるからです。待ち時間が積もりに積もると、テストケースの実行時間も長くなってしまいます。

また実行時間が長くなる以外にフレーキーなテストとなってしまう場合もあります。指定した秒数待っても、様々な外部要因によりテストしたい状態になっているとは限らないからです。

単純に「秒間待つ」ことをしたい理由として考えられるのは、テストしたい画面や要素が表示されるのを待ちたいからだと思います。（外部システムの処理を待たないといけないなど外部要因もあるとは思いますが、、）
その場合に「秒間待つ」を使うのでなく、テストしたい画面の「要素が表示（存在）するまで待つ」を使うのがおすすめです。そうすれば無駄な待ち時間を削減できますし、なぜ待たないといけないか理由が分かりやすくなるという利点もあります。

# おわりに
他にも、MagicPodのヘルプセンターにプラクティスがたくさん書かれています。これらを活かして自動テストを健全な状態にしていきたいですね。

https://support.magic-pod.com/hc/ja/categories/6125833035289
新卒2年目エンジニアの成長記録: React学習9か月目

# はじめに
新卒2年目エンジニアのA.Kと申します。
SES運用保守の傍らで個人開発を継続し、晴れて社内開発の企業様から内定を頂きました！
**前回の成長記録から少し間が空いてしまっていますが、ゆるく学習を続けつつ転職活動に専念していた期間**になります。
10月末で案件を離れ、**現在は有給消化中**です！

https://qiita.com/AK_React/items/120f3e02f7ae42be59eb

# 学習9カ月目にやったこと
まず、**有給消化中なのでかなり時間があります。**
ただ、これまで業務と並行して個人開発・転職活動と必死に駆け抜けてきたため、**休息重視**です。そしてなにより、**今月末にボディメイクの大会があるため、こちらにリソースを注いでいます。**
とはいえ、SEとしての活動もやっているので、そちらをお話ししていきます。
***
### <font color="Red">**個人開発をゆるゆる進める**</font>

**技術スタックはこれまでと変わらず、TypeScript×React×Next.jsで、バックエンドはSupabase**を使用しています。
作成中のサービスは、ざっくりいうと「**ボディメイクのモチベを管理・分析できるサービス**」です。これまで通り**MVP単位でやることを切り分けて、機能ごとに実装→リリース**を繰り返しています。現在は一つ目の機能（カレンダー上にボディメイクのモチベーションを登録し、表示する機能）が完成しそうな段階です。
**なかなかモチベの維持が難しい**のですが、気楽にやっています。
***

### <font color="Red">**ITイベント・交流会参加**</font>

これまで休日を中心に参加していましたが、時間があるので平日も積極的に参加しています。**特に最近は生成AI関連のイベントが多く、参加するたびに新しい情報をキャッチアップ**できている気がします。
そしてなにより、私の場合は**人と話すことで活力をもらえる**ので、積極的に外に出るようにしています。交流も広がるしメリットしかないと感じています。
***
### <font color="Red">**AIツールに触れる**</font>

今一番時間を割いているかもしれません。
恥ずかしながら**AI関連のキャッチアップが弱く、Copilot×Chat GPT止まり**でした。
しかし、さまざまなイベントに参加する中で、もっと開発に使えそうなツールが山ほどあるぞ！ということを知りました。
下記は軽く触ってみたものになります。

**・Cursor**
AIのコードエディターになります。
これまではVSCodeにCopilotを導入してコーディングを行っていましたが、こちらに切り替えました。
所感としては、**Copilotよりも積極的にAIがコーディングを行ってくれている**気がします。
自分がコードを書くよりも先にどんどんAIが提案してくれるので、確実に負担が減りました。
まだまだ機能を使いこなせていないので、引き続き活用していきます。

https://www.cursor.com/

**・v0**
こちらはVercel社が提供するAIツールになります。
**フロントエンドのコード生成がメインになっていて、チャットを投げることで高いクオリティのUIを実装**してくれます。
現在はReact・Next.js中心ですが、将来的にはVue等のフレームワークにも対応可能になるとか。。

https://v0.dev/chat

試しに「**女性向けの筋トレ記録日記を作って！**」と投げてみたところ、一瞬でこのような可愛らしいサイトが出来上がりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/eb1b8592-04b1-fa6d-aee5-0211ba42e789.png)

もしエラーが出た場合も勝手にAIが修正してくれます。
ただ、今回同じエラーが何度も生じ、そのたびにコードを再生成しましたが解決せず。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/ce2ba05b-98cb-858d-0e69-697e5d8382c9.png)


私が実際に触ってみたのは以上の2つになります！
もう自分でコードを書く必要がないですね、びっくりです（笑）
**他に気になっているのは、Replit、bolt**あたりです！軽く触れたらと思っています！
**特にReplitは、説明会に参加したところフロント・バックどちらもフル対応可能＆認証系もやってくれる**とのことで、最強な予感がするので楽しみです。（既存のコードはまだ食べれないとか）

# 学習9カ月目に感じたこと

### <font color="Red">**学習の習慣を断ち切らないこと**</font>

**これまで学習の一つのゴールが「経験を積める環境に身を置くため**」だったので、**内定を頂いたことで気が緩んでしまう**のはありました。
ですが、**せっかく勉強する習慣ができたので、ここで全て断ち切ってしまうのはもったいないと感じ、無理のない範囲で続けています**。
私のSEとしてのキャリアは続きますし、まだまだジュニアレベルなので高みを目指していきたいです。

### <font color="Red">**自分が「好き・やりたい！」と思える分野を見つける**</font>
**まだ見つかっていないのですが、意気込み**として（笑）
結局好きなことじゃないとじゃないと続かないし、わざわざ時間を割くのは苦しいことだと思います。転職活動が終わってひと段落した今だからこそ、強くそう思います。
特に**生成AIのツールを触ってみて、「自分の苦手な部分は任せて自分の好き・得意に時間を割ければいいんじゃない？**」と感じるようになりました。
私はコーディングが得意ではないのですが、AIに任せれば一瞬で正確なコードを書いてくれます。
**まずは自分がリソースを割いていきたい分野を見つけ、それ以外の分野はAIに任せていけるのが理想です！**
# おわり
以上が9カ月目の振り返りでした！
これからは、**引き続き個人開発・生成AIのキャッチアップを行うとともに、内定先で触ることになりそうなRailsの学習**も着手していきたいです！
今月はボディメイクの大会に向けて減量生活中ですが、来月は旅行なんかもしつつリフレッシュしていけたらと思っています！
構成管理と資産管理について

# 構成管理とは
社員一人一人に配られるシンクラを想像してみましょう。構成管理では、ネットワークやCPU速度、OSなどより詳細な情報を管理する。

# 資産管理とは
こちらも社員一人一人に配られるシンクラを想像してみましょう。資産管理では、配布日時や使用者、管理番号、メンテナス日時などの情報を管理する。

# servicenowでCMDBを構築する場面
ITSM,ITAM,ITOMをやるときは構築することが多い。
開発に使っているMacでストレージ使用量が多くなっていたのを掃除したメモ

会社のMacは500GBのストレージがあったのだけど、書類123GB, システムデータ233GBも使われていて困りはててあれこれ掃除したのでやったことをメモ

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54872/c6fa4dcc-8d97-77b3-d17b-422fdb07a087.png)


## まず計測

`システム設定 > 一般 > ストレージ` でストレージの使用状況が確認できます（スクショはこの画面）
下へスクロールするとファイルの種類？ごとの使用状況が見れます

今回は書類が多いので書類をまず見ます（システムデータの方が容量食ってますが、一旦気にしないでおきます）

一覧からここをクリックすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54872/f7bb4a9e-f8f9-94cf-6a10-d12fbcc163f9.png)

こんな画面が出ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54872/b2d49ca1-e918-bb46-fa0a-c95e29d6d6ca.png)


ファイルブラウザを選ぶと、容量の多いディレクトリが列挙されます
スキャンが終わってないディレクトリは `--` と表示されて一番下にいるので、スキャンが終わるまで気長に待ちます

こんな感じ
![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54872/c7bce5fa-0216-88b9-20ac-e1883307e31e.png)

一通り終わるとこんな具合

![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54872/425c2097-4341-fc69-f6d9-09c6fc6c1142.png)


## お掃除お掃除〜

### 大きいファイルタブ

大きいファイルがあれば適当に消しておきます

### ファイルブラウザタブ

こっちが本番
容量大きいディレクトリを見繕って、それぞれのツールごとに掃除の仕方を調べて消していきます

システムデータは一旦気にしないでおきます、と書きましたが、このファイルブラウザにシステムデータのファイルも一緒に表示されるので、ここを見ればまとめて整理出来るっぽいです

#### asdf

flutterなどが1バージョンあたり4GB食っていたり、更新が頻繁なgolangなどが大量にあって容量を食っていたりしました
`asdf uninstall flutter [version]` のように各ランタイムごとにアンインストールして消していきます
18GBほど削減できました

#### ghq

会社のモノレポが33GBほど食っていて、中でもバックエンドのgolangのビルドキャッシュらへんが大きかったので掃除
10GBほど削減できました

#### go

以下を実行してキャッシュを掃除
42GBほど削減できました

```
go clean -cache
go clean -modcach
```

### ライブラリの中

`Containers/` , `Caches/` が大きかったのでそれぞれ見てみる

### Containers/Docker

Docker for Macを立ち上げると `Disk 5GB avail. of 92GB` みたいな感じになってて全然空き容量がない
のでいつもの

```
docker system prune
```

・・・を実行しても思ったように減らない（prune後も60GBぐらい使っていた）

どうもdockerコマンドから消えないっぽい？Docker.qcow2なるファイルが、あるようだが、GUIから `reset to factory defaults` 初期化すると掃除できるようだったので実施
（こちらの記事を参考にしました https://qiita.com/shinespark/items/526b70b5f0b1ac643ba0#%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AE%B9%E9%87%8F%E3%81%8C%E6%88%BB%E3%82%89%E3%81%AA%E3%81%84 ）

メニューバーの `Troubleshoot` を選択するとこの画面が出せるので、ここから `Reset to factory defaults` を実施

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54872/d13a9f93-432a-935a-2b8d-384a637509e0.png)

これで60GBほど削減出来ました

### Cache/JetBrains

JetBrainsのIDEのキャッシュ類が結構残ってたので掃除
前のバージョンのものも丸ごと残っていたのでそちらはファイルブラウザから手で削除しちゃう

今使ってるバージョンのものは以下のドキュメントに従ってUIから削除
https://pleiades.io/help/go/invalidate-caches.html

12GBほど削減出来ました

## デベロッパの掃除

ストレージ > デベロッパからXCode関連のファイルについても掃除できるので、必要なら実施しましょう


## ビフォーアフター


![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54872/425c2097-4341-fc69-f6d9-09c6fc6c1142.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54872/a0b55cc9-556f-eec7-aedd-d6a6b85d72be.png)

だいぶ軽くなりました :tada:
docker環境でphp.iniを更新したいとき

普段そこまで遭遇しないんでメモ

## php.iniが反映されない

- ソースも最新のものをpull
- 手元で更新されているのも確認済
- コンテナ内のphp.iniを直接書き換えるとうまくいく

## --no-cache

```
 $ docker compose build --no-cache
```
で、イチから作り直してくれ、無事php.iniもビルドイメージに反映された
スーパークラスとサブクラス

>DVDクラスの「スーパークラス（または親クラス）」と呼びます。逆にProductクラスから見ると、DVDクラスはProductクラスの「サブクラス（または子クラス）」と呼びます。

* 下のリンクはクラス図が表示されていました

https://www.ogis-ri.co.jp/otc/swec/process/am-res/am/artifacts/classDiagram.html

### 上はスーパークラス、下はサブクラス
>スーパークラスを上に、サブクラスを下に配置し、サブクラスからスーパークラスへ向かって矢印を伸ばすことで、サブクラスがスーパークラスを継承していることを表します。

### 継承するよりも共通点で判断
>継承は時々「スーパークラスの機能を完全に引き継ぐための仕組み」とみなされる場合がありますが、それは誤解です。そのように考えると飛行jに扱いづらいクラスが出来上がってしまいます。警鐘を使いたいと思ったきときは機能ではなく、性質や概念の共通点に着目してください。

### is-aの関係
>性質や概念が共通しているかどうかを判断する方法の一つは、「サブクラスはスーパークラスの一種である」と声に出して読んだ時に違和感がないか確かめることです。これは「is-aの関係」と呼ばれます。

#### 特化と汎化
>サブクラスはスーパークラスの性質を特化したもので、反対にスーパークラスはサブクラスの性質を汎化したものである、という関係も成り立ちます。「特化」とは性質がより細かく具体的になることで、「汎化」とは性質がより大雑把に抽象化されることです

https://gihyo.jp/book/2017/978-4-7741-9397-7

* 商品を買いに行くと言って何を買いに行くのか具体的にするとDVDになるみたいなことか
バックアップの整合性について

バックアップの整合性には、「アプリケーション整合性」「ファイルシステム整合性」「クラッシュ整合性」の3つがあり、それぞれデータを回復する際の精度や失われるデータ量が異なります。以下に、それぞれの詳細と、回復時に失われるデータについて説明します。

---

### 1. アプリケーション整合性 (Application Consistency)
#### 詳細:
- **アプリケーション整合性**とは、データベースやメールサーバーなど、アプリケーションの状態も含めてデータをバックアップすることです。
- バックアップ実行時にアプリケーションに一時停止（フリーズ）やスナップショットの作成を指示し、アプリケーションが正常に動作している状態でデータの一貫性を確保します。(※Windows VSSサービス利用すれば、一時停止が不要)
- たとえば、データベースではすべてのトランザクションが完了し、キャッシュに書き込まれていないデータもストレージに反映された状態でバックアップが作成されます。

#### 回復時に失うデータ:
- 通常、データ損失は最小限で、アプリケーションが完全な状態で復元されます。
- ただし、バックアップ後に発生したデータは失われますが、アプリケーションは整合性を保ったまま復元されます。

---

### 2. ファイルシステム整合性 (File System Consistency)
#### 詳細:
- **ファイルシステム整合性**とは、ファイルシステム全体の一貫性を保った状態でバックアップすることを指します。
- これには、ファイルシステムのメタデータやアクセス権が適切に保存され、システムが正常にマウントできる状態でバックアップを取得することが含まれます。
- ファイルシステムの整合性を保つため、スナップショット機能を利用してデータの瞬間コピーを作成することが一般的です。

#### 回復時に失うデータ:
- ファイルシステムの一貫性は保たれますが、アプリケーションのキャッシュやトランザクションの進行中に保存されていないデータは失われる可能性があります。
- 特にデータベースやリアルタイム処理中のアプリケーションでは、一部の未完了データが失われることがあります。

---

### 3. クラッシュ整合性 (Crash Consistency)
#### 詳細:
- **クラッシュ整合性**は、システムが突然停止した際の状態に近い形でデータをバックアップすることです。
- この方法では、ファイルシステムやアプリケーションの整合性が保証されないため、データの断片化や一貫性のない状態が発生する可能性があります。
- クラッシュ整合性は、通常、ファイルのコピーや簡易バックアップで利用されます。

#### 回復時に失うデータ:
- システムがクラッシュした場合と同様に、整合性が取れていない部分があるため、アプリケーションは正常に起動できないことがあります。
- 具体的には、トランザクション処理中のデータや、ファイルの一部が失われる可能性が高く、修復が必要になる場合があります。

---

### まとめ

- **アプリケーション整合性**：アプリケーションの状態も保たれるため、ほぼ完全な復元が可能。ただし、バックアップ取得後のデータは失われます。
- **ファイルシステム整合性**：ファイルシステムの整合性は保たれるが、アプリケーション内の一部の進行中のデータは失われる可能性あり。
- **クラッシュ整合性**：クラッシュした状態でのバックアップのため、データの欠損やアプリケーションの起動に問題が発生することが多い。

それぞれのバックアップ方法は、システムの重要度や許容できるダウンタイム、データ損失のリスクに応じて使い分ける必要があります。
金融実務の概観

# 1. 金融実務の概観

ファイナンス理論を以下の書籍をベースに学んでいきます。

https://www.amazon.co.jp/ファイナンス理論入門-金融工学へのプロローグ-木島-正明/dp/4254290160

### 目次　
[1.1.金融とは](#1.1-金融とは)
[1.2.資金調達の方法](#1.2-資金調達の方法)
[1.3.株式市場](#1.3-株式市場)

# 1.1. 金融とは
　金融とは、文字通り「**お金を融通する**」ことです。つまり、**貸し手**から**借り手**への**お金の流れ**のことです。借り手の業績が上がれば、貸し手と借り手ともにwinwinな関係を築くことができます。また、借り手(企業)はさらに人員を雇ったりすることで、経済にも良い影響を与えることがわかるでしょう。このことから、「**金融は経済の血液**」と呼ばれています。
 
　しかし、貸し手と借り手が直接繋がることはかなり難しいでしょう。そこで、効率的に貸し借りを行えるように、貸し手と借り手を繋ぐ**仲介人**を考えましょう。この仲介人が「**証券会社・銀行**」に当たります。
 
　**証券会社**は、貸し手と借り手から手数料を受けります。貸し手と借り手が直接的にお金のやり取りを行います。証券会社はあくまでも**仲介人**ですので、お金の受け渡しは行いません。このように貸し手と借り手が直接的にお金を貸し借りする金融の形態を**直接金融**と言います。証券会社はこの手数料が儲けになります。
 
 ![スクリーンショット 2024-11-15 11.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901686/663a2c5b-ce0e-3222-78bc-42b2ee9ad436.png)

 
 　**銀行**は、証券会社とは異なり、貸し手からお金を借りて、借り手にお金を貸します。このように貸し手と借り手の間に仲介に入る金融の形態を**間接金融**と言います。銀行は借り手から受け取る利息と貸し手に渡す利子の差(**利鞘**と呼ばれます)が儲けになります。

  ![スクリーンショット 2024-11-15 12.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901686/cacd05b2-388b-7cbc-7c56-8a66bdf33545.png)

# 1.2. 資金調達の方法
次に、資金を調達する方法である「**債券**、**株式**、**銀行借入**」について説明します。
債券、株券は有価証券と呼ばれ、**証券会社**を通じて発行されます。債券によって調達された資金を**負債**、株券によって調達された資金を**株式**と言います。
#### 1.2.1. 債券
**債券**とは、国や企業などが資金を調達するために発行する借用証書です。債券には、国が発行する**国債**や企業が発行する**社債**などがあります。資金を貸した投資家は、**債権者**であり、債券を発行した事業会社は**債務者**となります。
　債券には大きく分けて「**割引債**」と「**利付債**」があります。
 ##### 割引債
　ある将来の時点(**満期**)に決められた金額(**額面**)を受け渡す債券を**割引債**と言います。満期までのどの時点においても、他の支払いなどは生じません。発行時には市場で決められた**発行価格**と呼ばれる金額で取引されます。
 　例えば、額面105円、発行価格100円の満期2年の割引債を購入したとします。この時、$t=0$で100円を支払い債券を購入し、$t=2$で105円を受け取ります。この割引債を購入すれば5円の利息が受け取れます。
  
  ![スクリーンショット 2024-11-15 12.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901686/0bc90c7b-0448-90c2-4cfe-93bce8caad41.png)

この図は**キャッシュフロー**といいます。キャッシュフローはお金の出入りを表します。支払いの場合は上向き矢印、受け取りの場合は下向き矢印で書き、その上に金額を書きます。
 ##### 利付債
　**満期**までの期中において**クーポン**と呼ばれる利払いが行われる債券です。クーポンは、額面価格に対して何%の利子が得られるかを表す**クーポンレート**を用いて表されることもあります。満期には額面+クーポンが支払われます。
　例えば、額面100円、発行価格95円、クーポンレート5%の満期2年の1年複利利回り利付債を購入したとします。1年に1回だけ利子5円を受け取ることができます。満期$t=2$年には、100+5円を受け取ります。この利付債を購入すれば15円の利息が受け取れます。
 
 ![スクリーンショット 2024-11-15 15.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901686/951fd6bf-86d7-0280-0345-4dca141d8732.png)

　債券によって調達される資金を**負債**と言います。負債には返済義務(**債務**)があるので、借り手は必ず返さないといけません。
以上が債券の説明になります。
#### 1.2.2. 株式
　株式は、債権と異なり、返済の義務はありません。これは、株式はその会社の**自己資本**であり、その株主がその会社の所有者であるということに基づいています。債券では、あらかじめ決まったクーポンという利払いがありますが、株式の場合は、業績に応じて**配当**があります。業績が悪ければ、配当を支払う必要はありません。
#### 1.2.3. 銀行借入
　銀行借入は、間接金融(銀行)による資金調達方法です。銀行が事業会社に資金を貸すことを融資と言います。
 債券と同様に、資金を貸した投資家は債権者、融資を受けた事業会社は債務者になります。
# 1.3. 証券市場
証券市場とは証券を取引する場所で、日本には、東京、大阪、名古屋、札幌、福岡にあります。
社債や株式は、**証券市場**で取引することができます。市場で取引される価格を**市場価格**と言います。

作成中
Apexクラスを呼び出すカスタムボタンをLEXでも使えるようにする（詳細ページボタン編）

長年Classic環境で運用されていた、Apexクラスを呼び出す処理を実装したJavaScriptカスタムボタン。

※参考URL：[tyoshikawa1106のブログ - SFDC：カスタムボタンからApexを呼び出す方法](https://tyoshikawa1106.hatenablog.com/entry/2016/10/16/204736)


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/645bb5ef-ba6a-a6a2-ac67-af5b1e6adf31.png)


これをLightning Experience環境でも使えるようにしたい！
（LEXではJSが使用できないため、作り直しが必要）
↓

#### ①Apexクラスを修正
呼び出したいクラスのアクセス就職子がglobalになっていなかったらそのように修正。
呼び出したいメソッドに@InvocableMethodアノテーションを追記。（フローから呼び出せるようにする）
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/df2423fa-4030-8e62-f0e2-effa2688fb45.png)



#### ②フローを作成する
アクションを追加して、Apexを呼び出すよう設定する。 
（①の設定を行っていないと、うまく表示されず設定できない）
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/69428afb-2788-e0ce-1607-5b7361100231.png)


忘れずにリソース「recordId」変数を用意する。
これがあることで、フローを実行したレコードのSFIDがセットされた状態でフローが実行される。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/f5f6c48b-323b-5387-4925-173ee710fcc9.png)


スペルが間違っていてもうまく機能しないので注意。IdのIだけ大文字。


#### ③フローを呼び出すアクションを作成
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/e38f1b5b-4e23-54a4-4292-26d34683e9c9.png)


#### ④レイアウトに表示
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/540ec6b5-06e3-0bcf-a83e-61d215af0903.png)


多分これで移植完了できると思います。
キャンペーン作成時キャンペーンメンバーの状況を自動で作成するフロー作成方法


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e4cb5f79-4092-5e26-1982-9d603ba78734.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e2d7c8fa-f47d-3a05-3f13-39f7f8abc49e.png)
SnowPro Coreに一発合格した話 - 私の半年の挑戦


こんにちは！
IT初心者からSnowflakeに挑戦した経験をシェアしたいと思います。半年ほど、ちょっとずつ勉強していたのですが、最後の数週間で一気に集中して勉強した結果、無事にSnowPro Core (COF-C02) に一発合格することができました。

私がこの記事を書いている理由は、同じように資格取得を目指している皆さんの役に立てればという気持ちからです。そして、私自身が約だった勉強法について、実体験を元にご紹介したいと思います。

#### 背景と私の状況

私はIT業界に足を踏み入れたばかりの新人で、最初は全くのゼロからのスタートでした。お隣のプロジェクトが楽しそうに取り組んでいるのはSnowflakeというものでした。わたしはなんとかそのプロジェクトに入りたくて、条件でもある？この資格に挑戦することになり、ひっそり勉強をはじめました特に最初の数ヶ月は他の業務も忙しく、なかなか集中して勉強することができませんでした。

あるときにsnowvillegeというsnowflakeのコミュニティがあることをしり、さっそく参加。初心者まるだしの私の未熟な質問にも有識者の皆さんが優しく答えてくださり、なんて優しい空間なのだろうと感動しました。

なかなか勉強に本腰をいれないなか月日がすぎしかし、半年ほどが過ぎた頃、そろそろ本格的に勉強しなければ期限をむかえてしまうと思っていたころ、侍DOGEさんのnote記事

https://note.com/samurai_doge/n/na948464cb5a4

を教えていただいたが大きな転機となりました。そのブログで紹介されていた勉強法を取り入れて、一気に集中して資格取得を目指すことにしました。

#### 使用した問題集と勉強方法

侍DOGEさんのnote記事で紹介されていた2つの問題集を中心に学習を進めました。

まず、使った問題集の一つ目は「データ空海」の問題集です。

https://note.com/data_ku/m/mb14f6943819e


この問題集は日本語での解説が豊富で、そもそも日本人エンジニアが作っているのことが最大の特徴です。頻繁にアップデートが行われているため、最新の試験傾向に対応しているのも安心感がありまし。じつはnote記事で紹介いただく前に前述のsnowflakeコミュニティでも高く評価されていたので事前購入済みでした（あとはやる気のもんだいでした・・）

もう一つの問題集は、Udemyで購入した英語のものです。

https://www.udemy.com/course/snowflake-snowpro-core-certification-exam-practice-sets/


正直、英語にあまり自信がなかったので少し大変でしたが、Snowflakeに関する英語の言い回しや用語に慣れるのにはとても役立ちました。実際の試験では不自然な日本語、直訳英語？な表現があるので。データ空海の問題集ではカバーしきれなかった部分を補完する形で学習することができたため、2つの問題集を並行して使うことでより幅広い知識を身に付けることができたと感じています。

#### 勉強スケジュールと具体的な取り組み ####

私は仕事の合間に少しずつ勉強を進めていましたが、効率が悪く感じることが多くありました。そこで、侍DOGEさんのnote記事を読ませていただいてからは私も「短期集中型の学習」が自分に合っているかもと思い、最後の1ヶ月間は仕事終わりに毎日2時間、そして週末にはその倍をSnowPro Coreの勉強に充てました。絶対合格するぞ、と生きこんでました。

「データ空海」の問題集は、毎週1周を目標にし、取り組みなおしてから合計5周することを決めました。これによって問題のパターンや出題傾向を体に染み込ませることができたと感じています。また、間違えた問題はエクセルに記録し、次に解いた時に同じミスをしないように徹底しました。

一方、Udemyの問題集は、2周がんばってみました。ここは、別の方のブログで紹介されていた、まずは問題と答えをいっきに眺める方法からやってみました。google翻訳にお世話になりました。
あとは、公式ドキュメントも併用して学習しました。じつはいまでも公式ドキュメントの構造がわかっておらず、データ空海問題集の解説にかいてあるリンクをエクセルに貼り付けてその都度確認しているだけでしたが。

#### 試験結果と感想 ####

最終的には、一発で合格することができ、スコアも思っていたより高かったのでとても嬉しかったです（ぎりぎり800点台）。SnowPro Coreの試験は日本語で受験できるとはいえ、内容がかなり専門的なので、途中で何度かくじけそうになったこともありました。試験中には問題集で触れていなかった内容も出題されました。そのため、余裕をもって合格するには公式ドキュメントの読み込みが非常に重要だと感じました。


#### 最後に ####


今回の挑戦を通じて、初心者でも適切な学習方法と努力次第でSnowPro Coreに合格できることを実感しました。また、しっかりとした教材を使うことの重要性も強く感じました。
合格後、ついにsnowflakeのプロジェクトに参画できたかというと、これからが勝負です。先輩からは合格を驚かれ（勉強していること黙ってましたので）、祝福してもらえました！

参考になれば幸いです！
CADにおける3Dモデルとは？

### CADにおける3Dモデルとは？

コンピュータ支援設計（CAD）における**3Dモデル**は、三次元座標系を用いて作成されたデジタル表現で、物体の形状、体積、表面の詳細を示します。従来の2D設計図とは異なり、3Dモデルは物体の実際の外観を三次元空間で表示し、製品設計、建築、アニメーション制作などさまざまな分野で広く利用されています。

#### 1. **3Dモデルの構成**

CADの3Dモデルは、通常、幾何体（立方体や球体など）と表面で構成されます。設計者はこれらの幾何体を編集し、引き伸ばしや回転などの操作を使って、目的の物体の形状を作り上げます。複雑な設計には、ブール演算や面取り、曲面処理などが含まれることがあります。
![fdc28e75eaaff9df9ead3037b89c8204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/17171d90-af7f-3796-c9c7-2b01dfeaaad9.png)


#### 2. **3Dモデルの応用**

- **製品設計と製造**：3Dモデルは、製品デザインを検証し、製造過程でのエラーを減少させるのに役立ちます。特に3Dプリンティングでは、モデルを直接実体に変換することができます。
  
- **建築設計**：建築業界では、3Dモデルを使って建物の仮想プロトタイプを作成し、構造や機能を最適化します。また、可視化効果を高めるためにも利用されます。

- **アニメーションとゲーム**：仮想現実（VR）やアニメーション制作において、3Dモデルは仮想のシーン、キャラクター、アニメーションを作成するための中心的な要素です。

#### 3. **3Dスキャンとモデリング**

**3Dスキャン技術**の発展により、手動で3Dモデルを作成するだけでなく、実物をスキャンしてデジタルモデルを生成することも可能になりました。3Dスキャナーは、レーザーや構造光を使って物体の表面の点群データをキャプチャし、正確な3Dモデルを生成します。この方法は、複雑な物体を再現したり、精密なモデリングを行う場合に非常に便利です。

スキャンした点群データは、CADソフトウェアに取り込んでさらに処理し、製造や設計に適したメッシュモデルに変換できます。例えば、彫刻をスキャンすると、その詳細なデータが得られ、最終的に調整された3Dモデルに変換できます。
![9b5bdc8450905eacbc0baef5b2a25e2b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/88ab1d66-df6f-32ab-c645-2acf5768e18f.png)

3Dスキャナー： https://www.revopoint3d.com/products/standalone-3d-scanner-miraco


#### 4. **フォーマット変換**

3Dモデルは、異なるCADソフトウェア間でファイル形式を変換する必要があります。一般的な形式には以下のものがあります：

- **STL**：主に3Dプリンティングに使用され、単純なメッシュモデルに適しています。
- **OBJ**：3Dモデリングやアニメーション制作に広く使われ、複雑な幾何形状をサポートします。
- **STEP**：複雑な幾何形状やアセンブリ体に対応する業界標準フォーマットです。
- **IGES**：曲面や実体モデルの伝送に使用されることが多いフォーマットです。

3Dスキャナーで得られたモデルは通常特定のフォーマットで出力されるため、標準フォーマットに変換して、次の設計や生産工程で使用できるようにする必要があります。
![6bf5894f11fce48de45ff40cc22c4dd6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/ddd37035-38b2-bfa4-7f69-0a3624144b76.png)


#### 5. **結論**

CADにおける3Dモデルは、設計の基盤であり、現代の製造や創作に欠かせない重要なツールです。3Dスキャン技術を利用することで、実物のデジタルモデルを迅速に取得し、最適化やフォーマット変換を行うことができます。製品開発、建築設計、アニメーション制作など、さまざまな分野で3Dモデルは不可欠な役割を果たしています。
Docker Python環境構築 (言語処理100本ノック対応)

## はじめに
PythonをDocker上で動かせるリポジトリを作成しました。

https://github.com/watanabe-gk/docker_python


## 構築済みのもの
numpyやscikit-learn等のオーソドックスなものはもちろん、[言語処理100本ノック 2020 (Rev 2)](https://nlp100.github.io/ja/)でも活用したので、MeCab-Cabochaも構築済みです（これローカルでやろうとしたら結構面倒くさい）。

## 使い方
各勉強項目ごとにscripts配下でディレクトを切ってもらえたら使いやすいのかのと思います。
キカガクさんの勉強したときは `/scripts/kikagaku`
言語処理100本ノック 2020 (Rev 2)の勉強したときは `/scripts/languageProcessing100Knocks`
みたいな感じ。

使用例
```
.
├── README.md
├── docker
│   ├── CRF++-0.58.tar.gz
│   ├── Dockerfile
│   ├── cabocha-0.69.tar.bz2
│   └── requirements.txt
├── docker-compose.yml
└── scripts
    ├── kikagaku
    │   ├── histogram.png
    │   ├── howToUse_Numpy.py
    │   ├── howToUse_Pandas.py
    │   ├── matrix.py
    │   ├── modelRead.py
    │   ├── models
    │   │   └── multipleRegressionAnalysisModel.pkl
    │   ├── multipleRegressionAnalysis.py
    │   ├── pairplot.png
    │   ├── samples
    │   │   ├── housing.csv
    │   │   └── simpleRegressionAnalysisSample.csv
    │   ├── scatter_plot.png
    │   ├── scatter_plot_centered.png
    │   └── utils
    │       ├── __pycache__
    │       │   ├── util.cpython-313.pyc
    │       │   └── util.cpython-39.pyc
    │       └── util.py
    └── languageProcessing100Knocks
        └── 1
            ├── 0.py
            ├── 1.py
            ├── 2.py
            ├── 3.py
            ├── 4.py
            ├── 5.py
            ├── 6.py
            ├── 7.py
            ├── 8.py
            └── 9.py
```
# 自分の勉強用としてgit管理
1. github gitlab 等でリポジトリ作成
1.  リポジトリの初期化
    ```
    rm -rf .git
    ```
1. 新しいリポジトリを初期化
    ```
    git init
    ```
1. すべてのファイルをステージング
    ```
    git add .
    ```
1. コミットを作成
    ```
    git commit -m "Initial commit"
    ```
1. リモートリポジトリの設定
    ```
    git remote add origin <リモートリポジトリのURL>
    ```

1. 最初のプッシュ
    ```
    git push -u origin main
    ```
おしまい！

# 備考
pipでinstallできるものは **requirements.txt** で追記するだけで済みます。
Mecab-Cabochaの環境構築は本来 [CRF++](https://drive.google.com/drive/folders/0B4y35FiV1wh7fngteFhHQUN2Y1B5eUJBNHZUemJYQV9VWlBUb3JlX0xBdWVZTWtSbVBneU0?resourcekey=0-NW5cPRv1Xr2-Vfo_xlDTLQ)と[Cabocha](https://drive.google.com/drive/folders/0B4y35FiV1wh7cGRCUUJHVTNJRnM?resourcekey=0-ym0BJTHMkjw3y1AEgwwaxA)をダウンロードしたものを解凍してモジュールインストール。
とか他にもやることが多いので最新版をダウンロード済みです(/docker配下の **cabocha-0.69.tar.bz2** と **CRF++-0.58.tar.gz**)。それを解凍からモジュールインストールまで行ってるので環境構築で挫折、ということはなるべく省けるようになっていると思います。
MySQL ON DUPLICATE KEY UPDATEを使って挿入と更新を同時に行う

MySQLの`ON DUPLICATE KEY UPDATE`句を使用すると、1つのクエリで挿入（INSERT）と更新（UPDATE）を同時に行うことができます。
この機能は特に大量のデータを効率的に処理する際に非常に有用です。

## 重要な注意点

**重要:** `ON DUPLICATE KEY UPDATE`を使用するには、対象のテーブルにユニーク制約またはプライマリキーが設定されている必要があります。
これらの制約がないと、重複を正しく検出できません。

## 基本的な使用方法

以下に、一般的な商品マスターテーブルを例にして、`ON DUPLICATE KEY UPDATE`の使用方法を説明します。

まず、以下のような商品テーブルを想定します：

```sql
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_code VARCHAR(50) UNIQUE,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    stock INT NOT NULL
);
```

この例では、`id`がプライマリキーで、`product_code`にユニーク制約が設定されています。

## 挿入と更新を同時に行う

以下のクエリを使用すると、新しい商品の挿入または既存商品の更新を1回の操作で行えます：

```sql
INSERT INTO products (product_code, name, price, stock)
VALUES ('A001', 'スマートフォン', 50000, 100)
ON DUPLICATE KEY UPDATE
    name = VALUES(name),
    price = VALUES(price),
    stock = stock + VALUES(stock);
```

このクエリの動作は以下の通りです：

1. `product_code`が'A001'の商品が存在しない場合、新しい行が挿入されます。
2. `product_code`が'A001'の商品が既に存在する場合、指定された列が更新されます。
   - `name`と`price`は新しい値で上書きされます。
   - `stock`は既存の在庫数に新しい値を加算します。

## 複数行の一括処理

複数の商品を一度に処理することも可能です：

```sql
INSERT INTO products (product_code, name, price, stock)
VALUES 
    ('A001', 'スマートフォン', 50000, 100),
    ('B002', 'ノートPC', 80000, 50),
    ('C003', 'ワイヤレスイヤホン', 15000, 200)
ON DUPLICATE KEY UPDATE
    name = VALUES(name),
    price = VALUES(price),
    stock = stock + VALUES(stock);
```

このクエリは、3つの商品を一度に処理します。各商品について、新規挿入または更新が行われます。

## 条件付き更新

特定の条件下でのみ更新を行いたい場合は、`IF`文を使用できます：

```sql
INSERT INTO products (product_code, name, price, stock)
VALUES ('A001', 'スマートフォン', 55000, 50)
ON DUPLICATE KEY UPDATE
    name = VALUES(name),
    price = IF(price < VALUES(price), VALUES(price), price),
    stock = stock + VALUES(stock);
```

この例では、新しい価格が既存の価格より高い場合のみ、価格が更新されます。

## まとめ

`ON DUPLICATE KEY UPDATE`を使用することで、MySQLでの挿入と更新の処理を効率化できます。
ただし、この機能を使用するには必ずユニーク制約またはプライマリキーが設定されている必要があることを忘れないでください。
適切に使用すれば、データベース操作の簡素化と高速化に大きく貢献します。
AWSのEC2を使って、Nodeサーバーを構築してみようpart2

今回はpart2ということで、part1で作成したEC2インスタンスへログインを行っていきます。
まだ、part1を読んでいない方は、[こちら](https://qiita.com/moeka-k0729/items/09eec46c6e855bfc3fe2)からご覧ください！
それではさっそくやっていきましょう！

# はじめに
今回はWindowsでSSHキーを用いてEC2インスタンスへのログインを行っていきます。

▼環境
* Windows PC
* Windows Powershell


# ログイン手順
▼ステップ1
Windows Powershellを管理者権限で開く。開くと下記のようなターミナルが表示されます。

![スクリーンショット 2024-11-14 153340.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/8b68ee9a-84a7-18c6-5b94-eb3d9724eff6.png)

▼ステップ2

以下のコマンドを実行する

**1. セキュリティ強化のためのコマンド**
秘密鍵ファイルなどの重要なファイルに対して、不要なアクセス権が他から継承されないようにする

```ssh
icacls "秘密鍵ファイルのパス" /inheritance:r
```

##### 詳しい意味
* `icacls`:
Windowsでファイルやフォルダーのアクセス権を表示、変更するためのコマンド。<br><br>  

* `"秘密鍵ファイルのパス"`:
[part1](https://qiita.com/moeka-k0729/items/09eec46c6e855bfc3fe2#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973)で作成した秘密鍵ファイルを指定(例: C:\path\to\privatekey.pem)<br><br>

* `/inheritance:r`:
継承されているアクセス権（親フォルダから受け継がれているアクセス権）を削除<br>

***
**2. 現在のユーザーに読み取り権限を付与するためのコマンド**
秘密鍵ファイルなどの重要なファイルに、他の不要なアクセス権を削除した上で、自分自身のみが読み取れるようにする

```ssh
icacls "秘密鍵ファイルのパス" /grant:r "$($env:USERNAME):R"
```

##### 詳しい意味
* `icacls`:
上記同様<br><br>  

* `"秘密鍵ファイルのパス"`:
上記同様<br><br> 

* `/grant:r`:
指定したユーザーへのアクセス権を「付与」し、他のアクセス権は削除<br><br>

* `"$($env:USERNAME):R"`:
現在ログインしているユーザー名を取得するPowerShellの変数<br>

***
**3. Windowsで指定されたファイルの所有権を現在のユーザーに変更するコマンド**
システム管理者や他のユーザーが所有しているファイルでも、自分の管理下に置くことができるため、ファイルのアクセス権を設定しやすくなる

```ssh
takeown /f "秘密鍵のファイルパス"
```

##### 詳しい意味
* `takeown`:
Windowsのコマンドで、ファイルやフォルダーの所有権を取得するコマンド<br><br>  

* `/f "秘密鍵のファイルパス"`:
/f は「file（ファイル）」の略で、特定のファイルを対象に指定<br>

***
**4. SSHを使ってAmazon EC2インスタンスにリモート接続するためのコマンド**
指定した秘密鍵を使って、EC2インスタンスのLinuxユーザー (ec2-user) としてログインする

```ssh
ssh -i"秘密鍵のファイルパス" ec2-user@"パブリック IPv4 DNS"
```

##### 詳しい意味
* `ssh`:
SSHプロトコルを使用してリモートマシンに接続するコマンド<br><br>  

* `-i "秘密鍵のファイルパス"`:
SSH接続に使用する秘密鍵ファイルを指定する<br><br>

* `ec2-user@`:
Amazon Linuxや一部のLinuxディストリビューションでEC2インスタンスにログインする際に使用するデフォルトのユーザー名<br><br>

* `"パブリック IPv4 DNS"`:
接続したいEC2インスタンスのパブリックIPv4 DNSを指定。AWSのEC2コンソールでインスタンスの「詳細情報」から確認できるパブリックDNS

![スクリーンショット 2024-11-14 161742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/44c6998a-0758-2ea8-0c72-7adde759bb25.png)<br><br>


最後のコマンドを実行すると、「Are you sure you want to continue connecting (yes/no/[fingerprint])?」と出てくるので、"yes"と入力する。

下記と同じように表示されたらログイン成功です！！

![スクリーンショット 2024-11-14 162212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935088/c769409d-6f12-802f-0ed7-bf689f0459fa.png)


# おわりに
今回は、自分のPCからEC2インスタンスにSSHで接続する方法を見ていきました。次回は、EC2インスタンスにNginxなどのソフトウェアをインストールしていきます。最後までお読みいただき、ありがとうございました！
Dockerイメージの取得先は？Docker Hubから他リポジトリまで

通常、イメージは**Docker Hub**から取得します。Docker Hubは、Docker公式が運営する**公開イメージのリポジトリ**で、一般的なイメージ（たとえば、MySQL、Nginx、Ubuntu、Node.jsなど）が数多く登録されています。

### Docker Hubとは
- **パブリックリポジトリ**として無料で利用でき、誰でもアクセスして利用可能なイメージが豊富にあります。
- **公式イメージ**（例：`mysql`、`nginx`など）や、コミュニティや個人が公開したカスタムイメージも数多く存在します。
- `docker pull`コマンドでDocker Hubからイメージをローカルにダウンロードし、`docker-compose.yml`でも直接指定できます。

#### Docker Hubからイメージを利用する方法
1. **直接指定**：`docker-compose.yml`で`image`にDocker Hubのイメージ名を指定します。
   ```yaml
   services:
     web:
       image: nginx:latest
   ```
2. **コマンドからダウンロード**：コマンドであらかじめローカルにイメージをダウンロードすることもできます。
   ```bash
   docker pull nginx:latest
   ```

### その他のリポジトリ
Docker Hub以外にも、企業が運営する**プライベートなDockerリポジトリ**（例：AWS ECR、Google Container Registry、GitHub Container Registry）もあります。これらからもイメージを取得できますが、設定が少し必要です。
Open Media VaultにSoftEther VPN経由でアクセスするには

## はじめに
Raspberry Pi上にOpen Media Vault 6をインストールして、SambaのNASを構築した後、宅外アクセスのためにSoftEther VPNと共存させようとしたら苦戦したので、備忘録として構築手順を書きます。

**環境**
- Raspberry Pi 4 Model B+ 4GB
- Raspberry Pi OS Lite bullseye 64bit
- Open Media Vault ver.6
- SoftEther VPN Server Ver 4.41, Build 9782 ARM 64bit

以下の手順は、Raspberry Pi OSのインストールやSSHの設定などが終わり、PiユーザーでSSHログインしている状態を前提としています。

## 1. パッケージの更新とbridge-utilsのインストール
```bash
sudo apt update && sudo apt upgrade -y
sudo apt install bridge-utils -y
```
## 2. Open Media Vault の導入
[GitHub](https://github.com/OpenMediaVault-Plugin-Developers/installScript), [omv-extras.org](https://wiki.omv-extras.org/doku.php?id=omv6:raspberry_pi_install)
```bash
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash
```

## Softether のインストール
安定板のダウンロードリンクをwgetでダウンロード

https://www.softether-download.com/ja.aspx?product=softether

```bash
wget <URL>
tar zxvf softether-vpnserver-xxxxx.tar.gz
```

ビルド
```bash
cd vpnserver
make
```

`/usr/local`にインストール
```bash
sudo mv ~/vpnserver /usr/local/
sudo chmod 700 /usr/local/vpnserver/vpnserver
sudo chmod 700 /usr/local/vpnserver/vpncmd
sudo ln -s /usr/local/vpnserver/vpnserver /usr/local/bin/vpnserver
sudo ln -s /usr/local/vpnserver/vpncmd /usr/local/bin/vpncmd
```

## tab_vlanの作成とSoftEther VPNのサービスファイル作成
SoftEther VPN 自動起動用にsystemdのserviceファイル作成
```bash
sudo vi /etc/systemd/system/vpnserver.service
```
```unit-file:vpnserver.service
[Unit]
Description=SoftEther VPN Server Service
After=network.target

[Service]
Type=forking
User=root
WorkingDirectory=/usr/local/vpnserver/
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
ExecStartPre=/sbin/ip link set dev eth0 promisc on
ExecStartPost=/bin/sleep 10 ; brctl addif br0 tap_vlan
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
```
```bash
sudo systemctl daemon-reload
sudo /usr/local/bin/vpnserver stop
sudo sytemctl enable --now vpnserver.service
```

## Open Media VaultとSoftEther VPNをブリッジ
1. open media vaultの設定から`br0`を作成
2. softether側からvlanを作成(`tap_vlan`になる)
3. 先ほど作った`vpnserver.service`の
    ```unit-file
    ExecStartPre=/sbin/ip link set dev eth0 promisc on
    ExecStartPost=/bin/sleep 10 ; brctl addif br0 tap_vlan
    ```
    によって次回のSoftEther VPN起動時に自動的に`br0`と`tap_vlan`がブリッジされる。

## 再起動すればつながる
```bash
sudo reboot
```
レポートの制限？

**使っているクラウドなどの小ネタ Advent Calendar 2024 6日目**

この集計ではすべてのレコードを並び替えることができません。検索条件を使用してレコード数を削減するか、この集計を削除してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3712536d-7467-ce15-ffc6-724312447ec7.png)

集計項目を14個にしたらこのエラーです

違いました... 詳細行をオンにしたらエラーでした。オフにすると表示されました。