OmniAICreator/Qiita-1.07M huggingface dataset:
vz editorがアセンブラとしていい感じな点

VZエディタは、８０８６アセンブラで書かれたDOS用のエディタです。

c.mosさんによるEZエディタという書籍に付属したエディタがありました。

一段階、高度になって生まれたのがVZエディタです。

VZエディタの初版の特徴を記載します。

１　８０８６アセンブラでMS-DOS用に記述している。
２　PC-9801用のハードウェア処理を高速に行っている。
３　VZ.DEFというマクロで、基本設定ができる。
４　著者本人は、CMOS.DEFという個人用の設定を利用している。
５　ゲームがマクロでついてきた。
６　日経MIXのアセンブラ会議で技術的な質疑があった。
７　OPTASMでアセンブルすると、MASMより少し小さくなる。

小さくて、高速処理ができることと、他のエディタの半額程度で入手しやすい。
売れ行きが伸びていきました。

８　他の機種への移植版が利用者が作衛した。
９　Mifes互換マクロが公開された。

１０　IBM-PC用を同梱する１．５が、同価格で発売された。

この時点でのアセンブラのソースを振り返ってみる。

１　PC-9801とIBM-PCの共通部分がフォルダ構成、ファイル構成がよく整理できている。
２　アセンブラのソースコードが、関数としてよくまとまっている。

ひとふでがき　でない。
スパゲッティプログラムでない。
あみだくじ　でない。
肥大化していない。　PC-9801版からIBM-PC版が追加になってもさほど肥大化していない。
なんでも屋　は、ライブラリとして優秀ななんでも屋で、無駄、重複などがさほどない。
老舗温泉旅館　じゃない。　PC-9801版にIBM-PC版を追加する際に、PC-9801版の構造を見直している。
EMLメールをOutlook MSG形式に移行する方法

はじめに

EMLメールをOutlook MSG形式に移行する際に、添付ファイルをすべて保持する方法をお探しですか？もう探す必要はありません！この包括的なガイドでは、手順をステップバイステップでご案内し、変換プロセスが中断することなく、重要なデータが失われることなく実行されることを保証します。

EMLおよびMSGファイル形式

メールはEMLという略語で表され、Windows Live Mail、Outlook Express、Thunderbirdなど、多くのメールクライアントでEMLファイルの読み書きが可能です。MSGファイルはMicrosoft Outlookで最もよく使用されます。EMLをMSGに変換することで、Outlookとの互換性を確保し、Outlook独自の高度な機能にアクセスできるようになります。

EMLメールをOutlook MSGに移行する専門ガイド

EMLファイルとMSGファイルは全く異なる形式であるため、Softaken EML to MSG Converterのような、効率的で信頼性の高い専門アプリケーションの使用を強くお勧めします。このアプリケーションは、EMLファイルをMSG形式に変換できます。添付ファイルも変換可能です。変換プロセス全体を通して、このユーティリティはすべてのデータの整合性だけでなく、元のフォルダ階層も維持します。このツールの使用は、ほんの数ステップで完了します。

