OmniAICreator/Qiita-1.07M huggingface dataset:
文字列処理：日時分解　　おまけ：イベントリスナー

今回は文字列処理の日時データの変換問題を解いたから解説！
おまけで今回はイベントリスナーについて勉強してみた！

🔍問題概要

`yyyy/MM/dd hh:mm` の形式で与えられる日時を、以下の順で出力

入力される値：
```
yyyy/MM/dd hh:mm
```
期待する出力：
```
yyyy        
MM      
dd      
hh      
mm
```

https://paiza.jp/works/mondai/string_primer/advance_step3

## <br>💻コード例

```js
const rl = require('readline').createInterface({ input: process.stdin });

rl.on('line', (input) => {
    const parts = input.split(' ');      
    const date = parts[0].split("/");       
    const time = parts[1].split(':');     

    [...date, ...time].forEach(val => console.log(val));

    rl.close();
});
```

### ✏簡単に解説

- 入力を空白で2つに分ける → `date` と `time`

- それぞれ `/` と `:` でさらに分解
- スプレッド構文で日付と時間の配列を結合し、1つの配列にまとめて、 `console.log` で出力

<br><br><br>
# おまけ：イベントリスナーについて

今回のように、標準入力が 1行だけで完結しているケースでは `once` の方がベスト。
```js
rl.once('line', (input) => {
  const [date, time] = input.split(' ');

  [...date.split('/'), ...time.split(':')].forEach(val => console.log(val));
  
  rl.close();
});
```

## <br>✅ rl.once('line', ...) を使うとスマートな理由

### 🔍 .on()と.once()の違いまとめ
![スクリーンショット 2025-05-01 142630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018208/2844241c-ee40-4b76-9c61-d04fa4b0bcdd.png)



### ✅ .once()がスマートな理由

- `.on()` でも `removeListener` / `off` でリスナー削除可能だが、`.once()` は自動削除でシンプル。

- `.close()` は1回実行後にすぐ呼び出すのが自然で、タイミングが明確。
- 「1回だけ」の意図がコードで読みやすい。

※ `.once` は `on` + `removeListener` を1行で実現。

## <br>🛠 JavaScriptのイベントリスナーってなに？

イベントリスナーって、ざっくり言えば、

「イベントが起きたときに動く関数を登録する仕組み」。


### <br>🔁 readline の例で見るイベントリスナー

Node.js の `readline` モジュールでも、同じ仕組みが使われている：

```js
rl.on('line', (input) => {
    // ユーザーが1行入力するたびにこの関数が実行される
    console.log(`入力：${input}`);
});
```
この `on('line', callback)` は
👉 「ユーザーが1行入力したら `callback` を呼んでね！」という イベントリスナーの登録！

### <br>💡 重要なポイント

イベントリスナーとは？： イベントが起きたときに実行される関数を登録する仕組み

例： `click` , `load` , `line` , `data` , `error` , `close` など

目的： イベント駆動型のプログラムを作る（待ち構えて反応する）

## <br>.addEventListener （ブラウザ向け、HTML・DOM）

どこで使う？
ブラウザ上で、ボタンやフォーム、画面の要素に対して使う。
```js
 element.addEventListener('click', () => {
     console.log('クリックされた！');
 });
```
特徴:

- 同じイベントに複数個リスナーを登録できる
- 登録したイベントをあとで削除（`remove`）できる
- ブラウザの標準的なイベントリスナーの登録方法

## <br>.on （Node.js 向け、サーバー・バックエンド）

どこで使う？
Node.jsで、`readline`、httpサーバー、ファイル操作などのイベントを持つオブジェクトに対して使う。
```js
server.on('request', (req, res) => {
    res.end('Hello World');
});

rl.on('line', (input) => {
    console.log('ユーザーが入力した:', input);
});
```
特徴:
- イベントドリブン（＝イベントが起きたら動く）なプログラムを作る
- `.on()` と `.once()` はどちらも `EventEmitter` の標準メソッドで、用途に応じて使い分ける

## <br>イベントリスナーの基本：

✅ ブラウザでは、DOM要素（例: ボタンやフォーム）のイベントを扱うために `.addEventListener` を使用する。


✅ Node.jsでは、EventEmitterベースのイベント（例: 入力やサーバーリクエスト）を扱うために `.on` や `.once` を使用する。
<br>

ただし、Node.jsでも puppeteer（ヘッドレスブラウザ）や jsdom（仮想DOM環境）のようなDOM互換環境では`.addEventListener` が使われる場合がある。

用途に応じて適切なメソッドを選ぼう！

<br>

![スクリーンショット 2025-05-01 142750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4018208/e0c46f45-3545-48cb-8dde-7d4a0928c76c.png)

補足: 両者とも複数リスナー登録可能。`.once()`は自動削除で管理が楽。


<br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/about/)
【Python】VS Codeで外部ライブラリのimport時にModuleNotFoundErrorが出るときの解決法


VS Codeのメニュー
Code > 基本設定 > 設定 を選択
![スクリーンショット 2025-05-03 17.50.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733459/7dcf8fda-ea9a-445d-9d96-b6007d7d40af.png)

表示されたタブの「設定の検索」欄に「extra path」と入力。
表示された中から「Python › Analysis: Extra Paths」の「項目追加」を押下して以下を追加する。

```
/Users/{ユーザー名}/.pyenv/versions/**/lib/**/site-packages
```

![スクリーンショット 2025-05-03 17.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733459/23a69963-6720-47b0-9c2c-fb3aad4bfca2.png)

pyenvのバージョンを追加しても、これなら追加で設定しなくてもOK。
JavaのOptionalのアンチパターン

# はじめに

Optionalをnullを明示するための手段くらいにしか考えていなかった過去の私が書いていた残念コードを、アンチパターンとして記載します。

# アンチパターン

## アンチパターン(1)

Optionalで受け取っているのに、戻り値をnullにしてしまっている。

``` java
public static String toUpperCase(Optional<String> str) {
    if (str.isPresent()) {
        return str.get().toUpperCase();
    }
    return null;
}
```

## アンチパターン(2)

isPresentを使って、わざわざ判定をしている

``` java
public static Optional<String> toUpperCase(Optional<String> str) {
    if (str.isPresent()) {
        return Optional.of(str.get().toUpperCase());
    }
    return Optional.empty();
}
```

# 正しい書き方

mapメソッドを使って、Optionalのまま変換処理をする

``` java
public static Optional<String> toUpperCase(Optional<String> str) {
    return str.map(String::toUpperCase);
}
```

Javaのサンプルコード全文

``` java
import java.util.Optional;

public class OptionalSample {

    public static Optional<String> toUpperCase(Optional<String> str) {
        return str.map(String::toUpperCase);
    }

    public static void main(String[] args) {
        final Optional<String> optional = Optional.of("hoge");
        System.out.println(toUpperCase(optional).get()); // HOGE
        final Optional<String> optional2 = Optional.empty();
        System.out.println(toUpperCase(optional2).orElse("abc")); // abc        
    }
    
}


```


# 補足

JavaのOptional型は、関数型プログラミング言語に端を発するものです (Option型やMaybe型と呼ばれる)。
関数型プログラミング言語では、手続き的ではなく宣言的に記述します。
すなわち、アンチパターンで書いたような、if文を用いた手続き的な処理をできるだけ排して書けるようになっているはずです (もちろん、Javaは手続き型の言語なので、100%命令的に書くのは難しいですが)。
Optional型を使う場合には、関数型プログラミング的に書くことを意識できるとよいですね。
WSLでPython開発環境を整える手順

## 1. Ubuntuでパッケージ情報を更新する

```bash
sudo apt update
```
※ sudo は「管理者権限で実行する」という意味

## 2. Pythonをインストール（Linux内）
```bash
sudo apt install python3 python3-dev python3-venv
```

3. プロジェクト内に仮想環境（venv）を作成
まず、プロジェクトディレクトリに移動してから作成します。
```bash
cd your-project
python3 -m venv env
```
python3 -m venv envは、プロジェクトごとに独立したPythonの仮想環境（venv） を作成するためのものです。
| 部分       | 意味                                                                                 |
|------------|--------------------------------------------------------------------------------------|
| `python3`  | Python 3 を使ってコマンドを実行する（WSLやUbuntuでは `python` ではなく `python3` を使うのが一般的） |
| `-m venv`  | Pythonに組み込まれている `venv` モジュールを使う。`venv` は仮想環境を作るための標準ツールです。 |
| `env`      | 仮想環境の名前（＝作成されるフォルダ名）。一般的に `env` や `venv` と名付けることが多い。         |


仮想環境を有効化します：
```bash
source env/bin/activate
```

## 4. ライブラリのインストールと確認
依存関係のインストール
```bash
pip install -r requirements.txt
```
※ requirements.txt に記載されたライブラリを一括でインストールします。

インストール済みライブラリの確認
```bash
pip freeze
```


✅ 補足：venv（仮想環境）とは？
python3 -m venv env を実行すると、プロジェクト内に env/ という仮想環境フォルダが作られます。
仮想環境を有効にすると、そのプロジェクトだけにライブラリをインストールできるようになります。
仮想環境を有効化（source env/bin/activate）する際は、プロジェクトの直下にいる必要があるので注意しましょう。
CloudWatchの用語についてまとめてみた

## はじめに
CloudWatchはAWSサービスのメトリクスを蓄積するためのメトリクスリポジトリサービスです。
CloudWatch独自の用語で一般的には聞きなれない用語が多いため整理のためにまとめてみました。

## CloudWatchの用語
AWS公式サイトには以下の用語が記載されています。
・名前空間
・メトリクス
・ディメンション
・解像度
・統計
・パーセンタイル
・アラーム

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html

### 名前空間
名前空間とはCloudWatchメトリクスのコンテナです。
CloudWatchのコンソールから「メトリクス」をクリックした際に最初に表示される情報です。
名前空間には以下の種類があります。

| 名前空間の種類 | 説明 |
|:-|:-|
|AWS名前空間| デフォルトで収集されるAWSサービスのメトリクスが集約されています。  |
| カスタム名前空間 | デフォルトでは存在しないメトリクスです。<br>新規でメトリクスを作成する際などに指定する必要があります。  |


