OmniAICreator/Qiita-1.07M huggingface dataset:
LaTeX（ラテフ）をONES Wiki（/数式）で書いてみる

## LaTeX（ラテフ）とは
[LaTeX](https://ja.wikipedia.org/wiki/LaTeX)（ラテフ、ラテックなど。詳細は後述）とは、レスリー・ランポートによって開発されたテキストベースの組版処理システムである。電子組版ソフトウェアTeXにマクロパッケージを組み込むことによって構築されており、単体のTeXに比べて、より手軽に組版を行うことができるようになっている。
学術機関においては標準的な論文執筆ツールとして扱われている。

## ONES WikiのLaTeX表記について
ONES WikiはLaTeX記述にも対応しています。
以下のように学術的な数式の表現を、標準機能で利用可能です。
![LaTeX例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992874/daf5ac26-311a-44af-8c5f-ee0077eff894.png)

## ONES WikiのLaTeX（数式コンポーネント）
ONES Wikiのページ作成画面から、以下の方法で数式を追加してください。
- ツールバーから数式を選択する
- スラッシュコマンドから数式を選択する
- スラッシュコマンド＋コードで数式を選択する

![LaTeXのコンポーネント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992874/95e4c8dd-c079-4541-8583-b9f4735f6de7.png)

**数式（/math）コンポーネント**
数式コンポーネントを追加すると、以下のような入力ができるようになります。
![スクリーンショット 2025-02-14 8.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992874/4b01e5a7-58af-4531-9c56-63d04820249b.png)

ここにLaTeX記法の数式を入力してください。
例えば、以下のコードを入力すると
```
\begin{equation}
    e^{i \theta} = \cos \theta + i \sin \theta
\end{equation}
```
このような数式が表示されます。
![スクリーンショット 2025-02-14 8.47.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992874/f23e33ec-8edb-4073-8496-3b3960e091b1.png)

このように、ONES Wikiでは、手軽で簡単にLaTeX記法の練習をしたり、実際に報告書や論文を作成してWordやPDFにエクスポートしたりなどができるのです。

ぜひ皆さん、ONES Wikiは、30名まで無料利用できますので、楽しみながら使ってみてください。無料版はSaaS環境のみですが、有料版（エンタープライズプラン）では10名から利用できるオンプレミス版もあるようです。

---
プログラミング学習の振り返り：AIとの付き合い方と効果的な学習方法


## はじめに
プログラミング学習の最終課題を終えて、つまずきや成功体験から得られた知見をまとめました。特に、AI活用とコード理解の重要性について、実体験を交えて共有させていただきます。

## 成功体験から得られた知見

### 1. 公式ドキュメントの重要性
最も効果的だった学習方法は、AIやメンターに質問する前に公式ドキュメントを確認することでした。これにより：
- コードの意味をより深く理解できた
- 問題解決能力が向上した
- 実装スピードが向上した

### 2. AIの効果的な活用
AIを活用する中で、以下のスキルが身についたことを実感しています：
- AIのハルシネーション（誤情報）を見分ける力
- より正確な情報を得るための質問力
- コードの使い方を素早く理解する能力

## 直面した課題と学び

### 1. エラー解決に関する課題
主な問題点：
- エラー解決に予想以上の時間を要した
- コードの意味理解が不十分だった
- 関数名やクラス名の違いを見落としていた

### 2. コード理解に関する反省
気づいた点：
- ダウンロードしたファイルの内容確認が不十分
- カリキュラムの再確認で解決できた問題が多かった
- デバッグ過程の記録が不足していた

## 改善策と今後の学習方針

### 1. コード理解の深化
- コードを細かく確認し、各行の意味を理解する習慣づけ
- エラー発生時のメモ取りの徹底
- 定期的なコードレビューの実施

### 2. AI活用の最適化
- より分かりやすい質問文の作成
- AIの特性（強み・弱み）の理解
- 高度なAIサービスの選択的活用

### 3. デバッグ能力の向上
- エラーの早期発見・修正スキルの向上
- デバッグツールの効果的な活用
- エラーパターンのライブラリ化

## まとめ
プログラミング学習において最も重要なのは、「継続的な実践」と「習慣化」です。特に以下の点を意識して学習を続けていきたいと思います：

1. コードレビューの習慣化
2. エラー記録の継続
3. 公式ドキュメントの積極的な活用

## 最後に
この経験を通じて、プログラミングは単なる技術習得ではなく、問題解決能力や論理的思考力を養う excellent な機会だと実感しました。今後も、これらの学びを活かしながら、さらなるスキルアップを目指していきたいと思います!
簡単メモ：シンプルなトグルスイッチの実装

# はじめに
これまでは、トグルスイッチが必要な時は、swやフラグを使って作成していましたが、toggleClass()メソッドがあることに気づきましたので、それを使ってみました。


# 参考サイト
[jQuery toggleClass](https://api.jquery.com/toggleClass/)
ここにtoggleClassの仕様が書かれていますが、自分も含めて、初心者には難しすぎますので、見るだけにとどめておきます。

# toggleClassとは
jqueryのメソッドで、セレクターのclass属性に属性を追加したり、外したりするするようです。例えば、class='on'のように、ボタンでクリックするたびに、'on'を付けたり、外したりできます。
``` javascript sample.js
//#bottunセレクターのclass属性に"on"を追加します。
//トグルするたびに、この"on"を付けたり、外したりできます。
$("#bottun").toggleClass("on");

```
# 今回作成したサンプルです。
では、これを使って、具体的に何ができるかですが、今回は、ボタンで、要素のドラックを許可したり、不許可したりするサンプルコードを示します。

``` javascript sample.js
//
//
    $("#drag_stop").on('click', function() {
            //
            $(this).toggleClass("on");
            if($(".on").length!==0){
                         $(this).html("ドラッグ許可状態");
                         //
                         $("#list_blk").draggable('enable');
                         $("#pop_comment").draggable('enable');
                         alertX("ドラッグ許可にしました。",5000);
                        
            }else{
                         $(this).html("ドラッグ禁止状態");
                         //
                         $("#list_blk").draggable('disable');
                         $("#pop_comment").draggable('disable');
                         alertX("ドラッグ禁止にしました。",5000);
            }
    });

```



# テストサイトです。

[アメバ再生リスト](https://favorite.tecoyan.net/test_debug/index_main.php?lnm=%E6%A3%AE%E7%94%B0%E5%81%A5%E4%BD%9C%E3%80%80-%E7%9F%A5%E4%BA%8B#block)
ページの右端に「ドラグ許可状態」というボタンがあります。このボタンをクリックんするたびにトグルして、リスト要素とコメント要素がドラッグしたり、できなかったりします。


# ここでデモします。
トグルだけの確認ができます。ドラッグ要素はコメントにしています。
<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="dPyPrdW" data-pen-title="Untitled" data-user="okpzwnyh-the-vuer" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/okpzwnyh-the-vuer/pen/dPyPrdW">
  Untitled</a> by なつかしの曲ポータル (<a href="https://codepen.io/okpzwnyh-the-vuer">@okpzwnyh-the-vuer</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>


# あとがき
非常に簡単な記事ですが、ご容赦願います。簡単：メモでは、難しいことは抜きにしています。シンプルなコードと動作確認でメソッドの記述例を示しています。
Record Producer ９：Record Producer のg_formについて【ServiceNow】

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# g_formとは
- Record Producerのg_form は、ServiceNowのクライアントサイドで動作するスクリプト（特に、Catalog Client Script や Client Script）内で使用されるオブジェクト
- フォームに表示されているフィールドの値を操作したり、フォームの動作を制御したりできる
- g_form メソッドの第1引数 は、Record Producer の Variables の name フィールド を指す
- g_form の第2引数 は、操作対象のフィールドに対する特定のアクションを実行するための追加パラメータを指す

# `g_form`の役割
- `g_form`は、フォーム上の**フィールドにアクセスして制御を行うためのAPI**を提供
- Record Producerでは、これを使ってユーザーが入力した情報に基づいてフォームを動的に操作できる

# 主な機能
### フィールドの表示・非表示制御
   - `g_form.setDisplay('フィールド名', true/false)` を使用して、フォームのフィールドを表示または非表示にできる
   - 例: 
     ```javascript
     g_form.setDisplay('phone', false); // phoneフィールドを非表示
     ```

### フィールドの値を取得・設定
   - `g_form.getValue('フィールド名')` でフィールドの値を取得
   - `g_form.setValue('フィールド名', 値)` でフィールドの値を設定
   - 例:
     ```javascript
     var phone = g_form.getValue('phone'); // 'phone' フィールドの値を取得
     g_form.setValue('address', '新しい住所'); // 'address' フィールドの値を設定
     ```

### フィールドの読み取り専用/編集可能設定
   - `g_form.setReadOnly('フィールド名', true/false)` でフィールドを読み取り専用にするか、編集可能にする
   - 例:
     ```javascript
     g_form.setReadOnly('phone', true); // phoneフィールドを読み取り専用にする
     ```

### フィールドの必須設定
   - `g_form.setMandatory('フィールド名', true/false)` でフィールドを必須にするか、必須解除を制御する
   - 例:
     ```javascript
     g_form.setMandatory('address', true); // 'address' フィールドを必須にする
     ```

### フィールドの値に基づくアクションの実行
   - 特定のフィールドの値を監視し、変更されたときにアクションを実行できます。たとえば、別のフィールドを表示したり、非表示にしたりできる

## Record Producerにおける`g_form`の使用例
### フィールドの表示・非表示の制御:
  Record Producerを使用して、特定の条件に応じてフィールドを表示または非表示にすることができる

  ```javascript
  function onLoad() {
      var selectedOption = g_form.getValue('category');
      if (selectedOption == '特定のカテゴリ') {
          g_form.setDisplay('subcategory', true);  // 'subcategory' フィールドを表示
      } else {
          g_form.setDisplay('subcategory', false); // 'subcategory' フィールドを非表示
      }
  }
  ```

### ユーザー入力に基づく処理:
  Record Producerフォームに入力された情報を基に、他のフィールドを自動的に設定することができる

  ```javascript
  function onChange(control, oldValue, newValue, isLoading) {
      if (newValue == '特定のオプション') {
          g_form.setValue('priority', '高');  // 'priority' フィールドに '高' を設定
      }
  }
  ```
Record Producer ８：Record Producer の画面項目の表示・非表示を制御する【ServiceNow】

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

ServiceNow の Record Producer では、画面上の項目（カタログ変数）を動的に表示・非表示にする 方法は複数存在する

# 画面上の項目（カタログ変数）を動的に表示・非表示にする 方法
- Client Script
    - g_form.setDisplay(‘変数名’, false/true); → 完全に非表示/表示
    - g_form.setVisible(‘変数名’, false/true); → 非表示にしても領域は残る
-  UI Policy
    -  条件に応じてGUIで設定可能（スクリプト不要）
    -  Visible アクションで True/False を設定
-  関連リストの変数テーブルのフィールドから変更する
    - Visibleフィールドで True/False を設定
        - 変数やフィールドが ユーザーインターフェース上で表示されるかどうか を制御する


## 使い方
### g_form.setDisplay(‘variable_name’, false/true);
   - `g_form.setDisplay(‘変数名’, false);` → 非表示  
   - `g_form.setDisplay(‘変数名’, true);` → 表示  

   **例:**
   ```javascript
   function onLoad() {
       g_form.setDisplay('variable_name', false); // 変数を非表示
   }
   ```
   **適用タイミング:**  
   - `onLoad`（画面表示時）
   - `onChange`（他のフィールドの値変更時）

### g_form.setVisible(‘variable_name’, false/true);
   - `setDisplay`との違いは、**非表示にしても領域が残ること**
   - 通常は `setDisplay` を推奨

### UI Policy を使う方法
   - **条件に応じてGUIで制御できる**ので、Script不要
   - `Condition` を設定し、`Visible` のアクションで `True/False` を選択
Tailscaleを使って配信サービスへ 自宅のIPでアクセスする

とあるネット配信サービスでは、1契約で2台まで同時視聴が可能ですが、同一のIPアドレスからの接続に限るという条件があります。
離れた2拠点からアクセスしても、VPN経由でアクセスすれば、この条件を満たせそうです。

2拠点は、インターネット常時接続をNATルータで接続しています。
拠点Aには視聴端末としてFire TV StickとWindows PC-Aがあり、拠点BではWindows PC-Bで視聴するというシナリオを考えます。

このシナリオでは、Tailscaleを使用して2拠点を安全なVPNネットワークで接続し、拠点Aと拠点Bの両方の視聴端末を同じIPアドレスを通じて接続できるようにする構成を作成します。
以下は、手順を段階的に説明したガイドです。

---

## **要件**

- **Tailscaleのアカウント**
- **必要な端末**:
  1. **拠点A:**
      - Fire TV Stick（アプリのインストールは不要）
      - Windows PC-A（出口ノードとして使用）
  2. **拠点B:**
      - Windows PC-B
- **管理者権限**が必要

---

## **概要**

1. **Tailscaleをインストール**し、各拠点のWindows PCをTailscaleネットワークに追加
2. **拠点AのWindows PC-Aをインターネットの出口として設定**（サブネットルーティングまたは出口ノードを使用）
3. **拠点BのPC-Bを拠点Aの出口ノード経由で接続**し、配信サービスにアクセス
4. **Fire TV Stickは拠点A内のローカルネットワークで動作するためVPN設定は不要**

---

## **具体的な手順**

### **1. Tailscaleのアカウント作成**

公式サイト [Tailscale](https://tailscale.com) よりアカウントを作成します。
GoogleアカウントやGitHubアカウントでのサインアップも可能です。

---

### **2. 各デバイスへのTailscaleのインストール**

#### **拠点A（自宅）**

- **Windows PC-A（出口として使用）**
  1. [Tailscale公式ダウンロードページ](https://tailscale.com/download) からWindows用のクライアントをダウンロードしてインストール
  2. インストール後、コマンドプロンプトを開き、以下を実行：
     ```shell
     tailscale up
     ```
  3. Fire TV StickはTailscaleを直接サポートしていないため、ローカルネットワーク内でWindows PC-Aを経由して配信サービスへアクセス

#### **拠点B**

- **Windows PC-B（リモートから接続）**
  1. 同様にTailscaleをインストールしてログイン
  2. `tailscale up` 実行後、Tailscaleネットワーク上で拠点AのWindows PC-Aに接続可能か確認

---

### **3. 拠点AのWindows PC-Aをインターネット「出口」にする**

Tailscaleを利用して、拠点AのWindows PCを拠点B（リモート側）のトラフィック出口（ルーター代わり）として設定します。

1. **「出口ノード」の有効化（拠点Aで設定）**
    - 拠点AのWindows PC-Aで管理者権限で以下のコマンドを実行：
      ```shell
      tailscale up --advertise-exit-node
      ```
    - これにより、PC-Aが「出口ノード」として機能

2. **出口ノードの選択（拠点Bで設定）**
    - 拠点BのWindows PC-Bで以下のコマンドを実行：
      ```shell
      tailscale up --exit-node=<出口ノードのIP>
      ```
    - 出口ノードのIPアドレスは、Tailscaleダッシュボード上で確認可能
    - これにより、PC-Bの通信が拠点A経由でインターネットに接続される

---

### **4. Fire TV Stickの設定（基本不要）**

Fire TV Stickは同じローカルネットワーク内のWindows PC-Aを経由して通信するため、追加の設定は不要です。
ただし、うまく動作しない場合は以下を確認してください。

- Fire TV StickとPC-Aが同じLAN内にあること
- Windows PCのインターネット共有設定を有効化

---

### **5. 動作確認**

1. **拠点AのFire TV Stickが配信サービスにアクセス可能か確認。**
2. **拠点BのPC-Bで、PC-Aを経由して拠点AのIPアドレスを使用していることを確認。**
    - [WhatIsMyIPAddress](https://www.whatismyipaddress.com) でIPアドレスをチェックし、拠点AのIPになっているか確認

---

### **注意点**

- **配信サービスの利用規約に違反する可能性があります。**
  設定を試す前に、合法性や影響について十分に理解してください
- **Tailscaleの出口ノードやサブネットルーティングのパフォーマンス**は、出口として使用するPCの速度やネットワークの安定性に依存します

---
Record Producer ７：Lookup Select Box vs. Referenceについて【ServiceNow】

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。


# Lookup Select Boxとは
- **Lookup Select Box** は、特定の条件に基づいて選択肢を動的にフィルタリングできるドロップダウンフィールド
    - ドロップダウンフィールド: ユーザーがリストから選択できるUI要素、クリックすると選択肢が表示され、1つのオプションを選べる形式
- 従来の選択ボックス（Choiceフィールド）と異なり、事前に選択肢を定義するのではなく、スクリプトを使用してデータを取得・フィルタリングできる

### 特徴
- スクリプトによる動的な選択肢設定
  - フィルタリング条件を **Client Script** や **Catalog Client Script** で設定可能  
  - 他のフィールドの値に応じて選択肢を変更できる  
- パフォーマンスに優れる
  - 事前にフィルタリングされたレコードのみ取得するため、大量データでも動作が軽い  
- sys_idではなく、特定の値を格納
  - 例えば、カタログアイテムの変数で使用すると、sys_idではなく、表示された値をそのまま格納する  

### 使用例
- サービスカタログの変数で、選択肢をユーザーの所属部署に応じて変える  
- 特定の条件に合うユーザーリストを表示し、選択させる  

## Reference フィールドとは 
- **Reference フィールド** は、他のテーブルのレコードを参照できるフィールド
- データベースのリレーションのように、他のテーブルの `sys_id` を格納することで、データの整合性を保つことができる
    - ※sys_idは直接入力するのは通例的にNGなことがある
    
### 特徴
- sys_idを格納する
  - 参照先のレコードの `sys_id` をデータとして保存するため、データの一貫性が保たれる  
- 検索機能付きのUI  
  - ポップアップ検索ウィンドウ  
  - オートコンプリート機能（予測変換）
- 参照条件を設定可能
  - 参照するテーブルのレコードをフィルタリングできる（例：Activeなユーザーのみ表示）  
- 関連リストの表示が可能
  - 参照された側のテーブルに「関連リスト」を表示し、どのレコードから参照されているかを確認できる

### 使用例
- インシデントテーブルの **Caller** フィールド（`sys_user` テーブルを参照）  
- CMDBの **Configuration Item** フィールド（`cmdb_ci` テーブルを参照）  
    - CMDB（構成管理データベース） ：IT資産（構成アイテム：CI） の情報を一元管理するデータベース
    - ServiceNowでは CMDB は特に 構成アイテム（CI: Configuration Item） を管理するためのテーブル群の集合体として実装

# Lookup Select Box vs. Referenceの違い
| 項目 | Lookup Select Box | Reference |
|------|------------------|------------------|
| データ取得方法 | スクリプトでフィルタリングしたデータを表示 | 参照テーブルのすべてのレコードから選択 |
| フィルタリング | スクリプトで動的にフィルタ可能 | 参照条件を設定すればフィルタ可能 |
| UI | ドロップダウンで選択 | 検索ウィンドウ、オートコンプリート、ドロップダウン |
| パフォーマンス | 事前フィルタリングで軽量 | 参照テーブルが大きいとパフォーマンスに影響 |
| 依存関係 | 他のフィールドの値に応じた動的選択が可能 | 依存関係を設定すれば可能だが、動的な変更は制限される |
| データの格納 | 選択肢の値（sys_idではない） | 参照テーブルのsys_id |

## どちらを使うべきか？
| 要件 | 推奨フィールド |
|----------|----------------|
| 他のフィールドの値に応じて、選択肢を動的に変えたい | Lookup Select Box |
| 参照テーブルの `sys_id` を保持し、関連データを管理したい | Reference |
| 参照するテーブルのデータ量が多く、検索機能が必要 | Reference |
| カタログアイテムの変数で、条件付き選択肢を作成したい | Lookup Select Box |

## 具体的なシナリオ

### 1. Lookup Select Box の例
**シナリオ**  
インシデントフォームで、担当者フィールドに「特定のグループ（ITサポート）」に属するユーザーのみを表示したい

**解決策**  
Lookup Select Box を使用し、スクリプトで特定グループのユーザーのみをリストに表示


### 2. Reference フィールドの例
**シナリオ**  
ユーザーがインシデントの「報告者（Caller）」を選ぶ際、すべてのユーザーから検索できるようにしたい

**解決策**  
Reference フィールドを使用し、`sys_user` テーブルから検索できるようにする

### 結論
- **Lookup Select Box** は **スクリプトで動的に制御可能** で、カタログ変数やフォームの特定のシナリオに向いている  
- **Reference** は **データの整合性が重要な場面で活躍** し、sys_idを保存することで他のレコードとの関連性を維持できる
2nd,円周率を「米粒を敷き詰めて計算」する方法【C言語】

前回の記事は

https://qiita.com/bezonata/items/75423a6376ee860483b6

---
今回は↓

```kome_pi_2.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


void now(void)
{
	time_t t = time(NULL);
	struct tm *local = localtime(&t);
/*
	printf("%04d/", local->tm_year + 1900);
	printf("%02d/", local->tm_mon + 1);
	printf("%02d", local->tm_mday);

	printf(" ");
*/
	printf("%02d:", local->tm_hour);
	printf("%02d:", local->tm_min);
	printf("%02d\n", local->tm_sec);
	fflush(stdout);
}

int main(int argc,char *argv[])
{
	float  n=8 ;

	if(argc > 1 )
	{
		n=atof( argv[1] ) ;		
	}
    double i,k ,all,en;


	now();
	while(1)
	{
		double ai = 2.0f / n;
		en = 0.0f ;
		for(i=-1.0f ; i<=1.0f ; i+=ai)
		{
				for(k=-1.0f ; k<=1.0f ; k += ai)
				{

						if( i*i + k*k <= 1.0f) en+=1.0f ;
				}
     	}
		all = (float)n ;
		all *= all ;
		printf("π=%.20f ,log10(%.3f)分割,",4.0f* en / all ,log10f(n));
		now();
		n *= 1.03f ;
	}
	return 0;
}
```

これをgccでコンパイルするには、-lmオプションが必要で

```
gcc -lm pi.c -o pi
```
てする。

---

<h3>実行結果</h3>

./pai 47000
```
π=3.14159185822306241676 ,log10(4.663)分割,07:08:02
π=3.14159174870428703485 ,log10(4.676)分割,07:08:11
π=3.14159258840777200206 ,log10(4.688)分割,07:08:21
π=3.14159269341565083877 ,log10(4.701)分割,07:08:31
π=3.14159238385188466225 ,log10(4.714)分割,07:08:43
π=3.14159216209102698514 ,log10(4.727)分割,07:08:55
π=3.14159242503394686707 ,log10(4.740)分割,07:09:07
```
できるエンジニアとは何かを、ChatGPTに聞いてみた

できるエンジニアは、一言で「魔法のような方法」があるわけではなく、複数の良いプラクティスを組み合わせて効率的に問題を解決しています。

たとえば：
### 計画と設計
まず、何を作るのか、どのような要件があるのかを明確にします。大きな問題を小さな部品（モジュール）に分解し、システム全体の設計（アーキテクチャ）を考えることで、後の実装がスムーズになります。

### テスト駆動開発（TDD）やイテレーティブな開発
小さな単位で実装し、その都度テストを行いながら開発を進めます。これにより、バグを早期に発見し、問題が大きくなる前に対処できます。

### 可読性と保守性の重視
他のエンジニアも理解できるような、シンプルで整理されたコードを書くよう心がけます。適切なコメントやドキュメント、命名規則の徹底なども大切なポイントです。

### ツールやライブラリの活用
バージョン管理（Git）、自動テスト、CI/CD、デバッグツールなど、開発を効率化するためのツールをうまく使いこなしています。また、既存の信頼できるライブラリやフレームワークを活用することで、ゼロから全てを作らずに済む工夫もしています。

### 継続的な学習と改善
新しい技術やパターン、ベストプラクティスを常に学び、自分のコードやチームの開発プロセスを見直すことで、より良いシステムを構築していきます。リファクタリングを積極的に行うのもその一環です。

### コミュニケーションと協力
コードレビューやペアプログラミングを通じて、他のエンジニアと意見交換しながら、より良い設計や実装方法を探ります。自分一人で全てを完璧にするより、チームで知識を共有し合うことが成功の鍵です。

 ## 
このように、できるエンジニアは計画性、テスト、コードの質、ツール活用、継続学習、そしてチームワークという側面からアプローチしてプログラミングを行っています。どれか一つだけではなく、全体としてバランス良く取り組むことが重要です。
React input時に、小数点を数字で表示する方法

例えば、数値が「0.00000001」のように小数点以下8桁必要な場合、入力値のフォーマットを8桁固定にする必要があります。以下に2つのアプローチを示します。

## 1. 制御コンポーネントとして onBlur でフォーマットする方法
入力値を state で管理し、フォーカスアウト時に toFixed(8) を使って小数点以下8桁にフォーマットします。

```tsx
import * as React from 'react';
import { Input } from '@/components/ui/input';

export const EightDecimalInput = () => {
  const [value, setValue] = React.useState<string>('0.00000001');

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    // 数字と小数点のみを許容する簡易チェック
    if (/^[0-9]*\.?[0-9]*$/.test(e.target.value)) {
      setValue(e.target.value);
    }
  };

  const handleBlur = () => {
    const num = parseFloat(value);
    if (!isNaN(num)) {
      // 小数点以下8桁に固定
      setValue(num.toFixed(8));
    }
  };

  return (
    <Input
      type="text"
      value={value}
      onChange={handleChange}
      onBlur={handleBlur}
      placeholder="0.00000001"
    />
  );
};
```
この方法では、ユーザーが入力後に必ず小数点以下8桁で表示されるようになります。

## 2. react-number-format を利用する方法
外部ライブラリ react-number-format を使うと、入力中も常にフォーマットを維持できます。以下は Shadcn の Input コンポーネントと組み合わせる例です。

まず、ライブラリをインストールします。

```bash
npm install react-number-format
```
次に、以下のように実装します。

```tsx
import * as React from 'react';
import NumberFormat from 'react-number-format';
import { Input } from '@/components/ui/input';

export const EightDecimalNumberFormatInput = () => {
  return (
    <NumberFormat
      customInput={Input}              // Shadcn の Input を利用
      decimalScale={8}                 // 小数点以下8桁に固定
      fixedDecimalScale={true}         // 8桁を常に表示
      allowNegative={false}            // 必要に応じてマイナス値の入力を禁止
      value="0.00000001"
      placeholder="0.00000001"
    />
  );
};
```
この方法では、入力中も「0.00000001」のように8桁固定で表示され、ユーザー体験が向上します。
RTX4060Tiの載ったUbuntu24.04でFusion360を動かしたい！

## はじめに

こんにちは．孔明です．ロボットの強化学習による制御が流行っているので，波に乗ろうとRTX 4060 Ti (VRAM 16GB)が載ったゲーミングマシンを買いました！！

どうせ学習回すのにしか使わないからとWindows無しのカスタムをして5000円浮かせたところまでは良かったのですが，せっかくスペック盛ったPCがあるならFusion（旧Fusion360）も動かしたいことに届いてから気付きました．計画性がないので．．．（5000円で正規ライセンスのWindowsが買えると思うとつけておけばよかったですよねこれ）

調べてみるとwineで頑張ればFusionが動くらしい記事を見かけたので，それを参考に気合でインストールしてみた備忘録を残しておきます．

## 免責事項

Fusionは公式にはWindowsとMacOS向けにのみ提供されており，今回の手順は外法的な立ち位置です．本稿を参考に行われた作業によって生じたいかなる損害も私は責任を負いかねますのでご了承ください．実施される場合は自己責任でご利用くださいませ．

## 環境

- CPU: Intel Core i5-14400F 
- GPU: NVIDIA GeForce RTX 4060 Ti (VRAM 16GB)
- RAM: 32GB
- OS : Ubuntu 24.04.2 LTS

## 手順

### リポジトリのclone

READMEのコマンドをコピペしても動かなかったので，リポジトリを手元に落として地道に作業します．

```bash
cd ~
git clone https://github.com/cryinkfly/Autodesk-Fusion-360-for-Linux
```

### インストーラの実行

リポジトリ内へ移動して

```bash
cd Autodesk-Fusion-360-for-Linux/files/setup/
chmox +x autodesk_fusion_installer_x86-64.sh
```

インストーラを実行します．
```bash
./autodesk_fusion_installer_x86-64.sh --install
```

しばらく待ちます．成功すると，Fusionが起動してブラウザでサインインするためのボタンが出てきます．

### サインイン

サインインボタンを押下すると，firefoxが起動していつものAutodeskサインインページが開きます．普段どおりにログインします．

### 手動リダイレクト

ここはUbuntuへ無理やりインストールしている今回ならではの手順です．Windowsへ正規のインストールの場合は，サインイン完了後にFusionへ自動でリダイレクトされますが，今回の手順ではこれが期待通りに動作しません．そこで，ブラウザからのリダイレクトで渡されるtokenを手動でコピペしつつ，`AdskIdentityManager.exe`へ与えて起動することでこの問題を回避します．

まずはAdskIdentityManagerがある場所の1個上のディレクトリへ移動します．

```bash
cd ~/.autodesk_fusion/wineprefixes/default/drive_c/Program Files/Autodesk/webdeploy/production/
```

ここで`ls`すると，乱数名？ハッシュ値？のようなディレクトリがいくつか並んでいます．その中から，`Autodesk Identity Manager`ディレクトリを含んでいるものを気合で探してそこへ移動します．

例えば`30c9`というディレクトリにあったとすると（実際はもっと桁数多いです），最終的に`~/.autodesk_fusion/wineprefixes/default/drive_c/Program Files/Autodesk/webdeploy/production/30c9/Autodesk Identity Manager`へ移動すればよいです．

移動できたら，先程ログインしたブラウザへ戻ります．「製品が起動しませんか？再実行」のようなリンクがあるので，ここを右クリックしてアドレスをコピーします．

コピーしたアドレスを以下のコマンドの`YOUR_REDIRECT_ADDR`と置き換えて実行します．ダブルコーテーションは残してください．

```bash
WINEPREFIX=$HOME/.autodesk_fusion/wineprefixes/default wine ./AdskIdentityManager.exe "YOUR_REDIRECT_ADDR"
```

例えばリダイレクトの再実行リンクからコピーできたアドレスが`adskidmgr:/login?code=piyopiyo=`であったとき，以下のコマンドを`~/.autodesk_fusion/wineprefixes/（中略）/Autodesk Identity Manager`で実行すればよいことになります．

実行例は以下の通り．

```bash
cd ~/.autodesk_fusion/wineprefixes/default/drive_c/Program Files/Autodesk/webdeploy/production/30c9/Autodesk Identity Manager
WINEPREFIX=$HOME/.autodesk_fusion/wineprefixes/default wine ./AdskIdentityManager.exe "adskidmgr:/login?code=piyopiyo="
```

セッションの有効期限が切れてしまった場合は，`~/.autodesk_fusion/bin/autodesk_fusion_launcher.sh`を実行してFusionを立ち上げ直しましょう．

これで認証が通れば，晴れてUbuntuでFusionを動かせます．お疲れ様でした！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/e8de3211-2b6e-45b3-8789-2c22e016e4b2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/16b1aa58-4bc9-413b-b020-4cd4bc5d39bf.png)




## 参考資料

- https://github.com/cryinkfly/Autodesk-Fusion-360-for-Linux

- https://github.com/cryinkfly/Autodesk-Fusion-360-for-Linux/issues/512
zodで、セレクトした項目によってinput内容を変えてバリデーションする方法

たとえば、顧客タイプが 'individual'（個人）の場合は companyName（会社名）は任意、'business'（法人）の場合は必須とする例になります。

## 1. discriminated union を使う方法
Zod の discriminated union を使うと、customerType の値ごとにスキーマを分けることができます。以下の例では、'individual' の場合は companyName が任意、'business' の場合は companyName が必須となります。

``` ts
import { z } from 'zod';

const individualSchema = z.object({
  customerType: z.literal('individual'),
  companyName: z.string().optional(),
});

const businessSchema = z.object({
  customerType: z.literal('business'),
  companyName: z.string().nonempty('会社名は必須です。'),
});

const schema = z.discriminatedUnion('customerType', [
  individualSchema,
  businessSchema,
]);

// テスト例
console.log(schema.safeParse({ customerType: 'individual' })); // OK
console.log(schema.safeParse({ customerType: 'business', companyName: '' })); // エラー
この方法は、各ケースごとに独立したスキーマを定義できるため、読みやすく保守しやすいメリットがあります。
```

## 2. 各フィールドに refine を使う方法
companyName フィールドに対して .refine() を適用し、ctx.parent（親オブジェクト）を利用して条件付きバリデーションを実装する方法もあります。以下の例では、customerType が 'business' の場合のみ companyName の入力内容をチェックします。

``` ts
import { z } from 'zod';

const schema = z.object({
  customerType: z.enum(['individual', 'business']),
  companyName: z.string().optional().refine((value, ctx) => {
    // customerType が 'business' の場合のみ companyName の中身をチェック
    if (ctx.parent.customerType === 'business') {
      return value !== undefined && value.trim() !== '';
    }
    return true; // それ以外の場合は常に OK
  }, {
    message: '会社名は必須です。',
    path: ['companyName'],
  }),
});

// テスト例
console.log(schema.safeParse({ customerType: 'individual' })); // OK
console.log(schema.safeParse({ customerType: 'business', companyName: '' })); // エラー
```
この方法は、ひとつのスキーマ定義内で完結できるため、コード量を減らしたい場合に有効ですが、ctx.parent を利用している点や条件分岐が複雑になるとロジックの把握が難しくなる可能性があります。

どちらの方法も一長一短がありますので、プロジェクトの規模やコードの見通しやすさに応じて、適切な方法を選んでください。
M5StampS3でアバター(Avatar.h)で遊ぶ。(スタックチャン)


参考


https://x.com/yamame61012288/status/1889934291230138661



x 過去ログを見よ!!!


結果
----

![image_original (45).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2e8f619c-8e7b-49ab-8067-e50cc60c7207.jpeg)

![o_coq814.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7b425329-c398-4cd8-ba0e-3b400772c6c6.jpeg)


プログラム
----


```c++



#include <M5UnitGLASS2.h>
#include <M5Unified.h>

#include <Avatar.h>
m5avatar::Avatar avatar;

void setup() {
  auto cfg=M5.config();
  cfg.unit_glass2.pin_sda=13;
  cfg.unit_glass2.pin_scl=15;
  M5.begin(cfg);

  //M5.Lcd.setFont(&fonts::lgfxJapanGothicP_16);
  //M5.Lcd.println("こんにちは世界!!");
  //M5.Lcd.setFont(&fonts::FreeMonoBold9pt7b);
  //M5.Lcd.println("SSD1306\nGME12864-51");

  avatar.setScale(.3);
  avatar.setPosition(-88,-96);
  avatar.init();
}

void loop() {
}


```
VyOS 1.5のビルドがocaml、opam周辺で止まったときの対処法

## はじめに
ルーターのOSは様々であるが、使い慣れたdebianベースのものを使いたくなることがある。

そういった個人的な欲求を満たす方法としてVyOSを使うという選択肢があるが、なぜだか無性に`docker build`をしたくなってしまうものです。

https://docs.vyos.io/en/latest/contributing/build-vyos.html

ドキュメントが非常によく整っているので難しくはないものの、一部コードを訂正しないと通らなかったので少し工夫をした点を書き記しておきます。


まず
`https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh`を
`vyos-build/o_install.sh`に保存し、パーミッションを設定する。

次に`o_install.sh`の一部につきコメントアウトや追記をする。
```shell:vyos-build/o_install.sh
#   printf "## Where should it be installed ? [%s] " "$DEFAULT_BINDIR"
#   read_tty BINDIR
    BINDIR=/usr/local/bin
```

また、`vyos-build/docker/Dockerfile`の一部も次のように書き換える。

```shell:vyos-build/docker/Dockerfile
# RUN curl https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh \
#      --output /tmp/opam_install.sh --retry 10 --retry-delay 5 && \
#    sed -i 's/read -r BINDIR/BINDIR=""/' /tmp/opam_install.sh && sh /tmp/opam_install.sh && \

COPY o_install.sh /tmp/o_install.sh
RUN /tmp/o_install.sh
```

これにより`docker build`が通るようになったかと思われます。

## 感想
dockerのお勉強ができてよかったです。
Docker上のPostgreSQLに単体テストプラグイン　pgtapを導入する

# 概要
postgresqlの単体テストをする機会がありましたので、テストフレームワークの
導入方法を共有します。


# 対象読者
Docker上のPostgreSQLにpgtapを導入したい方

# pgtapとは
PostgreSQLのプラグインの一種。
単体テストツール。


https://pgtap.org/documentation.html

# 手順


## linuxの設定
### dockerfile
```dockerfile
FROM postgres:14.0-bullseye

ENV UNAME=user
ENV GID=1000
ENV UID=1000

RUN groupadd -g $GID -o $UNAME
RUN useradd -m -u $UID -g $GID -G sudo -o -s /bin/bash $UNAME
RUN echo "$UNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers


# pgtap
RUN apt-get update \
    && apt-get install -y build-essential git-core libv8-dev curl postgresql-server-dev-$PG_MAJOR \
    && rm -rf /var/lib/apt/lists/*

# install pg_prove
RUN curl -LO http://xrl.us/cpanm \
    && chmod +x cpanm \
    && ./cpanm TAP::Parser::SourceHandler::pgTAP

# install pgtap
RUN git clone https://github.com/theory/pgtap.git \
    && cd /pgtap \
    && make \
    && make install



```



## postgreSQLの設定

### pgtapを有効化する
```sql:00_test_pgtap.sql
CREATE EXTENSION IF NOT EXISTS pgtap;
```

結果
```
psql:0_setup_pgtap.sql:1: NOTICE:  extension "pgtap" already exists, skipping
CREATE EXTENSION
```


### テストコードを書く

テスト内容はテーブルが存在するかという内容です。

#### ddl
```sql:1_productcode.sql

create table public.t1(
no int
)

```

#### テストコード

```sql:1_testcode.sql
BEGIN;
SELECT plan(2);

SELECT tables_are (
        'public',
        ARRAY[
        't1'
        ]
);

SELECT * FROM finish();
ROLLBACK;

```


#### A5:SQLで実行したときの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/86ddaa8f-eee6-4386-be50-1cd12779bc97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/a6e6e146-72fc-4b2f-9a5e-3eecc9730bf5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4ede26eb-3084-4abe-9111-82382188e260.png)

#### docker-コンテナ内のpsqlで実行したときの結果
実行コマンド
```bash
su postgres
psql -U postgres -f src/00_test/1_testcode.sql

```

結果
```bash

postgres@474d21ef2c49:$ psql -U postgres -f 1_testcode.sql
BEGIN
 plan
------
 1..1
(1 row)

                     tables_are
-----------------------------------------------------
 ok 1 - Schema public should have the correct tables 
(1 row)

 finish
--------
(0 rows)

ROLLBACK
postgres@474d21ef2c49:



```



# 感想
・CREATE EXTENSION IF NOT EXISTS pgtap;
　の実行が成功するまでの設定が手間どりましたね。l
　PostgreSQLは拡張性が高いから良いんですけど、設定に慣れないといけないですね。

・CI,CDを使ってテストの自動化もできたら良いですね。
　Github Actionで実現できるか試してみます。

・もうちょっと掘り下げたいですね。
　とりあえずはレコードのアセーションあたりを確認したいですね。

・書き方がxUnit系統なので、学習コストは低いと思われます。

# 参考

issue部分

https://groups.google.com/g/pgtap-users/c/4rQCm5NAWIc?pli=1

参考にしたdockerfile

https://github.com/dalibo/docker-pgtap/blob/master/Dockerfile

result_eq

https://pgtap.org/documentation.html#results_eq

日本語の記事

https://pgsqldeepdive.blogspot.com/2012/12/pgtappostgresql.html


github 差分
https://github.com/RYA234/SQL_Puzzle_Learning/commit/f547b18d6da442311519cee2a0dda618042049da
ダウンロード失敗でリトライする vcpkg

## はじめに
vcpkg はとても便利ですが，パッケージのダウンロード元から 503 エラーが返ってくると `Download failed` と言ってリトライしてくれません。

コンテナの Dockerfile から vcpkg を呼び，クラシックモードでいくつかのパッケージをインストールした状態を作りたいのですが，これだとコンテナビルドがランダムに失敗してつらいです。

## 解決方法

薄いラッパスクリプトを書きました。
vcpkg がエラーを返し，かつ出力に `Download failed` が入っているときだけコマンドを繰り返します。
また，リトライの前に少しだけスリープするようにしてみました。

```shell
#!/bin/bash

set -o pipefail

while true; do
    tmpfile=$(mktemp /tmp/vcpkg-retry.XXXXXX)
    vcpkg "$@" | tee $tmpfile
    vret=$?
    grep "Download failed" $tmpfile
    gret=$?
    rm $tmpfile

    if [ $vret -eq 0 -o $gret -ne 0 ]; then
        exit $vret
    fi

    sleep 3
done
```
個人的備忘録：Excelの基本関数（VLOOKUP）を体系的にまとめて使ってみた

### **はじめに**  
Excelには、データの検索や整理を効率化するための便利な関数が多数用意されています。

:::note info
**その中でも、「VLOOKUP関数」は、特定のデータを検索し、対応する値を取得する際に役立ちます。**
:::

本記事では、VLOOKUP関数の特徴や使い方を詳しく解説し、実際の使用例を紹介します。

### **書こうと思ったきっかけ**  
Excelを使用する中で、大量のデータから特定の情報を検索することがよくあります。

:::note warn
***しかし、VLOOKUP関数の使い方や適切な活用方法に迷うことがありました。***
:::

そこで、この関数の使い方を整理し、具体例とともに分かりやすくまとめることで、より効率的にデータを扱えるようにしたいと考えました。

---

### **VLOOKUP関数の基本**  
| 関数 | 説明 | 例 |
|------|------|----|
| `VLOOKUP` | 指定した値を検索し、対応する列の値を取得する | `=VLOOKUP(1001, A2:C10, 2, FALSE)` |

### **実際に使ってみた**  

#### **1. VLOOKUP関数（指定した値を検索する）**  
`VLOOKUP` 関数は、指定した範囲内で特定の値を検索し、指定した列の値を取得します。

**使用例:**  
```excel
=VLOOKUP(1001, A2:C10, 2, FALSE)
```
**説明:**  
この式は、A2:C10の範囲内で`1001`を検索し、その値が見つかった行の2列目のデータを取得します。例えば、A列にID、B列に名前がある場合、IDが`1001`の人の名前が返されます。

---

### **VLOOKUP関数のポイント**  
- 検索範囲の **最左列** で指定した値を検索する。  
- `列番号` は、検索範囲の **左から何列目** の値を取得するかを指定する。  
- `FALSE` を指定すると、完全一致の検索を行う。

---

### **まとめ**  
- **VLOOKUP関数** は指定した値を検索し、対応するデータを取得する。
- 大量のデータから特定の情報を素早く取り出すのに便利。
- 検索する値は検索範囲の最左列に配置する必要がある。

VLOOKUP関数を使いこなすことで、Excelでのデータ検索が格段に効率化されます。**ぜひ活用してみてください！**
JavaScriptで「コンソールにログを出力する」の動作を確認してみた。

# 概要

JavaScriptで「コンソールにログを出力する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/javascript/console_obj/index1.html

# 実装

コンソールで以下を実行してみました。

```
const hobby = [ '読書', 'ハイキング' ];
console.log('趣味は %O です。', hobby);
```

実行結果は以下の通りでした。

![Screenshot from 2025-02-14 05-47-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/e3dfad96-23cf-4469-badf-aa0d0797c120.png)

# まとめ

何かの役に立てばと。
個人的備忘録：Excelの基本関数（COUNT・COUNTA）を体系的にまとめて使ってみた

### **はじめに**  
Excelには、データの整理や分析を効率化するための便利な関数が多数用意されています。

:::note info
***その中でも、「**COUNT関数**」と「**COUNTA関数**」は、データの個数を数える際に役立ちます。***
:::

本記事では、これらの関数の特徴や使い方を詳しく解説し、実際の使用例を紹介します。

### **書こうと思ったきっかけ**  
Excelを使用する中で、特定のデータの個数を数えたい場面が多くあります。

:::note warn
**しかし、COUNT関数とCOUNTA関数の違いや使い分けに迷うことがありました。**
:::

そこで、これらの関数の使い方を整理し、具体例とともに分かりやすくまとめることで、より効率的にデータを扱えるようにしたいと考えました。

---

### **COUNT関数とCOUNTA関数の違い**  
| 関数 | 説明 | 例 |
|------|------|----|
| `COUNT` | 指定した範囲内の「数値」の個数を数える | `=COUNT(A1:A10)` |
| `COUNTA` | 指定した範囲内の「空白でないセル」の個数を数える | `=COUNTA(A1:A10)` |

### **実際に使ってみた**  

#### **1. COUNT関数（数値の個数を数える）**  
`COUNT` 関数は、指定した範囲内の「数値が入力されているセルの数」を数えます。

**使用例:**  
```excel
=COUNT(A1:A10)
```
**説明:**  
この式は、A1～A10の中にある「数値のセルの数」を数えます。例えば、A1～A10に `適当な乱数データ` が入っている場合、数値が `5, 6, 10` の3つある場合は、`COUNT(A1:A10)` は `3` を返します。

**実際の画面**

![Screenshot 2025-02-14 at 4.53.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2ec651b8-d759-4fbe-8230-ec84d4080c31.png)


#### **2. COUNTA関数（空白でないセルの個数を数える）**  
`COUNTA` 関数は、指定した範囲内の「空白でないセルの個数」を数えます。

**使用例:**  
```excel
=COUNTA(A1:A10)
```
**説明:**  
この式は、A1～A10の中で「空白でないセルの数」をカウントします。例えば、A1～A10にデータや空データがある場合、空白でないセルは `7` を返します。

**実際の画面**

![Screenshot 2025-02-14 at 4.55.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/11361e78-387c-4ae2-9709-58d65652c704.png)

### **まとめ**  
- **COUNT関数** は数値が入力されているセルの数を数える。  
- **COUNTA関数** は空白でないセルの個数を数える。  

これらの関数は、データの個数を把握する際に非常に便利です。

:::note info
***特に、数値のみをカウントしたい場合は `COUNT`、数値以外のデータも含めてカウントしたい場合は `COUNTA` を使うことで、適切にデータを集計できます。***
:::

Excelを活用してデータを分析する際には、これらの関数をぜひ活用してみてください！
OJT 冗長化してみる

## はじめに
前回は単体でEC2を作成してもらいました
今の状態ですと、もしEC2に障害が発生しダウンした場合WEBサイトの閲覧ができなくなってしまいます
そのため、EC2を複数構成にすることで片方がダウンしてもWEBサイトの閲覧が継続できるようにしていきます

### 最終目標
冗長化をした後に、意図的に片方のEC2を停止した後も継続してWEBサイトの閲覧ができることを体験する

### 利用するツール
- putty

## AMIを取得する
前回作成したEC2のAMIを取得していきます
下記画面に移動し、アクションをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/abe59eb3-3f8f-4a48-8ab5-0cff3e5870df.png)
- イメージのテンプレート→イメージを作成をクリック
- AMI名は以下で作成してください
    - OJT-[自分の苗字(ローマ字)]-ami

完了するまで、時間がかかりますのでしばらく待機します
ステータスが利用可能になったら作成完了しています

## AMIから起動する
さきほど作成したAMIからEC2を起動します

起動するAMIにチェックを入れ、AMIからインスタンスを起動をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/32195957-07c8-4f5b-b7ee-fce6b9d0a78f.png)
前回EC2を起動した際と同じように、キーペア・ネットワーク設定を指定します
セキュリティグループは前回作成したものを選択してください
設定が間違ってなければ、インスタンスを起動をクリックします

:::note info
今回のEC2は前回起動したサブネットと別サブネットで起動してください
OJT-subnet-public-ec2-ap-northeast-1d
:::
### 新しく作成したEC2にSSH接続する
サーバーに接続し、前回入力したstatusのコマンドを入力してみてください
すると、既にapacheがインストールされていることがわかると思います
AMIを利用するとEC2のコピーをつくることができ便利です

### apahceを起動する
前回入力してコマンドを、apacheを起動してください
起動後、新規作成するとapacheのデフォルトページが表示されます

## 現状整理
これまでの作業で、2つのサブネットにそれぞれ1つづつEC2を起動することに成功しました
この後はALBというものを使い、ALBにアクセスすると2つのEC2に分配されるように構築してきます

## ALBを作成していく

### ALB用のセキュリティグループを作成する
下記内容で作成してください
|ALB-SG| |
|---|---|
|セキュリティグループ名|OJT-alb-sg|
|VPC|作成したVPC|
|インバウンドルール|会社のIPをポート80で許可する|

### ターゲットグループを作成する

|ターゲットグループ||
|---|---|
|ターゲットタイプの選択|インスタンス|
|ターゲットグループ名|OJT-alb-tg|
|VPC|作成したVPC|

他はデフォルトで次へ進みます
先ほど作成したEC2が表示されますので、2つ選択し
保留中として以下を含めるをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/873e4815-ca73-4df5-a7fa-0e048c7cea46.png)
追加できたら、ターゲットグループの作成をクリックする

### ロードバランサーを作成する
|ロードバランサー||
|---|---|
|ロードバランサータイプ|Application Load Balancer|
|ロードバランサー名|OJT-alb|
|スキーム|インターネット向け|
|IPアドレスタイプ|IPv4|

- ネットワークマッピングは、作成したVPCとALB用のサブネット2つを選択してください
- セキュリティグループは先ほど作成したものを選択してください
- リスナーとルーティングのターゲットグループも先ほど作成したものを選択してください

ロードバランサーの作成をクリックする

今の設定のままだとヘルスチェックに失敗してしまいます。
成功するように調べて設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/6c3486df-75ae-4630-b523-1b0fb14e8ba9.png)

:::note info
ヒント:セキュリティとヘルスチェックの仕様
:::

## ALB経由でEC2にアクセスしてみる
ALBのDNS名をブラウザに貼り付けてみてください
成功するとEC2につながり、WEBページが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/0ec7a2c4-a0b2-4c57-9440-106f8e95b929.png)


### 片方のECを停止してみる
最初の作成したEC2を停止してみます
この状態でALBのDNSにアクセスしても、継続してWEBページが表示されます

## さいごに
あえて何か所か正確に記載せずぼかしました。
このOJTを通して、基本的なコンソール操作と初めて対面する意味不明な事に対処する方法が身についたら幸いです。
個人的備忘録：Excelの基本関数（SUM・AVERAGE・MAX・MIN）を体系的にまとめて使ってみた

### **はじめに**  
Excelは、データの整理や計算を簡単に行える便利なツールですが、特に「**関数**」を使いこなすことで、作業の効率を大幅に向上させることができます。

本記事では、Excelの基本的な関数の使い方を深掘りし、それぞれの機能や実際の使用例を紹介します。

### **書こうと思ったきっかけ**  
日々の業務や学習でExcelを使う中で、「**関数をもっと効率よく活用したい！**」と思うことが多くありました。

:::note info
**特に、データの集計や統計を取る際に基本的な関数を使いこなすことが重要だと実感しました。**
:::

そこで、Excelの基本的な関数の使い方を整理し、実際の使用例を交えて紹介することで、より分かりやすく理解できるようにしたいと考えました。

### **基本的な関数**  
以下の表に、Excelでよく使われる基本的な関数をまとめました。

| 関数 | 説明 | 例 |
|------|------|----|
| `SUM` | 指定した範囲の合計を求める | `=SUM(A1:A10)` |
| `AVERAGE` | 指定した範囲の平均を求める | `=AVERAGE(A1:A10)` |
| `MAX` | 指定した範囲の最大値を求める | `=MAX(A1:A10)` |
| `MIN` | 指定した範囲の最小値を求める | `=MIN(A1:A10)` |

### **実際に使ってみた**  

#### **1. SUM関数（合計を求める）**  
`SUM` 関数は、指定した範囲内の数値の合計を求めます。  

**使用例:**  
```excel
=SUM(A1:A10)
```
**説明:**  
この式は、セル `A1` から `A10` までの数値を合計します。例えば、A1～A10に `1〜10` などの数値が入っている場合、`SUM(A1:A10)` は `55` を返します。

**実際の画面**

![Screenshot 2025-02-14 at 4.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/51322589-0159-44c8-9c3d-f2f6140f3f4a.png)

#### **2. AVERAGE関数（平均を求める）**  
`AVERAGE` 関数は、指定した範囲の数値の平均を計算します。  

**使用例:**  
```excel
=AVERAGE(A1:A10)
```
**説明:**  
この式は、セル `A1` から `A10` までの数値の平均値を計算します。例えば、A1～A10に `1〜10` が入力されている場合、`AVERAGE(A1:A10)` は `5.5` を返します。

**実際の画面**

![Screenshot 2025-02-14 at 4.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/0fda7a01-347c-478d-9273-c1a99c13c955.png)

#### **3. MAX関数（最大値を求める）**  
`MAX` 関数は、指定した範囲内の最大値を取得します。  

**使用例:**  
```excel
=MAX(A1:A10)
```
**説明:**  
この式は、セル `A1` から `A10` までの数値の中で最も大きい値を取得します。例えば、`1〜10` のデータがある場合、`MAX(A1:A10)` は `10` を返します。

**実際の画面**

![Screenshot 2025-02-14 at 4.09.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/984f450a-88cb-4275-8108-b08f07d4fafd.png)

#### **4. MIN関数（最小値を求める）**  
`MIN` 関数は、指定した範囲内の最小値を取得します。  

**使用例:**  
```excel
=MIN(A1:A10)
```
**説明:**  
この式は、セル `A1` から `A10` までの数値の中で最も小さい値を取得します。例えば、`1〜10` のデータがある場合、`MIN(A1:A10)` は `1` を返します。

**実際の画面**

![Screenshot 2025-02-14 at 4.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/34fd230e-8995-4a12-b57b-1db6c3ac3721.png)

### **まとめ**  
- **SUM関数** は数値の合計を求める。  
- **AVERAGE関数** は数値の平均を求める。  
- **MAX関数** は範囲内の最大値を取得する。  
- **MIN関数** は範囲内の最小値を取得する。  

これらの関数は、Excelの基本中の基本ですが、データ集計や分析をする上でとても役立ちます。

:::note info
**特に、SUMやAVERAGEは日常的な業務で頻繁に使用するため、しっかりと理解しておくと便利です！**
:::

Excelを使いこなす第一歩として、これらの関数をぜひ試してみてください！
競プロ日記#25/02/13

# アルゴ式-[文字列の種類数](https://algo-method.com/tasks/879)
set<型> 変数名 で集合を定義できる。
.insert(x)でxを集合に追加できる。その時にfor文で追加するならば一度変数に代入してその変数を.insert()で追加する。（下記参照）
```
for (int i = 0;i < N;i++){
        string x;
        cin >> x;

        setOfString.insert(x);
    }
```
更に.size()で要素数の数え上げをしてくれる。
下記サイトがとても参考になる
[std::set](https://zenn.dev/reputeless/books/standard-cpp-for-competitive-programming/viewer/set)

# アルゴ式-[注文](https://algo-method.com/tasks/6883FHf)
map<keyの型,valueの型>で集合型を定義できる
map型についての扱い方は以下が参考になる
[AA - 3.03.STLのコンテナ](https://atcoder.jp/contests/apg4b/tasks/APG4b_aa?lang=ja)
🇯🇵🤝🪢

こんにちは、Langfuse チームの者です！最近話題の Langfuse というオープンソースツールをご存じでしょうか？👀

[Langfuse](https://github.com/langfuse/langfuse) は、LLMを使ったアプリ開発向けの観察プラットフォームで、モデルの出力を分析したり、アプリの動作をモニタリングしたり、とても便利なんです。

もしまだでしたら、ぜひ一度お試しいただければと思います。使い心地について率直なフィードバックも大歓迎です！

また、気に入ってもらえた場合は、日本語でLangfuseに関する情報や感想をシェアしていただけると、とても嬉しいです🙏。みんなで盛り上げていければと思っています。よろしくお願いします！

新しい日本のランディングページができました： https://langfuse.com/jp
一括で選択肢が見えるUIのアイデア


## 言いたいこと

こんなUIがあったとして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/256aa89a-c227-4c06-8dd8-4180c221cae1.png)

こんなUIでも面白いかもな～と思った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/454cec77-81f0-4ed0-9886-fd9fe2d50523.png)

すべての選択肢と何を選択したのかが一括で分かる。
ついでに視線誘導があって優しい。

さすがに都道府県みたいな選択肢が多いものには使えないが。

終わり。
C# ⇔ (Objective-)C(++) 連携時に対応する型早見表

Unity アプリのコード書いてた頃、iOS API や Android NDK を触る可能性があって調べた知識を供養します。

確かこんな感じだった気がする  
詳しくは Csharp marshaling などで検索

blittable 型早見表
------

|C#|C(++)|Win32API|
|---|---|---|
`byte`|`unsigned char`|`BYTE`
`sbyte`|`signed char`|`INT8`
`short`|`int16_t`[^1]|`INT16`
`ushort`|`uint16_t`[^1]|`WORD`
`int`|`int32_t`[^1]|`INT32`
`uint`|`uint32_t`[^1]|`DWORD`
`long`|`int64_t`[^1]|`INT64`
`ulong`|`uint64_t`[^1]|`QWORD`
`nint`|`intptr_t`[^1]<br>ポインター|`INT_PTR`<br>~~`LONG_PTR`~~[^3]<br>ハンドル
`nuint`|`uintptr_t`[^1]<br>ポインター|`UINT_PTR`<br>~~`ULONG_PTR`~~[^3]<br>ハンドル
`float`|`float32_t`[^2]|`FLOAT`
`double`|`float64_t`[^2]|(なし?)
`ref T`<br>(プリミティブ blittable 型の参照渡し)|`T *`|`T *`
`T[]`<br>(プリミティブ blittable 型の1次元配列)|`T[]`<br>`T *`|`T[]`<br>`T *`

この他、ある構造体のメンバー変数がすべて blittable な値型なら、その構造体もまた blittable です。

[^1]:stdint.h をインクルードする必要があります。(C++では cstdint を使います。)
[^2]:stdfloat をインクルードする必要があります。(C++専用)
[^3]:16ビット以前の時代に `LONG` だった変数をポインターと同じ長さで再定義したときの名残 (ChatGPT談)。どうやら新規コードで `LONG_PTR` と `ULONG_PTR` は非推奨のようです。

blittable じゃないけど知っておくと便利な型
----

これらの型はマーシャリングの負荷が小さいらしいです。

|C#|C(++)|Win32API|
|---|---|---|
`[MarshalAs(UnmanagedType.LPWSTR)] string`|`const char16_t *`|`LPCWSTR`
`[MarshalAs(UnmanagedType.LPWSTR)] System.Text.StringBuilder`|`char16_t *`|`LPWSTR`
`[MarshalAs(UnmanagedType.Bool)] bool`|不明 (Widows 以外あてにならない)|`BOOL`
`[MarshalAs(UnmanagedType.I1)] bool`|Objective-C における `BOOL`|`BOOLEAN`

blittableっぽいけど使うべきでない型
----------------

### C言語の `int`, `long`

具体的なサイズがほとんど定義されてない (仮にうまく動いても単なる偶然) ので、C言語側のコードで `int` 型を使うのは非推奨です。

`long` は Windows ではビット長に関係なく 32bit ですが他のOSだとそうじゃなかったりするのであまりポータブルじゃないです。

### C言語の `float`, `double`

それぞれでサイズが同じでも表現規定が違うため、互換性が保証されていません。

*   C#「IEEE 754 でよろ」
*   C「具体的な内部表現は処理系依存」

### C\# の `char`

C# の `char` は Win32API の WCHAR と同じなんじゃないかと思ったのですが、なんだか複雑な事情があるみたいで簡単にはマーシャリングできないようです。
実際に試したらうまくいかなかった記憶があるのですが……あれはいつの話だったかなぁ?

参考
----

- 「wchar_tは何ビット？ワイド文字の取扱いメモ」(https://qiita.com/everylittle/items/25d5f407f51f5e515d29) (2024年6月10日閲覧)
CsvXlator - CSVファイルをExcelに変換するJavaライブラリの紹介

## はじめに

CSVファイルをExcelファイルに変換する必要性は、業務システムでよくある要件の一つです。今回は、この変換を簡単に実現できるJavaライブラリ「CsvXlator」を開発したので、その機能と使い方を紹介します。

## 特徴

- CSVファイルをExcelファイル（.xlsx）に変換
- ヘッダー行の自動認識とスタイル適用（グレー背景、太字、罫線）
- カスタムCSV形式のサポート（区切り文字、引用符など）
- 文字コードの指定が可能（UTF-8、Shift-JISなど）
- 列幅の自動調整
- ストリームからの読み込みをサポート
- SLF4Jによるログ出力

## 要件

- Java 21以上
- Gradle 8.12.1以上

## インストール方法

### Gradle

``` groovy
repositories {
    maven {
        url = uri("https://maven.pkg.github.com/shizuya-aishima/csvxlator")
        credentials {
            username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
            password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
        }
    }
}
dependencies {
    implementation 'io.github.shizuya-aishima:csvxlator-core:0.1.0'
}
```

## 基本的な使用例

### 1. シンプルな変換（UTF-8、カンマ区切り）
``` java
import com.example.library.CsvToExcelConverter;
import java.io.File;
// デフォルト設定（RFC4180準拠、UTF-8）でコンバーターを作成
CsvToExcelConverter converter = new CsvToExcelConverter();
// CSVファイルをExcelに変換
File csvFile = new File("input.csv");
File excelFile = new File("output.xlsx");
converter.convert(csvFile, excelFile);
```

入力CSVファイル例（input.csv）:

``` csv
名前,年齢,都道府県
山田太郎,30,東京都
鈴木花子,25,大阪府
```

### 2. カスタム設定での使用（Shift-JIS、セミコロン区切り）

``` java
import org.apache.commons.csv.CSVFormat;
import java.nio.charset.Charset;
// カスタムCSV形式を指定
CSVFormat customFormat = CSVFormat.DEFAULT
.builder()
.setDelimiter(';') // セミコロン区切り
.setQuote('"') // ダブルクォートで囲む
.setHeader() // 1行目をヘッダーとして扱う
.build();
// Shift-JISでの読み込み
CsvToExcelConverter converter = new CsvToExcelConverter(
customFormat,
Charset.forName("SHIFT-JIS")
);
converter.convert(csvFile, excelFile);
```

## 生成されるExcelファイルの特徴

- ヘッダー行のスタイル
  - 背景色: グレー（25%）
  - フォント: 太字
  - 罫線: 上下左右に細線
- データ行
  - 自動的に列幅を調整
  - セル値は文字列として保存

## エラーハンドリング
``` java
try {
converter.convert(csvFile, excelFile);
} catch (IOException e) {
// ファイルの読み書きエラー
logger.error("ファイルの処理中にエラーが発生しました: " + e.getMessage());
} catch (IllegalArgumentException e) {
// CSVフォーマットが不正
logger.error("不正なCSVフォーマット: " + e.getMessage());
}
```

## ライセンス

MITライセンスで公開しています。商用利用も可能です。

## ソースコード

GitHubで公開しています：
[CsvXlator - GitHub](https://github.com/shizuya-aishima/csvxlator)

## おわりに

CsvXlatorは、シンプルなAPIと柔軟なカスタマイズオプションを提供し、CSVからExcelへの変換を簡単に実現できるライブラリです。ぜひ使ってみてください。

フィードバックやプルリクエストも歓迎しています。

#Java #Excel #CSV #OSS
Tailwindcss導入

# はじめに
React + Typescript + Viteの環境でのTailwindcssのセットアップ情報は割とありますが、Javascriptの場合があまりなかったので、備忘録がてら記事にします。

# 手順
ライブラリのインストールと初期化を以下コマンドで行います。

```
npm install tailwindcss@3 @tailwindcss/postcss postcss
npx tailwindcss init -p
```
vite.config.js
```
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
// https://vite.dev/config/
export default defineConfig({
  plugins: [react()],
});

```

index.css
```
@import "tailwindcss";
```

postcss.config.mjs
```
export default {
  plugins: {
    "@tailwindcss/postcss": {},
  }
}
```

App.jsx
```
const App = () => {
  return (
    <div className="flex items-center justify-center h-screen bg-blue-500">
      <h1 className="text-white text-4xl font-bold">Hello, Tailwind CSS!</h1>
    </div>
  );
};
export default App;
```



以下コマンでローカルサーバを立ち上げます。
```
npm run dev
```
![スクリーンショット 2025-02-14 1.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693671/0b64fbad-5615-4a0e-93a1-d26809841f39.png)

上記のような表記になっていれば、OK!

# 参考文献
[Get started with Tailwind CSS](https://tailwindcss.com/docs/installation/using-postcss)
[【Tailwind CSS】Vite×React×TypeScriptにおける環境構築方法](https://qiita.com/enumura1/items/71d4b4f75123cf5135fa)
Rails8でEnumを使う／日本語化の方法を追記

## はじめに
Rails8でEnumを使う際に、少し詰まったので備忘録としてのこしておきます。
Rails8から7まで非推奨で使えていたEnumの定義方法が使用禁止となったようです。
また、日本語化の方法も検索して出てきた記事で上手く解決できなかったので、残しておきます。

### バージョン情報
- Rails8
- Ryby3.4

## やりたいこと
- enumを定義したい
- enumの英語表記を日本語化したい

## enumを定義したい
### やったこと

- モデルファイルに以下を記述
    ```ruby
    enum gender: [ :male, :female, :non_binary ] 
    ```
- コンソールで確認
    - Profile.genders

### エラー内容

```bash
 wrong number of arguments (given 0, expected 1..2) (ArgumentError)
```

### 原因

- Rials8ではキーワード引数を使用した列挙型が使用禁止になっている

### 解決策

- 位置引数を使用する

    ```ruby
      enum :gender, [ :male, :female, :non_binary ]
    ```


## enumの英語表記を日本語化したい
### やりたいこと

- 以下のようにenumで定義した単語を日本語化したい
    
    ```ruby
      enum :gender, [ :male, :female, :non_binary ]
    ```
    

### やり方

#### 前提

- 上記の`gender`はプロフィールページとプロフィール更新用のフォームで使用

#### I18nの設定

- Railsプロジェクトを日本語化する
    
    ```ruby
    # config/application.rb
    module Myapp
      class Application < Rails::Application
        config.i18n.default_locale = :ja  # 追加
        config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}").to_s]  # 追加
      end
    end
    
    ```
    
- config/locales配下にymlファイルを作成
    
    ```yaml
    # config/locales/enum.yml
    ja:    # おそらくここを見て、訳文を読み込み
      enum:
        genders:
          male: '男性'
          female: '女性'
          non_binary: 'ノンバイナリー'
    ```
    
    - デフォルトロケールを`:ja`にした場合、ymlファイルのトップに`:ja`があるファイルの訳文を読み込む

#### 使い方

- I18n.t メソッドを使用してymlファイルから訳文を読み込む
    
    ```ruby
    I18n.t("enum.genders.male") # => '男性' と表示される
    I18n.t("enum.genders.female") # => '女性' と表示される
    I18n.t("enum.genders.non_binary") # => 'ノンバイナリー' と表示される
    ```
    
    - :`ja` 以下のymlファイルの記述をメソッドチェーンのように記述することで訳文にアクセスできる
- Viewでの使い方
    
    ```ruby
    %p= I18n.t("enum.genders.#{current_user.display_gender}") # => ログインユーザーの`gender`
    ```
    
- SELECTフォームでの使い方
    
    ```ruby
    = f.select :gender, Profile.genders.map { |k, v| [I18n.t("enum.genders.#{k}"), k]}, {}, class: 'text'
    ```
    
    - `form_with`のselectメソッドは、第2引数に配列を渡すと`[ [ '表示名1', 'Value1' ], [ '表示名2', 'Value2' ] ]` として使用可能
    - `Profile.genders` は`{"male" => 0, "female" => 1, "non_binary" => 2}`というハッシュ
    - `Profile.genders` をmapで `[["男性", "male"], ["女性", "female"], ["ノンバイナリー", "non_binary"]]` にする必要がある
## 参考

- [ActiveRecord::Enum](https://api.rubyonrails.org/classes/ActiveRecord/Enum.html)
- [Rails 7.2のenum非推奨警告を回避する方法と修正ポイント](https://media.zenet-web.co.jp/entry/2024/07/01/085407)
- [Rails 国際化（I18n）API](https://railsguides.jp/i18n.html)
- [【Rails】 I18n入門書~日本語化対応の手順と応用的な使い方](https://pikawaka.com/rails/i18n)
VScode でLaravel（PHP）のデバッグツールを使いたい

# はじめに
VScodeでデバッグツールを導入するための手順を自分なりにまとめました。大体の流れは以下のようになります。
1. 拡張機能のインストール
2. Xdebugのインストール
3. dllのファイル移動
4. iniの書き換え
5. VScodeでlaunch


### 1. 拡張機能のインストール
まずはVScodeの拡張機能である、PHP Debugをインストールします。
画面左の拡張機能アイコンをクリックし、PHP Debugを検索しインストールをクリックします。
### 2. Xdebugのインストール
次にXdebugのインストールを行います。これは人によって既にインストールされている人とそうでいない人がいるらしいのでその確認方法から記載してきます。
まず、publicフォルダ下にinfo.phpファイルを作成し以下のコードを書き込みます。
```php
<?php
phpinfo();
```
次にブラウザでinfo.phpを開きます。すると以下のような画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4008207/ac51a1a6-ac5f-4d54-8da9-80d534d702cf.png)
この画面で Xdebugと検索をかけてヒットしなければ次の手順でインストールしなければなりません。info.phpをすべて選択しコピーしておいてください。
https://xdebug.org/wizard　にアクセスし貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4008207/0a94439b-cf6e-4152-b6b1-5f81b172d17d.png)
そして、Analyse my phpinfo() output　ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4008207/232670cc-b9c0-4887-ab92-1a829093493d.png)
すると、ダウンロードすべきファイルを表示てくれます。このリンクをクリックすることでダウンロードが始まります。ただ、エッジを使うときにセキュリティの問題でうまくいかない場合があります。その時は僕の場合はChromeでするとうまくいきました。いろいろ試してみてください。

### 3. dllのファイル移動
ダウンロードしたファイルの名前をphp_xdebug.dllに書き換え、xampp/php/ext内に格納します。

### 4. iniの書き換え
次にxampp/php/php.iniの一番下に次を記入します。
[Xdebug]
zend_extension="C:\xampp\php\ext\php_xdebug.dll"
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9000
xdebug.log=C:\xampp\tmp\xdebug.log

### 5.VScodeでlaunch.json内を書いていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4008207/3e57843e-9de6-42d2-98d1-cd755b0e7ad2.png)
画面左のタスクバーの虫のアイコンを選択し、デバッグを実行します。この時Listen for Xdebugを指定します。さらにlaunch.jsonを開き
```json
"version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "pathMappings": {
                あなたのプロジェクトのパス": "${workspaceFolder}"
            },

            "log": true
        }
    ]
```
保存をかけてこれで終了です！！！僕はこれで使うことが出来ました。
上手くいかないときには、xammpのlogを調べチャットGPTとかに聞くと解決してくれるかもしれません。