1. まず、WindowsコンピューターにSoftaken [EML to MSG Converter](https://www.softaken.com/jp/eml-msg)プログラムをダウンロードして実行します。
2. EMLファイルをソフトウェアパネルに追加するには、「ファイルを選択」または「フォルダを選択」ボタンをクリックします。
3. エクスポートオプションからMSGファイル形式を選択します。
3. 出力ファイルの保存場所を設定します。
4. 最後に、EMLファイルからMSGファイルへの変換プロセスを開始し、「変換」ボタンをクリックします。

このユーティリティを使えば、お好みのEMLファイルをすべてMSG形式に変換し、任意の場所に保存できます。変換したMSGファイルは、Outlook 2019、2016、2013、およびそれ以降のバージョンで簡単にアクセス、開いたり、インポートしたりできます。

Softaken EML To MSG Converterを使用するメリット

• 大量のEMLファイルを一括でMSG形式に変換できるため、管理が簡単です。

• 破損、損傷、または孤立したEMLファイルをMSG形式に変換するシンプルなプロセスです。

• このソフトウェアの直感的で使いやすいインターフェースにより、技術レベルの異なるユーザーでも、短時間でエラーなくEMLファイルをMSG形式に移行できます。

• このツールは、Windows Live Mail、Outlook Express、Mozilla Thunderbirdなど、EMLファイルに対応している20種類以上のメールクライアントに対応しています。そのため、ユーザーはEMLファイルを簡単に変換できます。

• Windows 11、10、8.1、8、7、XP、Vista、およびそれ以前のすべてのバージョンと互換性があり、問題なくインストールおよび動作します。

まとめ

強力なEMLからMSGへのコンバーターアプリケーションを使用すれば、添付ファイルをスムーズに保持しながら、EMLメールをOutlook MSGに移行できます。プロセスが分かりやすくなるだけでなく、正確性と信頼性も確保されます。ユーザーは、上記で説明した簡単な手順に従うだけで、EMLファイルをMSGファイルに変換できます。これにより、ユーザーは互換性の問題を心配することなく、複数のメールクライアントを活用するメリットを享受できます。
Git全ブランチから文字列を含むファイルを一括検索



Git リポジトリ内の **すべてのブランチ** に存在するファイルの中から、`Git` という文字列を含んでいるものを検索したい。

---

## 方法①：全ブランチを対象に文字列検索

```bash
git fetch --all

for branch in $(git for-each-ref --format='%(refname:short)' refs/remotes/); do
  echo "Checking $branch"
  git checkout --quiet $branch
  git grep -l "Git" || echo "No matches in $branch"
done
```

### 解説：

* `git fetch --all`: 全てのリモートブランチ情報を取得。
* `git for-each-ref`: リモートブランチを列挙。
* `git checkout`: ブランチをチェックアウト（`--quiet` でメッセージ非表示）。
* `git grep -l "Git"`: ファイル内に "Git" を含むファイル名を表示。

---

## 方法②：チェックアウトせずに全ブランチで検索（高速）

ブランチをチェックアウトせずに調べたい場合はこちら：

```bash
for branch in $(git for-each-ref --format='%(refname:short)' refs/heads/); do
  echo "Checking $branch"
  git grep -l "Git" $branch
done
```

### 補足：

* これはローカルブランチだけを対象とします。
* リモートを含めたい場合は `refs/remotes/` に変更するか、リモートブランチをローカルに追跡させる必要があります。

---

##  Tips

* 大文字・小文字を区別せずに検索したい場合は `-i` オプションを追加：

  ```bash
  git grep -il "Git" $branch
  ```
CloudeのProプラン（年間）に誤って登録してしまった話

# 脳死で課金のページをいじるのをやめよう（戒め）

## 経緯

1. Claude強いらしいぜ
2. 月で契約した
3. GPTに浮気したいから解約するかー
4. 〜投稿者唐突の$200（3万円くらい）の請求〜  

ChatGPTからClaudeに移行してたけど画像生成したくなってきたのでそろそろ解約するかー

## 返金手続きの仕方

ヘルプから返金リクエストを送ります

### ヘルプを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3453576/d70306d0-3153-4074-b357-f172ddc32369.png)

### メッセージから質問をする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3453576/38405f0b-f0a9-4433-adca-8161e6749b46.png)

### Proプラン払い戻しリクエストを選択

![スクリーンショット 2025-05-14 14.17.54.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3453576/8737169b-c926-4a84-ac4f-fc2dcdc82786.jpeg)


### 理由にはAccidental purchase （誤購入）を選択

![スクリーンショット 2025-05-14 14.18.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3453576/ec9f4830-a756-40b9-9bd3-c735eebe675f.png)

### 無事返金...

![IMG_8761.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3453576/9f224e98-4140-47c3-801a-2f6395b92899.jpeg)

## ひやり

よくわからんけどとりあえずぽちぽちするのをやめようと思います

あと、年間にするボタンがワンクッション無しで承認されてしまうの被害者増えそうなのでやめてほしい（確認しないほうが悪い）

### いまからチャットGPTに課金してきます
ゲーム機キャプチャー環境紹介

# 概要
某サーバーでゲーム機のキャプチャ環境について
聞かれたのでまとめます

# 目次

1. [構成・アーキテクチャ紹介](https://qiita.com/suke0930/items/865f88e519c3ff1e05a2#%E6%A7%8B%E6%88%90%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
    1. [物理構成](https://qiita.com/suke0930/items/865f88e519c3ff1e05a2#%E6%A7%8B%E6%88%90%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
    1. [論理構成](https://qiita.com/suke0930/items/865f88e519c3ff1e05a2#%E6%A7%8B%E6%88%90%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
    1. [使用機材紹介](https://qiita.com/suke0930/items/865f88e519c3ff1e05a2#%E6%A7%8B%E6%88%90%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
    1. [使用ソフト紹介](https://qiita.com/suke0930/items/865f88e519c3ff1e05a2#%E6%A7%8B%E6%88%90%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
1. [ソフトウェア運用上の手順・注意(未完成)](https://qiita.com/suke0930/items/865f88e519c3ff1e05a2#%E6%A7%8B%E6%88%90%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)

<a id="構成・アーキテクチャ"></a>
## 構成・アーキテクチャ
### 物理構成
SwitchなどのHDMI出力
↓
HDMIスプリッター
↓
キャプチャーボード＆モニター
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654625/33f8b142-2358-4c3d-8401-794f48cd038f.png">


## 論理構成

1. __映像入力__
    - 映像キャプチャデバイス by OBS
    - ウィンドウプレビュー by OBS(Goliveで映す場合)
1. __音声入力__
    - mono-to-stereo(後述　音声の不具合修正)
    - 音声出力キャプチャ by OBS
    - オーディオモニタニング by OBS (Goliveで映す場合)


これらの構成でDiscordに映したり
配信したりしてます

## 使用機材紹介
1. キャプチャーボード
    - MS2109チップ　格安キャプチャーボード
        -   1080p30fps
        -   720p6fps
        - (標準状態では)モノラル音声
        - たしか1500円くらい
1. スプリッター
    - 1 IN 2 OUT HDMIスプリッタ
    - 特に言う事無し
    - ACアダプタ給電
    - 1000円くらい
1. そこそこPC
    - 要は私のメインPC
    - CPU:5700X
    - GPU:1660super
    - RAM:32GB 3200mhz CL18
    - MB ASUS Prime B-450a
1. ゲーム機
    - Switch
    - PS4
    - PS3
    - XBOX360
    - WiiU
    - スマホ(?)
    - サーバー(?)

つまりHDMIの機器はだいたい行ける

## 使用ソフト紹介

1. [OBS](https://obsproject.com/ja) 
    - こいつがないと始まらない
    - 配信以外にも音声ミキサーにしたり
    - DisocordへのGoliveでも使える子
1. [VB-AUDIO CABLE](https://vb-audio.com/Cable/)
    - 仮想のスピーカーとマイクを追加するやつ
    - 修正したキャプチャーボード音声の出力先
    - 他にも使える便利な子
1. [mono-to-stereo](https://github.com/FREEWING-JP/mono-to-stereo)
    - MS2109搭載のキャプチャーボードの問題を解決
    - つまり音声をモノラルからステレオに直せる
    - 慣れれば簡単


以上が構成・環境紹介です

## ソフトウェア運用上の手順・注意
Web UI からマイワークスペース上のカスタムセマンティックモデルを作成できない問題の回避策

## はじめに

マイワークスペースでは Fabric 容量を割り当てていても、レイクハウス / ウェアハウス上からセマンティックモデルの作成ができないことに気づいたので回避策です。

マイワークスペースが作成先に挙がらない：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/adb8b948-8252-431e-852d-f4c4adeb890a.png)


## 回避策の実例

1. ウェアハウスを作成します
今回は例として[サンプルウェアハウス](https://learn.microsoft.com/ja-jp/fabric/data-warehouse/create-warehouse#how-to-create-a-warehouse-sample) を使用します。
2. 既定のセマンティックモデルに1つ以上のテーブルを含めるために、更新をします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8eefc1ef-0a2b-4464-bb77-dbaf4d57adff.png)
2. 対処ようのノートブックを [github](https://github.com/ryoma-nagata/tools/blob/main/Fabric/my-workspace-workaround-semantic-model/clone_semantic_model_from_default_model.ipynb) に配置しているのでこれをダウンロードします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/72c00316-3f1f-4718-9dab-606db90e1c82.png)
3. ワークスペースにインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/607cecf1-18dd-4814-8030-c6a8a0457973.png)
4. 名称などを調整して実行します。spark で実行するのは無駄遣いになるので python カーネルで実行するようにしてください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2d437fdc-4798-40bb-b226-db8bda92d377.png)

4. セマンティックモデルが作成されるのでテーブルの対象などを調整してセマンティックモデルの開発を進めることができます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a3b64300-eb91-4c4a-9c0f-5612b72a33ee.png)
[obsolete] /dev/speaker に古の PCMCIA 挿抜時に鳴っていたのを再現📯

# 昨今の PC じゃと鳴らんかも
```shell:カーネルモジュールのロード確認
kldstat | grep speaker
```
```text:こんなのが出よったら OS 側は(●｀･ω･)ゞ＜ok！
*     1 0xffffffff*********     **** speaker.ko
```
```shell:無きゃ手動でロートw
kldload speaker
```
# 鳴って見せましょうw
```shell:差し込み
echo 't120o3l16 f+b' > /dev/speaker
```
```shell:ドライバ認識
echo 't120o3l32 b>c+f+16' > /dev/speaker
```
```shell:抜き出し
echo 't120o3l16 bf+' > /dev/speaker
```
```shell:おまけ
echo 'geL2eL4fdL2dL4cdefggL2gl4rgeL2eL4fdL2dL4ceggeel2e' > /dev/speaker
```
# 結び
i386 のコアが元気じゃった頃は PCMCIA のお世話になったもんじゃねぇ
# Microsoft DP-600 模擬試験の準備方法


Microsoft DP-600 模擬試験は、データ分析および Microsoft Fabric におけるスキルを証明したいと考えているプロフェッショナル向けに設計されています。この試験は「Microsoft Fabric を使用した分析ソリューションの実装」としても知られています。主に、データ分析ソリューションの設計、作成、展開に焦点を当てています。

ビジネス インテリジェンスに携わっている方や、Fabric アナリティクス エンジニアを目指している方にとって、この試験は非常に重要です。試験では、データ モデリング、変換、統合、ガバナンスに関する知識が問われます。

DP-600 模擬試験における Microsoft Fabric のデータワークロード

[Microsoft DP-600 模](https://prepbolt.com/paths/microsoft/questions/dp-600)擬試験で最も検索されているトピックの一つが、Microsoft Fabric のワークロードの理解です。Microsoft Fabric は統合型のデータ プラットフォームであり、Power BI、Synapse、Data Factory などのツールを一つのサービスとして統合しています。

試験では、実際のシナリオがよく出題されます。たとえば、Dataflows を使ったデータ取り込みの管理や、Power BI でのセマンティック モデルの構築などが挙げられます。タスクに適したワークロードを選ぶ能力は、試験合格の鍵となります。

重点的に学習すべき主な分野は以下のとおりです：

*   Microsoft Fabric 内での Power BI、Synapse、Data Factory の統合方法の理解
    
*   大規模なデータの保存と処理のための Lakehouse の活用
    
*   Dataflows を用いたデータ取り込みパイプラインの自動化と管理
    
*   優れたデータ分析のためのセマンティック モデルの構築と最適化
    
*   ビジネス要件に基づいた適切な分析ワークロードの選定
    

リアルタイム分析とガバナンス

Microsoft DP-600 模擬試験についてよく検索されるもう一つの重要なトピックが、リアルタイム分析とデータガバナンスです。これらは、すべてのデータエンジニアやアナリストにとって重要なスキルです。Event Streams や KQL クエリを使用して、リアルタイムデータを扱えるようにしておく必要があります。リアルタイムでデータを監視することは、ビジネスにおいて迅速かつ的確な意思決定を行う助けとなります。

ガバナンスも大きな焦点の一つです。セキュリティ ポリシーの適用、アクセス管理、機密ラベルの使用方法を理解しておくことが求められます。[Microsoft](https://prepbolt.com/paths/microsoft/data/dp-600) Purview は、この分野でカバーされているツールの一つです。

Microsoft 試験対策として最適な学習教材や模擬試験を探している方は、信頼できるプラットフォームである Prepbolt を訪れてみてください。
Databricks DLT にて Azure Event Hubs から SAS 認証によりデータを取得する方法

## 概要

Databricks DLT にて Azure Event Hubs から SAS 認証によりデータを取得する方法を紹介します。

## 前提条件

下記を構築します。

- Databricks
- Databricks DLT のパイプライン
- Azure Event Hubs 名前空間（本手順では`kafka-test-01`という名称）
- Azure Event Hubs インスタンス （本手順では`dbx-to-eh-01`という名称）

Azure Event Hubs インスタンス の Data Explorer にて、イエロー タクシー データセットのサンプルデータを送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ce3d7529-5610-4343-866a-380c1657473e.png)

## 手順

### 1. Azure Event Hubs にて SAS を取得

Azure Event Hubs 名前空間（あるいは、 Azure Event Hubs インスタンス）にて、`共有アクセス ポリシー` -> `+ 追加`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d712eefc-b343-41a3-a52b-5af6cda55f61.png)

`dbx-to-eh-01`というポリシー名を入力し、`リッスン`をチェックした上で`作成`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/10613326-e8eb-4fde-b9ac-2054807cc346.png)

作成したポリシーを表示し、`プライマリ接続文字列`をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a9a32494-198c-43d2-a4af-5c707fdc08b0.png)

### 2. Databriks にて Azure Event Hubs からデータを取得

```python
from dlt import *
from pyspark.sql.functions import *

# Azure Event Hubs に接続するための設定値をセット
eh_namespace_name = "kafka-test-01"  ## Azure Event Hubs の名前空間をセット
ehi_name = topic_name = "dbx-to-eh-01"  ## Azure Event Hubs のEvent Hubs のインスタンスをセット
connection_string = "Endpoint=sb://kafka-test-01.servicebus.windows.net/;SharedAccessKeyName=dbt-to-eh-01;SharedAccessKey=hnyXXXX="  ## SAS 接続文字列をセット

# Databricks から Azure Event Hubs に設定する際の設定をセット
eh_sasl = (
    'kafkashaded.org.apache.kafka.common.security.plain.PlainLoginModule '
    f'required username="$ConnectionString" password="{connection_string}";'
)
bootstrap_servers = f"{eh_namespace_name}.servicebus.windows.net:9093"
kafka_options = {
    "kafka.bootstrap.servers": bootstrap_servers,
    "kafka.sasl.mechanism": "PLAIN",
    "kafka.security.protocol": "SASL_SSL",
    "kafka.sasl.jaas.config": eh_sasl,
}

# Azure Event Hubs からデータを取得
table_02 = "table_02"
@dlt.table(
    name = table_02,
)
def customers_bronze_ingest_flow():
    df = (
        spark.readStream.format("kafka")
        .options(**kafka_options)
        .option("subscribe",topic_name)
        .option("startingOffsets", "earliest")  # 検証目的であるため earliest に設定
        .load()
    )
    df = df.withColumn(
        "decoded_value",
        col("value").cast("string"),
    )
    return df
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8e83cc27-bc42-41ab-8dde-f2292e9422c0.png)

テーブルにデータが書きこまれていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/08e8457e-c01d-4eb5-84e8-d5bd6d2bfd39.png)
Databricks のデータフレームにて Azure Event Hubs から SAS 認証によりデータを取得する方法

## 概要

Databricks のデータフレームにて Azure Event Hubs から SAS 認証によりデータを取得する方法を紹介します。

## 前提条件

下記を構築します。

- Databricks
- Azure Event Hubs 名前空間（本手順では`kafka-test-01`という名称）
- Azure Event Hubs インスタンス （本手順では`dbx-to-eh-01`という名称）

Azure Event Hubs インスタンス の Data Explorer にて、イエロー タクシー データセットのサンプルデータを送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ce3d7529-5610-4343-866a-380c1657473e.png)

## 手順

### 1. Azure Event Hubs にて SAS を取得

Azure Event Hubs 名前空間（あるいは、 Azure Event Hubs インスタンス）にて、`共有アクセス ポリシー` -> `+ 追加`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d712eefc-b343-41a3-a52b-5af6cda55f61.png)

`dbx-to-eh-01`というポリシー名を入力し、`リッスン`をチェックした上で`作成`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/10613326-e8eb-4fde-b9ac-2054807cc346.png)

作成したポリシーを表示し、`プライマリ接続文字列`をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a9a32494-198c-43d2-a4af-5c707fdc08b0.png)

### 2. Databriks にて Azure Event Hubs からデータを取得

Azure Event Hubs に接続するための設定値をセットします。

```python
# Azure Event Hubs に接続するための設定値をセット
eh_namespace_name = "kafka-test-01"  ## Azure Event Hubs の名前空間をセット
ehi_name = topic_name = "dbx-to-eh-01"  ## Azure Event Hubs のEvent Hubs のインスタンスをセット
connection_string = "Endpoint=sb://kafka-test-01.servicebus.windows.net/;SharedAccessKeyName=dbt-to-eh-01;SharedAccessKey=hnyXXXX="  ## SAS 接続文字列をセット
```

Azure Event Hubs からデータを取得できることを確認します。

```python
# Databricks から Azure Event Hubs に設定する際の設定をセット
eh_sasl = (
    "kafkashaded.org.apache.kafka.common.security.plain.PlainLoginModule "
    f'required username="$ConnectionString" password="{connection_string}";'
)
bootstrap_servers = f"{eh_namespace_name}.servicebus.windows.net:9093"
kafka_options = {
    "kafka.bootstrap.servers": bootstrap_servers,
    "kafka.sasl.mechanism": "PLAIN",
    "kafka.security.protocol": "SASL_SSL",
    "kafka.sasl.jaas.config": eh_sasl,
}

# Azure Event Hubs からデータを取得
from pyspark.sql.functions import col, expr, from_json

df = (
    spark.readStream.format("kafka")
    .options(**kafka_options)
    .option("subscribe", topic_name)
    .option("startingOffsets", "earliest")  # 検証目的であるため earliest に設定
    .load()
)
df = df.withColumn(
    "decoded_value",
    col("value").cast("string"),
)

# データを表示
display(df)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9faf0105-fe2d-4f11-a0f2-f12e07f51140.png)
[writeup] picoCTF "Cookie Monster Secret Recipe"

# 今回の問題
picoCTFより"Cookie Monster Secret Recipe"を解いていきます。

# 実際に解いていく
### 1. 問題文にあるWebサイトに移動する
![Cookie Monster Secret Recipe_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/fec1a829-933c-4c9c-a459-e3e126763459.png)
UsernameとPasswordの入力欄があります。
それ以外はありません。

### 2. Webサイトを探索する
![Cookie Monster Secret Recipe_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/a8a4e953-ac61-4087-8089-11a0dbc03cb3.png)
![Cookie Monster Secret Recipe_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/1b90bd22-22b2-47a1-93e0-034c841e475d.png)
ソースコードを見ながら、適当な値を入力してみます。
今回は、ソースコードもシンプルで少ないのでわかりやすいです。

適当な値を入れて、Loginボタンを押すと...ヒントが現れました！
ヒントによると
「パスワードなんていらないよ。ただクッキーが欲しいんだ！」
「最近、クッキー確認した？」
と言っています。

クッキー→Cookieを確認しに行きましょう！

### 3. Cookieを確認する
![Cookie Monster Secret Recipe_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/97c296fb-1186-49e4-9c56-3f2225698f19.png)
早速、デベロッパーツールを開いて、[Application]からCookieを確認します。
CookieのValueに注目です。なんだか暗号っぽくないですか？

### 4. 暗号（CookieのValue）を解読する
  ![Cookie Monster Secret Recipe_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/4cfdbad1-cadd-4916-834c-26110b51ed5e.png)
CyberChefを使って、暗号を解読していきます。
今回の暗号の特徴は、
・A-Z, a-z, 0-9, +, / の64種類の文字で構成されている
・長い文字列
よって、Base64です。

左から[From Base64]を[Recipe]にドラッグ＆ドロップします。
すると、[Output]にデコードされた暗号が現れます。
これにてFLAG獲得です！お疲れ様でした。

# まとめ
今回の問題は、WebサイトのCookieのValueが、エンコードされたFLAGになっていました。
よって、CyberChefを用いて、デコードしてFLAGを獲得しました。

# 補足
・特になし
🌿 第３回：[ラズパイ管理がぐっとラクになる！DockerとZoraxyで作るリバースプロキシ③【応用設定編】]

## 🐣 はじめに

前回までにDockerを使ってローカルでZoraxyの環境をセットアップし、簡単なリバースプロキシ環境の動作確認まで完了しました。今回はその内容をおさらいしつつ、パスベース（Virtual Directory）を利用した振り分け方法を解説します。

## ⚠️ 注意事項

- Linuxサーバーへの構築を想定しています。TeraTermなどを使ってSSHで接続し、Linuxサーバー上で以下の操作を行ってください
- Zoraxyの設定については、Windows 11のPCからGoogle Chromeを使って設定を行っています

## 📋 前回のおさらい

前回は以下の手順を実施しました。（詳細は前回記事を参照してください。**ここにURLを追加忘れないように！**）

- Zoraxyをローカルでセットアップ
- Zoraxyの設定ファイルをローカルに永続的に保存
- Zoraxy管理画面へのアクセス確認

管理画面へのアクセス方法は以下の通りです。

- 管理画面URL: `http://構築したサーバーのIP:8000`

## 🚩 パスベース（Virtual Directory）での振り分け設定

今回はサブドメインを利用せず、パスベース（Virtual Directory）を使った振り分け設定を紹介します。

まずはZoraxy管理画面から、前回同様に『Create Proxy Rules』で基本的なプロキシ設定を行います。

その後、『Virtual Directory』を開き、以下のように設定してください。

| 項目                  | 設定値                             |
|-----------------------|------------------------------------|
| select a host to edit | `Create Proxy Rulesで設定したドメイン` |
| Matching Path Prefix  | `/任意のパス`                        |
| Target                | `接続先のIPアドレス`                  |

設定を入力したら、『Create Virtual Directory』をクリックして保存します。

## ✅ 動作確認

設定後、ブラウザから以下のURLにアクセスして、正しく振り分けが機能しているか確認しましょう。

```
http://設定したドメイン/任意のパス
```

正常に表示されれば成功です！

:::note warn
注意事項  
同じWIFI環境（ローカルネットワーク）からドメイン名でアクセスすると、NATループバックの制限により正常に接続できない場合があります。  
この場合、スマホのモバイル回線など別のインターネット回線を使って確認することをおすすめします。  
同じWIFI環境で確認する場合の対処法については次回詳しく解説します。
:::


## 🚩 次回予告

次回は、SSL認証（HTTPS）への対応と、その証明書の自動更新の設定方法について詳しく解説します。安全な運用のために、ぜひ次回もご覧ください。

## 🔗 シリーズリンク

- 第１回：[ラズパイ管理がぐっとラクになる！DockerとZoraxyで作るリバースプロキシ①【企画編】](URL)
- 第２回：[ラズパイ管理がぐっとラクになる！DockerとZoraxyで作るリバースプロキシ②【ローカルテスト編】](URL)
- 次回：Coming soon
[Xcode]変数名や関数名の変更が楽になるRename機能の使い方

# Renameについて
Xcodeでよく利用する便利機能を紹介します。
Rename機能は変数名や関数名を変更したいときに、全ての使用箇所を自動で一括変更してくれる機能です。
レビューで命名の修正指摘を受けたときにも便利ですし、タイポしたときにも重宝します。
今回は、Xcodeで変数名を一括で変更できる「Rename」機能についてご紹介します。

## Rename手順
下記のように`Button`を`Botton`とタイポしたプロパティを用意します。

```Swift:
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var renameBotton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        bind()
    }
    
}

extension ViewController {
    func bind () {
        renameBotton.isHidden = false
        renameBotton.tintColor = .red
        renameBotton.layer.cornerRadius = 10
    }
}
```

### 1️⃣対象プロパティを右クリック → Refactor → Rename を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/ec858ded-9b36-4683-ad4b-d4aee54274e2.png)

### 2️⃣新しい名前を入力し、Renameボタンを押す
今回は renameBotton → renameButton に修正します。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/747253a2-3cd0-408a-8b7a-8cb7e45b8b88.png)

### ✅一括変更が完了！
全ての使用箇所が自動で変更されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/b2660846-efdc-43d7-88ae-45b0a51e065b.png)

## まとめ
Rename機能を使えば、変数名・関数名を安全に一括で変更できます。
タイポやレビューでの命名修正など、使用頻度の高い機能なので覚えておくと便利です。
特にStoryboardと接続しているIBOutletの修正は手動で直すとミスも起きやすいので、この機能を使ってミスを防ぐこともできます。
【読書感想】おうちで学べるデータベースのきほん 第2版

# 書籍タイトル：おうちで学べるデータベースのきほん 第2版
読む時間：07:03

## はじめに
先月から新しい案件に配属され、バックエンドの設計・開発を一人で担当することになりました！
CMSツールを活用しながら、データベースやAPIなど、さまざまなバックエンド機能を構築していくのですが、
初期のテーブル設計がしっかりしていないと、後々の機能設計に大きな影響を与えると思い、
できるだけ適切なデータベース設計を行いたいと考えています。

そのため、データベースの基礎から復習しようと思い、本書を購入しました。

## 📚 **本書の詳細情報**
https://www.shoeisha.co.jp/book/detail/9784798185330

## 印象に残ったポイント

### 1. インデックスと主キー（PK）を混同しないように
主キー（PK）は、各レコードに対して一意となるIDであり、多くの場合、レコード挿入時に自動でUUIDが付与される設計になっています。
このように、主キーはレコードごとに「ユニーク」な値となるため、検索時にもよく使われます。まるで書籍の目次のような役割を果たすため、
「主キー＝インデックス」と誤解されがちですが、正確には異なります。

確かに、主キーの列には自動的にインデックスが作成されますが、主キー以外の列にもインデックスを設定することは可能です。
つまり、「インデックス＝主キー」ではなく、「主キーにはインデックスが張られるが、インデックスは主キーに限らない」という関係です。

### 2. 勝手にインデクスを増やさないように
主キー以外の列にもインデックスを設定することができます。
たとえば、Userテーブルの「名前」列にインデックスを設定すると、「名前」で WHERE 条件を使った検索がより効率的になります。

ただし、「じゃあ、すべての列にインデックスを付ければ検索が爆速になるのでは？」と考えて、全列にインデックスを張るのは新人の方がやりがちな落とし穴です。
これは避けてください。

確かに検索速度は向上する可能性がありますが、インデックスが増えると、データの「更新」時や「バックアップ」時にインデックスのメンテナンス処理が増えるため、
パフォーマンスの低下やストレージの無駄遣いにつながります。つまり、インデックスは便利な一方でトレードオフがあるという点を理解しておく必要があります。


### 3. SQLの実行計画を理解しよう
SQLを実行すると、DBサーバーのオプティマイザーが自動的に最適な方法でデータを取得してくれるイメージがありますが、
その裏側でサーバーがどのような処理をしているのかを気にする人はあまり多くないように感じます。

実際には、サーバーはテーブルのさまざまな「統計情報」をもとに、データアクセスの最適な計画（実行計画）を立てています。
イメージとしては、気象情報をもとに登山ルートを決めるようなものです。

以下のSQLを使えば、そのような統計情報や、インデックスが利用されているかどうかなど、オプティマイザーの判断内容を確認することができます。
```
show table status
explain select * from table_name
```
## まとめ・感想
本書は、データベースの歴史や基礎知識を丁寧に解説しており、初心者向けのテキストという印象を受けました。
エンジニア5年目にもなって「初心者向け？」と思われるかもしれませんが、これまでの業務では、私は常に“データベースを使う側”であり、“設計する側”ではありませんでした。
そのため、細かい部分まで意識することなく、データベースの恩恵を受けてきたのが正直なところです。

これまでWeb系の開発では、あまり深く考えずにAPI経由でデータをfetchし、その裏でサーバーがどのようにSQLを発行しているのか、またSQLがどのように解析され、どうやってデータを取得しているのかを意識していませんでした。

しかし、今はテーブルを設計する立場になったため、業務でどのようにデータを扱いたいのかを考慮しながら、
適切にSQLを設計し、必要なインデックスの設計も行っていきたいと思っています。

今回本書を読んだことで、あらためてデータベースの基礎を体系的に復習でき、
Webエンジニアがつい見落としがちなポイントも再確認できて、とても有意義な内容でした。
行末から見た先頭の半角スペースをヒットさせる正規表現を駆使してIntelli JのGit LogをExcelにエクスポートみたいなことをした

### やった作業

Intelli J の ログ から表示列をカスタマイズして、Ctrl + A → コピペすると、簡単に意図した情報のテーブルが作れてよいね。

### 困った内容
半角スペースで区切られてしまう。
そのまま貼り付けると列が分かれてくれない。

### 解決方法
次の正規表現でヒットさせたスペース、 \t に置換して解決。

```
\s(?=[^ \m]*$)
```

### TODO

3列以上には対応していないから、そういうケースは追々...
postgresqlのバイナリ形式のダンプをrsyncで転送するときzはつけないほうがよさそう

## 結論

postgresqlのバイナリ形式のダンプをrsyncで転送するときzはつけないほうがよさそう

## 前提

`pg_dump -Fc`でバイナリ形式のダンプを取得していて、これを別サーバーに転送したい

## 実験してみた

1.4GBくらい(1400914179 byte)のダンプが丁度あったので試した。余談だが、7zで圧縮すると1.3GB程度(1344790818 byte)に縮んだ。

### zあり

```
$ rsync -auhvz --progress <server>:/path/to/backup.dump .
receiving incremental file list
backup.dump
          1.40G 100%   12.67MB/s    0:01:45 (xfr#1, to-chk=0/1)

sent 43 bytes  received 1.40G bytes  12.67M bytes/sec
total size is 1.40G  speedup is 1.00
```

転送中にhtopでCPU使用率を見ていたが、どうもシングルコアで圧縮してそうだった。

### zなし

```
$ rsync -auhv --progress <server>:/path/to/backup.dump .
receiving incremental file list
backup.dump
          1.40G 100%   60.58MB/s    0:00:22 (xfr#1, to-chk=0/1)

sent 43 bytes  received 1.40G bytes  52.88M bytes/sec
total size is 1.40G  speedup is 1.00
```

## 考察

- 5倍近くの速度差が出た
- 転送元サーバーでの圧縮がシングルコアで行われたためにCPU律速した
- postgresqlのバイナリ形式のダンプはもともと圧縮されているので、rsyncで`z`をつけても圧縮できていない、つまり帯域節約の効果はない

## 感想

圧縮されてないクソデカログファイルとかなら`z`はワンちゃんあるけどそうじゃないなら現代ではいらないかなぁ・・・
最近関わった案件について振り返ってみた

# はじめに
はじめまして。
[ハニカムラボ](https://www.honeycomb-lab.co.jp/)の垣内です。
最近関わった案件で様々な勉強ができたため、備忘録としてここに残しておこうと思います。

# 案件概要
iPad向けARコンテンツの開発

# 勉強になったこと
### ・実装前の設計の重要性
本案件において、自分は後先考えずに直接実装に着手してしまいました。
このせいで、後々の変更やテストなどで余計な労力を使う結果になり、自身のパフォーマンス低下にもつながりました。
あらかじめ疎結合やモジュール化を意識して設計していれば、このようなことにはならなかったのでは…と思います。

例えば…
#### ・共通化を図る
今コードを見返してみると、同じ処理が複数書かれている箇所がありました。これによってコードが冗長になり、可読性も低下してしまいました。
関数化するなどして対応すれば、あとあと無駄な労力を割くこともなかったと思います。

#### ・Prefabを使う
Prefabを使わなかったせいで、
・MainSceneもしくはそれをコピーしたSceneを直接触らなければならない
・それによって毎回MainSceneに差分が発生する
といった事態に陥ってしまいました。

#### ・機能ごとにテストできる環境を作る
書いてある通りで、例えば機能ごとにテストSceneを作ってパーツごとにテストできる環境を整えておくべきでした。これをしなかったおかげで、毎回ビルドして全体通して確認して…といった手間がかかってしまいました。

#### ・Interfaceや継承などを使う
一つ目に挙げた共通化に関連することですが、クラス単位でも同じような処理が書かれているケースが多発しており、他のクラスとの結合も強かったため、Interfaceや継承を用いて疎結合を目指すようにすべきでした。

設計に関しては、以下の本を読んで勉強中です。
・改訂新版　良いコード／悪いコードで学ぶ設計入門 ―保守しやすい　成長し続けるコードの書き方

https://amzn.asia/d/70fFpYn

・現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法

https://amzn.asia/d/ifDCHe3


### ・チーム間のコミュニケーションの重要性
案件中、意識してディレクターや他エンジニア等と密にコミュニケーションを取るように意識しました。
また、分からないところははっきり分からないと表明することで、メンバー間の持つ情報のすり合わせが互いにできたように思います。

### ・Unityを用いたiOSアプリ開発への理解
本案件が初めてのiOSアプリ開発でした。
Unityで実装を行う部分についてはさほど壁にぶつかったことはなかったのですが、そのあとのXCodeを用いたビルドや、AdHocに向けたプロビジョニングファイルの作成などにはかなり手間取った記憶があります。
先輩に教えていただきながらなんとか乗り越えることができました。

今後再びiOSアプリ開発をする際には、自力で一貫して作業できるようになりたいです。

# 最後に
まだまだ未熟ではありますが、実務や学習を通してエンジニアとして成長し続けたいと思います。
【Servicenow】ATFのテスト再利用化方法

# はじめに

ServiceNowのATF（Automated Test Framework）には**Reusable Tests**という便利な機能がYokohamaから追加されました。この記事では、Reusable Testsの使い方を紹介します。

## ✅ Reusable Testとは？

**Reusable Tests**とは、他のATFテストケースの中から呼び出して使える「部品のようなテスト」です。共通処理（ログイン、レコード作成など）を分離しておくことで、以下のメリットがあります。

- テストの作成スピードアップ
- メンテナンス性の向上
- 複数のテストケースで共通ロジックを一元管理

## 🛠 Reusable Testの作成方法

### 1. 「Reusable Test」を選んで新規作成
- メニューで `Automated Test Framework > Reusable Tests` を開く
- 「New」ボタンを押下
- 各種値を入力する
    - CategoryはATFのTests内で呼び出す際に便利なため、設定推奨

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941772/7cbc48ec-b4c9-4a00-a4ed-7ac83f0b577d.png)

### 2. 再利用可能なTest Stepsを作成する
- Test Stepsを作成する
- Input/OutputのVariablesも設定可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941772/746048d2-2b70-499c-92a6-56aad839c805.png)


## :star:Reusable Testを呼び出す
- メニューで `Automated Test Framework > Tests` を開く
- Testsを開く
- Add Test Stepを押下
- Reusable Testで設定したカテゴリからTestを呼び出す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941772/4ac1ed53-e786-4afd-9053-89c15549a8a7.png)