### メトリクス
CloudWatchに発行された各データポイントのセットを指します。
一般的にCloudWatch Metricsなどと表現します。
AWSサービス利用時にデフォルトで出力される無償の標準メトリクスとCloudWatch Agentなどから抽出したデータを利用するカスタムメトリクスの２種類があります。

### ディメンション
集計方法の切り分け方法を指します。
インスタンス別メトリクスやボリューム別メトリクスなどが該当します。
コンソールで説明すると名前空間を選択した後に表示される選択画面がディメンションの一覧となります。

### 解像度
各メトリクスのデータポイントの時系列ごとの頻度を指します。
解像度には以下があります。
・頻度が分単位のメトリクスである標準の解像度
・頻度が秒単位のメトリクスである高解像度(1秒、5秒、10秒、30秒)

AWSサービスから生成された標準メトリクスはデフォルトで標準の解像度となります。

### 統計
メトリクスデータを指定した期間で集計したものです。	

### パーセンタイル
特定の割合のデータがその値以下であることを示す統計的な指標を指します。
平均値だけを見ると一時的なスパイクに引っ張られてしまうため全体的にみた使用率の評価などに利用されます。

### アラーム
メトリクスの監視結果をもとになんらかのアクションを実行できる機能です。一般的にCloudWatch Alarmと呼称されます。
代表的な使用方法は、閾値を設定しておき、メトリクスが継続的に閾値を超えた場合にSNSトピックに通知したりAuto Scalingを起動するために利用されます。

## まとめ
今回はCloudWatchの用語についてまとめました。
聞きなれない用語やなんとなく利用している画面の名称などの理解を深めることができました。

次回はCloudWatch Logsについてまとめてみます。
なぜ日本語はプログラミングに向いていない（と誤解されやすい）のか？

# はじめに
日本語はプログラミングに向いていないと誤解される理由はいくつかあります。多くは自然言語の日本語や英語と形式化されて構造化された言語のプログラミング言語をやや混同して考察することを由来とします。また、実装する側の視点でしかプログラミング言語をみない場合は半角英字記号文字のコンピューター言語が至上で無二となります。

まず、自然言語の固有の文法や表現が複雑な場合、これをプログラミング言語に落とし込むのは難しいとする誤解があります。また、文字種が多い場合、たとえば漢字や仮名の使い分けが煩雑であり、プログラミングコード中での入力が面倒となるという風説があります。さらに、ドキュメントの言語とプログラミング言語の言語を混同して英語圏との情報共有が困難であり、技術者間のコミュニケーションにおいて制約を生じる可能性があるという誤解があります。あたかも、抽象的な概念の表現や文字コードの問題があるとして、日本語をプログラミングに用いることにはさまざまな課題があるとするオピニオンに反証を試みるのが本記事の主題です。

# 固有の文法や表現が複雑？
日本語がプログラミングに向いていないと言われる一つの理由に、その固有の文法や表現が複雑であることと言われることがあるようです。日本語には独特の敬語や謙譲語、尊敬語などがあり、これらを適切に使い分ける必要があります。たしかに、それはありますが、．．

しかし、それはプログラミングの本質ではありません。プログラミング言語は機械的な処理のしやすさと人間が読み書きしたときに認知能力の限界を超えない程度の形式化との間でバランスをとったものです。たとえば、日本語プログラミング言語Mindはごく一部のひらがな以外を無視することで日本語独特の敬語や謙譲語のゆらぎを排除することに成功しています。逆にこの特性をつかってソースコードの遊びとして「お嬢様コーディング」のような冗長で多様な表現を行いながら、定義の一意性を担保しています。

日本語話者がプログラミングを学ぶ際には英語の理解が必須となるという風説も少なくないようです。しかし、多くのプログラミング言語は英語ではなく英字記号を使った形式言語ですので、日本語話者に必要な文字識別能力は義務教育の範囲内のローマ字となるだけで、英文法を認識しながらプログラミング言語のソースコードを解釈することはかなり稀です。

# 漢字や仮名の使い分けが煩雑？
プログラミングの際には正確な単語や記号の入力が求められますが、漢字や仮名の使い分けが間違ってしまうとエラーが発生しやすくなると思われている場合があるようです。

このあたりは日本語プログラミング言語の仕様にもよりますので、日本語がプログラミングにむいていないとする根拠としては決定的ではありません。さきに述べましたように、ひらがなはだいたんに無視する日本語プログラミング言語処理系も実在しており、ひらがな助詞の指定まで厳密さを要求するかどうかは日本語プログラミング言語設計者の設計によるものです。

漢字自体はある意味QRコードのようなもので横文字系のバーコードよりも正方形の中に情報が多く含まれており、半角英字で横に長くタイプする際のタイプミスと、英字にくらべれば横文字数の少ない漢字・日本字でタイプしたときのタイプミスとの発生具合はそれぞれの文字の識別能力や慣れによることも多く、文字種としての大差はないと考えられます。

また、文字数が絶対的に多い漢字ですが、日本語プログラミング言語のシステム予約語に使われている漢字の語彙は限定的で、すべての漢字が網羅的に使われているわけではありません。

# 英語圏との情報共有が困難？
プログラミングにおけるコミュニティやオンラインフォーラムも英語圏が主流です。これは誰もが否定しない事実です。日本語圏での情報収集や意見交換は限定されることが多く、情報の遅れや断絶が生じることもありますが、今日は機械翻訳の精度も向上し英語圏の情報もHTMLやマークダウンなどのテキスト情報であれば、母国語に翻訳して読むことができます。

将来的にはこんにちの海外での日本語人気の影響を受けて、海外発の日本語プログラミング言語プロジェクトの登場も完全に否定はできません。英語で記述されたドキュメントで開発された日本語プログラミング言語の登場を決定的に妨げる理由は存在しません。
日本発のプロジェクトであっても、リポジトリのドキュメントの言語を英語にすれば、海外からのコントリビュータの参入を妨げることにはなりません。

# 抽象的な概念の表現が難しい？
プログラミングでは、論理的な思考や抽象的な概念を正確に表現する能力が求められることに対して、日本語は主語や動詞、目的語などが厳密に決まっていないため抽象的な概念を正確に表現する際には語彙や構文が限られるため、プログラミングに向かいないと考えられる誤解もあるようです。

どのような自然言語にも文学や文芸が成立する以上、完全に機械的で一意に表現することしかできなくなったら、人間同士のコミュケーション用途としてはあじけないものになってしまうでしょう。日本語プログラミング言語という実装が実在する以上、一定の形式化や構造化を行えば十分に論理的で実装論理的で一意な手順やその抽象化まとめを表現することは実は可能です。



# おわりに
いかがでしたでしょうか？みなさまのご認識に一石を投ぜられたなら幸いです。

まさにコンピュータとだけではなく、また、そのプログラミング言語に精通した者同士すなわち当該言語プログラマ同士だけではなく、さまざまなステークホルダーの人間に対してコミュニケーションし、あなたの実装のコンセプトを一意に伝達するには、構造化された母国語言語が人間脳にとって無理がないとわたしは考えております。
MakefileとCMakeの違いを理解する

# 概要
MakefileとCMakeがどういうものなのか、C++で簡単なサンプルを使って理解する。
＜サンプル内容＞
test1：シンプルにビルド
test2：Makefileを使ってビルド
test3：CMakeを使ってビルド

# test1：シンプルにビルド
~~~:フォルダ構成（ビルド前）
test1
└── foo.cpp
~~~
test1フォルダに、foo.cppファイルを作成する
~~~foo.cpp
#include <iostream>
int main(){
    std::cout << "Hello world!\n";
}
~~~

コマンドからg++でビルドする。
実行ファイル（main）ができて、実行すると”Hello world”が表示される。
~~~:コマンドライン
$ g++ foo.cpp -o main
$ ./main
Hello world!
~~~

コマンド実行後のフォルダ構成
~~~:フォルダ構成（ビルド後）
test1
├── foo.cpp
└── main
~~~
とてもシンプル。

# test2：Makefileを使ってビルド
~~~:フォルダ構成（ビルド前）
test2
├── foo.cpp
└── Makefile
~~~

次はtest2フォルダに、foo.cppとMakefileを用意する。
（foo.cppは、test1と同じなので省略）
~~~:Makefile
OBJS = foo.cpp
PROG = main

$(PROG):
	g++ $(OBJS) -o $(PROG)
~~~

コマンドからmakeと打つことで、Makefileが実行される。
できあがったmain（実行ファイル）を実行すると、”Hello world”が表示される。
~~~:コマンドライン
$ make
$ ./main
Hello world!
~~~

コマンド実行後のフォルダ構成
~~~:フォルダ構成（ビルド後）
test2
├── foo.cpp
├── Makefile
└── main
~~~

makefileは別にビルド専用ではないのでいろいろ使える（意外と便利）


# test3：CMakeを使ってビルド

~~~:フォルダ構成（ビルド前）
test3
├── foo.cpp
├── CMakeLists.txt
└── build
~~~

test3フォルダに、foo.cppとCMakeLists.txtを用意する。
test3フォルダに、buildフォルダを作成する。
（buildフォルダは、ビルドの結果できる生成物を格納するためのフォルダ。
　なお、foo.cppは、test1/test2と同じ。）
~~~CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(test3 CXX)
add_executable(main foo.cpp)
~~~

コマンドからbuildフォルダに移動して、cmake ..を実行する。
上の階層のCMakeLists.txtの内容に従って、buildフォルダにmakefileが作成される。
次にmakeを実行すると、作成されたmakefileを使ってビルド実行する。
最後に実行ファイル（main）を実行すると、”Hello world”が表示される。

~~~:コマンドライン
$ cd build
$ cmake ..
$ make
$ ./main
Hello world!
~~~

コマンド実行後のフォルダ構成（ビルドフォルダには、他にもファイルできる）
~~~:フォルダ構成（ビルド後）
test3
├── foo.cpp
├── CMakeLists.txt
└── build
　　　├── makefile
　　　└── main
~~~

