OmniAICreator/Qiita-1.07M huggingface dataset:
アジャイル開発入門

## アジャイル開発とは

アジャイル開発は、柔軟性と迅速な対応を重視するソフトウェア開発手法です。従来のウォーターフォール型開発と異なり、アジャイル開発では以下の特徴があります。

1. **反復的な開発サイクル**: 短期間の開発サイクル（通常2〜4週間）を繰り返し、継続的に製品を改善します。
1. 
2. **顧客フィードバックの重視**: 各サイクルの終わりに顧客からフィードバックを得て、次のサイクルに反映します。

3. **変化への適応**: 要件の変更や新しい優先順位に柔軟に対応します。

4. **チーム協働**: 密接なコミュニケーションと自己組織化されたチーム運営を重視します。

## スプリントのルーティン

スクラムと呼ばれるアジャイル開発フレームワークでは、「スプリント」と呼ばれる短期間の開発サイクルを採用しています。典型的なスプリントのルーティンは以下の通りです。

1. **スプリントプランニング**
   - スプリントの目標設定
   - 作業項目の選択と見積もり

2. **デイリースクラム**
   - 毎日15分程度の短いミーティング
   - 進捗の共有と障害の特定

3. **スプリントレビュー**
   - 開発した機能のデモンストレーション
   - ステークホルダーからのフィードバック収集

4. **スプリントレトロスペクティブ**
   - チームのプロセス改善について議論
   - 次のスプリントに向けた改善策の決定

## チームメンバーのポジション

スクラムチームは通常、以下の3つの役割で構成されます。

1. **プロダクトオーナー**
   - 製品のビジョンを定義
   - プロダクトバックログ（やるべきことリスト）の管理
   - ステークホルダーとの連携

2. **スクラムマスター**
   - スクラムプロセスのファシリテーター
   - チームの障害物を取り除く
   - チームのパフォーマンス向上をサポート

3. **開発チーム**
   - クロスファンクショナルなメンバー（開発者、デザイナー、テスターなど）
   - 自己組織化されたチーム
   - スプリントの作業項目を実装

これらの役割が協力し合うことで、アジャイル開発の効果を最大化し、高品質な製品を迅速に提供することが可能となります。

以下、アジャイル開発の詳細について説明していきます。

## アジャイル開発の歴史

### 誕生の背景
1990年代、従来のウォーターフォール型開発手法では、以下のような問題が顕在化していました：
- 要件変更への対応が困難
- 開発期間の長期化
- 顧客ニーズとの不一致

### 重要な出来事
1. **1995年**: Scrum手法の発表
   - Jeff SutherlandとKen Schwaberによって提唱
   - ラグビーのスクラムからインスピレーション

2. **2001年**: アジャイルマニフェスト
   - 17名のソフトウェア開発者が集結
   - アジャイル開発の価値観と原則を定義
   - 軽量な開発手法としての確立

3. **2000年代以降**:
   - さまざまなアジャイルフレームワークの発展
   - 企業での採用拡大
   - DevOpsとの統合

## 2. アジャイル開発の4つの価値観

アジャイルマニフェストで示された4つの価値観

1. **プロセスやツールよりも個人と対話を重視**
   - 人間関係とコミュニケーションの重要性
   - チームの協力と信頼関係の構築

2. **包括的なドキュメントよりも動くソフトウェアを重視**
   - 実際に動作するソフトウェアの提供
   - 価値の早期実現

3. **契約交渉よりも顧客との協調を重視**
   - 顧客との継続的な対話
   - ニーズの理解と柔軟な対応

4. **計画に従うことよりも変化への対応を重視**
   - 柔軟な計画変更
   - 市場やニーズの変化への適応

## 3. アジャイル開発の12の原則

1. **顧客満足**
   - 価値のある製品の早期かつ継続的な提供
   - 顧客満足度の最優先

2. **要件変更の受け入れ**
   - 後半での変更も歓迎
   - 変更を競争力の向上に活用

3. **頻繁なデリバリー**
   - 2週間から2ヶ月の短い期間
   - 動作するソフトウェアの定期的な提供

4. **ステークホルダーとの協力**
   - 開発者とビジネス側の日常的な協力
   - 密接なコミュニケーション

5. **チームの信頼**
   - 意欲的な個人を中心にプロジェクトを構築
   - チームへの信頼と支援

6. **対面でのコミュニケーション**
   - 情報伝達の最も効率的な方法
   - チーム内の直接的な対話

7. **動くソフトウェア**
   - 進捗の主な尺度
   - 実際に動作する成果物の重視

8. **持続可能な開発**
   - 一定のペースを維持
   - 長期的な持続可能性

9. **技術的卓越性**
   - 優れた技術と設計の重視
   - 継続的な品質向上

10. **シンプルさ**
    - 最小限の作業量
    - 無駄の排除

11. **自己組織化**
    - チームによる自主的な組織化
    - 最適なアーキテクチャと設計

12. **定期的な振り返り**
    - チームの効率性の向上
    - 行動の調整と改善

## 4. アジャイル開発を選択する具体的な理由

### ビジネス面での利点

1. **市場投入までの時間短縮**
   - 早期のフィードバック獲得
   - 迅速な価値提供
   - 競争優位性の確保

2. **リスク管理の向上**
   - 早期のリスク発見
   - 小規模な失敗の許容
   - 継続的な軌道修正

3. **投資対効果（ROI）の向上**
   - 優先順位に基づく開発
   - 無駄な機能の削減
   - 資源の効率的な活用

### 技術面での利点

1. **品質の向上**
   - 継続的なテスト
   - 早期のバグ発見
   - 技術的負債の管理

2. **生産性の向上**
   - 効率的なプロセス
   - 自動化の促進
   - チームの集中力維持

3. **適応性の向上**
   - 要件変更への柔軟な対応
   - 新技術の導入しやすさ
   - 継続的な改善

### 組織面での利点

1. **チームの満足度向上**
   - 自己組織化による主体性
   - 達成感の獲得
   - スキル向上の機会

2. **透明性の確保**
   - 進捗の可視化
   - 問題点の早期発見
   - ステークホルダーとの信頼関係構築

3. **コミュニケーションの改善**
   - 頻繁な情報共有
   - チーム間の協力促進
   - 組織の一体感醸成

## まとめ

アジャイル開発は、その歴史、価値観、原則を通じて、現代のソフトウェア開発に革新をもたらしました。その選択には明確な理由があり、適切に実施することで、組織に大きな価値をもたらすことができます。

ただし、アジャイル開発の導入には、組織文化の変革や学習コストが必要となることも認識しておく必要があります。成功のためには、チーム全体がアジャルの価値観と原則を理解し、継続的な改善に取り組む姿勢が重要です。
【環境構築】  OpenSSL が見つかりません

新しい Mac（M1/M2）で Ruby というプログラミング言語を使おうとした時、
「OpenSSL が見つかりません」というエラーが出ました。

この記事では、その問題を解決した方法を紹介します:pencil:


#  前提条件
1. Macを使用していること
2. Homebrewが導入していること（パソコンにプログラムをインストールするためのツール）
3. rbenvがインストールされていること（Ruby のバージョンを管理するためのツール）
4. ターミナルを使用（もしくはiTerm）


## 今回のエラー
環境構築でruby-3.3.4をインストールしようとしたらエラーになった。
```
rbenv install 3.3.4  //バージョンを指定してRubyをインストール
```
「OpenSSLライブラリが見つかりません。」とエラー
```
OpenSSL library could not be found. 
You might want to use --with-openssl-dir=<dir> option to 
specify the prefix where OpenSSL is installed.
```


# 解決方法:bulb:
### 1. 古いOpenSSLをアンインストール
:::note info
OpenSSLとは、インターネットで安全に通信するためのツール。
分かりやすく説明すると、インターネットで手紙を送るようなもの。
普通の手紙だと、鍵が掛かっていないため、誰かに中身を見られる可能性が:smiling_imp:
でもOpenSSLを使うと、手紙を「秘密の箱」に入れて、鍵をかけて送信。
正しい鍵を持っている受信者だけが箱を開けられるので、安全:closed_lock_with_key:
:::
まず、古い OpenSSLをアンインストールして、新しくインストールし直す。
ターミナルで以下のコマンドを順番に実行
```bash
# 古い OpenSSL をアンインストール
brew uninstall --ignore-dependencies openssl@3

# 設定ファイルも消す（※パスワードを聞かれたらPC立ち上げ時のパスワードを入力）
sudo rm -rf /usr/local/etc/openssl@3

# 新しい OpenSSL をインストールする
arch -arm64 brew install openssl@3
```


### 2. 環境変数を設定
:::note info
環境変数とは、コンピュータへの「道案内」のようなもの。
コンピュータが動くときに「どこに必要なファイルがあるか」や「どう動いてほしいか」を教えるもの。
今回は、コンピュータに「OpenSSLがどこにあるか」を教えるために設定する！
これがないと、コンピュータはOpenSSLを見つけられず、Rubyが正しく動かない。
:::

以下の設定を ~/.zshrc というファイルの最後に追記

```bash
# Ruby が OpenSSL を見つけられるようにする設定
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local/opt/openssl@3"
export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@3/include"
export PKG_CONFIG_PATH="/usr/local/opt/openssl@3/lib/pkgconfig"
export PATH="/usr/local/opt/openssl@3/bin:$PATH"
```


