OmniAICreator/Qiita-1.07M huggingface dataset:
文字列の配列で遊ぶ。(memcpy)(ちょつと工夫)


x M5NanoC6での予定は、未定
x いろいろ、違いは、各自考えよう!!!

オンラインコンパイラ

```c++


#include <iostream>
#include <string.h>  //memcpy
using namespace std;
int main(void){
    // Your code here!
    
    char line[2][10];
    
    #define P0 "abc"
    memcpy(line[0], P0, (sizeof P0)); 
    #define P1 "def"
    memcpy(line[1], P1, (sizeof P1)); 

    printf("%s\n",line[0]);
    printf("%s\n",line[1]);
    
}



```

```

abc
def

```
Python 機能追加する方法を考える

機能追加をする場合の３パターンについて考える。

1.新しいクラスおよび関数の作成
-
適用例
①　ゼロベースで新しい機能を作りたい場合に適用する。

具体例
新しい人間クラスや関数を作る場合

```python:example.py
# 人間を表す新しいクラスを作成
class Human:
    # コンストラクタで名前と年齢を初期化
    def __init__(self, name, age):
        self.name = name  # インスタンス変数 self.name に名前を格納
        self.age = age    # インスタンス変数 self.age に年齢を格納

    # 人間が話す振る舞いを定義するメソッド
    def speak(self):
        return f"{self.name}が話しています。"  # メソッドが呼ばれると名前付きのメッセージを返す

# 人間の挨拶をする関数を作成
def greet(human):
    # 関数の引数に Human クラスのインスタンスを渡し、挨拶の文字列を返す
    return f"こんにちは、{human.name}さん！"

# Humanクラスのインスタンスを生成
person = Human("田中", 36)
# speakメソッドを呼び出して話す
print(person.speak())  # 出力: "田中が話しています。"
# greet関数で挨拶を表示
print(greet(person))  # 出力: "こんにちは、田中さん！"
```

2.デコレータ
-
適用例
①　既存のコードを変更せず、特定の振る舞いを追加したいとき。
②　簡単な処理や複数のクラス関数に共通するロジックを適用したいとき。

具体例
趣味を追加するデコレータ

```python:example.py
# 趣味を追加するためのデコレータを定義
def add_hobby(hobby):
    # デコレータ自体がクラスを引数に取る内包関数を返す
    def decorator(cls):
        # クラスに新しい属性 hobby を追加
        cls.hobby = hobby
        # クラスに新しいメソッド hobby_introduction を追加
        cls.hobby_introduction = lambda self: f"趣味：{self.hobby}"
        return cls  # 修飾されたクラスを返す
    return decorator

# Humanクラスにデコレータを適用し、趣味を「読書」と設定
@add_hobby("読書")
class Human:
    # Humanクラスのコンストラクタ
    def __init__(self, name, age):
        self.name = name  # インスタンス変数 self.name に名前を格納
        self.age = age    # インスタンス変数 self.age に年齢を格納

    # 人間が話す振る舞いを定義
    def speak(self):
        return f"{self.name}が話しています。"

# Humanクラスのインスタンスを生成
person = Human("田中", 36)
# speakメソッドを呼び出して話す
print(person.speak())  # 出力: "田中が話しています。"
# デコレータで追加された趣味を紹介するメソッドを呼び出す
print(person.hobby_introduction())  # 出力: "趣味：読書"
```

3.クラス継承
-
適用例
①　親クラスの機能を活かしつつ、拡張や変更をしたいとき。
②　同じような構造を持つ複数のクラスを作るとき。

具体例
「人間」クラスを継承して「ロボット人間」を作る場合。

```python:example.py
# 人間を表す親クラス
class Human:
    # コンストラクタで名前と年齢を初期化
    def __init__(self, name, age):
        self.name = name  # インスタンス変数 self.name に名前を格納
        self.age = age    # インスタンス変数 self.age に年齢を格納

    # 人間が話す振る舞いを定義するメソッド
    def speak(self):
        return f"{self.name}が話しています。"  # メソッドが呼ばれると名前付きのメッセージを返す

# Humanクラスを継承したアンドロイドクラスを作成
class Android(Human):
    # コンストラクタで名前、年齢に加えてモデル番号を初期化
    def __init__(self, name, age, model):
        # super()を使って親クラスのコンストラクタを呼び出す
        super().__init__(name, age)
        self.model = model  # インスタンス変数 self.model にモデル番号を格納

    # 親クラスの speak メソッドをオーバーライド（上書き）
    def speak(self):
        # オーバーライドしたメソッドでは「アンドロイド」専用のメッセージを返す
        return f"私はアンドロイド {self.model} です。"

# Humanクラスのインスタンスを生成
person = Human("田中", 36)
# Humanクラスのメソッドを使用
print(person.speak())  # 出力: "田中が話しています。"

# Androidクラスのインスタンスを生成
robot = Android("田中", 36, "RX-78")
# オーバーライドした speak メソッドを使用
print(robot.speak())  # 出力: "私はアンドロイド RX-78 です。"
```

4.使い分けのポイント
-
①　新しいクラス/関数
　　完全に独立した機能やロジックが必要な場合に使います。
　　他のクラスや関数に依存しないため、自由度が高い。

②　デコレータ
　　既存のコードを変更せずに、部分的な機能を追加したい場合に使用。
　　特定の振る舞いを柔軟に再利用可能。

③　クラス継承
　　基本形があり、それを元に少しずつ違うものを作りたい場合に使用。
　　親クラスの共通部分を活用して、効率的にコードを再利用可能。

5.選ぶ基準
-
①　完全に新しいロジックが必要なら、新しいクラスや関数を作成。
②　柔軟に部分的な拡張がしたいなら、デコレータを使用。
③　共通機能をベースに派生クラスを作りたいなら、クラス継承を使用。
Qiskit+VSCodeで始める量子プログラミング【python,windows11】

はじめまして、いきなりですがQiskit1.3.1をWindows11上の仮想環境にインストールして、VSCode上で簡単な量子プログラミングを行いたいと思います。私自身がQiskit初日にしたこと、具体的にはインストール手順と初歩的なプログラムのみ書きます。

*本記事ではwindows11を使用します。またpython,VSCodeのインストール手順はここでは書きません。


# １．Qiskitとは何か
QiskitSDKは2017年3月にIBM社によって提供されたクラウド量子計算ツールです。
より具体的には無料クラウド量子コンピュータであるIBM Quantum PlatformにアクセスしてPythonでクラウド量子計算を可能にするライブラリです。

↓これはドラッグ＆ドロップで量子ゲートを構成するIBM Quantum Learningの所謂Composer方式の量子計算サイトですが、低量子ビットの場合はよくても複雑なアルゴリズムの実装には向きません。Qiskitの導入によってpythonによる古典コンピュータと量子コンピュータのいいとこ取りができるというわけです。

https://quantum.ibm.com/composer

# ２．仮想環境を用意しよう
本記事では最新（2025/1/18時点）のQiskit1.3.1をVSCode上で使えるようにするためWindows11上に作成した仮想環境にインストールします。(というか仮想環境を使うのがオススメです)
私はanaconda上で作成した仮想環境を使ってますが、anacondaが無くても勿論作成できます。PowerShellでcdを使って作業ディレクトリに移動し、以下のコマンドを打ち込んで`name_env`の部分を好きなディレクトリ名に変えればOKです。activateを忘れずに。
```
python -m venv name_env
```
↓activateのコマンド
```
./name_env/Scripts/activate
```
# ３．Qiskitをインストール
インストールの前にpipのアップデートだけしておきましょう。↓を打ち込むだけてOKです。
```
python -m ensurepip --upgrade
```
ではいよいよQiskitを仮想環境にインストール！
```
pip install qiskit
```
`qiskit-aer`,`qiskit-algorithms`,`qiskit-finance`,`qiskit-ibm-runtime`,`qiskit-machine-learning`,`qiskit-optimization`も折角なので一緒にインストールしましょう。↑の`qiskit`の部分をそれぞれに変更して実行します。
私はanacondaの仮想環境からVSCodeを開きそのターミナルで全て実行しました。これらの流れもすぐ終わるしインストール済みの項目が一目で分かるのでやはり便利。

# ４．VSCodeで簡単な量子プログラミング
VSCodeでQiskitをいじっていたところ、どうやら描画が苦手らしい。そこでVSCode上のJupyterNotebookでコードを書くことにしたら、一瞬で描画してくれました。
anacondaならボタン一発ですが、無い方はこれでJupyterNotebookのインストールができます。
```
pip install jupyter
```

VSCodeを開き、仮想環境に入り、`表示`➡`コマンドパレット`➡`Create New Jupyter Notebook`で.ipynbファイルが作成できます。

```Q1-1.ipynb
from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
qc.draw("mpl")
```
JupyterNotebookに上記のプログラムを打ち込み実行すると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3969923/71c99e40-bf1e-0d14-1ffb-7db88858047e.png)

上手く動作すれば、このような画像が出力されるはずです。
引数をいじくりまわしたり、最初に貼ったCompoer方式の量子ゲートをいじったりすればこの画像の意味が分かるかもしれませんね。
とりあえず今日はここまで！お疲れ様でした！
【2025年版】データサイエンス学習者必見！フォロー必須のXアカウント15選

# はじめに
データサイエンスは、いまや社会やビジネスの変革を後押しする重要な分野へと成長しています。とりわけ、X（旧Twitter）のようなSNS上には、日々さまざまな知見やノウハウが集まり、世界中のエキスパートとのつながりを構築する絶好の機会が広がっています。

