OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel11】1分に1回自動で実行するバッチを作成する

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回はLaravel11を使用してバッチを作成していきたいと思います。

# ファイル作成(コマンド作成)

以下のコマンドを使用してバッチを作成します。

```
php artisan make:command ExampleBatch
```

実行すると、`src/app/Copnsole/Commands`ディレクトリ配下に`ExampleBatch.php`というファイルが作成されます。

```php:ExampleBatch.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class ExampleBatch extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:example-batch';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        //
    }
}

```

これでコマンドが作成できました。

# 作成したコマンドを実行

作成したコマンドを実行するには以下のコマンドを実行します。

```
php artisan app:example-batch
```
`app:example-batch`は`ExampleBatch.php`の`protected $signature = 'app:example-batch';`と書いてある部分です。ここを修正するとコマンドを変更することができます。

実行すると以下のようになります。

```
root@d720a6c8975b:/app# php artisan app:example-batch
root@d720a6c8975b:/app# 
```
これだけだと本当に実行されているかわからないので、`こんにちは`と実行した時にコンソールに出すようにしたいと思います。

`ExampleBatch.php`ファイルを以下のように修正します。

```php:ExampleBatch.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class ExampleBatch extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:example-batch';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $this->info("こんにちは");　  // ←追加
    }
}

```

これで先ほどのコマンドを実行すると以下のようになります。

```
root@d720a6c8975b:/app# php artisan app:example-batch
こんにちは
root@d720a6c8975b:/app# 
```

しっかり実行されていることが確認できました。

# 1分に１回実行させるようにする

今作成したコマンドを１分に一回自動で実行されるようにしたいと思います。

`routes.php/console.php`に以下のコードを追加します。

```php:routes.php/console.php
<?php

use Illuminate\Support\Facades\Schedule;
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;

Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote')->hourly();

Schedule::command('app:example-batch')->everyMinute();  ← 追加
```

これで以下のコマンドでスケジュールを確認してみます。

```
php artisan schedule:list
```

```
root@d720a6c8975b:/app# php artisan schedule:list

  0 * * * *     php artisan inspire .................................................................................................. Next Due: 20 minutes from now
  * * * * * 1s  php artisan app:example-batch ......................................................................................... Next Due: 0 seconds from now

root@d720a6c8975b:/app# 
```

`* * * * * 1s  php artisan app:example-batch `と書いてあるので、無事1分に１回実行するように修正できました。


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://readouble.com/laravel/11.x/ja/scheduling.html
GarminのWatchFaceアプリでスマホとBluetoothで接続されていることを見える化！

# はじめに

GarminのWatchFaceを開発する際にサンプルとして開発したときの手順をまとめます。

今回は以前の記事「[GarminのWatchFaceアプリでHello,world!](https://qiita.com/nyanko5656/items/6177de3f5cd4d57fd7ca)」を使った内容になります。

# 前提条件
* 「[GarminのWatchFaceアプリでHello,world!](https://qiita.com/nyanko5656/items/6177de3f5cd4d57fd7ca)」の動作確認までできる状態であること

# 手順
## 表示させたい機能の画像を用意する
Bluetoothでスマホと接続されたときにBTマークを表示してみたいと思います。
高さ22px ✕　横15px の画像を用意しました。
![ble.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/4cd2ced2-072b-a23d-d696-5d04cbf148da.png)

## 画像を設定
下記ディレクトリに配置します。
[resources]>[drawables]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/527e717f-e21c-9fcf-7bc8-ca5d5302a99c.png)

やっていることは[GarminのWatchFaceアプリで背景デザインを変更！>背景画像を設定](https://qiita.com/nyanko5656/items/7fd73e173559bb55c4ad#%E8%83%8C%E6%99%AF%E7%94%BB%E5%83%8F%E3%82%92%E8%A8%AD%E5%AE%9A) と同じです。

続いてdrawables.xmlにBTマーク画像を表示させる行を追加します。
```diff_xml:drawables.xml
<drawables>
    <bitmap id="LauncherIcon" filename="launcher_icon.png" />
+   <bitmap id="bmBluetoothIcon" filename="ble.png" />
</drawables>
```

続いてBTマークを表示させる条件を〇〇View.mcファイルに記述します。(〇〇部分はファイル生成時の名前)
関連するコードの前後を抜粋して記載します。

```diff_c:sampleFace04View.mc
class sampleFace04View extends WatchUi.WatchFace {

+   // bluetooth関連アイコンと位置情報
+   var bmBluetooth;
+   var bmBtPosion;
    
    function initialize() {
        WatchFace.initialize();
+       //drawables.xmlで設定したidからアイコン情報をロード
+       bmBluetooth = WatchUi.loadResource(Rez.Drawables.bmBluetoothIcon); 
    }

    // Load your resources here
    function onLayout(dc as Dc) as Void {
        setLayout(Rez.Layouts.WatchFace(dc));
+       //BTアイコンを位置決め
+       bmBtPosion = [dc.getWidth()/2 + 20, 10];
    }

+   // Bluetooth接続ステータスを取得し表示する。
+   function drawBT(dc) {
+   	var info = System.getDeviceSettings();
+   	if (info.phoneConnected) {
+  		dc.drawBitmap( bmBtPosion[0] ,bmBtPosion[1]  , bmBluetooth);
+        }
+    }

+ // ちょっと省略

 function onUpdate(dc as Dc) as Void {
+       // またまた省略
        // Call the parent onUpdate function to redraw the layout
        View.onUpdate(dc);
+       // function drawBT関数を呼び出し
+       drawBT(dc);
    }
}
```

これでビルドを実行するとBluetoothアイコンが表示されます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/9406e3f3-df25-ee24-79b1-d0e0e59fd785.png)

## 動作確認
仮想環境内でBluetooth設定をオフにしてみます。
画面上部の[Settings]>[Connection Type]>[BLE]>[Not Connected]
でオフにすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/3b75e4ac-c60d-a3f3-3e0e-2b8e7dc34b69.png)
そうすると、Bluetooth接続が切れたことになるため、アイコンが非表示になりました:clap:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/2df2bbef-dd1e-9add-02dc-2c138780b00a.png)

# 終わりに
今回はここまでにします。
次回はなにか思いついたら作ります。

# 参考リンク
https://note.com/run_bike_other/n/n9bdc41d733ae?magazine_key=mab35ddd423f5

https://developer.garmin.com/connect-iq/api-docs/Toybox/System/DeviceSettings.html

https://take4-blue.com/program/garmin/garmin%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E6%99%82%E8%A8%88/
AWS Transit Gateway の基本概念

Transit Gateway (以降、TGW と表記) について、個人的に押さえておきたいところを書きました。

## TGW で良くなること

- VPC 間の接続が多数必要な場合に VPC Peering と比較して管理が楽になる
  - VPC Peering の場合は通信したい VPC 同士をすべて Peering する必要があるので、VPC が増えるにつれて構成が非常に複雑になる
  - TGW なら、通信させたい VPC をすべて TGW に繋げばよい
- 設定次第では、TGW に接続したすべての VPC/VPN 間で通信させることができ、この構成の場合は非常に簡単に設定することができる

例えば 4 つの VPC を相互に通信させたい場合、VPC Peering だと下記のように、非常に複雑な構成になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/c6403bca-5854-8081-f72e-53720bf0ea52.png)

これが TGW なら、Default route table association と Default route table propagation を有効な状態で構築してあげれば下記のように各 VPC を TGW に接続すれば OK です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/8ea802b7-2034-a18d-efa1-bddbfcb78846.png)


## 覚える必要がある要素

- アタッチメント
  - VPC と TGW を接続すること。LAN ケーブルを繋ぐような概念であり、これだけでは通信はできない
- ルートテーブル
  - TGW にデフォルトで 1 つ存在していて、複数作成可能
    - すべての接続された VPC/VPN で通信するならデフォルトのルートテーブルを使う
    - 個別に通信を制御したい場合は、別途ルートテーブルを作る
- ルートテーブルのアソシエーション
  - アタッチメントした VPC を特定のルートテーブルに紐づける
- ルートテーブルのプロパゲーション
  - アタッチメントした VPC からルートテーブルに経路を伝播する
  - 設定先のルートテーブルは指定できる
- ルートテーブルのスタティックルート
  - 個別のルート定義
  - アソシエートされていない VPC/VPN への経路も記述できる

図の簡略化のためスタティックルートを省いていますが、こんなイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/f1869062-39a4-4b60-023f-c2fe7b9080ad.png)


## 補足事項

- TGW 作成時のみ、Default route table association や Default route table propagation の有効・無効が設定可能
- VPN や Direct Connect を繋ぎこむことも可能

## おまけ：Azure の場合は Virtual WAN

https://learn.microsoft.com/ja-jp/azure/virtual-wan/virtual-wan-about
[ERC3770] どのチェーンか判別しやすいようにチェーンの短縮名をアドレスにつける仕組みを理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、各チェーンで使用されているアドレスに、人が読みやすいようにチェーン識別子を追加する仕組みを提案している**ERC3770**についてまとめていきます！