設定を追加したら、以下のコマンドで設定を有効化
```bash
source ~/.zshrc
```

### 3. Ruby をインストールしよう
最後に、Ruby をインストール
以下のコマンドを実行：

```bash
RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local/opt/openssl@3" arch -x86_64 rbenv install 3.3.4
```



## うまくいかないときは？
以下のコマンドを実行して確認してみよう
1. Homebrew が最新か
   ```bash
   brew update
   ```
2. rbenv が最新か
   ```bash
   brew upgrade rbenv ruby-build
   ```
3. 環境変数で設定がした内容が正しく読み込まれているか
   ```bash
   source ~/.zshrc
   ```

## 覚えておくと便利なこと:writing_hand:
- Rubyをインストールする時に、「arch -x86_64」をつけて実行するといい！
:::note info
「arch -x86_64」とは・・新しいMac（M1/M2チップ）でも、古いIntel用のソフトウェアを動かすための命令。RubyやOpenSSLのようなツールは、もともとIntelチップ用に作られている。新しいMac（M1/M2チップ）でそのまま動かそうとすると、うまく動かないことがあるため「arch -x86_64」をつけてインストールすると:thumbsup:
:::

- インストールが終わったら、以下のコマンドで使いたいRubyのバージョンを指定できます：
  ```bash
  rbenv global 3.3.4  # コンピュータ全体で使うバージョンを設定
  # または
  rbenv local 3.3.4   # 今いるフォルダだけで使うバージョンを設定
  ```


# 最後に
自分用に記事を作成してみた。
エラーが出た時に「何が原因かわからない」と焦るのではなく、仮説を立ててとにかく手を動かすことが
大切だと学んだ。chatgptを活用すればある程度解決できると感じた。
inplace_vector が constexpr になる条件

C++26に向けて提案されている`std::inplace_vector` ([P0843R14](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p0843r14.html)) を自作ライブラリに実装しました。

https://github.com/shibainuudon/HamonCore/blob/main/libs/inplace_vector/include/hamon/inplace_vector/inplace_vector.hpp

この記事では、実装する過程で気付いたことをシェアしようと思います。

---

inplace_vectorは全てのメンバ関数が`constexpr`指定されていますが、P0843R14には次のように記載されています。

>For any N > 0, if `is_trivial_v<T>` is false, then no `inplace_vector<T, N>` member functions are usable in constant expressions.

つまり型`T`がトリビアル型でない場合、`inplace_vector<T, N>`の全てのメンバ関数は`constexpr`にならないということです。これは一体どういうことでしょうか。

---

inplace_vectorを素直に実装すると次のような構造になります。

```cpp
template <typename T, size_t N>
class inplace_vector
{
    size_t m_size;
    T m_value[N];

    constexpr T* data() { return m_value; }
};
```

この実装は`T`が`int`や`float`のようなスカラー型のときは問題ありません。

しかし、例えば`T`がデフォルト構築可能でない場合、`inplace_vector<T, N>`をインスタンス化しようとするとコンパイルエラーになります。`T`の型によらず、`inplace_vector`はデフォルト構築可能であってほしいので、これはまずいです。

また、デフォルトコンストラクタやデストラクタをユーザー定義している場合、`inplace_vector`をデフォルト構築しただけでそれらの処理がN回呼び出されてしまいます。これはパフォーマンス上の問題となり得ます。

つまり、「`T`がトリビアルにデフォルト構築可能かつトリビアルに破棄可能」でない場合、上記の実装では問題があります。

そこで、そういう場合は`sizeof(T) * N`が収まるだけのバッファを確保し、そのバッファに`T*`としてアクセスできるようにします。

```cpp
template <typename T, size_t N>
class inplace_vector
{
    size_t m_size;
    alignas(T) char	m_value[sizeof(T) * N];
    
    T* data() { return reinterpret_cast<T*>(&m_value[0]); }
};
```

そして、`is_trivial_v<T>`が`true`かどうかで実装を分岐するようにします。

```cpp
// T がトリビアル型のとき
template <typename T, size_t N, bool = is_trivial_v<T>>
class inplace_vector_base
{
    size_t m_size;
    T m_value[N];

    constexpr T* data() { return m_value; }
};

// T がトリビアル型でないとき
template <typename T, size_t N>
class inplace_vector_base<T, N, false>
{
    size_t m_size;
    alignas(T) char	m_value[sizeof(T) * N];
    
    T* data() { return reinterpret_cast<T*>(&m_value[0]); }
};

template <typename T, size_t N>
class inplace_vector : inplace_vector_base<T, N>
{
    // (省略)
};
```

これで、`T`がトリビアル型でない場合でもインスタンス化できるようになります。その代償として、バッファの取得の部分で`reinterpret_cast`を使っているため、`constexpr`ではなくなります。これが冒頭に紹介した制限の正体です。

---

`T`がトリビアル型でない場合でも`constexpr`にできるように、[P3074R5](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3074r5.html)が提案されています。
この中では未初期化の領域を`constexpr`で使えるようにするための方法が何種類か検討されていますが、いずれにせよ言語機能の変更が必要となっています。

P3074R5が採用されるまでは、条件付きの`constexpr`で我慢するしかなさそうです。
iphoneからリモートデスクトップ

# iPhoneからWindows Remote Desktopを使う
Windows app mobileというリモートデスクトップクライアントを使うと、ネット上にあるWindowsサーバーやWindows365またはローカルのWindowsPCやLinuxでもxrdpが入っていればリモートデスクトップにアクセスできます。

https://apps.apple.com/jp/app/windows-app-mobile/id714464092

# 例えばローカルのWindowsPCに接続するには
１．下記の画面の右にある＋をタップして
２．メニューからPCタップ
３．PC名に
　　Windowsホスト名.local
　　を入れる。
  ４．保存で保存する
ローカルネットワーク上のWindows PCにアクセスする場合
![IMG_0133.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529369/03e82d26-33e7-5bab-a59e-49a9ef5c1820.png)

５．作った接続を選んでユーザー名とパスワードを入力すればつながる。

# ネット越しでPCにアクセスするならば・・・
リモートデスクトップポート３３８９をルーターで開放すればいけるはず。
ただし、割り当てられているIPを調べる必要があるので・・・
ddo.jpなどのダイナミックDNSを使うべきだろう。
【これを読めば分かる】5G・IoTと「MEC」の基礎と実践 - AWS Wavelengthで構築してみた

## 1. はじめに

最近では、IoTや自動運転、メタバースなどで「5G」が注目を集めていますね。
その中でも「MEC (Multi-access Edge Computing)」は、5Gネットワークの分散処理技術として重要な役割を持っています。
本記事では、5G・IoTとMECについて分かりやすく解説します！
また、次記事では実際にAWSを使ってエッジサーバーを構築します！
[AWS Wavelength構築については、こちら](https://qiita.com/shun8747/items/3560fe1662018030b846)


## 2. 電波の性質

### 各周波数の使用用途と伝搬特性
- **携帯電話は極超短波**(一部マイクロ波)
- **周波数が高いほど電波は直進的に飛び、障害物の影響(反射)を受けやすい**
→低周波の方が広範囲に遠くまで届く
- **周波数が高いほど、伝送できる情報量が多い**
→周波数=1秒当たりの波の数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/3fe59492-3c7c-ac30-779c-d70e3e0563cb.png)

## 2. 5Gの基礎

### 5Gとは？　LTE(4G)との違い
5Gは「第5世代移動通信システム」であり「5th Generation」の略称です。2020年に商用化され、以下のような特徴を持っています。

- **高速大容量** ：4Gと比較して速度が10倍以上
- **低遅延** ：速度の必要なアプリケーションに有用
- **同時多接続** ：デバイスの接続数を増加
<p style="text-align: center;">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/6cba82ff-179c-029d-508b-93036c95e0ef.png" 
       alt="5G.png" 
       width="250">
</p>

**5Gの欠点**
届く範囲が狭く、多くの基地局が必要
      →なので5GとLTE(広範囲で届く)の併用が必要です

### 5Gを実現する技術
- **広帯基準の引き上げ**
- **高周波帯の活用**
- **高度な伝送技術**：ビームフォーミング、Massive MIMO
<br>

![MIMO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/44b7ba95-5ba2-a772-59c0-c72f93d1c04b.png)

## 3. MEC(Multi-access Edge Computing)とは何か
MECは「エッジコンピューティング技術」の一つで、デバイスの近くにサーバーを分散配置することで低遅延を実現します。

### MECのメリット
![MEC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998881/8194bfb9-1708-640f-2ec0-22349feb1dc7.png)

---
「エンジニアリングマネージャーの仕事」を読んで　その1

## はじめに
James Stanier著「エンジニアリングマネージャーの仕事」を読んで私が印象に残ったことをメモがわりに、少しずつアウトプットします。

https://www.oreilly.co.jp/books/9784873119946/

## 1章 新たな冒険
チーム全員および上司との1on1を通じて課題感を把握し、「自分の見解」「チームの見解」「上司の見解」のそれぞれの円を重ね合わせたベン図で考える。
- 全ての円の重なり：認識の一致
- 「自分の見解」と「チームの見解」の重なり：上に対するコミュニケーションが不足
- 「自分の見解」と「上司の見解」の重なり：下に対するコミュニケーションが不足
- 「チームの見解」と「上司の見解」の重なり：誤った思い込み