本記事では、そんなX上で活躍し続ける私も非常に参考にしている「**データサイエンス系アカウント**」を15名ご紹介します。それぞれの特徴を交えながら、なぜフォローすべきかをわかりやすくまとめていきます。彼らの発信をキャッチアップすることで、最先端のテクニックやトレンド、キャリアや学習のヒントを効率よく得ることが可能です。

ぜひ最後までご覧いただき、全員フォローしてみてください。

# おすすめXアカウント
ここからは、実際にX上で活躍しているAI・データサイエンス系のアカウントを順にご紹介します。いずれも学習方法や最新情報を得る上で役立つ情報源ばかりなので、ぜひフォローしてみてください。

1人目を除き、2025年1月19日現在のフォロワー数の順番に紹介させていただきます！

### 1. タランチュラ | データサイエンティスト

https://x.com/tarantula_ds_/

+ 機械学習や統計における分かりやすい図解を発信
+ Qiita記事も定期的に執筆している(実はこの記事の著者です)
+ データサイエンス初学者に優しい発信を心がけています

### 2. Python Coding

https://x.com/clcoding

+ Python関連ライブラリの紹介が主で、短文で要点をまとめた投稿がわかりやすい
+ 新しいライブラリやバージョンアップ情報をいち早くキャッチしやすい
+ コードの実例が豊富なので、実務でPythonを使うエンジニアにとって心強い情報源

### 3. elvis

https://x.com/omarsar0

+ AI関連の論文情報を多数紹介しており、arXivの最新論文にも精通
+ 「どの論文を読むべきか」が見つかりやすく、学術的に深掘りしたい人には必見
+ 研究トレンドを把握するうえでも、フォローしておくと役立つ情報源になる

### 4. チャエン | デジライズ CEO

https://x.com/masahirochaen

+ AIニュースを“最速”でわかりやすく発信
+ 驚くほど早い情報提供で、最新のAI技術トレンドをいち早くキャッチできる
+ 「こんなことまでAIで可能なのか」と、新しい気づきを得られる投稿が多い

### 5. ChatGPT研究所

https://x.com/ctgptlb

+ ChatGPT関連情報のアップデートがとにかく早い
+ 使いこなし方や活用アイデアなどの投稿も豊富
+ 記事やノウハウを積極的に共有しているため、生成AIの最新動向を追いたい人におすすめ

### 6. Matt Dancho (Business Science) 

https://x.com/mdancho84

+ 時系列解析に強く、マイナーなライブラリやユニークな活用法を紹介
+ 投稿から海外のデータサイエンス動向を知ることができる
+ 特にPythonやRを使った時系列解析に興味がある方におすすめ

### 7. かめ@日本一のAI講座/コミュニティ"DataScienceHub"やってます

https://x.com/usdatascientist

+ Udemy講師としてわかりやすい解説が好評
+ X上ではUdemyクーポン情報やデータサイエンスの学習法を積極的に発信
+ ブログも非常に丁寧で、初心者〜中級者がつまずきやすいポイントをわかりやすく解説
+ 学習面でのつまずきをサポートしてくれるコミュニティ「DataScienceHub」も注目

### 8. 神威/KAMUI

https://x.com/ai_syacho

+ 生成AI領域やツールに関する発信が多く、実践的な活用例も豊富
+ AI駆動型の大規模リバースエンジニアリングシステム「神威」を開発
+ 先端技術の深い知見に触れたい方は要フォロー

### 9. バーチャルデータサイエンティスト アイシア=ソリッド

https://x.com/AIcia_Solid

+ YouTubeでのわかりやすい動画が人気
+ 新しい動画を頻繁にアップしており、データサイエンスの学習リソースとして活用可能
+ 実際のデモを交えた解説で理解が深まりやすい

### 10. あおい | AIエージェント活用・開発

https://x.com/Aoi_genai

+ AIツールに関する発信に特化しており、実務・学習にすぐ役立つ情報が得られる
+ アクティブに活動しており、その姿勢や発言から学びのモチベーションを得られる
+ 便利な活用法や具体的なTipsなどが非常に参考になる


### 11. kenken

https://x.com/kenken26679105

+ 2021年から独学をスタートし、今なお学習を継続中のストイックさ
+ 深い知識を着実に身につけており、学習プロセスを共有してくれるため参考になる
+ 特にベイズ推論の学習手順は初心者にもわかりやすく、学びの道筋が見えやすい

### 12. Kanan Kiguchi

https://x.com/KananK_AI

+ 圧倒的な行動力とモチベーションの高さが魅力
+ AI領域への強い想いを伝える投稿が多く、読むだけでやる気が湧いてくる
+ 先陣を切って新しいチャレンジをしており、トレンドの動向を知る上でも必見

### 13. A7｜データサイエンティスト界の大谷翔平になりたい大学院生

https://x.com/A7_data

+ AI領域を心から愛していて、勉強や発信を楽しんでいる姿勢が魅力的
+ Notionキャンパスリーダーを務めており、AIツールを積極的に活用・紹介
+ 投稿を見ていると「自分ももっと頑張らねば」と思わせてくれる、モチベーションを高める発信が多い

### 14. 青の統計学-Data Science School-

https://x.com/blue_statistics

+ 統計検定のチートシートやAI関連の有料教材を発信
+ 統計学や機械学習の基礎をしっかり学ぶための情報が豊富
+ 質の高い投稿が多く、本格的な知見を得たい人におすすめ

### 15. ぬるったん @データサイエンティストのキャリア発信

https://x.com/Nurruttan

+ 企業で活用されている生成AIの事例や有益な資料を積極的にシェア
+ 生成AIを実際に業務に浸透させるためのノウハウも学べる
+ キャリア観点からの情報も多く、「これからどうキャリアを積むか」を考える上で役立つ

# おわりに
X（旧Twitter）は、AIやデータサイエンス分野に関する生きた情報をリアルタイムで得られる、とても有益なプラットフォームです。インフルエンサー達の最新投稿を見逃さずキャッチアップしていくことで、日々進化する技術やツールに素早く対応できるようになります。

今回ご紹介したアカウントは、どれも専門性が高く、実務や学習で今すぐ役立ちそうな情報ばかりです。ぜひ全員フォローしておき、AI・データサイエンスの波に乗り遅れないようにしましょう。

最後までお読みいただき、ありがとうございました！
form_withで指定するscope: の意味

# 結論
フォームのパラメータをグループ化するときに使用されるスコープ名を指している
# 例
```
<%= form_with(url: login_path, scope: :session) do |f| %>
```
- フォームから送信されるパラメータが「session」というハッシュにネストされる
- `params[:session]`にアクセスできる
Merge Sort マージソート

We can use the following C program to merge 2 sorted sequence.


```
#include <stdio.h>

#define M 10
#define N 5

int main(){
  int a[] = {2,4,5,7,8,10,15,20,30,40},
      b[] = {6,11,25,33,35},
      c[M+N];

      int i = 0;
      int j = 0;
      int p = 0;

while(i<M && j<N){
  if(a[i]<=b[j]){
    c[p++] = a[i++];
  }
  if(a[i]>=b[j]){
    c[p++] = b[j++];
  }
}
while(i<M){
  c[p++] = a[i++];
}
while(j<N){
  c[p++] = b[j++];
}

for(i=0;i<M+N;i++){
  printf("%d ",c[i]);
}
printf("\n");

return 0;
}
```
[GSAP]ScrollTrigger 位置がズレる原因