:::note info
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-3770

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

この規格では、ウォレットやDappsがチェーン固有のアドレスを表示するためのアドレス標準を提案しています。
各チェーン固有のプレフィックスをアドレスの前につけることで、異なるブロックチェーン上のアドレスを簡単に識別できるようにしています。

# 動機

EVMを使用しているEthereum以外のチェーンの増加に伴いこの規格の必要性が出てきました。
異なるチェーン上で同じアドレスが同じように使用されているとは限りません。
例えば、チェーンXではEOAアドレスだけど、チェーンYではコントラクトアドレスなどの場合です。

これにより、送金ミスによりデプロイされていないコントラクトアドレスに資金を送ってしまい、ゴックスしてしまう可能性があります。
この規格では、各アドレスにユニークなプレフィックスを付与し、アカウントがどのチェーンに存在しているかを示すことを提案しています。
**EIP155**で定義されている`chainId`を使用することも考えられますが、「**人間に読みやすくない**」、「**より直感的で理解しやすい形式のプレフィックスの提供**」という観点から別の仕組みを提案しています。

:::note info
**EIP155**については以下の記事を参考にしてください。
:::

https://qiita.com/cardene/items/2526432899353e4a0225

# 仕様

人が読みやすいようにアドレスを拡張する仕組みを提案しています。
チェーン固有のアドレスはチェーンの短い名前で始まり、「:」で区切られた形式になります。

```
Chain-specific address = “shortName” “:” “address”
```

- `shortName` = `STRING`
- `address` = `STRING`

### `shortName`

このフィールドは必須であり、有効なチェーンの短縮名である必要があります。
以下のリポジトリから取得できます。

https://github.com/ethereum-lists/chains

### `address`

このフィールドも必須であり、**ERC55**五巻の16進数のアドレスである必要があります。

:::note info
**ERC55**については以下の記事を参考にしてください。
:::

https://qiita.com/cardene/items/985f03760df12929b5f9

## 例

![examples.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570269/e8d11780-0f84-064a-e9f1-111cc131b2f6.png)

# 補足

マルチチェーンアドレスを使用する時、より識別子やすくするために`chainId`ではなくチェ０んの短縮名を使用しています。

# 互換性

チェーン識別子のないEthereumアドレスの場合、どのチェーンに属するアドレスかを判別するための追加の情報が必要になります。
この問題を解決する方法をこの規格では提案していますが、既存のアドレス形式も引き続きサポートされます。

# セキュリティ

チェーンの短縮名のリストについて、似たような短縮名が存在しないように注意をする必要があります。
似たような名前だと間違って認識されてしまう可能性があります。

# 引用

https://eips.ethereum.org/EIPS/eip-3770

# 最後に

今回は「各チェーンで使用されているアドレスに、人が読みやすいようにチェーン識別子を追加する仕組みを提案している**ERC3770**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4
2024年的なIBM i 技術継承について考える

## IT技術者育成と新成人人口

私達がITに入門した20世紀、日本の新成人人口はおおむね200万人前後でした。2024年現在はおよそ100万人前後です。近い将来80万人まで減ることがわかっています。

***ITで人口増やす対策しろ！*** とひとこと言わせていただきます。無策すぎる。フランス見習ってほしいわホント。

本題ではありませんが、総務省統計局ホームページを見ると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2222228e-1852-e228-cb97-45a6cfefdc4c.png)

な風に検索されて、あれれ？となりまして、確認したら、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/98156a80-5152-0482-8299-16400f60135d.png)
※引用元：https://www.stat.go.jp/data/jinsui/topics/topi1342.html

3つの年齢合計でした。これってどうなんですかね、ちょっと情報操作の香りがしますね♪
ココでは置いときます。

本題に戻します。

## 母数が半分になったとき、IT技術者継承をどう考える？

***20世紀、200万人だった母数が半分になりました。ITは複雑化・進化を継続しており（それも猛スピードで）スキル分野は20世紀の数百倍、数千倍かもしれません。***

ここではIBM i の技術継承にフォーカスします（でないと発散するので）と、
IBM iの技術もオープン系技術を業界と同じ速度で吸収していますので（おおざっぱに言えば）、IBM iのスキル分野もどんどん広がっている、と言えます。

半分の人数で、数百倍のスキル分野を担当しないといけない、と仮定すると対策は3つです。
***1.やることを減らす***
***2.複数人がやってた技術を一人でこなす***
***3.その作業はやめる***

1から3すべてに共通で、IT進化で効率化する部分（機能の自動化やツール類の進化、より簡便な機能への移行など）もあるでしょう。
3については仕事の棚卸をしてビジネスとして継続対応する価値（投資対効果）を再検討することになると思います。
以上は本稿の主旨ではないので、ここでは残る2.が対策として有望だと考えられます。（以下の説明には1,3の要素も含まれているかもしれませんが、2の視点から主に考えることとします。）

## IBM i の技術的特性を改めて評価する

***IBM i のアーキテクチャ的アドバンテージは真のフルスタック統合インフラ***な点でしょう。
***それゆえ昔々のAS/400時代から担当者1人でハード～OS～ミドル～アプリ開発～通信まで全部一人でやってる人が普通でした。（大企業では分業でしたが。）昔からIBM i vs. LINUX/WINDOWS要員数は 1: 3～5くらいでした（個人的感覚）。***

ハードウェア、CPU、マイクロコード、OS、ミドルウェア（DBや通信、セキュリティなど根幹のコンポーネント）はすべてIBMがIBM i専用に設計、実装したものです。（一部、他製品と共通利用はしているが専用品です。）最近のアプリケーショントレンドに合わせて、COBOL, RPGといったIBMが全て実装した言語以外（JAVA=IBMがJVM、APサーバーまでは実装、OSS言語はコミュニティ開発をそのままポーティング）の比率が増えているのはやむを得ないかもしれません。

それでも、
IBM i は36年前のユーザー作成アプリ・DBがバイナリーレベル、ソースレベルでほぼ100%コンパチなのでハード・ソフトウェア移行時の無駄なバージョンアップ改修がほぼ皆無
など他ではない魅力があるのでいまだにすたれることがありません。

## IBM i 技術の継承と効率化をどう考える？

で、いきなり結論ですが、一つの案はこれではないでしょうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5e723d59-1d67-c9bc-4f17-6a58d24b5a85.png)

***ツール移行、対応作業をやめる等で無用なワークをオフロードする***
***運用・操作面では使いこなしが容易な技術に移行する。いまならSQL、ブラウザ等のU/Iなどです。***
***アプリ開発面ではOSSなど現代的において習熟しやすい言語を採用するのもありだと思います。***

※私的にはOSS（など）は流行りものだと思います。その言語10年後20年後使えてますか？に自信もってYESな言語（技術）は少ないでしょう。10年おきに（5年おきに）新言語（技術）習得するのは無駄、という事もあり得る気がします。業務を効率化して企業利益を高めるのがIT技術者の責務だと考えれば。新しいことやりたい、がIT技術者の性かもしれませんが^^;
ならば、COBOL, RPGなどであれば今後も30年は変わらないでしょう、REST API的な拡張対応はあるでしょうから、拡張部分だけを学んでいけば効率的なことこの上ない、という見方もできると思います。
Databricks生成AIクックブック - ステップ4: POCの品質の評価