その課題が正しいかどうかというより、課題認識のずれの多くはコミュニケーションに起因していることが説かれている。分かりみが深い。
TwilioのSMS APIを実装する前に知っておきたい料金について

# まずTwilioでSMSを送信するために
TwilioでSMSを送信するには、Twilio上で販売されている電話番号を取得する必要があります。アメリカや日本などの国ごとに番号があり、月額で提供されています。

#### 日本の番号には落とし穴が…
日本の番号も提供されていますが、**SMS対応のものがありません**。東アジア内の番号も探しましたが見つからず、最終的に**アメリカの番号を使用**することになりました。

アメリカの番号は**月額約170円**で取得できますが、**日本の携帯へSMSを送ると、料金が高くなる** という問題が発生しました。

2025年1月30日時点の料金は以下の通りです。


| 文字数 | 値段 |
|------|------|
| 約100文字  | 30円前後 |
| 約300文字  | 65円前後 |

このように日本国内での運用を考えると**コスト面で課題**がありました。

# Twilioは手軽に導入できるが…
Twilioは簡単にAPIを繋ぎ込める便利なサービスです。
初心者でも実装しやすく、「たまにSMSを送る程度」なら十分使えると思います。

ただ、SMSをメインで使う場合は日本の番号で送信したいですね。

今回は深く調査していませんが、他のSMSサービスについても比較検討する価値がありそうです。もしおすすめのSMS送信サービスがあれば、教えていただきたいです。

# まずはGUIから試すのもアリよりのアリ
APIの実装後に気づいたのですが、Twilioでは GUIからもSMSを送信ができます
無料アカウントでも約2000円分のデポジットがあるので、まずは試してみるのがおすすめです！

サイドメニューにありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3993266/6f1217b8-6ac6-6b85-dea1-a2022a17d313.png)
ルーレットの赤黒をモンテカルロ法でプレイするシミュレーション

![qiita-1280-720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998847/6aa6dc06-df8a-bbf5-cd8a-13e1df425ca3.png)


ルーレットで、赤（ルージュ）もしくは、黒（ノワール）にチップを張る賭け方は最もシンプルで、ギャンブルの知識がない人にも知られているメジャーなベット方法です。

今回は「モンテカルロ法」を使用してルーレットの赤黒をシミュレーションし、その結果を検証するプログラムを作成します。

## モンテカルロ法とは？

モンテカルロ法（Monte Carlo Method）は、確率や統計を用いて問題を解く方法のひとつで、19世紀後半、モナコのモンテカルロにあるカジノが破られたという伝説が名前の由来になっているベッティングシステムです。

ルーレットにおいては、以下のルールで賭けを行います。

1. 初期リストとして `[1, 2, 3]` を用意する
2. ベット額はリストの最初と最後の数値の合計とする（最初は `1 + 3 = 4`）
3. 勝った場合：ベット額を獲得し、リストの最初と最後の数値を削除する
4. 負けた場合：ベット額をリストの末尾に追加する
5. リストが空になったらゲーム終了

## Pythonでのシミュレーションプログラム

```python
import random

def spin_roulette():
    """ルーレットを回して赤（1）か黒（0）を返す（緑の0は負けとする）"""
    outcome = random.randint(0, 37)  # 0から37（0と00を含む）
    return 1 if 1 <= outcome <= 18 else 0 if 19 <= outcome <= 36 else -1

def monte_carlo_roulette(initial_list, max_rounds=100):
    """モンテカルロ法でルーレットの赤黒をプレイするシミュレーション"""
    numbers = initial_list[:]
    balance = 0
    rounds = 0
    
    while numbers and rounds < max_rounds:
        bet = numbers[0] + numbers[-1] if len(numbers) > 1 else numbers[0]
        outcome = spin_roulette()
        
        if outcome == 1:  # 勝ち
            balance += bet
            numbers.pop(0)
            if numbers:
                numbers.pop(-1)
        else:  # 負け（黒または緑）
            balance -= bet
            numbers.append(bet)
        
        rounds += 1
        print(f"Round {rounds}: Bet {bet}, Outcome {outcome}, Balance {balance}, Numbers {numbers}")
        
    return balance

# シミュレーション実行
initial_list = [1, 2, 3]
final_balance = monte_carlo_roulette(initial_list)
print(f"最終残高: {final_balance}")
```

## シミュレーション結果の考察

このシミュレーションを複数回実行すると、以下のような傾向が見られます。

- 勝ちが続くとリストが短くなり、最終的にはゼロになって終了する
- 負けが続くとリストがどんどん長くなり、ベット額が増加する
- ルーレットの緑（0や00）の影響で思ったよりも負けやすい

モンテカルロ法は連勝時には有利に働きますが、負けが続くとリストが長くなり、破産リスクが高まります。
そのため、実際に使用する際には、状況判断によるロスカット（損切り）や、資金管理が重要になります。

## まとめ

モンテカルロ法を使用したルーレットの赤黒ベットは、シンプルな戦略ながらも、勝敗によって変化するベット額が特徴的です。
勝ちが続けばスムーズに利益が得られる一方で、負けが続くと賭け金が増大し、リスクが高まるという側面もあります。

このようなベッティングシステムのシミュレーションは、単なるギャンブル戦略の検証にとどまらず、確率や統計、シミュレーション技術の学習にも役立ちます。
また、Pythonを用いたアルゴリズムの実装やデータ分析の練習としても有益です。  

今後の発展としては、  

- 最大ベット額を制限し、リスク管理を強化する
- 長期的な収益率を分析し、期待値の推移を可視化する
- より高度な戦略（マーチンゲール法など）と比較し、最適な手法を検討する

といった視点で改良を加えるのも面白いでしょう。  

シミュレーションの世界は奥が深く、試行錯誤する中で新たな発見があるかもしれません。
ぜひ、カスタマイズしながらさまざまなアプローチを試してみてください！
lispxmpをactive regionのみで実行できるようにした