## :zap:Testを実行する
- `Run Test` を押下
- Testの実行結果が確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941772/23512599-23c0-497a-8380-321b16b76d38.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941772/c9166ecf-d567-4233-882d-a64931f2efa0.png)
[自分メモ用] オーディオ設定

## アプリ

![スクリーンショット 2025-05-14 13.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/fc9760c3-acf2-4288-ab88-fa0e2faa6c27.png)

## Garage Band

![スクリーンショット 2025-05-14 13.39.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/a892a05b-38c7-40ce-998e-cd6936270205.png)


![スクリーンショット 2025-05-14 13.40.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/49bb384f-b0f9-438f-baeb-968546875a15.png)

## loopback

![スクリーンショット 2025-05-14 13.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/77043b3c-d655-499a-b72f-297ff638ba63.png)


## mac

![スクリーンショット 2025-05-14 13.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/04684b21-446b-4e7a-9428-db93d5b9bc4e.png)

![スクリーンショット 2025-05-14 13.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/4cbbdc17-e619-430a-a78b-bb31f5e7fd3d.png)
Railsのloggerでログの出し方

# やりたいこと
今まで色々なデバッグの多くを`puts(p)`で、やってました...
なので、loggerの使い方をマスターしよう編です💪

# loggerの使い方
Railsでloggerを使う方法について話していきます。
**基本的な使い方**
Rails アプリケーション内でログを出力するには`Rails.logger`がいいらしい。以下のことができるので..
> 実行時に情報をログに保存できるとさらに便利です。Railsは実行環境ごとに異なるログファイルを出力するようになっています。

