OmniAICreator/Qiita-1.07M huggingface dataset:
DatabricksのサーバレスGPUコンピュート

これはびっくり。

https://docs.databricks.com/aws/ja/release-notes/product/2025/june#serverless-gpu-compute-is-in-beta

> **サーバレスGPUコンピュートがベータになりました**
> サーバレスGPUコンピュートが[サーバレスコンピュートオファリング](https://docs.databricks.com/aws/ja/compute/serverless/)の一部になりました。サーバレスGPUコンピュートはカスタムのシングルおよびマルチノードのディープラーニングワークロードに特化されています。お好きなフレームワークを用いたカスタムモデルのトレーニングやファインチューニングを行い、最先端の効率性、パフォーマンス、品質を手に入れるためにサーバレスGPUコンピュートを活用することができます。
>
> [サーバレスGPUコンピュート](https://docs.databricks.com/aws/ja/compute/serverless/gpu)をご覧ください。

:::note info
**注意**
執筆時点では[ベータ版](https://docs.databricks.com/aws/ja/release-notes/release-types)であり、`us-west-2`、`us-east-1`リージョンでしか利用できません。
:::

`us-west-2`で試してみます。

**環境**パネルにアクセスします。アクセラレータで**A10**が選択できるようになっています。

![Screenshot 2025-06-07 at 9.49.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ed2ec41e-a9a9-448e-8cef-c4d0bfdb9c56.png)

A10を選択すると、自動で環境バージョンは**3**に設定されます。

![Screenshot 2025-06-07 at 9.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/43ac3d3f-281f-4017-9332-f58cbba709ca.png)


サーバレスが**GPU**になっています。

![Screenshot 2025-06-07 at 9.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2ce7063f-f337-4591-b1c9-5699cc391172.png)

[サンプルノートブック](https://docs.databricks.com/aws/ja/compute/serverless/gpu#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E4%BE%8B)を使ってPyTorchを用いたディープラーニングトレーニングを行ってみます。

![Screenshot 2025-06-07 at 10.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/35dccb9a-5824-4e7c-aff9-2f62d2de6ed7.png)

生成AIのワークロードが捗ります。(毎度のことですが)早く日本に来て欲しいです。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
AWS ECSとは

## まずはじめに

普段はJavaをメインにバックエンドの開発をしていますが、最近になってインフラ(AWS)を触る機会がとても多くなっており、頭の整理がてらアウトプットさせていただきます。
インフラ第一回目はコンテナについてです。

## ECSってなにもの？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691258/64160e4b-04e1-47fe-be23-9d6a4d8cc672.png)


まずはじめにECSについて簡単に説明すると、ECSとは**Dockerコンテナを実行、停止、管理するためのフルマネージドなコンテナオーケストレーションサービスであり、** コンテナ化されたアプリケーションのスケーリング、ロードバランシング、ネットワーキング、および監視を簡素化してくれるサービスのこと。

簡単にいうと、**とてもいい感じにコンテナの管理をしてくれるサービス**です。

<details close><summary>フルマネージド、オーケストレーションとは？</summary>

コンテナクラスタの管理、スケーリング、パッチ適用などのインフラ管理をAWSが担当してくれること。

オーケストレーション：管理
</details>

<details close><summary>Dockerとは？</summary>

1台のサーバー上で**様々なアプリケーションを手軽に仮想化・実行できるようにするためのプラットフォーム**のこと。
Dockerコンテナと呼ばれるアプリケーションの実行環境を、1台のサーバー上に作成することができる。
Dockerコンテナを作成するための設計図であるDockerイメージを共有することで、他ユーザーでも簡単に同じ開発環境のDockerコンテナを使ってアプリケーションを実行できる。

Dockerfile：Dockerイメージを作成するためのテキストデータ。OSの設定、言語のインストール、依存関係のインストールなどを記載する実行環境構築の手順書のようなもの。

Dockerイメージ：Dockerfileに記述された手順に従ってビルドされた、アプリケーションとその実行環境をパッケージとしてまとめたもの。ソースコード＋実行環境

Dockerコンテナ：実行環境や依存関係をパッケージ化された仮想空間のようなもので、他のシステムに影響を与えない、与えられないように隔離されている。
</details>

### ECSの構成要素
・クラスター　
→ **サービスやタスクを実行する実行基盤**

・タスク定義
→ **ECSがどのようにコンテナを実行すべきかを記述した設計図。アプリケーションを構成する1つまたは複数のコンテナ、それらのコンテナが使用するリソース、ネットワーク設定、ログ設定などを定義します。**

・サービス
→ **ECSにおいてタスクの実行と管理を維持し、指定されたdesired count（希望する実行数）を維持するもの。長時間稼働するWebサーバーやAPIなどのアプリケーションで使用される。**

・タスク
→ **タスク定義に基づいてECSクラスター上で実際に実行されているコンテナのインスタンス、実際に動いているアプリケーションのまとまり**





## EKS ECRとは何が違うの？

### ESK(Elastic Kubernetes Service)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691258/60a8ff25-6b71-4d48-abcd-b658b5229979.png)


ESKはkubernetesのマネージドサービスで、オープンソースのkubernetesをAWS上で利用しているもの。（逆にECSはAWSが独自に開発したサービス）

ECSとESKはどちらもコンテナオーケストレーションサービスですが、採用している技術と、運用における特徴が異なっている。

### ECR(Elastic Container Registry)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691258/d6c9a3b8-8753-41d5-b65e-31d5ce5b6a97.png)


ECRとはDockerコンテナのイメージを保存するためのサービス
ECRはDockerfileやdocker-compose.ymlではなく、ビルドされたDockerイメージを保存する
**ECSはコンテナを実際に実行する役割をもち、ECRはDockerイメージを保管する役割を持っている。**

## まとめ
ECSはコンテナ運用の強力な味方。
最後にECS運用のメリットをまとめて終わります。

### 1. 運用負荷からの解放：インフラ管理の心配なし
ECSを使う最大のメリットの一つは、コンテナインフラの管理から解放されることです。特にAWS Fargateを選択すれば、EC2インスタンスのOSパッチ適用、スケーリング、高可用性の維持といった面倒な作業はすべてAWSが引き受けてくれます。私たちはアプリケーションコードとコンテナイメージの作成に集中できるため、開発の生産性が大幅に向上します。

### 2. 高いスケーラビリティと可用性：急なアクセス増も怖くない
ECSのサービス機能とAuto Scalingの組み合わせにより、アプリケーションは必要な時に必要なだけスケールできます。トラフィックの急増にも柔軟に対応し、負荷分散機能と連携することで、ユーザーに途切れないサービスを提供できます。万が一、タスクが停止しても、ECSが自動的に新しいタスクを起動してくれるため、アプリケーションの可用性が高く保たれます。

### 3. 効率的なリソース利用とコスト最適化：使った分だけ賢く支払う
タスク定義でコンテナごとにCPUとメモリを細かく指定できるため、リソースを無駄なく利用できます。特にFargateの場合、コンテナが実際に利用したリソースに対してのみ課金されるため、アイドル状態のリソースに対する無駄なコストが発生しにくくなります。これにより、運用コストを最適化しやすくなります。

### 4. 開発とデプロイの高速化：モダンなCI/CDパイプラインの実現
ECRでコンテナイメージを一元管理し、ECSと連携させることで、継続的インテグレーション/継続的デリバリー（CI/CD）パイプラインを簡単に構築できます。新しいコードをデプロイする際も、ECSのサービスデプロイ機能を使えば、ダウンタイムを最小限に抑えながら安全にリリースを行うことが可能です。
【React】CheckBoxのチェックを外したときにStateが更新される

# はじめに
チェックボックスのチェックした値でフィルターをかけようとしたところ、期待値通りのフィルタリングができませんでした。備忘録として解決方法をまとめます。

# 問題
チェックボックスをチェックした時にフィルタリングできるようしたいが、チェックを外したときにフィルタリングが適用されてしまう。

# 原因
チェック時の値をuseStateでセットする前に、データ取得処理が実行されていた。
setGenreIdで値を更新する際、即座に反映されず、関数（handleChange）実行後に反映されます。

**公式ドキュメントより引用**
>set 関数の呼び出しは、実行中のコードの state を変化させません。


```tsx
// チェックボックスの状態管理
const [genreId, setGenreId] = useState<string[]>([]);

// チェックボックスの変更ハンドラー
const handleChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
  if (e.target.checked) {
    setGenreId([...genreId, e.target.value]);
  } else {
    setGenreId(genreId.filter((id) => id !== e.target.value));
  }
  const searchByGenresData = await getDataByGenres(genreId); //←setGenreIdの値は更新されていない、古い値を設定している
  setData(searchByGenresData);
};
```

# 解決方法
#### 1. `useEffect`を使用する

```diff_tsx
-  const handleChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
+  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    if (e.target.checked) {
      setGenreId([...genreId, e.target.value]);
    } else {
      setGenreId(genreId.filter((id) => id !== e.target.value));
    }
-  const searchByGenresData = await getDataByGenres(genreId);
-  setData(searchByGenresData);
  };

+  useEffect(() => {
+    const fetchDataByGenres = async () => {
+      const searchByGenresData = await getDataByGenres(genreId);
+      setData(searchByGenresData);
+    };
+    fetchDataByGenres();
+  }, [genreId]);

```

#### 2. 新しい変数で格納する

**公式ドキュメントより引用**
>次の state が必要な場合は、set 関数に渡す前に一度変数に保存することができます。

```diff_tsx
  const handleChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
+    let newGenreId: string[];
    if (e.target.checked) {
-      setGenreId([...genreId, e.target.value]);
+      newGenreId = [...genreId, e.target.value];
+      setGenreId(newGenreId);
    } else {
-      setGenreId(genreId.filter((id) => id !== e.target.value));
+      newGenreId = genreId.filter((id) => id !== e.target.value);
+      setGenreId(newGenreId);
    }
-    const searchByGenresData = await getDataByGenres(genreId);
+    const searchByGenresData = await getDataByGenres(newGenreId);
    setData(searchByGenresData);
  };
```

# おわりに
Stateの管理、難しいです。使いこなせるようになりたいです。

# 参考
https://ja.react.dev/reference/react/useState#ive-updated-the-state-but-logging-gives-me-the-old-value
【React初心者メモ】オプショナルチェイニング（?.）

# オプショナルチェイニング（?.）とは
オプショナルチェイニングとはJavaScriptやTypeScriptで、オブジェクトのネストされたプロパティに安全にアクセスするための記法です。オプショナルチェイニングを使うと、プロパティがnull または undefinedの場合に、**undefined**を返すようになります。

# 何のために使うのか？
###  エラーを防止する
例えば、以下のようにUserというオブジェクトが持っていないaddressというプロパティーを参照した場合、TypeError: Cannot read property 'address' of undefinedというエラーが出てしまいます。
```
const user = {
  name: 'Taro'
};
console.log(user.address.city); // エラーになる！
```
しかし、オプショナルチェイニングを使うことで、存在しないプロパティにアクセスした場合でもエラーが発生せず、undefinedを返すようになります。
```
const user = {
  name: 'Taro'
};
console.log(user.address?.city); // undefinedを出力する！
```
### 記述量を減らす
オプショナルチェイニングを使わない場合、エラーを回避するためには以下のように全ての値のチェックをする必要が出てきてしまいます。
```
if (
  user &&
  user.profile &&
  user.profile.contact &&
  user.profile.contact.email
) {
  console.log(user.profile.contact.email);
}
```
オプショナルチェイニングを使うことで、エラーを回避したい場合でも、以下のようにコードを簡潔に書くことができます。
```
console.log(user?.profile?.contact?.email);
// 途中で null / undefined があったら、エラーにはならず `undefined` を返す
```
# 配列や関数にも使える
配列の場合は、以下のようになります。
```
const arr = null;
console.log(arr?.[1]); // undefinedを出力する！
```
関数の場合は、以下のようになります。
```
const obj = {
  sayHello: null
};
obj.sayHello?.(); // 実行されない、エラーも出ない
```
Google Cloud SQLを使用した際の失敗談

# 【失敗談】クラウドデータベースの課金体系を勘違いして痛い目を見た話

## はじめに

個人開発でポートフォリオを作成していた際に、クラウドデータベースの課金体系を完全に勘違いしてしまい、予想以上の請求が来てしまった体験談を共有します。

同じような勘違いをする人が一人でも減ることを願って、自分の失敗を記録として残しておきます。

## 何を勘違いしていたのか

### 勘違いの内容

私が勘違いしていた課金体系は以下の通りです：

- **間違った認識**: 起動した時間ではなく、**利用した分（クエリした分、保管したデータ分）だけ課金**される
- **間違った認識**: リソースを作ったとしても、**特に触っていなければ微課金で済む**
- **間違った認識**: デプロイ自体が稼働させただけでは**料金は発生しない**
- **間違った認識**: データを入れた際に、**入れた分だけ料金がかかる**

### 実際の課金体系

実際には、多くのクラウドデータベースサービスでは：

- **インスタンスが起動している時間に対して課金**される
- データの使用量やクエリ数に関係なく、**稼働時間分の料金が発生**
- インスタンスを作成した時点から課金が開始される

## 具体的に何が起こったか

### インスタンス作成時の設定

インスタンス作成時には以下の設定を行う必要がありました：

1. **プランの選択**
2. **バックアップ頻度の設定**
3. **容量の設定**

個人開発（ポートフォリオ）用途だったため、**全て一番小さいプランで十分**でした。

### プラン選択での注意点

特に注意が必要だったのがプランの選択です：

- **エンタープライズプラン**: 企業向けの基本プラン
- **エンタープライズプラスプラン**: より高機能な上位プラン

私は間違えて**エンタープライズプラス**を選択してしまい、個人では痛い金額になってしまいました。

## 反省点と学んだこと

### 1. ドキュメントをしっかり読む

> 謎にドキュメントを読まずに進めていたので、自業自得であった。

最も大きな反省点は、**公式ドキュメントを読まずに進めてしまった**ことです。課金体系についてはドキュメントに明記されているため、事前に確認すべきでした。

### 2. 課金体系の理解

クラウドサービスの課金体系は複雑な場合が多いため、以下を必ず確認する：

- 何に対して課金されるのか
- いつから課金が開始されるのか
- 使用していない時間も課金されるのか
- 最小課金単位はどれくらいか

### 3. プラン選択の慎重さ

プラン選択時は以下を心がける：

- 個人開発なら最小プランから始める
- プラン名が似ている場合は特に注意深く確認する
- 料金表を必ず確認する

## 今後気をつけること

### 事前調査の徹底

- 公式ドキュメントの熟読
- 課金シミュレーターがあれば活用
- 無料枠の有無と条件の確認

### テスト環境での検証

- まずは最小構成でテスト
- 実際の課金額を1日〜1週間程度監視
- 想定外の課金がないか定期的にチェック

### アラート設定

- 予算アラートの設定
- 使用量監視の設定
- 定期的な利用状況の確認

## まとめ

クラウドサービスは便利ですが、課金体系を理解せずに使用すると思わぬ出費につながります。

特に個人開発者にとっては、**数千円の違いでも大きな痛手**になる可能性があります。

この記事が同じような失敗をする人の参考になれば幸いです。

**教訓**: 
- ドキュメントは必ず読む
- 課金体系は事前に理解する  
- 個人開発なら最小プランから始める
- 定期的な利用状況の確認を怠らない

---

*この記事は自分のミスを忘れず、記録するために書かせてもらいました。同じような失敗をする人が減ることを願っています。*
自分用java学習 抽象クラスの続き～@Overrideアノテーション / super

# オーバーライド
親クラスから受け継いだメソッドを子クラスが自分に合わせて新しく作り直すこと。的な」

# @Overrideアノテーション
「このメソッドは親クラスのメソッドをオーバライドしていますよ」という印。メソッドのすぐ上に書く。
書かなくても動くけど、書く理由は大きく分けて2つ
1. 親のメソッドを子が上書きした！という宣言
→他人がコードを見たとき、そのメソッドは親からオーバーライドした者なんだ！って知らせるための目印
2. きちんと上書きできているかのチェック
→例えば、親からfly()というメソッドを受け継いだ際、誤って、fiy()と子クラスに書いたとする。@Overrideがないと、新しくfiy()というメソッドを宣言したんじゃないかと勘違いしてしまう。

# superキーワード
親クラス(抽象メソッドなど)のメソッドを呼び出すときに使う
初心者なので@Overrideとの違いが分かりにくいけど自分なりの解釈を最後にまとめます。

# 例コードでこいつらを使ってみる

##### 例コード（親クラス）
```java:Animal.java
// 抽象クラス
abstract class Animal {


    // 抽象メソッド(内容は書かない)
    pulic abstract void makeSound();

    // 共通のメソッド
    public void sleep() {

        System.out.println("動物は眠ります");
    }
}
```
「動物」という抽象クラス
・makeSound()は抽象メソッドなので子クラスで中身を必ず実装する
・sleep()はすでに内容がある。子クラスがそのまま使っても、オーバーライドしてもOK

##### 例コード（子クラス）
```java:Dog.java
class Dog extends Animal {

    // @Overrideで明示的に「親の抽象メソッドを上書き」していることを示す
    @Override 
    public void makeSound() {

        System.out.println("ワンワン");
    }

    // sleep()もオーバーライドして、superで親の処理も呼び出す
    @Override 
    public void sleep() {

        super.sleep(); // 親クラスのsleep()を呼び出す
        System.out.println("犬は丸くなって眠ります");
    }
}
```
・@Overrideを書くことでメソッド名を間違えたときにエラーが出るし、人間もひと目でわかる
・super.sleep()で親クラスの処理【動物は眠ります】を実行
・その後、自分だけの処理も追加【犬は丸くなって眠ります】できる

##### 最後にmainメソッドを使う
```java:Main.java
public class Main {

    public static void main(String[] args) {

        Dog myDog = new Dog();
        
        myDog.makeSound();
        myDog.sleep();
    }
}
```

# superと@Overrideアノテーションの違い(解釈)
### super
・子クラスの中で親クラスの〇〇を使います！と指示。実際に親クラスの能力を呼び出す。
・メソッドやコンストラクタの中で使う。

### @Overrideアノテーション
・親の能力を「上書きする」
・メソッド定義の上に書く。

# 終わりに(追記)
この後、インターフェースを学んだ時にも@Overrideアノテーションが出てきた。。
ここでは「親クラスのメソッドを上書き」と書いたけど、厳密(?)には、「既存のメソッドをオーバーライド」しているかどうかを示すために使うっぽい。
いろいろインプットが増えてきて頭おかしくなりそうです。
PHPでPOSTリクエストのクエリパラメータを受け取る方法を知らなかった話

# はじめに
こんにちは！高校生でプログラミング勉強中のCureSabaです。
今回は「PHPでPOSTリクエスト時のクエリパラメータの受け取り方」について、自分の気づきをまとめます。

# 背景

APIを設計しているとき、`POST`リクエストで  
```
https://example.com/endpoint?foo=bar
```
のように、**クエリパラメータ付きのURL**を使うケースがあります。

「POSTなんだから、パラメータは全部`$_POST`で受け取れるよね？」  
と思っていましたが、**クエリパラメータ（?以降）は`$_POST`には入りません**。

# 結論

- **クエリパラメータは、HTTPメソッドに関わらず`$_GET`に格納される**
- **POSTリクエストの本文（form-dataやjson）は`$_POST`や`php://input`で受け取る**


# 実際に試してみる

```php
<?php
// 例: https://example.com/endpoint?foo=bar にPOSTリクエスト

var_dump($_GET);   // クエリパラメータ（foo=bar）が入る
var_dump($_POST);  // POST本文（フォームデータなど）が入る
?>
```

## 例えばcurlで…

```sh
curl -X POST "https://example.com/endpoint?foo=bar" -d "baz=qux"
```

- `$_GET` → `['foo' => 'bar']`
- `$_POST` → `['baz' => 'qux']`


# まとめ

- **POSTリクエストでもURLの?以降の値は`$_GET`で受け取る**
- **「POSTだから全部`$_POST`」と思い込んでいるとハマるので注意**


# おまけ：JSONの場合

Content-Typeが`application/json`の場合は、  
`$_POST`には何も入らず、`php://input`から取得します。

```php
$json = file_get_contents('php://input');
$data = json_decode($json, true);
```

# 終わりに
もし、この記事が役に立ったと思ったら、ぜひコメントやシェアをお願いします。また、質問や改善点などがあれば気軽にコメントしてください！

それでは、良いプログラミングライフを！
JetBrains IDEでファイルを素早くプレビューする

JetBrains IDEでファイルを素早くプレビューする2つの方法を紹介します。

# Project tool windowでスペースキーを押す

Project tool windowで開きたいファイルにカーソルを合わせた状態で、スペースキーを押します。

![スクリーンショット 2025-06-07 8.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/985d9eee-79fe-45cb-a5f3-803f92eaac71.png)

すると次のようなwindowが表示され、対象ファイルのプレビューを確認できます。

![スクリーンショット 2025-06-07 8.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/e3485ce7-070b-479c-9418-7953f4a35993.png)

https://www.jetbrains.com/guide/go/tips/preview-file-contents/

# Enable Preview Tabを有効にしてクリック

Project tool windowのOptions > Behavior > Enable Preview Tabを選択し、チェックをつけた状態にします。

![スクリーンショット 2025-06-07 8.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/dfc5bcf2-176c-4837-8ef3-2f9ebde403ce.png)

その状態で、Project tool window中のファイルをシングルクリックします。すると、シングルタップしたファイルがPreview Tabで開きます。

![スクリーンショット 2025-06-07 8.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/4cea6c6f-b36e-469f-8256-1411665b7a1b.png)

別のファイルをシングルクリックすると、先ほど開いていたPreview Tabは閉じ、新たにクリックしたファイルがPreview Tabで開きます。

https://www.jetbrains.com/help/idea/using-code-editor.html#preview-tab

# ひとこと

検索やナビゲーションからファイルを開くことの方が多く、プレビュー機能を活用する場面は多くないかもしれません。

ですが、それらが使えない有効でない状況で目的のファイルを探さないといけない場合、いちいちタブを開閉しなくていいのは便利です。

※ 本投稿のスクリーンショットは、Rider 2025.1ですが、他のJetBrains IDEでも利用可能です。
スクリプトからUIボタンに命令(メソッド)を追加する方法

onClick.AddListener();関数を用いて、ボタンUIオブジェクトにメソッドを追加する方法を紹介したいと思います。
# ボタンにスクリプトをアタッチしてメソッドを追加する方法
```C#:button.cs
using UnityEngine;
using UnityEngine.UI;

public class button1 : MonoBehaviour
{
    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        GetComponent<Button>().onClick.AddListener(() => { Debug.Log("OnClick"); });
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```
Debug.Log("OnClick");の部分が、追加したい任意のメソッドになります。
# コントローラスクリプトにボタンをアタッチする方法
```C#:button.cs
using UnityEngine;
using UnityEngine.UI;

public class GameController : MonoBehaviour
{
    [SerializeField] Button Button;
    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        Button.onClick.AddListener(() => { Debug.Log("OnClick"); });
    }

    // Update is called once per frame
    void Update()
    {

    }
}
```
[SerializeField]を付けた変数にインスペクターからボタンをアタッチしてください。
![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943148/454f2c4a-553a-4fa4-8861-c000f03cb165.png)
### 以上
ReactをVSCodeでデバッグする方法

最近Reactを会社でやることになり調べた内容をここにアウトプットしておきます。

ReactアプリをVisual Studio Code（VS Code）でデバッグするには、以下の手順で簡単にセットアップできます。

---

**1. 開発サーバーを起動する**

まず、ターミナルでReactアプリの開発サーバーを起動します。  
例：
```
npm start
```
Viteの場合は
```
npm run dev
```
これで通常、`http://localhost:3000`（Viteは5173など）でアプリが動作します。

---

**2. launch.jsonを作成する**

VS Codeの左側の「実行とデバッグ」アイコンをクリックし、「launch.jsonファイルを作成」を選択します。  
デバッグ対象に「Web App (Chrome)」や「Web App (Edge)」を選びます。  
生成された`launch.json`の`url`を、起動している開発サーバーのURL（例：`http://localhost:3000`）に修正します。

例：
```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome against localhost",
      "url": "http://localhost:3000",
      "webRoot": "${workspaceFolder}/src"
    }
  ]
}
```
プロジェクト構成によって`webRoot`は調整してください。

---

**3. ブレークポイントを設定する**

デバッグしたいコードの行番号の左側（エディタのガター）をクリックして、赤い丸のブレークポイントを設定します。

---

**4. デバッグを開始する**

F5キーを押すか、「デバッグの開始」ボタンをクリックします。  
自動的にChrome（または選択したブラウザ）が起動し、指定したURLでアプリが開きます。

---

**5. デバッグ操作**

- ブレークポイントで処理が停止します。
- 変数の値を確認したり、ステップ実行、コールスタックの確認ができます。
- 必要に応じて変数の値を書き換えることも可能です。

---

**補足**

- 開発モードではReactのStrictModeにより、レンダリングが2回行われるためブレークポイントが2回止まることがあります。
- ブレークポイントが効かない場合は`launch.json`の`webRoot`や`url`の設定を見直してください。

---

この手順で、VS Code内で効率的にReactアプリのデバッグが可能です。ブラウザとエディタを行き来せず、コードの修正や変数の確認が一元的にできます。
iTerm2のHotkeyでマルチディスプレイ環境でアクティブディスプレイに新規ウィンドウを開きたい

Settings→Profiles→Window→New windows→ScreenでScreen with Cursorを選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/fb325faa-2d69-4399-b565-b6d8362722af.png)
自分用java学習 ～抽象クラス abstract～

# 抽象クラス
抽象クラスは自身でインスタンスを生成しない。
例えば...鳥にはカラスやスズメといった具体的な名前があり、「鳴く」という動作を共通でする。
抽象クラスは、「具体的にどう動くかは決まっていないけど、共通する性質や振る舞いを持つ」クラス
・設計図だけがあって、実際の動きは子クラス(サブクラス)が決める的な感じ
##### コードを用いた例
Bird抽象クラス
```java:Bird.java
abstract class Bird {

    abstract void sing(); //  すべての鳥は「鳴く」という共通の動作をする(抽象メソッド)

    void fly() {

        System.out.println("バサバサ飛びます");
    }
}
```
・avstractが付いているクラスは抽象クラス
・abstract void sig(); のように中身が書かれていないメソッドは「抽象メソッド」という
→これは「子クラスで必ず実装しなさい」という意味
CrowクラスとSparrowクラス
```java:Crow.java
class Crow extends Bird {

    @Overrride
    void sing() {

        System.out.println("カーカー");
    }
}
```
```java:Sparrow.java
class Sparrow extends Bird {

    @Override 
    void sing() {

        System.out.println("チュンチュン");
    }
}
```
・Birdクラスをextends(継承)している
・sing()メソッドをそれぞれ実装している

##### それらを踏まえて実行してみる
```java:Main.java
public class Main {
    public static void main(String[] args) {
    
        Bird crow = new Crow();
        Bird sparrow = new Sparrow();
    
        crow.sing();
        crow.fly();
    
        sparrow.sing();
        sparrow.sing();
    }
}
```
##### ポイントまとめ
・抽象クラス
→「共通部分」をまとめた設計図。直接インスタンス化できない。

・抽象メソッド
→「子クラスで必ず作らなきゃダメなメソッド」。中身は書かない。

・目的
→「共通部分は抽象クラスで」「違いはサブクラスで」。効率的でわかりやすいコードになる

# 終わりに
@Overrideアノテーションやsperについては次回書こうと思います。
少しずつ複雑になってきましたが頑張ります。
typescriptでts-nodeを使用して、実行するとCustomError: Cannot find moduleと出る。

# はじめに
```
npx ts-node --esm -r dotenv/config src/batch/index.ts 
```
上記のコマンドで下の ```index.ts``` の実行結果を確認しようとすると
モジュールがimportできないとエラーが出ました。
```index.ts
import { supabase } from "../api/supabase/supabaseClient";

async function deleteUserAndSkill() {
    // 前日のユーザ情報を削除する処理
}

deleteUserAndSkill()
  .then(() => console.log("Delete Completed!!"))
  .catch((error) => console.error(error));
```

# 解決方法
下記のように「.js」をつけてimportしてあげる必要があります。
```ts
import { supabase } from "../api/supabase/supabaseClient.js";
```
:::note info
ESModule形式では、ファイル拡張子を完全に指定してあげる必要があります。
typescriptは最終的にjavascritptに変換されて実行されるため ➡「.js」
:::

前提：
toconfig-pathsのインストールが必要です
# 参考
https://japanese-document.github.io/tips/2022/typescript-ts-node-esmodules.html

https://qiita.com/2san/items/8d493f89aaf455ab9af1
第二話：民法という神樹の枝葉に触れる　債権・物権・家族のかたち




> 民法の基本構造について俯瞰した前回では、「神樹」としての民法の全体像に触れました。
今回はその内側――幹から広がる枝葉にあたる、具体的な法分野（債権、物権、親族・相続）へと視点を移します。

法律に詳しくない方も、実務に関心のある方も、それぞれの枝葉がどう日常生活や社会制度と接続しているかを知ることで、民法の有機的な構造が見えてくるはずです。



---

📘 第二話



「民法という神樹の枝葉に触れる ― 債権・物権・家族のかたち」


---



> 民法という一本の大樹を前回、私たちはその「幹」の部分――基本原理と法体系としての輪郭から眺めました。

今回は、その枝葉に分け入ってみましょう。枝葉とは、具体的な条文とその運用によって形づくられる、私たちの暮らしの中に深く根ざした部分。

この大樹は、個人の取引、財産の管理、家族のかたちにまで、静かに影響を及ぼしています。




---

🍃 債権法 ― 約束と責任のルール

人と人が交わす契約、そしてその約束が守られなかったときの対処法。それが債権法です。
契約は自由である――これが民法の原則ですが、完全な自由ではなく、弱者保護や社会通念に配慮された制限が加えられています。

例えば、ネット通販で購入した商品に瑕疵があったとき、買い手が受けられる保護。これも債権法が担っている「生活の下支え」です。


---

🍂 物権法 ― 「誰のものか」の見える化

債権が「人と人の関係」だとすれば、物権は「人と物の関係」です。
所有権、抵当権、留置権――物の持ち主としての権利や、それを他人に対して主張する力を形にします。

土地を所有しただけでは守られない。登記という制度を通して、社会にその存在を“見せる”ことが求められます。物権法は「法のインフラ」とも言える分野です。


---

🌿 親族・相続法 ― 血縁と法律の交差点

家族の在り方や、亡き人の遺志をどのように尊重するか――
感情と密接に関わるこの領域もまた、民法の中にしっかりと位置づけられています。

扶養義務や法定相続、遺留分の制度は、家族間の不均衡や争いを抑え、法のもとでの「最小限の秩序」を保つ機能を果たしています。


---

結

> 枝葉は幹から分かれても、幹に支えられています。そして、そこに吹く風や雨が、また幹を育てる。
民法という神樹の内部は、こうした有機的な循環で成り立っています。

次回は、この神樹が他の神樹たちとどのように絡み合い、法の森を形づくっているか――
一歩、視野を広げてみましょう。





---
ChatGPTを使用したアプリ開発記【ビュー数の取得と表示】

## 【1】匿名ID管理：getOrCreateAnonymousId関数
```utils.js
export const getOrCreateAnonymousId = () => {
  let anonId = localStorage.getItem('anonymousId');
  if (!anonId) {
    anonId = `anon_${Math.random().toString(36).substring(2, 15)}`;
    localStorage.setItem('anonymousId', anonId);
  }
  return anonId;
};
```
•	ログインしていない（auth.currentUserがいない）ユーザーには、
•	localStorageに一意の匿名IDを保存し（例: "anon_abcxyz123"）、
•	これを使って匿名ユーザーを識別します。
•	既に保存があれば再利用し、新規なら生成して保存。

## 【2】ページビュー記録関数：recordPageView
```recordPageView.js
export const recordPageView = async () => {
  const user = auth.currentUser;
  const userId = user ? user.uid : getOrCreateAnonymousId();

  try {
    await setDoc(doc(db, 'pageViews', userId), {
      timestamp: serverTimestamp(),
      anonymous: !user,
    }, { merge: true });
  } catch (error) {
    console.error('ビュー記録エラー:', error);
  }
};
```
•	Firestoreの pageViews コレクションに対し、ユーザーごとのドキュメントを用意して書き込みます。
•	ドキュメントIDはログイン済みなら user.uid、匿名なら上記の匿名ID。
•	setDoc の { merge: true } で、すでにあれば上書きではなくデータをマージ。
→ つまり最新アクセスの timestamp に更新するイメージ。
•	anonymous フラグで匿名かどうか記録。

## 【3】ビュー数の取得（Headerコンポーネント内）
```Header.js
useEffect(() => {
  const fetchViews = async () => {
    try {
      const collectionRef = collection(db, 'pageViews');
      const querySnapshot = await getDocs(collectionRef);
      setViewCount(querySnapshot.size);
    } catch (error) {
      setViewCount(0);
    }
  };
  fetchViews();
}, [user]);
```
•	pageViews コレクション内の全ドキュメント数を取得します。
•	querySnapshot.size はドキュメントの数＝ユニークユーザー数（ログイン＋匿名含む）となります。
•	取得できたら viewCount ステートにセットして画面に表示。

##  【4】recordPageView() の呼び出し
```App.js
import { recordPageView } from './recordPageView';

useEffect(() => {
  recordPageView();
}, []);
```
•	App コンポーネントの初回レンダー（マウント時）に useEffect で recordPageView() を1回だけ呼び出しています。
•	これにより、ユーザーがページを訪れた（閲覧した）ことをサーバー側に記録します。

## UI

![スクリーンショット 2025-05-25 10.55.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/838195f1-aa49-4ee4-90b4-fe07c508b34a.png)
ハードリンクとシンボリックリンク

Linuxの勉強でリンクの付け方について学んだため以下に記載する。

#### ■ハードリンク

**概要**
- 同じファイルシステム内でファイルの「実体（データ）」に対して別名を付ける仕組み
- 元のファイルとハードリンクは、どちらも同じデータを指しており、どちらか一方を削除してもデータ自体は消えない（リンク数が0になるまで残る）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077009/90f0acf7-bb9b-4fd4-8f32-a535f6f90c3a.png)


**特徴**
- 同じファイルシステム内でのみ作成可能
- ディレクトリには通常作成できない
- 元ファイルとハードリンクは区別できない
- どちらかを削除しても、もう一方からアクセス可能

**例**
```bash
# file1.txt というファイルのハードリンク file1_hardlink.txt を作成
ln file1.txt file1_hardlink.txt
```

---

#### ■シンボリックリンク

**概要**
- ファイルやディレクトリへの「参照（ショートカット）」(長いパスを短くする)を作成する仕組み
- リンクの作成元の指定は**絶対パス！**
- リンク先のパス情報を持つだけなので、リンク先が削除されると「リンク切れ」になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077009/acb9d13d-0b7e-4e09-9fc1-b1cd177e0422.png)


**特徴**
- 異なるファイルシステム間でも作成可能
- ディレクトリにも作成できる
- リンク先のパス情報を持つ
- リンク切れが発生することがある
- `ls -l` でリンク先が表示される

**使用例**
```bash
# file1.txt というファイルのシンボリックリンク file1_symlink.txt を作成（絶対パス）
ln -s /home/user/file1.txt file1_symlink.txt

# ディレクトリのシンボリックリンクを作成
ln -s /home/user/mydir mydir_symlink
```

---

#### まとめ
どちらもファイルにアクセスするための複数の方法を提供する。
ハードリンクは別名を、シンボリックリンクはショートカットを作成する。

| 項目             | ハードリンク         | シンボリックリンク      |
|------------------|---------------------|------------------------|
| 作成コマンド     | ln                  | ln -s                  |
| ファイルシステム | 同一のみ            | 異なるFSも可           |
| ディレクトリ     | 通常不可            | 可能                   |
| リンク切れ       | しない              | する                   |
| パス情報         | 持たない            | 持つ|
| lsでの表示       | 区別できない         | →でリンク先が見える    |
プロデル、調査 その29

# 概要
プロデルが、CLRらしいので、調べて見た。
練習問題やってみた。

# 練習問題
QiitaAPIを、叩け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5e6d61d3-5847-4981-8bfa-c8a0d4e1964a.png)


