OmniAICreator/Qiita-1.07M huggingface dataset:
Kaggle挑戦のための事前準備とモデル精度向上のためのアプローチ

## はじめに

Kaggleに挑戦してみたいけれど、どのような準備をすれば良いのかわからない方も多いでしょう。さらに、単にモデルを作るだけでなく、その精度を向上させ、業務に活かせるスキルを身に着けるためには、何を意識すべきかも重要です。この記事では、Kaggleに挑戦する前に押さえておきたい基礎知識と、モデルの精度を上げるためのポイントについて解説します。

## Kaggleの事前準備

### 1. Pythonの基本的な知識

まずはPythonの基本的な知識が必要です。以下の項目を理解しておくと良いでしょう。

- 変数、データ型（リスト、タプル、辞書など）
- 制御構文（if文、forループ、whileループ）
- 関数の定義と呼び出し

### 2. データ操作と分析の基礎

データを扱うためのPandasやNumpyの基本操作を学びます。

- **Pandas**: データの読み込み・書き出し（CSVファイルなど）、データのフィルタリング、ソート、集計
- **Numpy**: 配列の操作、数値計算

### 3. データの可視化

データの傾向やパターンを視覚的に理解するために、MatplotlibやSeabornを使った基本的なグラフ作成を学びます。

- 折れ線グラフ、ヒストグラム、散布図、棒グラフなど

### 4. 機械学習の基本

Scikit-learnを使った基本的な機械学習モデルの実装と評価方法を学びます。

- 線形回帰、ロジスティック回帰、決定木、ランダムフォレストなど
- 混同行列、精度、再現率、F1スコアなどの評価指標

### 5. Kaggleの使い方

KaggleのNotebooksやデータセットの利用方法、コンペティションへの参加方法を理解します。

## モデルの精度向上と業務活用のためのアプローチ

### 1. データ理解と前処理

- **データ探索**: データの分布や異常値、欠損値を理解するための探索的データ解析（EDA）を徹底する。
- **データ前処理**: 欠損値の処理、異常値の処理、特徴量のスケーリングやエンコーディングを適切に行う。

### 2. 仮説検証

- **ビジネス理解**: 業務の目標や課題を深く理解し、それに基づいて仮説を立てる。
- **ドメイン知識**: 業界特有の知識を活かして、モデルに反映させる仮説を構築する。

### 3. 特徴量エンジニアリング

- **新しい特徴量の作成**: 既存のデータから新たな特徴量を作成することで、モデルの性能を向上させる。
- **特徴量の選択**: 不要な特徴量を削除し、重要な特徴量に絞る。

### 4. モデル選定とチューニング

- **モデルの選択**: 問題に適したアルゴリズムを選ぶ。例えば、分類問題ではランダムフォレストやLightGBMなど。
- **ハイパーパラメータチューニング**: グリッドサーチやランダムサーチを用いて、モデルのハイパーパラメータを最適化する。

### 5. モデル評価

- **適切な評価指標**: 目的に応じた評価指標を選ぶ。例えば、分類問題では精度だけでなく、再現率やF1スコアも考慮する。
- **クロスバリデーション**: データの過学習を防ぐために、クロスバリデーションを実施する。

### 6. 継続的な学習と改善

- **フィードバックループ**: モデルのパフォーマンスをモニタリングし、定期的にフィードバックを受け取り改善を続ける。

## 推奨書籍

以下の書籍は、モデル精度向上と業務活用のためのスキルを深めるのに役立ちます：

- **「Pythonによるデータ分析入門」**（Wes McKinney著）
  - Pandasの開発者による書籍で、データ操作の基礎から高度なテクニックまでカバーしています。

- **「Python Machine Learning」**（Sebastian Raschka, Vahid Mirjalili著）
  - 機械学習の基礎から応用までを網羅した書籍で、Scikit-learnを中心に解説されています。

- **「Feature Engineering for Machine Learning」**（Alice Zheng, Amanda Casari著）
  - 特徴量エンジニアリングに特化した書籍で、実践的なテクニックが豊富に紹介されています。

- **「Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow」**（Aurélien Géron著）
  - 最新の機械学習フレームワークを使った実践的なガイドで、モデルの選定やチューニング方法が詳しく解説されています。

- **「The Art of Data Science」**（Roger D. Peng, Elizabeth Matsui著）
  - データサイエンス全般に関する考え方やアプローチを学ぶのに最適です。

## まとめ

Kaggleに挑戦する前に必要な基礎知識を身に着けることで、スムーズにコンペティションに参加できます。さらに、モデルの精度を上げ、業務に活かせるスキルを習得するためには、データ理解、仮説検証、特徴量エンジニアリング、モデル選定とチューニング、モデル評価、継続的な学習と改善を意識することが重要です。ぜひ、この記事を参考にして、データサイエンスのスキルを高めてください。

---
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（56/100）

【56日目】
トピック 7：SAPS/4HANAにおける拡張計画（2/14）

≪問題56≫
他の作業を移動しないで、作業の日程を有限的に計画しようとしています。どの日程計画方針を選択しますか。
□作業挿入
□割込
□稼働時間のみでの日程計画
□スロット検索

≪解答≫
□作業挿入
□割込
□稼働時間のみでの日程計画
■スロット検索

≪解説≫
有限の日程計画方針と、すでに計画された他の作業の関係は以下の通りです。
（1）スロット検索
十分に長く、十分な利用可能能力がある計画方向の最初のスロットに作業を計画することができますので、すでに計画された他の作業は移動されません。
（2）作業挿入
希望日にすでに作業が計画されている場合、挿入する作業は計画方向に従って、その作業の直後（順計画方向）または直前（逆計画方向）に挿入されます。また、すでに計画されている他の作業は、計画方向に従ってさらに移動されます。
（3）作業割込
希望日の計画にスロットがない場合でも、既存の計画の希望日に作業を計画することができます。必要に応じて、前後の作業を両方向に移動して、十分な大きさのギャップが生成されます。
（4）非稼働時間の計画
リソースの非稼働時間（リソースが計画に従って稼働していない時間）に作業を計画することができます。したがって、通常の稼働時間後（最後のシフトの終了後など）に作業を完了する場合は、他のリソースデータを直接変更する必要はありません。
ジンバルモーター、SimpleFOCで動かす(4) - Teleplotでグラフ表示

# はじめに