デバッグメッセージを出力したい場合は次のように書きます。
```ruby
Rails.logger.debug "This is a debug message"
Rails.logger.info "This is an info message"
Rails.logger.warn "This is a warning message"
Rails.logger.error "This is an error message"
Rails.logger.fatal "This is a fatal message"
```
`debug`,`info`などはログメソッドです。
これらのログメソッドは、以下のログレベルに対応してます。
- debug：最も詳細なログ。開発中のデバッグに使用。
- info：一般的な情報（例：アプリケーションが正常に動作している時の情報）。
- warn：警告（例：非致命的な問題）。
- error：エラー（例：処理が失敗した時）。
- fatal：致命的なエラー（例：アプリケーションがクラッシュするようなエラー）。

**ログの出力先**
Rails.logger によるログは、通常は以下のいずれかに出力されます
- **ファイル出力**: Rails では、デフォルトでログファイルが log フォルダに出力されます。例えば、devlopment環境では log/development.log にログが出力されます。(環境によって出力されるファイルが違います)
- **標準出力**: ターミナルにログを出力したい場合、`config/application.rb`に`config.logger = Logger.new(STDOUT)` を設定することができます。

## おまけ
`config.logger = Log4r::Logger.new("Application Log")`
こんなのがあるみたい。

`config.logger = Logger.new(STDOUT)` との違いは...