# サンプルコード

```
「https://qiita.com/api/v2/users/ohisama@github/items?page=1&per_page=4」をHTTPで取得して内容とする
JSON形式として内容を読み取ってWとする
Wの1の「title」を報告する
Wの2の「title」を報告する
Wの3の「title」を報告する
Wの4の「title」を報告する

```

以上。
自分用 ITにわかの用語メモ

# SSH
### 秘密の手紙のやりとりをするための道具
パソコンとパソコンが「こっそりん全に話をする」ための方法。
会社のパソコンから遠くのサーバーに入って作業をするときに使う。
### 実務での使い方
リモートサーバーに安全に接続して操作するためのプロトコル
・サーバーにログインしてコマンドを打つ
```terminal:bash
ssh ユーザー名@IPアドレス
```

# ポートフォワード(ポートフォワーディング)
### 宅配の荷物をちゃんと部屋まで届ける道的な
パソコンに届いた「通信の荷物」を正しい場所(部屋)に届ける仕組み。パソコンの中にはいろいろな部屋があってそれぞれ違うポート番号を持っている。
### 実務での使い方
外部から来た通信を、内部の特定のサーバーやアプリに転送する設定
・sshポートフォワード：ローカルでwebアプリを確認したいとき
・NATポートフォワード：ルーターで特定のポートを社内サーバーに通す

 # RDP
 ### 遠くのパソコンを自分の画面みたいに使う道具
 遠くのパソコンがまるで目の前にあるかのように操作できる
 ### 実務での使い方
 Widowsに遠隔でログインして操作するための仕組み
 ・Windowsサーバの管理や操作時に使う
 ・画面共有のようにサーバー側のGUI操作ができる

 # 仮想環境
 ### 本物じゃないけど、本物みたいに使えるパソコン
 1台のパソコンの中に「別のパソコンの世界」を作って使うこと。
 ### 実務での使い方
 物理的なパソコンではなく、ソフトで作ったパソコンのようなもの
 ・テスト環境として使う(最悪壊しちゃってもいい)
 ・開発環境やサーバー構築の練習用に便利

 # Windows仮想開発環境
 ### パソコンの中にもう一台Windowsのパソコンを作って開発する場所