## GSAPのScrollTriggerスタート位置がずれた原因
[GSAP](https://gsap.com/)を使って横スクロール(ハイブリッド・スクロール)を実現させたいが、トリガースタート位置がずれるので原因を追跡
結果としては、imgがGSAP発火後に読み込まれていたことが原因
```HTML
<img loading="lazy" src="image.jpg" alt="..." />
```
このようなコードの`loading="lazy"`を削除後に解決
mise を使用して PHP のバージョン管理を行う方法 備忘録

## はじめに

PHP のプロジェクトを管理する際、プロジェクトごとに異なる PHP バージョンが必要になる場合があります。そのような場面で便利なのが **mise** です。本記事では、mise を使用して PHP のバージョン管理を行う方法について私の備忘録になります

---

### mise とは？

**mise** は軽量なバージョン管理ツールで、プロジェクトごとに異なる PHP バージョンを簡単に切り替えることができます。他のバージョン管理ツールと比較して設定がシンプルで、初心者にも扱いやすいのが特徴です。

公式サイト: [https://github.com/jdx/mise](https://github.com/jdx/mise)

参考記事: [https://qiita.com/yuki777/items/8c71f4535e696a2434b3](https://qiita.com/yuki777/items/8c71f4535e696a2434b3)

---

### mise のインストール

mise を利用するためには、まずインストールが必要です。以下の手順でインストールを進めてください。

1. **依存ツールの確認**

   mise を利用するには、以下のツールが必要です。

   - brew
   - PHP 環境（インストール先のライブラリの要件に依存）

   必要に応じてインストールしてください。

2. **mise のインストールコマンド**

   mise をインストールするには、ターミナルで以下のコマンドを実行します。

   ```bash
   brew install mise
   ```

3. **パスの設定**

   通常、brew を利用したインストールでは PATH の設定が自動的に行われますが、エラーが発生する場合は以下を確認してください。

   ```bash
   echo $PATH
   ```

   必要に応じて PATH を再設定します。

4. **古い PHP バージョンの削除**

   brew でインストールされている古い PHP バージョンを削除しておくことを推奨します。

   ```bash
   brew remove php@8.2 php@8.1 php@8.0 php@7.4 php
   ```

---

### 必要な依存パッケージのインストール

mise と PHP の動作に必要な依存パッケージをインストールします。以下は `asdf-php` の README に基づく依存パッケージの例です。

```bash
# Install openssl@1.1 first to avoid errors
brew install rbenv/tap/openssl@1.1

# Install other packages
brew install autoconf automake bison freetype gd gettext icu4c krb5 libedit libiconv libjpeg libpng libxml2 libzip pkg-config re2c zlib

# Install conflicting packages
brew install openssl@3
```

---

### asdf-php プラグインのインストール

mise は `asdf-php` というコミュニティプラグインを使用して PHP をインストールします。以下の手順でプラグインをインストールしてください。

```bash
mise plugin install php https://github.com/asdf-community/asdf-php
```

---

### PHP のインストールとバージョン管理

mise を使用して PHP をインストールし、バージョンを管理する方法を説明します。

1. **PHP のインストール**

   好みの PHP バージョンをインストールするには、以下のコマンドを実行します。

   ```bash
   mise install php 8.2
   ```

   よく使われるバージョンとして、以下のバージョンを推奨します。

   - PHP 7.4
   - PHP 8.0
   - PHP 8.2

   特定のバージョンを指定しない場合、デフォルトの最新バージョンがインストールされます。

2. **インストール済みバージョンの確認**

   インストール済みの PHP バージョンを確認するには、次のコマンドを実行します。

   ```bash
   mise list
   ```

3. **バージョンの切り替え**

   プロジェクトごとに使用する PHP バージョンを切り替えるには、以下のコマンドを実行します。

   ```bash
   mise use php 8.1
   ```

   現在のプロジェクトディレクトリに `.mise-version` ファイルが作成され、バージョンが記録されます。

4. **グローバルバージョンの設定**

   グローバルで使用する PHP バージョンを設定するには、以下を使用します。

   ```bash
   mise global php 8.0
   ```

5. 不要になったバージョンを削除するには以下のコマンドを実行します。

   ```bash
   mise uninstall php 7.4
   ```

---

### まとめ

mise を使用することで、PHP のバージョン管理が簡単に行えるようになります。特にプロジェクトごとに異なるバージョンを使いたい場合や、手動での切り替えが煩雑な場合には非常に有用です。
ローカルのSupabaseでStripeのシークレットキーを自動で設定する

:::note warn
このやり方(だけ)だといろいろダメです。
うまくいってた方法に変えようと思ってましたが、その方法も最近死んでしまいました。(https://github.com/supabase/cli/issues/3385)
安定したら更新します。
:::

シードファイルでvaultにstripe_wrapper_api_key_idの名前で追加する。

```sql:supabase/seed.sql
SELECT vault.create_secret(
    '{ここにシークレットキー}', 
    '{stripe wrapperのname}_api_key_id'
);
```
    
gitでは管理しないのが定石(多分)
他のシードファイルと分けたいときはこの辺を参照する。
(デフォルトでseed.sqlが指定されているので既存のコンフィグみたらなんとなく追加できるはず)

https://supabase.com/docs/guides/local-development/seeding-your-database#splitting-up-your-seed-file

db resetの度に設定するのはやめよう。
国際化ドメインについての概要

# 国際化ドメイン名
※「国際化ドメイン」 = 「Internationalized Domain Name: IDN）」

## 概要
* IP アドレスを英数字の文字列にしたのが URL。その URL をさらに分かりやすくしたのが **国際ドメイン名**

* 例）『"123.456.789.012"』→『"https://nakada.com"』→『** https://なかだ.com **』
  * 英数字以外に **アラビア文字、漢字、日本語、ハングル語などを利用できる** のが特徴 

## メリット
引用：https://knowledge.cpi.ad.jp/basic-knowledge/japanesedomain/

* 覚えやすく認識してもらいやすい
  * 結果としてユーザーの流入につながりやすい
* 英数字ドメインよりも取得しやすい
  * 例）「twitter.com」は絶対取得できないけれど「ツイッタードットコム.com」なら取得できるかもしれない
    * 日本語が日本人にしか伝わらないから取得されていない可能性が高い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/ec7b8852-7d66-6186-d22d-9671ef3fbe7c.png)

---
# Punycode（ピュニコード）について
* Punycode ... IDN を使えるようにする符号化方式
  * 「覚えにくい数字の IP アドレスを分かりやすい文字列の URL に変換」する `DNS` のように「URL で日本語や漢字を使えるように変換」する `IDN` がある
    * この **"日本語や漢字を使えるように変換" するための仕組み** が何なのかが重要 → **Punycode 変換** 
* 機械 (サーバー) 側は基本英数字で扱う URL を「"アウトプット会.com"にしたい」と言われても何のことか分かる訳がない
  * 英数字の本来の URL と同様に扱えるようにする → 英数字表記にするために必要
* ブラウザでは "アウトプット会.com" みたく日本語表記がされるが、内部的には Punycode に変換した上で扱っている
* Punycode は必ず `xn--` から始まる

:::note info
（[Punycode変換・逆変換](https://rakko.tools/tools/5/) の一例）
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/81b94d4a-2fe7-05ed-2bd4-6939b13ca01c.png)
:::

---
### 参考資料
https://www.nic.ad.jp/ja/dom/idn.html

https://knowledge.cpi.ad.jp/basic-knowledge/japanesedomain/

https://jprs.jp/glossary/index.php?ID=0051

https://www.cman.jp/network/term/punycode/
"ハードデリート"、"ソフトデリート"について調査

:::note alert
的外れな内容があるかもしれませんがご了承ください
:::

# "ハードデリート"、"ソフトデリート"について
:::note info
`ハードデリート`（別名：「 物理削除（フィジカルデリート）」）
* DB からレコードを削除する処理を指す (一般的な方)
* SQL での `DELETE FROM` 、Rails における `destroy` とかはコッチ
* データそのものを削除するため、「そのデータを元に戻す」にはバックアップなど過去データが必要となる
  * データそのものの存在が削除される
:::

:::note info
`ソフトデリート`（別名：「論理削除」）
* テーブルに論理型のカラム（フィールド）を設けておき、そのカラムが「 True なのか False なのか」で**システム上で"削除"されたレコード**として判別する → **削除フラグ**
  * システム上で「"削除"された扱い」なだけで、データそのものは削除されていない
:::

## ソフトデリートを Twitter で考える
### Twitter などにおける「退会処理後 30 日間以内であればすぐにでもユーザーアカウント復旧できるよ」という仕組み
  * これはまさに「Twitter 上では"削除"扱いである、しかし DB 上のレコードは `DELETE` していない」から復旧できる → 「論理削除」
    * User テーブルの削除フラグが `True` になっているだけ
    * おそらく 30 日後にハードデリートされる

### [多分違う] 引用した投稿が削除された場合に「このツイートは表示できません」と表示される仕組み
  * 引用先のツイートが物理削除されたのであれば、そのレコード自体の存在が認知されないはずなので「そのツイートが今は無い」と認知しているのは論理削除によるもの？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/a6e51555-8273-b6e2-749b-94a7527b057a.png)


## ソフトデリートのメリット・デメリット
### メリット
* データそのものは削除しない安心感
* 開示請求など過去データを調査する場合にすぐに提示できる
### デメリット
* 削除フラグで削除管理するのはシステム上で削除フラグを意識したロジックが必要
  * 削除フラグが立っていない他データと混合されるため
* データそのものは削除しないためストレージを圧迫する
  * それこそ Twitter みたいな大企業ぐらいリソースにお金かけられれば良いが

---
### 参考資料
https://zenn.dev/hyung8/articles/532c505e673750

https://e-words.jp/w/%E8%AB%96%E7%90%86%E5%89%8A%E9%99%A4.html

https://e-words.jp/w/%E7%89%A9%E7%90%86%E5%89%8A%E9%99%A4.html
【Rails】Rails x AWS S3 へ画像アップロードする手段を考える

　自分が導入する予定もあり関連ジェムについて調査の余地があると考え Rails x AWS S3 での現時点での手段を調べた


# "aws-sdk-s3" v.s. "fog-aws"
* 現状この 2 強
* 登場した時期が fog-aws の方が約 2 年先にリリースされている

## aws-sdk-s3
* AWS 公式の gem
  * [aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby) という gem に含まれているらしい。別個でもインストール可能
* fog-aws と比較してもダウンロード数で約 5 倍の差をつけている
* スター数など他数値においても圧倒している
* ただ fog-aws と比較すると技術記事がなぜか少ない

## fog-aws
* AWS 公式ではない
  * 他 gem に fog-google という Google Cloud Platform (Google Cloud Storage) 版の gem も提供しておりクラウドを扱う事に強みがある？
* carrierwave が提示している Amazon S3 を使う場合の手順は「[carrierwave x fog-aws](https://github.com/carrierwaveuploader/carrierwave?tab=readme-ov-file#using-amazon-s3) 」で説明されている
  * この 2 つの組み合わせの相性が良い？
* aws-sdk-s3 より技術記事が多い
  * 2 年先にリリースされたから？

## 他）[carrierwave-aws](https://github.com/carrierwaveuploader/carrierwave-aws)
* S3 利用特化の carrierwave
* 近年はアップデートされていない

（2024年10月26日じて）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/963df8c4-ea6a-07d7-1e11-1cd2c9c8e2a3.png)

---
### 所感
* この 2 点の gem の違いが全く分からない
  * そのせいか両方のジェムをインストールして実装している方もいらっしゃった
  * AmazonS3 の理解が乏しいからかどこが差異ポイントなのか理解できていない
* carrierwave を個人的に使用したいので fog-aws を採用する予定
    * carrierwave の公式手順にあったため安全性と再現性があると判断

---
### 参考資料
* https://github.com/orgs/aws/repositories?q=+lang%3Aruby&type=all
* https://github.com/aws/aws-sdk-ruby
* https://github.com/fog/fog-aws
* https://github.com/carrierwaveuploader/carrierwave-aws
Error: Accessing from Xray wrapper is not supported.

## エラー文
```
Error: Accessing from Xray wrapper is not supported.
```
これは私がnextjsで個人的に開発しているときにブラウザのコンソールに現れたエラーです。
使用していたブラウザはFloorp。
エラー文の詳細をよく見るとmoz-extension://とあるので原因はおそらく拡張機能。
## 原因
原因はSuperDarkModeでした。ダークモードにする拡張機能。
https://addons.mozilla.org/en-US/firefox/addon/super_dark_mode/
## クロームでもあった
### エラー文
```
Warning: validateDOMNesting(...): <html> cannot appear as a child of <#fragment>.
```
### 原因
HEICからJPEGに変換する拡張機能
https://heic-to-jpg.pro/

## 最後に
正直、このエラーが出ていても開発には問題ないらしい。私は気になったので拡張機能を消しました。
わけのわからないエラーが出ても詳細をみると、moz-extension://やcontent_script/inject.js、setInterval handlerなど、キーワードからなんとなく推測ができるかも
【AWS】AWS S3 (Amazon S3) についての概要メモ

# 概要
* **イレブンナイン**を謳っているのが特徴 (データ耐久性が 99.999999999% で「9 が 11 個並ぶよ」という意味)
  * それぐらいデータを消失しづらいのが売り
* 課金はデータの保存量に応じて料金が決定する
  * 5 GB までなら無料枠として提供されている（2024/10/24時点）
* "Amazon s3" は Amazon のストレージサービスの総称の意味合いもあり、[公式資料](https://aws.amazon.com/jp/s3/storage-classes/?nc=sn&loc=3)では一般的に認知されている画像を保存する際に利用する S3 は"Amazon s3 標準"という呼び方が正式名称
* 他にも保存方針でサービスが複数存在している
  * "Amazon S3 Glacier Deep Archive" は S3 の一種で名前の通りアーカイブのように長期保存に向いている

# S3 の仕組み・構成編
以下のようなデータの仕組み付与情報を載せることが基本となっている

:::note info
* `バケット` … オブジェクトの格納場所（パ ではなく バ）
  * S3 に保存したファイルにアクセスする際にバケット名がそのまま URL に含まれるため「オブジェクトの格納場所」という表現がされている
  * rails のルートに付与される prefix みたく分かりやすくバケットを階層構造的に管理可能
:::

```:sampleバケットにデータ保存
sample.jpg
photos/2006/January/sample.jpg　// NG
photos/2006/February/sample2.jpg
photos/2006/February/sample3.jpg
photos/2006/February/sample4.jpg
```

:::note info
* `キー` ... オブジェクトに割り当てる名前（ファイル名）
  * バケット内で一意である必要がある
    * この点は一般的な「同じフォルダー内で同じ名前のファイルはダメだが、フォルダーが異なれば同じ名前のファイルを作っても良い」とは異なる
:::
:::note info
* `メタデータ`
  * アップロードしたオブジェクトの属性を記載したデータ
  * 日付データなどが付与されている
:::

---
### 参考資料

https://aws.amazon.com/jp/s3/

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-prefixes.html

https://repost.aws/knowledge-center/s3-prefix-nested-folders-difference
Zotero 7用のZotfileの代わり

## 背景

Zoteroを7にアップデートしたらZotfileが機能しなくなった．ファイル名の変更とフォルダ分けに活躍していたので困る．

## 代替案

- デフォルト機能
    - ファイル名の変更は本体に取り入れられた．Edit→General→File RenamingのCustomize Filename Format
- zotmoov
    - 検索するとzotfileの代わりとして一番最初にでてくる．
    - 基本的にこれでOKのはずだが，フォルダ名で著者のファミリーネームを意味するワイルドカード{%a}の機能が以下のように変更されている．私にはこれが致命的だったので利用を断念
        - zotfile: 著者の人数を設定で変更可能
        - zotmoov: 第一著者のみ
- zotero-Attenger
    - フォルダ名に{{authors}}を使うと，「すべての著者のファミリーネームをカンマ区切りで」になり，これまでの使用感に近かったので採用．

ニッチなケースだと思われるが，一応備忘録的に．
【AWS】削除できなかったインスタンスプロファイルを削除する方法

# 概要
AWS Cloudformationで作成したインスタンスプロファイルがうまく削除できずに残ってしまった場合、どのように削除すればいいのか？という疑問にぶち当たったので、こちらで紹介します。

# 経緯
EC2テンプレートやインスタンスプロファイルを含むリソースをAWS Cloudformationで作成しました。
インスタンスプロファイルは、IAMロールをEC2インスタンスに関連付けるために使用されるものです。インスタンスプロファイルそのものについては以下の記事で図解がありわかりやすいです。

https://qiita.com/sakai00kou/items/a4b96dcfa6bb3e656cd9

しかし、EC2が不要となり削除することに。

いざCloudformationからスタックごと削除しようとすると、IAMユーザー権限の問題でインスタンスプロファイルが削除できませんでした。その時は一旦SKIPして、後でインスタンスプロファイルが紐づいたIAMロールを削除してすれば綺麗に消えると思っていたので、そのままSKIPしました。

しかし、該当のスタックからそのIAMロールを削除しようとしたら、以下のエラーになりました。

> Resource handler returned message: "Cannot delete entity, must remove roles from instance profile first.

これに関しては、該当のIAMロールを管理コンソールから確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/246a791e-493b-368c-0caa-1d17f8101cb6.png)

↑のように、「インスタンスプロファイルのARN」と概要に書いてありますね。
ここを見れば「このIAMロールがインスタンスプロファイルに紐づいているんだな」ということがわかります。
※最初見つからずに「どこに書いてあるの？」と思いましたｗ

「編集」を押せばインスタンスプロファイルとの切り離しができるのかな？と思いましたが、それはできず。

このロール自体を手動で削除したらIAMロールの削除自体は実行できました。

これでインスタンスプロファイルも一緒に消えたかな...
と思っていたら、まだインスタンスプロファイルは残っているんです。

管理コンソールから確認する場合は、起動テンプレートの「高度な詳細」から選択できるインスタンスプロファイルがプルダウンで表示されるのでそこから残っているかどうか確認できます（後述docのCLIコマンドでも確認可能）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/fe0c599d-74da-c3ba-a9fa-6361a28107d9.png)

使わないのに残っているのは気持ち悪いですよね。
しかし...管理コンソールからはどこを探してもインスタンスプロファイルを削除する方法はありませんでした。

# 削除する方法
ということで、公式ドキュメントを見るとCLIコマンドで削除ができるとのことです。

> ロールと同じ名前でない限り、コンソールを使用してインスタンスプロファイルを削除することはできません。ロールを削除する過程でインスタンスプロファイルを削除する必要があります。ロールを同時に削除することなくインスタンスプロファイルを削除するには、AWS CLI または AWS API を使用する必要があります。詳細については、次のセクションを参照してください。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_manage_delete.html

以下のCLIコマンドを使います。
後ろの`instance-profile-name`に、削除したいインスタンスプロファイルの名前を指定してください。

```
aws iam delete-instance-profile --instance-profile-name instance-profile-name
```

ようやく削除できた...。
インスタンスプロファイル、管理コンソールでいじれるようにしてくれないかなぁ...
JS雑記1 - スコープについての理解

スコープ問題において `var` でも解決できるが非推奨。また、他に基本に忠実で最適な解決策はある

---
# サンプルコード
以下のようなコードで考える

- このコードにおいて ReferenceError が出てしまうのは変数 a がブロックスコープに属する関係で参照できないのが原因と分かる
```javascript
function fn() {
  if(true) {
    let a = 'fn called';
  }
  return a; //=> ReferenceError: a is not defined
}

const result = fn();
console.log(result);
```
- "ブロックスコープ"が原因であるならば var の特性である「ブロックスコープを無視する」で解決可能
  - ただ var 自体が非推奨であるのと関数スコープ内のスコープ汚染の原因にもなるので好ましくない。

:::note info
【メモ】
- 関数宣言もブロックスコープに属さない特性を持つ（そもそもグローバルスコープだから）
    - 関数式は違う
:::

# 【非推奨】`var`で解決する
```javascript
function fn() {
  if(true) {
      var a = 'fn called';
  }
  return a;
}

const result = fn();
console.log(result);
```

# 【解決策】参照元と参照先のスコープを合わせる
- 基本的な話『**参照元と参照先のスコープを合わせれば良い**』（参照元 = 宣言元）
  - JS なら undefined が自動で入る
  - Ruby だと nil を入れなければならないかもしれない？

```javascript
function fn() {
  let a;
  if(true) {
      a = 'fn called';
  }
  return a;
}

const result = fn();
console.log(result);
```
AWSで現在業務で使用しているネットワークについてのまとめ

## 概要

* 現在の業務で実施しているAWSのセキュリティに関係する部分について備忘の意味も含めてまとめていきます
    * あくまで備忘的なまとめです


## Cidrの切り方のコツ
* VPCを作成するにあたり用途に応じて切り方の例を記載します。状況に合わせて検討すべきですがひとまず一例としてみていただければと
* AZを２つ使う方式を基本としています
* サブネットを切る際には以下の観点で切ります
    * 使用する予定のもの(EC2インスタンス,ECS,ALBやエンドポイント)の数を考える特にALBは8個必要になるためあまり潤沢にIPアドレスが使えないときには注意
* TrangitGatewayを使用する際にはTGW用のサブネットを別に用意しておくと良さそうです

* サブネットの種類

|サブネット|ルーティング|外への通信|外からの通信|
|--|--|--|--|
|publicsubnet|IGW|可|可（EIP/Public IPが必要）|
|protectedsubnet|NAT|可	|踏み台またはセッションマネージャ|
|privatesubnet|-|不可|踏み台またはセッションマネージャ|

* 以下の観点でサブネットの例をまとめます
    * 192.168.0.0/24のVPCを例にします
    * IPアドレスは全体で256個あります。
    * 方針としてサブネットはAZを2つ使用
    * 各サブネットのIPアドレス数は32個(AWS予約分があるため少し減ります)

* サブネットの割り振り例

|サブネットの用途|パブリック接続あり|パブリック接続なし|
|--|--|--|
|publicsubnet|192.168.0.0/27,192.168.0.32/27|-|
|protectedsubnet|192.168.0.64/27,192.168.0.96/27|192.168.0.64/27,192.168.0.96/27|
|privatesubnet|192.168.0.128/27,192.168.0.160/27|192.168.0.128/27,192.168.0.160/27|
|TGW(使うなら)|192.168.0.192/28,192.168.0.208/28|192.168.0.192/28,192.168.0.208/28|
|予備|32個|96個|
【Ruby】雑記2 - 配列の要素の操作について

# (1) 配列の乗算
- 配列の四則演算は想像する挙動よりもかなり大胆（商は無い）
  - 特に配列の乗算は内部的にループが生じている

```ruby:
p [400] * 4   # => [400, 400, 400, 400]
```

https://qiita.com/takano-h/items/89afdc6f9117cba843da

# (2) `pop` と `slice!` 
- `pop` と `slice!` は「ある配列の要素を取り出す」点では似ているが使い勝手がかなり異なる

## `pop`
1. 末尾から取り出す = FIFO
1. 引数には「取り出す個数」を指定するため直感的で分かりやすい（FIFOな点は注意）
1. 返り値が "配列" で返される
    1. 引数に「取り出す個数を指定した場合」のみ、返り値を "配列" で返す
⇒たとえ取り出す要素が１つでも配列に格納して返すので、「取り出す」というよりかは「ある配列から分離する」というイメージが適切
4. "!" はないが破壊的

## `slice!`
1. 引数には「取り出したい要素のインデックス」を指定するため `pop` よりか「どこの何が取り出されるか」が分かりにくい
⇒ただこの点において、引数で「どこの何が取り出されるか」を指定可能なので `pop` のような FIFO 縛りなどは無く任意に指定できる点は強み
2. 返り値は要素をそのまま返す
⇒`pop` とは違い "配列" として返さないので分かりやすい。コッチこそ「取り出す」イメージ
3. 本来は `slice` で非破壊的なメソッドなので `!` が必要


```ruby:
array = [1, "slice!", 3, 4, 5, 6, 7, 8, 9, "pop"]
p array.pop(1) # => ["pop"]
p array # => [1, "slice!", 3, 4, 5, 6, 7, 8, 9]

p array.slice(1) # => "slice!"
p array # => [1, "slice!", 3, 4, 5, 6, 7, 8, 9]

p array.slice!(1) # => "slice!"
p array # => [1, 3, 4, 5, 6, 7, 8, 9]
```

# (3) `push` と `concat` 
- 「配列の要素を追加する」目的において `push` が好ましくない場合がある
  - `push`…「オブジェクトなら引数に渡せる」反面、自由度が高く「配列もそのまま引数に渡せてしまう」ため、`push` によって入れ子になってしまう。
  - `concat`...「配列しか引数に渡せない」ため、`push` のように追加先が入れ子になることはない

* `concat` はドキュメントにある通り"連結"するため  "配列同士" であればコチラを使う方が入れ子構造になるなどの混乱を招かないし、わざわざ要素を取り出して追加するような手間もかからない

```ruby
ary = [10, 20]
ary2 = ary.dup

ary.push([30, 40])
p ary                        # => [10, 20, [30, 40]]
ary.push(50, 60)
p ary                        # => [10, 20, [30, 40], 50, 60]

ary2.concat([30, 40])
p ary2                       # => [10, 20, 30, 40]
ary2.concat(50, 60)
p ary2                       # => エラー
```
 なぜか push の方のドキュメントには"破壊的"とは書かれていない

https://docs.ruby-lang.org/ja/latest/method/Array/i/concat.html

https://docs.ruby-lang.org/ja/latest/method/Array/i/append.html
格好良くスマートなメニュー画面の作り方

PowerAppsで恰好良くてスマートなメニュー画面にあこがれた事はありませんか？
今回は格好良くてスマート（自分調べ）なメニュー画面を作ってみます。

画面構成はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/51ea32d9-064d-0977-a42a-b575ea0913d6.png)