Emacs Lisp 式の値を`; =>`というコメントをつけた部分に自動注釈する[lispxmp](https://github.com/rubikitch/lispxmp)というパッケージがあります。

作者のrubikitch氏のブログに詳しいです。

https://rubikitch.hatenadiary.org/entry/20090313/lispxmp


デフォルトではbuffer全体が対象ですが、regionがactiveなときはregion内でだけ実行するように機能を追加しました。

```emacs-lisp
(defun lispxmp ()
  "Annotate value of lines containing `; =>' in the current buffer.
If a region active, annotate only in the region."
  (interactive)
  (save-restriction
      (when (region-active-p)
        (narrow-to-region (region-beginning) (region-end)))
      (let ((pt (point)) (wstart (window-start (selected-window))))
        (lispxmp-create-code (current-buffer))
        (delete-region (point-min) (point-max))
        (insert-buffer-substring lispxmp-temp-buffer)
        (unwind-protect
            (if debug-on-error
                (eval-buffer)
              (condition-case err
                  (eval-buffer)
                (error
                 (ding)
                 ;; next action when error
                 (run-with-timer 0 nil 'message "Error in eval: %S" err))))
          (lispxmp-create-annotations (current-buffer) lispxmp-results)
          (goto-char pt)
          (set-window-start (selected-window) wstart)))))

```

以下で公開しています。
- https://github.com/fenril058/lispxmp/blob/develop/lispxmp.el

他にも
- `cl`から`cl-lib`への変更
- `defadvice`から`advice-add`への変更

など動作に変更はない部分での、新しいversionへの対応をしています（とはいえこういう対応をしなくても動くのがEmacsの素晴らしいところではありますよね）。

2025-02-08追記
`save-excursion`では戻りきれていなかったので、元々の実装にならって修正しました。
Hexagonal Architecture


## **ヘキサゴナルアーキテクチャ (Hexagonal Architecture)**
アーキテクチャは「内部」と「外部」という概念に基づいて、各レイヤーで行っていた役割を分け、別々のインターフェースを定義します。
「アダプター」と「ポート」という用語を使用します。

### **内部と外部**
- **内部のロジック**は、必ず**外部**を通じてアクセスされます。
  - 外部システムとの直接的な相互作用は「アダプター」が担当します。
  - 各サービスでビジネスロジックに基づいて定義されたインターフェースは「ポート」です。
  - 外部サービスとの相互作用（アダプター）は、ビジネスロジックと通信するために定義されたインターフェース（ポート）とだけ通信します。

---

## **アダプターとポート**

### **アダプター**
アダプターは、サービスの観点から、サービスが使用する外部システムとの直接的な実装や相互作用を処理します。
- **インバウンドアダプター**：ユーザーの入力や外部システムからの呼び出しを受け、アプリケーションの内部サービス（ビジネスロジック）に渡す役割を担います。
- **アウトバウンドアダプター**：内部サービスがデータベース、API、メッセージキューなどと接続するインターフェースの役割を担います。

### **ポート**
ポートは、ビジネスロジックの観点からアダプターと通信するための操作を定義したインターフェースです（実装はありません）。
- **インバウンドポート**：アプリケーションが外部からのリクエストを処理するインターフェースで、ユーザーのリクエストを処理するビジネスロジックの入り口です。
- **アウトバウンドポート**：アプリケーションが外部システム（データベース、APIなど）と通信するためのインターフェースで、ビジネスロジックが外部システムと通信する際に使用するインターフェースです。

---

## **まとめ**

| 概念            | 役割 | 例 |
|----------------|------|----|
| **インバウンドポート** | アプリケーションが処理すべき機能（ユースケース）を定義するインターフェース | `OrderUseCase` |
| **インバウンドアダプター** | 外部からのリクエストをポート（ユースケース）に渡す | `OrderController` |
| **アウトバウンドポート** | ビジネスロジックが外部システムと通信するためのインターフェース | `OrderRepository` |
| **アウトバウンドアダプター** | ポートが呼び出す実際の実装（DB、APIなどとの接続） | `OrderRepositoryImpl` |

---

## **アダプターを通じて外部サービスとの依存を分離**  
- 外部サービスとの依存関係を分離することで、サービスはいつでも外部システムを簡単に交換でき、柔軟で拡張性の高い対応が可能になります。

## **ポートを通じて内部ビジネスロジックとインターフェースを分離**  
- 内部ロジックの実装はインターフェースに依存せず、インターフェースを通じてのみ外部サービスと通信できるため、内部ロジックは柔軟に開発できます。

---

## **柔軟性と拡張性**  
Hexagonal Architectureは、特に**マイクロサービスアーキテクチャ（MSA）環境**において非常に適したソフトウェアアーキテクチャです。
これにより、各サービスが独立して動作し、外部サービスの変更や追加が簡単に行えます。
docker network

```shell
docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
ee643ce49c3b   bridge    bridge    local
d2a4d048afc3   host      host      local
5d2801215991   none      null      local
```

```shell
docker network create docker-kafka-net

# 6c8d49636d20d3a8fa4978dc31865a084e269 
```
macOSシステム設定：デフォルトシェルを Bash にする

### まだ、bash が使いたい人向け

- 現在のシェルを確認
`% echo $SHELL`
```
/bin/zsh
```

- 使用可能なシェルを確認
`% cat /etc/shells`
```
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

- デフォルトシェルを bash に変更
`% chsh -s /bin/bash`

新しくログインすると確認できるよ。

-「The default interactive shell is now zsh.」のメッセージを消す
`$ echo "export BASH_SILENCE_DEPRECATION_WARNING=1" >> ~/.bash_profile`
Go言語学習メモ（part1）

Go言語をゼロから学んでおりその学習メモです。
タイトルに「Part1」とつけましたが、続きを書くかは分かりません。

## Goのインストール
下記はMacでHomebrewを使ってインストールする方法です。
```
brew install go

go version
go version go1.23.5 darwin/arm64

which go
/opt/homebrew/bin/go

```
- サードパーティのモジュールやパッケージは`$GOPATH`ディレクトリの下にダウンロードされる
- コマンドは`$GOPATH/bin`配下にインストールされる
- `$GOPATH`はデフォルトではホームディレクトリ配下の`go`ディレクトリを指しています

## Goコマンド
### go run
- `go run`コマンドを使うと、Goのプログラムをインタプリタ言語のスクリプトのように扱うことができる
```go:hello.go
package main

import "fmt"

func main() {
	fmt.Println("Hello, world")
}
```
```shell
go run hello.go
Hello, world
```

`go run`の裏側では以下のような処理が行われる。

1. `go run`でバイナリファイルがビルドされ、一次ディレクトリに置かれる
1. そのファイルを実行する
1. プログラムの終了後、そのファイルが削除される

### go build
- 再利用できるように実行形式のバイナリファイルを作りたい場合は`go build`コマンドを使う。

- `go build`を実行すると`hello`という実行形式ファイルが同じディレクトリに生成される。
```
go build hello.go 
ls -l
total 4392
-rwxr-xr-x  1 kazunori  staff  2242786  1 18 17:38 hello
-rw-r--r--  1 kazunori  staff       73  1 18 17:26 hello.go
```
これを実行すると「Hello, world」が表示される
```
./hello
Hello, world
```
バイナリファイルのファイル名や保存場所を変更したい場合は`-o`オプションを使う
```
go build -o hello_world hello.go
ls -l
total 8776
-rwxr-xr-x  1 kazunori  staff  2242786  1 18 17:38 hello
-rw-r--r--  1 kazunori  staff       73  1 18 17:26 hello.go
-rwxr-xr-x  1 kazunori  staff  2242786  1 18 17:43 hello_world
```

### go mod
- Goの「モジュール」という機能を使うことができる。

```
// プロジェクトのディレクトリを作成
mkdir hello_world

// モジュールを初期化
cd hello_world
go mod init hello_world
go: creating new go.mod: module hello_world

// `go.mod`というファイルができている
ls -l
total 8
-rw-r--r--  1 kazunori  staff  30  1 18 17:49 go.mod

// `go.mod`のファイルの内容を確認
cat go.mod 
module hello_world

go 1.23.5

```
- `go.mod`ファイルがあるとそのディレクトリに置かれた`.go`ファイルを解析してコンパイルしてビルドしてくれる
- そのため、`go build`コマンドの引数にファイル名を指定する必要がない
```
./hello_world 
Hello, world
```

### go install
- Goのプログラムはソースが公開されていて、それを`go install`コマンドでインストールできる
```
go install github.com/rakyll/hey@latest
go: downloading github.com/rakyll/hey v0.1.4
go: downloading golang.org/x/net v0.0.0-20181017193950-04a2e542c03f
go: downloading golang.org/x/text v0.3.0
kazunori@mba-2 chapter-1 % 
kazunori@mba-2 chapter-1 % ls /Users/kazunori/go/bin              
gopls           hey             staticcheck
```
- コマンドを実行すると、そのツールのダウンロードとコンパイルを行い`$GOPATH/bin`の下にインストールする


Part1 以上
yoloで物体検知をやってみる

# あいさつ
Qiita初投稿になるためどんな感じかわかりませんが、先人の真似をとりあえずしていこうと思います。普段はバックエンド中心のWebエンジニアでpythonとRustを使っています。たまにNextjsでフロントエンドもするぐらいです。  
エンジニアとしては、もう少しで2年になるペーペーです。お手柔らかにお願いいたします。
ちなみに最近初のmacosとなるMac miniを買いました。今までWindows一筋だったので、キー配置が違和感でしかありません。

# はじめに
今働いている会社は物体検知とかもするにも関わらず私はやったことありません。なのでどんなもんかと思いやってみようと思います。
全くわからないと言いつつYoloというのは聞いたことがあります。最新はYolo11なのでそちらを使ってみようと思います！

https://docs.ultralytics.com/ja/models/yolo11/

# 環境
私の環境はこんな感じでやります。

| 項目  | 詳細 |
|------|------|
| **OS** | macOS 15.2 |
| **CPU** | Apple M4 Pro |
| **メモリ** | 24 GB |
| **GPU** | Apple M4 Pro (16コア) |

<br>

| 項目  | 詳細 |
|------|------|
| **Python バージョン** | 3.12.8 |
| **バージョン管理ツール** | uv |

Rustも使っていることもありuvに溺愛しています。

# いざ物体検知！

まずは環境構築と必要なもののinstall。
```bash
uv init yolo-test
uv python install 3.12
uv python pin 3.12
uv add ultralytics opencv-python
```
やっぱ少ないコマンドで諸々セットアップできるの最高。

ちなみに3.13.1tでinstallしようとしたらエラーでました。

copilotの力を使ってコードを書いてみる。

```py:main.py
import cv2
from ultralytics import YOLO

def main():
    
    model = YOLO("yolo11n.pt")
    
    # set the input and output video paths
    input_video_path = "data/input_video.mp4"
    output_video_path = "data/output_video.mp4"
    
    # read the input video information
    cap = cv2.VideoCapture(input_video_path)
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
    print(f"video information: fps={fps}, width={width}, height={height}")
    
    # create the output video writer
    out = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
    
    # read the video frame by frame
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        
        # rotate the frame
        frame = cv2.rotate(frame, cv2.ROTATE_180)
        
        # detect objects in the frame
        result_list = model(frame)
        
        # draw the bounding boxes
        for result in result_list:
            frame = result.plot()
        
        # write the frame to the output video
        out.write(frame)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        
    cap.release()
    out.release()
    
    print("Done!")

if __name__ == "__main__":
    main()

```

動画が勝手に反転するので、直す処理を入れている。
```py
# rotate the frame
frame = cv2.rotate(frame, cv2.ROTATE_180)
```

あとはinputの動画を準備する。ちょうどスマホに愛犬とルンバの戦いがあったのでそれを使う。

いざ実行してみると、、、
```bash
uv run main.py
video information: fps=30, width=1280, height=720

0: 384x640 1 dog, 24.8ms
Speed: 1.4ms preprocess, 24.8ms inference, 0.6ms postprocess per image at shape (1, 3, 384, 640)

0: 384x640 1 person, 1 dog, 18.0ms
Speed: 0.7ms preprocess, 18.0ms inference, 0.3ms postprocess per image at shape (1, 3, 384, 640)

```
動いている！

![output_video_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722589/70052756-e62f-3e45-3fab-2ae2f72a6728.gif)

ルンバはボウルと判別されるんだな🧐

# 最後に
以外と簡単だった。いつかペットカメラにして寝てる時間とか計測したいなと思っています。
これからも適度に投稿しようかなと思うのでよろしくお願いいたします！（もっとためになるものを投稿したい！）
週１ぐらいで投稿しようかな！
【備忘録】Reactのディレクトリ構成

## 小規模プロジェクト向け
```
src/
│── components/      # 再利用可能なUIコンポーネント(ボタン、フォームなど)
│── pages/           # ルーティングごとのページコンポーネント(Home.tsx,About.tsxなど)
│── hooks/           # カスタムフック(useAuth.ts,useFetch.tsなど)
│── utils/           # ユーティリティ関数(日付フォーマット、APIリクエスト処理)
│── assets/          # 画像・スタイル・フォント(画像やCSSファイルをまとめる)
│── App.tsx
│── main.tsx         # エントリーポイント
```
スプレッドシートの最後の行にスクロールさせて登録データが見えるようにしたい

最後の行のセルを選択するというのは出たのですが、
データ登録をするとデータが一番下に登録されていくのですが、
本当に登録できたかな？？というのがやはり使っていると気になります。

検索すると最後の行に飛ぶというのは結構出てきて
カーソルだけは飛んでくれるのですが、
スクロールがされないので画面で見えないんです。

登録行のセルをアクティブにしたいわけではなく、
最後の行が見えるようにスクロールさせたいのです。

こちらでを参考にさせて頂きて、やっと出来ました。

https://qiita.com/ringCurrent/items/d2524fe32154e876b9a4

最終行の１つ下だと登録行が画面の結構下の方に行ってしまうので、
思いきって、登録行の１０行下まで飛ばしたら登録したデータが見やすくなりました。

こちらを登録処理の最後に呼び出すようにしました。

```
function arrive_insertPoint(targetsheet) {

  var lastRow = targetsheet.getLastRow(); 
  var activeRow = lastRow+10;
  var range = targetsheet.getRange("A"+activeRow.toString());
  range.activate();
}
```
【Pybulletサンプル解説】指定したオブジェクトを生成する【createVisualShape.py】

お疲れ様です。秋並です。

Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです（一覧は[こちら](https://qiita.com/akinami/items/7b433b60aeb5115ba4d7)）。

<br>

今回は、createVisualShape.pyを解説します。（コードのリンクは[こちら](https://github.com/bulletphysics/bullet3/blob/master/examples/pybullet/examples/createSphereMultiBodies.py)）

本コードを実行すると、アヒルのオブジェクトが生成されます。

![createVisualShape.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/c76d55e8-5697-fb3b-a852-e9cf7790b2df.gif)

<!--
# 使用している機能
本コードは、以下の機能を使用して「」を実現しています。


## 
`` 関数を使用することで、できます。

```python

```

-->

# コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります（もともとあった不要と思われるコメント等については削除しています）

```python
import pybullet as p  # PyBulletをインポート
import time  # 時間制御のためのtimeモジュール
import math  # 数学的な計算のためのmathモジュール
import pybullet_data  # PyBulletのデータパスを利用するためのモジュール

# 共有メモリに接続を試みる
cid = p.connect(p.SHARED_MEMORY)
if (cid < 0):  # もし共有メモリへの接続に失敗した場合
  p.connect(p.GUI)  # GUIモードでPyBulletに接続

# 追加のデータパスを設定（URDFなどのデータを取得するため）
p.setAdditionalSearchPath(pybullet_data.getDataPath())

# 物理エンジンのパラメータを設定（ソルバーの反復回数を10回に設定）
p.setPhysicsEngineParameter(numSolverIterations=10)

# シミュレーションのタイムステップを設定（1/120秒ごとに更新）
p.setTimeStep(1. / 120.)

# シミュレーションのプロファイルログを開始
logId = p.startStateLogging(p.STATE_LOGGING_PROFILE_TIMINGS, "visualShapeBench.json")

# 最大座標系を使用して平面のURDFモデルを読み込む（計算が高速になる）
p.loadURDF("plane100.urdf", useMaximalCoordinates=True)

# 描画を無効化してオブジェクトの作成を高速化
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING, 0)
p.configureDebugVisualizer(p.COV_ENABLE_GUI, 0)

# CPUレンダラー（TinyRenderer）を無効化
p.configureDebugVisualizer(p.COV_ENABLE_TINY_RENDERER, 0)

# 3Dモデルの位置シフトとスケールを設定
shift = [0, -0.02, 0]  # 位置オフセット
meshScale = [0.1, 0.1, 0.1]  # メッシュのスケール

# 3Dモデルの視覚的な形状を作成
visualShapeId = p.createVisualShape(
    shapeType=p.GEOM_MESH,
    fileName="duck.obj",  # アヒルの3Dモデル
    rgbaColor=[1, 1, 1, 1],  # 色（白）
    specularColor=[0.4, .4, 0],  # 反射の色
    visualFramePosition=shift,  # 視覚的な位置
    meshScale=meshScale  # スケール
)

# 3Dモデルの衝突判定用形状を作成
collisionShapeId = p.createCollisionShape(
    shapeType=p.GEOM_MESH,
    fileName="duck_vhacd.obj",  # 衝突判定用の簡略化された3Dモデル
    collisionFramePosition=shift,  # 衝突形状の位置
    meshScale=meshScale  # スケール
)

# 配置するオブジェクトの範囲（X軸方向、Y軸方向の数）
rangex = 1
rangey = 1

# 指定した範囲でオブジェクトを配置
for i in range(rangex):
  for j in range(rangey):
    p.createMultiBody(
        baseMass=1,  # 質量
        baseInertialFramePosition=[0, 0, 0],  # 慣性フレーム位置
        baseCollisionShapeIndex=collisionShapeId,  # 衝突形状のID
        baseVisualShapeIndex=visualShapeId,  # 視覚形状のID
        basePosition=[((-rangex / 2) + i) * meshScale[0] * 2,  # 配置位置（X軸）
                      (-rangey / 2 + j) * meshScale[1] * 2,  # 配置位置（Y軸）
                      1],  # 配置位置（Z軸）
        useMaximalCoordinates=True  # 最大座標系を使用
    )

# 描画を有効化
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING, 1)

# シミュレーションのプロファイルログを停止
p.stopStateLogging(logId)

# 重力を設定（Z軸方向に-10）
p.setGravity(0, 0, -10)

# リアルタイムシミュレーションを有効化
p.setRealTimeSimulation(1)

# オブジェクトの色リスト（赤、緑、青、白）
colors = [[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 1, 1], [1, 1, 1, 1]]
currentColor = 0  # 現在の色のインデックス

# 無限ループでシミュレーションを継続
while (1):
  time.sleep(1./240.)  # 1/240秒ごとに更新

```
Turbopackでfs is not definedエラーが発生する場合の対処法

Next.jsの新しいバンドラーであるTurbopackを使用していて、`fs is not defined`というエラーで困りました。この記事では、この問題の原因と効果的な解決策について解説します。

## はじめに

Turbopackは、Next.jsの新しい高速バンドラーとして注目を集めています。しかし、Node.jsのコアモジュールである`fs`（ファイルシステム）を使用するライブラリで問題が発生することがあります。私は、機械学習ライブラリの`@xenova/transformers` を使おうとしてクライアント側でファイルが読めず困りました。

## エラーの具体例

以下のようなエラーメッセージになります。

```javascript
ReferenceError: fs is not defined
    at [project]/node_modules/@xenova/transformers/src/env.js [app-client] (ecmascript)
```

このエラーは、クライアントサイド（ブラウザ）でNode.jsの`fs`モジュールを使おうとしたときに発生しました。

## なぜこの問題が起きるのか？

### 1. WebpackとTurbopackの違い

従来のWebpackでは、Node.jsのコアモジュールに対して自動的にポリフィル（代替実装）を提供してくれていました。しかし、Turbopackではこの機能が提供されていません。

### 2. ブラウザの制限

ブラウザ環境では、セキュリティ上の理由からファイルシステムに直接アクセスすることができません。そのため、`fs`モジュールをそのまま使用することはできないのです。

### 3. クライアント/サーバーコードの区別

Turbopackは、クライアントサイドとサーバーサイドのコードを厳密に区別します。`fs`モジュールはサーバーサイドでのみ使用可能なため、クライアントサイドでの使用は制限されます。

## 解決方法

では、この問題をどのように解決すればよいのでしょうか？以下に、実践的な解決策を示します。

### 1. 開発環境でWebpackを使用する

最も簡単な解決策は、開発中は一時的にWebpackを使用することです。

```bash
# package.jsonの修正
"scripts": {
  "dev": "next dev"  # --turbopackオプションを削除
}
```

### 2. APIルートを活用する

ファイル操作が必要な処理は、APIルートを通じてサーバーサイドで実行するようにします。

```typescript
// pages/api/process-file.ts
export async function POST(req: Request) {
  const { text } = await req.json();
  // ファイル操作をサーバーサイドで実行
  return Response.json({ result });
}
```

### 3. ブラウザ互換の代替手段を使用する

ブラウザで利用可能な代替手段として、以下のようなAPIが使用する方法もみつけました：

#### キャッシュAPIの利用
```javascript
// モデルデータのキャッシュ
const cache = await caches.open('ml-models');
const response = await cache.match('model-key');
```

#### IndexedDBの活用
```javascript
const db = await openDB('models', 1, {
  upgrade(db) {
    db.createObjectStore('models');
  },
});
```

## エラー発生時のチェックポイント

問題解決の手順として、以下の点を確認してみましょう：

1. コードがクライアントサイドで実行されているか
2. 使用しているライブラリがファイルシステムに依存していないか
3. ブラウザ互換の代替手段が利用可能か
4. サーバーサイドでの処理に移行可能か

## まとめ

Turbopackの`fs is not defined`エラーは、適切な対処方法を選択することで解決できます：

- 開発中はWebpackを使用する
- サーバーサイドAPIを活用する
- ブラウザ互換のストレージ手段を使用する

これらの解決策を状況に応じて使い分けることで、開発を円滑に進めることができます。

## 参考情報

- [Turbopack公式ドキュメント](https://turbo.build/pack/docs)
- [Next.js App Router](https://nextjs.org/docs/app)
- [Transformers.js](https://huggingface.co/docs/transformers.js)

## おまけ：今後の展望

Turbopackは開発が活発に続いており、将来的にはこの問題も改善される可能性があります。定期的に公式ドキュメントをチェックして、最新の推奨事項を確認することをお勧めします。
因果推論における多重共線性と欠落変数バイアスのトレードオフ：コントロール変数を含めるべきか？

## はじめに
重回帰分析を用いた因果推論において、説明変数間に相関がある場合、**多重共線性**と**欠落変数バイアス**の間でトレードオフが生じます。特に、関心のある変数（例：変数a）と相関があり、かつ目的変数に影響を与えるコントロール変数（例：変数b）をモデルに含めるべきかどうかは、分析者にとって重要な判断です。本記事では、この問題を整理し、ベストプラクティスを提案します。

## 問題の背景
### 1. 欠落変数バイアス
因果推論において、目的変数に影響を与える変数をモデルから除外すると、関心のある変数の推定係数にバイアスが生じます。例えば、変数bがaと目的変数の両方に影響を与える場合、bを除外するとaの効果が過大または過小評価されます。

### 2. 多重共線性
一方で、aとbが相関している場合、両方をモデルに含めると多重共線性が発生します。これにより、aの係数の標準誤差が増大し、推定値の精度が低下します。

## トレードオフの整理
- **欠落変数バイアスを回避するため**には、コントロール変数bをモデルに含めるべきです。  
- **多重共線性を回避するため**には、bを除外する（または他の手法で対処する）べきです。  

## 因果推論におけるベストプラクティス
因果推論を目的とする場合、以下の点を考慮して判断します。

### 1. コントロール変数を含めるべき場合
- **bが交絡因子である場合**：  
  bがaと目的変数の両方に影響を与える場合、bを除外するとaの推定係数にバイアスが生じます。因果推論においては、**欠落変数バイアスを優先**し、bをモデルに含めるべきです。

- **理論的根拠が明確な場合**：  
  bが理論的に目的変数に影響を与えることが明らかな場合、たとえ多重共線性が発生してもbを含めることが推奨されます。

### 2. 多重共線性への対処法
- **VIF（分散拡大係数）の確認**：  
  VIF > 10 の場合、多重共線性が深刻と判断されます。この場合、以下の対処法を検討します。

- **データ収集の改善**：  
  サンプルサイズを増やすことで、標準誤差を減少させることができます。

- **頑健性チェック**：  
  bを含めたモデルと含めないモデルを比較し、aの係数がどのように変化するかを確認します。

### 3. 結果の解釈と報告
- 多重共線性の存在を明記し、係数の標準誤差や信頼区間を提示します。  
- 「aの効果はbを調整後も頑健だが、推定の不確実性が大きい」といった表現を使います。  
- 例：  
  > "Due to multicollinearity between A and B, the coefficient of A has a wider confidence interval, but omitting B would introduce omitted variable bias (see Appendix for sensitivity analysis)."

## 具体例
例えば、教育年数の効果を評価する場合、以下の変数を考えます：  
- **a**：教育年数（関心のある変数）  
- **b**：家庭の経済状況（コントロール変数）  
- **c**：学校の質（コントロール変数）  

ここで、aとbが相関している場合（例：経済的に豊かな家庭ほど教育年数が高い）、bを除外するとaの効果にバイアスが生じます。一方で、bを含めると多重共線性が発生し、aの推定精度が低下します。この場合、因果推論を目的とするならば、bをモデルに含めるべきです。

## 結論
因果推論においては、**欠落変数バイアスを回避することを優先**し、コントロール変数をモデルに含めるべきです。多重共線性は推定の不確実性として受け入れ、解釈時に注意を払います。また、データ収集の改善や頑健性チェックを通じて、結果の信頼性を高めることが重要です。
UdemyでReactの基礎を学習する

# 初めに
Reactは案件で軽く触れた程度ですが、Reactのプロジェクトに入りたいと思い、再度学習を行いました。
その中で、じゃけさんのUdemy講座がわかりやすいと評判だったので、早速購入しました。
その内容をまとめていきます！

# 0. 教材
じゃけさんが作成されたReact v18対応のUdemy教材。
初心者がReactを学習する想定で解説されているので、非常にわかりやすかった！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2674841/76c82656-fee5-0e8e-1962-a471c04d71fa.png)


https://www.udemy.com/course/modern_javascipt_react_beginner/?couponCode=KEEPLEARNING

# 1. JavaScriptの基礎を理解する
いきなりReactを学ぶのではなく、JavaScriptの基礎を理解する。React開発でもJavaScriptの知識が必要になるので、理解することが目的。
理解した内容は以下。
- JavaScriptとは
- DOMと仮想DOMの違い
- npm, yarnのパッケージマネージャー
- ECMAScriptとは
- モジュールハンドラーとトランスパイラ
- SPAとは
- const, letの変数宣言
- テンプレート文字列
- アロー関数
- 分割代入
- デフォルト値
- オボジェクトの省略記法
- スプレッド構文
- map, filter
- 三項演算子
- 論理演算子

Githubは以下
https://github.com/Jun-Araki/JS_udemy/blob/main/src/index.js

# 2. JavaScriptでTodoアプリを作る
理解した基礎知識をもとに、実際にJavaScriptでTodoアプリを作る。

作成したアプリは以下
![Screen Recording 2025-01-30 at 9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2674841/d5c770b6-d29f-7c61-4930-e5ae4c315298.gif)

Githubは以下
https://github.com/Jun-Araki/JS_todo_app_udemy/

【機能】
- タスク追加機能
- タスク削除機能
- タスク完了機能
- タスク戻す機能

# 3. Reactの基礎を理解する
ここからReactの基礎機能を理解していく。
- JSX記法のルール
- コンポーネント
- Props
- State
- 再レンダリング useEffect
- defalut export, named export

Githubは以下
https://github.com/Jun-Araki/React_Udemy/tree/main/src

# 4. Reactで同じTodoアプリを作る
2.で作ったアプリをReactで作ることで、Reactになるとどのように変わるのかを体感する。
JavaScriptは手続型、Reactは宣言型の通り、非常に短いコードで書くことができて感動した！

作成したアプリは以下
![Screen Recording 2025-01-30 at 9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2674841/d5c770b6-d29f-7c61-4930-e5ae4c315298.gif)

Githubは以下
https://github.com/Jun-Araki/React_app_udemy

# 5.学習を終えて
JavaScriptの基礎学習からTodoアプリを作り、同じことをReactで実装することで、Reactの良さ確認することができた。記述量が大幅に減って、コンポーネント化されたことで、コードが体系化されて、非常に可読性が高い言語であることを理解できた！引き続き、Reactで別のアプリを作っていきたい。
【備忘録】povoの利用停止日表示bashスクリプト

## はじめに
povoの利用停止日が、`有効期限日の翌日から180日（有効期限日から181日）`のため、現在持っている回線の利用停止日を表示するbashスクリプトを書いたので掲載
## 下準備
テキストファイルに以下の形式で記録
複数回線ある場合は行を分けて記載
回線名は適当で大丈夫ですが、日付は必ず最後に購入したトッピングの`有効期限日`を記載
```povodate.txt
回線１,2025-01-22
回線２,2025-07-14
```
## スクリプト
```povo.sh
#!/bin/bash                      
TODAY=$(date -d $(date +%Y-%m-%d)　+%s)                     
#利用停止日が有効期限日から181日
POVO=181
POVODATA="povodate.txt"
echo "povo利用停止日"
while read DATA
do
MAC=$(echo $DATA | awk -F "," '{print $1}') 
BUYDAY=$(echo $DATA | awk -F "," '{print $2}') 
echo "$(printf "%-9s" "$MAC"):残り$(printf "%3d" $(($POVO-$(($(($TODAY - $(date -d "$BUYDAY" +%s))) / $((60*60*24)))))))日 $(date -d @$(($(($POVO*60*60*24)) + $(date -d $BUYDAY +%s))) +%Y-%m-%d)まで ($BUYDAY期限切れ)"                   
done < $POVODATA
```
## 実行
'povodate.txt'と'povo.sh'を同一ディレクトリに格納し実行
超入門 JUnitでテストをしよう

## JUnitとはなんでしょうか

プログラム作成後単体テストをするのはとても大変です。
そんなときに楽にできるツールとして、JUnitがあります。
Javaのプログラムにおける単体テスト(ユニットテスト)を行うためのフレームワークになります。

Javaアプリケーションのコードが正しく動作しているか？を自動的にテストするために利用され、多くのJavaのプログラムに使われています。

## なぜJUnitを使うのか？

### 自動化されたテストで行える

Junitを使うと、コードを手動でテストする必要がなく、テストシナリオを書き、ボタンを押すことで大量のテストを行うことができます。
これによって、開発者のテストをする時間を大幅に省けて、時間を短縮することができます。

### バグの早期発見

コードを小さな部分に分割してテストができます。
バグを早期に発見、修正がしやすい形となっています。

### 回帰テスト

アプリケーションのアップデートをしても、既存の機能が壊れていないのか？確認するために便利です。

### 品質の向上

テストを自動化することで、品質の高いソフトウェアを効率よく開発すること可能です。

## JUnitのテストシナリオ書き方

### アノテーションを使って記述する

| アノテーション名 | 説明 |
| :---: | :---: | 
| @Test | テストメソッドを示します |
| @BeforeEach | 各テストの前に実行するメソッドを示します |
| @AftereEach | 各テストのあとに実行するメソッドを示します |
| @BeforeAll | 全テストの前に一度だけ実行されるメソッドを示します |
| @AfterAll | 全テストのあとに一度だけ実行されるメソッドを示します |

### アサーションの説明

アサーションとは、Jnitで期待する結果と実際の結果を比較するためにアサーション(assertion)を使います。

以下はよく使われるアサーションになります。

| アサーション名 | 説明 |
| -------- | -------- |
| assertEquals(excepted,actual)| 期待する値と実際の値が等しいかを確認します |
| assertTrue(condition) | 条件が真であるかを確認します |
| assertFalse(condition) | 条件が偽であるかを確認します | 
| assertNull(object) | オブジェクトがnullであるかを確認します |
| assertNotNull(object) | オブジェクトがnullでないかを確認します |


## テストの実行例
テストの手法を記述していきます。

### まずは普通のプログラムソース
```Java

public class Calculator {

    Calculator() {
    }

    public int add(one,two) {
        return one + two;
    }
}
```

このソースに対して足し算ができるかのテストケースを書きます。

```Java

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculatorTest {
	
	@Test
	public void test() {
		
		// 正解の値を記述
		int expected = 3;
		
		//インスタンス作成
		cal Calculator = new Calculator();
		
		int actual = j042i.cal(2,1);
        
		// 足し算が正しいか？の値を記述する
		assertEquals(expected, actual);
	}

}

```

このコードではCalculatorのクラスのaddメソッドが正しく動作しているかをテストします。
assetEqulalsで2と1を足した結果が3であることを確認できます。

### JUnitを使用する方法

テスト駆動開発(TDD)でJUnitを使うとTDD(Test0Driven Development)が効果的に行えます。
最初にテストを牡蠣、その後にコードを書いてテストが成功するように開発を進めます。

### カバレッジの確認方法

JUnitのテストだけではなく、テストがコード全体をどれだけカバーしているか、カバレッジも確認することが重要です。
Django Model～データ参照時のobjectsの正体～


# DBを参照したいデータに.objectsが必要なわけ
アプリケーション内で以下のようなモデルを作成しました．
```models.py
class BaseMeta(models.Model):
  create_at  = models.DateTimeField(auto_now_add=True)#insert時に現在時刻を取得
  update_at  = models.DateTimeField(auto_now_add=True)#update時に現在時刻を取得

  class Meta:
    abstract = True#本クラスではDBにテーブルを作らない

class Person(BaseMeta):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)
  birthday = models.DateField(default=date(1990,1,1))
  email = models.EmailField(db_index=True)#index:検索高速化
  salary = models.FloatField(null=True)
  memo = models.TextField()
  web_site = models.URLField(null=True)

  class Meta:#オーバーライド
    db_table = 'person'#table名
    indexes = [models.Index(fields=['first_name','last_name'])]#複合インデックス
    ordering = ['salary']

  def __str__(self)
    return f"{self.pk}: {self.first_name}, {self.last_name}"

```

```main.py
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','ModelProject.settings')
from django import setup
setup()
from ModelApp.models import Person

#すべてのレコードを取得
persons = Person.objects.all()#←これ
for p in persons:
  print(p.pk, p.first_name,p.last_name)
```

ここの.objectsとは何？
と思い調べました．
# 結果
Django の モデルマネージャー（Manager） の仕組みによるためである．
つまり，Personはmodels.Modelを継承しているため、Djangoが自動的にそのクラスにobjectsというManagerのクラス変数として追加します。(インスタンス変数だと各インスタンスごとに異なるobjectsをもつため)
Django の Manager クラスは、django.db.models.Manager に定義されています。

以下のように解釈できます．
```models.py
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    # デフォルトの Manager (django.db.models.Manager) が自動で追加される
    # objects = models.Manager() が内部で行われる

```
このように，クラス継承によってPersonクラスは「自分自身」.objectsを経由してManagerのもつメソッドを使えるようになるわけです．

## これによってできること
1\. models.Modelにはobjectsという名前でManagerが自動的に定義されており、それがPersonクラスに「継承」という形で追加されます。
このobjectsを通じて、Personクラスに対するデータベースクエリができるようになります。
2\. 自作メソッドを作れる(QuerySetを渡してあげる)
Managerはこのように定義されていて，
class Manager(BaseManager.from_queryset(QuerySet)):
    pass
QuerySetをたとえばこのように渡します．
```models.py
from django.db import models

class PersonQuerySet(models.QuerySet):
    def with_salary(self):
        return self.filter(salary__isnull=False)

# PersonQuerySet を持つ Manager を作成
PersonManager = models.Manager.from_queryset(PersonQuerySet)

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    salary = models.FloatField(null=True, blank=True)

    objects = PersonManager()  # カスタム Manager を適用

```
```main.py
persons = Person.objects.with_salary()  # salary が NULL でないデータを取得

```
このように，自作でメソッド作成可能です．

# まとめ
使いたいクラス(Person)にmodels.Modelを継承させることでPerson.objects.all()など簡単にデータ参照できる．
これは，Managerクラス(objects = models.Manager()が内部的に行われている)を継承し，データ操作用のobjects(=インターフェース?)を与えたため

解釈違いや発展があればご教示お願いたします
いい言葉教えて　季節ごとに

 
> > 今回この記事を書くにあたり　自分の頭が理解してなかったため( ﾉД`)ｼｸｼｸ…日々でした。でもとにかく自分がやりたいことをうまく伝えて、読んでもらうように記事にしました。温かく見守っていただけると　大変嬉しいです。

**季節ごとの商品のPOP作って欲しい**
ス－パ－でよく見かける広告商品を売り込むための言わば**商品の表札**でもこれって、ただの表札ではないんです。売りたい物の特徴をわかりやすく見やすくしている**必殺仕事人**なんです。

こんにちは　ス－パ－で働くはちわれです。:wave:　冒頭何をおっしゃっているの？どうかしちゃった？と思われた方、**安心して下さい　正常です**
見つけていく中で、今回色んな業務改善を作業場の人間と一緒に、いくつかピックアップしました。:eyes:そんな時、商品を見た時≪これを売り込みたい時もっとアピ－ルしたい≫と言う意見があがり、
自分管理でできていない部分“持続　継続”の中で　いつも言われてから気づいて作るPOPに書く時必要な**その商品のキャッチコピー**を思いつきました。

話の中で:speaking_head:この商品を売りたいけど、このPOPは普通:speaking_head:お客さんに見つけてもらいたいのに、わかりずらいね等　色々案がありました。
なので(とはいうものの、パソコン触ることを拒む年配の意見ですが)　
皆が意見を月一に聞き、商品にあうキャッチコピーをChatGPTにお願いしてみました:point_up_2_tone3:

## 季節ごとのセンスあるキャッチコピー
今回使用した項目はこちら
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/e233d713-5f37-2533-cc53-1f6f39820ce4.png)

- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/cfd7b32e-e8f7-3e11-cdc8-885c21b31b5c.png)
- Gmail
## 今は仕組みを理解しよう:raised_hand:
この課題を取り組むにあたり、基本がしっかりとしないと上にはいかれへん:wave_tone2:そうだ本屋に行こう。１冊の本を読みあさりました。読んでも実践するのみと、課題に取り組みました。
### 最近こんな会話したけど、なんかいい方法あった？
私の勤務は、大体午後はパソコンの時間にあてます。時々「この時ChatGPT使うと、どんな返事くる」と思って、前回作成したお助け隊に時々聞きました。

### 何をどう言えば返答くる？
ChatGPTってそもそも勝手に理解してお返事くれると思い込んでしまい、後で自分に奈落の落とし穴にいくとは思いませんでした。
業務改善の内容をあれこれ聞きすぎて、何にも進まない。それに、お返事がまばらすぎて、自分が悪い？自分は正しいはず。しっかりしてよ。と当たり散らしていました。

![スクリーンショット 2025-01-30 172444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/9332f8e0-5ba5-744e-ef28-fede34dfee36.png)これが実際聞いていた項目

### 違うよ　大きく質問してから小さくしていくの
そもそも聞き方に問題でした。自分を一度見直しをして、基本となる教科書を開きました。chatGPTさん　ごめんなさい:tired_face:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/5025d5d9-f9ad-1dea-e23b-c691572b0d26.png)
初心者っというもう一人を作り、冷静に質問したりわからない部分を聞きました。日頃の言い方が書き方にも出てしまいまいした。
ふと思いなおし、せっかく基本に戻ったなら、基礎を応用してみようと思い、自分の普段使うメールに送る土台を作ろう。まずは土台を理解して作ろうと、切り替えをしました。　
### メールに送りたいことを考える
皆には、「申し訳ない。少し時間かかり皆には説明できないよ。」「大丈夫　頑張れ」と励まされ、少しでも完成したのを教えたかったが、自分の理解度に情けなくなりました。とりあえず、「キャッチコピー」から「送る内容を変更」に変え　もう一度ChatGPTさんにお願いしました。八つ当たりしていたのにも関わらず、わかりやすく丁寧に返事くれました。

![スクリーンショット 2025-01-30 193448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/b947679e-ee6d-2306-b423-ca540d607d4c.png)
↓この部分　色んな事を書くより始めは参考として書き出しました。
![スクリーンショット 2025-01-30 172227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/c66be4ca-cbc1-467e-039c-faf2afffc62d.png)
↓読み返すことを重点に、とにかくきちんと項目を埋めました。
![スクリーンショット 2025-01-30 204813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/44e90bea-8161-069b-5d60-566a28676a77.png)
何度も詰まったけど、読んでいくうちできない部分は、最後のところにきちんと教えてくれていました。

今回ばかりは、冷静に物事を進めていきました。
**基礎がわかってないんであれば、基本の土台を作れ**
二時間後　ボタンを試しに押しました
![スクリーンショット 2025-01-30 210233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/355840c1-0af2-2ac6-0eb6-0c6a8b710042.png)
できることがうれしかった。ここで時間が来ました。みんなにここまでの説明をして、もう少し完了するまでには、時間かかることを言いました。

最終的な目標にたどり着けず、毎日が情けない自分。一時はこんなん無理やと( ﾉД`)ｼｸｼｸ…毎日。**自分の思う物を自分で作り、改善していくものを皆に広めたい**そんなん夢のまた夢　今は、自分が使いこなして理解し、共感できる人に試してもらう。そんな未来になっていきたいです。読んでいただきありがとうございました。
要素の大きさを変えずにボーダー付けたいんですけど？

## ボーダーとか引くの簡単じゃね？
そう思っていた時代が私にもありました。

```scss
.hoge {
  border-bottom: 2px solid black;
}
```
はい、終わりー。

じゃないんですよね。
よくみると、親要素(.hogeクラス)の要素の外側にボーダーがついて、
全体の高さが2pxズレてしまうんですよね。

親要素をhoverした時に、ボーダーが出る仕様で！とか、普通によくある話なわけで、
親要素の高さを維持したまま下線を要素の中に入れる必要がある訳です。

前置き長くなりましたが、意外とハマったので対処方法を備忘録としてメモしておきます。

## どうする？
アプローチは以下の通り。
1. `::after`の擬似要素を乗せる
1. `box-shadow`を使う
1. `border-bottom`を使う


`::after`のパターン
```scss
.parent {
  position: relative; /* 擬似要素の位置を調整するために相対位置を設定 */
}

.child {
  position: relative; /* 子要素に下線を引く */

  &::after {
  content: ""; /* 擬似要素に空のコンテンツを追加 */
  position: absolute; /* 絶対配置 */
  bottom: 0; /* 親要素の底部に配置 */
  left: 0; /* 左端に配置 */
  width: 100%; /* 親要素の幅に合わせる */
  height: 2px; /* 下線の高さ */
  background-color: black; /* 下線の色 */
  }
}
```

`box-shadow`のパターン

```scss
.child {
  box-shadow: inset 0 -2px 0 0 black;
}
```

`border-bottom`のパターン
```scss
.parent {
  display: flex; /* 必要に応じて */
}

.child {
  flex-grow: 1; /* 子要素が親要素の残りのスペースを埋める */
  border-bottom: 2px solid black; /* 子要素の下に下線を引く */
}
```

書き方色々ですね💡

擬似要素が使いこなせると、柔軟に色々なスタイルを当てられる様になるので使いこなしたいですが…記述量はやっぱり増えますね💦

一番意外だったのは、`box-shadow`でもボーダーの代わりに使うことができるという点です。
`box-shadow`は要素の外側に影をつけるプロパティなのですが、親要素の中に線を描くのにも使えるという…。
`inset`なんて知らなかった…。

一番直感的な、border-bottomでも書くことができるのですが、なぜか上手くいかない…みたいな時、違う記述方法も試せる様になると、悩んで手の止まる時間が短くなるかもしれません。
C# のListからDictionaryへの変換

# やり方
LINQ の`ToDictionary`メソッドを使う。

```C#
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var pointCards = new List<PointCard>(){
                new PointCard(){UserID=1,CardName="Aカード",Point=10, },
                new PointCard(){UserID=2,CardName="Bカード",Point =15, },
                new PointCard(){UserID=3,CardName="Cカード",Point =20, },
            };

            // ListからDictionaryに変換
            //  引数が1つならKeyを指定
            //  引数が2つならKeyとValueを指定
            Dictionary<int, PointCard> pointCardDict
                = pointCards.ToDictionary(x => x.UserID);

            // ↑と同じ
            Dictionary<int, PointCard> pointCardDict2
                = pointCards.ToDictionary(x => x.UserID, x => x);
        }
    }

    public class PointCard
    {
        public int UserID { get; set; }
        public string CardName { get; set; }
        public int Point { get; set; }
    }
}

```

顧客管理とか、1人のユーザーに対して複数あるものを扱う時に使えそう。

# `GroupBy`を組み合わせる

@junerさんからコメントいただきましたので追記します。
ありがとうございます！(勉強になります(^^♪)

```C#
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var pointCards = new List<PointCard>(){
                new PointCard(){UserID=1,CardName="Aカード",Point=10, },
                new PointCard(){UserID=2,CardName="Bカード",Point =15, },
                new PointCard(){UserID=3,CardName="Cカード",Point =20, },
                new PointCard(){UserID=1,CardName="Dカード",Point =10, },
                new PointCard(){UserID=1,CardName="Eカード",Point =25, },
                new PointCard(){UserID=2,CardName="Fカード",Point =30, },
            };

            // ユーザー毎にまとめてみた
            Dictionary<int, IGrouping<int, PointCard>> pointCardDictEachUser =
                pointCards.GroupBy(x => x.UserID).ToDictionary(x => x.Key);

            foreach (KeyValuePair<int, IGrouping<int, PointCard>> pair in pointCardDictEachUser)
            {
                Console.WriteLine(pair.Key);
                foreach (var cards in pair.Value)
                {
                    Console.WriteLine(cards.CardName);
                }
            }

            Console.ReadKey();
        }
    }

    public class PointCard
    {
        public int UserID { get; set; }
        public string CardName { get; set; }
        public int Point { get; set; }
    }
}

```
高度なサイバーセキュリティスキルを証明するCompTIA CASP認定

サイバーセキュリティの専門家にとって、実践的なスキルを証明することは非常に重要です。CompTIA CASP認定 (CompTIA Advanced Security Practitioner) は、ハイレベルなセキュリティ専門家向けの資格であり、リスク管理、エンタープライズセキュリティ、セキュリティアーキテクチャ、研究分析などの分野をカバーしています。この認定は、戦略的思考と実践的な技術スキルの両方を求められるため、管理職や上級エンジニアに最適です。

CompTIA CASP 認定試験で専門スキルを証明
[CompTIA CASP 認定試験](url) は、ITプロフェッショナルがサイバーセキュリティの分野で高度な専門知識を身につけるための試験です。CAS-004試験では、実際の業務環境で必要とされるセキュリティ対策の設計と実装スキルが問われます。この試験は、セキュリティ戦略、リスク評価、クラウドと仮想環境の保護、エンタープライズセキュリティの管理など、多岐にわたる領域をカバーします。

CompTIA CAS-004試験の特徴
試験名: CompTIA Advanced Security Practitioner (CASP+)
認定名: CompTIA CASP認定
試験コード: CAS-004
出題範囲: セキュリティアーキテクチャ、リスク管理、クラウド環境のセキュリティ、脅威対策など
問題数: 558問（最新更新：2025年1月19日）
練習問題
次のうち、ゼロトラストセキュリティの基本原則として最も適切なものはどれですか？

A) すべてのネットワークトラフィックを許可する
B) 信頼できる内部ネットワークを定義し、外部アクセスのみを制限する
C) すべてのアクセスを認証・認可し、最小限の権限を適用する
D) 一度認証されたユーザーには無制限のアクセスを提供する

（正解：C）

試験対策とお得な情報
CASP+認定を取得するためには、実践的な問題に慣れることが重要です。Examshomeでは、最新のCompTIA CAS-004試験対策 を提供しており、50%オフ、無料デモ、精度の高い問題 を利用できます。今すぐ学習を始めて、キャリアアップを目指しましょう！