[Step 4: Evaluate the POC’s quality — Databricks Generative AI Cookbook](https://ai-cookbook.io/nbs/5-hands-on-evaluate-poc.html) [2024/6/25時点]の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

> [Databricks生成AIクックブック](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204)のコンテンツです。

# ステップ4: POCの品質の評価

![](https://ai-cookbook.io/_images/workflow_baseline.png)

**想定時間:** 5-60分

*あなたの評価セットの質問の数によって時間は変動します。100の質問に対しては、評価は約5分を要します。*

:::note info
[**コードレポジトリ**](https://github.com/databricks/genai-cookbook/tree/main/rag_app_sample_code)
[こちら](https://github.com/databricks/genai-cookbook/tree/main/rag_app_sample_code)からこのセクションで参照しているすべてのサンプルコードにアクセスすることができます。
:::

## 概要と期待される成果

このステップでは、あなたのPOCアプリを評価し、ベースラインの品質/コスト/レーテンシーを明確にするために評価セットを活用します。この評価結果は、すべての品質問題の根本原因の分析のために活用されます。

[Mosaic AI Agent Evaluation](https://docs.databricks.com/ja/generative-ai/agent-evaluation/index.html)を用いて評価が行われ、このクックブックの[メトリクス](https://qiita.com/taka_yayoi/items/05f650df667ffca3e92d)セクションで説明されている、品質、コスト、レーテンシーに対する全ての側面が包括的に評価されます。

評価セットのそれぞれの質問に対する集計メトリクスと評価結果はMLflowに記録されます。詳細は、[評価結果](https://docs.databricks.com/ja/generative-ai/agent-evaluation/evaluate-agent.html#evaluation-outputs)のドキュメントをご覧ください。

## 要件

- 評価セットが利用可能
- 以前のステップの全ての要件

## 手順

1. 選択したPOCディレクトリの`05_evaluate_poc_quality`ノートブックを開き、Run Allを押します。
1. MLflow絵お用いてノートブックにおける評価の結果を調査します。

:::note info
**注意**
評価結果が品質に対する要件を満たしている場合、デプロイメントセクションに直接スキップできます。POCアプリケーションはDatabricks上に構築されていますので、スケーラブルでプロダクションレディのREST APIにデプロイする準備はできています。
:::

:::note info
**次のステップ:** POC品質のベースラインの評価を用いて、すべての品質問題の[根本原因](https://ai-cookbook.io/nbs/5-hands-on-improve-quality.html)を特定し、アプリを改善するためにこれらの問題を繰り返し解決します。
:::

- [目次](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204#%E7%9B%AE%E6%AC%A1)
- 前のセクション: [ステップ3: ステークホルダーのフィードバックから評価セットを作成](https://qiita.com/taka_yayoi/items/981604b85a998ddf9b07)
- 次のセクション: [ステップ5: 品質問題の根本原因の特定](https://qiita.com/taka_yayoi/items/c1f76a39a43506fe7e33)

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
[React] Immerをちゃんと理解する

# Immerを使ってJavaScriptの状態管理を革新する

`React`では状態更新時、イミュータブルを意識して実装する必要があります。
今回は、イミュータブルを意識した実装を容易にしてくれる「**`Immer`**」についてご紹介します。

## Immer（イマー）とは？

データが作成された後、変更されない性質を「**不変性**」と呼びます。

**`Immer`** はJavaScriptのライブラリで、不変性（`immutable`）を保ちながら状態を管理するプロセスを簡素化します。
具体的には、オブジェクトが更新された時、古いオブジェクトは変更せず新しいオブジェクトを作成します

以下は`Redux Toolkit`を使用した状態更新のサンプルコードです。
`Redux Toolkit`には、デフォルトで`Immer`がインストールされています。
```tsx
import { configureStore, createSlice } from '@reduxjs/toolkit';

const initialState = {
    name: 'Taro',
    age: 20
};

const userSlice = createSlice({
    name: 'user',
    initialState,
    reducers: {
        incrementAge(state) {
            /*
              stateの更新 => ageプロパティが更新された新しいオブジェクトが生成
              nameプロパティは、旧オブジェクトの参照が継続して保持される。
            */
            state.age += 1;
        }
    }
});
```

## Immerのメリット

- オブジェクトの参照効率化
- 変更検出の効率化

### オブジェクトの参照効率化
`Immer`は変更されたプロパティを含む新しいオブジェクトを生成します。
変更されていないプロパティについては、**元のオブジェクトの参照を再利用**します。

### 変更検出の効率化

`Immer`を使うと、新旧オブジェクトの参照を比較するだけで、変更があったかどうかを判断できます。
**オブジェクトツリーを詳細にチェックする必要がなくなる**ため、パフォーマンスが向上します。

## まとめ

以上です！
Redux ToolKitではImmerがデフォルトでインストールされるため、ちゃんと理解しておきます :memo:
Databricks生成AIクックブック - ステップ3: ステークホルダーのフィードバックから評価セットを作成

[Step 3: Curate an Evaluation Set from stakeholder feedback — Databricks Generative AI Cookbook](https://ai-cookbook.io/nbs/5-hands-on-curate-eval-set.html) [2024/6/25時点]の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

> [Databricks生成AIクックブック](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204)のコンテンツです。

# ステップ3: ステークホルダーのフィードバックから評価セットを作成

![](https://ai-cookbook.io/_images/workflow_evalset.png)

**想定時間:** 10-60分

*ステークホルダーによって提供されるレスポンスの品質によって時間が変動します。レスポンスが整理されておらず、不適切なクエリーが多く含まれている場合、データのフィルタリングとクリーニングに多くの時間を必要とします。*

:::note info
[**コードレポジトリ**](https://github.com/databricks/genai-cookbook/tree/main/rag_app_sample_code)
[こちら](https://github.com/databricks/genai-cookbook/tree/main/rag_app_sample_code)からこのセクションで参照しているすべてのサンプルコードにアクセスすることができます。
:::

## 概要と期待される成果

このステップでは、レビューアプリを用いてステークホルダーが提供したフィードバックを用いて評価セットを組み上げます。質問*だけ*で評価セットを組み立てられるので、ステークホルダーがフィードバックを提供しなくても、アプリとチャットするだけで以下のステップに進めることができることに注意して下さい。

エージェント評価セットのスキーマを理解するには[ドキュメント](https://docs.databricks.com/ja/generative-ai/agent-evaluation/evaluation-set.html#evaluation-set-schema)をご覧ください。これらのフィールドは以下で参照されます。

このステップの最後には、以下を含む評価セットを手に入れることができます:

1. 👍のあるリクエスト:
    - `request`: ユーザーによる入力
    - `expected_response`: ユーザーがレスポンスを編集した場合、こちらが使用されます。そうでない場合にはnullになります。
1. 👎のあるリクエスト:
    - `request`: ユーザーによる入力
    - `expected_response`: ユーザーがレスポンスを編集した場合、こちらが使用されます。そうでない場合にはnullになります。 
1. 👍や👎が無いなどフィードバックのないリクエスト
    - `request`: ユーザーによる入力

上の全てにおいて、`retrieved_context`のチャンクに👍した場合には、チャンクの`doc_uri`が質問の`expected_retrieved_context`に含まれます。

:::note warn
**重要**
スタートする際には少なくとも30の質問を評価セットに含めることをお勧めします。どのような評価セットが"良い"のかを学ぶには、[評価セットのディープダイブ](https://qiita.com/taka_yayoi/items/8f4c2777a1151e1d7b6a)をご覧ください。
:::

## 要件

- ステークホルダーがPOCシステムを活用しフィードバックを提供した
- 以前のステップの全ての要件

## 手順

1. `04_create_evaluation_set`ノートブックを開き、Run Allを押します。
1. 含まれているデータを理解するために評価セットを調査します。あなたの評価セットに代表的で困難な質問のセットが含まれていることを検証する必要があります。必要に応じて評価セットを調整します。
1. デフォルトでは、[00\_global\_config](https://github.com/databricks/genai-cookbook/blob/main/rag_app_sample_code/00_global_config.py)ノートブックの`EVALUATION_SET_FQN`に設定されたDeltaテーブルに評価セットが保存されます。

:::note info
**次のステップ:** 評価セットを入手したので、POCアプリの品質/コスト/レーテンシーを[評価](https://qiita.com/taka_yayoi/items/c53863b12652a72d0607)するために活用します。
:::

- [目次](https://qiita.com/taka_yayoi/items/36c51bce8f33a70cf204#%E7%9B%AE%E6%AC%A1)
- 前のセクション: [ステップ2: ステークホルダーのフィードバックを収集するPOCのデプロイ](https://qiita.com/taka_yayoi/items/917a67a4aafe5cb9896a)
- 次のセクション: [ステップ4: POCの品質の評価](https://qiita.com/taka_yayoi/items/c53863b12652a72d0607)

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
[MySQL]文字列データ型(ENUM、SET)

学習記録用に作成したものです。

## ENUM
ENUM型は、テーブル作成時に明示的に宣言されたデータのリストから選んだ値を保存する事ができる型。

**メリット**
- 定義された値しか格納できない
- 値は定義した順序で格納される

**デメリット**
- 宣言されたデータの追加や削除などの変更には`ALTER TABLE`を行う必要がある
- 数字を文字列としてENUM型として扱うとややこしくなってしまう

## SET
複数の値を同時に格納することができる。列に含めることができる値のリストを定義できるが、列に格納する値はそのリストの中から任意の組み合わせでOK

**メリット**
- 列に複数の値を同時に格納できるため、列の柔軟性が増す
- 値の順序は格納された順序に関係なく管理される
6月21日　Illustrator基礎、チラシ作成演習

まずは直近の学習内容からアウトプットを開始します！
使用している教材は「世界一わかりやすいIllustrator＆Photoshop操作とデザインの教科書　改訂3版」です。

## 学習内容（教科書）
6月21日の学習内容をまとめます。
### P.168 ~ 7-1 クリッピングマスク

:::note info
クリッピングマスクとは
画像やイラストを切り抜く機能。
切り抜いた一部だけを見せることができる。
「マスク」と呼ぶこともある。
:::

#### 方法
##### 画像のマスク（画像の上下左右をトリミングしたい場合）
1\. プロパティパネル（コントロールパネルにも表示あり）→「マスク」
2\. 境界線ハンドルをドラッグ→トリミング→マスク作成完了

##### 切り抜きたい形のオブジェクトを使用
1\. オブジェクトは最前面に配置（command+shift+])
2\. 切り抜きたい画像とオブジェクト両方を選択
3\. オブジェクト→クリッピングマスク→作成
※クリッピングパス（マスクに使用したオブジェクト）の線に色をつけることも可能!変形も可能!

##### マスクの解除
オブジェクト→クリッピングマスク→解除

マスクはアートワーク（ブラシで作成したランダム水玉など）にも使用可能。

### P.172 ~ 7-2 効果メニューによる変形
アピアランスパネルの「効果」でパスの変形ができる
* 線に対しては、ジグザグや波線など
* オブジェクト（テキスト文字も）は影（スタイライズ→ドロップシャドウ）ジグザグ（パスの変形→ジグザグ）など

一つのオブジェクトに複数の効果を適応させることも可能。
アピアランスパネルで確認できる。
👁を押すと、効果のオン/オフも切り替えできる。

### P.174 ~ 7-3 線を変形する機能
#### パスのオフセット
選択したオブジェクトよりひとまわり小さなパスを作成できる（数値入力し大きさも選べる）

#### パスのアウトライン
線→アウトラインを作成しオブジェクトにできる（オープンパス→クローズドパスになる）
必要であればパスファインダーで合体させると、複数のアウトラインのオブジェクトが一つのオブジェクトになる。

#### 線のジグザグ→アピアランスを分割
ジグザグにした線は、元の直線とアンカーポイントや形状が変わらない
→オブジェクトの「アピアランスを分割」でアンカーポイントやパスの形状が波線の見た目通りになる

#### 複数の線で線路など設定
1\. アピアランスパネルで線を追加
2\. 上の線を細めに、色はホワイトにする
3\. 上の線に「破線」をチェック→線路完成

### P.178 ~ 7-4 リピート（ラジアル、グリッド。ミラー）
２０２１から追加された機能。
操作は簡単だが微調整がしにくい。
（講師曰く、command+dで対応できるから、あまり使わないかも？）

#### ラジアル
元のオブジェクトから円形にこポーできる。
↑↓を押して数調整可能。
オブジェクト→リピート→ラジアルで設定

#### グリッド
選択したオブジェクトを上下左右に増やせる。
何重にもなった円形オブジェクトでは、複数重ねることで波のような和風オブジェクトも作成可能。

#### ミラー
対面に左右反転したオブジェクトを増やせる。
角度調整も可能。

### P.181 ~ 3D効果
テキストオブジェクトを選択。
アピアランスパネル→新規効果を追加→３D→押し出し・ベベル→ダイアログボックス→プレビュー
- [ ] ダイアロボックスが表示されなかったので要確認

### P.182 ~ エンベロープ
テキストオブジェクトを変形できる！
3つの方法を紹介。

* オブジェクト→エンベロープ→ワープで作成：アーチ型（解除すると、元のオブジェクトとアーチ型オブジェクトが分離）
* オブジェクト→エンベロープ→メッシュで作成→行数を決める→作成されたメッシュに沿って変形
* テキストと変形させたい会場のオブジェクトを配置（オブジェクトは最前面）→エンベロープ→最前面のオブジェクトで作成→オブジェクトの形に変形


## 学習内容（チラシ作成演習）
ランダムに二人ずつに分かれ、それぞれ「クライアント役」と「制作者」になる。（交代する）
架空のショップ（クライアントが自由に設定）のチラシを作る。
クライアントに以下を聞き取り。
* ターゲットやコンセプト
* どんな内容にしたいか。イメージカラーなど
* 好みのサイト、ショップの情報
* 好みでないサイト、イメージ
聞き取った要望から、Illustratorでチラシ作成（3時間）
時々クライアントに方向性の確認。

### 私の場合の制作内容、手順
#### クライアントの要望
* インテリアショップリニューアルオープンのチラシ
* 社会人2〜3年目くらいの20代女性向けインテリアショップ
* 手が出しやすい価格帯ながら、高級感がある（ホワイトやゴールドなど女性らしいインテリアのイメージ）
* 室内にはグリーンも取り入れ「仕事で疲れているけど、休日は自宅でゆっくり、充実した時間」を過ごしているイメージ
* もともとファミリー向けのショップから、移転リニューアルオープンでターゲット層もチェンジ
* リニューアル記念として、オープンから2日間はインスタフォローで5％OFF
* チラシのイメージカラーは大人っぽいくすみピンク、ベージュ、グレーなど
* 太字や安っぽいイメージは×（ニ○リなど）
* イメージはLOWYAなど

#### 制作手順
* ピンタレストでイメージチラシを検索
* フリー画像からホワイトを基調としたインテリア画像を選定
* メイン画像を大きく配置
* サブ画像は「マスク」で切り取り（楕円と長方形オブジェクトを合体させお家の窓をイメージで切り取り）
* ロゴはLOWYAを参考に華奢なイメージ
* 暗めのくすみピンク、グレー、ベージュで落ち着いた雰囲気に
* くすみピンクはクライアントにイメージ確認し、より暗めで落ち着いた色に微調整

#### 学び
* クライアント役の方がかなり小生に要望を伝えてくださたので作成しやすかった
* 私の方はセルフで具材を挟める森の中のサンドウィッチショップを提案したが、イメージを具体的に伝えきれなかった。
* ペアの方の聞き取りがお上手だったので、なんとかイメージしながらお伝えできた。

後日1時間ほど制作時間があり、その後発表の予定です。

本日は以上です。
体育科出身の僕がLeetCode入門してみた - Day3  2704. To Be Or Not To Be

# 概要
文系（体育科）卒業の僕が、人並みのアルゴリズムを身につけるためにLeetCodeを初めてみました。
日本だとAtCoderが一般的なようですが、海外エンジニアへの憧れを持つ僕はLeetCodeを選びました。

フロントの言語しかほぼ触ったことがないのでJavaScriptでやっていこうと思います。

# 問題
[text](url)

問題文
> Write a function expect that helps developers test their code. It should take in any value val and return an object with the following two functions.
toBe(val) accepts another value and returns true if the two values === each other. If they are not equal, it should throw an error "Not Equal".
notToBe(val) accepts another value and returns true if the two values !== each other. If they are equal, it should throw an error "Equal".

初期コード
```javascript
/**
 * @param {string} val
 * @return {Object}
 */
var expect = function(val) {
    
};

```
問題を整理すると...
- テストコード
- expect()はstring型のvalを受け取る
- オブジェクトをreturnする
    - オブジェクトには関数が2つ
    - 関数はval以外ののvalueも受け取る
        - toBe(val)
            - 同じ値だったら→`true`
            - 違う値だったら→`"Not Equal"`
        - notToBe(val)
            - 同じ値だったら→`Equal`
            - 違う値だったら→`"true"`


急に難しくなっていないか🤔
そもそもこの`var expect = function(val) {}`に馴染みが薄いので調べたみた。

:::note
これは、JavaScriptにおける関数の宣言の一つの形式です。
この形式では、var キーワードを使用して、変数 expect を宣言し、その変数に関数を代入しています。この形式は「関数式」と呼ばれ、関数を変数に格納することで、他の変数と同様に扱うことができます。具体的には次のような特徴があります。

🔸関数式
関数式は、関数を変数に代入する形式です。
関数名は省略することができます（無名関数または匿名関数と呼ばれます）。
宣言された関数は、変数に代入された後から利用可能になります（このため、変数のスコープやホイスティングの挙動に注意が必要です）。

🔸関数の宣言との違い
関数宣言（function foo() {} の形式）とは異なり、関数式は変数のスコープのルールに従います。たとえば、var を使用した場合、その関数は宣言された関数全体でアクセス可能ですが、宣言前には利用できません。
関数宣言はホイスティングされ、スクリプトのロード時に関数全体が先に処理されますが、関数式は実行フローがその行に到達したときに初めて評価されます。
:::

https://zenn.dev/ojk/books/intro-to-javascript/viewer/js-function#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89

を参考に下記のように`return`してみました。

```javascript
/**
 * @param {string} val
 * @return {Object}
 */
var expect = function(val) {
    return {
        toBe(val2) {
            if(val === val2) {
                return true;
            } else {
                throw new Error("Not Equal")
            }
        },
        notToBe(val2) {
            if(val === val2) {
                throw new Error("Equal")
            } else {
                return true;
            }
        }
    }
};

```
returnの中身ですが下記のように書いてもいいみたいです。
ですが、上の書き方の方が推奨されているらしいのでこんな書き方もできるんだ程度に覚えておこう。
```javascript
return {
    toBe: functions(val2) {
        //省略
    },
    notToBe: function(val2) {
        //省略
    }
}
```
これで実行してみると...
![CleanShot 2024-06-25 at 06.00.59@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/b6eec5cb-cb81-9bb8-c2da-9597896ebe7e.jpeg)
やったー全てのケースで通ったー。`if(){} else {}`の書き方はもっと改善できそうだけど、一旦これで提出してみます。


![CleanShot 2024-06-25 at 06.02.20@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/25883e4f-52c7-24c2-fe97-11d1c9744e14.jpeg)

なんかもっと改善できそうだけど、朝の支度をせねばなので諦めます！😜
Python 基本構文

# Python 基本構文

本記事ではPython 3.9系の基本構文について解説します。

## Pythonインストール手順(MacOS)

MacOSへのPythonインストール手順は[こちらの記事](https://qiita.com/toranoko92114/items/08b287e54bdc36943375)を参照してください。

## Python基本文法

### 1. 関数と引数

書き方：`関数(引数)`

例：
```python
print("hello world")
```

### 2. インデント

コードブロックを示すために使用し、スペース1個以上で表現します。同じブロック内では揃える必要があります。

例：
```python
if True:
    print("This is indented")
    print("This is also indented")
print("This is not indented")
```

### 3. 変数

書き方：`変数名 = 値`

例：
```python
num = 27        # 数値
text = "Cat"  # 文字列
```

### 4. コメント

書き方：`#`で始まる

例：
```python
# これはコメントです
print("Let's start")  # この行の後ろにもコメントを書けます
```

以上がPythonの基本構文の概要です。これらの基本を押さえることで、Pythonプログラミングの第一歩を踏み出すことができます。

オンラインでPythonを試したい方は、[W3Schools](https://www.w3schools.com/python/python_syntax.asp)のPython Syntaxページをご参照ください。
職業訓練校で動画編集とホームページ制作を学んでいます!

５月から職業訓練校に通い始め、1ヶ月経ちました。
現在の学習状況は以下のとおりです。

* VSコードにてHTML、CSSの基礎
* Illustrator基礎
* Illustratorによる名刺作成、チラシ作成

訓練校は11月までの予定です。
自分のアウトプットのため、記録を残していきます！
どうしてあなたのアラートは見られないのか？：目次

# はじめに

本記事はQmonus Value Streamの投稿キャンペーン記事です。

**いいね、ストックをよろしくお願いします！**

## 記事の内容

この連載は、ソフトウェア開発に必要不可欠な、**指標**という概念について解説します。指標とは、私たちがソフトウェアの品質についてしるための手掛かりとなるなんらかの数値、情報、検査結果です。この連載を通じて、以下のようなことを学ぶことができます。

- ソフトウェア開発における指標の**性質を分類する**
- ソフトウェア開発における指標の**価値を理解する**
- 指標の性質ごとに、**適切な扱い方を把握する**

この連載でも、「場合による」という言葉に逃げずに、なるべく**網羅的・理論的な**解説をします。

## 対象読者

- 新しくソフトウェア開発プロジェクトをリードすることが決まった**新人リードエンジニア**
- 最近開発プロジェクトにアラートを追加したが、**無視されてしまった人**
- **適切な開発者体験**を提供するためのCI/CDや自動化について知りたい人

## 自動化が進んでいく世界でエンジニアに本当に必要なもの

私がこの記事を書くきっかけになったのは、あるプロジェクトです。そのプロジェクトでは、私が開発環境の作成の陣頭に立ち、張り切って様々な指標を導入しました。
例えば、テストカバレッジが低い場合にGitHub Actionsで警告メッセージを投稿する仕組みを作成しました。
しかし、私のチームでは、ほどなくして**誰も警告メッセージを読まなくなって**しまいました。
これは私が開発における指標について理解しておらず、その性質に適さない方法で開発環境を整備してしまったからです。

今回の記事のキャンペーンテーマである[Qmonus Value Stream](https://www.valuestream.qmonus.net/)をはじめとしたツールは急速に普及しており、エンジニアは簡単に仕組み化することができます。

:::note info
**快適な開発環境を作成するために必要なスキル**
ツールの整備とプラクティスの普及に伴って、開発環境を実装する方法よりも、どのような開発環境が望ましいのかを本質的・理論的に理解し、確信をもって応用ができるスキルの重要性が増している。
:::

**指標の性質を理解しておけば、指標ではなく本質的なアプリケーション開発に集中できるようになり、ソフトウェア開発体験は信じられないほど向上します。**
ぜひ、この連載を開発体験の改善に活かしてください。

# 目次

https://qiita.com/wolfmagnate/items/f1557bbb70f412565a40

https://qiita.com/wolfmagnate/items/100ba37bf800dbd098e3

https://qiita.com/wolfmagnate/items/5cb93541b967b83cbbfd
Javaで「配列の文字列表現を取得する(toString,deepToString)」の動作を確認してみた

# 概要

Javaで「配列の文字列表現を取得する(toString,deepToString)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/array/index16.html

# 実装

以下のファイルを作成しました。
```JSample16_1.java
import java.util.Arrays;

class JSample16_1{
  public static void main(String[] args){
    double[] src = {3.75, 0.52, 14.1};

    System.out.println(src);
    System.out.println(Arrays.toString(src));
  }
}
```

```JSample16_2.java
import java.util.Arrays;

class JSample16_2{
  public static void main(String[] args){
    int[][] src = {{32, 18}, {12, 27}};

    System.out.println(Arrays.toString(src));
    System.out.println(Arrays.deepToString(src));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample16_1.java 
$ java JSample16_1 
[D@7ad041f3
[3.75, 0.52, 14.1]
```
```
$ javac JSample16_2.java 
$ java JSample16_2 
[[I@7ad041f3, [I@251a69d7]
[[32, 18], [12, 27]]
```

# まとめ

何かの役に立てばと。
ITパスポート ソリューションビジネスとシステム活用促進

・ソリューションビジネス
企業などが業務を行う上で抱えている問題や課題の解決を目的とした、サービス提供事業者のサービスのこと
・オンプレミス
自社の施設内に、自らが所有する情報システムを設置して運用する

・ハウジングサービス
サービス提供事業者がサーバなどを設置する施設（スペース）を貸し出すサービス
・ホスティングサービス
サービス提供事業者がサーバを貸し出すサービス
・オンラインストレージ
サービス提供事業者が保有するディスク領域をデータ保管用に貸し出すサービス

・クラウドコンピューティング
クラウド事業者がインターネット上に整備したサーバやOS、ソフトウェアなどを、クラウドサービスとして提供し、利用者がそのサービスを利用する形態
・クラウドサービスの種類
IaaS（イァース）
クラウド事業者が、情報システムの稼働に必要なサーバやネットワークなどのインフラ（基盤）をネットワーク経由で提供するサービス
Paas（パース）
クラウド事業者が、ソフトウェアの稼働に必要なOSやミドルウェアなどのプラットホームをネットワーク経由で提供するサービス
SaaS（サース）
クラウド事業者が、アプリケーションをネットワーク経由で提供するサービス（Microsoft365、Gmailなど）

・ASP
業務アプリをネットワーク経由で提供する事業者

・SOA（サービス指向アーキテクチャ）
業務プロセスの機能をサービスとして部品化し、そのサービスを組み合わせることで、情報システム全体を構築していく考え方

・クラウドサービス利用時の注意点
障害によるデータ喪失（定期的にバックアップをとっておく）
データの漏洩（クラウド事業者のセキュリティ対策レベルを確認しておく）
第三者による悪用（パスワードを使いまわさない）

・SI（システムインテグレーション）
情報システムの企画から、開発・運用・保守までの業務を請け負うサービス

・情報リテラシ
PCを利用して情報の整理や蓄積・分析などを行ったり、インターネットなどを使って情報を収集・発信したりする、情報を取り扱う能力
・デジタルデバイド
PCやインターネットなどのITを利用する能力や機会の違いによって生じる経済的・社会的な格差

・ゲーミフィケーション
点数やレベルアップ、称号集めなど、ゲームで用いられるような手段をサービスやシステムに応用すること

・レガシーシステム
時代遅れの旧来の基盤技術により構築されている情報システム
【見やすいサイト】フォントは 18 px 以上が見やすい

## ポイント

- 文字の大きさは 18 px 以上
- サイズの指定に 1rem を入れる

## 目的：webサイトを見やすくする

webサイトの印象は、フォントで大きく変わってくる。

今回は、見やすいフォントを検討した。

## デフォルトは 16 px

文字の大きさは、スマホ や PC を含めて、全ての端末でデフォルトが 16 px に設定されている。

それぞれの端末のシステムフォントでの表示を確認してみる。

### iOS

<img loading="lazy" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiBClhoaA0c-zVfMK8qYLycPFVCi-SnEDGEHuFjylQMqMONnid8elnn0iZkPNDKg_Bbqdq_pFRy1aoUpCcsIatRb9PPiiLP8NkPObksGvf9aK8iI0rFXPDSXHB8i8ULK_p7iMJBXFINIz4bLL_mAXBGrM1_uU0GmwrEWX1ULxo89pSwQ/s1600/%E3%83%92%E3%83%A9%E3%82%AE%E3%83%8E%E8%A7%92%E3%82%B4%E3%82%B7%E3%83%83%E3%82%AF%2014px.png" alt="ヒラギノ角ゴシック 14px.png (800×400)" width="400" height="200">

### Android

<img loading="lazy" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWhbGfoLHRRxt6nhyEm7UDQmnhXrx89tSyJtWzPO_BuIobCwV6N8GnSx6SlHGCjnr3BDbQM0Hwv47U5Q_-cTf-QKCCq4iVmakjxucV0sfUfeHYPwU2vJlpDDuUTq98Hz6q3FJaRUMhkzgRMOA0Qup-xKLjPxRNUJF8NjGUx72hlekxvA/s1600/Noto%20Sans%2014px.png" alt="Noto Sans 14px.png (800×400)" width="400" height="200">

### windows

<img loading="lazy" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34NVlWGQc2zhkXpg8Q9Ft4ddWXQWQgL-R9et5Fs9z7T-tnIndwn6cM-3xcCN0ifiMtmyO7Hcg0xaVD6uS8fnvLzOXBA6THLvZ-S9qq9ofFLn9fKDRNpb5AxE4x7f1Hyb7HMxMHVLvypUwT1fPM5PBX1KsDALNpPQCADN2Cgso5KaAdA/s1600/%E6%B8%B8%E3%82%B4%E3%82%B7%E3%83%83%E3%82%AF%2014px.png" alt="游ゴシック 14px.png (800×400)" width="400" height="200">

<br>

## 18 px 以上が見やすい

iOS や Android のスマホは、小さな画面だと 18 px 以上が見やすい。

windows も注意が必要で、デフォルトのシステムフォントの游ゴシックは文字が細くデザインされているので、**小さなフォントだと文字がかすれて見える**。

フォントは少し大きめの指定が良いと思う。

## 1rem を入れる

ユーザーによっては、デフォルトのフォントの大きさを変更している場合がある。

<br>

<img loading="lazy" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIqPvmBV3lX-B10XI6tzxEZUPuZ75eKGuJxoBSS4ttmD0bz3G3YMIwUOzPMhoCKuWbXXbbpoCKPRQ4R9ZQOOkJQQqMZt-1XqzPQFAru0kISqvVbIMBVm75GYr3_6SZPYdBKGuXW1uEmXAhUadACrvwOPgYMybfCHgWRRk3goAW2USqLA/s0-rw-e90/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E6%8C%87%E5%AE%9A%20%E3%81%AE%20%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E6%AF%94%E7%8E%87%E3%81%AE%E3%82%B0%E3%83%A9%E3%83%95.png" alt="ユーザー指定 の フォントの比率のグラフ.png (800×1120)" width="400" >

<br>

| サイズ | ユーザーの割合 | 
| ------- | ---------------- | 
| 16px | **96.92%** | 
| 20px | 0.50% | 
| 19.2px | 0.42% | 
| 25.6px | 0.23% | 
| 17px | 0.18% | 
| 24px | 0.15% | 
| 20.8px | 0.15% | 
| 14.4px | 0.10% | 
| 18px | 0.10% | 
| 18.4px | 0.08% | 
| 18.56px | 0.07% | 
| 14px | 0.07% |


出典：Pixels vs. Ems: Users DO Change Font Size

https://medium.com/@vamptvo/pixels-vs-ems-users-do-change-font-size-5cfb20831773

およそ 3% のユーザーが、デフォルトのフォントの大きさを 16 px から変更していて、文字を見やすくするために **少し大きめに指定しているケースが多い**。

webサイトのフォントを 14 px のように絶対値で指定すると、このユーザー設定を上書きしてしまう。

サイズを指定するときは 1rem（ユーザー指定のフォントサイズ） を入れるのが好ましい。

## タブレットや PC では、少し大きく表示する

タブレットや PC の場合、もう少し大きい方が見やすい。

そこで、ブログサイトでは次のように設定した。

~~~
font-size: calc(1rem + 1px + 0.25vw);
~~~

vw は端末の横幅の単位で、100 vw がその端末の横幅の解像度になる。

この設定で、幅 400 px のスマホで 18 pxになり、さらに画面幅に応じて拡大される。

## まとめ

- 文字の大きさは 18 px 以上
- サイズの指定に 1rem を入れる

<br>

---

前の記事

https://qiita.com/kimamanaDr/items/b645d3a64dd7511c9d6c

<br>

オリジナルのブログ記事

https://kimamaniigakuronbun.blogspot.com/2024/04/Blog09.html
Spring MVCを使ってファイルをダウンロードし、Content-Disposition ヘッダーを処理する

```java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;

@RestController
public class MyController {

    @GetMapping("/downloadFile")
    public String downloadFile() throws IOException, InterruptedException {
        // HttpClientのインスタンス作成
        HttpClient client = HttpClient.newHttpClient();

        // GETリクエストの作成
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com/path/to/file"))  // ダウンロード先のURLを指定
            .build();

        // レスポンスをファイルとして保存する
        HttpResponse<Path> response = client.send(request, HttpResponse.BodyHandlers.ofFile(Paths.get("temp_file")));

        // ステータスコードをチェック
        if (response.statusCode() != 200) {
            return "Failed to download file: HTTP status code " + response.statusCode();
        }

        // Content-Dispositionヘッダーからファイル名を取得
        Optional<String> contentDisposition = response.headers().firstValue("Content-Disposition");
        String fileName = "downloaded_file";
        if (contentDisposition.isPresent() && contentDisposition.get().contains("filename=")) {
            String[] parts = contentDisposition.get().split("filename=");
            if (parts.length > 1) {
                fileName = parts[1].replace("\"", "").trim();
            }
        }

        // ファイルを保存
        Path downloadedFilePath = Paths.get(fileName);
        Files.move(Paths.get("temp_file"), downloadedFilePath);

        return "File downloaded successfully: " + downloadedFilePath.toAbsolutePath();
    }
}
```
Unity Androidビルドエラーを解決した話

# 1.AdMobをいれて起きたエラー
AdMobをいれるとビルド時にGradleエラーなど４つのエラーが起きました。
→解決方法
・AdMobのバージョンを8.7.0に変更。
・keystoreの入力ミス修正
・keyの保存先をprojectsファイル内に移動(なにもしてなければ元々ファイル内)

Keystoreのミスは非常に多いです。GradleエラーやSDKエラーなのでそっち方面をいろいろといじっていましたが、GradleやSDKはPrefarence→SDK/JDKなどの☑をし直すだけでよさそうです。私の場合は、KeystoreのKeyファイルがなぜか別のフォルダに設定されていてこれがおかしかったのが原因っぽいです。
また、キーのパスワードをミスっていると似たようなビルドエラーが生じることが多いらしいですね。

# 2.バージョンの設定(更新時)
バージョン番号を上げ忘れるとビルドしなおさなきゃいけなくなるので気を付けましょう。

# 3.マニフェストにAdMobの宣言
これは自動で書き込まれるらしいのですが私のPCでは書き込まれず主手動で書き込む必要がありました。
手順
1.エクスプローラのunityプロジェクト内でAndroidManifest.xmlファイルを見け、
<manifest>
 <!-- 省略 -->
  <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
</manifest>

これを追加してあげましょう。
AndroidManifest.xmlがいくつか存在する場合がありますが、その時はINTERNETという宣言がされている行のあるファイルに追加してあげてください。
PostgreSQLの内部結合アルゴリズムについて

### PostgreSQLの内部結合アルゴリズムについて
PostgreSQLでは、テーブルの結合を行う際に、以下の3つの内部結合アルゴリズムを使用します：

- Nested Loop Join
- Hash Join
- Merge Join

これらのアルゴリズムは、それぞれの特性に応じて最適なシナリオで使用されます。以下にそれぞれの詳細と使用シナリオを説明します。

#### 1. Nested Loop Join
Nested Loop Join は、最も基本的でシンプルな結合アルゴリズムです。これは、外部テーブルの各行に対して内部テーブルを一行ずつスキャンします。計算量は O(M * N) で、Mは外部テーブルの行数、Nは内部テーブルの行数を表します。

- 適している場合
  - 小さなテーブルと大きなテーブルの結合
  - 内部テーブルに効率的なインデックスがある場合
- 特徴
  - 小さなデータセットに対して効率的
  - 大きなデータセットでは非効率になる可能性がある

#### 2. Hash Join
Hash Join は、小さい方のテーブルからハッシュテーブルを作成し、大きい方のテーブルの各行とマッチングします。計算量は O(M + N) です。

- 適している場合
  - 大きなデータセットの結合
  - 等価結合（=）の場合
- 特徴
  - メモリを多く使用する
  - 大規模なデータセットに効果的

#### 3. Merge Join
Merge Join は、両方のテーブルをソートし、ソートされた順序でマージします。計算量は、ソートの有無により異なります。ソートが必要な場合は O(M log M + N log N), ソート済みの場合は O(M + N) です。

- 適している場合
  - 両方のテーブルが既にソートされている、またはインデックスがある場合
  - 大きなデータセットの結合
- 特徴
  - ソートのオーバーヘッドがある
  - ソート済みのデータに対して非常に効率的

---

#### 結合アルゴリズムの選択
PostgreSQLのクエリプランナーは、クエリの実行時に最適な結合アルゴリズムを自動的に選択します。
実行計画を確認することで、どの結合アルゴリズムが使用されているかを知ることができます。

- 以下のコマンドで実行計画を確認できます：
  - `EXPLAIN クエリ;`
  - `EXPLAIN ANALYZE クエリ;`

#### 実行計画の変更

通常、エンジニアが直接結合アルゴリズムを指定することは推奨されません。
ただし、一応ヒント句というものがあります。
これは、実行計画を制御することができます。
PostgreSQLでは、`pg_hint_plan`という拡張があり導入可能です。
今回詳しくは取り上げませんが、こちらのサイトを参考にしてみてください。
https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/pg-hint-plan/
なぜ0.8+0.9は1.7000000000000002なのか？

# あいさつと経緯
初めまして！
0.8+0.9って1.7でしょ？何言ってんの？っていう方もいるかもしれません。
このタイトルの背景は、私がこの業界に入って初めてJavaに触れた時、注意された言葉から来ています。
「計算処理ではBigDecimalを使用しなさい」
言われた方もいるのではないでしょうか？計算処理で誤差が出ないようにするためで理解している方は多いと思います。
この記事では、タイトルとBigDecimalの何が紐づくのかお話ししていこうと思います。

# なぜ0.8+0.9は1.7000000000000002なのか？
早速タイトル回収です。
タグにも入れましたが、基本情報技術者試験の勉強された/されている読者の方もいるでしょうか？

**２進数が今回のポイントになります。**

0.8+0.9は人間にとっては単純です。
ですが、パソコンはタイトルのように間違えます。

何が違うのか？
それは、計算方法です。

**人間は１０進数**で0.8+0.9を計算しています。（違う進数で計算されている方がいたらすいません:bow_tone1:）
**パソコンは２進数**で0.8+0.9を計算しようとするのです。

### :writing_hand:2進数で0.8+0.9を計算するとどうなるのか？
0.8+0.9の前に、整数の8+9を計算してみましょう。

ここからは下記のサイトを使用すると理解しやすいです。

https://note.cman.jp/convert/bit/


#### :raised_hand:整数の8+9を二進数で計算すると・・・？
```
8を二進数に変換すると・・・
1000
```
```
9を二進数に変換すると・・・
1001
```
両者を足してみましょう
```
1000＋1001=10001
```
10001を10進数に直すと17になります。

#### :raised_hand:小数の0.8+0.9を二進数で計算すると・・・？
さて本題です。そもそも小数の場合どう表現するでしょうか？
ちなみにこれは基本情報技術者試験に出てきますね。
そうです。位が下がるたびに値を半分にして表現します。
```
0.000
1→1/2→1/4→1/8....
```
この法則を見てなんとなく想像もつく方がいると思いますが、実際に計算を見てみましょう
```
0.8を二進数に変換すると・・・
0.11001100110011001100110011001100110011001100110011...
```
```
0.9を二進数に変換すると・・・
0.11100110011001100110011001100110011001100110011001...
```
見ての通り、半分の値で桁数を変える小数では値を表現しきれないのです。
その結果何が起こるかというと、**丸め誤差**が発生します。ここも基本情報技術者試験に出ますね。

https://ja.wikipedia.org/wiki/IEEE_754#%E6%9C%80%E8%BF%91%E6%8E%A5%E4%B8%B8%E3%82%81

結果として以下の数値が出てきます。
```
1.10110011001100110011001100110011001100110011001101...
```

これを10進数に変換すると
```
1.7000000000000002
```
1.7000000000000002に丸められることとなります。
値が少し増えてしまうのも、0.8と0.9で丸められ
本来の値より大きい値で計算されたためです。

# 計算処理ではBigDecimalを使用しなさい
小数の計算は、桁数が大きくなると丸められてしまい正しい値を求められないことがわかりました。
BigDecimalは、とても単純に言ってしまうと小数計算はしておらず、演算部分で整数に直してから計算をしています。
```
[単純な例]
0.8を8にする。
0.9を9にする。
8+9=17
上げた桁数分を戻す。
1.7
```

# 結論：0.8+0.9は1.7である
２進数で小数計算を行うと丸め誤差で思わぬ計算間違いが起こります。
それぞれの言語がそもそも対応しているのか。メソッドを使わないといけないのか？
十分に気をつけて対応しましょう。
基本情報技術者試験勉強している方、応援しています！:fist:
EC2のキーペアを紛失してしまった時

EC2のキーペアを、.sshディレクトリの中に保管するべきところを別のディレクトリに入れたままにして、誤って消してしまったことはありませんか？（私はありました…焦りまくりました…:fearful:）

もしかしてEC2の構築の最初っからやらないといけないの…と戦慄していましたが、心配ご無用です。なんと方法があります！私はこれにて無事でした。同じ境遇になってしまった方に届けば幸いです。

環境
linux/MacOS　使用

# 1.新しいキーペアを作成
まずは焦らず新しくキーペアを作成していきましょう。
他に既存のキーペアがあり、そちらを利用する場合はこの工程はスキップしてもらっても大丈夫です。


【手順】
**マネジメントコンソール**
→**EC2** コンソールへ移動
→左側メニュー内 **ネットワーク＆セキュリティ**
→**キーペア**

![スクリーンショット 2024-06-25 0.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822835/41d1a798-f0be-8ac0-5fbc-73048e59f1f5.png)


今回「test」と名前をつけましたが、**キーペアの名前はプロジェクトに応じて好きにつけてください**。

⚠️名前に空白は作らない方が後々やりやすくなると思います。
⚠️どうしても単語を複数入れたい場合は単語を繋げた名前にするか、"-(ハイフン)"を使ってください。
　例）projecttest、project-test
 ※個人的には単語を繋げた方が、後にコマンドを打つことがあった際楽だと思います。


- [キーペアを作成]までいくと、pemファイルがダウンロードされます。
 **適当な場所に移動させ、適切な権限を設定**します。

 ```
$ mv xxxxx.pem ~/.ssh/          # .sshにpemファイル移動
$ chmod 400 ~/.ssh/xxxxx.pem    # 所有者にだけ読み取り権限を付与する
 ```


 # 2.公開キーを作成する

.sshディレクトリにて、下記コマンドを実行
 ```.ssh
 $ ssh-keygen -y -f ~/.ssh/xxxxx.pem
 ```
 
出てきた長い文字列が、test.pemの公開キーになります。

```
ssh-rsa　AAAAB3NzaC1yc2EAAAADAQABAAABAQDUaVyi/HYbDvBfT2BC4KJyWwaVfk3n1NwpLItcl57mSTOmCYhLIl4oitRC4zab50RTMuGfixJJY1OAdtZaxvMuCwcUTRGAuq8763rmyjTNdSYFQfdMwd2Ss7TdeFaAw1SPx4dBOe95VVRUBCQEWJUlYjLc7v/hxvcaH7gPVAwQK3GsWkdCLUMn3N1bbKrNVK3VjOP5YVwjKMnPkAmaKnHuYhbgeE9dQGAymkqrgwUdk3gr1lQ8MLHLGjU2sK7W46TAWkz59ZLgG4T3c8LLJhJaM9HSM8HrRuOWCyaxpUgku7QSqmUX4NZHkMooKZPxzz8E8oTE5CPBg9toi6yLkWqz
```
この公開キーは後に使うのでコピーします。

※冒頭のssh-rsaも公開キーに含まれます。
※公開キーはキーごとに異なります。


# 3.EC2インスタンスのユーザーデータを変更する

【手順】
紛失したキーペアを利用しているEC2インスタンスを **停止**
→右上の**アクション**を選択
→**インスタンスの設定**
→**ユーザーデータを編集**（完全に停止ができたら触れるようになる）

![スクリーンショット 2024-06-25 1.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822835/4ea72b60-c7b1-74ec-bf38-66d5a612a8b4.png)

![スクリーンショット 2024-06-25 1.18.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822835/52cd5f8e-d034-f997-76ae-2cf0d31c92c8.png)

このページに移動します。
既に何かここに設定をしている人は、混ざらないように一旦別のところに避けておいてください。

- **下記スクリプトを貼り付け**

```
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [users-groups, once]
users:
  - name: username
    ssh-authorized-keys: 
    - PublicKeypair
```
下から３段目の**username**と
一番下の段の**PublicKeypair**
を自分のものに修正し変更。

例）
username → ec2-user
PublicKeypair → 先程作った公開キー
![スクリーンショット 2024-06-25 1.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822835/464d6e20-c3cf-5ff1-456b-1c050ef638e2.png)

【手順】
**インスタンスを起動**
→起動できたら、新しいキーペアを使って**ssh接続できるか確認**
```
ssh -i ~/.ssh/xxxxx.pem ec2-user@xxx.xxx.xxx.xxx
```
ssh接続ができていれば成功です！🎉


# その後
【手順】
**インスタンスを停止**
→先ほど貼り付けたスクリプトを**公開キーを含め全て削除**
→(ユーザーデータに元々何か設定をしていた場合は貼り付け)
→**保存**をクリック
→インスタンスを**起動**


これでOK！これで万が一キーペアを紛失してしまった…なんてことが起こっても対処できます。
でもまずは、無くさないようにしっかり管理をしていきましょう。自戒を込めて。
ピアソンVue が提供する資格試験の受験を別日に変更する方法について

## 結論
チャットサポートに問い合わせる。

・リンクはこちら
https://home.pearsonvue.com/microsoft/contact

右下にあるチャットアイコンから、対話が始まります。
※ 英語でのサポートとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3823234/3875f563-15da-dc76-64e7-a07016f9840b.png)

### なぜこの記事を書こうと思ったのか
Microsoft Az-104 の資格をオンライン (自宅) で受験しようとしたが、オンライン受験するための ピアソンVue の要件を満たせなかった。
ピアソンVue 側の要件としては、机の上と下で受験に必要なもの以外を取り除く必要があったが、どうしても動かせないものがあり、当日オンライン受験できない状況となった。
このままでは、受験費 (2万3000円程度) を支払ったのみで、資格試験を受験できていないので、試験監督から、別日への変更を提案していただいた。
ただ、案内していただいた、試験日を変更するページが存在しませんでした。

・案内されたページ
https://home.pearsonvue.com/null/onvue

そこで、備忘録も含め、受験日を変更できた方法について纏めました。
試験開始から２時間以内に、変更する必要があるようですので、ご注意ください。

なお、電話サポートもありますが、土日祝休みのようです。
https://www.pearsonvue.co.jp/Test-takers/Customer-service.aspx

追記するかも？
【Spring Data MongoDB】発行されるクエリのログを確認したい

## 概要
Spring Data MongoDBは[MongoDB でデータアクセス](https://spring.pleiades.io/guides/gs/accessing-data-mongodb)にある通り、Springのフレームワーク上でMongoDBを操作したい場合に使用するライブラリです。
基本的にはSpring Data JPAと同じような雰囲気で使えるのですが、発行されるクエリのログを確認したくなる時があります。その際の設定メモです。

## 対応方法
[How to enable logging MongoDB queries for Spring Boot applications](https://sabljakovich.medium.com/how-to-enable-logging-mongodb-queries-for-spring-boot-applications-f7c08e5b434)の記事にある通り、application.propertiesの設定をデバッグにすることでログが出力されます。クエリの生ログというわけではないのですが、どのようなクエリが流れているかは推定できる情報ではあります。

## 設定
上記の記事の回答そのままですが、application.propertiesの設定内容を記載します。
Reactiveを使用する際を考慮して、念の為2行追加します。

```application.properties
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
logging.level.org.springframework.data.mongodb.core.ReactiveMongoTemplate=DEBUG
```
体育科出身の僕がLeetCode入門してみた - Day2 2620. Counter

# 概要
文系（体育科）卒業の僕が、人並みのアルゴリズムを身につけるためにLeetCodeを初めてみました。
日本だとAtCoderが一般的なようですが、海外エンジニアへの憧れを持つ僕はLeetCodeを選びました。

フロントの言語しかほぼ触ったことがないのでJavaScriptでやっていこうと思います。

# 問題
[2620. Counter](https://leetcode.com/problems/counter/description/?envType=study-plan-v2&envId=30-days-of-javascript)

問題文
> Given an integer n, return a counter function. This counter function initially returns n and then returns 1 more than the previous value every subsequent time it is called (n, n + 1, n + 2, etc).

初期コード
```javascript
/**
 * @param {number} n
 * @return {Function} counter
 */
var createCounter = function(n) {
    
    return function() {
        
    };
};

```
整数nを渡すと、最初はnがreturnされてそれから+１、+2・・・とされていく関数を作れば良さそうです。
インクリメントを使えばいけるんかな？
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Increment

```javascript
/**
 * @param {number} n
 * @return {Function} counter
 */
var createCounter = function(n) {
    
    return function() {
       return n++;
    }; 
};
```
Case1もCase2もいけたっぽい。
LeetCode挑戦日記：Day18

# はじめに

最近、業務で実装する時間よりも資料作成やレビューをする時間が多くなってきました。
このままでは自身のコーディング能力が落ちそうで怖いので、LeetCodeを始めてみました。

自身の学習の記録 & LeetCodeに興味のある人が挑戦しやすいように、記事に残していきます。
このような競技プログラミングをした経験がないので、ひよってEasyからやっていきます...

# [Easy] 1732. Find the Highest Altitude

バイカーがロードトリップに出かけています。
このロードトリップは異なる高度にある`n + 1`個のポイントから構成されており、バイカーは高度`0`のポイント`0`から出発します。

長さ`n`の整数配列`gain`が与えられ、`gain[i]`はポイント`i`と`i + 1`の間の高度の純増を表します `(0 <= i < n)`。
ポイントの最高高度を返してください。

## 素直に解いてみる

### 考え方

1. `gain`から高度の配列に置換する
1. 高度の配列から最大値を求める

### コーディング

```typescript
function largestAltitude(gain: number[]): number {
    const altitudes: number[] = [0];

    for (let i = 0; i <= gain.length; i++) {
        altitudes.push(altitudes[i] + gain[i]);
    }
    return Math.max(...altitudes);
};
```

### 結果

Runtime：43ms
Beats 98.64%

Memory：51.16MB
Beats 51.10%
Arduino UNO R4とC#でシリアル通信するときの罠

# Arduino UNO R4は今までのArduinoとは違う。
もしArduino　UNO R4とシリアル通信しようとした時に、C#のアプリケーションでやろうとすると引っかかる罠があります。
今までのArduino UNO R3や、Arduino Nano EveryなどR4以前のArduinoではデフォルトでシリアル通信できていたのが、R4ではできなくなっています。
プロパティの値ひとつ変えるだけで通信可能になりますので、こちらの記事を読んでみてください。
https://www.hobbyhappyblog.jp/trouble-with-serial-communication-with-arduino-uno-r4-in-c-homebrew-app
GitHub Copilot knowledge bases を設定する


## Copilot knowledge bases とは

Copilot knowledge bases は　GitHub Copilot Enterprise を利用している時に使える機能です。
Copilot knowledge bases に GitHub 外で管理しているドキュメントなどを渡すことができ、GitHub Copilot Chat の回答の一部として利用することができます。

## Copilot knowledge bases を設定する

上記にも記載したとおり、 Copilot knowledge bases は GitHub Copilot Enterprise 有効にしている Enterprise アカウント傘下の Organization で有効にすることができます。
設定までのおおまかな流れは以下の通りです。

1. Copilot knowledge bases に登録する Repository の準備
1. Copilot knowledge bases に Repository を登録

### Copilot knowledge bases に登録する Repository の準備

Copilot knowledge bases が参照できるファイル拡張子は、`.md`, `.mdx` のみです。
読み込みさせたいファイルが　Markdown 以外だった場合はファイルを変換するなど対応をしてください。

今回は Notion に登録されているページを読み込ませることにしました。Notion のデータは Export 方法は下記リンクに記載されています。

https://www.notion.so/help/export-your-content

Notion のデータ Export フォーマットは PDF, HTML, Markdo から選択できます。
Copilot knowledge bases は Markdown 以外読み込むことができないので Madkwon を選択します。また、サブページを含めるオプションを有効にすることを忘れないようにしてください。

Export 処理開始後 (ページ数にもよりますが) 数時間で Export が完了します。
Export した Zip ファイルを展開すると Markdown (`.md`) ファイルと CSVファイル `.csv` が含まれています。Repository に不要なファイルを含めると commit や push に時間がかかるので 不要なファイルは削除することをおすすめします。

### Copilot knowledge bases に Repository を登録

knowledge bases の登録は Organizations 設定ページから実施します。
Settings > Copilot > Knowledge の順に進むと設定ページが存在します。

1 knowledge bases に 複数の contents (repository) を紐づけることができます。
Copilot Chat から Knowledge bases を参照しやすい単位に分割すると良いと思っています。 (そこまで検証できていません...)

Knowledge bases に登録してから Copilot Chat で使えるようになるまで1時間ほどかかりました。

## さいごに

実際に GitHub Copilot Chat で利用している画面はお見せできませんが、 Knowledge bases 内のデータを元に回答が行われていました。
また、回答を生成したデータソースを表示させる機能もあり生成されたドキュメントの内容を深く知るという使い方もできそうでした。

## References

https://docs.github.com/en/enterprise-cloud@latest/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-github-copilot-features-in-your-organization/managing-copilot-knowledge-bases

https://zenn.dev/dzeyelid/articles/ffb49a893d6544

https://docs.github.com/en/enterprise-cloud@latest/copilot/github-copilot-chat/copilot-chat-in-github/about-github-copilot-chat-in-githubcom

https://docs.github.com/en/enterprise-cloud@latest/copilot/github-copilot-chat/copilot-chat-in-github/using-github-copilot-chat-in-githubcom