適当にこんな感じで作り画面1にまずは空の水平ギャラリーを配置します。
水平ギャラリーのItemプロパティは適当に
```
Sequence(3)
```
と置いてみます。

メニューボタンに使いたい画像をメディアでアップロードして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/55605826-b5dc-721d-10fe-dbcbe808c265.png)

水平ギャラリーに配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/35d21236-0f98-10ab-089e-3c8d1d7dcd6b.png)

イメージプロパティはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/df944f15-822d-f3fe-fee4-d36920bcbd39.png)

`ThisItem.Value`によって画像が変わるようにするため

```
Switch(ThisItem.Value,
    1,野球アイコン2,
    2,野球のボールアイコン1,
    3,ホームベースのアイコン素材
)
```
とするとあら不思議
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/3b4b152c-d72b-5c57-8ea7-f25407c8a676.png)
ちょっといい感じになってきました。

あとはいい感じに背景など作ると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/ea7303ec-6581-0dfd-f4aa-c1fd38d68f52.png)
こんな感じでいいメニュー画面ができあがります。

さらに各ボタンの'OnSelectプロパティ'にも先ほどの
Switch関数を使ってNaviっておけばいい感じになります。

ぜひ皆様もやってみてください。
Rails:Stimulusの初期ファイル構成について

## 記事を書いた理由