[前回の](https://qiita.com/8ga3/items/c0005c7f8fe284ec52a5)の続きです。

Visual Studio Codeの機能拡張、[Teleplot](https://marketplace.visualstudio.com/items?itemName=alexnesnes.teleplot)でグラフ表示をします。

Arduino IDE 2.0のプロット表示に相当します。

# インストール

VSCodeの機能拡張からTeleplotを検索することで簡単に見つけられます。ボタンを押してインストールします。

![teleplot-marketplace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/ef42404f-19e6-8ff9-806c-716034e3931b.png)

# 使い方

使い方は非常に簡単で、Arduinoのloop関数でシリアルにプロットしたい数値をprintします。

基本は下の例のように書きます。書式外の文字列はTeleplotのコンソールに表示されます。

```cpp
loop() {
  ...

  Serial.print(">sin:");
  Serial.println(sin(i));

  ...
}
```

Arduinoに実行イメージをアップロードしリブートしたら、Teleplot画面を表示します。左下のTeleplotの文字をクリックします。

![teleplot-btn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/b70e0967-fe21-5174-3ebc-993158fb112b.png)

タブが開き、初期画面が現れます。

![teleplot-start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/db0ce4be-7796-13db-5923-01c0b7994677.png)

シリアルデバイスとボーレートを選択し、Openボタンを押すとグラフがリアルタイムに表示されます。

![teleplot-run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/e8fae1f6-9122-7cfe-9976-61abb13e53cf.png)

UDP対応しています。複数グラフを１つに重ねて表示したり、文字列を送信することができます。

画面レイアウトをjson形式でエクスポート・インポートできるので、jsonファイルを直接編集すると、線の色を変えるとか細かい指定ができました。

詳細は割愛します。シンプルなのでちょっと試しに操作してみれば、すぐに理解できると思います。

# SimpleFOCの場合のコーディング方法

SimpleFOCでは、角度や速度等の表示にmonitor機能を使ってきました。これをやめてTeleplotのフォーマットで出力してあげます。

自前で実装してもよいのですが、すでに用意されているのでそちらを使います。

これまで使っていたSimpleFOCライブラリのライブラリにはありません。SimpleFOCDriversの方に入っているので、PlatformIOのLibrariesからインストールします。

リポジトリ[Arduino-FOC-drivers](https://github.com/simplefoc/Arduino-FOC-drivers)をみると、追加のモータードライバやエンコーダが多数ありますが、それ以外の追加機能が入っていることがわかります。ここで使うのは **TeleplotTelemetry** です。

ヘッダファイルをincludeし、グローバルにインスタンスを作ります。

```cpp
#include <comms/telemetry/TeleplotTelemetry.h>

TextIO io = TextIO(Serial);
TeleplotTelemetry telemetry = TeleplotTelemetry();
```

setup関数では、表示したい項目を登録し初期化します。

```cpp
  telemetry.addMotor(&motor);
  uint8_t reg[] = { REG_TARGET, REG_ANGLE, REG_VELOCITY };
  telemetry.setTelemetryRegisters(3, reg);
  telemetry.init(io);
  telemetry.downsample = 100;
```

ちなみにsetTelemetryRegisters関数の書き方で、下記の書き方だとエラーになりました。Arduino Uno R4に乗っているRenesas RA4M1のtoolchainがGCC 7.2.1でした。この書き方ができる前のGCCのバージョンのようです。ESP32やNucleoとかなら大丈夫なのかもしれません。

```cpp
  telemetry.setTelemetryRegisters(3, { REG_TARGET, REG_ANGLE, REG_VELOCITY });
```

loop関数では、run関数をコールするだけでシリアルにプリントされます。

```cpp
void loop()
{
  motor.loopFOC();
  motor.move();
  // motor.monitor(); // telemetryと同時に使わないので消します。
  telemetry.run();
  command.run();
}
```

ビルド、アップロードしたら準備完了です。

# Teleplotでモーターの状態表示

Teleplot画面を開き、ポートを設定しOpenボタンを押せばグラフが表示されると思います。あとは使いやすいように画面レイアウトをカスタマイズしましょう。コンソールからCommanderへ司令することもできます。

![teleplot-run2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/e3d002f9-cf42-8417-b171-c18c5f1f71c4.gif)


# おわりに

Teleplotを使えばPIDの調整がしやすくなったかと思います。

次回は、今回使用した磁気エンコーダについて少し書いてみます。

https://qiita.com/8ga3/items/eaa26381e1a4a7a6b8da
【個人開発】稼げる技術情報共有プラットフォーム Overridon を作ってみたので使って欲しい

## はじめに
本意ではないのですが多くの人に読んで欲しかったので、この様なタイトルにしてます^^; 本来は「【個人開発】企業 -> 筆者にお金が流れる技術情報共有プラットフォームを作ってみた」とかにしたかったです^^; ご理解お願いします！

## Overridon とは？ ( 概要 )
- Qiita や Zenn の様な技術情報共有プラットフォームです！
- Note の様に記事をペイウォールの中に入れれます！
- **Note とは違い支払者が個人ではなく企業となってます！** 
  - **購入ボタンを押すのは個人ですが、支払をするのが企業となってます！**
  - **企業活動に必要な記事へのアクセス権代を企業が払ってくれるということです！**
- 支払者が企業なので、支払者が個人のプラットフォームと比較してマネタイズ額が圧倒的に高くなります！
- **莫大な利益を上げてる企業がお世話になってる人 ( 技術記事の筆者の方 ) に利益を還元していないのが凄く違和感だったため、開発しました！**
- 基本的にソフトウェアを扱ってる企業の場合、企業活動をする為に技術記事は必要不可欠なので、企業に利用してもらえると思ってます！

以下詳細が続きます^^

## Note の様に記事をペイウォールの中に入れれます！
![](https://storage.googleapis.com/zenn-user-upload/3f4a5ab5afa1-20240707.png)

Overridon に投稿された記事は全てペイウォールの中に入れられます！無料分として 30% のみ公開され、アクセス権を持ってるいるユーザーのみが全文を読むことをできます^^ アクセス権は 24 時間のみ有効で、アクセス権の期限が切れた後に記事の全文を読みたい場合は、再度アクセス権を購入する必要があります！また、無料分の割合やアクセス権の有効時間などは反応を見ながら調整しようと思ってます^^

## Note とは違い支払者が個人ではなく企業となってます！
![](https://storage.googleapis.com/zenn-user-upload/0c7fb35466db-20240707.png)

Overridon では購入ボタンを押す人と支払をする人が違います！個人が画像赤枠のアクセス権の購入ボタンを押してアクセス権を購入した場合、即座に記事の全文を読むことができるようになり、支払は後日企業にいきます^^ 企業との紐付けはプラットフォーム内の組織アカウントにユーザーアカウントをぶら下げる形で行います！

![](https://storage.googleapis.com/zenn-user-upload/a205ab2f3474-20240707.png)

## 支払者が企業なので、支払者が個人のプラットフォームと比較してマネタイズ額が圧倒的に高くなります！
![](https://storage.googleapis.com/zenn-user-upload/41fb711e2688-20240707.png)

現状のアクセス権代は上記の画像の通りで、例えば組織負担で 1,000 回読まれればそれだけで 10,000 円の売上です^^ ( 実際は 15% の手数料が引かれるので、受け取れる金額が少し減ります )
この様に他 PF と比較して圧倒的なマネタイズ額になります^^ 組織負担の金額は上げる予定なので、将来的にはもっとマネタイズ額が上がる予定です！

出金可能額は https://overridon.com/dashboard/withdraw から確認可能です^^

![](https://storage.googleapis.com/zenn-user-upload/af61f717533f-20240707.png)

見込収益は https://overridon.com/dashboard/earningsHistory/2024 から確認可能です^^

![](https://storage.googleapis.com/zenn-user-upload/6a4db8b34c93-20240707.png)

## **莫大な利益を上げてる企業がお世話になってる人 ( 技術記事の筆者の方 ) に利益を還元していないのが凄く違和感だったため、開発しました！**
**基本的にソフトウェアを扱ってる企業の場合、企業活動をする為に技術記事は必要不可欠でだいぶお世話になってるはずです。ですが、現状はお世話になった人に何も利益を還元していないと思います。僕はこれに違和感を感じ、Overridon を作りました^^**

## 終わりに
ぜひ覗いてみて下さい^^

https://overridon.com/

https://overridon.com/about

https://overridon.com/info/faq/purchase
Remote SSHでDocker内をデバッグする

## 目的
Dockerの稼働中のコンテナ内をデバッグする。

# メリット
- Docker内であっても、デバッグできる。
- ブレークポイントを仕掛けて一行一行デバッグできる！

## 方法
今回は、Visual Studio Codeの拡張機能、Remote SSHを使用してDocker内のデバッグをする。

## 背景

前回、つよつよエンジニアから[SSH接続を用いてVisualStudioCodeでデバッグする](https://qiita.com/NUNOGAWA/items/2979e33c060ca8f4e674)方法を教わった。

そのときに、ついでに、Docker内にも入ってのデバッグ方法を教えてもらった。

SSHで接続してVSCodeに持ち替えるだけでいっぱいいっぱいだったため、「後で読む」をクリックするがごとくスルーしていた。バグが起きた時に覚えればいいだろう、と思ったのだった。

**そしてすぐにプログラムが動かなくなり、肩をたたかれることになった。**

## 手順

- Visual Studio CodeでRemoteSSHの拡張機能をインストールする（初回のみ。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/35ad246d-a1b1-ec89-7ee2-7250952b39cc.png)


- `Dev Containers`もインストールする（初回のみ。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/f8a12025-1cf0-76ed-bdce-ebe534e1e901.png)


- デバッグ用コードを記述する。

docker-compose.yamlにデバッグ用のコードを記述する。
例えば、起動したら無限ループして待っておいてもらうようにする。

```docker-compose.yaml
command: bash -c "while true; do sleep 1; done" 
```

こんな感じである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/2eab3acf-11c0-d16e-9de5-8f2287ae398c.png)

こうすると、Dockerfileの`CMD ["python", "./main.py"]`のコマンドをオーバライドしてbashの無限ループにおきかえることができる。

- docker compose up --buildでコンテナを起動する

`docker compose up --build`を用いてコンテナを起動する。

(`main.py`などが実行されない。)

- Remote SSHで接続する

VisualStudioCodeの左下に現れるオレンジのアイコンをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/5873ab63-03f7-dead-c47a-04b85a7e85a9.png)

`Attach to Running Container`を実行し、目当てのコンテナを選んで起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/93f893cc-8864-60ce-4d36-bd3750a90332.png)

- コンテナ内にも、いろいろな拡張機能を入れる。

表側にデバッグ用の環境が入っていても、コンテナ内には入っていない。
改めてインストールする必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/ce18f92e-d541-9804-d601-60b530b34fc8.png)

Python、Pylance(デバッグ用)、PythonDebugger(デバッグ用)、それとこっちにもRemote-SSHやDev Containersをいれよう。

- 目当てのフォルダを選択する

たとえば俺の環境の場合は`code`というフォルダにコード一式が入っている。
**rootではない。**
初回で、コード類がイマイチどこにあるかよくわからないなら`ls`コマンドや`cd`コマンドを駆使して探しても良い。

このあいだは、結構待たされるので、コーヒーなり紅茶なりエナドリなりを用意してじっくり待つとよいだろう。

- Run and Debugを実行する

左のメニューから、Run and Debugを実行する。
（※別の設定をいじっているため、私の環境だとわかりやすく紅に染まっている）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/88140ce2-aad7-502e-67df-d2c94cd33d54.png)

mainで止まるようにブレークポイントを仕掛けておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/0e67b766-8f0d-b546-9597-2bbd3f35859e.png)

止まってくれた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/88effa7f-47e8-8a14-75e0-f411b2199a85.png)

これで変数の中身を覗きたい放題になる。
いえーい。

## どういうときに活躍したか

「なんか動かねぇけど何が原因なの？　これ」という絶望をしたときにとても良い。

例えば、[テスト用インスタンスでは動くのに、本番用インスタンスになると動いてくれない件について](https://qiita.com/NUNOGAWA/items/d7ceee76ced2f2ccfb6a)で起こったトラブルを解消できた。

例外が起こっているのがQdrantの関数呼び出し時だということが（loggingやprintを用いなくても）わかったのだ。
便利なLinuxコマンドまとめ

Linuxは強力で柔軟なオペレーティングシステムであり、多種多様なコマンドを使って効率的にシステムを管理することができます。今回は、知っておくと便利なLinuxコマンドをいくつかご紹介します。

## 1. ファイルおよびディレクトリ管理

### ls
- 説明: ディレクトリの内容を一覧表示します。
- 使用例:
    ```bash
    ls
    ls -l
    ls -a
    ```

### cd
- 説明: ディレクトリを変更します。
- 使用例:
    ```bash
    cd /path/to/directory
    cd ..
    cd ~
    ```

### mkdir
- 説明: 新しいディレクトリを作成します。
- 使用例:
    ```bash
    mkdir new_directory
    ```

### rm
- 説明: ファイルまたはディレクトリを削除します。
- 使用例: 
    ```bash
    rm file.txt
    rm -r directory
    ```

### cp
- 説明: ファイルやディレクトリをコピーします。
- 使用例:
    ```bash
    cp source_file destination_file
    cp -r source_directory destination_directory
    ```

### mv
- 説明: ファイルやディレクトリを移動または名前変更します。
- 使用例:
    ```bash
    mv old_name new_name
    mv file.txt /path/to/destination/
    ```

### find
- 説明: ファイルやディレクトリを検索します。
- 使用例:
    ```bash
    find /path -name filename
    ```

### du
- 説明: ディスク使用量を表示します。
- 使用例:
    ```bash
    du -h
    du -sh /path/to/directory
    ```

### df
- 説明: ファイルシステムのディスク使用状況を表示します。
- 使用例:
    ```bash
    df -h
    ```

## 2. テキスト操作

### cat
- 説明: ファイルの内容を表示します。
- 使用例:
    ```bash
    cat file.txt
    ```

### grep
- 説明: テキスト検索を行います。
- 使用例:
    ```bash
    grep 'search_term' file.txt
    ```
    
### sed
- 説明: ストリームエディタとしてテキストを置換します。
- 使用例:
    ```bash
    sed 's/old_text/new_text/g' file.txt
    ```

### awk
- 説明: パターンに基づいてテキストを処理します。
- 使用例:
    ```bash
    awk '{print $1}' file.txt
    ```
    
## 3. システム情報と管理

### top
- 説明: リアルタイムでシステムのリソース使用状況を表示します。
- 使用例:
    ```bash
    top
    ```

### htop
- 説明: topの拡張版で、より視覚的にリソース使用状況を表示します。
- 使用例:
    ```bash
    htop
    ```
    
### ps
- 説明: 現在実行中のプロセスを表示します。
- 使用例:
    ```bash
    ps aux
    ```
    
### kill
- 説明: プロセスを終了します。
- 使用例:
    ```bash
    kill process_id
    kill -9 process_id
    ```

### uname
- 説明: システム情報を表示します。
- 使用例:
    ```bash
    uname -a
    ```
### df
- 説明: ディスクの空き容量を表示します。
- 使用例:
    ```bash
    df -h
    ```
    
### free
- 説明: メモリの使用状況を表示します。
- 使用例:
    ```bash
    free -h
    ```
    
## 4. ネットワーク

### ping
- 説明: ネットワーク接続を確認します。
- 使用例:
    ```bash
    ping www.google.com
    ```
    
### ifconfig
- 説明: ネットワークインターフェースの設定と状態を表示します。
- 使用例:
    ```bash
    ifconfig
    ```
    
### netstat
- 説明: ネットワーク接続、ルーティングテーブル、インターフェース統計を表示します。
- 使用例:
    ```bash
    netstat -tuln
    ```

### curl
- 説明: URLに対してリクエストを送信します。
- 使用例:
    ```bash
    curl http://www.example.com
    ```
    
### wget
- 説明: ウェブからファイルをダウンロードします。
- 使用例:
    ```bash
    wget http://www.example.com/file.zip
    ```

これらのコマンドを活用することで、Linuxシステムの操作がより効率的に、そして効果的に行えるようになります。
by rememberと= rememberの違い

# はじめに
今回はJetpack Compose実装時になんとなくで使われていそうなby rememberと= rememberの違いを紹介していきます
### 本文
まず、前提として=はご存知の通り代入ですが、byは委譲になります。
ではcompose内で使われているrememberと合わせた時にどうなるのかを紹介していきます。
まず、=ではremember{}で宣言したラムダ内の値を初期値として保持します。
byは先ほど記載したようにremember{}に処理を委譲しています。
そのため。、remember{}の内部がstateなので初期値はstateでないといけません。
逆に=は以上をしていないのでどんなクラスでもOKになります
# 最後に
普段はなんとなくで使われていそうなrememberの使い方による違いを紹介していきました。
基本的にはrememberで持つ値は再描画に使うものなのでbyを使うのが正しい気がします
Webアプリで速度計を作る

多分書く程のものじゃないのか、意外と書いている人居ないので、投稿。

# 作ったもの

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219558/8bd6ff82-21d9-f2f8-4b42-b46616fe08b7.jpeg)

こんな感じで緯度と経度とスピードを取得できるWebアプリを作りました。
開いた瞬間位置情報取得が始まり、stopボタンを押すと位置情報取得が止まります。

https://geolocation-api.pages.dev/

# 実装
## 使ったAPI
`Geolocation API`というWebページで使えるAPIを使って作成しました。

https://developer.mozilla.org/ja/docs/Web/API/Geolocation_API

## Webアプリのホスティングについて
`Geolocation API`は`HTTPS`のページでないと使えません。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219558/e8999e28-30a1-ccd6-d85a-6857ec60606d.png)