例えばMacやLinuxのパソコンを使っていても、その中にWindowsっぽい世界を作ってWindows用のソフト開発が出来るようにする。
### 実務での使い方
・開発や検証環境として使う
・社内のWindowsアプリを安全な場所でテストする
読書感想文「入門Terraform_インフラ時代のインフラ統合管理」

# 書籍名「入門Terraform_インフラ時代のインフラ統合管理」
株式会社インプレス
著者：草間一人/伊藤忠司/七尾健太/前田友樹/村田太郎

# 読もうと思った動機
・IaCに興味があり、概要を把握したいと思ったため
・AWSの勉強がてらにちょうど良さそうだと思ったため


# 印象に残った部分

## p17 HCL
HashiCorp Configuration Languageの略。
HCLはTerraformの設定ファイルを記述するためのDSL(Domain Specific Language)と呼ばれるカテゴリの言語です。

## p39 ステートファイル
ファイル名が「terraform.tfstate」というファイル。
Terraformが構築、管理している対象のインフラに関する状態を保存するためのファイルです。

## p47 コラム　手作業で作成したものは、忘れないうちにTerraform化する。

物事が落ち着いたら、実施した手動対応をTerraformにも反映していくことが重要です。
緊急だからといって変更をそのままにしておいた結果、次のTerraformの実行時に差分による支障が生じたり、
変更した事実がチームに共有されず暗黙の知識になってしまったりというケースがよくあります。

