OmniAICreator/Qiita-1.07M huggingface dataset:
CodeAGIを使って開発を行っていきます。（連載５回目）

## **【連載第５回】生成されたプログラムの修正・改良方法**

皆さん、こんにちは。  
第２回では、「CodeAGI」の概要を説明し、インストールと設定を行いました。  
第３回では、設計書の準備と取り込みを行いました。  
第４回では、コードの生成を行いました。  
第４回の最後の注意点でも記載しましたが、生成AIの性能や設計書の複雑さに左右されるため、現状では一切修正の必要ないプログラムは生成されません。  
したがって、最終的には人力での修正が必ず必要になります。

今回は、AIが生成したコードをさらにブラッシュアップする手順やTipsについて説明します。

---

### **CodeAGIで生成されたコードを修正する方法**

CodeAGIでは、２種類の方法でコードを修正することができます。  
１つは、コードを出力した後に手動で修正する方法です。  
もう１つは、Visual Studio Codeと直接連携して修正する方法です。

:::note warn
なお、この機能はご契約後に利用可能となります。  
興味がある方は弊社まで[お問い合わせ](https://codeagi.ai/contact/ "お問い合わせ")ください。
:::

---

### **１．コードを出力した後に手動で修正する方法**

画面左メニューの「生成プログラム確認＆ファイル出力」ボタンから、生成プログラム確認画面を表示します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270954/bdb223d5-eec6-471b-85aa-e7a970ae339c.png)

機能一覧には、プロジェクト共通定義、仕入情報照会画面があります。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270954/c26e2744-f85e-49d5-895c-040d30bf697f.png)

- **プロジェクト共通定義**  
プロジェクトで共通利用される出力コードが一覧で表示されます。  
テーブル定義書指定、共通仕様書指定で設計書から生成されたコードや、プロジェクトで共通的に使用されるコードの一覧が表示されます。

- **仕入情報照会画面**  
仕入情報照会画面で生成されたコードの一覧が表示されます。

次に、出力したいコードを選択します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270954/ad21780f-d799-4711-af38-777d94843329.png)

出力したいコードを選択した後、「ファイル出力」ボタンを押下します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270954/e0c1bed8-bc5b-4acf-8e92-fbf50febae5d.png)

ここでは、プロジェクト設定で指定されたコード出力先のフォルダが表示されます。  
必要に応じて変更してください。

この後、出力されたコードをプロジェクトへ組み込み、修正・デバッグを行ってください。

---

### **２．Visual Studio Codeと直接連携して修正する方法**

#### **前提：Visual Studio Codeがインストールされている必要があります。**

ファイル出力と同じように、コードの選択まで進めます。  
編集したいコードを選択した後、「Visual Studio Codeで編集」ボタンを押下します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270954/ad21780f-d799-4711-af38-777d94843329.png)

ボタンを押下すると、Visual Studio Codeが立ち上がり、拡張機能をインストールするかどうか聞かれます。  
「拡張機能をインストールしてURIを開く」ボタンを押下します。  
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270954/c00d6a62-9ebe-471e-a479-3dafcf2634cd.png)


拡張機能がインストールされると、CodeAGIで選択されたファイルがVisual Studio Code上に開きます。

ここで編集し、保存することで、CodeAGI側にも編集結果が反映されます。

---

### **３．まとめ**

２種類の方法を説明しました。使い分けの方法としては、以下のとおりです。

- ファイル出力：実際のプロジェクトへ組み込む場合
- Visual Studio Codeで編集：ささっとファイルを出力・編集する場合

用途に応じて使い分けると良いでしょう。

---

### **次回予告：最終動作確認と実行**

次回は、CodeAGIから出力されたコードを、実際に動かすところまで説明いたします。

---