なので、htmlファイルをローカルに保存して開くだけでは動かないし、httpのサーバーに公開しても動かないので注意しましょう。

httpsでのWebページの配信方法は、お任せしますが、私は簡単なので`Cloudflare Pages`を使いました。

https://zenn.dev/collabostyle/articles/24596eb77ddc67

## 位置情報の取得方法
位置情報を取得するメソッドは以下の2種類があります。

https://developer.mozilla.org/ja/docs/Web/API/Geolocation/getCurrentPosition

https://developer.mozilla.org/ja/docs/Web/API/Geolocation/watchPosition

速度計は操作不要で速度情報が逐次更新されていく動作が望まれるので、`watchPosition`メソッドを使用します。

## 緯度、経度、速度の取得方法
取得できる情報はこのようになっています。

https://developer.mozilla.org/ja/docs/Web/API/GeolocationCoordinates

速度の単位が`m/s`になっているので、時速(`km/h`)が知りたい場合は変換する必要があります。

## 精度を上げるために
デフォルトだとあまり精度が良くなかったので、オプションを変更して改善しました。
オプションの詳細については、各位置情報取得メソッドのドキュメントページに書かれているので、確認してみてください。
今回私が使用したオプションは以下の通りです。もしスマホのバッテリーの減りが気になるかたは、ここから変更する必要があると思います。
```js
const options = {
    enableHighAccuracy: true, // 位置情報の精度を高める
    timeout: 100, // タイムアウトまでの時間（ミリ秒）
    maximumAge: 0, // キャッシュされた位置情報の最大年齢
};
```

## 全体のコード
```index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Webアプリ 速度計</title>
  </head>
  <body>
    <button type="button" id="stop">stop</button>
    <p id="latitude"></p>
    <p id="longitude"></p>
    <p id="speed"></p>

    <script>
      let watchID;

      const options = {
        enableHighAccuracy: true, // 位置情報の精度を高める
        timeout: 100, // タイムアウトまでの時間（ミリ秒）
        maximumAge: 0, // キャッシュされた位置情報の最大年齢
      };
      watchID = navigator.geolocation.watchPosition(
        (position) => {
          let { latitude, longitude, speed } = position.coords;
          speed = (speed * 3600) / 1000;
          document.getElementById("latitude").textContent =
            "latitude: " + latitude;
          document.getElementById("longitude").textContent =
            "longitude: " + longitude;
          document.getElementById("speed").textContent = "speed: " + speed;
        },
        null,
        options
      );

      document.getElementById("stop").addEventListener("click", () => {
        navigator.geolocation.clearWatch(watchID);
      });
    </script>
  </body>
</html>
```

# 宣伝
現在新潟大学学生フォーミュラプロジェクトでは、スポンサーになっていただける企業様や個人を募集しています。

プログラミングから溶接まで多種多様なスキルを持った学生が在籍しています。

下記のメールまでご連絡をお待ちしております。
next-fp@eng.niigata-u.ac.jp
AWS Copilot manifestファイルのTips

AWS Copilotを使っていて、気がついた点や公式ドキュメントではわかりにくい点をまとめました

## ビルド時にキャッシュを効かせる

公式ドキュメントでもdockerfileの指定は
```yml
image:
  build: './frontend/Dockerfile'
```
こんな感じでになっていますが、これだと毎回最初からビルドされるので非効率です