## p95 Terraformのメリット
・自動化により、作業の効率化を図れる
・人的なミスを減らせる
・再利用性を高める
・バージョニングが容易になる
・検証可能性を高める

## p131 HCP Terraformとは何か？
・HCPとはHashiCorpCloudPlatformの略で、TerraformをはじめとしたHashiCorpのプロダクトに関するクラウドサービスをまとめて提供しています。
・HCPが解釈する課題
複数人での利用したときに課題
例：terraformのコードの共有方法
　　どうやって、ステートファイルを共有するのか

## p134 HCP Terraformが提供する機能
・ステートファイルの共有と管理
・Terraformコードのリモート実行
・Gitの連携
・パスワードやクレデンシャルなどの管理


## p149 VCSと連携する
HCP TerraformはGithub GitLabなどのVCSのサービスと連携させることで、
コミットがあった際にTerraformコードを自動的に実行するように設定できます。


## p207 プロバイダーのTier

３種類あります。
1.Official Provider
Hashi Corpがサポートする公式のプロバイダーであることが表しています。
例：AWS Azure GCP VMWare


2.Partner Provider
HashiCOrpのパートナー各社によってサポートされるプロバイダー。
パートナー企業がメンテナンスしている。
例：Github Datadog


3.Community Provider
上２つ以外のプロバイダー。
Communityがサポートする。
例：Docker