＜ポイント＞
・CMakeは、MakeLists.txtの内容に従って、実行環境にあわせたmakefileを作る。
・CMakeしたあとに、makefileを実行させるので、makeが必要になる。
この辺りが、よくわかっていなかった。
オプションなどがたくさんつくとわかりにくいが、理解すればシンプルかも。
WSL2 で Linux から Windows 側ファイルを操作すると権限関連のエラーが出る場合の対策

## 症状

- WSL2 において、Linux にマウントされている Windows ファイルシステム上で、ファイル作成を伴うコマンドを実行すると、しばしば権限エラーが出る
	- `npm install`, `yarn add`, `git clone` など、何でも起きうる
- 以下は `yarn add` のエラー

```sh
senk@ponko2:/mnt/c/Users/senk/srcs/jest-tutorial$ yarn add -D typescript
yarn add v1.22.22
warning ../package.json: No license field
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
error Error: EPERM: operation not permitted, copyfile '/home/senk/.cache/yarn/v6/npm-typescript-5.8.3-92f8a3e5e3cf497356f4178c34cd65a7f5e8440e-integrity/node_modules/typescript/LICENSE.txt' -> '/mnt/c/Users/senk/srcs/jest-tutorial/node_modules/typescript/LICENSE.txt'
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
```

## 原因