Stimulus-Sortableを利用してドラックアンドドロップを実装したのですが、その時Stimulusのファイル構成がどんな感じになっているかわからなかったので、その備忘録です

https://qiita.com/taji-taku/items/22cfb0dc300a4ad8bc7a

## 環境
- Rails 8
- Ruby 3.3.6

## stimulusとは何か 

Javascriptのフレームワークです

CSSにおけるBootstrap、RubyにおけるRuby on Railsと同じです

### 何ができるのか

HTML要素にデータ属性を追加して、JavaScriptのコントローラーと関連づけ、HTML要素を良い感じに操作できます
それを簡単に行えちゃうフレームワークです

「 Turbo + Stimulus」の2つを組み合わせてHotwireという技術で使用されています（Stradaもあるので本当は3つ）

https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/abstract


## 説明するファイルについて

Rails7からディフォルトで`stimulus-rails`gemが入りました
ここでは`app/javascript`配下にある3つのファイルについてアウトプットします

### app/javascript/application.js

- javascriptのエントリーポイント、アプリが読み込まれて最初に動き始める場所
- application.html.erbの`javascript_include_tag`で読み込まれる

```app/javascript/application.js
// Entry point for the build script in your package.json
import "@hotwired/turbo-rails";
import "./controllers";
```

Turboと`app/javascript/controller/index.js`のファイルをインポートしています
`app/javascript/controller/index.js`に記述されたStimulusコントローラはここで読み込まれるようになります

### app/javascript/application.js

- Stimulusアプリケーションの初期化を担当するファイル

```app/javascript/application.js
import { Application } from "@hotwired/stimulus";

const application = Application.start();
export { application };
```

`Application.start()`を呼び出して、Stimulusアプリケーションを開始、これにより、StimulusがDOM内のコントローラを検出し、管理できるようになります
`export { application }`で`application`を他のファイルでインポートできるようにします

### app/javascript/controllers/index.js

- Stimulusコントローラを一元的に登録する場所
- このファイルは、各コントローラをインポートし、Stimulusアプリケーションに登録します。これにより、コントローラがDOM内で適切に動作するようになる

```app/javascript/controllers/index.js
// This file is auto-generated by ./bin/rails stimulus:manifest:update
// Run that command whenever you add a new controller or create them with
// ./bin/rails generate stimulus controllerName

import { application } from "./application"

import HelloController from "./hello_controller"
application.register("hello", HelloController)
```

`./bin/rails generate stimulus controllerName`コマンドでコントローラを作成するタイミングで、自動生成されるファイルです
基本的に追加したコントローラは、`index.js`に自動で追加されます

### 補足：app/javascript/controllers/hello_controller.js

ディフォルトだと`hello_controller.js`というファイルがあります
ただ`Hello World!`を返すだけのコントローラです

基本的には削除してしまった問題ありませんが、手動でコントローラを追加する場合はこれを模倣する感じです

```app/javascript/controllers/hello_controller.js
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  connect() {
    this.element.textContent = "Hello World!"
  }
}
```

## コントローラを追加するとき

基本的には`./bin/rails generate stimulus controllerName`コマンドで任意のコントローラ名でファイルを作成します

その後、そのファイル内で使用したいコントローラを`import`して、`export`してあげる

自動で追記された`index.js`が読み込む