```yml
image:
  build:
    dockerfile: './frontend/Dockerfile'
    cache_from:
      - {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxxxx:latest
    args:
      BUILDKIT_INLINE_CACHE: 1
```
こんな感じでcache_fromにECRのレポジトリとargsに`BUILDKIT_INLINE_CACHE:1`を設定するとキャッシュが効きます
要は、docker buildコマンドで`--cache-from`と`--build-arg BUILDKIT_INLINE_CACHE=1`を指定してるのと同じことになります
（ただ、これでも変更が無いのにキャッシュが効かないことがある謎）

## 起動コマンドで複数コマンドを実行したい場合は起動用シェルを作る

例えばこんな感じで
```yml
command: python manage.py migrate && gunicorn config.wsgi:application -b :80 --timeout 600
```
&&で繋いで複数コマンド実行とかはできません
素直にシェルにしましょう、例えばこんな感じ
```dockerfile:dcokerfile
(省略)

COPY start.sh /start.sh
RUN chmod +x /start.sh

(省略)
```

```sh:start.sh
python manage.py migrate
gunicorn config.wsgi:application -b :80 --timeout 600
```

```yml:manifest.yml
command: sh /start-prd.sh
```

## git管理したくない情報のsecretsへの渡し方

DBのアクセス情報とか各種アクセスキーなどですね
その場合、パラメータストアかシークレットマネージャーから渡すことになります

### シークレットマネージャーの場合
```yml
secrets:
  {設定したい環境変数名}:
    secretsmanager: '{シークレットの名前}:{シークレットのキー}::'
```
例えば以下のような感じ
```yml
secrets:
  DATABASE_HOST:
    secretsmanager: 'hogehoge:host::'
```

### パラメータストアの場合
```yml
secrets:
  {設定したい環境変数名}: {パラメータの名前}
```
パラメータの名前は
`/copilot/${COPILOT_APPLICATION_NAME}/${COPILOT_ENVIRONMENT_NAME}/secrets/{パラメータ}`
が推奨のようです
例えば以下のような感じ
```yml
secrets:
  API_KEY:　/copilot/${COPILOT_APPLICATION_NAME}/${COPILOT_ENVIRONMENT_NAME}/secrets/API_KEY
```
またどちらも以下の二つのタグをつける必要があります
`copilot-application: {copilotで作成したアプリケーション名}`
`copilot-environment: {デプロイする際のenvironment}`

## jobのdockerfileはlocationを指定する

jobは大抵はバックエンドと同じソースで起動コマンドだけ違うってことが多いと思います
その場合にmanifestファイルにバックエンドと同じようにdockerfileのパスを指定すると、ビルドされてしまいデプロイに時間がかかりますし、ECRのレポジトリも勝手に作られてしまいます
以下のような感じでlocationを指定すれば、デプロイ時にビルドされずにビルド済みイメージが使われます
```yml
image:
  location: {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxxxx:latest
```

## jobでDB接続したい場合はsecurity_groupsを指定する

バックエンドサービスが使っているセキュリティグループをそのまま使えばいいはず
例えばApp Runnerの場合は、設定>ネットワーキング>セキュリティグループにありました
```yml
network:
  vpc:
    security_groups:
      groups:
        - 'sg-xxxxxxxxxxxx'
```

## manifestファイルに変更があった場合にやること

サービスのmanifestファイルに変更があった場合は特にやることはなく、普通にpushするだけで反映されます
ただし、pipelinesのmanifestファイルは`copilot pipeline deploy`をしないと反映されませんでした
AzureではじめるAI開発：概要篇

Azureを使ってAIソリューション開発するときの基本的な概要を書いています。

## はじめに
AIを活用したソリューション開発、特に生成AIを取り入れた開発が興隆しています。
これを書いているのは入社一年目の新入社員で、これからAI、特に生成AIを活用したソリューション開発業務に携わろうとしています。そこで、AIをプラットフォームサービスとして提供しているAzureを入り口に、AIの勉強をすることになりました。
ここでは、AzureAIというプラットフォーム上でAI開発をしたいとき、まず知っておいたほうがいいなと思ったことをまとめています。

## Azure AIとは
Azure AIはMicrosoft社のクラウドプラットフォームであるAzureのなかで提供されているサービスの一つです。

Azure AIサービスとはひとことでいうとAIをつかったソリューション開発のための環境（プラットフォーム）で、世間的によく知られ広い分野で使われているAI機能の多くを提供しています。例えば、映像から人の顔や文字を認識できるAI Vision、音声を認識してテキストに変換できるAI Language、領収書などの文書を読み取りデータ化できるAI Document Intelligenceなどです。これらは機械学習というAIの学習プロセスを経て生まれてきた機能で、Webまたはモバイルのアプリケーションに組み込むことで開発に活かすことができます。

サービスを使うメリットのひとつは、すでに学習済みの機械学習モデルが用意されていることです。データセットをそろえて一から構築することなくすぐに開発に取り組むことができるので、一からモデル構築できるような専門的知識のないユーザーや、大きな資本力（データ量、資金とか）を持たないひとでもAI開発ができるようになっています。

話が戻ってきますが、Azure AIでは機械学習モデルのAI開発だけではなく、生成AIをつかった開発もできます。
Azure AIサービス内の一つであるAzure OpenAIサービスでは、既存モデルにデータを追加したりして調整を行いつつ、文章やコード、画像の生成などOpenAIの提供する生成AIモデル(ChatGPTとか)を利用できます。Azureで利用するメリットとして、OpenAIのモデルをAzureサービスのひとつであるセキュリティ機能と組み合わせて開発できるのが大きいです。


## おわりに
Azure AIサービスとはAI開発を支援するための開発環境であるということが分かりました。専門的な知識を持っていなくても、今までより簡単に、効率的に開発に取り組めることが特徴です。
今後は、サービスそれぞれの機能についての詳細や、生成AIサービスのより具体的な活用法などについて深く学んでいければと思っています。