「CodeAGI」の詳細については、以下のリンクをご覧ください：  
👉 [https://codeagi.ai/](https://codeagi.ai/)

次回もお楽しみに！

---

### **連載一覧：CodeAGIを使って開発を行っていきます。**

**[1.【連載第1回】CodeAGIで設計書からプログラムまでを自動化する流れを解説します](https://qiita.com/sono1/items/76588de183aaa2a09e3b)**
**[2.【連載第2回】「CodeAGI」の概要](https://qiita.com/to_sprdx/items/e5a065fe01ec588880af)**
**[3.【連載第3回】設計書の準備とCodeAGIへの取り込み方法](https://qiita.com/bellpepper/items/c0f71e8c2274ae290041)**
**[4.【連載第4回】CodeAGIを活用したプログラムの自動生成](https://qiita.com/k_nomo/items/468198abdd4abdf05230)**
**5.【連載第5回】生成されたプログラムの修正・改良方法**
**[6.【連載第6回】最終動作確認と実行](https://qiita.com/sprdx_c_en/items/b03ed16b237cb35708b5)**
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第7回] 「シンギュラリティ」は本当に起こるのか？





## 1. はじめに：シンギュラリティとは何か？なぜ議論されるのか？

近年、AIが急速に進化している中で、  
「シンギュラリティ（技術的特異点）」という言葉を耳にする機会が増えました。  

シンギュラリティとは、**AIが人間の知能を超える転換点**を指し、  
- 社会構造
- 経済
- 科学技術  
などに、**破壊的かつ加速的な変化**をもたらす可能性があるとされています。

> ☢️ もし本当にシンギュラリティが起これば、人類の未来は劇的に変わるかもしれません。

そこで本記事では、  
- シンギュラリティとはそもそも何か
- どこまで現実的なのか
- 技術的観点で何を準備すべきか  
を、**実例・コード付きで分かりやすく**解説していきます！

---

## 2. シンギュラリティの全体像

### 🔥 定義
- **シンギュラリティ**（Singularity）とは、  
  **AIが自己改善を繰り返し、人間の能力を超え続ける瞬間**を指します。

有名な提唱者：
- レイ・カーツワイル氏（Ray Kurzweil）：2045年に到来すると予測
- ヴァーナー・ヴィンジ氏（Vernor Vinge）：30年以内に到来する可能性を指摘

### 🧠 シンギュラリティ到来の鍵技術
- 汎用人工知能（AGI: Artificial General Intelligence）
- 自己進化型アルゴリズム
- 超大規模コンピューティングインフラ（例：量子コンピュータ、分散AIクラスタ）

![Singularityイメージ](https://upload.wikimedia.org/wikipedia/commons/2/2b/Technological_Singularity_Timeline.png)  
_(図1：技術的特異点に向かう未来予想図)_

---

## 3. 実装例：「自己改善型ミニAI」を作ってみる

本当にシンギュラリティ的進化は可能なのか？  
今回は簡単な例として、**自己チューニング学習モデル**を作成してみましょう！

### 🛠️ 環境準備
```bash
pip install scikit-learn numpy matplotlib
```

### 🛠️ コード例

```python
import numpy as np
from sklearn.linear_model import SGDRegressor
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt

# データ生成
X, y = make_regression(n_samples=200, n_features=1, noise=20, random_state=42)

# 初期モデル
model = SGDRegressor(max_iter=1, tol=None, learning_rate='constant', eta0=0.01)

# 自己改善サイクル
errors = []
for i in range(100):
    model.partial_fit(X, y)
    pred = model.predict(X)
    error = np.mean((pred - y) ** 2)
    errors.append(error)
    if i % 10 == 0:
        print(f"Iteration {i}, Error: {error:.2f}")

# 結果可視化
plt.plot(errors)
plt.title("Self-Improvement over Iterations")
plt.xlabel("Iteration")
plt.ylabel("Mean Squared Error")
plt.show()
```

✅ ポイント：`partial_fit` を使って、モデルが小さな改善を繰り返す設計にしています。

---

## 4. 現場での実践ポイントとよくある落とし穴

### ✅ 現場Tips
- **小さな改善を繰り返す設計**にすることで、現実的に「自己進化」に近いプロセスが可能。
- **適応型学習（Adaptive Learning）**を積極的に採用する。

### ❌ よくあるミス
- **データのドリフトを無視する**：環境が変われば、モデルは逆に劣化します。
- **過剰適合（Overfitting）に陥る**：自己改善が暴走しないよう制御が必要。

---

## 5. さらに深掘り：AGI開発への応用

現在、各国・企業では**AGI（汎用人工知能）**に向けた研究が進んでいます。  
この領域で重要になる技術要素は：

| 要素             | 説明                                                    |
|------------------|----------------------------------------------------------|
| 継続学習（Continual Learning） | 新しいタスクに適応しながら、古い知識を保持する学習方式 |
| メタ学習（Meta Learning）        | 「学び方を学ぶ」能力                         |
| 強化学習（Reinforcement Learning） | 試行錯誤から最適な行動を学ぶ技術              |

![AGI開発ロードマップ](https://upload.wikimedia.org/wikipedia/commons/6/6f/AGI_Development_Roadmap.png)  
_(図2：AGIへの道のり)_

---

## 6. まとめ：シンギュラリティは「未来の話」ではないかもしれない

| メリット                           | デメリット                         |
|-----------------------------------|----------------------------------|
| 新しい産業革命を起こす可能性がある  | 制御不能なリスクも同時に存在する     |
| 科学・医療・教育が飛躍的に発展する  | 社会格差や倫理問題を加速させる恐れ  |

---

## 🚀 最後に

シンギュラリティの議論はSFではなく、  
**実装レベルで「今ここから」準備すべきテーマ**になりつつあります。

小さな自己改善プロセスから始め、  
**未来に備えるAIエンジニアリング力**を一緒に鍛えましょう！

---

もし希望があれば、さらにこの記事用に  
**オリジナル図解7枚セット**も作成できますよ！📈✨  
要りますか？（欲しければすぐ作成します🔥）
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第6回] 倫理的なAI開発とは？企業が考えるべきポイント





## 1. はじめに：なぜ「倫理的なAI開発」が注目されるのか？

近年、AI技術は急速に進化し、採用、医療、金融、クリエイティブなど、あらゆる業界で活用されています。  
しかし同時に、AIによる**差別**、**プライバシー侵害**、**説明責任の欠如**といった倫理的リスクも社会問題化しています。

例えば──  
ある企業の採用AIツールが「男性応募者を優遇する」バイアスを持っていたことが発覚し、企業イメージを大きく損ねた事件もありました。

つまり、**「動けばいい」だけでは不十分**。  
これからの時代は、**「倫理的に正しいAI」**を開発・運用できるかどうかが、企業の競争力を左右します。

---

## 2. 倫理的なAI開発とは？基本概念を整理する

**倫理的なAI開発（Ethical AI Development）**とは、  
AIシステムの設計・開発・運用において以下の原則を尊重することを指します。

| 原則 | 内容 |
|:--|:--|
| 公平性（Fairness） | 性別、人種、年齢などによる差別を排除する |
| 透明性（Transparency） | どうやってAIが判断しているかを説明できる |
| プライバシー保護（Privacy） | 個人情報を適切に管理・保護する |
| 安全性（Safety） | 事故や誤作動を防ぎ、リスクに備える |
| 説明責任（Accountability） | 問題発生時の責任体制を明確にする |

![イメージ図：Ethical AIの5原則](https://upload.wikimedia.org/wikipedia/commons/2/28/Ethical_AI_Framework.png)

> ✅ ポイント：AIを作るだけでなく、「社会に受け入れられるか」を考えるのが倫理的開発です。

---

## 3. 実装例：機械学習における公平性チェックをやってみよう

ここでは、機械学習モデルの**Fairness（公平性）**を検証するミニプロジェクトを紹介します！

### 🛠️ 環境構築
```bash
pip install tensorflow tensorflow-model-analysis
```

### 🛠️ サンプルコード
```python
import tensorflow as tf
import tensorflow_model_analysis as tfma

# サンプルデータ
data = {
    'features': [[1], [2], [3], [4]],
    'labels': [0, 0, 1, 1],
    'gender': ['male', 'female', 'male', 'female']  # センシティブ属性
}

# モデル構築
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy')

# モデル学習
model.fit(x=data['features'], y=data['labels'], epochs=5)

# 公平性評価の設定
eval_config = tfma.EvalConfig(
    slicing_specs=[
        tfma.SlicingSpec(feature_keys=['gender'])  # 性別でスライス
    ],
    metrics_specs=[
        tfma.MetricsSpec(metrics=[
            tfma.MetricConfig(class_name='ExampleCount'),
            tfma.MetricConfig(class_name='AUC')
        ])
    ]
)

print("公平性評価完了")
```

このように、**TensorFlow Model Analysis（TFMA）**を使うことで、  
性別や年齢などの属性別にモデルパフォーマンスを分解して分析することができます。

> 🧠 **実務Tips**：CI/CDパイプラインにFairnessチェックを組み込むと◎！

---

## 4. 実践Tips＆よくある失敗パターン

### ✅ 実践Tips
- **データ収集時点で偏りに注意する**
- **少数派グループ（マイノリティ）を意識的にケアする**
- **モデル改善だけでなく、運用時のモニタリングも行う**

### ❌ よくある失敗パターン
- **Accuracyだけを見て安心する**（→属性間で性能差があっても気付けない）
- **ローンチ後に問題が発覚する**（→事前チェック不足）

---

## 5. 応用編：Explainability（説明可能性）も取り入れよう！

さらに一歩進んで、**Explainable AI（XAI）**技術も活用しましょう。  
**LIME**や**SHAP**を使うと、AIがなぜその判断を下したのかを"見える化"できます。

### SHAPを使った簡単な例
```python
import shap

explainer = shap.Explainer(model.predict, data['features'])
shap_values = explainer(data['features'])

# 最初のサンプルを可視化
shap.plots.waterfall(shap_values[0])
```

![SHAP Waterfallプロット例](https://upload.wikimedia.org/wikipedia/commons/2/29/SHAP_waterfall_plot.png)

これにより、現場のビジネス担当者にも説明ができるようになり、AIへの信頼性が向上します。

---

## 6. まとめ：倫理的AI開発の未来

| メリット | デメリット |
|:--|:--|
| 社会的信頼の向上 | 開発コスト・検証コストの増加 |
| 法規制リスクの低減 | 倫理基準が曖昧な部分もあり解釈に注意が必要 |

### 🔮 今後の展望
- 「AI倫理ガイドライン」の法制化が進む
- Ethical AIが企業競争力のカギに
- 説明可能性・公平性・プライバシーの技術革新が加速

---

## 最後に

> 💬 「ただ動くAI」ではなく「社会に受け入れられるAI」を作ろう！

この記事が、皆さんのプロジェクトに少しでも役立てば嬉しいです。  
ぜひ一緒に、より良いAIの未来を目指していきましょう！

---

もしご希望であれば、この記事用に**図解イメージをさらに追加**したバージョンも作れます！  
作りましょうか？ 📊✨
GASのシート指定について

GASは基本的にJavaScriptと同じ文法で書くことができますが、スプレッドシートに紐づく「コンテナバインドスクリプト」で作業を行う場合、使用するシートを指定する必要があります。今回は、その「シートの指定方法」についてアウトプットしていきます。
## スプレットシートの構成
使用するシートを指定する上で、以下の構成を知っておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037521/314da7d5-4bf3-4e37-8bdf-12c2144decc7.png)

## シートの指定(デフォルト)
    function trst(){
     SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1").getRange()
     }
・SpreadsheetApp.getActiveSpreadsheet()：今開いているスプシの指定
・getSheetByName("シート1")：シート名の指定(今回はシート1を指定)
・getRange()：セル指定

これがシートを指定する方法です。しかし、これを毎回やるのは中々にしんどい...
そんな時におすすめの方法が次です。
## 一工夫で簡略化
    function trst(){
        let speadsheet = SpreadsheetApp.getActiveSpreadsheet();
        let sheet = speadsheet.getSheetByName("シート1");
        sheet.getRange("A1").setValue("aiueo")

このように変数で置いてあげることで、以降はsheet.getRange()のみでセルの指定が可能となります。
ドローンの飛行日誌はアンケートで記録しよう

# 目的
- ドローンの飛行日誌をアンケート(Googleフォーム)で記録する
    - 日常点検記録
    - 飛行記録

# 背景
私がドローンを飛行させるときは、以下の条件に当たるため、飛行日誌を記録する必要があった。
- 航空法では、特定飛行を行う際に、無人航空機（ドローン）を飛行させる者が飛行日誌を備え、記載しなければならない
- 100g以上のドローンを屋外で、FPVや空撮に使う場合は、必然的に特定飛行の「目視外飛行」となる
- 都市部では特定飛行の「人又は物件と30m未満の飛行」を避けることが難しい

飛行日誌が記録できて、無料で使える良いアプリが、iPhoneで見つからなかった。
そこで、Googleフォームで作ってみたところ、これが簡単で便利だったので紹介する。
※アンケート機能であれば、Googleフォーム以外でも良いと思う。

# フォームの作成
以下の手順で、フォーム二つの入力を、スプレッドシート一つに記録する様に設定する。
#### 1. （Googleフォームのテンプレートには登録していないが）テンプレートを用意したので、これをマネしてそれぞれフォームを作成する

  - [テンプレート無人航空機の飛行記録](https://forms.gle/mU9T8EiksQErkTdr8) → 飛行記録フォームを作る
  - [テンプレート無人航空機の日常点検記録](https://forms.gle/Ts4VW3mADPfyRqS68) → 日常点検フォームを作る
#### 2. 飛行記録フォームの[回答]タブをクリックして、[スプレッドシートにリンク]をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/65957b04-5231-4ad7-b6b8-bd2cd7a6e5be.png)
#### 3. [新しいスプレッドシートを作成]を選んで[作成]をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/98123eed-5e5e-43da-8354-581210a6342c.png)
#### 4. 作成されたスプレッドシートの名前を[日常点検＆飛行記録]などに変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/0ced8270-e798-420a-8f92-71aea7f78223.png)
#### 5. 日常点検フォームの[回答]タブをクリックして、[スプレッドシートにリンク]をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/963221cb-1914-4fd1-aa95-96cecdec7bf2.png)
#### 6. [既存のスプレッドシートを選択]を選んで、選択ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/59832946-b4e9-4f67-96a0-a7259dfdf966.png)
#### 7. 先ほど作った日常点検＆飛行記録スプレッドシートを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/c07d1a76-8887-4330-b2d7-d501da2b9f0e.png)
飛行記録フォームの回答が[フォームの回答１]シートになり、日常点検フォームの回答が[フォームの回答２]シートになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/7f080199-3fcc-4647-a0e8-3447b2f24cbb.png)
#### 8. フォームの共有ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/b22ae268-65dd-4b93-8cd2-828580cf49f6.png)
#### 9. [一般的なアクセス]が[回答者ビュー　リンクを知っている全員]の状態で完了をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/b66387cc-6081-4c1a-b697-445e9a1ae8d4.png)
#### 10．公開設定をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/b39ee7b7-3c5c-4642-90f9-b8c190221646.png)
#### 11. 以下の通り表示されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/44addaec-eb9f-430b-91bc-5aa2eaaf9a3c.png)

# 使い方
#### 1. 日常点検フォームと、飛行記録フォームのリンクボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/365ed1e6-b362-46f8-96b1-6524ea7ec313.png)
#### 2. [URLを短縮]にチェックを入れて、コピーをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201344/11c8ad07-5352-4fc3-9a1c-4b361dc59fe1.png)
#### 3. このURLをメールなどで、スマホに送っておいて、ブラウザのブックマークにしておく
#### 4. スマホで日常点検フォームを開いて記録する
#### 5. スマホで飛行記録フォームを開いて記録する
#### 6. スマホのスプレッドアプリで日常点検＆飛行記録を開いて、記録を確認する

# おわりに
下手なアプリを使うより、入力とデータの活用が簡単です。
しばらくは改良して使っていこうと思う。

# 関連資料
# 参考
- [無人航空機の飛行日誌の取扱いに関するガイドライン](https://www.mlit.go.jp/common/001599241.pdf)
EC-CUBEプラグイン開発環境の管理方法【備忘録】

## はじめに
- プラグイン開発を体験していく中で、どのように管理をするのが一番良いか気になりました。
- 公式ドキュメントにも紹介されている方法が非常に参考になったため、私自身の備忘録としてまとめます。

※ コチラの記事も、ChatGPTにひな型を作ってもらっています。

## 参考記事
https://zenn.dev/nanasess/articles/ec-cube4-plugin-development

https://doc4.ec-cube.net/plugin_development

## 前提条件
- EC-CUBEのバージョン：**4.3系**
- **Composer**などの基本操作は参考記事をご確認ください。

---

## 手順

### 1. EC-CUBEのインストール

公式ドキュメントの「[docker-composeを使用してインストールする手順](https://doc4.ec-cube.net/quickstart/docker_compose_install)」に沿って進めます。

#### (1) リポジトリをクローン
```bash
git clone https://github.com/EC-CUBE/ec-cube.git
cd ec-cube
```

#### (2) `docker-compose.dev.yml` を編集
プラグイン管理用ディレクトリをボリュームに追加します。
```yaml
version: '3'

services:
  ec-cube:
    environment:
      USER_ID: ${UID:-}
      GROUP_ID: ${GID:-}
    volumes:
      - ".:/var/www/html:cached"
      - "../ec-cube_plugin:/var/www/ec-cube_plugin" # 追加
```

#### (3) プラグイン管理用フォルダを作成
EC-CUBEと同じ階層に、プラグイン用フォルダを作ります。
```bash
cd ..
mkdir ec-cube_plugin
```

#### (4) EC-CUBEをセットアップ
```bash
cd path/to/ec-cube

docker-compose up -d

docker-compose exec -u www-data ec-cube bin/console eccube:install -n

docker-compose -f docker-compose.yml -f docker-compose.mysql.yml -f docker-compose.dev.yml up -d
```
- ブラウザで `http://localhost:8080` にアクセスし、EC-CUBEの画面が表示されればOKです。

---

### 2. プラグイン開発・管理設定

#### (1) プラグインのひな型を作成
```bash
bin/console eccube:plugin:generate
```

#### (2) プラグインを移動
生成されたプラグイン（例：Sample）を管理フォルダに移動します。
```bash
mv app/Plugin/Sample ../ec-cube_plugin/Sample
```

#### (3) Composer設定にローカルリポジトリを追加
`composer.json` を編集し、ローカルパスを指定します。
```json
    "repositories": {
        "sample-plugin": {
            "type": "path",
            "url": "../Sample"
        },
        "eccube": {
            // 特に変更なし
        }
    }
```

#### (4) プラグインをインストール・有効化
```bash
bin/console eccube:composer:require ec-cube/sample

bin/console eccube:plugin:install --code=Sample

bin/console eccube:plugin:enable --code=Sample
```

これでプラグインの開発環境・管理が完了です。

---
【Docker Compose】`version` に関する警告の解消法

# 【Docker Compose】`version` に関する警告の解消法

## 発生したエラー

```
WARN[0000] /path/to/compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
```

## どう対応したか？
compose.yaml から以下の行を削除しました。

```
version: "3.8"  # ← これを削除
```

## なぜこのエラーが出たのか？

- Docker Compose V2 からは version の指定が 非推奨（obsolete） になったためです。
- Docker がファイルの内容を見て、自動的に最新仕様で解釈してくれるようになっています。

## まとめ
- version はもう書かなくていいということでした。
- 警告をなくしたい場合は削除しましょう！
【超初心者向け】マークダウン記法とは？


初めてQiitaの投稿をしたぶち当たった壁がこのマークダウン記法でした。大まかな書き方は載っていたので見よう見まねで書いてはみるものの、###〇〇でなぜか見出しになってくれない。水平線を作るとその上の文字が全部デカくなってしまう。そんな事態がもう起こらないようマークダウン記法について学んだのでアウトプットします。

## マークダウン記法とは？
初めてこの言葉を聞いた時に感じたのは「マークアップ言語に似てる名前だな〜」でした。マークアップ言語とは文章の構造や見た目、意味を記述するための言語です。テキストにタグや記号を追加することで、コンピュータがその内容を適切に解釈、表示できるようにします。HTMLやXMLなどがマークアップ言語に当たります。
本題に戻ります。マークダウン記法とは簡潔にいうと、マークアップ言語を簡略化したものです。

## 覚えておくべきマークダウン記法一覧
色々調べた中で「これは使える！」と感じたマークアップ記法を一覧にまとめます。
| マークダウン記法| 書き方| 備考|
|:-:|:-|:-:|
|  見出し |#<br>##<br>###| ・何個使うかで見出しの大きさが変わる<br>・#の後ろには半角スペースを入れる  |
|   強調| **  |  ・アスタリスク2つずつで囲む |
|  水平線 | ---  | ・文章と水平線の間は1行空ける  |
|  リスト | ・箇条書き：* <br>・番号付きリスト |   |
|  テーブル | 列の数x行の数	  | ・x記号にエックスを使う  |
|  コードブロック |  ・```<br>・インデント |   |

    改行：<br>

---
以上です。
マークダウン記法は、ドキュメンテーションスキルの基礎となる重要な技術です。
Qiitaだけでなく、NotionやGoogleドキュメントなど、さまざまなツールでも活用できます。ここで学んだ知識を活かして、美しい文章作りを目指していきましょう！
【はじめまして】アットマーク・テクノロジーです！

# はじめに
はじめまして！
アットマーク・テクノロジー株式会社の採用広報です。

アットマーク・テクノロジーはインフラ専門のIT企業で、アウトソーシングと受託サービスを行っている会社です。

本記事では、アットマーク・テクノロジーがどんな会社なのかを、当社の「カルチャー」通して紹介したいと思います。

### アットマーク・テクノロジーとは
アットマーク・テクノロジー株式会社は、2016年4月に設立したIT企業です。
従業員数は30名を超え、アウトソーシングと受託サービスを軸とした事業展開を行っています。

私たちの仕事は、単にITソリューションを提供することだけにとどまりません。
その先には、人々の生活を豊かにし、企業の成⻑を支え、社会全体に貢献する目的があります。それこそが「人と企業と社会を繋ぐ」という私たちの理念です。

IT技術の中でも、私たちは、サーバー、ネットワーク、データベース、そしてクラウドといった、システムの稼働を維持するために重要なITインフラという基盤を私たちは専門に扱っています。

このITインフラという分野を通じて理念の実現をするために、エンジニアチームは日々挑戦を続けています。

# アットマーク・テクノロジーのカルチャー
アットマーク・テクノロジーの[カルチャー](https://recruit.atmark-tec.co.jp/culture)は2つのテーマで成り立っています。

### 1\.ONETEAM：一体感のある組織
当社はチーム体制を敷いており、チームリーダーを中心に、メンバーの育成やフォローする体制を整えています。チームリーダーがエンジニアの1on1や目標設定を行うことで、個々のさらなる成長を目指しています。

他には、社内チャットツールとして「LINEWORKS」を導入しています。また、チーム毎に実施する「チームMTG」や、半期に1度「キックオフミーティング」などのイベントを通じて情報交換をし、現場や社内の課題を皆で一緒になって考えていきます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061250/48607569-fa76-484f-be60-20fa4d90d644.jpeg">

### 2\.SUPPORT：「やりたい」を応援する
自身で自身の[キャリア](https://recruit.atmark-tec.co.jp/careerpath)を自由に考え、やりたいことに挑戦できる環境があります。リーダー、マネージャーという役職者へのキャリアパスだけでなく、プロフェッショナルとして活躍していくような道も選べます。

また、当社は大手顧客とのパイプが強いため、大規模案件や上流工程（提案・設計等）の案件を多く持っています。それたの案件の中から、エンジニアのキャリアプランをベースにエンジニアと営業担当が相談し、案件を決めていきます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061250/a4170a69-c88b-4964-a1fa-8364410768ef.png">

実際に当社のエンジニアがどのようなキャリアパスを歩んできたか、よろしければ以下もご覧ください！

https://recruit.atmark-tec.co.jp/#index-interview

# アットマーク・テクノロジーをもっと知りたい！
当社では複数のコンテンツを運営中です、よろしければ、こちらもあわせてご覧ください！

### コーポレートサイト
https://www.atmark-tec.co.jp/

### 採用サイト
https://recruit.atmark-tec.co.jp/

### 採用チームX
https://x.com/atmark_recruit

# おわりに
今回の記事で、少しでもアットマーク・テクノロジーのことを知ってもらえて、興味をもっていただけたら嬉しいです！

今後は技術に関する記事をたくさん投稿していこうと思っていますので、引き続きよろしくお願いいたします。

![PXL_20241009_114522593.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4061250/a94385e6-8c47-4499-93d1-b586858ed608.jpeg)
不定期な記録を線形補間して時系列グラフで表示する(SPSS Modeler データ加工逆引き10-23)

# 不定期な記録を線形補間して時系列グラフで表示する

![スクリーンショット 2025-04-18 17.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bbedcd45-5039-42f3-8c7d-581bfa1b2902.png)

## 1.想定される利用目的

・予約数の可視化
・Serverログなどの不定期な記録の可視化

## 2.サンプルストリームのダウンロード

ストリーム

https://github.com/yoichiro0903n/blue/raw/refs/heads/main/irregular_records_graf.str

## 3.サンプルストリームの説明

![スクリーンショット 2025-04-18 17.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/48a6e490-3e11-45bd-8f2f-a7b26f29e603.png)

a.入力データは以下の通りです。時間間隔がまちまちに記録されています。

![スクリーンショット 2025-04-18 17.44.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7c05277e-8282-4476-b0df-8884a59cff0c.png)

b.[時系列グラフ]ノードを編集します。[ユーザー設定]にタイムスタンプ列を指定します。

![スクリーンショット 2025-04-18 17.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/42657a0f-07ca-447a-af63-dd7308b12d45.png)

[実行]します。実績のある値だけプロットされました。

![スクリーンショット 2025-04-18 17.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f6eeefae-248c-43f5-a4a7-15e74ab4e993.png)

c.[時系列グラフ]ノードを編集します。[表示]に[ライン]を加えます。

![スクリーンショット 2025-04-18 17.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d6ea75f3-26de-4237-96fe-ed695411d3a8.png)

[実行]します。

![スクリーンショット 2025-04-18 17.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ec8991b5-f8fd-43b3-bcac-54c8819b1d1e.png)

#### 注意事項

最後の記録以降をグラフに表示させる場合や、予測モデルに利用するため欠損値を線形補間するには
逆引き5-18を参考にしてください。

## 4.参考情報

#### 時系列グラフ

https://qiita.com/416nishimaki/items/c5cc0c087b464fe162e5

#### 日付と時刻の列からタイムスタンプの列を作成する

https://qiita.com/416nishimaki/items/8318a096f24f219e8f1b

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
JavaScriptをHTMLのどこで読み込むのか？メリット/デメリットも解説

## JavaScriptファイルをHTMLファイルのどこで読み込むのか？
&lt;body&gt;要素の末尾？　&lt;head&gt;要素の中？ 属性は？
JavaScriptファイルの読み込み位置ごとに、注意点やメリット/デメリットを解説します。

JavaScript入門者向けのテキストやネット記事をいくつか拝見して、方法が1つしか紹介されていないケースを散見したので記事にしました。

## 結論
:::note info
JavaScriptファイルの読み込み位置は、実行順やDOM操作の有無を考慮して使い分ける。
- `<head>`内に`<script src="..." defer>`で書く
    - スクリプトの順序が重要
    - DOM操作がある
- `<body>`**要素の末尾(&lt;/body&gt;の直前)** に書く
    - DOM操作がある
    - 画面描写速度重視（bodyを先に読み込む）
    - 伝統的な書き方を継承
- `<head>`内に`<script src="..." async>`で書く
    - 非同期実行（DOM依存がない、単体で完結する）
:::
:::note warn
モダンな構成では「 `<head>`タグ内に直接書く（**defer属性** **async属性**を付けない）」ケースはあまりない。
しかし、 後続のスクリプト（他のJSファイルやBody）よりも、確実に先に実行しておきたい場合に使用する事もある。
:::



## JavaScriptファイルの読み込み位置は主に4パターン

1. `<head>`タグ内に直接書く（**defer属性** **async属性**を付けない）
2. `<head>`内に`<script src="..." defer>`で書く
3. `<head>`内に`<script src="..." async>`で書く
4. `<body>`**要素の末尾（&lt;/body&gt;の直前）** に書く

それぞれの特徴を見ていきましょう。

## 1. `<head>`タグ内に直接書く（同期読み込み）
```html
<head>
　<title>ページタイトル</title>
  <script src="script.js"></script>
</head>
```
### :white_check_mark: メリット
- HTMLを読み込む前にJavaScriptが実行されるため、初期化が早い。

### :x: デメリット
- モダンな構成ではあまりない。
しかし、 後続のスクリプト（他のJSファイルやBody）よりも、確実に先に実行しておきたい場合使用する事もある
- JavaScriptの読み込み・実行が終わるまで、HTMLの解析が止まる（レンダリングがブロックされる）。
- 上記により、画面描画速度が遅くなる可能性がある。

### :no_entry_sign: 注意
- ＤＯＭ操作できない。
コードは上からレンダリングされるため、そもそもJavaScriptでＤＯＭ操作する対象（body内の要素）がレンダリングされていないためエラーとなります。
- 上記の対策にJavaScriptコード内で、「addEventListener（loadイベント、DOMContentLoadedイベント）」を使ってレンダリング終了後に、ＤＯＭ操作を実行する方法もありましたが、次に紹介する方法が主流になっています。


## 2. `<head>`内に`<script src="..." defer>`で書く（非同期＋順序維持）
```html
<head>
　<title>ページタイトル</title>
  <script src="script.js" defer></script>
</head>
```
### :white_check_mark: メリット
- HTMLの解析と並行してスクリプトを読み込む。
- HTMLのパース完了後にスクリプトが実行される。
- 複数スクリプトでも記述順通りに実行される。

### :x: デメリット
- IEなどの古いブラウザでは非対応の場合がある（※現在ではあまり問題なし）



## 3.  `<head>`内に`<script src="..." async>`で書く（非同期＋即時実行）
```html
<head>
　<title>ページタイトル</title>
  <script src="script.js" async></script>
</head>
```
### :white_check_mark: メリット
- HTMLの解析と並行してスクリプトを読み込み、読み込み完了後すぐに実行される。
- 最速でスクリプトを実行できる可能性がある。

### :x: デメリット
- 実行順が保証されないため、複数のスクリプトがあると依存関係が崩れる恐れがある。
- IEなどの古いブラウザでは非対応の場合がある（※現在ではあまり問題なし）


## 4. `<body>`**要素の末尾（&lt;/body&gt;の直前）** に書く
```html
<body>
  <!-- コンテンツ -->
  ...
  ...
  ...

  
  <script src="script.js"></script>
</body>
```
### :white_check_mark: メリット
- HTMLのパースが終わってからスクリプトが実行されるため、レンダリングがブロックされない。
- 古くからある手法で、互換性が非常に高い。

### :x: デメリット
-  `<head>`に比べてHTMLが長くなり、管理が煩雑になりやすい。
- 大規模なプロジェクトでは可読性に注意。


## おまけ：deferとasyncの違いを図で確認
| 属性 | 読み込み | 実行タイミング | 実行順序|
|:-:|:-:|:-|:-:|
なし | 同期 | 読み込み時（すぐ） | 順序通り |
defer | 非同期 | HTML解析後（DOMContentLoaded前） | 順序通り |
async | 非同期 | 読み込み完了時（すぐ） | 順序保証なし |
【Salesforce】フローをカスタムボタンから起動して画面に配置する方法（URLボタン活用例）

Salesforceで業務を効率化するために、  
**オブジェクトのレコード画面にカスタムボタンを置き、ボタンから直接フローを起動する**方法を紹介します！

実装例は取引先（Account）オブジェクトをベースにしていますが、他オブジェクトでも応用可能です。

---

## 🧠 こういうときに使う

- 画面にボタンを設置して、ユーザーにフローを実行させたい
- オブジェクトのレコード単位でパラメータ（recordIdなど）を渡して起動したい
- できるだけ簡単な方法でやりたい（Apexなしで）

---

## 🛠️ 実装ステップ

### 1. フローを作成する
- 例）取引先レコードを対象に処理するフローを作成
- フローのAPI参照名を確認しておきます（例：`updateaccountflow`）
- 変数を渡したい場合、リソースを用意します（例：`accountid`）
    - 「入力で使用可能」にチェックを入れる

---

### 2. カスタムボタンを作成する
- 設定画面 → 対象オブジェクト（例：取引先）→「ボタン、リンク、およびアクション」から新規作成
- 以下のように設定します：

| 項目         | 内容                                       |
|--------------|--------------------------------------------|
| **ラベル**     | フロー起動ボタン                              |
| **名前**      | launchFlowButton                           |
| **表示種別**      | 詳細ページボタン                           |
| **動作**      | 現在のウィンドウにサイドバーなしで表示                           |
| **コンテンツソース**      | URL                           |
| **リンクのエンコード**      | Unicode(UTF-8)|

---

### 3. URLの書き方（ポイント！）

以下のように、**フローへのパスとパラメータ**を組み合わせます。

```plaintext
/flow/updateaccountflow?accountid={!Account.Id}
```

- `/flow/` のあとにフローのAPI参照名
- `accountid` パラメータに対象レコードのIDを渡す

これにより、ボタンクリック時に**そのレコードIDを持った状態でフローが起動**されます！

---

### 4. ページレイアウトに追加する
- 対象オブジェクト（例：取引先）のLightning ページを編集
- 作成したカスタムボタンを「強調表示パネル」の「アクション」に配置

---

## 🚀 動作イメージ

- 取引先の詳細画面に「フロー起動ボタン」が表示される
- 押すと、同タブでフローが起動
- 取引先の情報（recordId）が渡った状態で処理を進められる

---

## 🔥 まとめ

- Apex不要でフローを柔軟に起動できる！
- recordIdを渡せば対象レコードに紐づく処理ができる！
- 標準機能だけでできるので管理が楽！

UIカスタマイズでちょっとだけ業務効率を上げたいときに、ぜひ使ってみてください！
クラウド未経験からAWS CLFに挑戦！1か月で合格したリアルな勉強スケジュール

こんにちは！

今回は、クラウド未経験からAWS認定クラウドプラクティショナー（CLF）に挑戦したときの、
リアルな1か月間の勉強スケジュールをまとめました！

これから受験する方の参考になれば嬉しいです！

スタート時のスペック
AWS完全未経験

クラウドも「なんとなく聞いたことある」くらい

大卒理系（だけどバリバリのエンジニア志望ではなかった）

元々は教員を目指して教職課程を中心に勉強していた

正直、あまり要領がいいタイプではない自覚あり

勉強時間は平日0.5~1時間、休日1～2時間

こんな感じで、いわゆる"優秀な理系エリート"というわけではなく、
むしろクラウドもITどちらも、これから本気で取り組んでいこう！という状態でした。

勉強に使った教材
メインで使ったテキストはこちらです！

[AWS認定資格試験テキスト AWS認定クラウドプラクティショナー](https://amzn.to/3R689TG)

初心者向けにとてもわかりやすく書かれていて、
サービスのイメージをつかむのにすごく役立ちました！

模擬問題はテキスト付属のもの＋後半でnoteの問題集を購入して使いました。

勉強スケジュールの流れ
1週間目：テキストを読んで概要をつかむ
まずは上記テキストを通読して、
「AWSってどんなサービスがあるのか」「クラウドとは何か」をふわっと理解しました。

この段階では、細かい仕様は覚えなくてもOK！
全体像をつかむことに集中しました。

2週間目：模擬問題にチャレンジ！
概要がなんとなくわかったので、模擬問題にチャレンジ。

・・・が、このタイミングで一度本番試験を受験した結果、
600点台で不合格！😇

サービスごとの違いが曖昧

セキュリティや課金周りの理解が浅い

このへんの弱点がはっきり見えてきました。

3週間目：もう一度模擬問題を完璧に
ここから一気にギアを上げました！

模擬問題を解きまくる

間違えた問題はなぜ間違えたか分析

なんとなく正解した問題も必ず復習

とにかく、
「このサービスは何をするものか」を言語化できるレベルを目指して、知識を整理しました。

4週間目：最終確認＋本番直前対策
最後の1週間は仕上げ！

不安だったので、追加で
[【AWS CLF】最短合格を目指すための問題](https://note.com/mijuari/n/nae26d993d000)
を購入して最終確認。

市販のテキストだけではカバーできない
「本番独特のひねり問題」にも対応できるようになりました。

合格！
そして、12月6日に再チャレンジ！

今度はしっかり700点以上を取り、無事合格できました🎉

まとめ
最初はテキストで概要をつかむ

模擬問題で弱点発見＆復習

知識を"なんとなく"じゃなく"言語化できる"レベルまで持っていく

直前は別ソースの問題集で仕上げる

この流れなら、クラウド未経験でも1か月で合格可能です！

要領の良さに自信がない人でも、
地道にコツコツ取り組めばちゃんと結果は出ます！

これから受験される方、焦らず自分のペースで頑張ってください🔥
ソースコードを簡易的に把握するための生成AIへの質問方法を試してみた (質問事項の案)

GitHubにあるオープンソースコードを把握するために、生成AIへ質問して試行してみました。ソースコードを把握するための生成AIへの質問で、良かったものをまとめます。

# まず始めにする質問

いずれの場合も、まず始めに下記の質問をしてから、順次追加の質問をしていくのが無難で良かったので、まず始めに下記の質問をします。(**まず始めに何の条件も指定せずにChatGPTに好きなように答えて貰った方が、かえって最も良い回答になることが多い**ような印象がありました)
```:生成AIへ質問
　　(※始めにコード部分をコピー&貼り付け)

上記のコードの要旨は? + 何をしているか? 説明下さい。
```
「※始めにコード部分をコピー&貼り付け」部分は、まず始めにソースコード全体のうち開始部分のコード(main関数の内容や、エントリポイントのコード等)を選んで、コピー&貼り付けします。

# 次によくする質問

上記の質問後、得られた回答内容で、分からない部分・興味ある部分を**追加で質問**していきます。聞いて良かった質問を下記にまとめると: 
```:生成AIへ質問
　↓
「●」は何?
　　(※上記の質問後、分からないライブラリ名・関数名等は、手始めにこれで質問しておけば良い)
これを利用するためのサンプルコードを下さい。(入出力データ例、型情報を記載)
　↓
「●」関数を呼び出すために必要な、主要なコード部分を説明下さい。(コードを抜き出して、主要な処理の流れをまとめて)
　↓
変数「●」を使用している主要なコードを抜き出して説明下さい。
変数「●」には、どんな形式のデータが入るのか? (具体値の例を示して)
プロパティ「●」の情報を取得するまでに必要な、主要なコード部分を説明下さい。(コードを抜き出して、主要な処理の流れをまとめて)
　↓
コードを理解するには、次に何を見れば良いか?
```
上記の追加質問等でおおむねこの範囲の内容が把握できたら、終わりに「コードを理解するには、次に何を見れば良いか?」と生成AIに聞くと、次に見るとよい部分(関数名やライブラリ名等)を、最も良い順で教えてくれるので、終わりにこの質問をして次へどんどん読み進めていきます。

main関数の内容・エントリポイントのコードから始めて→主要な呼び出し関数の内容→(更に下階層の内容)...へと繰り返し、コード部分(1関数全体等)を順にコピー&貼り付けして、繰り返し質問していきます。(あまり長いコードを貼り付けて質問するとChatGPTではエラーとなる為)

次の新しいコードに対して、再び、前節の「上記のコードの要旨は? + 何をしているか? 説明下さい」の質問から始めます。

# その他の質問: データ構造・処理の流れについて

違う側面からの質問で、聞いて良かった質問を下記にまとめます。

※主に、処理の流れ(要旨)・データの流れ・クラス/関数/変数一覧・データ構造・サンプルコード、に関する質問で把握しようとしています。

```:生成AIへ質問
主要なデータとその流れを説明下さい。
主要な変数を説明下さい。(位置順で、|変数名|説明|データ参照元|を表にまとめて)

このコードで主要な使用クラス・使用関数を説明下さい。(位置順で、番号付きで表にまとめて)

関数の呼び出し構造をまとめて下さい。
　　(※複数のクラス・関数を含むものを渡す 注意:長いコードになるとChatGPTでは受付できなくなる)

「●」のデータ構造を説明下さい。
　　(※使用されているデータセット等の保管構造の把握に 例:COCO Dataset)
このコードで取得できるデータ一覧を表にまとめて下さい。
それぞれのデータを利用するためのサンプルコードを下さい。

「●」から「●」情報を取得するまでの関連コードを抜き出して説明下さい。
　　(※例:「COCO Dataset」から「bbox」情報を取得するまでの～)
```

# この方法でソースコードを見てみた例

https://qiita.com/dl_from_scratch/items/a0b389e83fc239d2530a
【Power Apps】未入力フィールドを視覚化！ユーザーに知らせるUIテク

# はじめに
Power Apps でフォームを作成する際、ユーザーが入力漏れをしないように
未入力の項目に色を付けて目立たせたいことってありますよね？？
入力されると自動で元のデザインに戻るようにすれば、視覚的にも分かりやすくなり
ユーザー側へ配慮した優しいフォームになります！
本記事ではそんな要望を叶えるための設定方法について説明していきたいと思います！

## 作成イメージ

:one:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/6ec3837f-a8f1-4d5c-970a-01921b479036.png)

:two:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/c719aa27-6876-4469-a7d0-fe7403f69b2d.png)

:three:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719434/cd0abdd1-0393-4330-85bb-cffead5f5d28.png)

## コントロールの設定方法
+ **テキスト入力での設定方法**

`Fill` プロパティの設定で `If関数` と `IsBlank関数` を組み合わせます
`IsBlank` で引数に `Self.Text` を設定しテキスト入力のコントロールの値が空(True)であれば
色付けを行い、値が入力されれば(False)色付けを解除します。
色の値はお好みで設定してください。

```ruby:Fill
If(
    IsBlank(Self.Text),
    RGBA(238, 204, 204, 1),  //空白の場合は色付け
    RGBA(255, 255, 255, 1)   //値が入力されていたら色付け解除
)
```

+ **その他コントロールでの設定方法**

他のコントロールもテキスト入力での設定をもとに応用していきます。
`IsBlank` において引数の値をコントロールに応じて変更していくだけです。

**日付の選択**・・・ `IsBlank(Self.SelectedDate)`
**ドロップダウン、コンボボックス**・・・ `IsBlank(Self.Selected.Value)`

このように設定することで作成イメージを実現させることができます！

## プラスαの設定でさらに操作性をアップ:arrow_upper_right:
視覚的な効果でユーザーに未入力項目を伝えることができていても
あくまでも視覚的に見せているだけであって、実際には他にも設定を行わないと
いくら未入力であったとしても次の動作へ進むボタンを押したりなどは出来てしまいます。

未入力であるならば視覚的且つ操作にも制御を行っておくことでデータの入力漏れを防ぐことが可能です！

例えば保存ボタンの `DisplayMode` を先ほどの色付けの要領で以下のように設定します。

```ruby:DisplayMode
If(
    IsBlank(DataCardValue1.Text) || IsBlank(DataCardValue2.Text),  //必要項目数に合わせて設定
    DisplayMode.Disabled,
    DisplayMode.Edit
)
```

このように設定しておくことによって、必須項目が未入力の場合は
ボタン自体が押せないように制御をかけることもできます。

## まとめ
未入力のフィールドを視覚的に理解させることは、アプリの使いやすさを大きくアップさせる小さなテクニックです！
単に入力エラーを防ぐというだけではなく、ユーザーが迷うことなく入力をスムーズに行えることもアプリを作成していくうえで重要なポイントとなります。
アプリの作成に慣れてきたらこういった小技をどんどん取り入れて快適な操作を行えるアプリ作成を目指してみてください！
過学習を防止するための4つの基本Tips

# この記事は

過学習を防止するためにサイエンティストが意識することは多いが、
中でも基本的なものを紹介する。
普段の分析やKaggleなどのコンペでモデルの汎化性能を向上させるときに基本に立ち返っていこう

## 1. ノイズが含まれるデータに対処する

レジの大量の返金処理などによる異常データや、
ある商品を転売目的などで大量購入する顧客のデータはモデルの学習に悪影響を与える。
これらの外れ値を検出し、適切に処理することが重要。
異常検知アルゴリズムを使用したり、データの分布を確認して外れ値を除外したりすることで対処できる。

## 2. 曖昧な特徴量を適切に扱う

user_idやJANコードなどの曖昧な特徴量をモデルが過信すると汎化性能が低下する。
これらの特徴量を直接使用するのではなく、エンコーディングや集約などの前処理を行いより意味のある特徴に変換すべきだ。
例えば、user_idからユーザーの行動パターンを抽出したり、JANコードからカテゴリ情報を作成したりする方法がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937496/c1dd0d4d-3b56-4e74-8947-37358c96a403.png)


## 3. 出現頻度の低い特徴量を適切に処理する

非常に購入頻度が低いJANや、特定の期間だけ売れる季節性要因などの出現頻度の低い特徴量は過学習の原因となる。
対策としては：

- グループ化：低頻度の項目を「その他」カテゴリにまとめる
- 正則化：L1/L2正則化を適用して特徴の影響を抑制する
- 特徴選択：情報利得などの指標に基づいて重要な特徴のみを使用する
- クロスバリデーション：複数のデータ分割で検証し、安定性を確保する

## 4. 見せかけの相関を識別する

プール事故とアイスクリーム販売の例のように、実際には直接的な因果関係がなく、外部要因（気温など）によって見せかけの相関が発生することがある。
このような特徴量を無批判にモデルに入れると誤った学習につながる。
対策としては：
- 因果関係の分析：特徴間の関係を理解し、真の原因となる特徴を特定する
- 特徴の独立性検証：多重共線性を確認し、強い相関のある特徴間で選択する

これらの対策を適切に実施することで、より汎化性能の高いモデルを構築していきましょう！
LPIC300のための勉強備忘録④

・Kerberosにおいて認可チケット（TGT：Ticket Granting Ticket）の取得に使用されるコマンド
kinit
・Windows環境においてローカルアカウント（ローカルユーザー）を表現する記述法
.\{ユーザ名} 

・smbclientコマンドのscopyサブコマンド
リモートサーバ上でファイルのコピーを行う
リモートサーバが対応していればファイルのデータはネットワーク上に転送されない。
（リモートサーバが対応していればリモートサーバ上でファイルコピーを完結させ、対応していなければ一旦コマンド発行サーバにファイルをコピーしてリモートサーバに再度ファイルを転送する。）

・smbclientのオプションで、Kerberosトークンを使用して認証するために使用するもの　-k　（smbclientコマンドにおいて認証にKerberosを使用するように指定するオプション、Kerberos認証が有効な環境であれば、ユーザーが明示的にパスワードを入力する必要はない）

・Kerberosの設定ファイル(krb5.conf)において、利用できるセクション名
[realms]各Kerberosレルムに対応するKDCや管理サーバの情報を設定するセクション
[capaths]Kerberosのクロスレルム認証のための設定を行うセクション。異なるレルム間の信頼関係を定義
[plugins]認証や暗号化、その他の拡張機能のプラグインを設定するために使用される

・Active Directoryドメインに、デフォルトで存在するグループポリシーオブジェクト
「Default Domain Policy」と「Default Domain Controllers Policy」

・/etc/nsswitch.confにおいてデータベースとしてSSSDを指定する場合のサービス名
sss

・同じActiveDirectoryドメインの他の全てのユーザーとローカルディクトリ内のファイルを共有するために、Windowsコンピューターで行う必要があるもの
フォルダのプロパティを開き、共有タブから共有設定を行うこと

・登録するパスワードが複雑であることを強制するPAMモジュール
"pam_cracklib"

・SSSDのシステムサービスの設定で存在するものは
[nss]
[sudo]
[ssh]

・Sambaの設定でローミングプロファイルの保存先の共有を指定するパラメータ
profilePath (Sambaサーバの場合はLDAPオブジェクトの属性profilePath)
なお、ローミングプロファイルとはホームディレクトリの中身等のユーザごとの個別情報のことで、これをサーバで管理することでどのクライアント端末にログインしても同様の環境を再現できるようになる仕組みのこと

・Windowsの設定でローミングプロファイルの保存先の共有を指定するパラメータ
Windowsの場合はGPOのセクションUser Profiles

・PAMのモジュールタイプとして正しいもの
account、session、password

・SMB3プロトコルを使用してサーバに接続するコマンドとオプションの組み合わせ
"smbclient --max-protocol SMB3"

・ユーザーがWindowsにログインすると自動でSMB共有をドライブレターに割り当てる方法
グループポリシーオブジェクトで設定する
ドライブレター設定を行うログオンスクリプトを作成する

・特定のSambaサーバ上の共有一覧を表示するSambaのコマンドとオプションの組み合わせ
"smbclient -L"

・sssd.confで基本となるセクション
[sssd]

・Kerberos設定ファイルにおいて、default_realmオブションを記述するセクション
libdefaults

・pam_mountで使用する設定ファイル
"/etc/security/pam_mount.conf.xml"

・Name Service Switch (NSS)で指定できるデータベース
passwd
shadow
システムに問い合わせられたユーザ情報をどの情報源(データベース)から、どの順番で検索するかを指定する。

・Active DirectoryのユーザーアカウントをLinuxユーザーとして利用できるようにするためのサービスは以下
Winbind
SSSD
ABC403回答メモ

# 0.はじめに
　土曜日に準備してさあやるぞ！と思ったら日曜日開催の罠に嵌りました。
　気を取り直して日曜日に参加。
　A~Cは順調でしたが、D、Eは解けず結局3問で終了。
　レートは+6と微増しの735となりました。


# 1. A - Odd Position Sum
　リストを先頭から読み込んで、インデックスが偶数なら回答用変数ansに
　追加していき、最後にansを出力して終了。

　https://atcoder.jp/contests/abc403/submissions/65242549


# 2.B - Four Hidden
　何かややこしい感じの問題でしたが、まぁ問題通りに
　チェックしてもBだからTLEにはならんだろうと、素直に実装。

　【実装】
　　1.T、Uを読み込む
　　2.Tの長さTL、Uの長さULをセット
　　3.Tの先頭から、Uと一致する部分がないかを見ていく為
　　　iを0から、TL-UL+1までfor文で回していく
　　　-1.iから始まるT内のUL文字がUと一致する可能性のある文字数Cを0で初期化
　　　-2.以下、jを0からULまで回していく
　　　　-1.T[i+j]とU[j]が一致するか、T[i+j]が"?"の時、Cに1加算
　　　-3.CがULと一致した場合、T内にUを内包していることとなるのでYesを出力して終了
　　4.3のチェックでYesが無かった場合Noを出力して終了

　https://atcoder.jp/contests/abc403/submissions/65254007


# 3.C - 403 Forbidden
　Bより簡単では？と思う問題。
　全権限付与を正直にすべてやっているとダメなんだろうと思い
　そこが肝かと思いつつ、権限を削除する操作は無いため
　ユーザーごとの権限管理に、すべて閲覧化の場合は0を追加することで
　効率化しました。

　【実装】
　　1.NMQを読み込む
　　2.デフォルト辞書(set)Dを定義
　　3.以下Q回繰り返し
　　　-1.インプットをリストAとして読み込む
　　　-2.A[0]が1の時　D[A[i]]にA[2]を追加
　　　-3.A[0]が2の時　D[A[i]]に0を追加
　　　-4.A[0]が3の時　
　　　　-1.D[A[i]]に0がある場合Yesを出力
　　　　-2.D[A[i]]にA[2]がある場合Yesを出力
　　　　-3.-1.-2.に該当しない場合Noを出力

　https://atcoder.jp/contests/abc403/submissions/65257618


以上
boto3でS3オブジェクト一覧を1000件以上取得する方法

】
## きっかけ

AWS S3のバケットからオブジェクト一覧を取得しようと  
boto3の`list_objects_v2`を使っていましたが、  
**リストの上限（1000件）**があるため、  
一部のモジュールが**取得漏れ**していることに気づきました。

小規模なバケットでは問題なかったため、  
見逃しやすい落とし穴だと思います。

---

## 対応

調査の結果、boto3には  
**Paginator（ページネーター）**機能があり、  
**ループ処理で全件取得できる**ことが分かりました。

上限1000件を気にせず、すべてのオブジェクトを取得できます。

---

## 実装例

以下のように、Paginatorを使ってすべてのページをたどり、  
さらに`yield`を使ってスマートにオブジェクトを返すようにしています。

```python
def list_objects_v2_paginator(self, prefix='', suffix=''):
    paginator = self.client.get_paginator('list_objects_v2')
    page_iterator = paginator.paginate(Bucket=self.bucket_name, Prefix=prefix)

    for page in page_iterator:
        if 'Contents' in page:
            for obj in page['Contents']:
                key = obj['Key']
                if suffix:
                    if key.endswith(suffix):
                        yield obj
                else:
                    yield obj
```

---

## Paginatorを利用するとなぜできるのか？

通常の`list_objects_v2`は1回の呼び出しで**最大1000件**しか返せませんが、  
Paginatorを使うと、
- API内部で**`ContinuationToken`（継続トークン）**を自動的に扱い
- 次のページも**順番にたどって**  
- 最後のページまで**すべてのデータを取得**してくれます。

つまり、プログラム側で何も意識せずに**全件取得できる**ようになります！

---

## 【補足】yieldを使うと何が違うのか？【一括読み込みとの比較】

### 通常の一括読み込み（リストにためるパターン）

例えばS3のオブジェクトを全部リストにためてから返すと、こうなります。

```python
def list_all_objects(self):
    objects = []
    paginator = self.client.get_paginator('list_objects_v2')
    page_iterator = paginator.paginate(Bucket=self.bucket_name)

    for page in page_iterator:
        if 'Contents' in page:
            for obj in page['Contents']:
                objects.append(obj)
    return objects
```

この場合、

- 最後まで**全部読み込んでから**返す
- **オブジェクト数が多いとメモリを大量に消費**する
- 全部読み終わるまで**次の処理に進めない**

という特徴になります。

---

### yieldを使った場合（毎回読み込み）

先ほどの`list_objects_v2_paginator`は`yield`を使っているので、

- **1件読み込むたびに**返す
- メモリに大量データを**ため込まない**
- すぐに次の処理に進める（読みながら処理できる）

という動きになります。

```python
def list_objects_v2_paginator(self, prefix='', suffix=''):
    paginator = self.client.get_paginator('list_objects_v2')
    page_iterator = paginator.paginate(Bucket=self.bucket_name, Prefix=prefix)

    for page in page_iterator:
        if 'Contents' in page:
            for obj in page['Contents']:
                key = obj['Key']
                if suffix:
                    if key.endswith(suffix):
                        yield obj
                else:
                    yield obj
```

---

### 比較まとめ

| 項目                     | 一括読み込み (リスト) | 毎回読み込み (yield) |
|:-------------------------|:----------------------|:---------------------|
| メモリ使用量              | 多い（全部保持）        | 少ない（1件ずつ）      |
| データ取得タイミング       | 最後まで読んでから       | 1件ずつすぐ使える       |
| 小規模データ（数百件）向き | ◎                     | ○                    |
| 大規模データ（数万件）向き | △（メモリ注意）          | ◎（安定）             |
| コードのわかりやすさ       | シンプル（初心者向き）    | 少し慣れが必要          |

---

## まとめ

- boto3の`list_objects_v2`単体では1000件上限に注意！
- Paginatorを使えば全件取得できる
- `yield`を使えばメモリ効率もよくなる

小規模なら一括取得でも問題ないですが、  
**数千～数万件以上のオブジェクト**を扱うなら、  
**Paginator＋yieldが必須テクニック**です！

---
pnpmまとめ


# pnpmまとめ


## 1. pnpmとは？

**pnpm（Performant npm）** は、Node.jsのパッケージマネージャーの一つです。  
npmやyarnと同じ「依存関係管理ツール」ですが、**圧倒的に速く、ディスク使用量が少ない**のが特徴です。

- ディスクの無駄を極限まで減らす設計
- 特に**モノレポ**（複数パッケージ管理）で真価を発揮！

> 公式サイト: https://pnpm.io/

---

## 2. npm/yarnとの違い

|             | npm               | yarn              | pnpm             |
|:------------|:------------------|:------------------|:-----------------|
| ファイル構造 | フラット (node_modulesに全コピー) | フラット | ハードリンク（参照だけ作成） |
| 速度        | 普通              | 速い               | 超速い           |
| ディスク容量 | 大きくなりがち     | 中くらい           | 圧倒的に少ない     |
| モノレポ対応 | 手動で設定         | yarn workspaces    | pnpm workspaces標準 |
| キャッシュ   | 少なめ             | 多い               | 極限まで効率化    |

特に注目なのが、pnpmの**ハードリンク構造**です。  
これにより、**同じライブラリを何回インストールしても、実際にはディスクに1回しか保存されない**ため、ディスク使用量が爆減します。

---

## 3. 基本的な使い方

### インストール

まずpnpm自体をインストールします。

```bash
npm install -g pnpm
```

（または`corepack`を使う場合 → Node.js 16.13以降推奨）

```bash
corepack enable
corepack prepare pnpm@latest --activate
```

### プロジェクト作成・依存追加

```bash
pnpm init
pnpm add react react-dom
```

### 開発依存を追加

```bash
pnpm add -D typescript
```

### スクリプト実行

npmと同じく、`package.json`の`scripts`を叩けます。

```bash
pnpm run build
```

---

## 4. よく使うコマンドまとめ

| 操作            | コマンド                 |
|:----------------|:--------------------------|
| 依存インストール | `pnpm install`             |
| パッケージ追加   | `pnpm add パッケージ名`    |
| 開発用パッケージ | `pnpm add -D パッケージ名` |
| パッケージ削除   | `pnpm remove パッケージ名` |
| 全削除（初期化）| `pnpm install --force`     |

---

## 5. 【発展】pnpm workspace活用術

pnpmの真骨頂は**モノレポ**対応です。

例えば、以下のような構成を簡単に管理できます。

```plaintext
my-monorepo/
├── apps/
│   ├── app1/
│   └── app2/
└── packages/
    ├── ui/
    └── utils/
```

**設定ファイル例：`pnpm-workspace.yaml`**

```yaml
packages:
  - 'apps/*'
  - 'packages/*'
```

これで、複数プロジェクトを**まとめて管理・ビルド・依存共有**できます。

ワークスペース内リンクも自動で作ってくれるため、開発スピードが爆速に！

---

## 6. 【発展】pnpm hooksによる自動化

pnpmにはインストール時に自動処理できる**hooks機能**があります。  
たとえば、パッケージインストール直後に特定のスクリプトを走らせるなどが可能。

**例：`pnpmfile.cjs`に定義**

```javascript
module.exports = {
  hooks: {
    readPackage(packageJson) {
      if (packageJson.name === "some-package") {
        packageJson.dependencies["lodash"] = "^4.17.21"
      }
      return packageJson
    }
  }
}
```

これでインストール時に自動で依存を追加したり、バージョン調整を強制できます。  
大規模開発では超便利！

---

## 7. まとめ

- **pnpmは速い・軽い・賢い**パッケージマネージャー
- **npm/yarnとほぼ互換**だけど、構造が違う
- 特に**モノレポ・大規模開発**に強い
- workspaceとhooksを使いこなすとさらに便利


---
【Python・初心者向け】Google Colaboratory　おすすめ設定

## 1. はじめに
こちらは初心者向けの『[Google Colaboratory](https://colab.research.google.com/)　おすすめ設定』の記事です。
これからColabを使って、データサイエンスやAIの開発を行っていく方へ向けたおすすめ設定です。
エンジニアを目指す方の最初の一歩の手助けになれば幸いです。

## 2. おすすめ設定一覧
本記事で紹介するおすすめ設定の一覧です。
操作方法などがわかる方はこちらから一括設定してみてください。

<table>
  <caption>
    Google Colaboratory　おすすめ設定一覧
  </caption>
  <thead>
    <tr>
      <th scope="col">設定タブ</th>
      <th scope="col">設定項目</th>
      <th scope="col">設定内容</th>
      <th scope="col">説明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">サイト</th>
      <th scope="row">モード</td>
      <td>dark</td>
      <td>表示モードをダークモードに変更</td>
    </tr>
    <tr>
      <th scope="row" rowspan="3">エディタ</th>
      <th scope="row">インデント幅</th>
      <td>4</td>
      <td>インデント幅を4文字分に設定</td>
    </tr>
    <tr>
      <th scope="row">行番号を表示</th>
      <td>✅（ON）</td>
      <td>コードセルの左端に行番号を表示</td>
    </tr>
    <tr>
      <th scope="row">インデント ガイドの表示</th>
      <td>✅（ON）</td>
      <td>インデントガイドを縦線( | )で表示</td>
    </tr>
  </tbody>
</table>


## 3. 各種設定について

### 【設定方法】
Colabの設定は、 **画面上部「ツール」　＞　「設定」** の順にクリックして開きます。

![Setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555644/e4270116-5fad-418b-b8cb-acb00f1ed349.png)

続けて、左のタブごとに以下の設定を行いましょう。

### ❶　「サイト」タブ　＞　モード：dark
こちらの設定は、**表示モードをダークモードに変更**します。

![SettingMode01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555644/fbf61d4f-26b3-478f-94ef-3e0b2a61f0ff.png)

エンジニアは、長時間モニタを見つめての作業がとても多いです。
そのため、目の負担を少しでも減らす為に「 **ダークモード** 」のエディタを利用することが一般的です。

これからエンジニアを目指す方も「ダークモード」でのコーディングに慣れていきましょう。

### ❷　「エディタ」タブ　＞　インデント幅：4
こちらの設定は、**インデント幅を4文字分に設定**します。

![02_SettiingIndentWidth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555644/89e9034b-01f9-43d6-8bdd-638c560f063b.png)

Pythonでは、一般的にインデントを4文字分にすることが推奨されています。
そのため、ローカル環境でも開発をする方は、Colab上のコードをダウンロードした際に、エディタ上で書くコードとインデントが合わず、『 **インデンテーションエラー（IndentationError）**』が発生する原因になりかねません。
事前に、インデント幅を「4」に揃えておくことで、 **不要なエラーの発生を防止**しましょう。

### ❸　「エディタ」タブ　＞　行番号を表示：✅（ON）
こちらの設定は、**コードセルの左端に行番号を表示**します。

![03_SettingDisplayRowNumber.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555644/208bab56-d50e-40fe-9acb-f02893bc7abf.png)

深い理由はありませんが、ほかのエンジニアとの会話やサンプルコードのコーディングの際にも、 **行番号で指示ややり取りを行うことが多いため** 、こちらも事前に設定しておくと便利ですね。

### ❹　「エディタ」タブ　＞　インデント ガイドの表示：✅（ON）
こちらの設定は、**インデントガイドを縦線( | )で表示**します。

![04_SettingDisplayIndentGuide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3555644/5eaa2e0a-43dc-42b2-bda0-9b70b12626f9.png)

Pythonを指導していて、学習初期によく見かけるエラーの一つが前述の『インデンテーションエラー（IndentationError）』です。
エディタの補助機能でインデントが揃うときは、問題ないのですが、自身でインデントを調整する際、 **ミスに気づきやすくするため**、インデントガイドを設定しておくのがおすすめです。

## 4. おわりに
コーディングや業務を円滑に進めるには、普段利用するツールについての知識は、とても重要ですね。
この記事を見つけた方や読んでくださった方は、ツールの扱いや設定に関心の特に深い方だと思います。
ぜひこれからも、新しく開発環境やエディタを触る際は、どのような設定にするとよいか調査・考察し、周りの人に伝えてあげてください。
storybook v8でnext/navigationをモックする

## 概要

next.js v13から導入されたapp routerのnext/navagitionのフックなどをstorybookでモークするやり方をメモする

## 詳細

next/navigationのusePathnameフックを利用するコンポーネントのstoryを作ることを例としてする

### 1. /.storybook/preview.tsにapp routerである設定を入れる

```typescript
const preview: Preview = {
  parameters: {
    nextjs: {
      appDirectory: true,
    },
    ...,
  },
};
```

### 2. storybookファイル「/components/Hoge/index.stories.tsx」にnextjsのparameterを設定する

```typescript
export const Default: Story = {
  parameters: {
    nextjs: {
      navigation: {
        pathname: '/hoge',
      },
    },
  },
};
```

## 参考記事

- [storybookオフィシャルdocs](https://storybook.js.org/docs/get-started/frameworks/nextjs#storybooknextjsnavigationmock)
SSMLで日本語のイントネーションをあやつる

# 合成音声で日本語のイントネーションをどうにかしたい！

やりたいのはそれだけ。

# SSMLを使う

SSML : 音声合成マークアップ言語 - Speech Synthesis Markup Language

https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/speech-synthesis-markup-voice

## 使うタグは prosody pitch

**prosodt の pitch** を使うことで音の高さを変えることができます。
なんとなく文章全体に使いそうな属性なのですが、これを「文字」単位にかけていきます。

### 例！「コーヒー」

標準的な発音ではこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/9bcfac75-5043-4856-87ee-d02803cc9bfd.png)

ただわたしは出身が北海道なので……こうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/9938e946-e102-4558-9800-d10fd6903323.png)

これをやってみます。

まず標準的なのはそのままでいいのでこう。

```xml
コーヒー
```

北海道バージョンだとこう。

```xml
<prosody pitch="+20%">コー</prosody><prosody pitch="-20%">ヒー</prosody>
```

一文字ずつピッチを変えても自然に聞こえるのかな？と一瞬思ってしまいますが、そこは昨今の合成音は非常にかしこくてまったく違和感なくできてしまいます。

# まとめ

**prosody pitch** を使おう！
運用保守でよく使うファイル関連のlinuxコマンドについて

# はじめに
私が経験した運用保守の現場ではよく使うファイル関連のコマンドをまとめました。
こういうコマンドがあることを参考にしていただけたら幸いです。

## viエディタについて
**開いているファイル名を表示**

viで開いたときにctrl+gにて開いているファイル名を表示します。
※何のファイルを修正中か把握できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/89308ec7-1d35-4646-b98b-f48823f45cfd.png)

**行番号を表示する場合**
viで開いて行番号を表示する場合
```
: set nu
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/270663ee-c945-4cd2-98b3-21bdfaddbf63.png)
**文字の置換をする**

```
:%s/置換前の文字列/置換後の文字列/g
```
以下の例はAAAAをFFFFに置換する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/9b118933-3ce9-4b87-a9b2-64e338d7d525.png)

置換後の表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/5c0829dd-a9b2-4e4d-bae6-2f1b4c38df48.png)

## ファイルのコメントアウトと空白以外を表示する
現行と新規のサーバで設定ファイルの差分を取得することはよくあります。
その際にコメントアウトと空白行以外を表示して実際に設定してあるパラメータのみを表示するコマンドです。
```
cat ファイル名 | grep -v ^$ | grep -v ^#

例)
# cat incron.conf | grep -v ^$ | grep -v ^#
editor = vi
```

## grep -rl 
ファイルの「中身」を検索して、マッチしたファイルのファイル名だけを表示したい場合
```
grep -rl "検索したい文字列" 検索対象ファイル

例)
# grep -rl "AAA" /root/*.txt
/root/test.txt
/root/test1.txt
```

# 差分
私が経験した運用保守の現場では設定ファイルを変更前に必ず設定ファイルのバックアップを取得しています。
その後、変更前ファイルと変更後ファイルで差分を取得して画面のスクリーンショットを取得していました。

※補足　画面のスクショを取る理由はエビデンスを変更できないため。
## sdiffコマンド

sdiffコマンドは変更前と変更後で比較したら見やすいです。
差異がある個所は|で表示されます。
※見やすいためエビデンスの取得にいよくsdiffコマンドは使用していました。

```
sdiff -s ファイル変更前　ファイル変更後


例
# sdiff -s /etc/php.ini /etc/php.ini.original
expose_php = Off                                              | expose_php = On
post_max_size = 128M                                          | post_max_size = 8M
upload_max_filesize = 128M                                    | upload_max_filesize = 2M
date.timezone = date.timezone = Asia/Tokyo                    | ;date.timezone =
```


## diff -uコマンド
よくnagiosの設定ファイルを変更前と変更後で設定ファイルの差分を取得しいた際にどこを変更したのか把握しやすいコマンドです。
```
# diff -u ファイル変更前　ファイル変更後

例
# diff -u /etc/php.ini /etc/php.ini.original

--- /etc/php.ini        2025-04-26 23:44:12.707732610 +0000
+++ /etc/php.ini.original       2025-04-09 05:43:25.000000000 +0000
@@ -407,7 +407,7 @@
 ; threat in any way, but it makes it possible to determine whether you use PHP
 ; on your server or not.
 ; https://php.net/expose-php
-expose_php = Off
+expose_php = On

 ;;;;;;;;;;;;;;;;;;;
 ; Resource Limits ;
@@ -710,7 +710,7 @@
 ; Its value may be 0 to disable the limit. It is ignored if POST data reading
 ; is disabled through enable_post_data_reading.
 ; https://php.net/post-max-size
-post_max_size = 128M
+post_max_size = 8M

 ; Automatically add files before PHP document.
 ; https://php.net/auto-prepend-file
@@ -862,7 +862,7 @@

 ; Maximum allowed size for uploaded files.
 ; https://php.net/upload-max-filesize
-upload_max_filesize = 128M
+upload_max_filesize = 2M

 ; Maximum number of files that can be uploaded via a single request
 max_file_uploads = 20
@@ -939,7 +939,7 @@
 [Date]
 ; Defines the default timezone used by the date functions
 ; https://php.net/date.timezone
-date.timezone = date.timezone = Asia/Tokyo
+;date.timezone =

 ; https://php.net/date.default-latitude
 ;date.default_latitude = 31.7667
```