| 特徴 |Logger.new(STDOUT)|Log4r::Logger.new("Application Log")| 
| --- | --- | --- | 
|ライブラリ|Ruby標準のLogger|Log4r(外部ライブラリ)| 
|設定の柔軟さ|シンプル|高度な設定が可能| 
|出力先|標準出力(ターミナル)|任意の出力先(ファイル、コンソール、メールなど)| 


# 参考
[Railsガイド　ロガー](https://railsguides.jp/debugging_rails_applications.html#%E3%83%AD%E3%82%AC%E3%83%BC)
Windows VBS/PowerShell にて日付バックアップフォルダを削除するスクリプト

# 日付バックアップフォルダ *1
とある現場で毎日”日付フォルダ”（Windows）が作成されていて容量の関係から４日以降は削除してほしいと。そんなんで手で消すのが面倒なのでスクリプトを作った次第です。
*1 自分が勝手に呼んでますｗ　

# こんなフォルダ構成になっています
言葉だとピンとこないかもなのでこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/cebc989f-bde8-4a2f-b2cf-c457db84bd25.png)

# VBScript で作ってみた
汎用的に使えるよう引数で対象フォルダを指定。日付フォルダの”日付”は実際の日であることを確認してから実際のフォルダを消すようにしてみます。

Windowsスケジューラで動かす予定なので上位はWindowsバッチファイルを用意しておきます。

```batch:sample1.bat
cscript sample1.vbs C:\tmp 1
```

```vb:sample1.vbs
Option Explicit

Dim arg1, arg2
Dim objFSO, dateBefore

arg1 = Wscript.Arguments(0)
arg2 = Wscript.Arguments(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")

if objFSO.FolderExists(arg1) then
  dateBefore = DateAdd("d", -4, DATE())
  dateBefore = Replace(dateBefore, "/", "")
  'Wscript.Echo dateBefore

  Dim objFolder, objSubFolers, item

  Set objFolder = objFSO.GetFolder(arg1)
  Set objSubFolers = objFolder.SubFolders

  '
  For Each item In objSubFolers
    Wscript.Echo item.Name

    If item.Name < dateBefore Then
      If IsDate(Mid(item.Name, 1, 4) &"/"& Mid(item.Name, 5, 2) &"/"& Mid(item.Name, 7, 2)) = True Then
        If arg2 = 1 Then
          Wscript.Echo " delete " , arg1 &"\"& item.Name
          objFSO.DeleteFolder arg1 &"\"& item.Name, True
        Else
          Wscript.Echo " delete test" , arg1 &"\"& item.Name
        End If
      End If
    End If
  Next
End if
```