参考文献はMicrosoft learnから、
[「Azure AI サービスのドキュメント」](https://learn.microsoft.com/ja-jp/azure/ai-services)
[「Microsoft Azure AI Fundamentals」](https://learn.microsoft.com/ja-jp/training/courses/ai-900t00)
より。
[解決済み]Laravel11 Broadcasting

**[解決しました。](#解決20240710)**

```:環境
Laravel 11
ドライバ Pusher
```

# 目的
チャットに接続している全てのユーザーにチャットを送れて見られるようにする。

# エラー内容
```:chromeデベロッパーツール
WebSocket connection to 
'wss://api.pusherapp.com/app/...=false'
failed:
createWebStock @ pusher-js.js?v=...
```

# 問題
チャットを送るまでは良いが相手側に表示されない。

# 試み
- Laravelキャッシュ削除、再起動
- GPTによる誤字脱字の確認
- [リリースノート](https://readouble.com/laravel/11.x/ja/broadcasting.html)の確認（よくわからない）
- Pusherオーバービュー確認

# 多分…
教材ではJavascriptを構ったりしていたのだが、俺はJavascriptを習得していない…！
さらにLaravelバージョンの違いで設定がいろいろ違うため、何が何だかわかっていない状況。

ブラウザのデベロッパーツールではエラーが出ているので特定しやすいはずだがさっぱりだ！

エラー内容的にpusherに接続できていない？のかもしれないが、pusherオーバービューをみると、現在接続している人数、メッセージの数はちゃんと記録されているので接続できてるのでは？とも思うが、エラーが出ているのでなにかしら接続不良が起きているのだろう…。

# 解決(2024/07/10)
**ほとんど兄に解決してもらいました。謝謝！！**

- Chrome拡張機能をオフ
- `AppServiceProvider.php`に以下を追加(use宣言も忘れず)
```
Broadcast::routes();
require base_path('routes/channels.php');
```
- `bootstrap.js`と`echo.js`にある`window.Echo`内の以下の項目をコメントアウト
```
wsHost: import.meta.env.VITE_PUSHER_HOST || 'ws.pusherapp.com',
wsPort: import.meta.env.VITE_PUSHER_PORT || 80,
wssPort: import.meta.env.VITE_PUSHER_PORT || 443,
enabledTransports: ['ws', 'wss'],
```

今回[これ](#エラー内容)意外にもいくつかエラーが出ており、一応それら全てを解決しましたが、俺自身完璧に理解しているというよりはなんとなくわかった程度でした。
まだ切り分けて特定する力が弱い。俺は弱い。
PycordでCogsを使うと定期実行などの裏技を便利に管理できる

pythonでdiscordbotを作るライブラリに、`pycord`というのがあります。
`pycord`では、`cogs`という機能があり、DiscordBotにおけるモジュール的な構成をすることができます。

https://guide.pycord.dev/popular-topics/cogs

> モジュールやエクステンションとして知られるコグは、コマンドをグループにまとめるのに使われます。 
これは、一般的な考え方が同じコマンドをグループ化するのに便利です（モデレーションコマンドなど）。
また、ボットのファイルが乱雑になるのを防ぐのにも役立ちます。

その中に、関数を定期的に実行する動作を書くことができるので
**なかなかにマニアックなテクニックですが**紹介します。

# 環境
```tex
py-cord >= 2.4
```

# cogsファイルの読み込み

```main.py
import discord
from discord.ext import commands

intents = discord.Intents.default()
bot = commands.AutoShardedBot(intents=intents)
path = "./cogs"

...

bot.load_extensions(
    'cogs.hoge',
    store=True
)
# store=Falseにすると、Cogでエラーが発生していた際にクリティカル警告となる

bot.run(TOKEN)
```

`import`で読み込むのではなく、`load_extensions`という関数で読み込みます。

```main.py
...

bot.load_extensions(
    'cogs.hoge',
    'cogs.huga',
    store=True
)
```
もちろん、cogsは増やせます。

また、コメントしていますが
`store`というオプションがあり、エラーが発生した際にクリティカルにするか設定できます。

```main.py
...
cogs_list = [
    'greetings',
    'moderation',
    'fun',
    'owner'
]

for cog in cogs_list:
    bot.load_extension(f'cogs.{cog}')
```
cogsはリストでも読み込むことができます。

# Cogsの書き方
```hoge.py
import discord
from discord.ext import commands 
from discord.commands import Option, OptionChoice, SlashCommandGroup

# クラス名にCogと付けたほうが分かりやすい
class HogeCog(commands.Cog):

    def __init__(self, bot:commands.bot):
        print(f"init -> {self.__class__}")
        self.bot = bot

    # nameは全て小文字
    group = SlashCommandGroup(name="name", description="description")

    # コマンド名は全て小文字。関数名の重複に注意。
    @group.command(name="ping", description="通信テスト")
    async def ping(self, ctx: discord.ApplicationContext):
        await ctx.response.send_message(content="pong!")

def setup(bot: commands.bot):
    bot.add_cog(HogeCog(bot))
```


# 気を付けること

discord.Botまたはdiscord.ext.commands.Botのインスタンスである`bot`を参照するには、
self.bot経由でアクセスする必要があります。

また、クラスの中にいるので、コマンドはすべてそのクラスのメソッドです。
このため、すべての関数は最初のパラメータとしてselfを持つ必要があります。
これがないと、ボットのインスタンスにアクセスできないのです。

例として、特定のチャンネルIDへメッセージを送信する場合、

```py
    async def send_channel_something(self): # 最初にselfを持つ
    
        # self.botからbotにアクセスしてチャンネルを取得
        channel = self.bot.get_partial_messageable(id=hoge_id) 

        # チャンネルにメッセージを送信
        await channel.send(content=message, embed=embed)
```

となるわけです。


# 定期実行を作ってみる

https://guide.pycord.dev/extensions/tasks#tasks

```py
class TaskCog(commands.Cog):

    def __init__(self, bot: discord.AutoShardedBot):
        print(f"init -> {self.__class__}")
        self.bot = bot
        self.something_loop_task.start()

    @tasks.loop(seconds=20)
    async def something_loop_task(self):
        print("hello task!")

    @something_loop_task.before_loop
    async def before_something_loop_task(self):
        print('waiting...')
        await self.bot.wait_until_ready()


def setup(bot):
    bot.add_cog(TaskCog(bot))
```

このCogsを読み込むと、20秒おきに`hello task!`とプリントされます。

この方法だと、asyncio地獄や「インターネットが切れたらどうしよう」「再接続はどうしよう」といった頭を悩ませるようなことを気にすることなく、バックグラウンド・タスクを作ることができます。

# 最後に

このようにcogsで分割すると、それぞれのコマンドや動作を便利に管理できるようになります。
ぜひ試してみてください！
Github Actions実行時のタイムゾーンはUTC

という小ネタです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257767/fd1c29d2-8c46-fb55-d4a0-f6d3b5040524.png)

確認のために使用したワークフローは以下です。

```yml
name: Debug

on:
  push:
    branches:
      - feature/*

jobs:
  check_timezone:
    name: Check Timezone
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Set up python
        uses: actions/setup-python@v5
        with:
          python-version: 3.8
      - run: python -c "import time; print(f'tzname {time.tzname}')"
```
leJOSをそっと触る

# 操作説明
独特な操作がいくつかあります。
| 操作 | 動作 |
| - | - |
| 選択 | 左右 or 上下 |
| 決定 | 中央 |
| 戻る | 左上 |
| 入力 | 上下左右 |
| 強制終了 | 左上+中央 長押し |
| **プログラム終了** | 中央+下 |

ボタンの数が6個しかないので、わからないときはすべて押してみて探ると見つかります。

# サンプルプログラムを動かす
![Samples](https://storage.googleapis.com/zenn-user-upload/fb909b9b23b6-20230913.png)
leJOSにはサンプルプログラムがいくつか用意されています。
「Samples」を選択すると、プログラムがリストになっています。
例として`GraphicsTest.jar`を選択して、「Execute program」を押すと実行されます。
最初にプログラムの説明が出てきます。ここで「motorをportAに繋げろ」と書いてあるので、繋げてください。面倒な方は接続しなくても実行できます。
モーターがポートAに繋げられたら、中央のボタンを押していざプログラムを動かしてください。
EV3の画面でいろいろな表示がされると思います。

他のサンプルプログラムも説明が表示されると思うので、説明を読みながらいろいろ実行してみてください。
# 機能紹介
### Run Default
ひとつ好きなプログラムを設定できます。
実行画面で「Set as Default」を選択すると設定できます。

### Programs
自分で作ったプログラムの格納場所。
今後書くプログラムはここに入っていきます。

### Samples
サンプルプログラムが置いてあります。
leJOSで何ができるか知ることができます。

### Tools
「Test Sensors」でセンサーの値のチェックができます。センサーのモードも変更できます。
「Remote Control」でIRセンサーで何かできるみたいですがIRセンサーを持っていないのでわかりません。IRセンサーを持っていないなら使う必要はないと思います。

### Bluetooth
Bluetoothの設定ができます。詳しくは後ほどのページで紹介します。

### Wifi
Wifiの設定ができます。詳しくは後ほどのページで紹介します。

### PAN
通信ネットワークの設定です。使用する場面がないのでわかりません。

### Sound
音量の設定ができます。「うるさいな」と思ったら音量を下げておくといいとです。

### System
いろいろな設定ができます。最初に少し目を通しておくといいと思います。

### Version
leJOSのバージョンが見れます。

# 注意事項
leJOSのmenuを動かすうえで注意しておかないといけないことをまとめます。
1. 「Tools＞Remote Control」を押すと、バグで戻れなくなるので強制再起動が必要になります。
2. 「PAN」を押すと、その後いくつかの動作のたびに40秒ほど待たせられるので、特別な理由がなければ、絶対に押さないことを推奨します。直すにはOSの再インストールをしてください。
3. 「System＞Auto Run」を押すとデフォルトに設定されたプログラムが起動時に実行されますが、なぜかエラーが発生し二度とメニューを開けなくなるので、絶対に押さないでください。直すにはOSの再インストールをしてください。
4. 「System＞Suspend menu」を押すとメニューが操作不可になり、PC側からのみコントロールできるモードに切り替わります。PCに接続していない場合は押さないでください。押した場合は、強制再起動が効かないのでバッテリーを引っこ抜いてください。
Pythonの列挙型の個数、最大値、最小値の取得

Pythonの列挙型(Enum)の個数、最大値、最小値の取得の仕方を備忘録として以下に示す。

```py:enum.py
from enum import Enum, unique
@unique
class Position(Enum):
	SQUARE = 0
	SHORT  = 1
	LONG   = 2

@unique
class Action(Enum):
	WAIT      = 0
	SHORT     = 1
	LONG      = 2
	LIQUIDATE = 3

print(len(Action)) # 個数 4
print(max([e.value for e in Position])) # 最大値 2
print(min([e.value for e in Position])) # 最小値 0
```
ノンオーバラップクロックの設計



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/80a2fec1-6e09-1e17-aae5-29b532f2beb8.png)

参考文献
https://www.ieice-hbkb.org/files/10/10gun_06hen_01.pdf


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/cc639a9b-31e5-d413-7e2a-28c7dab0341d.png)

ノンオーバーラップクロックの入力はパルスジェネレータで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/a5e3db61-bda7-2043-d95b-82ea2bd74026.png)


MATLAB Functionブロック、Simulinkモデルのコードで作る方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/d1aa651a-da0d-10d8-d975-7e5c26220ec0.png)

```
function [output_signal1, output_signal2, output_counter] = compute_signals(input_signal)

% カウンターの初期化
persistent counter;
if isempty(counter)
    counter = 0;
end

% マスタークロックの立ち上がりでカウンターをインクリメント
counter = counter + 1;

% カウンターが4になったら1にリセット
if counter > 4
    counter = 1;
end

% 出力信号1の定義: カウンターが1のときだけ1を出力 (input_signalが1のときに限る)
if counter == 1 && input_signal == 1
    output_signal1 = 1;
else
    output_signal1 = 0;
end

% 出力信号2の定義: カウンターが3のときだけ1を出力 (input_signalが1のときに限る)
if counter == 3 && input_signal == 1
    output_signal2 = 1;
else
    output_signal2 = 0;
end

% カウンターの出力
output_counter = counter;

end



```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/3d2d530e-9cc7-84c9-bf3e-6b8df2554704.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/e37a45b4-11e9-e286-8fed-0d258edc6659.png)