という流れでコントローラを追加します

## 感想

- JSの知見が少なく、ファイル構成をパッと見ただけではなかなか理解できませんでした…

## 参考

https://github.com/hotwired/stimulus-rails

https://www.stimulus-components.com/docs/stimulus-sortable
Ollama で GGUF を直接実行できるようになったらしい

# やりたいこと
OSS の LLM をローカルで実行できる Ollama で以前はちょっとした作業が必要だった GGUF モデルを直接実行できるようになったようなので試してみます。

https://huggingface.co/docs/hub/en/ollama

## GGUF とは？
C 言語で用いられる機械学習用のライブラリである「GGML」で使われるバイナリ形式のファイル。モデルの重みやモデルのメタ情報なども保存でき、1ファイルだけで完結できるのがメリット。
llama.cpp でも使われていて、Ollama でも利用可能になっている。

## 実行してみる
以前、日本語の OSS モデルである ELYZA を Ollama で使ったので、それを今回も使ってみます。

その記事はこちら。Ollama のセットアップなどもこの記事を参考。

https://qiita.com/coitate/items/d9035acd3cfcdae96e8b#elyza

ELYZA の HaggingFace でのリポジトリはこちら。

https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF/tree/main

Ollama で実行してみる。

```sh
docker exec -it ollama ollama run huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF        
```

モデルのダウンロードが始まり、完了すると入力待ちになる！ (時間はけっこうかかります)

```sh
>>> Send a message (/? for help)
```

ひとまずあいさつしてみる。

```sh
>>> こんにちは
こんにちは！お話ししましょうか？
```

非常に簡単ですね！

OpenWebUI でも利用可能！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/20011d1c-fc4a-e871-9f50-a92f424259d4.png)

# ということで
Ollama で GGUF 形式のモデルを簡単に利用できるようになりました。以前まではひと手間必要だったのが地味にめんどくさかったのですが、非常に楽になりました。
セキュリティやデータプライバシーの関係で、LLM をセルフホストしたい場合などは助かりそうですね！


以上です。
【Ruby】雑記1 - 制御構文の失敗

# `times` の失敗
- `times`メソッドは「`times`メソッドを呼んだIntegerのオブジェクトの数値から 0 のカウントアップを始める」
 - 「1 のカウントアップを始める」には不適切
    - `upto`や`step`であれば"開始値"を指定できる

```ruby:
########################################################
## ループの始めを 0 ではなく 1 にしたいと考えるとする ##
########################################################
number = 5
loop_num = number + 1 #これで開始値が 0 → 1 にしたつもりだが

p "loop_num : #{loop_num}"

loop_num = number + 1
#実際ループが回されるのは 0..6 の6回ループになってしまう
loop_num.times do |n|
    p "n : #{n}"
end
```

```ruby:
"loop_num : 6"
"n : 0"
"n : 1"
"n : 2"
"n : 3"
"n : 4"
"n : 5"
```

***
# `upto` , `downto` の仕様
- ループ際に break でループを抜けると step 値（ループのインデックス値）は増減しない
  - 言い換えれば「end に未到達では増減しない」

```ruby:
  0.upto(3) do |s|
    3.downto(0) do |e|
      p "-----------------"
      p s
      p e
      break
    end
  end
```

```ruby:
"-----------------"
0
3
"-----------------"
1
3
"-----------------"
2
3
"-----------------"
3
3
```
AWSで現在業務で使用しているセキュリティ対策についてのまとめ

## 概要
* 現在の業務で実施しているAWSのセキュリティに関係する部分について備忘の意味も含めてまとめていきます
    * あくまで備忘的なまとめです


## SecurityHubについて
* AWS環境でのセキュリティ情報を一元管理できる。サービス対象は以下のサービスなどがある詳細は[こちら](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-internal-providers.html)
    * Amazon GuardDuty
    * Amazon Inspector
    * Amazon Macie
    * AWS Firewall Manager
    * IAM Access Analyzer
    * AWS Config
* AWS Trusted Advisorと連携し運用の評価を行うことができます。またTrusted Advisor自体の警告もSecurityHubから確認することができます

### SecurityHubで使用しているセキュリティ基準
* 代表的なセキュリティ基準は以下のものがあります(重複しているものがあります)
    * AWS Foundational Security Best Practices v1.0.0 (FSBP) 標準
        * S3 バケットのパブリックアクセスが制限されているか、VPCフローログが有効かされているか？などをチェック
    * CIS AWS Foundations Benchmark
        * IAM ポリシーが適切に設定されているか、多要素認証（MFA）が有効化されているかなどの基本的な要素のチェック
        * 詳細は[こちら](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/cis-aws-foundations-benchmark.html)
    * NIST SP 800-53 Rev. 5
        * ロードバランサーに関連付けられた Auto Scaling グループは ELB ヘルスチェックを使用する必要があるなどをチェック
        * 詳細は[こちら](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/nist-standard.html)
    * Security Hub の PCI DSS v3.2.1
        * クレジットカードおよびデビットカードの情報を安全に処理するためのルール
        * 詳細は[こちら](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/pci-standard.html)
    * AWS リソースタグ付け標準
### どういった時に使用するか？
* ControlTowerで複数のAWSアカウントを管理する際に管理部門で管理したい場合また各アカウントでも注意をしてほしいときに利用する。
* 合わせてOrganizationのSCPで制約を掛けることも有効
* SecurityHubを導入するときには以下のどちらを行って統制をかけるか？を検討をする必要がある
    1. ガイドラインを制定し準拠することをルール
    1. ガイドラインと最低限やってはいけないことを定めたガードレールを合わせる
* コンプライアンス、柔軟性、コストの観点で比較します
#### コンプライアンスの観点での比較
* ガイドラインのみの場合
    * 管理対象のアカウントの利用者が共通の認識を持っている場合には適用できる
    * 人数が多い場合や利用者間で知識の差が顕著にある場合など認識にずれが発生しそうな場合は不向き
* ガードレールと合わせる場合
    * システムとして制約をかけるため知識の差などがあってもルールから外れた場合は気づくことができる
#### 柔軟性の観点での比較
* ガイドラインのみの場合
    * システムとしての制限がないため柔軟な対応が可能となる
* ガードレールと合わせる場合
    * システムとして制約をかけてしまうため柔軟性は損なわれる
#### コストの観点での比較
* ガイドラインのみの場合
    * ほかの観点と制約はかからないが、誤った設定で余分なコストがかかるリスクがある
* ガードレールと合わせる場合
    * 余分にコストがかかるようなケースは事前に制限できる

### 通知について
* 通知にはメールやslackなどを使い通知を行うことになるが、通知を有効にする前に事前に対応できるエラーは対応してから通知をonにしている。
* 特に最初から有効化していない場合は通知が埋もれてしまうこと避けるために事前に対応している。

### 業務で使用時の考え
* 利用者の知識に応じてどこまで統制を取るか？を事前に決めてガイドラインのみで済ませるかガードレールをどこまで厳密にするかを検討することになる。(業務ではガードレールもある程度指定する方針)
* あくまでこれは一例なので使う際の参考程度になればと思います
【bat・PowerShell】起点とするフォルダの配下フォルダのみをtree構造で出力する

# はじめに

起点としたいフォルダ配下のフォルダ構成をtree構造で表現したかったのですが、
ググってもうまく答えにたどり着けなかったので記録として残します。

# 結論

treeコマンドに起点としたいフォルダのパスを指定します。
treeコマンドはPowerShell,bat双方で使用可能です。
~~~
tree　起点とするフォルダのパス
~~~

# 今回の例

今回の例として、C直下に「おためしフォルダ」を作成し、
その配下にいくつかのフォルダを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/f12bfded-cf68-8bf7-5aef-b9c37565bd64.png)


## 実行結果

無事に「おためしフォルダ」を起点としたtree構造が出力されました。
画像を載せていないですが、PowerShellでも同じコマンドで同様の出力が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/7694b04e-15a4-2c38-f3ff-757b372d8bf3.png)

~~~
C:\おためしフォルダ>tree C:\おためしフォルダ
フォルダー パスの一覧:  ボリューム Windows
ボリューム シリアル番号は 7E1C-134A です
C:\おためしフォルダ
├─chinpan
├─gorira
└─saru

~~~

# 備考

パスとして共有フォルダを指定する場合、エイリアスでも実行可能でした。
（指定しない場合どえらい量が出力されて使い物にならないので注意）

# おわりに

今回の私と同じようにtree構造にしたいけどやり方がわからなかった誰かに届けば幸いです。
FFmpegで動画に透かしを入れる実践ガイド

動画編集やコンテンツ制作において、透かし（ウォーターマーク）の追加は著作権保護や動画のブランディングに重要な要素です。この記事では、オープンソースの動画処理ツールFFmpegを使用して、動画に透かしを追加する方法を段階的に解説します。

## 前提条件
- FFmpegがインストールされていること
- 動画ファイルと透かしとして使用する画像ファイルが用意されていること

## 基本的な使い方

### 1. 透かしを左上に配置する
最もシンプルな透かしの追加方法から始めましょう。以下のコマンドで、動画の左上に透かしを配置できます：

```bash
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4
```

このコマンドの各パラメータの意味は以下の通りです：
- `-i input.mp4`: 元の動画ファイル
- `-i watermark.png`: 透かしとして使用する画像ファイル
- `overlay=10:10`: 透かしの位置を指定（左上から x:y のピクセル数）

### 2. 透かしの配置位置をカスタマイズする
FFmpegでは、動的な値を使用して透かしの位置を指定できます。以下に主な配置パターンを示します：