# 実践できること or 感想

## 感想
・インフラに詳しくない自分でも平易に書かれていて良いと思った。

## 実践すること
・「２章terraformの基本的な操作」を手を動かして確認する
・「３章AWSで始めるTerraform」を手を動かして確認する。（実務で使えるレベルまで理解深めたい）
・「５章HCP Terraformを使ったチーム運用」を手を動かして確認する。（雰囲気だけ体験する）
Chrome Remote Desktop をLinux(Docker)で使うときの注意

- 普通ははまらないがDocker内でX11を動かすとCRDの設定ではまる。
- 原因はrootユーザーしかないこと。

# 手順
1. dockerコンテナにbashで入る。
    - この時はrootのはず。
1. リモートアクセス用のユーザーを作る。
    - adduser remoteuser
    - usermod -aG sudo remoteuser
3. su - remoteuser
3. DISPLAY= /opt/google/chrom... を実行。エラーが出るがきにしなくてよさげ。
【公ド読】単体テストを生成する

【公式ドキュメントを読もうシリーズ】単体テストを生成する

## シリーズ概要

[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## URL

[https://docs.github.com/ja/copilot/copilot-chat-cookbook/testing-code/generate-unit-tests](https://docs.github.com/ja/copilot/copilot-chat-cookbook/testing-code/generate-unit-tests)

## 説明

単体テストを作ってくれる。

## 所感

AIにコーディングを任せると、正確性を担保できない場合があるが、テスト駆動開発を用いながら開発すると、人間のチェックも簡単にできるし、正確性の担保もできるし、良いと思っている。
プロデル、調査 その28

# 概要
プロデルが、CLRらしいので、調べて見た。
練習問題やってみた。

# 練習問題
エクセルを起動して、マクロを実行せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b5be3f41-e823-4019-bd97-db823e533f07.png)

# サンプルコード

```

エクセルを起動する
エクセルで「Book1.xlsm」を開く
対象ブックは、エクセルの選択ブック
対象ブックにある「draw_data」をマクロ実行する


```

以上。
競プロ日記#25/06/06

# AtCoder
## AtCoder Beginner Contest 390
[C - Paint to make a rectangle](https://atcoder.jp/contests/abc390/tasks/abc390_c)
- 解説AC
- 黒く塗られているマスの（x,y）の最大最少をどちらも求める、その範囲内のマスがすべて黒か？かという条件で捜査していく。
→白があったら「No」とする。

## AtCoder Beginner Contest 403
[C - 403 Forbidden](https://atcoder.jp/contests/abc403/tasks/abc403_c)
- queryTypeが3の時は別でboolで管理するとして1の場合はsetを使うべきだった
大会運営用にDiscordでVoiceCommできるNativeアプリを開発しました！

# 😺はじめに
個人開発したRust製Nativeアプリケーションの「DiscordVoiceComm」をリリースしました！🎉
ゲームの大会運営の一助になれば幸いです．

:::note info
[ダウンロードはこちら](https://github.com/Kazuryu0907/DiscordVoiceComm/releases)
`.exe`か`.msi`ファイルをダウンロードし，インストールしてください
:::

導入方法は以下を参照してください．

https://github.com/Kazuryu0907/DiscordVoiceComm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379533/2daeb313-2b74-4d88-af2a-ca2c96d53140.png)

# 😸DiscordVoiceCommについて
**DiscordVoiceComm**はゲームの大会で，実況席から選手のVCを一方的に聞けるようになるアプリケーションです．
これを使うことで，１人だけで２チームのVCを配信上で流すことが可能になります！
RustとTauriを用い，軽量でスレッドセーフを売りにしており，１つの聞き手（実況VC）と２つの話し手（選手VC）を設定可能です．

# 😸特徴
- DiscordのVCを橋渡しするアプリケーションです．
- 選手VCは２つのBotを使用するので，試合中に**入退出が発生しません**．
- Discordの各ユーザーの**音量調節機能を搭載**．スライドバーで視覚的に調整でき，設定値は**自動保存**されます！
- **自動アップデート機能**により毎回exeファイルをダウンロードする必要がありません．

# 😸経緯
僕が所属しているゲーミングチームが主催する大会で使用するために開発しました．

https://x.com/GB_FPS/status/1927681261260226888

圧倒的な運営メンバー不足や，有人で音声を配信クライアントに流すなどの面倒くさい設定が必要なこともあり，今回の開発に至りました．

# 😿開発で躓いたところ
### SongBird
DiscordBotのRust実装である[serenity](https://github.com/serenity-rs/serenity?tab=readme-ov-file)と，VCデータ取得用の[songbird](https://github.com/serenity-rs/songbird)を使用したのですが，`songbird`で取得したPCMデータをどうやって`serenity`で再生すればよいか１週間詰まりました．普通に`.into()`で変換しても，内部で使用している[symphonia](https://github.com/pdeljanov/Symphonia)でCodecが認識されず，GitHubのIssueを見てまわってもそれに関するものは出てこず，試行錯誤を重ねていました．
解決の決定打になったのは，丁度リリースされたばかりの[DeepWiki](https://deepwiki.com/)のおかげでした．DeepWikiはDevinの開発元が開発したPlatformで，GitHubのリポジトリを元に，概要や全体像をまとめ，自動でリファレンスを作ってくれる代物です．ここでDeepWikiのDevinと`symphonia`のPCMデータの再生方法を対話しながら聞くことで，何とか動くものが出来上がりました．**DeepWikiおすすめです**

# 😸おわりに
ここまで見てくださりありがとうございました！
**コードのContributeも歓迎**しているので，よろしくお願いします！
メタ学習の MAML モデルを機械翻訳に適用してみました。

## MAML による機械翻訳の学習を行った動機。

今までに、

https://qiita.com/toshiouchi/items/eb42ab760dcfd279fe60

のページで報告させていただいたように、画像分類、感情分析について MAML モデルを適用しました。少ないデータ量のタスクについて、そこそこの精度が得られたと考えています。次なるターゲットとして、MAML で機械翻訳をやってみようと考えました。タスクは言語です。いろいろな言語についての翻訳を学習させることにより、学習の仕方を学習して、その結果を特定の言語の翻訳の学習に適用するということになります。そこで、「machine translation MAML」でググると、「Meta-Learning for Low-Resource Neural Machine Translation」

https://aclanthology.org/D18-1398.pdf

という論文がヒットしました。かなり参考になりました。
 この論文にあるように、学習データが十分ある言語を含めて MAML で学習した後、学習データの少ない言語について fine-tuningすることにより、学習が成り立つか確かめたいというのが動機です。
 
## 学習言語とデータ数。
　学習データは、
　
http://www.statmt.org/europarl/

のデータを用いました。　
　今回の学習では、フランス語-英語 fr-en 100万センテンスペア、 ドイツ語-英語 de-en 100万センテンスペア、イタリア語-英語 it-en 50万センテンスペアを用いました。fr-en, de-en の学習データが十分にあると考え、it-en の学習データが少ないと考えます。fr-en　100万, de-en 100万を、it-en 50万データを2回登録して数を100万にして MAMLモデルで学習させます。その結果を用いて、it-en 50万センテンスペアで fine-tuning することにより、どの程度の精度がでるか測定しました。
　
## 機械翻訳モデル。
　機械翻訳モデルは、Transformer Encoder-Decoder モデルを用いました。encoder, decoder 各8層なので、LayerNorm の配置は、Pre-LN を採用しました。embedding_dim =768, heads = 12, layers = 8 * 2, feed_forwad_dim = 768 * 4 です。
　
## 辞書と言語埋め込み。
　辞書と言語埋め込みは、1ソース言語1ターゲット言語の機械翻訳と同様に行いました。fr, de, it について、スペースで分かち書きして、ソース辞書を作りました。fr, de, it の単語に言語の区別はありません。ターゲット辞書は en です。出現頻度の低い単語は &lt;unk&gt; としました。特別な単語は、&lt;pad&gt;, &lt;sos&gt;, &lt;eos&gt;, &lt;unk&gt;, &lt;blank&gt;, &lt;mask&gt; です。この結果、ソース辞書の単語数は、49528になりました。ターゲット言語の単語数は、20556 になりました。埋め込みは、ソース言語の埋め込みとターゲット言語の埋め込みを行いました。
　
## 位置エンコーディング
　位置エンコーディングは、Positional Embedding を用いました。

## MAMLによる fr+de+it→en 機械翻訳の学習。

損失と WER の曲線を掲載します。 WER は 20万ステップ（2epoch ）で Train, Val ともに 0.35 程度です。自己回帰的な inference でテストしたテスト結果は、WER が0.594 です。ただし、RTX-A6000 一枚で、20万ステップを学習するのに 12日程度かかりました。

![3LangLoss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/17eda016-beb5-4238-acab-81e19c402fc0.png)

![3LangWER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/eef6bae3-1107-46ef-b3c5-d1dee6134bfd.png)


## MAML 3言語で学習したモデルパラーメーターを初期値にイタリア語-英語 50万センテンスペアで fine-tuning した結果。

損失と WER の曲線を掲載します。WER は 10万ステップ( 3epoch 程度）で Train, Val ともに0.34程度です。自己回帰的な inference でテストしたテスト結果は、WER が 0.589 です。

![FTLoss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/c91cdd12-8682-49ce-b3d7-2c331cb67481.png)

![FTWER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/c20bb2db-c98d-4006-993e-fb1f24c0760b.png)


## 比較のために初期化されたモデルパラメータでイタリア語-英語50万センテンスペアを通常学習させました。

損失と WER の曲線を掲載します。WER は、12万4000ステップ（ 5 epoch ）で 0.4 程度です。自己回帰的な inference でテストしたテスト結果は WER が0.61 程度です。

![OrdinaryITLoss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/5ec816ad-3873-464b-9396-7ed8d070387a.png)

![OrdinaryITWER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/e5038eef-effc-405e-82a3-2079fde92362.png)


## 考察
以上より、データ数の少ない言語について、データ数の多い言語を用いて MAML で学習させることは、データ数の少ない言語のみで学習することに比べて、それほどメリットがないという考察ができます。

## 測定に使ったプログラム

測定に使ったプログラムを

https://github.com/toshiouchi/MAML_NMT

に置いておきます。参考になれば幸いです。
www.oh-my-teeth.comにllms.txtを実装してみた

こんにちは。

テックリードのTerukiです。

今日は今流行りのllms.txtについて書いてみようと思います。

# llms.txt

https://llmstxt.org/

LLMにWebサイトの構造などを読ませたい時に使うみたいなイメージです。

いろいろなサイトに実装されていますが、形式についてカッチリと決まったものはなく各サイトが各々のMarkdownを書いているようです。

# 実装

https://www.oh-my-teeth.com/llms.txt

こんな感じになっています。

Oh my teethの公式サイトはTOPページ部分と/posts配下のブログで分かれているので上の方に公式サイト部分、下の方にはブログの部分を書いています。

ブログの記事データはContentfulで管理されているので、Contentful側を更新すれば自動でllms.txtも更新されるといった流れです。

llms-full.txtというほぼ全文を載せるものもありますが、ブログだけで数百記事ある上にコンテンツも膨大でとんでもないサイズになってしまうので一旦llms.txtのみの実装にしました。

今は1Mトークンも受け入れられるLLMが増えていますがもっと多くのデータを当たり前のように入れられるような世界になったらfullを提供しても良いのかもしれないですね。

まあサイトデータを全部抜くのに便利な機能みたいな感じになってしまうような気が少ししなくもないのですが。。
AWS Invoice Summary API から請求時点のドル円レートを確認できるか試してみる

AWS Invoice Summary API（請求サマリー）が利用できるようになったとアナウンスがありました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/06/aws-invoice-summary-api-generally-available/

API のドキュメントを読んだら、レスポンスに "CurrencyExchangeDetails" という項目を持っており、もしかしたら AWS から送付される PDF の請求書でしか確認できない、請求時点のドル円レートを確認できるのでは？と思ったので、早速試してみました。

# AWS CLI のアップデート

AWS CLI の CHANGELOG を読むと、バージョン 2.27.29 から "Invoicing ListInvoiceSummaries API Operation" が追加されているようなので、まずは AWS CLI を最新版にアップデートしました。

https://raw.githubusercontent.com/aws/aws-cli/v2/CHANGELOG.rst

# Request の JSON を作成

API のドキュメントに沿って、請求サマリーを要求するパラメーターを JSON で作成します。必須項目は "Selector" のみのようですが、とりあえず直近の 2025 年 5 月分だけでいいと思うので、"BillingPeriod" も指定します。

```json
{
   "Filter": {
      "BillingPeriod": {
         "Month": 5,
         "Year": 2025
      }
   },
   "Selector": {
      "ResourceType": "ACCOUNT_ID",
      "Value": "アカウント ID"
   }
}
```

その他のリクエストパラメーターの詳細はドキュメントを参照。

https://docs.aws.amazon.com/ja_jp/aws-cost-management/latest/APIReference/API_invoicing_ListInvoiceSummaries.html

# AWS CLI で Invoicing ListInvoiceSummaries API を呼び出す

AWS CLI から、引数に先ほど作成した JSON を指定して Invoicing ListInvoiceSummaries API を呼び出します。なお、ここでは Organizations の管理者アカウントのクレデンシャルで実行しています。

```console
# aws invoicing list-invoice-summaries --cli-input-json file://作成した JSON ファイルのパス --profile 必要に応じてプロファイルを指定
```

以下のように JSON 形式でレスポンスが返ってきました。

![スクリーンショット 2025-06-07 1.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/db8b3b98-0716-4904-83fb-f6bd9e4e1ba5.png)

![スクリーンショット 2025-06-07 1.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/be178a1e-9186-403d-aa71-134ea404fe66.png)

レスポンスの中に "CurrencyExchangeDetails" という項目があり、USD から JPY への変換レートが出力されていることが分かりました。

ではこれが AWS から送付されてきた 2025 年 5 月分の請求書 PDF に記載されているドル円レートと一致しているか確認してみます。

![スクリーンショット 2025-06-07 2.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/a35d0c9f-e99a-40dd-9b04-fecbb17d3afb.png)

小数点以下までちゃんと一致していました！

# 残念ながらメンバーアカウントでは Invoice Summary API にアクセスできない？

ガバメントクラウドの AWS 環境では、各利用団体はメンバーアカウントとなるため、請求書 PDF が送付されず、請求時点のドル円レートが分からないという問題があります。

もしメンバーアカウントから Invoice Summary API が使えれば、請求時点のドル円レートを確認できるのでは？と試してみました。

![スクリーンショット 2025-06-07 2.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/aa164173-ed1f-4b61-b6bf-dae77bb16c8a.png)

結論から言うと、**メンバーアカウントのクレデンシャルでは Invoice Summary API へのアクセスが拒否されてしまう** ことが分かりました。

SCP で "invoicing:*" をメンバーアカウントに許可したのですが、やはりアクセス拒否のエラーが返るため、予想ですが Organizations 環境だと、ペイヤーアカウントでなければ Invoice API 自体叩けないのではないかと思われます。

これは使えるかもと検証したのですが、またしても Organizations を利用団体で管理できないガバメントクラウドの壁にぶち当たってしまいました。

~~当面共創 PF で高橋名人に個人の請求書 PDF のキャプチャをアップしてもらうしかなさそうです。~~
基礎集合論的「濃度」概念から学ぶ 測度論・位相空間・関数解析とノルム空間

集合論の「濃度（基数）」概念から出発して、測度論・位相空間・関数解析・ノルム空間が、微分方程式の数値解法における収束性や極限操作の入れ替えやデルタ関数の定義に関わる
## 【第0章】導入と全体構造

* 濃度（濃さ）とは何か：有限集合、無限集合、可算無限、非可算無限
* 濃度の数学的定義：集合の間の全単射と基数（cardinality）
* あるすじょんの違い: $\aleph_0 < 2^{\aleph_0}$ の意味
* この濃度が測度、位相、関数空間に与える影響

## 【第1章】集合論と濃度

* 可算集合と非可算集合の例（$\mathbb{N}, \mathbb{Q}, \mathbb{R}$）
* 濃度の大小関係：基数の順序
* 対象集合の濃度と集合操作（直積・直和・冪集合）
* カントール集合とその非可算性

## 【第2章】測度論と濃度

* 測度空間 $(X, \mathcal{F}, \mu)$ の定義
* ルベーグ測度と可算加法性
* 可測集合と非可測集合（バナッハ=タルスキーの逆説）
* 可算性と測度ゼロ集合（例：有理数の集合）
* $L^p$ 空間の構成：可測関数と濃度

## 【第3章】位相空間論と濃度

* 位相空間の定義と開集合系
* 第1可算公理、第2可算公理の意味と濃度
* 可算基を持つ空間の性質：$\mathbb{R}^n$ の例
* 距離空間と位相空間の違い
* ハウスドルフ性と連結性と濃度

## 【第4章】関数解析とノエム（ノルム空間）

* ノルム空間とバナッハ空間の定義
* 可分性と可算稠密集合：$\ell^p, L^p$ の構造
* 有界線形作用素と濃度（Hilbert-Schmidt, Trace class）
* 完備性と濃度：コーシー列と完備距離空間
* フーリエ解析と正規直交基（ONB）と非可算次元

## 【第5章】濃度と空間の近似・離散化

* 有限要素法・差分法：非可算空間の可算近似
* 関数空間のスパース近似：辞書学習・wavelet展開
* 離散的サンプリングとナイキスト周波数
* 離散的測度による近似積分（リーマン vs ルベーグ）

## 【第6章】濃度と工学応用（信号・制御・AI）

* 離散信号と連続信号の濃度的違い
* 状態空間モデルの次元と濃度
* 機械学習：非可算関数空間上の学習とRKHS
* 制御理論：可算モードによる系の制御
* ノルム空間と安定性評価（$L^2$, $L^\infty$ ノルム）

## 【第7章】高度展開：濃度と情報・意味論・論理

* シャノン情報量と可算/非可算アルファベット
* トポス理論と内部論理（集合論の拡張）
* ゲーデルの不完全性と非可算真理
* メディア表現：非可算知覚空間の可算的コード化
* 言語と意味の空間論（意味論的濃度）

## 【補講】可算集合による非可算構造の近似実装（Python演習）

* カントール集合の近似生成
* $L^2$ 空間上の関数を有限基底で近似する
* ヒルベルト空間上でのフーリエ展開の数値近似
* 離散化された測度空間での積分シミュレーション

---
ファイルをマルチストレージ(クラウド)/デバイス環境(PCとスマホ)でどうやって管理するか？

:::note alert
## 結論、という前提
マルチデバイスで使いたいならクラウドストレージ使おう
:::

というのは「それはそう」としか言えないのですが、ここでは「どこのストレージに入れたか分からん！」という状態、いわゆるマルチクラウドストレージでの運用も想定したいので「ただストレージに入れておけばよくね？」では管理上の問題から脱却できないものと仮定します。

## 運用要件
ストレージと聞くと「とりあえずファイルサーバーみたいなもんでしょ？」と思って何も考えずにファイルを突っ込んでおくと後悔するものが結構多い事に気付きます。
以下、一例です。

:::note warn
PCアカウントとスマホアカウントは同一のものを使用するという前提です。
:::

### GoogleDrive
- とりあえずGoogleサービスの恩恵をいっぱい受けたい。スプレッドシートやスライドは言わずもがなとして、Colabとか
  - ニッチだがSiteでの運用もある
  - WorkSpaceを使う余地も欲しい
  - 最近はNoteBookLMも活用したい
    - `今回はここを採用。後述`
- 当初は捨て垢的に使っていたGmailがバックアップアドレスから実質本垢みたいになりつつある

### OneDrive
- Windowsのバックアップのために使いたいので、Windowsのアカウントごとに無料アカウントを作っておいた方がディスクサイズを気にせず使える
- 特にMicrosoftアカウントは色々なところで連携して使いたい事が多すぎる
- Windows11の仕様かデフォルト設定か、OneDriveと連携されてしまうので常用アカウントとは絶対に分けたい
  - メールボックスと連携していると面倒

### iCloud
- OneDriveと同じ理由。Mac版

### Tips: GitHub(GitLFS)
- バイナリファイルも含むが、メガファイルをとりあえず置いておく場所として実は優秀
  - ただし、一時的に格納する場所として運用する前提にしておくことを留意しよう
- 様々なアプリケーションやサービスとの連携に強い
  - ローカルノート（Obsidianなど）を使う場合、運用方法によって画像やmd以外のファイルを扱いたい場合もある
  - Claude Desktopを使う場合、リポジトリのファイルをソースにすることができる
    - PDFや画像ファイルも読み込むことができる（詳細不明。一部のみ確認）

### その他
いわゆる、何のしがらみもなく普通に使えるファイルストレージ。本来想定していたもの。
細かいですがDropboxなどちょっとしたシステム連携に強いものもありますが、基本的にここではそういった「何かと連携させる」という機能がない、使わない想定で考えていきます。
先述したものは「連携させて使う」という想定であり、ファイルストレージというよりはインターフェースとしての面が強いものになります。

## 本稿での運用
ここでは、Linux標準教科書シリーズを例にします。
今回はNotebookLM(GoogleDrive)を採用しました。

---

:::note
## NotebookLMを採用する理由
- PDF内の検索が可能、または使いやすい
- PDFの要約用のAI（Gemini）が優秀
- 完全無料
:::

:::note warn
ただし、NotebookLM自体が扱えるファイルタイプ・拡張子がかなり限定的なので、状況により採用できないケースがあることは留意しておきましょう。
:::

マルチデバイスで活用できるのも大きい！
（要モバイルアプリ）

### 運用面の恩恵と展望（私にとっては本題）
NoteBookLMの活用・運用の話です。

「LinuCレベル1-101勉強会の参加者から質問・相談をいただく事がある」ため、回答の壁打ちのために情報ソースを正しく理解できるAIの存在はありがたすぎる！というのもありました。
また、質疑応答のために議論した結果すらも情報ソースとして保存できるため、なんちゃってカスタマーサポート風の運用もできます。
教材そのものを基点のデータとしつつ、たとえば質疑応答のメモや教材開発プロジェクトでの議論をこのプロジェクトの中に入れていくと「教材開発者としての意見」と「勉強会での運用」を兼ねて活用していくことができます。

AIと壁打ちした記録も、AIが出力した生成結果も、様々な場でやりとりした記録も、そしてこの記事自体もNotebookLMにソースとして集約することで、対応品質の向上を促していくという目的にはNotebookLMは便利すぎました。
後半はNotebookLMを採用すると決めた後に、NotebookLMを使って効果を最大化するための方法を後付けしていますが、Googleサービスと連携できると色々と都合が良い事が多いのです。

なお、普段はObsidian + GitHub + GitHub Pages + GitHub Actionsで勉強会で即レポ書いて、ついでにサイト作りにも対応させるフローを確立させています。
これとGoogle Driveをローカルで連携しているので、将来的には書いた記事（原稿）をローカルLLMを経由させてPodCastやらAITuberあたりに紹介・解説させる事も完全無料でできそうだな、とぼんやり考えています（が、手が回らない…！）

こういう運用はMCPサーバーを立ててやった方が良いのかしらン。

## 番外
リンク集とダウンロードの方法は別記事にまとめました。

https://qiita.com/nomurasan/items/6b5895a1fe6c21397f59
Geminiでイルカと遊ぶ魔法少女を描いてみた。

# 概要

Geminiでイルカと遊ぶ魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
聖なるイルカと遊ぶ魔法少女を描いてください。
```

![聖なるイルカと遊ぶ魔法少女_20250607.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/ee4deb09-edb6-4852-9ac1-f81a2df59fdb.png)

# まとめ

何かの役に立てばと。
WSL2(Ubuntu24)にClaude-Codeのインストール

claude-codeのインストールコマンドが通らなくて困っている

```
npm install -g @anthropic-ai/claude-code
```

どうやらnpmのパスがWindowsの物を参照してしまっているらしい。
WSLにnpm関連をインストールしなおすことで対処したいと思う。

1. nvmをインストール（まだなら）
```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
```

1. シェルを再起動後
```
source ~/.bashrc
```

1. Node.jsの安定版をインストール
```
nvm install --lts
```

1. 使いたいバージョンを選択
```
nvm use --lts
```

1. npmのパスを確認
```
which npm
```

1. 再度インストール試す
```
npm install -g @anthropic-ai/claude-code
```

いんすとーるかんりょ
WSL2環境のUbuntuを20⇒22⇒24に段階的にアップグレードする。

# 目的
WSLのバージョンアップを行う。

# 作業概要
Windows11で動作するWSL2のUbuntu20.04.6を上げれる最新バージョンにアップデートする。

## 作業環境
| 項目 | 値 |
| :---: | :---:|
| ローカルPC | Windows11 |

## 必要なもの
* WSL2で利用できる最新バージョンの確認
* Visual Studio Code

## 必要な知識
* Linuxコマンドの実行方法

# 作業内容
## 作業順序
1. 準備
1. バージョンアップ
1. 動作確認　

## 作業1
1. Windows11上でwsl2をクリックして起動する。
1. 以下のコマンドを実行し、vscodeに接続
    ``` bash
    # code -n .
    ```
    
1. バージョンが「20.04.6 LTS (Focal Fossa)」であることを確認
    ``` bash 
    # cat /etc/os-release
    ```

1. パッケージの最新化
    ``` bash
    # sudo su - 
    # apt update && sudo apt upgrade
    ```

1. ディストリビューションアップデート
    ``` bash
    # apt dist-upgrade && apt install update-manager-core
    ```

1. 不要パッケージの削除
    ``` bash
    # apt autoremove -y
    # apt autoclean -y
    ```
1. 「Prompt=lts」であることを確認
    ``` bash
    # cat /etc/update-manager/release-upgrades
    ```

1. アップグレード実行
    ``` bash
    # do-release-upgrade -d
    ```

- 作業失敗
    ``` bash
    Checking for a new Ubuntu release
    Upgrades to the development release are only 
    available from the latest supported release
    ```

どうやら、WSL環境は通常の環境と違うためうまく動いてくれないらしい。

## 手動でアップデート
1. ソースリストを編集
    ``` bash
    # sudo sed -i 's/focal/jammy/g' /etc/apt/sources.list
    # grep jammy /etc/apt/sources.list
    ```
1. リポジトリの更新とアップグレード
色々と対話処理があるため、適宜調査して対応する。
    ```
    # apt update
    # apt upgrade -y
    # apt dist-upgrade -y
    ```

1. 不要パッケージ削除
    ```
    #  apt autoremove -y
    ```

1. バージョン確認
    ```
    # cat /etc/os-release 
        ...
        VERSION="22.04.5 LTS (Jammy Jellyfish)"
        ...
    ```

20⇒22のバージョンアップ完了

## Ubunt22 ⇒ 24のバージョンアップ
1. 事前にきれいにする。
    ``` bash
    # apt update
    # apt upgrade -y
    # apt dist-upgrade -y
    # apt autoremove -y
    ```

1. ソースリストの書き換え
    ```
    # sed -i 's/jammy/noble/g' /etc/apt/sources.list
    # grep noble /etc/apt/sources.list
    ```

1. アップグレード
    ```
    # apt update
    # apt upgrade -y
    ```

1. 失敗したため、以下コマンドを実行
    ```
    sudo apt --fix-broken install
    ```
1. なんかうまくいった
    ```
    # apt upgrade -y
    ```
1. そして失敗
    ```
    # apt dist-upgrade -y
    ```
1. Postfix周りの設定をガチャガチャする。
    1. 再インストールとか
    1. コンフィグ書き換えとか。

1. wslを再起動する。

1. 再アクセス後にバージョン確認

アップデートできてたので、おわり。

# おしまい
めんどいので、アンインストールして再インストールとかにすればよかった。
あと、やっぱりWSL環境のため通常のLinux環境では出力されない想定のエラーとか出ていて焦る。
が、動いていないことが正常らしいエラーも多々あるので、都度調べながら対応すれば何とかなるかも。
bitbucketリポジトリから100MBを超えるファイルをLFS対応してgithubに引越しする

https://bitbucket.org/ で 100MB を超える大きなファイルを
そのまま git に commit するやんちゃな運用をしていたリポジトリを
https://github.com/ に移設するため LFS 対応したときの手順です。

Bitbucket とは異なり、Github は1ファイルあたり100MBの制限があるので、
巨大なファイルを格納していたリポジトリを引越す場合は、 [LFS](https://docs.github.com/ja/repositories/working-with-files/managing-large-files/about-git-large-file-storage) を利用する必要があります。

手順は以下の通り。

```shell
# macOS の場合
brew install git-lfs

# 全体設定で Git LFS を有効化
git lfs install

# リポジトリ名
REPO=my-repository
ORG=my-github-organization

# 事前に clone しておいたローカルのリポジトリに移動する
cd $REPO

# github を remote に登録する
git remote add github git@github.com:$ORG/$REPO.git

# 10MB 以上の大きなファイルを探す
git rev-list --objects --all \
  | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
  | awk '$1 == "blob" && $3 > 10000000 { print $3, $4 }'  | sort -rn | head

# もし、100MB 以上のファイルがなければ、LFS 化も必須ではないから、そのまま mirror して終了
# git gc && git push github --all  && git push github --tags

# LFS 対象のファイル名を指定する（例：すべての *.zip を LFS 化することにした場合）
NAME="*.zip"

# ① 初めて .zip ファイルを含んでいる最初のコミットを探す
FIRST=$(git log --diff-filter=A --reverse --pretty=format:%H -- "$NAME" | head -n 1)
echo FIRST=$FIRST

# ② その1つ前のコミット
PARENT=$(git rev-parse $FIRST^)
echo PARENT=$PARENT

# ② → ①のコミットログを確認する
git log $PARENT^..$FIRST

# ② → ①のときに変更されたファイル名を確認する
git diff --name-only $PARENT $FIRST

# ①以降のコミットをすべて書き換えて、履歴中の全ての .zip ファイルを LFS 化する（コミットIDが変わる）
git lfs migrate import --include="$NAME" --exclude-ref=$PARENT --include-ref=HEAD

# もし、①がルートコミット（親がないコミット）だった場合は、全コミットに対して .zip の LFS 化を実行する
# git lfs migrate import --include="$NAME" --everything

# LFS 化したファイルを確認する
git lfs ls-files --all --size

# github に push する
git gc && git push github --all  && git push github --tags
```

（備考）
- `--everything` だと、全てのコミットのコミット ID が変わる。
- `--exclude-ref=$PARENT` を使えば `$FIRST` 以降のコミット ID だけが変わる。
- 上記手順で bitbucket → github 移設できるようになったものの、そもそも、100MB を超えるファイルを git で扱うと、ローカルの端末のディスク容量も大きく消費してしまうから、できれば、そうした運用は避けたい。（今回は、昔に作ったリポジトリのアーカイブを移設していました）

---

（参考）GitHub と Bitbucket の比較（2025年6月現在）

| 項目 | GitHub | Bitbucket |
|---|---|---|
| Free プラン | ◯ あり | ◯ あり |
| 安い有料プランの月額料金 | △ 1人あたり$4.00 | △ 1人あたり$3.30 |
| 有料プランの最低月額料金 | ◯ $4.00（1人分〜）| ◯ $16.50（5人分〜）|
| 1ファイルあたりの制限 | △ **ファイルあたり100MB** | ◯ 制限なし |
| Free プランの容量制限 | ◯ 制限なし？ | △ **Workspaceあたり1GB** |
| 有料プランの容量制限 | ◯ 制限なし？ | ◯ 制限なし？ |
| Free プランのLFS容量制限 | ◯ 10GB | △ 1GB |
| 安い有料プランのLFS容量制限 | ◯ 250GB | △ 5GB |
| LFS容量の追加購入| ◯ 1GB あたり $0.07 | △ 100GB あたり $10.00 |
IRQ1（キーボード割り込み）によるHLT復帰の検証

## 「手探りでCUI OS作成に挑む」連載
この記事は「手探りでCUI OS作成に挑む」連載の一部です。
全体の目次は[「手探りでCUI OS作成に挑む」連載目次](https://qiita.com/earthen94/items/b5d77f98f0cf85a13346)を御覧下さい。

## 目的
将来のBIOS開発に備え、割り込みの基本動作を可視化して理解を深める。
一旦HLTでCPUを止め、キーボードで任意のキーを押すとPICから割り込みが発生しCPUが再び動き始める筈である。
TESTの文字が画面に表示されることで、割り込みが発生したことを目視で確認できる。

## 検証コード
起動直後に他の割り込みが発生し、HLTで止まったままにならず、すぐに再開してしまうのを防ぐため、IRQ1（キーボード）のみを有効にした。
```
org 0x7C00
bits 16

    xor ax, ax
    mov ds, ax
    mov ss, ax
    mov sp, 0x7C00
    
    ; 0xFD = 11111101（IRQ1のみ0にする。0:有効 1:無効）
    mov al, 0xFD     
    out 0x21, al

    sti
    hlt

    mov si, teststr
    call print_string

    jmp $

print_string:
    push ax
    mov ah, 0x0E
.print_loop:
    lodsb
    or al, al
    jz .done
    int 0x10
    jmp .print_loop
.done:
    pop ax
    ret
    
teststr db 'TEST',0x0D,0x0A,0

times 510-($-$$) db 0
dw 0xAA55
```

## 動作確認
コンパイルしてコンパクトフラッシュへ書き込む
```
nasm -f bin boot.asm -o boot.bin
sudo dd if=boot.bin of=/dev/sdc bs=512 count=1 conv=notrunc
```
どうしてもGIFのアップロードに失敗するので写真を貼る。
始めは何も表示されておらず適当なキーを押すと割り込みが発生してHLTを抜けることが確認できた。

**起動直後**
![9aadb475b24b1ee8906702b8d3a740d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/0eb71c87-5192-4eb2-8bc1-b20a123f3ef5.jpeg)
**キー押下後（TESTが表示され、HLTから復帰した）**
![5703a365de34f051c0569bdae02c9a0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/b652114e-7b53-4f2a-bb0f-f13b89a0cfb8.jpeg)

## 最後に
今後はIVTを変更し割り込みの処理も自分で実装する予定