こちらでも作れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/a887da8d-9473-0ab7-95ec-105ede5c4d6a.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/72ce6283-8586-3b90-4498-89da58731540.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/101a7462-05fd-c347-e030-4f54fa40f3ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/9bf917ac-c212-608c-9139-d13ec7ca7a0c.png)
Google ColabでGemini APIを使う

# はじめに

今回やること
・Gemini API Keyの生成
・Google ColabでGemini APIを試す


# Gemini APIを取得する

まずはGemini APIキーを作成します。以下のURLにアクセスします。

https://ai.google.dev/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/72c31bc0-0688-6132-7cc2-b11b31586edd.png)

Get API Keyを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/29f46ed0-72f3-fab1-11d2-f89949f5dc9c.png)

利用規約に承諾して、APIキーを新規作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/720cf5ce-c9b1-04c4-3ace-c89a8bc9f801.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e807cf04-3d20-8283-ece8-8b02127f13f5.png)

APIキーが生成されたらメモしておいてください。これでGemini APIを使用できます。

# Google ColabでAPIキーを試す

サンプルコードが公開されていますので、こちらでAPIを試すことができます。

https://colab.research.google.com/notebooks/snippets/gemini.ipynb?utm_medium=link&utm_campaign=gemini

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/b97dfe44-2c32-f720-8456-747eca7aeee5.png)

画面左の「カギ」アイコンを選択し、「＋新しいシークレットを追加」をクリック。

:::note info
名前に`GOOGLE_API_KEY`と入力し、値に`先ほど生成したAPI Key`を入力します。
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/f98b2af8-ed82-b9eb-f977-164d02fc595c.png)

シークレットキーの設定ができれば、準備完了です。以下のアイコンをクリックして実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/a87ae473-32bd-8e3f-606c-d8ce5088db49.png)

`text`テキストの内容を色々変えて実行してみるとGeminiが返事をしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/2256e9eb-316b-019f-1602-96f279cef4d7.png)

Geminiについて聞いてみると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/c6b98d39-65b8-fadb-1237-6e69ab7373f5.png)


:::note warn
以下がGeminiの回答です。
:::

**Google Gemini AI**

Google Gemini AIは、Googleが開発した、大規模言語モデル（LLM）です。LLMとは、膨大な量のテキストデータをトレーニングして言語処理タスク（例：自然言語理解、生成）を実行するように設計された機械学習モデルです。

**Gemini AIの特徴：**

* **大規模:** 何兆もの単語でトレーニングされており、世界最大のLLMの1つです。
* **多目的:** 自然言語処理タスクの幅広い範囲を実行できます（例：言語翻訳、要約、対話生成）。
* **高精度:** テキスト生成や理解のタスクで高い精度を示します。
* **スケーラブル:** クラウドベースで、必要に応じてリソースを拡張できます。
* **責任ある開発:** Googleの責任あるAIの原則に従って開発されています。

**Gemini AIの用途：**

Gemini AIは、さまざまな用途に利用できます。

* **検索改善:** 検索結果の関連性と精度を向上させます。
* **チャットボットと仮想アシスタント:** より自然な対話型エクスペリエンスを作成します。
* **言語翻訳:** リアルタイムでの正確でニュアンスに富んだ翻訳を提供します。
* **コンテンツ作成:** マーケティング素材、記事、ストーリーなどの高品質なテキストを生成します。
* **研究と開発:** 言語処理の分野の研究を推進します。

**その他の特徴：**

* **対話型:** ユーザーとの対話を通じて学習し、改善できます。
* **カスタマイズ可能:** 特定のタスク用に微調整できます。
* **API経由で利用可能:** 開発者がアプリケーションに統合できるようにします。

現在、Gemini AIは早期アクセスプログラムを通じて限定的に利用できます。
arron070 回復ポイント削除手順 2024/09/26

# スイッチロール
* 下記のコマンドでロールをスイッチする。
```スイッチロールコマンド-Profile認証利用する場合.sh
export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \
    $(aws sts assume-role \
    --role-arn {対象ロールのARN} \
    --role-session-name {セッション名指定} \
    --profile {profile名指定} \
    --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
    --output text))
```
```スイッチロールコマンド-Default認証利用する場合.sh
export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \
    $(aws sts assume-role \
    --role-arn {対象ロールのARN} \
    --role-session-name {セッション名指定} \
    --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
    --output text))
```
```スイッチロールコマンド-サンプル.sh
export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \
    $(aws sts assume-role \
    --role-arn arn:aws:iam::123456789012:role/DevRole \
    --role-session-name AWSCLI-Session \
    --profile dev_deploy \
    --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
    --output text))
```

# 現在利用しているCredentialの確認
* 下記のコマンドでスイッチロールが成功したかどうかを確認する。
```credential確認コマンド.sh
aws sts get-caller-identity
```

# 回復ポイントを削除
```回復ポイントを削除するコマンド.sh
aws backup delete-recovery-point \
    --backup-vault-name {バックアップボルト名} \
    --recovery-point-arn {回復ポイントARN}
```
```回復ポイントを削除するコマンド-サンプル.sh
aws backup delete-recovery-point \
    --backup-vault-name MyBackupVault \
    --recovery-point-arn arn:aws:backup:us-west-2:123456789012:recovery-point:abcdefg-hijk-lmnop-qrst-uvwxyz
```
PHP laravel ファサードの前の\って何者？

## 概要

laravelでファサードを使う時にuse宣言せずとも`\`をつけることで直接ファサードを呼び出す事ができる。
これがどういうことなのか簡単にまとめる。

## 内容

```php
<?php

use Illuminate\Support\Facades\Validator;

Validator::resolver();
```

と

```php
<?php

\Validator::resolver();
```

は全く同じ動作をする。

`\Validator::`って記載するとuse宣言で`use Illuminate\Support\Facades\Validator;`って書かなくてもそのまま使える。
ファサードは使いやすいように\を用いることで省略呼び出しする事ができる。

ちなみにこんな書き方もできる。

```php
<?php

use \Validator;

Validator::resolver();
```

今まで書いた全て同じ動作をする。
気にするならチーム内でどの書き方をするのかを決めておいたほうが良さそう。

基本無いと思うけどlaravelのバージョンアップでファサードのNamespaceが変わる可能性もあるので下記の書き方が自分は好み

```php
<?php

use \Validator;