# VBScript ってWindowsから完全削除？！
2027年にWindows上から完全に削除されるらしいですね。

https://www.imagazine.co.jp/vbscript-deprecation/

# PowerShellでも作ってみる
VBScriptは、2027年で廃止だから！と中の人に怒られそうなのでPowerShellでも作ってみました。

```batch:sample2.bat
powershell -executionpolicy bypass -File sample2.ps1 C:\tmp 1
```

```powershell:sample2.ps1
Param($arg1, $arg2)

function IsDate([string]$cdate) {
  try {
    $tmp = [Datetime]::Parse($cdate)
    $True
  } catch {
    $False
  }
}

$objSubFolers = Get-ChildItem -Directory $arg1 | Select-Object name
$dateBefore = (Get-Date).AddDays(-4).ToString("yyyyMMdd")

foreach($item in $objSubFolers) {
  Write-Host $item.name

  if($item.name -lt $dateBefore) {
    $ymd1 = $item.name[0..3] -Join ''
    $ymd2 = $item.name[4..5] -Join ''
    $ymd3 = $item.name[6..7] -Join ''
    $ymd = $ymd1, "-", $ymd2, "-", $ymd3 -Join ''

    $isDateFlag = IsDate($ymd)
    if ($isDateFlag -eq $True) {
      $delteFile = $arg1 + "\" + $item.name
      if ($arg2 -eq 1) {
        Write-Host " delete " , $delteFile
        Remove-Item -Path $delteFile -Force
      } else {
        Write-Host " delete test " , $delteFile
      }
    }
  }
}
```

# 最後に
WSL いれてマウントして・・・とやれば簡単なのですが、現場でそれやると怒られるｗ　しやーないすね。
HP製品のシリアル番号検索

たいていは裏のシールで確認するのだが
裏のシールはこんな感じ
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/2386724a-ce97-4b43-b4fc-3290afebdd5a.jpeg">

経年劣化で擦り切れてしまっている。

調べてみると
ファンクション＋esc
でHP System Informationが表示され
そこで確認できました。

これで修理できます。
Swift Testing で値を監視する

### Swift Testingで値を監視したい
と書いたが、別にXCTestでも、テストでなくてもなんでも良い。
値を非同期で監視し続ける場合に値が更新されたのを待って、テストを走らせたいということがある。
例えば以下のようなViewModelがあったとして、personに値が入ってからテストケースを実行したいとする。
SwiftTesting内にこの値を監視するメソッドがないわけではないが使いにくかったので自作した。
``` Swift
@MainActor
@Observable
final class ViewModel {
    var person: Person?

    init() {
        observe()
    }

    func observe() {
        Task { [weak self] in
            let stream: AsyncStream<Person> = ...
            for await value in stream {
                guard let self else { return }
                person = value
            }
        }
    }
}
```
ちなみにTaskを用いる場合weak selfは必要ないとよく言われるが、AsyncStreamの場合は必須である（別にweak selfでなくても良いがこのTaskを抜ける処理がないと永遠とメモリ上に存在してしまう）。
<br>

自作したメソッドは以下
``` Swift
func observe(content: @Sendable @escaping () async -> Bool, maxAttemtpts: Int = 10) async throws {
  let timer = AsyncStream { try? await Task.sleep(for: .seconds(0.5)) }
  var count: Int = 0
  for await value in timer {
    if await content() { return }
    count += 1
    if count >= maxAttemtpts { throw TestObserverError() }
  }
}

struct TestObserverError: Error {}
```
これをテスト内で以下のように用いる
```Swift
import Testing
@Test("Test")
func test() async throws {
    let state = ViewModel()
    try await observe() { await state.person != nil }
    ... いろいろなテスト
}
```
<br>
以上
Windows11PCで再起動してもシャットダウンまで至らず再起動できなかった場合の対処方法

コントロールパネルの電源オプションより、電源プランの変更>このプランの電源設定を復元。

![電源設定をリセットする.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845320/a7002f57-e6b3-42fc-8380-8297d69e16b1.png)

その後にShiftキーを押しながらシャットダウンをクリックして完全シャットダウンにする。

こうすることによりキャッシュを残さずにシャットダウンを実行できるので、以前のデータを維持しなくなった状態で再度PCを立ち上げて再起動を行ってみてください。
[MacBook]バッテリーを80％で止めたい人へ：オープンソース「battery」アプリの使い方と注意点まとめ


# TL;DR

MacBookの充電を80%で止めてバッテリー寿命を延ばしたい人へ。
GitHub製アプリ「[battery](https://github.com/actuallymentor/battery/releases/)」を使えばそれが可能。
ただしroot権限が必要で、動作にやや癖もあるため導入は慎重に。

# 経緯
標準搭載の「バッテリーの最適化」では以下のような課題から常時80%で止めたいユーザーには不十分であると考えます。

	•	🔄 自動制御のため常に80%で止まるわけではない
	•	📈 学習型のアルゴリズムに依存しており、使用パターンによっては100%まで充電されてしまう
	•	🧪 検証中や一時的に長時間電源接続を続けるようなケースでは確実に80%で止めたいニーズがある

こうした理由から「明示的に充電を制限できるツール」が必要と考え、
オープンソースの battery アプリを試すに至りました。

# なぜ80%で止めたいの？
	•	リチウムイオン電池は100%の充電状態が続くと劣化しやすい
	•	Appleの「バッテリーの最適化」は自動学習式で常に80%に止めてくれるわけではない
	•	自分で明示的にコントロールしたい場合、外部ツールが必要



# batteryアプリの特徴

✅ Apple Silicon対応
✅ 80%で充電停止、再開も自動
✅ GUI付きでわかりやすい
✅ オープンソース（MIT）



# 注意点

⚠️ root権限が必要（インストール時にパスワード入力あり）
⚠️ スリープ中に100%まで充電されてしまうバグ報告あり
⚠️ macOSアップデートで将来的に動作不能になる可能性あり



# 使い方（ざっくり）
	1.	リリースページから .dmg をDL
	2.	インストール後に起動、80%充電制限をON
	3.	メニューバーに常駐して自動制御



# 比較：AlDenteという選択肢も

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3611900/49634aff-d23a-4187-b0e3-58c1fa2c41f9.png)