- WSL にマウントされている Windows 上のフォルダーは、全て所有者が `root`、パーミッションは `777` (書き込み権限がない場合 `555`) になってしまう
	- パーミッション情報はファイルのメタデータに保存されるが、Windows のファイルシステム (NTFS) はメタデータを無視する
		- [DrvFs](https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config#what-is-drvfs) の仕様
	- したがって WSL にマウントされている Windows 上のファイルシステムでは、パーミッションが全く反映されない[^1]
- 上の例では、ソースコードがあるのは Windows のホームディレクトリ (`c:/Users/<ユーザー名>/`) 内のフォルダーのため、WSL 上では所有者が `root` になってしまう
	- `chown` や `chmod` で変えようとしても変えられない
- このため、WSL 上の一般ユーザーが `yarn add` を実行しても、権限エラーで弾かれてしまう

### 付随する問題

- このソースを git にコミットすると権限がガバガバになる
	- 不必要な実行権限が付く

## 対策

`/etc/wsl.conf` に以下を追加:

```title:
[automount]
options = "metadata,umask=22,fmask=11"
```

WSL を再起動 (Powershell で以下を実行):

```sh
wsl --shutdown
wsl -l　 # ディストリ名を確認
wsl -t Ubuntu
```

WSL 上にマウントされている Windows ホームディレクトリで、所有者が WSL のユーザーに変わっていれば OK

```sh
senk@ponko2:/mnt/c/Users/senk/srcs$ ls -l
total 24
-rwxr--r-- 1 senk senk    79 May  3 04:59 foo.js
-rwxr--r-- 1 senk senk    89 May  3 05:16 foo.ts
drwxr-xr-x 1 senk senk  4096 May  3 16:41 jest-tutorial
...
(所有者と権限が一般ユーザー向けになっている)
```

### 解説

- Windows のファイルシステムである NTFS は、ファイルのメタ情報（パーミッション含む）を無視するが、WSL 側から `$LXMOD` などの NTFS 拡張属性をファイルに追加することで、Linux のパーミッション情報が記録できるようになる
- `/etc/wsl.conf` に追加した `options = "metadata"` によって、拡張属性が記録できるようになる
	- デフォルトはなぜか `disabled`[^2]
		- 誰が得するんだ
- `umask=22,fmask=11` は、標準的な Linux のファイル作成時の権限に近づけるオプション
	- 不要な実行権限の付与を避ける

## 補足
- マウントしたフォルダー上での動作は遅いので、WSL 内の別のフォルダーで作業するべき
    - Windows からは `\\wsl$\ディストリ名\ディストリ内のパス` というパスでアクセスできる
        - VSCode でも開ける
    - see: [【Ubuntu日和】【第72回】Windows上でシームレスにLinuxを動かせる！ WSLで改めてUbuntuに入門しよう \- PC Watch](https://pc.watch.impress.co.jp/docs/column/ubuntu/2004458.html)



## 参考
- [WSL でのパーミッション設定・GPU の有効化 \#WSL2 \- Qiita](https://qiita.com/MinadukiSekina/items/71455b433e66eb4da397)
- [Windows 10のWindows Subsystem for Linux（WSL）を日常的に活用する \- 2017\-11\-08 \- ククログ](https://www.clear-code.com/blog/2017/11/8.html)
- [WSL のファイルのアクセス許可 \| Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/wsl/file-permissions)

[^1]: [WSL2でファイルのパーミッションを適切に設定する \| 人と情報](https://www.tmp1024.com/posts/2021/09/01/set-file-permissions-appropriately-with-wsl2/)
[^2]: https://learn.microsoft.com/en-us/windows/wsl/wsl-config#automount-options
【無料】Pythonの自動採点 × GPTヒント学習サイト「P道場」を公開しました

# はじめに

このたび、初心者が楽しくPythonを学べるWebサイト「P道場」を個人で開発・公開しました。

- **URL**: [https://pdojo.fly.dev](https://pdojo.fly.dev)
- **対象**: Python初心者（子ども〜大人）
- **費用**: 完全無料（運営費・API利用料も自腹です…）

この記事では、P道場の概要と、作るうえで工夫した点を簡単に紹介します。

---

# P道場とは？

- ブラウザ上でPythonの問題を解いて、リアルタイムで採点されます。
- 間違えたときは、ChatGPT APIを使ってやさしくヒントを出す仕組みを導入しています。
- 会員登録なしでも使えます（ゲストモードあり）
- 登録すると提出履歴が見られるようになります。

> 「あえて間違えてGPTにツッコませる」のも面白いです。

---

# 開発のきっかけ

教室で「間違えたときに寄り添ってくれる仕組みがほしい」という声があり、
いっそ自分で作ってしまおうと着手したのが始まりです。

---

# 技術構成（簡単に）

- フロントエンド：Monaco Editor + JS
- バックエンド：Flask + Python + 実行環境の制御（Docker）
- 採点：出力比較 & `py_compile` で構文チェック
- GPTヒント：エラーメッセージとコードを使ってAPIに問い合わせ

---

# 使ってほしい人

- Pythonをこれから学びたい人
- 教育現場でちょっとした課題として使いたい先生
- GPTの活用例を知りたい人
- 「とりあえず触ってみたい人」

---

# 最後に

個人開発のため、至らぬ点もあるかもしれませんが、
もし興味を持ってくださったらぜひ使ってみてください！

URL: https://pdojo.fly.dev  
X（旧Twitter）でも感想もらえると泣いて喜びます。
https://x.com/pi_________man
unityroom対応！ UserAgentの取得方法

# はじめに
こんにちは、unityエンジニアのchappyです。

UnityでWebGL向けのゲームを開発する際、PCかモバイルかで入力処理を切り分けたい事がありました。

モバイル端末の判定はJavaScriptを経由してUserAgentを取得するのがメジャーですが、手法によってはWebGLテンプレートを編集する必要があります。
unityroomではWebGLテンプレートは利用できず、固定のhtmlとなるためこの手法は利用できません。

そこで今回はWebGLテンプレートを使わない、unityroomに対応した手法でUserAgentを取得します。

# 環境
- Unity 6000.0.32f1
- 2025/05/03時点で最新のChrome
※unityroomやブラウザの仕様変更により、同じunityバージョンでも動作しなくなる可能性があります。

# コード
```UserAgent.jslib
mergeInto(LibraryManager.library, {
  GetUserAgentString: function () {
    const userAgent = window.navigator.userAgent;

    const length = lengthBytesUTF8(userAgent) + 1; // Null終端を含む
    const pointer = _malloc(length); // メモリ確保
    stringToUTF8(userAgent, pointer, length); // 文字列コピー

    return pointer; // メモリアドレスを返す
  },
});
```
[Unity公式](https://docs.unity3d.com/ja/560/Manual/webgl-interactingwithbrowserscripting.html)ではjslibファイルをAssets/Plugins/WebGLフォルダに配置する事を推奨しているようです。
Assets以下に配置すれば動作する事は確認しています。

　
```UserAgentHelper.cs
using UnityEngine;
using System.Runtime.InteropServices;

public class UserAgentHelper : MonoBehaviour
{

#if UNITY_WEBGL && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern System.IntPtr GetUserAgentString();
#endif

	public static string UserAgent { get; private set; } = "";

    // 処理順の問題か、Awakeだと動作しない事があったので注意！
	private void Start()
	{
#if UNITY_WEBGL && !UNITY_EDITOR
		var ptr = GetUserAgentString();
		UserAgent = Marshal.PtrToStringUTF8(ptr);
#endif
		Debug.Log($"UserAgent: {UserAgent}");
	}
}
```

`Start()`内でjslibの`GetUserAgentString()`を呼び出し、UserAgentを取得します。
後は文字列に `mobile`などが含まれているかで判定するだけです。
必要に応じて `#if UNITY_WEBGL`などのプリプロセッサや `Application.platform`などを併用して頂ければと思います。

```UserAgentHelper.cs
	private static bool IsMobileWebGL()
	{
#if UNITY_WEBGL
		return UserAgent.Contains("mobile") ||
			UserAgent.Contains("android") ||
			UserAgent.Contains("iphone") ||
			UserAgent.Contains("ipad");
#else
		return false;
#endif
	}
```

# おわりに
当初はWebGLテンプレートとjslib側からのSendMessageでUserAgentを取得していましたが、いざunityroomにアップロードしたら動作しなかったため変更しました。
結果的にWebGLテンプレートを触る必要がなくなり、シンプルな処理に出来て良かったです。
【Ubuntu】初期設定からGitクローンまでの手順まとめ（SSH接続）

## ✅ 1. ユーザー・パスワード設定  
Ubuntu起動後、初回ログインでユーザー名・パスワードを設定。

---

## 📁 2. プロジェクトディレクトリの作成
```bash
mkdir プロジェクト名
cd プロジェクト名
```

## 🛠 3. Gitのインストールと初期設定
Gitがインストールされているか確認
```bash
git --version
```
インストールされていない場合
```bash
sudo apt install git
```
ユーザー情報の設定（ローカルでの変更履歴記録に使用）
```bash
git config --global user.name "あなたの名前"
git config --global user.email "あなたのメールアドレス"
```
💡 なぜGitでユーザー設定が必要？
Gitはローカル環境で変更履歴を記録するためのツール。
GitHubにpushする前の段階でも、誰がどの変更を行ったか記録する必要がある。
Gitのuser.emailとGitHubの登録メールアドレスは一致させておくのがベスト。

## 🔐 4. GitHubとSSH連携（アカウント作成済み前提）
SSH鍵の作成
```bash
ssh-keygen -t rsa -C "GitHubに登録しているメールアドレス"
```
作成されるファイル：

~/.ssh/id_rsa（秘密鍵）

~/.ssh/id_rsa.pub（公開鍵）<br>
<br>

公開鍵の内容をクリップボードにコピー（Windows環境の場合）
```bash
cat ~/.ssh/id_rsa.pub | clip.exe
```
<br>
🔗 GitHubでの公開鍵登録手順
GitHub → Settings → SSH and GPG keys → [New SSH key] → 公開鍵を貼り付けて登録
<br>
<br>
接続確認

```bash
ssh -T git@github.com
```
Hi ユーザー名! You've successfully authenticated... と表示されれば成功

## 📦 5. GitHubリポジトリのクローン
##### Github上での操作
1\. GitHub上で対象リポジトリを開く
2\. 緑の「Code」ボタンをクリック
3\.「SSH」タブを選択し、表示されたURLをコピー<br>
##### Ubuntuでクローン実行（任意のディレクトリ内で）
```bash
git clone 上記でコピーしたものを貼り付け
```
## 🚀 6. Git操作の基本フロー（編集後のGithubへの反映コマンド）
```bash
git add .
git commit -m "変更内容"
git push
```
📝 よく使うコマンドまとめ

ll	ファイル/ディレクトリの詳細表示
mkdir ディレクトリ名	新しいディレクトリを作成
git	Gitがインストールされているか確認
cat ファイル名	ファイルの中身を表示（例：公開鍵の確認）

🧠 補足メモ
Git：ローカルの履歴管理ツール

GitHub：その履歴を共有・保存するためのクラウドサービス

SSH接続：パスワードなしでGitHubにアクセスできるようにする仕組み

## 参考記事

- [Ubuntu git ~ github連携まで](https://qiita.com/majka/items/aba924de8d4a92f75dbb)
『プログラムはなぜ動くのか』学習記録と「実行可能ファイルができるまで」の整理

## はじめに

プログラムが動けばそれでよい、ではなく、その内部で何が起きているのかを理解することが重要だと考え、本書を手に取りました。

本記事では、第8章「ソース・ファイルから実行可能ファイルができるまで」についてピックアップし、自分なりに整理しながらまとめていきます。

## ソースファイルから実行可能ファイルができるまで

私たちが書いたソースコードは、そのままではCPUに理解されません。
そのため、コンパイルやリンクといった複数のステップを踏むことで、最終的に実行可能ファイルとなります。
ここでは、その過程に関わる主な5つの構成要素について見ていきます。

### ソースファイル

プログラマが記述する、実行したいことを書いたファイルです。
このソースファイルは、コンパイラによってオブジェクトファイルに変換されます。
オブジェクトファイルはまだ単体では動作せず、必要なライブラリや他のオブジェクトファイルと一緒にリンクされて初めて実行可能ファイルとなります。

### スタートアップ

実行可能ファイルに含まれる、プログラム実行時の開始時に呼び出される初期化用のコードです。
例えば、メモリの初期化やグローバル変数の設定などの初期化処理を行います。

### スタティックリンクライブラリ

ビルド時に実行可能ファイルへ直接組み込まれるライブラリで、実行可能ファイルだけで動作可能です。

### ダイナミックリンクライブラリ

プログラム実行時に読み込まれる外部ライブラリで、DLLファイルが必要になります。

### インポートライブラリ

ダイナミックリンクライブラリを使用する際に、リンク時に必要となる参照情報を含んだファイルです。

## スタティックリンクライブラリ vs ダイナミックリンクライブラリ

同じライブラリを使う場合でも、実行可能ファイルへの組み込み方によって、スタティックリンクライブラリとダイナミックリンクライブラリに分かれます。

以下の表は、主な違いを示しています。

| 観点 | スタティックリンク | ダイナミックリンク |
| --- | --- | --- |
| 実行可能ファイルのサイズ | 大きくなる | 小さくなる |
| 実行時の依存関係 | 少ない | 多い（DLLが必要） |
| 配布のしやすさ | 単体で完結 | DLLも一緒に配布が必要 |
| ライブラリ更新時の影響 | 再ビルドが必要 | DLL差し替えで済む |
| メモリ使用効率 | プログラムごとにコピー | ライブラリ共有可能 |

## 実際のコードと構成要素の対応関係

以下の簡単なC言語プログラムを例に、各構成要素がどのように関わっているかを整理してみます。

```c
#include <stdio.h>
#include <windows.h>

int main() {
    char buf[100];
    sprintf(buf, "数値: %d", 42);  // スタティックリンクライブラリの例
    MessageBox(NULL, buf, "サンプルプログラム", MB_OK);  // ダイナミックリンクライブラリの例
    return 0;
}
```

- ソースファイル
    このC言語ファイルそのものがソースファイルにあたります。
    
- スタートアップ
    コンパイル時やプログラム中に明示的に書くものではなく、ビルド時に自動で組み込まれます。
    
- スタティックリンクライブラリ
    `sprintf(buf, "数値: %d", 42);` の部分が該当します。
    `cw32.lib` というスタティックリンクライブラリに含まれており、ビルド時にこのライブラリから必要な機能が取り込まれて、実行可能ファイルに組み込まれます。
    
- ダイナミックリンクライブラリ
    `MessageBox(NULL, buf, "サンプルプログラム", MB_OK);` の部分が該当します。
    これは `user32.dll` に含まれている関数で、プログラム実行時にこの外部DLLから機能が読み込まれて使用されます。
    
- インポートライブラリ
    `MessageBox()` を使うために、リンク時に `import32.lib` というインポートライブラリが使われます。
    このライブラリは `user32.dll` に含まれる関数への参照情報を持っており、ビルド時に必要になります。
    ソースコードには明示的には登場しません。
    

## 感想

- これまで名前だけ聞いたことがあったリンクや、普段目にしていた DLL ファイルの役割について、具体的に理解できてよかったです
- スタティックリンクライブラリとダイナミックリンクライブラリについては、それぞれにメリット・デメリットがあるため、用途や配布方法に応じて使い分けることが重要だとわかりました
kintone認定アソシエイトまでの道のり（3回受験）

# はじめに
## 概要
* kintone認定アソシエイト試験に3回目の試験で合格できたので、そこまでにやったことの備忘

## 対象読者
* これからkintone認定アソシエイト試験をチャレンジする方
* kintone認定アソシエイト試験に失敗して再チャレンジする方
## 目次
- [はじめに](#はじめに)
- [1回目](#1回目)
- [2回目](#2回目)
- [3回目](#3回目)
- [まとめ](#まとめ)

## はじめに
仕事先で使うことになったkintoneの勉強も兼ねて、資格認定を目標にすればモチベーションが維持できると「軽い気持ち」でチャレンジしたところが、合格までに3回も受験することになりました。教材の手掛かりの少ない試験だと思いますので、苦労されている方の参考になればと思います。

## 1回目
まずは試験結果から
- 受験日: 27-Oct-2024
- スコア: 51％
- セクションごとの結果：
-- アプリ	56 ％
-- スペース	60 ％
-- 管理者設定	50 ％
-- その他	43 ％
-- 応用	25 ％
- 試験準備に使ったもの
-- kintone認定 アソシエイト試験対策テキスト［第4版］
-- kintone認定アソシエイト試験 練習問題
-- kintone認定 アソシエイト試験対策動画
-- 30日間の実機お試し

最初にやったのは第4版の精読。章末問題は全部書き取り、暗記ロット(ankilot)で〇✕問題化。あと、管理者権限の章もankilotカードにして、「どのメニューで何ができる」を覚えました。実機のお試しで画面の確認も。練習問題は大体45問通しで1～3ともに40題くらいの正解率。動画は全部を見てません。ゆっくりな説明が眠くなってしまって（ごめんなさい）、1.5倍速再生で半分くらい。動画を頑張って視聴しても、映像＆音声全部を暗記しているわけじゃないので、章末問題の「ひっかけ」にはほとんど気づけない。ここに時間をかけても効率的ではないと考え、練習問題を中心に正解率が上がってきたところで試験申込

- 試験後の感想：
試験問題の割合の大半を占めるアプリで苦戦。「このやり方でも出来るのか？」「こんな設定があるのか？」という選択肢に惑わされました。後でヘルプやテキストにも、そうした魅力的な選択肢の方法はどこにも記載ありません。要は嘘八百。練習問題より、ずっと大胆にイヤらしい選択問題を作ってくることを思い知らされました。結局、より正確な知識が必要ということです。「こんな機能は無い」と、断言できる実力がないと合格できないことを痛感しました。
とはいえ、実務で全然使ってない私が51％って、結構ポジティブにとらえました。あと19％埋めればいいなら、なんとかやれるのではないかと再チャレを誓いました。

## 2回目
試験結果です
- 受験日: 13-Jan-2025
- スコア: 63％
- セクションごとの結果：
-- アプリ	61 ％
-- スペース	60 ％
-- 管理者設定	86 ％
-- その他	67 ％
-- 応用	40 ％
- 試験準備に使ったもの
-- kintone認定 アソシエイト試験対策テキスト［第3版］（中古）
-- kintone認定 アソシエイト試験対策動画
-- 某kintone勉強サイトの問題集

同じ問題ばかり機械学習しても駄目と考え、某kintone勉強サイトの問題集に手を出しました。それから、試験を申し込んだ後に「第3版」の問題集が充実しているという声を聞き、まだ中古で販売しているサイトから購入。問題集の部分をキンコーズで加工して問題冊子にして、通勤中も黙々と解くようにしました。最後に動画ですが、試験問題部分だけをダイレクトに全48回通しで確認し、ほぼ7割程度の正解率にまで仕上げました

- 試験後の感想：
終了ボタンを押したときは期待したんですけどねー。やはり未だアプリの成績悪かったのが敗因です。結論から言うと、某kintone勉強サイトの問題集は全く役に立ちませんでした。難易度が違い過ぎます。一方、第3版の問題集は「そのものずばり」は無いものの、出題形式は非常によく似ていた印象。もっとやり込めば「イケる」という手応えを感じ、直ぐにリベンジ戦を申込決意しました。

## 3回目
試験結果です
- 受験日: 25-Jan-2025
- スコア: 80％
- セクションごとの結果：
-- アプリ	84 ％
-- スペース	60 ％
-- 管理者設定	86 ％
-- その他	67 ％
-- 応用	100 ％
- 試験準備に使ったもの
-- kintone認定 アソシエイト試験対策テキスト［第3版］（問題部分のみ）
-- kintone認定 アソシエイト試験対策動画

ひたすら第3版の問題集。練習問題148問は第4版より問題数が100題多く、間違いやすい問題を何度も丁寧にやり込みました。仕上げは試験対策動画の問題部分だけ連続ノック。結局、動画のひっかけレベルを間違えないくらい知識を正確にしていないとダメというのが、2回受験しての結論でした。

- 試験後の感想：
「今度は大丈夫だろう」とは思いつつドキドキでした。応用が100％について、実は2回目と同じようなシチュエーション（もしかして同じ問題？）が、出題されていたので、今回は落ち着いて解けました。冷静に見えれば「これしか無いじゃないか！」という選択を、どうも前回はミスっていたようです。全部で50問。集中力が切れそうなところで、最後に複合問題が待っているドＳ試験ご馳走さまでした。

## まとめ
kintone認定アソシエイト試験はほかのベンダ試験と異なり、いわゆる「過去問サイト」が存在しません。よって、オフィシャルに出ている問題集、ヘルプ、実機を使っての勉強になると思います。
たぶん、試験対策テキスト［第3版］無しには自分は合格できなかったと思います。[第4版]は試験対策と宣伝しながら例題数も激減してますし、問題のすぐ下に答えがあって、学習しにくい構成になっています。webでも低評価されてるように、画像が薄いです。おそらく電子書籍等の違法コピー対策なんでしょうけど、肝心の購入者にも見づらくては本末転倒のように感じます。
とはいえ試験対策テキスト［第3版］は前のバージョン。[第4版]の新機能で問題を作られたら正解が変わりますので、そこは注意が必要です。試験対策テキストの次の版が改善されることを期待しましょう。
Windows11上にReact Native環境構築してAndroidアプリを作る

### 前提
完全に自分用の備忘録
* OS：Windows 11 Home

* Androidバージョン: 14

### 1. PowerShellで Chocolatey をインストール
* Windows専用のパッケージマネージャ
* 1個ずつ公式サイトから手動でダウンロードしてくるのは面倒だから使用
* 自動でパスが通るから楽

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; `
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```
choco -v でバージョン確認


### 2. ChocolateyでNodejs、Python、OpenJDKをインストール
* nodejsとjdkは言わずもがな
* pythonはReact Nativeでは必須ではないらしい？ビルド補助ツールの一部として使われることがあるらしいので一応入れておく

```powershell
choco install nodejs-lts -y
choco install python -y
choco install openjdk17 -y
```

確認
```powershell
node -v
npm -v
python --version
java -version
```


### 3. Android Studio のインストールと設定
* 安定性を優先でちょっと古いが```Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023```を選択
* https://developer.android.com/studio/archive からダウンロード

インストール後
* **More Actions**から**SDK Manager**を選択
* **Android 13.0(Tiramisu)**にチェックを入れ**Apply**
![スクリーンショット 2025-05-03 165937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077610/5e769d3d-4986-49c0-8612-f670ed34b090.png)
* **SDK Tools**タブを選択
* **Hide Obsolete Packages**にチェックを入れる
* **Android SDK Build-Tools36**の**33.0.3**と**30.0.2**を選択
![スクリーンショット 2025-05-03 170104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077610/2fe71e08-5f2d-4281-9a54-8af1b5ad8e52.png)
* **Android Emulator**と**Android SDK Platform-Tools**にチェックを入れ**Apply**
![スクリーンショット 2025-05-03 170151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077610/cbca552e-b075-4ff6-aa0e-f8ee7fe35333.png)


### 4.パスとANDROID_HOMEの設定
React Native、Android開発環境で必要な環境変数を設定

```powershell
$path = [Environment]::GetEnvironmentVariable("Path", "User")
$path += ";$env:LOCALAPPDATA\Android\Sdk\platform-tools"
$path += ";$env:LOCALAPPDATA\Android\Sdk\emulator"
[Environment]::SetEnvironmentVariable("Path", $path, "User")
[Environment]::SetEnvironmentVariable("ANDROID_HOME", "$env:LOCALAPPDATA\Android\Sdk", "User")
```

確認
```powershell
adb devices
```
何も出なくてOK

### 5.VSCodeの拡張機能設定
入れなくてもいいけど、入れたほうが絶対便利
* React Native Tools

### 6.React Nativeでプロジェクトの作成（TypeScript）
```bash
npx @react-native-community/cli@latest init <アプリ名> --template react-native-template-typescript@6.10.0
```

### 7.アプリ確認
```bash
yarn install
yarn start
```

別ターミナルを開いて
```bash
yarn android
```
有名Webサービスでよく見かけるテキストエディタについて調べてみた

⚠実装方法は書いてません

## 経緯
ぼくが趣味のインターネットサーフィンを楽しんでいた所いくつかのWebサイトにて
「このエディタすごいモダンだな…気になるな…」
→「何かのモジュールかな…」
→開発者ツールで見てみる
ということをしたわけですね。(まー当たり前だと思いますが)
## 結果
class="ql-toolbar ql-snow"など、「ql-」のprefixが付いたクラスを大量に観測しました。

普通にclassをコピペして検索したら「Quill」というWYSIWYGテキストエディタであるっぽいことが分かりました…！！！！！！
「QL Editor」みたいな名前かと思って必死に検索してました…。で、全然関係ないEditorしか出てこなくて諦めていたのですが、純粋にクラス名で検索したら普通に出てきました(おい)
Quillさん…もっと調べたいです。ｼﾞｭﾙﾘ
公式：https://quilljs.com/

## Qiitaのエディタは…？
これを書いている最中に気になったのでこれまたそれらしいクラス名で検索することに。

### 開発者ツールを開いてclass名を見ていく
なんかそれらしいな…っていう嗅覚を使って見ていきます。
ん？「cm-editor」…？
写真アイコンとか絵文字アイコンにはこのclass名が見られなかったので結構カスタマイズして使えそうなエディタですね。
![スクリーンショット 2025-05-03 164305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863851/ef2be757-7d18-443e-aeee-85d61cb30e1b.png)

### 検索する
前のステップで観測した「cm-editor」のワードで検索すると、「CodeMirror」というエディタであることが分かりました。
デモページも開発者ツールで見て同じクラス名を見つけたので間違いないと思いたいです。
あのObsibianさんの名前が載ってるのでこれは中々良さそうなテキストエディタですね。
公式：https://codemirror.net/

## まだある
世の中にはまだまだエディタのモジュールが存在するのでもう少し調べて比較していきたい所存。
Gromacs の機械学習ポテンシャルを利用する（インストール編）

# 概要
Gromacs-2025.1 から機械学習ポテンシャル（NNP）が利用可能になったとのことなので、Fedora40 server に Gromacs-2025.1 をインストールした。本記事は、そのインストール記録。QM/MM 計算に NNP を用いる NNP/MM 計算などについては次回以降の記事で書く。

# 検証環境
CPU: Ryzen 9 7950x
GPU: RTX A6000
OS: Fedora 40 server edition
RAM: 96GB
nvidia-driver: 570.133.07
cuda-12.8

# インストール方法
以下の記事でインストールしたパッケージ・依存関係は全て入っている前提で進める。

https://qiita.com/ComputerChem/items/2910106e00189922af4f

```shell
su  #root ユーザーになる。
# 必要なパッケージをインストール
sudo dnf -y install cmake3 fftw-devel perl-File-Copy perl-libs cmake ninja-build

#ダウンロード
cd /opt
wget https://ftp.gromacs.org/gromacs/gromacs-2025.1.tar.gz
sudo tar zxvf gromacs-2025.1.tar.gz
```

GROMACS 2025.1 が直接読み込めるのは PyTorch（libtorch）で学習・保存した NNP のみ。TensorFlow や DeepMD ネイティブ形式はまだサポートされていない。

＜注意＞
<ul>
<li>ABI は “C++11 ABI” 版を選択する。PyTorch 公式サイトから
libtorch‑*cxx11‑abi‑shared‑with‑deps‑<ver>.zip をダウンロードする。
(*-pre‑cxx11‑abi-* や conda 版は 不可。)
</li>
<li>PyPI/conda の Python パッケージ版 PyTorchは
<ol>
<li>C++ ヘッダー & CMake ファイルを含まない</li>
<li>既定で pre‑C++11 ABI ビルドという理由で GROMACS からは利用できない。</li>
</li>
</ul>

Fedora 40 の標準コンパイラ gcc 14.2.1 は C++11 ABI (=1) が既定なので、追加の ABI オプションは不要。



詳しい説明は、<a href="https://manual.gromacs.org/2025.1/install-guide/index.html#installing-with-neural-network-potential-support">こちらのページ</a>を参照。

```shell
curl -LO https://download.pytorch.org/libtorch/cu121/libtorch-cxx11-abi-shared-with-deps-2.2.2%2Bcu121.zip
unzip libtorch-*.zip -d /opt
```

＜注意＞
NNP 利用時は、cmake 時に以下のオプションを加える必要がある。
詳しくは公式インストールガイド<a href="https://manual.gromacs.org/2025.1/install-guide/index.html#installing-with-neural-network-potential-support">Installing with Neural Network potential support</a> を参照。
```shell
-DGMX_BUILD_NNPOT=ON            # NNP 機能を有効化
-DCMAKE_PREFIX_PATH=/path/to/libtorch   # libtorch のトップディレクトリ
```


以下が実際のインストール手順。

``` shell
cd /opt/gromacs-2025.1/
# 以下のコマンドで configure（以下 14 行全て）
cmake -S /opt/gromacs-2025.1 -B build -G Ninja \
      -DCMAKE_INSTALL_PREFIX=/opt/gromacs-2025.1 \
      -DCMAKE_C_COMPILER=gcc \
      -DCMAKE_CXX_COMPILER=g++ \
      -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc \
      -DCMAKE_PREFIX_PATH=/opt/libtorch \
      -DGMX_MPI=OFF \
      -DGMX_DOUBLE=OFF \
      -DGMX_OPENMP=ON \
      -DGMX_GPU=CUDA \
      -DGMX_BUILD_DOC=OFF \
      -DGMX_BUILD_MAN=OFF \
      -DGMX_BUILD_HTML=OFF \
      -DGMX_BUILD_NNPOT=ON   

# 以下のコマンドで build
cmake --build build -j16 　　# -j16 は、CPU のコア数を指定している。

# 以下の 3 行を .bashrc に書き込む
# Gromacs の設定
export PATH=/opt/gromacs-2025.1/build/bin:$PATH
export LD_LIBRARY_PATH=/opt/libtorch/lib:$LD_LIBRARY_PATH
```

# 動作確認
libtorch の path が通っていないと、gmx 実行時にエラーが起きるので、動作確認を行う。以下のテストは 1 分程度で終わる。
```shell
# ダウンロード
git clone https://github.com/hnishi/testdata_gromacs.git testdata_gromacs
cd testdata_gromacs

# テスト
gmx grompp -f MD1.mdp -c ./replace_po_mg.gro -p ./topol.top -o md1.tpr -maxwarn 1 > grompp.log 2>&1

gmx mdrun -s md1.tpr -deffnm md1 -ntmpi 1 -ntomp 16 -gpu_id 0 > md1.log 2>&1

# 結果を確認
tail md1.log
```
【公ド読】GitHub Copilot とは何ですか?

【公式ドキュメントを読もうシリーズ】GitHub Copilot とは何ですか?

## シリーズ概要
[https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3](https://qiita.com/yasu_programming/items/cec66f9e8d5d571e9ce3)

## 参考URL
[https://docs.github.com/ja/copilot/about-github-copilot/what-is-github-copilot](https://docs.github.com/ja/copilot/about-github-copilot/what-is-github-copilot)

## 説明

> IDE で入力したコード候補を取得する

これはインラインでコード変換してくれる機能のことだろう

> コードに関するヘルプを求めて Copilot とチャットする

これは Copilot Chat のことだろう

> Copilot は利用可能です:
> - IDE 内
> - チャット インターフェイスとして GitHub Mobile 内
> - Windows Terminal Canary (Terminal Chat インターフェイスを使用)
> - GitHub CLI を使用したコマンド ライン上
> - GitHub ウェブサイト上

`チャット インターフェイスとして GitHub Mobile 内` と書かれているが、スマホでもGithub Copilotが使えるっぽい
Github に登録しているrepositoryで軽微な修正はGithub Copilotでできそうなので、外出中でもGithub Copilotでの修正ができる模様

### 参考URL
[https://www.youtube.com/watch?v=Zv6TuVzcRdY](https://www.youtube.com/watch?v=Zv6TuVzcRdY)
ProxmoxでDNS設定の書き換えを防止する

# 背景
ProxmoxでDNS設定はGUIから設定できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/c08636aa-c301-46a8-add1-ca61c0d25cc4.png)
しかし、ノード(画像ではn100)を再起動すると上書きされてしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/f390397c-779e-43a3-b4f0-e016a5275234.png)


毎回勝手に書き換えられることを防ぐためにメモとして防止策を記載する
なお、chownなどでリードオンリーにしても書き変わるのでこの手順が必要

# 方法

```bash:書き込み防止
chattr +i /etc/resolv.conf
```

これを実施すると画面上からの編集は当然できなくなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/64485439-61d8-41f1-bc19-cd16773ff95f.png)


```bash:書き込み防止解除
chattr -i /etc/resolv.conf
```

## 設定の流れ

書き込み防止解除　→　/etc/resolv.confを編集 → 書き込み防止
OAC：Catalog Manager CLIを使ってみる

はじめに
---
PCにOAC Client Toolsをインストールすると、カタログ・マネージャ・コマンドライン・インターフェース、Catalog Manager CLIが使えます。Catalog Manager CLIを使うと、以下のようなことができます。Catalog Manager CLIを使ってみます

サポートされるコマンドのリスト:-
|コマンド|説明|
|---|---|
|createFolder            |カタログにフォルダを作成|
|delete                  |指定したパスをカタログから削除|
|rename                  |カタログの項目名の変更|
|report                  |カタログ・コンテンツに関するレポートの生成|
|replace                 |カタログ・コンテンツの検索と置換|
|localize                |カタログ・コンテンツのローカリゼーションの有効化|
|archive                 |カタログのサブセットのアーカイブを作成|
|unarchive               |アーカイブをカタログに抽出|
|setItemProperties       |Webカタログのオブジェクトのプロパティを設定します|
|upgradeCatalog          |カタログを11g (11.1.1.7.0)以降のバージョンから最新バージョンにアップグレードします。|
|renameAccounts          |カタログのユーザー/グループ/アプリケーション・ロールの名前の変更|
|forgetAccounts          |カタログからユーザー/グループ/アプリケーション・ロールを除去|
|setOwnership            |Webカタログのオブジェクトの所有権プロパティを設定します|
|setItemPermissions      |WebカタログのオブジェクトのACLで権限エントリを追加/変更/削除します|

![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/301658aa-eeab-454a-a829-31dcba26a660.jpeg)

記事記載時のOAC ver：May 2025 Update

前提
---
OAC Client Toolsがインストール済

reportコマンド実行時のエラーの対応の実施
---
はじめてCatalog Manager CLIを使う前に、reportコマンド実行時のエラーの対応を実施します
OAC Client Toolsをインストールしたディレクトリの下記フォルダに移動します
＜OAC Client Toolsのインストールディレクトリ＞\bi\bifoundation\web\catalogmanager
![g3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/37961f35-68bc-4f02-b729-a4ea9072b2b3.jpeg)

runcatinternal.cmd を複製します。runcatinternal.cmd をメモ帳で開きます
jvmBasicArgsの変数に、-Duser.language=enを追加します。保存します。
![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0d0ab281-66c8-4405-ac28-dcdee1f480ac.jpeg)

Catalog Manager CLIの起動
---
スタートメニューから、"すべて"のアプリを開き、Oracle Analytics Client Toolsから、Catalog Manager CLIをクリックします。
![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/48be0853-cfae-4f8c-8741-d141eac477fa.jpeg)

コマンドプロンプトが起動します。Catalog Manager CLIが実行できるように各種環境変数がセットされます。
![g6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/eda15142-a1b2-46e7-b29f-9ed3f02a5592.jpeg)

jvmBasicArgsの変数を確認します。set jvmBasicArgs　を実行し、-Duser.language=enがセットされていることを確認します。
![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3b0b40b1-cf17-47d2-a24c-455613fae303.jpeg)


Catalog Manager CLIを使ってみる
---
資格証明、credentialsファイルの作成
PC上で、OACに接続するためのユーザー、パスワードをセットするファイルを作成しておきます。本記事では、c:\workの下に以下のoaccred.txtファイルを作成しています。

login=＜OAC User＞
pwd=＜OAC Userのパスワード＞

OACの接続用URLをメモしておきます。URI部分は/analytics-ws/saw.dllです
https://＜OACインスタンス＞/analytics-ws/saw.dll

ためしに、Webカタログの/Sharedフォルダ以下をアーカイブしてみます。
runcat.cmd -cmd archive -online "https://＜OAC URL＞/analytics-ws/saw.dll" -credentials "C:/work/oaccred.txt" -folder "/shared" -forceOutputFile "C:/work/archive_file"

実行イメージ。Return Status が 正常終了 0　で返ってきていることを確認します。
![g7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/eb5b211d-a84e-4c75-a878-7c4897950f50.jpeg)

まとめ
---
PCにOAC Client Toolsをインストールすると、カタログ・マネージャ・コマンドライン・インターフェース、Catalog Manager CLIが使えます
Catalog Manager CLIを使うと分析やダッシュボード、ワークブック、フォルダなどのWebカタログのオブジェクトに対しての操作がPCからのコマンドラインで、例えばバッチ操作ができます。

以上
pythonのパッケージをダウンロードする スクリプトをプログラミングしてみた。

# 概要

情報セキュリティの厳しい分野では、開発環境がオフラインの企業はけっこう多いので pythonのパッケージのダウンローダーを作ってみた。

- [自分のブログ](https://plaza.rakuten.co.jp/finlaggan/diary/202505030000/)でも紹介したが、ブログは読者が少ないのでQiitaにも転載しておく

## 外観

pythonパッケージダウンローダー
![pythonパッケージダウンローダー画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076532/82cfec2a-4c30-4cd9-ad90-bc21a7130492.png)

## リポジトリ
[GitHub公開ページ](https://github.com/fangface-hub/python_package_downloader)

## 使い方

1. リポジトリをダウンロードして、python_package_downloader.py を実行する


1. ダウンロード情報を入力する

    画面項目は以下のとおり。 

    | 画面項目 | 説明 |
    | ---- | ---- |
    | ダウンロード方法 | 必須項目<br>PyPISimpleとrequestsが未インストールの場合は強制的にpipを使う。<br>pipを使う： ダウンロード環境の pip を使って pip download する <br> pipを使わない： PyPISimpleとrequestsを使用してパッケージをダウンロードする |
    | OSを選択 | Windows,Linux,macOS を選択する |
    | Pythonバージョン | 必須項目,複数選択可<br>ターゲットのpythonバージョンを選択する |
    | パッケージリスト | 必須項目<br>パッケージリスト(テキストファイル)のパスを指定する<br>スクリプト格納場所の package_list.txt が初期値 |
    | ダウンロード先 | 必須項目<br>ダウンロード先のフォルダを指定する。<br>スクリプト格納場所の downloads が初期値 | 
    | pipのパス | pipを使う場合必須項目<br>ダウンロード環境にある pip を探して初期ひょうじする |
    | プロキシを使用する<br>ユーザ～ポート | 任意項目<br>プロキシを使う場合、入力する |
    | ソース形式を含める | 任意項目<br> ダウンロードできなかった場合、tar.gz形式のダウンロードを試みる |  


1. 「ダウンロード開始」ボタンを押す

# ソースコード
`2025/05/05 修正`
* `pipを使わない場合のフィルター誤りを修正`
* `可読性が悪かったのでリファクタリングした。`

`2025/05/19 修正と機能追加`
* `修正 コードが長いのでモジュール分割とリファクタリング`
* `機能追加 OSを複数選択可にした`
* `機能追加 依存パッケージのダウンロード機能追加`

ソースコードは長いので本文から削除しました。リポジトリを参照してください。
CursorとPlaywright MCPでE2Eの仕組みを作ったが、活用には至らなかった理由

## はじめに
初めまして。私は現在都内のスタートアップでプロダクト開発をしております。

私が所属するチームでは現在十数人程度のフルサイクル・フルスタックエンジニアがプロダクト開発を行なっていますが、専属のQAメンバーがいないためプロダクトの品質保証が課題になっていました。

加えて開発チームとしてはAIを積極活用することで生産性やプロダクトの品質の向上を積極的にしていこうということになっていました。

AutifyなどのE2Eツールの導入も検討しましたが、費用や保守面でのコスト負担が大きく、難しい状況でした。

そんな状況のなか、先日Playwright MCPが公開されたのでこれをうまく使えば簡易E2Eをの仕組みを整えて、
必要最低限のシステムのE2Eチェックを低コスト、低負担でできるのでは？となり、調査と実際に仕組みを構築してみました。



## 前提条件
- Cursorエディタがインストール済み
- Node.js (v14以上)がインストール済み
- npmがインストール済み

## インストール手順

### 1. Playwright MCPのインストール

ターミナルで以下のコマンドを実行します：

```bash
# package.jsonとnode_modulesがあるプロジェクトルートに移動
cd /path/to/your/project

# プロジェクトのpackage.jsonに@playwright/mcpを追加
npm install @playwright/mcp

# 必要なブラウザをインストール
npx playwright install chromium
```

### 2. CursorへのPlaywright MCP設定

Cursorでは、MCPサーバーを設定することで、AIがブラウザを制御できるようになります。設定方法は以下の通りです：

1. Cursorのメニューバーから「ファイル > ユーザー設定 > Cursor Settings」を選択
2. 左側のメニューから「MCP」を選択
3. 「+ Add new global MCP server」ボタンをクリック

表示されたJSON設定ファイルに以下のコードを追加します：

```json
{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": [
        "@playwright/mcp@latest"
      ]
    }
  }
}
```

設定後、Cursorを再起動して、MCPタブにPlaywrightサーバーが表示されることを確認してください。サーバー名の左側に緑色のドットが表示されていれば、設定は完了です。

### 3. テストシナリオの作成

新しいファイル `e2e-test-prompts.md` を作成し、テストしたいシナリオを記述します：

```markdown
# Web E2Eテストシナリオ

## ログインテスト
1. https://example.com にアクセス
2. ユーザー名「testuser」とパスワード「password123」を入力
3. ログインボタンをクリック
4. ダッシュボードページが表示されることを確認
5. 各ステップでスクリーンショットを取得

## 検索機能テスト
1. https://example.com/search にアクセス
2. 検索ボックスに「テスト商品」と入力
3. 検索ボタンをクリック
4. 検索結果が表示されることを確認
5. 少なくとも1つの結果が表示されていることを確認
6. 各ステップでスクリーンショットを取得
```

### 4. テスト実行

1. Cursorの「AI」パネルを開き、Agentモードを選択します
2. 以下のようなプロンプトを入力します：

```
以下のテストシナリオを実行してください：
1. https://example.com にアクセス
2. ユーザー名入力欄を見つけて「testuser」と入力
3. パスワード入力欄を見つけて「password123」と入力
4. ログインボタンをクリック
5. ログイン成功後、ダッシュボードページが表示されることを確認
```

3. 実行ボタンをクリックすると、AIがPlaywright MCPを通じてブラウザを操作し、指定されたテストを実行します
4. AIが各ステップを実行する際に「Run tool」ボタンをクリックして許可します

## Playwright MCPの仕組み

Playwright MCPは2つの主要なモードで動作します：

1. **スナップショットモード（デフォルト）**：
   - ブラウザのアクセシビリティツリーを利用
   - テキストベースで高速かつ効率的
   - 主に構造化されたWebページに最適

2. **ビジョンモード**：
   - スクリーンショットと座標を使用
   - 視覚的な要素や複雑なUIに対応
   - `--vision`フラグで有効化

## 活用例

- **UI自動テスト**：ユーザージャーニーの自動検証
- **データ収集**：Webサイトからの情報抽出
- **フォーム入力の自動化**：複雑なフォーム入力を自然言語で指示
- **クロスブラウザテスト**：異なるブラウザ環境での動作確認

## 感想

実際にPlaywright MCPを使用してみた結果の所管は下記のようになります。

### 1. 実用性の限界

- Playwright MCPは内部的にはPlaywrightのAPIを利用しているだけであり、本格的なE2Eテストツールとしては機能が限定的
- 自然言語によるシンプルな操作は便利ですが、複雑なテストシナリオには対応しきれない場面が多い(ログインできない、ダイアログを閉じれない等)
- 細かい設定やカスタマイズが必要な場合は、従来のPlaywrightスクリプトの方が柔軟性がある

### 2. 効率性の問題

- テストケースや仕様を非常に詳細に記述しないと、AIが意図通りに動作しない場合がある
- ブラウザの動作を自然言語で指示する際の曖昧さが、テスト実行時間の増加につながる

### 3. 実務での適切な使い分け

- 明確なE2Eテストストーリーがある場合は、直接Playwrightのテストスクリプトを書いた方が効率的に思える
- スクリプトを使えば、並列実行やヘッドレスモードなどの高速化オプションも活用できる
- Playwright MCPは、簡易的なWebサイト調査や単発のタスク自動化には適していますが、本格的なテスト自動化には向いていなさそう

### 4. 適した用途

- プロトタイピングや概念実証（PoC）段階での簡易的なテスト検証
- テスト仕様の初期検討や動作確認
- 非エンジニアがシンプルなブラウザ操作を自動化したい場合
- 探索的テストの補助ツールとして


## 参考資料

- [Playwright MCP 公式リポジトリ](https://github.com/microsoft/playwright-mcp)
- [Playwright 公式サイト](https://playwright.dev/)

---
chakra uiを使用して、ボタンにハンバーガーアイコンを埋め込もうとしましたが、 TypeErrorが出てしまう

# はじめに
chakra uiを使用して、ボタンにハンバーガーアイコンを埋め込もうとしましたが、
TypeErrorが出てしまう

# 問題
下記のように ```@chakra-ui/icons``` からimportしているのにも関わらず、「TypeError」が出る。
```Header.tsx
import { HamburgerIcon } from "@chakra-ui/icons";
import { Box, Flex, Heading, IconButton } from "@chakra-ui/react";
...

export const Header: FC = memo(() => {
return (
//...
    <IconButton aria-label="メニューボタン" size="sm">
       <HamburgerIcon />
    </IconButton>
  )
});
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/352aa655-ee44-47a3-a1a7-4c3a5009eeb9.png)


# 解決方法
公式ドキュメントによると、v3から ```chakra-ui/icons```は削除されたとのこと。

https://chakra-ui.com/docs/get-started/migration

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/e9674fb7-d11e-4382-868a-066985d9829e.png)

代わりに ```react-icons/fa``` の ```FaBars``` を使用。
```jsx
import { FaBars } from "react-icons/fa";

<IconButton aria-label="メニューボタン" size="sm">
    <FaBars />
</IconButton>
```
無事、アイコンを表示することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/5dfb6870-7ee3-4174-87ae-f89d68b5f9e0.png)

# おわりに
文法やインストールしたパッケージに問題ないのに、エラーが出る場合は公式ドキュメントを疑うことが大事。
Gitのクローンから始めるときのコマンド

## クローンから始めてリモートURLをセットする

・URLからクローンする
```
$git clone リポジトリのURL
```

・現在のリモートリポジトリを確認
```
$git remote -v
```

・リモートリポジトリを指定の作成済みのgithubリポジトリに変更する
```
$git remote set-url origin GitHubのURL
```
cloneの時はoriginいらないけど、urlを設定しなおすときはoriginが必要(エイリアス)。

コマンドを使わなくてやるときはよいけど、使うとき都度確認んでググるので記録。
【E資格取得後】画像分類アプリ 〜Python＋Streamlit＋FastAPI〜

## はじめに

E資格を取得したあと、「次に何をやろう？」と悩んでいた自分の次のステップとして、「画像分類アプリ」を作成しました。  
このアプリ開発を通じて、E資格で学んだ知識を実際に使いながらアウトプットし、さらに以下のスキルも身につけることができました。

- ✅ バッチ学習の実装  
- ✅ 学習済みモデルのファインチューニング  
- ✅ SGD（確率的勾配降下法）による最適化  
- ✅ Webアプリの基本的なUI構築（Streamlit）  
- ✅ バックエンドAPI（FastAPI）との連携  

> 「E資格は取ったけれど、そのあと何をすればいいかわからない…」  
> 私と同じように悩んでいる方の参考になればと思い今回記事を作成しました。


## 開発環境と使用ライブラリ
- Windows11
- Python 3.12.7
- 使用した主なライブラリ
  - streamlit
  - FastAPI
  - mlflow
  - torch


## モデル構成と学習
PyTorch の事前学習済みモデル「ResNet18」をベースに、カスタムデータセット対応の10クラス分類ができるようにファインチューニングを行いました。

下記を参照しファインチューニングのコードを作成しました。
https://medium.com/@imabhi1216/fine-tuning-a-pre-trained-resnet-18-model-for-image-classification-on-custom-dataset-with-pytorch-02df12e83c2c

## Webアプリの概要
このアプリでは、以下の10種類の動物画像を分類します。

クラス	ラベル名
0	犬（dog）
1	馬（horse）
2	象（elephant）
3	蝶（butterfly）
4	鶏（chicken）
5	猫（cat）
6	牛（cattle）
7	羊（sheep）
8	蜘蛛（spider）
9	リス（squirrel）

### 使用方法

#### 1. モデル学習（初回のみ）
ResNet18 をベースとして、最終層に層を追加してファインチューニングを行い、10クラス分類モデルを作成
モデルの学習履歴は mlflow ui で確認ができます。

#### 2. サーバ起動
``` bat
mlflow ui --port 5000
uvicorn main:app --reload --host 127.0.0.1 --port 8000
```

#### 3. UI起動
``` bat
streamlit run ui.py
```
#### 4. UI上で画像を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/40d8d6fa-edea-4f6a-aeef-42d57e4d559a.png)

#### 5.  アップロードした画像が10クラスのうちどれに分類されるかを表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065772/ecf63fd5-5cd7-41ff-88ae-a577d1027edd.png)


## 改善点
現在は、分類対象外の画像（例：風景、車など）も、必ず10クラスのいずれかに分類されてしまいます。
「その他（other）」クラスを追加する。


## おわりに
E資格で学習した内容を実際に手を動かすことで、AI開発のイメージをつけることができました。
次回は自然言語をテーマにして記事を作成したいと考えています。

以下本記事のコード
https://github.com/Jatm1019/ai_application_classes
朝会（デイリースクラム）の具体的な改善案【ケース別】メモ


> ※個人の現場体感と試行錯誤ベースで整理した朝会改善メモ。  
> 朝会は「報告」ではなく「検査と適応」の場。  
タイムボックスは意識しよう前提。
> 目的を見失わず、自然な問いとリモート補完を意識した設計を目指す。

---

## ケース1：形式的にやってるだけ or 流し読みで形骸化

**課題例：**  
- タスク管理ツールの輪読が惰性化  
- 発言がルーチン化  
- 問題が出ても流される
- 個別報告会化し、同期・協働・相乗効果がない

**改善アプローチ：**
- 「今日の目的」「進捗とのギャップ」「支援の有無」を引き出す
- その日のフェーズに合わせた問い（「この辺、大丈夫そう？」など）
- アイスブレイク・チェックインを適宜導入
- ファシリ持ち回り制 → ゆくゆくはファシリ不要の自走を目指す
- タスクに対して「違和感あった？」等の問いかけ
 進捗ではなく “変化” を探る
- 軽アクション付きペンド →「今日どこかで話そうか？誰が必要かな？」
- Slackスレで派生議論の導線をつくる

---

## ケース2：話が長い or 一人で展開しがち

**課題例：**
- 1人だけが話して他メンバーが置いてけぼり
- チームで共有する価値が薄れていく

**改善アプローチ：**
- タイマー導入（1〜2分目安）で時間意識を促す
- 脱線は「あとで別枠でキャッチアップしよう」と切り出す
- ファシリテーター持ち回り制で「全員の場」を作る

---

## ケース3：課題が共有されても放置される

**課題例：**  
- インペディメントが出ても拾われず放置

**改善アプローチ：**
- 拾い手の明示（その場 or Slackで割り振る）
- アクション記録係を置く
- 朝会は「検知・対応方針共有」まで（解決は別スロットで）
- インペディメントはPBI化も検討、必要なら即対応

---

## Tips

- 朝会は報告じゃなく **「会話と観察」の場**
- スプリントゴールよりも **“今この瞬間”の状態把握を重視**
- 「問い」は自然に。構えずにポンと出す方が効果的
- リモート補完（Slack・ドキュメント・スレッド文化）も意識する

---
🌟 個人開発者向け：おすすめホテルアフィリエイトAPI完全ガイド【地域別・難易度・特徴】

この度個人開発で、ホテルアフィリエイトAPIを使うきっかけがあったので、まとめてみました。

ホテルや旅行関連のアフィリエイトで収益化を考えている個人開発者にとって、「どのAPIを使うか」は大きな課題です。この記事では、

✅ 地域別のおすすめAPI  
✅ APIの特徴  
✅ 個人開発での審査の難易度

を整理してまとめました。


## 🌎 世界中（グローバル向け）

### ✅ Travelpayouts API
**特徴**  
- Booking.com、Agodaなど60以上の旅行ブランドと提携  
- ホテル、フライト、レンタカーの検索が可能  
- 決済処理は提携先側。個人側での決済システム構築不要  

**審査の難易度**：★★★★★（誰でも無料登録で開始可能）

**おすすめ対象**  
- 初心者や個人開発者  
- 旅行ブログ、比較アプリ、LINE bot など

リンク：[Travelpayouts API](https://www.travelpayouts.com/)

---

### ✅  Booking.com Demand API
**特徴**  
- Booking.comのグローバル宿泊施設情報にアクセス可能  
- 決済はBooking.com側  
- 宿泊情報、レビュー、料金情報が取得可能  

**審査の難易度**：★★★☆☆（中程度、簡単な英語申請が必要）

**おすすめ対象**  
- 小規模開発者  
- 海外市場を意識したアプリ

リンク：[Booking.com Demand API](https://developers.booking.com/)

---

### ✅ Expedia Rapid API

**特徴**  
- 世界70万以上の宿泊施設に対応  
- 決済はExpedia側  
- 法人・中規模以上のパートナー向け、高機能API  

**審査の難易度**：★★☆☆☆（法人・ビジネス実績が必要）

**おすすめ対象**  
- 法人開発者  
- 旅行代理店系スタートアップ

リンク：[Expedia Rapid API](https://partner.expediagroup.com/en-us/solutions/build-your-travel-experience/rapid-api)  

---

## 🌏 南米市場向け

### ✅ HotelDO API
**特徴**  
- 南米特化の10万軒以上のホテル在庫  
- 決済はHotelDO側  
- メキシコ、ブラジル、アルゼンチンなどに強み  

**審査の難易度**：★★★☆☆（中程度、事前相談・問い合わせ推奨）

**おすすめ対象**  
- 南米特化のサービスやローカルツアー連携アプリ

リンク：[HotelDO API](https://www.hoteldo.com/en-us/)  

---

## 🇮🇳 インド市場向け

### ✅ Cleartrip API
**特徴**  
- インド中心のホテル予約と決済  
- 決済はCleartrip側  
- インド・中東市場に強み  

**審査の難易度**：★★★★☆（比較的通りやすい）

**おすすめ対象**  
- インド市場向けアプリ  
- 比較サイト

リンク：[Cleartrip API](https://business.cleartrip.com/)  

---

## 🇯🇵 日本市場向け

### ✅  楽天トラベル Webサービス
**特徴**  
- 国内最大級の宿泊施設網  
- 楽天アフィリエイト経由で提携  
- 空室・料金・プラン情報取得可能  

**審査の難易度**：★★★☆☆（楽天アフィリエイト申請必要）

**おすすめ対象**  
- 日本国内向けサービス  
- 地方観光アプリ

リンク：[楽天トラベル Webサービス](https://webservice.rakuten.co.jp/) 

---

### ✅ じゃらん Webサービス
**特徴**  
- リクルート運営、国内宿泊施設・温泉宿に強み  
- アフィリエイト収益化可能  
- 豊富な検索API、プラン情報取得  

**審査の難易度**：★★★★☆（個人でも比較的通りやすい）

**おすすめ対象**  
- 国内旅行・観光アプリ  
- 地方ガイド

リンク：[じゃらん Webサービス](https://webservice.recruit.co.jp/)  

---

### ✅ Agoda Affiliate API
**特徴**  
- アジア・日本を含むグローバル対応  
- Agodaが決済・サポート対応  

**審査の難易度**：★★★★☆（個人でも申請可能）

**おすすめ対象**  
- 日本含むアジア向けサービス  
- 訪日外国人向けアプリ

リンク：[Agoda Affiliate API](https://partners.agoda.com/en-us/)  

---

## 🔥 API選びの早見表

| 地域          | API名                   | 決済処理  | 審査の難易度 | 個人開発者の適性               |
|-------------|----------------------|--------|-------------|------------------------|
| 世界全域       | Travelpayouts        | 不要     | ★★★★★        | 初心者〜中級者向け            |
| 世界全域       | Booking.com Demand    | 不要     | ★★★☆☆        | 中級者向け                  |
| 世界全域       | Expedia Rapid         | 不要     | ★★☆☆☆        | 法人・上級者向け             |
| 南米特化      | HotelDO               | 不要     | ★★★☆☆        | 南米特化アプリ向け           |
| インド特化     | Cleartrip            | 不要     | ★★★★☆        | インド市場開発者向け          |
| 日本特化      | 楽天トラベル Webサービス  | 不要     | ★★★☆☆        | 国内向け個人開発者           |
| 日本特化      | じゃらん Webサービス    | 不要     | ★★★★☆        | 国内向け個人開発者           |
| 日本・アジア特化 | Agoda Affiliate        | 不要     | ★★★★☆        | アジア・訪日客向け開発者        |

---

## 💬 最後に

ホテルアフィリエイトAPIを選ぶときは以下を意識するといいと思います！：  
✅ 対象地域はどこか  
✅ 個人で申請できるか  
✅ 決済処理を自分で持たなくてよいか