Validator::resolver();
```
初心者必見！Unity Hubの使い方ガイド


## Unity Hubとは何か？

Unity Hubは、Unityの開発プロセスを簡略化し、効率化するためのツールです。

プロジェクトの作成や管理、エディタのバージョン管理など、さまざまな機能を提供しています。



### Unity Hubのインストール方法

まずはUnity Hubをインストールしましょう。

公式サイトからダウンロードし、インストーラの指示に従います。

以下に具体的な手順を説明します。



#### Windowsでのインストール手順

Windowsユーザーは、公式サイトからインストーラをダウンロードし、指示に従ってインストールを進めます。

インストールが完了すると、Unity Hubが自動的に起動します。



#### Macでのインストール手順

Macユーザーも同様に、ダウンロードしたファイルを開き、インストーラの指示に従ってインストールします。

インストール後は、Unity Hubを起動してアカウントにログインします。



### エディタのインストールと管理

Unity Hubを使えば、複数のバージョンのUnityエディタを簡単に管理することができます。

プロジェクトごとに異なるバージョンを使用したり、新しいバージョンを試したりすることが可能です。



#### エディタのインストール方法

Unity Hubを開き、必要なバージョンのエディタを選択してインストールします。

追加のモジュールもインストールできます。

エディタのインストールが完了すると、新しいプロジェクトを作成する準備が整います。



## プロジェクト管理のコツ

Unity Hubを使ってプロジェクトを効率的に管理しましょう。

新しいプロジェクトの作成や既存プロジェクトの管理が簡単に行えます。



### プロジェクトの新規作成

新しいプロジェクトを作成する際には、テンプレートを選び、プロジェクト名を入力します。

その後、プロジェクトの設定を行い、作成ボタンを押します。



#### プロジェクトの管理方法

既存のプロジェクトを開いたり、削除したり、バックアップを取る方法を紹介します。

プロジェクトを開くと、以前の作業を再開することができ、バックアップを取ることでデータの消失を防ぐことができます。



### チームでのコラボレーション

Unity Hubを使えば、チームでの共同作業もスムーズに行えます。

バージョン管理システムを利用して、プロジェクトの進行を管理します。



#### バージョン管理システムの利用

バージョン管理システムを使うことで、チームメンバー間の作業を円滑に進めることができます。

変更履歴を追跡し、必要に応じて以前のバージョンに戻すことが可能です。



## まとめ

Unity Hubは、Unityの開発を効率化するための非常に便利なツールです。

初心者からプロフェッショナルまで、幅広いユーザーが利用できます。



・Unity Hubのインストール方法
・エディタのバージョン管理とインストール
・プロジェクトの新規作成と既存プロジェクトの管理
・チームでのコラボレーションとバージョン管理

これらの機能を活用して、開発をさらに効率的に進めていきましょう。

https://feynman.co.jp/unityforest/unity-introduction/how-to-install-unityhub/
Ubuntu24.04にUnityhubをインストールして起動失敗した場合の対応

# はじめに

Ubuntu 24.04にUnityhubをインストールしても、Unityhubの起動に失敗した。

AppArmorと呼ばれるLinuxカーネルのセキュリティモジュールがUnityhubの動作を妨げてしまっているらくし、Unityhubのアクションを拒否しないようにアクセス権を変更することで、解決できた。

備忘としてメモする。

### 参考にしたフォーラム

[Unity Hub and (X)ubuntu 24.04 not starting Workaround](https://forum.unity.com/threads/unity-hub-and-x-ubuntu-24-04-not-starting-workaround.1586640/#post-9910341) 

# Unityhubのインストール

[公式ページ](https://docs.unity3d.com/hub/manual/InstallHub.html#use-the-installer)を参考にインストールする。

aptのリポジトリ情報はdeb822形式というフォーマットにUbuntu24.04から変更となっている点に注意する必要がある。

~~~bash
$ wget -qO - https://hub.unity3d.com/linux/keys/public | gpg --dearmor | sudo tee /usr/share/keyrings/Unity_Technologies_ApS.gpg > /dev/null

$ cat /etc/apt/sources.list.d/unityhub.sources 
Types: deb
URIs: https://hub.unity3d.com/linux/repos/deb
Suites: stable
Components: main
Signed-By: /usr/share/keyrings/Unity_Technologies_ApS.gpg

$ sudo apt update

$ sudo apt-get install unityhub

~~~

Unityhubのインストールは上記で完了するが、この時点ではUnityhubnの起動に失敗する。

下記を追加で実施すると、無事に起動できた。

~~~bash
$ cat /etc/apparmor.d/unityhub 
abi <abi/4.0>,
include <tunables/global>

profile unityhub /opt/unityhub/unityhub-bin flags=(unconfined) {
userns,

# Site-specific additions and overrides. See local/README for details.
include if exists <local/unityhub>
}

$ sudo systemctl restart apparmor.service

~~~
Reactでアイコンのアセットを使いたいならreact-icons

Reactでアイコンを使う場合、どのように実装していますか？
SVGのデータをプロジェクト内にわざわざ用意していたりしないでしょうか？

react-iconsを使えば、BootstrapやFont Awesomeなどを含む計30種類以上のデザインライブラリに用意されたアイコンを利用することができます。

https://github.com/react-icons/react-icons

公式ドキュメント
https://react-icons.github.io/
laravel 取得した値をcreated_atで並び替える

## 方法

1. DBからクエリビルダで->toArrayを用いて配列で取得
1. usortでソートし直す

```
// Post(オブジェクト)の配列を、Post(配列)の配列に変換する
$posts = $user->posts->toArray();
// 第1引数にPostの配列を、第2引数に$a、$b(を
// 引数に持つコールバックを渡す
usort($posts, function ($a, $b) {
    if ($a['updated_at'] != $b['updated_at']) {
        // 両者のupdated_atが異なる、つまり比較が可能
        return ($a['updated_at'] < $b['updated_at']) ? +1 : -1;
    }

    if ($a['created_at'] != $b['created_at']) {
        return ($a['created_at'] < $b['created_at']) ? +1 : -1;
    }

    // 両者のupdated_at、created_atが同じ場合、idで比較
    return ($a['id'] < $b['id']) ? +1 : -1;
});
```

## 参考文献

- https://qiita.com/kshiva1126/items/4c1b689a94642492c833
- https://qiita.com/ucan-lab/items/47638a7b52090f59c2bf
Azure Automation Hybrid Runbook Worker（拡張機能ベース）についてまとめておく

:::note info
2024/07/01 追記
構成例について、Automation AccountでPE構成をとる形へと変更しております。
:::
### はじめに
最近よくRunbookでの開発を業務で使用するのですが、色々と分かってきたことがあるので、ここにまとめておきます。

#### 目次
+ [HybridRunbookWorkerとは](#hybridrunbookworkerとは)
+ [WorkerGroupの構成に注意](#workergroupの構成に注意)
+ [拡張機能のインストール方法](#拡張機能のインストール方法)
+ [ネットワーク要件はシンプル](#ネットワーク要件はシンプル)
+ [構成例](#構成例)

## HybridRunbookWorkerとは
通常、Azure AutomationのRunbookはAzureクラウドプラットフォーム上で動作をするものですが、Hybrid Runbook Workerでは仮想マシンのOSでスクリプトを直接動かすことができます。
つまり、<font color="Red"> 仮想マシンのOSで起動するスクリプトを実行できる機能</font> です。
参考：[MS Learn:Automation Hybrid Runbook Worker の概要](https://learn.microsoft.com/ja-jp/azure/automation/automation-hybrid-runbook-worker)

## WorkerGroupの構成に注意
以下留意しておく必要があります。
+ RunbookはWorker Groupを指定して起動できる
+ Worker Group内に複数のメンバーがいる場合、最初に疎通のとれた(Pingを受信した)メンバーでジョブを実行する
+ 一度の疎通で実行できるジョブは1つのWorkerごとに4つまで、それ以上の場合はジョブがエラー停止する。

まとめると下図のような、感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/6baaa587-e96c-618c-171b-47dee52b8f59.png)

※１つのジョブをすべてのWorkerで同時実行させたい場合は、パターン②のようにHybrid Runbook Worker GroupとWorkerを1対1の関係にしておく必要があるので、この点は注意しましょう。

## 拡張機能のインストール方法
 Hybrid Runbook Worker Groupに追加することで、自動的にインストールされます。
 オンプレミス環境については、先にConnected Machine エージェントをインストールしてAzure Arcで管理で器用にしておく必要があります。
以下、拡張機能の要件などがまとまったDocsとなります。
参考：[MS Learn:拡張機能ベースの Windows または Linux ユーザー Hybrid Runbook Worker を Azure Automation にデプロイする](https://learn.microsoft.com/ja-jp/azure/automation/extension-based-hybrid-runbook-worker-install?tabs=linux%2Cbicep-template)

## ネットワーク要件はシンプル
MSのドキュメントにはこんな感じの絵が載っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/09b399e3-3374-493e-3967-b84b8afc6532.png)
参考：[MS Learn:Automation Hybrid Runbook Worker の概要](https://learn.microsoft.com/ja-jp/azure/automation/automation-hybrid-runbook-worker)

要点は以下まとめておきます。
+ オンプレ-->Automation Account、Vnet-->Automation Accountでの通信は基本的に443で通信する。
+ 基本的に、Automation Accountから見てインバウンド通信のみ発生。
+ Hybrid Runbook WorkerがAutomation Accountにポーリング(Port:443)でジョブを取得する。
+ Hybrid Runbook WorkerがHybrid Runbook Worker VM拡張機能と通信をして、ポーリングやスクリプトの起動をしてくれる。
+ Private Endpoint構成が可能

## 構成例
オンプレミス環境と仮想ネットワーク環境、AutomationAccount間で通信を行う構成例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678759/441b6ac3-c599-a9cb-4706-0cff4dbfa090.png)


①仮想マシンからPrivate Endpointへ直接通信する。名前解決は同仮想ネットワーク内のため、内部DNSで可能。

②オンプレミス環境からの通信においても、同様にAzure Firewallを経由してAzure Automation Accountへ通信する。AzureArc対応サーバ側で以下参考のProxyの設定が必要。
参考：[MS Learn:拡張機能ベースの Windows または Linux ユーザー Hybrid Runbook Worker を Azure Automation にデプロイする](https://learn.microsoft.com/ja-jp/azure/automation/extension-based-hybrid-runbook-worker-install?tabs=linux%2Cbicep-template)
※図ではVPN通信を想定した記載だが、ここはExpressGatewayでもなんでもOK

③FirewallのProxy設定を使用してAutomation AccountのPrivate Endpoint通信を転送します。
設定については、以下の記事を参考にしてください。
参考：[MS Learn:Azure Firewall DNS プロキシの詳細](https://learn.microsoft.com/ja-jp/azure/firewall/dns-details)
参考：[プロキシサーバとしてAzure Firewallを使う](https://zenn.dev/azachi/articles/0b4166461f7729)

④Private EndpointからAutomation Accountへ通信。
[Git/GitHub] Git-flow と GitHub-flow の違い

# まとめ
相違点は大きく分けて下記となります。
1. **リリース管理:** Git-flowはリリース管理に重点を置いており、releaseブランチやhotfixブランチが存在します。GitHub Flowでは、主にmain/masterブランチとfeatureブランチで管理します。
1. **使用シーン:** Git-flowは大規模なプロジェクトやリリースサイクルが明確なプロジェクトに向いています。GitHub Flowは小規模なプロジェクトや、継続的にデプロイを行うプロジェクトに適しています。

# 目次
- [Git-flowとは](#Git-flowとは)
- [Git-flowのワークフロー](#Git-flowのワークフロー)
- [GitHub-flowとは](#GitHub-flowとは)
- [GitHub-flowのワークフロー](#GitHub-flowのワークフロー)

# Git-flowとは
Git-flowは主に機能ごとにブランチを使い分けて開発を進めていく手法です。次の6つのブランチを用いて開発していきます。
- master
本番環境のブランチで、リリースするために使う。ここでは直接コミットせず、マージのみ行う。
※masterブランチ上では開発を行わない。
- develop
開発中の主軸となるブランチ。developからfeatureブランチを作成し、そこで作業する。
※developブランチ上では開発を行わない。
- feature
機能の追加や変更、不具合の修正など実際に開発を行うブランチ。作業完了後、developにマージする。
- release
検証環境、もしくはリリース準備用のブランチ。developから作成し、リリースに伴う細かい修正等を行う。
作業完了後、masterブランチとdevelopブランチにマージする。
※releaseブランチがあることで、リリース作業中にもdevelopブランチで並行して開発を進めることができる。
- hotfix
リリース後にバグが発生した場合、修正を行うブランチ。
masterブランチから作成し、作業完了後、masterブランチとdevelopブランチにマージする。
- support
旧版のサポートをするときに用いるブランチ。オプションであり、使わないこともある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/03149d12-a660-e42c-2dc1-742a50dacc37.png)


# Git-flowのワークフロー
1. masterブランチからdevelopブランチを作成し、developブランチからfeatureブランチを作成する。
1. featureブランチで開発をする。
1. 2.が完了したら、developブランチにマージする。
1. developブランチにいくつかのfeatureブランチがマージされたら、developブランチをreleaseブランチにマージし、リリースのための微調整を行う。
1. 4.が完了したら、releaseブランチをmasterブランチとdevelopブランチにマージする。
1. masterブランチにマージできたら、デプロイを行う。

#### ※バグが発生した場合
1. masterブランチから直接hotixブランチを作成する。
1. hotfixブランチで修正が完了したら、masterブランチとdevelopブランチにマージする。
1. masterブランチにマージできたら、デプロイを行う。

# GitHub-flowとは
GitHub Flowは、Git-flowを簡略化したものです。
Git-flowのような決まったブランチ名はありませんが、次のブランチを用いて開発していきます。

- main/master
本番環境のブランチ。常にリリース可能な状態である。
- feature
作業開始時にmasterブランチから作成するブランチ。ブランチ名は、作業内容が分かりやすい名前にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/0c52c166-3f01-3492-cce7-a60db3e546ed.png)

# GitHub-flowのワークフロー
1. masterブランチからブランチを作成し、作業をする。
※作業用ブランチは定期的にプッシュすること。
1. 作業が完了したら、プルリクエストを作成し、コードのレビューを依頼する。
1. 2.で確認ができたら、masterブランチへマージする。
1.  masterブランチにマージできたら、デプロイを行う。

# 参考リンク
- [【Git】ブランチ運用ルール「Git-flow」と「GitHub Flow」](https://supersoftware.jp/tech/20221021/17928/)
- [A successful Git branching model](https://nvie.com/posts/a-successful-git-branching-model/)
- [Git/GitHub branching standards & conventions](https://gist.github.com/digitaljhelms/4287848)
Remix Prismaのseedを実行する

## 概要

RemixにてPrismaのseedを使ってテーブルにデータを追加する方法を簡単にまとめる。

## 前提

下記の記事を参考にusersテーブルが作成されていること。

https://qiita.com/miriwo/items/6c0837dcd12398acabdc

## 方法

1. prismaディレクトリ直下にseed.tsというファイルを作成し、下記の様に記載する。（`touch prisma/seed.ts` を実行して作成した。）

    ```prisma/seed.ts
    import { PrismaClient } from '@prisma/client';
    
    const prisma = new PrismaClient();
    
    async function main() {
      const users = [
        { name: 'Alice', email: 'alice@example.com' },
        { name: 'Bob', email: 'bob@example.com' },
        { name: 'Charlie', email: 'charlie@example.com' },
        { name: 'David', email: 'david@example.com' },
        { name: 'Eve', email: 'eve@example.com' },
        { name: 'Frank', email: 'frank@example.com' },
        { name: 'Grace', email: 'grace@example.com' },
        { name: 'Helen', email: 'helen@example.com' },
        { name: 'Isaac', email: 'isaac@example.com' },
        { name: 'Judy', email: 'judy@example.com' }
      ];
  
      for (const user of users) {
        await prisma.users.create({
          data: user
        });
      }
  
      console.log('10 users created.');
    }
    
    main()
      .catch((e) => {
        console.error(e);
        process.exit(1);
      })
      .finally(async () => {
        await prisma.$disconnect();
      });
    ```

1. 下記を実行して関連パッケージをインストールする。

    ```shellscript
    npm install -D typescript ts-node @types/node
    ```

1. 下記の内容をpackage.jsonのscriptsの中に記載する。

    ```package.json
    "seed": "node --loader ts-node/esm prisma/seed.ts"
    ```

1. 下記を実行してマイグレーションを行う。

    ```shellscript
    npx prisma migrate dev
    ```

1. 下記を実行してseedの実行を行う。

    ```shellscript
    npm run seed
    ```

1. 一旦テーブル内のデータだけを消してからseedしたい場合下記を実行する。

    ```shellscript
    npx prisma migrate reset
    npm run seed
    ```

## 参考文献

https://www.prisma.io/docs/orm/prisma-migrate/workflows/seeding
AmazonでminiPCを購入した場合、最初にOSをクリーンインストールすべし

# はじめに

N95やN100といったAlder Lake-NのCPUによって激安miniPCでもそこそこ快適に動くようになり、miniPCが注目されるようになって半年くらい経ったでしょうか。<br><br>

私自身は、昔からminiPCを使うことがしばしばあり、AtomとかCeleronといった低スペックminiPCに苦しめられてきました。（涙）<br><br>

さて、今の職場はBYODが認められている（と書けば聞こえは良いですが、実際は大した機材が割り当てられていない）ため、メイン機はサブマシンとして持っていたRyzen7 7735HS＋メモリ32GBのminiPCです。<br><br>

このminiPCですが、どうも中国語OSを日本語に変更して出荷しているだけのようで、ちょくちょく不具合（？）が起きたこともあり、MicrosoftよりダウンロードしたWinsows11(JP)のISOを使ってクリーンインストールしました。<br><br>

で、「これライセンスどうなってんの？」と気づいてしまいました・・・
<br>
<font color="red">ライセンス云々に関係なく、miniPCを買った場合はマルウェア（ウイルスやスパイウェア）のリスクが払拭しきれないため、日本語版イメージでのクリーンインストールをおすすめします</font>

# Windowsライセンスについて

Amazonなどで販売されているminiPCの多くはVL版（ボリュームライセンス版）で、「大外れ」と「半外れ（？）」が存在するようです。<br><br>

>ボリュームライセンスはそもそも法人ユーザー向けの商品なので、本来であればミニPCを販売している業者が社内で使うことを想定したライセンスのはずで、それを個人に売り捌くことはライセンス違反になる可能性があります。

https://computerlabo.fc2.page/minipc-vl/


<br>
「半外れ」（グレー）＝VOLUME_MAK channel
「大外れ」（真っ黒）＝VOLUME_KMS channelで、下手をすると半年せずにライセンスが切れることもあるとか（恐ろしい）
<br>

流石にそこまで阿呆なことはしていないと思われるので、だいたいがVOLUME_MAK channelだろうという推測がつきます。なお、「MINISFORUM」や「CHUWI」はOEMライセンスの模様。

# さっそく調べてみよう！

コマンドプロンプトなどで、`slmgr -dli`と叩けば、ライセンスの状態がわかります。

```
slmgr -dli
```
<br>

![31HDahUmoNL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3834145/b188f592-1e19-e9b5-91e2-e11a8153bf80.jpeg)

案の定、半外れでした（涙）

# ほんまにクリーンインストールしてええんか？

心配ならドライバー類をきちんと保存してからクリーンインストールを推奨します。私の場合は普通にクリーンインストールして不具合なかったです。運が良かっただけ？

ドライバ一覧は、コマンドプロンプトなどで`driverquery`と叩けば一覧が出ますので、念のために保存しておく。
```
driverquery
```
で、ドライバの保存は以下をたたけば保存できます。`C:\X (Where X is the folder name you created.)`は任意のフォルダです。
```
dism /online /export-driver /destination:C:\X (Where X is the folder name you created.)
```
WindowsのISOは以下からダウンロード出来ます。USBメモリでインストールディスクを作っても良し、デスクトップにISOを保存してそのまま読み込んでインストールも出来たはずです。

https://www.microsoft.com/ja-jp/software-download/windows11

<br>
ライセンスの保存に心配がある方は、microsoftアカウントに紐づけしたり、ShowKeyPlusを使って、保存されることをおすすめします。

https://apps.microsoft.com/detail/9pkvzcprx9nv?activetab=pivot%3Aoverviewtab&hl=ja-jp&gl=JP

なお「クリーンインストールすると、VL版からリテール版にライセンスが変わった！」という報告がネットで散見されますが、根本的な解決にはなっていないと思います。私はこいつをメイン機として仕事に使うのに大きな抵抗感が生まれました。確か部屋に1つくらい正規ライセンスあった気がするので、それで上書きしてしまおうと思います。使い道ないし。SSDとOEM版のOSを買ってきてライセンス上書きしてしまうのも良いと思います。

最後にもう１度だけ・・・

<font color="red">ライセンス云々に関係なく、miniPCを買った場合はマルウェア（ウイルスやスパイウェア）のリスクが払拭しきれないため、日本語版イメージでのクリーンインストールをおすすめします</font>