[AlDente（無料版）](https://apphousekitchen.com/)も80%充電制限が可能で、実績も多くおすすめ。



# 結論
	•	自分でMacの充電をコントロールしたいなら「battery」は有力候補
	•	ただし動作やバグに多少のクセあり
	•	安定性重視なら「AlDente」を検討してもよし



充電管理でバッテリー寿命はかなり変わるので、気になる人はぜひ導入を検討してみてください。

---
参照

https://note.com/izzzz/n/n8ebdf215677d#cf365121-3177-44f0-9eab-6f43707ad57a

https://note.com/orisusarusan/n/nc8a9a730fb4e
[備忘録] Exploring Mental Health Data

# Exploring Mental Health Data とは
Exploring Mental Health Dataとは、性別や年齢、学校の満足度、仕事時間、職業などからその人がうつ病であるかを判定するKaggleのコンペである。

# 結果
提出結果は785位/2687(上位29.2%)であった。1位との精度差は0.0015ほどであるため、差がつきにくいコンペだったと認識している。

# 目次
* 自分のソリューション
* 試したがうまくいかなかったこと
* 上位者のソリューション
* 学んだこと
* 課題

# 自分のソリューション
## 特徴量エンジニアリング
学業や仕事から感じるストレス(pressure)を合計で計算。この時、学生なのに仕事のストレスも解答している人がいたのでそれを無効にした。また、満足度も同様に作成した。
``` python
# Academic PressureもWork Pressureもどちらも回答している人(学生)がいたので、Work Pressureをなかったことにする
df.loc[(~df['Academic Pressure'].isna()) & (~df['Work Pressure'].isna()), 'Work Pressure'] = np.nan
# Pressureを作成
df['Work Pressure'].fillna(0, inplace=True)
df['Academic Pressure'].fillna(0, inplace=True)
df['Pressure'] = df['Work Pressure'] + df['Academic Pressure']

# Job SatisfactionもStudy Satisfactionもどちらも回答している人(学生)がいたので、Job Satisfactionをなかったことにする
df.loc[(df['Job Satisfaction'].notna()) & (df['Study Satisfaction'].notna()), 'Job Satisfaction'] = np.nan
# Satisfactionを作成
df['Job Satisfaction'].fillna(0, inplace=True)
df['Study Satisfaction'].fillna(0, inplace=True)
df['Satisfaction'] = df['Job Satisfaction'] + df['Study Satisfaction']
```

また、居住都市名に睡眠時間が入力されているなどの異常値があったが、それがどのタイミングで発生したのか分からなかったため特に処理はしなかった。患者の入力結果だった場合、それはうつ病診断の手がかりになると考えたから。(入力欄を間違えるほどに疲れている、集中力が無いなど)

## CatBoostで学習、推論
カテゴリー列を指定して学習。
``` python
# カテゴリー列を取得
cat_features = df.drop('DataSet', axis=1).select_dtypes(include='object').columns.tolist()

# 交差検証の設定
kf = StratifiedKFold(n_splits=3, shuffle=True, random_state=7)
scores = []

# 交差検証ループ
for train_index, val_index in kf.split(train_df.drop('Depression', axis=1), train_df['Depression']):
    X_train_fold, X_val_fold = train_df.drop('Depression', axis=1).iloc[train_index], train_df.drop('Depression', axis=1).iloc[val_index]
    y_train_fold, y_val_fold = train_df['Depression'].iloc[train_index], train_df['Depression'].iloc[val_index]

    model = CatBoostClassifier(iterations=10000,
                               depth=6,
                               learning_rate=0.05,
                               rsm=0.2,
                               cat_features=cat_features,
                               verbose=100,
                               eval_metric='Accuracy',
                               early_stopping_rounds=100)

    # 評価セットを指定
    model.fit(X_train_fold, y_train_fold, eval_set=(X_val_fold, y_val_fold))

    # 精度を取得
    score = model.score(X_val_fold, y_val_fold)
    scores.append(score)

# 平均精度
print(np.mean(scores))
```
平均精度は0.9389196872778962となった。

# 試したがうまくいかなかったこと
* カテゴリーデータをEmbedding layerを使用してより高次元に落とし込んで特徴量として利用する方法。しかし、CatBoostのエンコーディング方法の方が精度が高かった
* データ数が23万と多かったのでTabNetを使用したがCatBoostの方が高かった
* 思いつく限りの特徴量を増やしたが精度に差は出なかった
* 予測を間違えたデータを見て有効な特徴量を考えて追加したが、恐らく学習するデータに過適合してしまっていた

# 上位者のソリューション
* AutoMLという機械学習ライブラリを用いていた。これにより、複数モデルのアンサンブルやチューニングが簡単にできるらしい(AutoGluonを主に使用)
* 1位の人は特徴量エンジニアリングなし、Name列の削除すら行っていない

# 学んだこと
* 少しでも精度を上げるためには複数モデルのアンサンブルが有効
* シンプルなモデルの方が精度が高いこともある
* 探索範囲が相当小さくない限りは、GridSearchよりOptunaの方がパラメータ最適化に向いている

# 課題
* AutoGluonのような機械学習ライブラリの使用方法を身につける
* 異常値の確認をして適切に処理できるようにする。複数の処理方法がある場合は、実際に試してみて決めるようにする
[obsolete] net/samba* AD に参加しないユーザの登録と削除スクリプト

# samba は踊る方🪇じゃありませんw
HDD のデータ整理してたら、懐かしいスクリプト出てきよったけぇ、👋しおるのも寂しいけんココに貼っとく📝
# 対象📯
FreeBSD 10.3-RELEASE 以降でその時点での net/samba* が対象😆
# 何気に見易いスクリプト(自画自賛)
```text
useradd.sh
userdel.sh
```
上記のファイルネームで動きを変えたモダンな作り(大嘘)
cp でヤルも良し、inode 節約するなら ln でハードリンクなりスタティックリンク張って、使う様に作ったスクリプト🙌
# ご本尊😊
```sh:useradd.sh
#!/bin/sh
#
# SAMBA user add and delete script.
# used in the UID root
#
# 2016/04/22 by JE3KMZ
#

CRUNCH=`/usr/bin/basename $0`

SEARCHGROUP()
{
	OK=0
	for a in `( /usr/bin/awk -F: '{print $1}' /etc/group | /usr/bin/grep -Ev '^$|^#' )`
		do
		if /bin/test "_$a" = "_$INGROUPNAME"
			then
			OUTGROUPNAME=$INGROUPNAME
			OK=1
		fi
	done
	if /bin/test "_0" = "_"$OK
		then
		echo Unknown groupname.
		exit 2
	fi
}

CREATE()
{
	SWITCHCHECK
	SEARCHGROUP
	echo "--Adduser "$USERNAME
	/usr/sbin/pw adduser -n$USERNAME -g$GROUPNAME -c$USERNAME -s/usr/sbin/nologin -d/nonexistent
	if /bin/test ! "$PASSWORD"
		then
		PASSWORD=$USERNAME
	fi
#	/usr/bin/printf "$PASSWORD\n$PASSWORD\n" | /usr/local/bin/smbpasswd -a -s $USERNAME
	/usr/bin/printf "$PASSWORD\n$PASSWORD\n" | /usr/local/bin/pdbedit --create --user=$USERNAME --group=$GROUPNAME --password-from-stdin
}

DESTROY()
{
	SWITCHCHECK
	echo "--Deleteuser "$USERNAME
#	/usr/local/bin/smbpasswd -x $USERNAME
	/usr/local/bin/pdbedit --delete --user=$USERNAME
	/usr/sbin/pw deluser -n$USERNAME
}

USAGE()
{
	case $CRUNCH in
		useradd*)
			PRINTMSG=" -g GROUP <-p PASSWORD>"
			;;
		userdel*)
			PRINTMSG=""
			;;
		*)
			echo The shell script file name is invalid.
			exit 2
			;;
	esac
	echo $CRUNCH" SAMBA User add and del Tools"
	echo "Usage: "$CRUNCH" -u USERNAME"$PRINTMSG
	exit 1
}

SWITCHCHECK()
{
	OK=0
	while /bin/test ! "_$1" = "_"
		do
		case $1 in
			-[Uu]*)
				shift
				USERNAME=$1
				OK=1
				;;
			-[Pp]*)
				shift
				PASSWORD=$1
				OK=2
				;;
			-[Gg]*)
				shift
				INGROUPNAME=$1
				OK=4
				;;
			*)
				echo Unknown parameter.
				exit 2
				;;
		esac
		shift
	done
	if /bin/test "$OK" = "0"
		then
		USAGE
	else
#		echo "UID	=> "$USERNAME
#		echo "GID	=> "$INGROUPNAME
#		echo "PWD	=> "$PASSWORD
	fi
}

MAIN()
{

	case $CRUNCH in
		useradd*)
			CREATE
			;;
		userdel*)
			DESTROY
			;;
		*)
			echo The shell script file name is invalid.
			;;
	esac
}

MAIN

exit
```
# 結び
チョットしたスクリプトの分岐とかのお手本になると筆者は喜びます✌
猿でもわかるAIビジネス活用シリーズ 🐵📊AIで売上アップ：営業部門での成功事例まとめ



🧩 1. はじめに：営業のボトルネック、AIで解決できる？

営業チームは「人と人」の関係が重要だと言われますが、現実には以下のような課題があります。

* 商談情報は属人的で、ナレッジが蓄積されない
* どの顧客にアプローチすべきかが勘頼り
* 売上見通しが曖昧で、マネジメントが難しい

これらの課題に対し、AIを活用することで定量的な予測や判断支援が可能になります。
本記事では、AIを用いた「商談の成約確率予測モデル」の実装と、実務での展開について紹介します。

---

🧠 2. AIで営業を支援する代表的なユースケース

| ユースケース           | 概要                         |
| ---------------- | -------------------------- |
| リードスコアリング        | 見込み客の購入確率をAIでスコア付け         |
| 商談成約確率の予測        | どの案件が成約しやすいかを機械学習で予測       |
| クロスセル/アップセル候補の抽出 | 顧客に合った商品提案を自動化             |
| 顧客離脱予測           | 契約更新しない顧客を早期検知             |
| 営業日報の自動生成        | 会話内容・行動ログから自動的に要約生成（生成AI系） |

---

🧪 3. 実装編：商談成約率をAIで予測してみる（Python + scikit-learn）

ここでは、CSVで与えられた商談データから「この商談は成約するか否か」をAIが予測するモデルを構築してみます。

🎯 入力データ（例）

* 案件金額（amount）
* 顧客規模（client\_size）
* 連絡回数（num\_contacts）
* 提案回数（num\_proposals）
* リードソース（lead\_source）
* 商談期間（days\_open）
* 成約フラグ（is\_won：1=成約、0=失注）

👨‍💻 コード（抜粋）

```python
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.preprocessing import OneHotEncoder

# 1. データ読み込み
df = pd.read_csv("sales_data.csv")

# 2. 前処理（カテゴリ変数のエンコード）
categorical = ['lead_source']
encoder = OneHotEncoder(sparse=False)
encoded = encoder.fit_transform(df[categorical])
encoded_df = pd.DataFrame(encoded, columns=encoder.get_feature_names_out(categorical))

df = pd.concat([df.drop(columns=categorical), encoded_df], axis=1)

# 3. 学習データと正解ラベルを分割
X = df.drop(columns=['is_won'])
y = df['is_won']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 4. モデル構築・評価
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

print(classification_report(y_test, y_pred))
```

📈 出力イメージ（classification\_report）

```
              precision    recall  f1-score
           0       0.83      0.81      0.82
           1       0.75      0.78      0.76
```

---

🔧 4. 実務で使えるTipsと落とし穴

✅ Tips:

* リードソースや営業担当者はカテゴリエンコードで重要特徴に
* モデル評価指標はaccuracyだけでなくrecall, f1-scoreを見る
* 特徴量重要度（feature\_importances\_）でボトルネック分析可能

⚠️ よくある落とし穴：

* 商談ステータスの定義が曖昧 → 「保留中」を明示的に除外する
* データの期間が偏っているとモデルが過学習を起こす
* 特徴量に未来情報（例：成約日）を入れてしまう → ターゲットリークに注意！

---

🚀 5. 応用展開と高度な活用方法

* 生成AIを活用した「商談メモ自動要約」 → ChatGPT API連携
* BIツール（Looker/Tableau）と連携し営業マネージャーも可視化可能
* 営業支援SaaS（HubSpot, Salesforce）へのAPI連携 → 自動スコアリング運用
* SHAP値を用いた「なぜその予測か」を説明可能にする（説明性の強化）

---

📌 6. まとめ：AIで変わる営業部門の未来

| 項目    | 内容                              |
| ----- | ------------------------------- |
| メリット  | 属人化の排除、受注率UP、育成効率化              |
| デメリット | データ整備の工数、ブラックボックス性、継続運用コスト      |
| 今後の展望 | AutoML・生成AIの活用、CRMとのリアルタイム連携の進化 |

---

この記事をきっかけに、あなたの営業組織でも「AIによる成約率予測」を試してみませんか？
次回は「人材採用にAIを活かす！面接・選考の自動化とは？」について紹介予定です ✉️✨
インターンでNext.jsが必要になったので24時間で何かアプリをリリースしてみる

# きっかけ

- インターンで **Next.js** を使用する必要があり、ハッカソンでは未経験だったため、事前にキャッチアップしておきたかった。
- 自分の **リリース実績がなかった** ため、何か一つ公開できるアプリケーションを作ってみたかった。
- クリーンアーキテクチャを勉強したので実際に使ってみたかった。
- ただし、研究が忙しくて開発に多くの時間を割けないため、**短期間で素早く作り上げる必要があった**。


# やること
本日2025年5月13日18:55から、24時間以内にアプリをリリースする。


# アイデア出し(~19:00)
- 「場所,気温,湿度,天気,時間」を送るとキャラクターが心の一句を詠んでくれる。
- キャラクターの名前をそのままサービス名にする。

(新規性,有用性は一切考えていない)


# プロトタイプ作成(~19:23)

https://www.figma.com/proto/pnMnKX6wiSno3e2mtbWI98/%E3%81%93%E3%81%A3%E3%81%93?page-id=0%3A1&node-id=1-2&p=f&viewport=351%2C291%2C0.38&t=W5n4Lyn0td6V7pBl-1&scaling=scale-down&content-scaling=fixed


# 設計図作成(~21:05)
draw.ioを使用。

https://www.drawio.com/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3868342/d0c5e52d-2554-4c02-8e1c-44aed3ca46c6.png)






# コーディング(翌日~12:13)
プロジェクトリポジトリ

https://github.com/koichi2426/koko

(色々あってプロジェクトファイルを一度作り直しています。)

# デプロイ(~12:26)
Vercelを使用。

https://vercel.com/

# 完成
完成したアプリはこちら。(クオリティは考えないでほしい)

https://koko-opal-ten.vercel.app/

無事に5月14日12:26に終了できたのでチャレンジは成功。

# 感想
- フロントとバックともにルーティングが非常に簡単で素晴らしい。
- vercelに簡単にデプロイできるのが素晴らしい。
- 最近ハッカソンに参加していなくて実装力が落ちているのではないか不安でしたがなんとか達成できてよかった。
- Next.jsフレームワークにクリーンアーキテクチャを落とし込むためにファイル構成をどうするべきか悩んだが、何とか落とし所を見つけたので良し。
- 何気にアプリをリリースすることが初めてだったので嬉しい。

# 追記
**Amazon edrock**と**LangChain**も必要になったのでキャッチアップする。

https://qiita.com/koichi2426/items/26e538f0704f304c4183

# 参考資料

https://wp-kyoto.net/run-web-app-and-api-with-hono-on-vercel

https://zenn.dev/peter_norio/articles/080fee3a662c5b

https://qiita.com/hukuryo/items/56a516d6252326c8e2cf

https://qiita.com/css_understand/items/c7d5a637464d059c0172

https://zenn.dev/necscat/articles/d5d9b7a3f859d7

https://youtu.be/ekUQ043k2TQ?si=-YnNgdpViDAjkUA0

https://github.com/Shin-sibainu/directory-youtube-tutorial
猿でもわかるAIビジネス活用シリーズ 🐵📊 マーケティングに効く！AIを活用した顧客分析の実例


マーケティングを加速する！AIを使った顧客分析の実践例と実装ノウハウ

---

## 1. はじめに：なぜ「顧客分析×AI」が注目されるのか？

デジタルマーケティングの現場では、膨大な顧客データ（年齢、購買履歴、アクセスログなど）をどのように活用するかが、売上やLTV（顧客生涯価値）に直結します。しかし、人手による分析には限界があります。

そこで登場するのが「AIによる顧客分析」です。AIは膨大なデータからパターンや傾向を抽出し、精度の高いターゲティングやレコメンデーションを可能にします。

この記事では、実際にPythonとscikit-learnを用いて、以下のような分析を再現しながら、現場で役立つノウハウを紹介します。

✅ どの顧客がリピーターになるか予測したい
✅ 顧客をセグメントに分けてパーソナライズしたい
✅ 休眠顧客を自動で検知したい

---

## 2. 顧客分析に使われる代表的なAI技術

| 技術                      | 用途例               |
| ----------------------- | ----------------- |
| クラスタリング（例：KMeans）       | 顧客のセグメント化         |
| 分類（例：Random Forest）     | 購入／未購入の予測         |
| 回帰（例：Linear Regression） | 顧客LTVや購買金額の予測     |
| アソシエーション分析（例：Apriori）   | レコメンデーション、バスケット分析 |

今回は「クラスタリング＋分類」を使った実装を中心に進めていきます。

---

## 3. 実装例：AIで顧客を分類し、リピーター予測をしてみる

### 🔧 使用ライブラリ

```python
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
```

### 📊 Step 1: データ準備

サンプルデータ（CSV）には以下のような項目が含まれます。

* customer\_id
* age
* total\_purchase
* avg\_purchase\_frequency
* last\_purchase\_days
* is\_repeat\_buyer（ターゲット）

```python
df = pd.read_csv("customer_data.csv")
features = ['age', 'total_purchase', 'avg_purchase_frequency', 'last_purchase_days']
X = df[features]
y = df['is_repeat_buyer']
```

### 🚀 Step 2: 標準化とクラスタリング

```python
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

kmeans = KMeans(n_clusters=4, random_state=42)
df['cluster'] = kmeans.fit_predict(X_scaled)
```

### 🎯 Step 3: クラスタ情報を使って再購入予測

```python
X['cluster'] = df['cluster']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
```

---

## 4. 実務で使えるTIPS＆落とし穴

### ✅ 実務でのTIPS

* 欠損値の処理は必ず行う（平均補完、削除、前処理を丁寧に）
* クラスタ数はエルボー法やSilhouetteスコアで決める
* カテゴリデータはOne-Hotエンコードで処理する

### ❌ よくある落とし穴

* ターゲットリーク（予測すべき変数を説明変数に使ってしまう）
* 学習データと本番データの分布不一致
* 精度ばかり見て、解釈性を軽視する

---

## 5. 応用展開と現場導入のヒント

* 顧客クラスタごとに施策（キャンペーン）を打ち分ける
* LTVの予測に回帰モデル（XGBoostなど）を導入
* CDPやMAツールと連携し、AIモデルの結果を自動連携
* BIツール（Tableau, Looker）で可視化してチーム全体で活用

---

## 6. まとめ：AI×マーケティングの可能性と課題

| 視点    | 内容                              |
| ----- | ------------------------------- |
| メリット  | 大量データを瞬時に処理、パーソナライズ、ROI向上       |
| 課題    | モデルの継続運用、解釈性、データの品質管理           |
| 今後の展望 | AutoML、生成AIの統合、リアルタイムパーソナライズの普及 |

---

この記事をきっかけに、皆さんのプロジェクトでも「AIによる顧客分析」をぜひ試してみてください！Qiitaにスターやフィードバックもお待ちしています 🙌

---