#### 右上に配置
```bash
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:10" output.mp4
```

ここでの変数の意味：
- `W`: 動画の幅（main_w）
- `w`: 透かし画像の幅（overlay_w）
- `10`: 右端と上端からのマージン

#### その他の一般的な配置位置
```bash
# 中央配置
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=(W-w)/2:(H-h)/2" output.mp4

# 左下配置
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:H-h-10" output.mp4

# 右下配置
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4
```

## 応用テクニック

### 1. 透かしのサイズ調整
透かしが大きすぎる場合は、`scale2ref`フィルターを使用してサイズを調整できます：

```bash
ffmpeg -i input.mp4 -i watermark.png -filter_complex "[1][0]scale2ref=oh*mdar:ih*0.2[logo][video];[video][logo]overlay=W-w-10:10" output.mp4
```

このコマンドでは：
- `oh*mdar`: 高さに合わせてアスペクト比を維持
- `ih*0.2`: 元動画の高さの20%にサイズを調整

### 2. 高速処理のためのGPU活用
NVIDIAのGPUを使用している場合、エンコーディングを高速化できます：

```bash
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:10" -c:v h264_nvenc output.mp4
```

### 3. FPSの固定
出力動画のフレームレートを指定する場合：

```bash
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:10" -r 30 output.mp4
```

## トラブルシューティング

### よくあるエラーと解決方法

1. **透かし画像のフォーマットエラー**
   - PNGやJPEG形式の透かし画像を使用していることを確認
   - アルファチャンネル（透明度）が必要な場合はPNG形式を推奨

2. **メモリ不足エラー**
   - 透かし画像のサイズを適切に調整
   - `-threads`オプションでスレッド数を制限

3. **出力品質のｔ**
   - `-crf`値を調整して品質とファイルサイズのバランスを最適化
   ```bash
   ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:10" -crf 23 output.mp4
   ```

## まとめ
FFmpegを使用した動画への透かし追加は、基本的なコマンドから始めて、必要に応じて高度なカスタマイズが可能です。この記事で紹介した内容を組み合わせることで、以下のような透かし処理が実現できます：

- 任意の位置への透かし配置
- サイズ調整による最適化
- GPUを活用した高速処理
- フレームレートの制御

実際の使用時は、動画の用途や要件に応じて最適なパラメータを選択してください。

## 参考文献
- [FFmpeg公式ドキュメント - Overlay Filter](https://ffmpeg.org/ffmpeg-filters.html#overlay-1)
- [FFmpeg Wiki - Watermark Guide](https://trac.ffmpeg.org/wiki/Watermark)
simpleaudioのインストールができないときの解決メモ[Windows][Python][simpleaudio]

# pythonのスクリプト実行時のエラー
```
ModuleNotFoundError: No module named 'simpleaudio'
```
で、ここが罠で、simpleaudioをpipでインストールしたらいけるんでしょーと思って実行してもビルドエラーが起こる！！！
```
$ pip install simpleaudio
ERROR: Failed building wheel for simpleaudio
```



# やったこと
```
$ pip install wheel
$ python -m pip install --upgrade pip setuptools wheel
$ pip install simpleaudio
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (simpleaudio)
```
上記を実行したが、解決せず。エラーが出てしまいました。

結局、Microsoft Visual C++ Build Toolsのインストールが不十分だったのが原因だったようです。

「C++ Build Tools」と「Windows 10 SDK」をインストールする必要があります。

まずは以下のリンクからMicrosoft Visual C++ Build Toolsのダウンロードとインストールをします。
https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958732/3182c2f0-043a-951c-e0c3-5a9035fc9f77.png)

最初に出てくるポップアップで「続行」をクリック

以下のような画面になった人は「変更」をクリック(はじめてインストールした人はでないかも)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958732/9d6aa466-f34d-f4cd-5301-df112abf6237.png)

とりあえず以下の画像の赤枠に☑をいれればOK
※不必要なものが入っているなと思った人は消してください。自分はわかりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958732/32e645b1-29f3-a978-19e5-cdd8c86c5154.png)

右下の「変更」をクリックして、インストールをします。（５分くらいかかった）

最後にsimpleaudioをpipでインストール
```
$ pip install simpleaudio
```

これで私はいけました。
正直、ほかにも試行錯誤していたので、そのときに入れていたライブラリとかが影響している可能性もありますので、100%の保証はできません。

ですが、参考になれば幸いです。
Ubuntu の /tmp のユーザファイルに root で追記できない

sticky bit をディレクトリに設定すると、ファイルの所有者、ディレクトリの所有者、またはスーパーユーザーである場合にのみ、削除または名前変更ができるという仕様があり、/tmp は 1777 を付けて、すべてのユーザが、自身が owner のファイルを作成、削除して利用できるようになっている。
ここまではよいのだが、Ubuntu だと少し特殊な挙動が加わる。

sticky bit が付いている /tmp に、test01 ユーザが abc.txt を作成した後、root ユーザが、そこに >> で追記しようとすると、パーミッションエラーで書き込めないのだ。

```
test01@ubuntu-pc:~$ cd /tmp
test01@ubuntu-pc:/tmp$ touch abc.txt
test01@ubuntu-pc:/tmp$ sudo -s -H
root@ubuntu-pc:/tmp# echo "test" >> abc.txt
bash: abc.txt: Permission denied
```

これが、通常の sticky bit のないディレクトリなら問題なく書き込める。

そして、この挙動、sticky bit が付いているディレクトリの owner が test01 だった場合は、なぜか起きない。

```
root@ubuntu-pc:/# mkdir /test-dir
root@ubuntu-pc:/# touch /test-dir/abc.txt
root@ubuntu-pc:/# chown -R test01:test01 /test-dir
root@ubuntu-pc:/# chmod 1777 /test-dir
root@ubuntu-pc:/# echo "test" >> /test-dir/abc.txt      # これは OK
root@ubuntu-pc:/# chown -R root:root /test-dir
root@ubuntu-pc:/# echo "test" >> /test-dir/abc.txt      # これは /tmp と同じで NG
bash: /test-dir/abc.txt: Permission denied
```

---

レアケースかもしれないが、Ubuntu で /tmp 直下にある（1段 sticky bit ではないディレクトリ挟めば起きない）ユーザのファイルに、root で書き込めることを期待すると、この問題を踏むことになる。

ログファイルをユーザと root で交互に append するような、スクリプトを書く場合は、気をつけたい。
ユーザが先にファイルを作成しても、root は書き込めない。


### 2025/1/18 追記

ファイルに Permission denied で書き込めないのは、
- `>>` を使った書き込みで、O_CREAT が付いていること、
- `/proc/sys/fs/protected_regular` に `2` が入っていること

が関係しているとコメントいただきました。

O_CREAT を外すか、

```
echo 0 > /proc/sys/fs/protected_regular
```
とすることで、書き込めることを確認しました。

詳しくは、コメントをご参照ください。
google cloud speechの詰まったところ＋解決メモ[Windows][Python] 

# エラー
```
ModuleNotFoundError: No module named 'google'
```


# 試したこと
```
pip install google
```
これを実行すると何かがインストールされたので、いけるか？と思ってスクリプトを実行したが、違うエラーが出た。
```
ImportError: cannot import name speech
```
そこで、調べたところ、以下を実行すれば解決した。
```
pip install --upgrade google-cloud
pip install google.cloud.storage
pip install google-cloud-speech
```
それぞれ別の記事で見つけてきたため、どれが解決策なのかは特定できず。
とりあえずこの３つを実行したらいけたよ、というメモ。
Raspberry Pi Pico 2でOLEDを動かしてみよう

Raspberry Pi Pico 2は、2024年9月に発売された安価な組込基板である。

私のようなお小遣いエンジニアにとっては安価に遊べるデバイス。
ESP32系ボードで安定したものを買うと2000円は必要。こいつなら基盤は1000円以内。
WifiやSDカードはついていないので、閉じたシステムの制御向き。

# まず買おう
秋月でまとめて買っちまおう！

Raspberry Pi Pico 2
https://akizukidenshi.com/catalog/g/g129604/

0.96インチ 128×64ドット有機ELディスプレイ(OLED) 白色
https://akizukidenshi.com/catalog/g/g112031/

USB microB ケーブル
https://akizukidenshi.com/catalog/g/g109314/

ブレッドボード
https://akizukidenshi.com/catalog/g/g130086/

ジャンパ線
https://akizukidenshi.com/catalog/g/g105371/

# 組もう！
ピン配
https://datasheets.raspberrypi.com/pico/Pico-2-Pinout.pdf

3.3VとGND
I2CはGPIO4,5につける。
### GPIO4,5だが、ピンでいうと6番目と7番目なので注意。
![Screenshot_20250117-200641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/b869b6d1-0f4d-afcb-d7b6-82e2eebdff8a.png)

# サンプルコード
VSCodeの拡張「Raspberry Pi Pico」を入れる。
めんどくさいCMake設定等を自動でやってくれるので開発中だけどこれ推奨。
https://marketplace.visualstudio.com/items?itemName=raspberry-pi.raspberry-pi-pico

New Project from Exampleからプロジェクトを作成。
Exampleから「ssd1306_i2c」を選択して作成する。
![RasPiPicoVSCode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/0d4b1103-6e74-7a6c-d64a-a41dfa148183.png)

# サンプル修正
サンプルは128x32ドット用なので、「ssd1306_i2c.c」のSSD1306_HEIGHTを32→64に変更する。
```ssd1306_i2c.c
#define SSD1306_HEIGHT              64 // 32
#define SSD1306_WIDTH               128
```

# コンパイル
右下のCompileボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/43ffc02d-f35b-5152-a17b-871fae14baca.png)

生成物がプロジェクトフォルダのbuildにできる。
「プロジェクト名.uf2」をコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/f2385176-6f45-a624-4583-28d4ed1dd943.png)


# Raspberry Pi Pico 2に入れて動作
BOOTSELボタンを押したままPCにUSB接続する。
PCからUSBストレージとして見えるので、「プロジェクト名.uf2」をペーストする。
勝手にリブートして、プログラムが起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/70f67548-0fa2-cde4-45c0-62988b51f01d.png)

# 所感
いままで結構C言語開発だとビルド環境を整えるのが面倒だったけど、VSCodeの拡張でかなり簡単になった。

RP2350が載っているのでなんかできそうな雰囲気。
ARM Cortex-Mデュアルコア + RISC-Vデュアルコア　150MHzという組み込み1000円基板とは思えないSoC。ただし、一度にアクティブにできるコアは2つのみらしい。

やっぱりWifiが載ってたほうがPCと繋ぎやすいかなぁ…。
https://akizukidenshi.com/catalog/g/g117947/

[2025/1/18　追記]
# BH1750照度計と連携
せっかくなのでBH1750照度計(I2C)から読んだルクス値を表示するようにしてみました。
フォントもドットなど追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/4a46415a-cbce-1841-f333-8713d34c82d1.png)


ソース一式をGithubに上げました。
https://github.com/airnanasi/BH1750_Illuminance_Sensor.git
【Go】importで手こずらないようにしたい

# はじめに
私は`Go`でプログラミングをしていると、しばしば`import`のところでエラーになってしまうことがあります。
そんな悩みを解決したいと思い、今回のような記事を書くことにしました。

参考になれば幸いです。

# パッケージとモジュールについて
まずは`import`とは切っても切れない関係である「パッケージ」、「モジュール」について簡単に説明します。
<dl>
<dt>パッケージ
<dd>フォルダ単位で、一つまたは複数の`*.go`ファイルをまとめたもの。同一フォルダ内のGoファイルの先頭には`package (パッケージ名)`が統一されている必要がある。
パッケージに含まれる機能を`import`で利用できる。
<dt>モジュール
<dd>パッケージを一つまたは複数のサブパッケージ（パッケージをもっと細かくしたもの）をまとめたもの。<br>
</dl>
あるフォルダにてモジュールだと宣言するには以下のようにします。

```
go mod init <モジュール名>
```

モジュール名は`github.com/hoge/module1`というような表記にします。モジュールを公開しない場合は`module1`というような名前でもかまいません。
いずれにしろ、最後の部分のパス名（この場合はmodule1）とモジュールのフォルダ名を合致させておくとよいです。

コマンドを入力すると現在いるフォルダに`go.mod`ファイルが作成され、これ以下がまるごと「モジュール」になります。

# importについて
まず、今回は例として以下のように簡易的なディレクトリ関係を想定し、`main.go`から`handler`のパッケージを参照する方法を考えます。

```
project
    └─ server
        ├─ handler
        │    ├─ user.go
        │    └─ work.go
        ├─ main.go
        └─ go.mod
```
また、`go.mod`の中身はこのようになっているとします。

```:go.mod
module github.com/project/server

go 1.23.2
```
この場合、`main.go`の冒頭はこのようになります。

```go:main.go
package main

import (
    "github.com/project/server/handler"
)
```
では次に、`go.mod`ファイルの中身がこのような場合を考えてみます。

```go.mod
module github.com/project

go 1.23.2
```
`go mod init`を実行したディレクトリが`server`ではなく、`project`だった場合だとこのような中身になります。

この場合、importパスは`github.com/project/handler`となります。

このように、importパスはモジュールのルートから見た相対パスで指定する必要があります。

:::note info
ただ、ディレクトリ構造が上記のようになっているため、`go.mod`ファイルの中身（モジュールのルート）がこのようになっているのは不適切で、1つ前に紹介した方が良いと考えられます。

詳しくは以下の記事を参考にしてください。
:::
https://go.dev/blog/v2-go-modules

# おわりに
今回の記事では「パッケージ」や「モジュール」について軽く説明した後に`import`について触れました。結果として非常に初歩的なものになってしまいましたが、理解を深めることができて良かったです。

では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。

# 参考
https://zenn.dev/nobonobo/articles/1d4afb9f4e8873

https://zenn.dev/nobonobo/articles/4fb018a24f9ee9

https://zenn.dev/777kkk/books/bb6b650b7ba677/viewer/cac48f
Stripe CLI入門 - 決済開発環境・導入・設定から実践的な使い方まで

## はじめに

本記事では、Stripe CLIの概要から、よく使われるコマンドや活用方法など、幅広く機能を紹介します。
ローカル環境での開発・テスト時に非常に重宝するツールですので、Stripeを扱う方はぜひ導入を検討してみてください。

## Stripe CLIとは
Stripe CLIは、Stripeアカウントと連携して以下のような操作をローカルで簡単に行えるコマンドラインツールです。

- ローカルでWebhookイベントを受信し、イベント処理を即時にテスト  
- コマンドラインから支払い関連のイベントなどをトリガー  
- Stripeアカウントのリソースを作成・取得・更新・削除  
- ログのモニタリング  
- イベント履歴の取得  

開発・テスト段階でできるだけ早くフィードバックを得たい場合に重宝し、デバッグを効率化できます。

---

## インストールと初期設定

### インストール (macOS Homebrewの場合)
```
brew install stripe/stripe-cli/stripe
```
上記でStripe CLIをインストール可能です。他のOSの場合は公式ドキュメントを参照してください。

### ログイン
StripeアカウントとCLIを連携するために、以下のコマンドを使ってログインします。表示されたペアリングコードをブラウザに入力し、認証する流れです。

```
stripe login
```
```
Your pairing code is: enjoy-enough-outwit-win
Press Enter to open the browser or visit ...
```

---

## Webhookイベントの受信

### ローカルリスナーの起動
以下のようにコマンドを実行すると、Webhookイベントをローカルに転送できます。

```
stripe listen --forward-to localhost:4242/webhook
```

StripeダッシュボードやStripe CLI上で発生したイベントは、`localhost:4242/webhook` で待ち受けるサーバに対してリアルタイムに通知されます。Webhook処理をローカルで検証したい場合に便利です。

### イベントのトリガー
支払い成功イベント等を手動で発火させるには、以下のように `trigger` コマンドを使用します。

```
stripe trigger payment_intent.succeeded
```

これにより、成功した支払いイベントがStripeから送信されるので、受信や処理ロジックのテストを簡単に行えます。

---

## 主なコマンドと活用例

Stripe CLIには多彩なコマンドが用意されています。ここでは主な機能・コマンドの一部を紹介します。

### 1. リソース操作
- `stripe customers create`
- `stripe charges create --amount 2000 --currency jpy --customer cus_XXXX`
- `stripe subscriptions create`  
など、Stripe APIで行うリソース作成や更新、取得をコマンドラインから直接実行可能です。テスト用データを素早く追加したいときに便利です。

### 2. ログの監視
- `stripe logs tail`  
リアルタイムでリクエストログを確認できます。エラーやリクエストの状況を把握しやすく、原因追及・デバッグがスムーズになります。

### 3. イベントの確認
- `stripe events list`  
テスト/本番環境で発生したイベントのリストを取得して、Webhooksの送信状況やエラーを確認できます。

### 4. サンプルの取得
- `stripe samples create <サンプル名>`  
Stripe公式が用意したサンプルプロジェクトを一括でセットアップできます。決済フローなどを手っ取り早く試したい場合に役立ちます。

### 5. devモードでの開発補助
- `stripe dev`  
特定のサンプルを起動してローカル開発環境を自動で構築してくれます。Webhooksの設定などもまとめて行ってくれるため、導入がスピーディになります。

---

## 開発フローイメージ

以下は、Stripe CLIによる認証・Webhook受信・リソース操作を大まかに示したイメージです。

```mermaid
sequenceDiagram
    participant [ユーザー]
    participant [Stripeダッシュボード]
    participant [ローカルサーバ]

    [ユーザー]->>[Stripeダッシュボード]: "stripe login"
    [Stripeダッシュボード]->>[ユーザー]: "認証完了"
    [ユーザー]->>[ローカルサーバ]: "stripe listen"
    [ローカルサーバ]->>[ユーザー]: "待機中"
    [ユーザー]->>[Stripeダッシュボード]: "stripe trigger payment_intent.succeeded"
    [Stripeダッシュボード]->>[ローカルサーバ]: "イベント送信"
    [ローカルサーバ]->>[ユーザー]: "処理結果を確認"
```

---

## まとめ
Stripe CLIは、ローカルでのWebhook受信テストや支払い関連のイベント発火、ログのモニタリングなど、多彩な機能を持った強力なツールです。主なメリットは以下のとおりです。

- **Webhookのテストが容易**: `stripe listen` でローカル環境に即時送信  
- **イベントの手動トリガー**: `stripe trigger` で支払い成功などを簡単に再現  
- **リソース操作やログ確認が簡単**: テスト用のデータ作成やAPIログの監視を一つのCLIで完結  
- **サンプルプロジェクトやdevモード**: 導入～開発のハードルを大幅に下げてくれる  

Stripeでの決済やサブスクリプション実装などを効率的に進めたい場合は、ぜひStripe CLIを導入してみてください。複雑なWebhooksテストやログ解析をスピーディにこなせるようになり、開発効率が大きく向上します。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/