OmniAICreator/Qiita-1.07M huggingface dataset:
筆ペンプロッタとCAM

# 緒言
結婚式のご祝儀袋、筆で文字を書く必要がある、字が汚いことに自信のある人にとって参加する上でのボトルネックとなる工程です。本記事ではそんな工程を改善するための取り組みを実施しました。

これまでにもきれいな字を書くためには、習字やボールペン字講座、ペンプロッタなどの手法がありました。しかし、前者は努力が必要です。また、後者は安価な装置ではサインペンやボールペンなど線の太さが単一に限られ、トメ・ハネ・ハライが必要な筆には対応しておりませんでした。また高価な装置の中には筆文字を書くことのできるものもありますが入手性に難があり、またの冠婚葬祭で利用するにはコストパフォーマンスが悪いです。

そこで、広く自作されているペンプロッタをベースとして筆ペンに対応した筆ペンプロッタ装置を作成し、併せて筆ペンプロッタ用の指令を生成するCAMソフトを開発しましたので、その結果をご紹介いたします。

# 筆ペンプロッタ装置
一般的なペンプロッタを基に装置の設計・製作を行いました。筆の場合、ハネやハライの動作のために直交３軸を同時かつ高加減速で動作させることが必要と考えられるため、移動体質量をなるべく減らすことのできるcoreXY方式を採用しました。また、装置全体をなるべく安価・簡単に実現するためにリニアガイドを採用し、リニアガイド自身をフレームとする構成としました。

本構成によって、1軸に対してリニアガイド１本のみで済むため、リニアシャフト方式と比較しても安価かつ小型化を実現できました。

| 諸元                | 内容                           |
|---------------------|--------------------------------|
| プロット範囲        | 12x19cm (普通サイズのご祝儀袋) |
| モータ (X,Y軸)      | 16HS4023 (AliEx)              |
| モータ (Z軸)        | 28BYJ-48 5V (秋月電子)         |
| リニアガイド (X,Y軸) | MGN12C ブロック数1個           |
| リニアガイド (Z軸)   | 不明 (レール幅5mm程度のジャンク品) |
|駆動方式(X,Y軸)|タイミングベルト|
|駆動方式(Z軸)|ラック&ピニオン|
| 制御装置            | grbl                           |

![写真 2025-03-16 16 22 36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/6bdfc308-dce6-4b39-970e-3bfacbf21d48.jpeg)

![写真 2025-03-16 16 22 51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/89140c0e-3600-465a-9325-6de2d306c254.jpeg)

![写真 2025-03-16 16 23 18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/6343bb4b-47f6-4bcf-9366-c96fe719d92c.jpeg)

# CAM
ペンプロッタ用のNCコードを生成するために、ストロークフォントKST32Bを使用してNCコードを生成するプログラムをMATLABにより作成した。具体的には下図のように読み込んだストロークフォントを基に指令を生成する。

特に各ストローク末尾にトメ・ハネ・ハライを設定し、それに合わせてZ軸を含む指令を生成することで、従来のペンプロッタでは実現できなかった線の太さを実現した。

具体的なコードは下記githubを参照(フォントKST32Bは含まないため必要な方は各自入手のこと)
https://github.com/j4312043/BrushPenPlotterCAM

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/7d876f5a-3eb2-4558-b847-90d96d423e36.png)

# 結果
実際にプロットした画像が下図のとおりである。従来のペンプロッタに見られるようにすべての線が画一ではなくプロットされていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203155/252593a9-fd07-441f-b648-ad6a5826a3fc.png)

# 結言
従来のペンプロッタに対してより手書きに近い形で筆ペンで文字をプロットできた。
リポジトリを作成するコマンドの作成

# stubsの作成
# スタブディレクトリの作成
mkdir -p /src/api/stubs

# スタブファイルの作成
touch /src/api/stubs/repository.interface.stub
touch /src/api/stubs/repository.stub

repository.interface.stub
```
<?php

namespace {{ namespace }};

interface {{ class }}
{
    //
}
```

repository.stub
```
<?php

namespace {{ namespace }};

use {{ namespace }}\Interfaces\{{ class }}Interface;

class {{ class }} implements {{ class }}Interface
{
    //
}
```

`chmod 644 プロジェクトルート/stubs/repository.stub`
`chmod 644 プロジェクトルート/stubs/repository.interface.stub`

# コマンド作成
php artisan make:command MakeRepositoryCommand

app/Console/Commands/MakeRepositoryCommand.php
```
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;

class MakeRepositoryCommand extends Command
{
    protected $signature = 'make:repository {name}';
    protected $description = 'Create a new repository and interface';

    public function handle()
    {
        $name = $this->argument('name');
        $interfaceName = "{$name}Interface";
        
        $this->createInterface($interfaceName);
        $this->createRepository($name, $interfaceName);
        
        $this->info('Repository created successfully!');
    }

    private function createInterface($name)
    {
        $stub = File::get(base_path('stubs/repository.interface.stub'));
        $stub = str_replace(
            ['{{ namespace }}', '{{ class }}'],
            ['App\\Repositories\\Interfaces', $name],
            $stub
        );

        if (!File::exists(app_path('Repositories/Interfaces'))) {
            File::makeDirectory(app_path('Repositories/Interfaces'), 0755, true);
        }

        File::put(app_path("Repositories/Interfaces/{$name}.php"), $stub);
    }

    private function createRepository($name, $interfaceName)
    {
        $stub = File::get(base_path('stubs/repository.stub'));
        $stub = str_replace(
            ['{{ namespace }}', '{{ class }}', '{{ interface }}'],
            ['App\\Repositories', $name, $interfaceName],
            $stub
        );

        if (!File::exists(app_path('Repositories'))) {
            File::makeDirectory(app_path('Repositories'), 0755, true);
        }

        File::put(app_path("Repositories/{$name}.php"), $stub);
    }
}
```

# 使用方法
サービスクラスの作成
`php artisan make:repository リポジトリ名Repository`
サービスクラスを作成するカスタムコマンドの作成方法

# stubsの作成
mkdir -p プロジェクトルート/stubs
touch プロジェクトルート/stubs/service.stub
touch プロジェクトルート/stubs/service.interface.stub

service.stub
```
<?php

namespace {{ namespace }};

class {{ class }}Service
{
    /**
     * Create a new service instance.
     */
    public function __construct()
    {
        //
    }
}
```

service.interface.stub
```
<?php

namespace {{ namespace }}\Interfaces;

interface {{ class }}ServiceInterface
{
    //
}
```

`chmod 644 プロジェクトルート/stubs/service.stub`
`chmod 644 プロジェクトルート/stubs/service.interface.stub`

# コマンド作成
php artisan make:command MakeServiceCommand 

app/Console/Commands/MakeServiceCommand.php
```
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;

class MakeServiceCommand extends Command
{
    protected $signature = 'make:service {name} {--i : Create with interface}';
    protected $description = 'Create a new service class';

    public function handle()
    {
        $name = $this->argument('name');
        $withInterface = $this->option('i');

        // サービスクラスの作成
        $this->createService($name, $withInterface);
        
        if ($withInterface) {
            $this->createInterface($name);
        }
        
        $this->info('Service created successfully!');
        return Command::SUCCESS;
    }

    private function createService($name, $withInterface)
    {
        $stub = File::get(base_path('stubs/service.stub'));
        
        $stub = str_replace(
            ['{{ namespace }}', '{{ class }}'],
            ['App\\Services', $name],
            $stub
        );

        if ($withInterface) {
            $stub = str_replace(
                "class {$name}Service\n{",
                "use App\\Services\\Interfaces\\{$name}ServiceInterface;\n\nclass {$name}Service implements {$name}ServiceInterface\n{",
                $stub
            );
        }

        $path = app_path("Services/{$name}Service.php");
        $this->ensureDirectoryExists(dirname($path));
        File::put($path, $stub);
    }

    private function createInterface($name)
    {
        $stub = File::get(base_path('stubs/service.interface.stub'));
        
        $stub = str_replace(
            ['{{ namespace }}', '{{ class }}'],
            ['App\\Services', $name],
            $stub
        );

        $path = app_path("Services/Interfaces/{$name}ServiceInterface.php");
        $this->ensureDirectoryExists(dirname($path));
        File::put($path, $stub);
    }

    private function ensureDirectoryExists($directory)
    {
        if (!File::exists($directory)) {
            File::makeDirectory($directory, 0755, true);
        }
    }
}
```

# 使用方法
サービスクラスの作成
`php artisan make:service サービスの名前`

インターフェース付きでサービスクラスを作成
`php artisan make:service サービスの名前 --i`
CloudWatch Synthetics でのユーザー操作を CloudWatch RUM に記録する

# やりたいこと
CloudWatch Synthetics で定期的な擬似操作を行うことで、エンドユーザーの操作前に問題を見つけることが可能です。しかし、CloudWatch Synthetics のみでは Javascriptのエラーやレイテンシーの悪化など、問題の詳細な情報を拾うことはできません。そのため、CloudWatch Synthetics の操作も CloudWatch RUM に記録したいと考えました。

# CloudWatch Synthetics 擬似操作は CloudWatch RUM に記録されない？
実際に CloudWatch RUM を導入し、サーバーで操作を行い、マネジメントコンソールの CloudWatch RUM の画面に情報が記録されることを確認しました。そのため、CloudWatch Synthetics で Canaries を作成しました。その後、CloudWatch RUM を確認しても、自分で操作を行った記録以外、つまり、CloudWatch Synthetics の操作が記録されていないことを確認しました。

# CloudWatch Synthetics 擬似操作は CloudWatch RUM に記録する方法
CloudWatch Synthetics は実際のエンドユーザーの操作ではないため、 CloudWatch RUM はCloudWatch Syntheticsの操作を記録しないという情報を入手しました。では、CloudWatch Synthetics の操作を CloudWatch RUM に記録する方法はないのか？と色々検証した結果、CloudWatch Synthetics で利用するヘッドレスブラウザの UserAgent を変更すると記録されることがわかりました。
例えば、下記のように CloudWatch Synthetics Canary の Puppeteer では UserAgent を変更することができます。
```
let page = await synthetics.getPage(options);
await synthetics.addUserAgent(page, "myuseragent");  <<-- この行
```
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library_Nodejs.html#CloudWatch_Synthetics_Library_addUserAgent

実際に、上記を Canary スクリプトに追加すると以下のように CloudWatch RUM に記録されるようになりました。

![スクリーンショット 2025-03-16 18.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/1b8a62f9-f822-4de3-aceb-6462d787ab2a.png)
（ブラウザ Chrome Headless が Synthetics Canary での操作）


# まとめ
この記事では CloudWatch Synthetics の擬似ユーザー操作を CloudWatch RUM に記録する方法を説明しました。これにより、CloudWatch Synthetics でのユーザー操作テストで起きた Javascript エラーや読み込み時間などを記録し、問題の早期発見に繋げることができます
なお、この方法はドキュメントには書かれていないため、将来的に利用できなくなる可能性もありますので注意してください。
debugvsプラグインによる、QGIS+VSCodeでのデバック環境を構築「結局、動作未確認💦」

# 【おち】
　
　ん！これは、、、このデバッグ方法は、QGISにインストール上のプラグインで実行するらしい。
ということ、おおざっぱな私としては、VSCODでインストールプラグインを直接編集して、プラグインリローダを利用して、デバッグで十分なのではという疑問が。。。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015118/e2486393-c1cf-4f5b-94fb-ba041a925084.png)

　最後まで読まずに、自分の環境に併せて、設定していったが、結果、今回は実際に動くか試さなかった。。。
　が！今後のために残しておこう！残念。
　最初に、結論を読んでおけばよかった。💦

# 【環境】
Windows 11
QGIS 3.42
C:\github\yr-qgis-launcher　に　「yr-qgis-launcher」をインストール
　今回は　QGIS 3.42　ポータブル版
# 最初の環境構築(VSCodeのインストール)
VSCodeのインストール
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
# VSCodeでのデバック準備
### ptvsdのインストール
・ OSGeo4Wのshellを起動する
C:\github\yr-qgis-launcher\QGIS3.42.0\qgis でcmdを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015118/af81cd40-aa32-4c54-baaf-9dfdedde8ff2.png)

・pipをインストールする
 python -m ensurepip --default-pip
 
・VSCodeでのデバック用にptvsdをインストール
python -m pip install ptvsd
python.exe -m pip install --upgrade pip

# QGISにDebug用プラグイン「debugvs」をインストールする

プラグインの管理とインストールを起動
メニューバー→プラグイン→プラグインの管理とインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015118/91fa7750-df24-4ea9-9518-e5e03ec39ad9.png)

# VSCode側のデバック設定を作成
launch.jsonを作成する
 .vscode/launch.json
launch.jsonにリモートデバック用の設定を記載する
例）C:\github\yr-qgis-easyinstantprint　のプラグイン
```
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Remote Attach",
      "type": "python",
      "request": "attach",
      "connect": {
        "host": "localhost",
        "port": 5678
      },
      "pathMappings": [
        {
          "localRoot": "${C:\github\yr-qgis-easyinstantprint}",
          "remoteRoot": "${C:\github\yr-qgis-easyinstantprint}"
        }
      ],
      "justMyCode": false
    }
  ]
}
```

localRoot
 C:\github\yr-qgis-easyinstantprint
remoteRoot「直接コードを編集するため、localRootと同じ」
 C:\github\yr-qgis-easyinstantprint
justMyCode
　他のコード内までデバックを行ないたい場合、falseにする

# デバックを実行する
・QGISを起動する
・debugvsのEnable Debug for Visual Studioを実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015118/c6d14c0e-3201-4a06-aa50-41ac0f34bceb.png)
・VSCodeでPython: Remote Attach「launch.jsonで設定」でデバックを実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015118/ef1cba58-e0a6-48f0-aac2-52f5225fbb7e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015118/9020d151-6aab-4ecb-95e6-135b95bfcd5d.png)
・VSCode上でブレイクポイントを設定し、QGISでプラグインを実行する

【参考】
https://qiita.com/ikura1/items/bc1a5263c366ed477f6a
Devcontainer で Claude Code を使う時はfeatures でインストール出来る


Claude Code はNode.jsで動かすことができ、以下のようなコマンドでインストールできます。

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

CLI で動くため、Devcontainer 上で使うことができ、その際のDockerfile には、上記のコマンドを記載するように公式ドキュメントやサンプルコードに記載されています。

https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview#configuration-breakdown

一方で、Anthropics の公式より、[Devcontainer Features](https://github.com/devcontainers/features) が提供されています。

https://github.com/anthropics/devcontainer-features

これにより、Devcontainer の環境でのみ、Claude Code をインストールすることができます。

```json:.devcontainer/devcontainer.json
{
  // ...他の設定の記述
  "features": {
    // コンテナでNode.jsをインストールしていない場合は、併せてインストールする
    "ghcr.io/devcontainers/features/node:1": {},
    "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
  }
}
```

Dockerfile の修正をせず、簡単にセットアップ出来る方法としてfeatures は便利なので、おすすめです。
Windows PowerShell で Unicode(UTF-16LE) から UTF-8(BOM無し) に変換

Windows PowerShell の文字コードの互換性がつらい

```powershell
$File = get-item "sample.txt"
$OutFile = "{0}\{1}.UTF8{2}" -f $File.Directory, $File.BaseName, $File.Extension

# 入力ファイルのエンコーディング
# Windows では UTF-16LE のことを Unicode と呼ぶ
$Encoding = [System.Text.Encoding]::Unicode
$content = [System.IO.File]::ReadAllText($File.FullName, $Encoding)

# 出力ファイルは暗黙的に UTF-8(BOM無し) で作成される
[System.IO.File]::WriteAllText($OutFile, $content)
```

Windows Terminal のコンソールが UTF-8 だったり、再現できなくてすごくつらい。
【html・SpringBoot】正規表現チートシート

## 1.  はじめに
　今回は、SprintBoot＋Vueでアプリケーションを作る中で、正規表現の設定方法などをインプットする機会があったので、メモ書きとしてまとめていたものを公開していきます。

## 2. 正規表現（凡例）

### 凡例①（入力規則でよく使われるもの）

| 文字 | 働き| 入力例 | マッチの例 |
|----|----|----|----|
| ^| 直前の文字が行の先頭にある場合にマッチ |^abcd | abcd......|
| $ | 直後の文字が行の末尾にある場合にマッチ | abcd$  | ......abcd |
| []  | 角括弧に含まれるいずれか１文字にマッチ | [a-z]  | aからzまでの1文字 |
| [^...]  | 角括弧に含まれる文字以外にマッチ | [^a-z]  | aからz以外の1文字 |
| {n,m} | 直前の文字の最小桁数と最大桁数を指定する最長一致 | a{3,5}  | aaa <br> aaaa <br> aaaaa |
| ＋ | 直前の文字が１回以上繰り返す場合にマッチ 最長一致 | abcd+efg | abcdefg <br> abcddddddddefg  |
| *  | 直前の文字が０回以上繰り返す場合にマッチ 最長一致  | abc*efg | abcefg <br>  abcddddddddefg |

### 凡例②（アルファベット1文字で代替できるもの）
| 　 | 意味 | 代替例 |
|----|----|----|
| t | タブ | (なし) |
|  \r  | 改行 | (なし) |
|  \n | 改行 | (なし) |
|  \d | すべての数字 | [0-9] |
|  \D | すべての数字以外の文字 | [^0-9] |
|  \s | 垂直タブ以外の全ての空白文字 | [ \t\f\r\n] |
|  \S | すべての非空白文字 |  [^ \t\f\r\n] |
|  \w | 英字、＿、数字 | [^a-zA-Z_0-9] |
|  \W | 英字、＿、数字以外の文字 | [^a-zA-Z_0-9] |

### ③特徴的な文字列の正規表現

|使用例 | 正規表現 |
|----|----| 
| Email アドレス | ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ |
| 携帯電話番号 | ^0[5789]0-\d{4}-\d{4}$ |
| URL | ^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
| ドメイン名| ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z-]{2,}$ |
| 日付 (YYYY-MM-DD形式) | ^\d{4}-\d\d-\d\d$  |
| 郵便番号 | ^\d{3}-\d{4}$ |

＜エスケープが出来なかったので画像で表示＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762100/66828a20-abc0-4cd0-ab45-bf81ffb20048.png)


## 3. 正規表現（使用例）
①html
patternで入力規則を指定

```html
    // 半角英数字（大文字可）
    <input pattern="^[a-zA-Z0-9]+$"/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762100/3381b530-6d3d-4742-b74a-219690dca29b.png)

②SpringBoot

```java
    // 半角英数字（大文字可）
    @Pattern(regexp="^[a-zA-Z0-9]+$")
    private String userId;
```

半角英数字のみ入力可能なinputに全角かなを投入すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762100/91f276ff-9fac-441a-ad27-68dcd973542c.png)

バックエンドから正規表現に沿うようにとメッセージが返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762100/9945b0d9-de48-4b48-847f-6848c17c23c3.png)

## 3.さいごに
今回の記事は以上です。
次回はnull判定・undefined判定など、その値が入っているかどうかを判定するロジックやライブラリ（loadash）についてまとめた記事を公開予定です。

## 4.参考資料
①[よく使う正規表現とシーン別使用例まとめ](
https://user-engagement.treasuredata.co.jp/howto/0190)
②[【コピペだけすぐ使える！】よく使う正規表現のまとめと正規表現自動生成ツールを紹介！](
https://qiita.com/Octoparse_Japan/items/253380a14ec83be3c7c3)
Sessionの説明と役割について

# ① Sessionとは？

**Session**(セッション)とは、Webサーバーがユーザーごとの情報を一時的に保存し、リクエスト間でデータを保持する仕組みです。

Webサイトでは、ユーザーがページを移動するたびに新しいリクエストが発生しますが、**Sessionを使うことでログイン情報やカートの中身を維持できます。**

例えば、ECサイトでは以下のような情報をSessionで管理します：
- 「カートの中身」
- 「ログイン状態」

これらの情報は、**Session ID（セッションID）としてユーザーのブラウザにCookieとして保存されます。** 次回のリクエスト時にこのSession IDを使って、サーバーがユーザーを識別できるようになります。

![スクリーンショット 2025-03-31 090815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/c3d697b1-40ff-486c-875f-520e71d19fb0.png)



 # ②Sessionの主な役割
- **ユーザーの識別（ログイン情報の保持）**
- **状態の維持（例：ショッピングカート）**
→ ユーザーが追加した商品を記憶
- **アクセス制御（認証が必要なページの制御）**
→ SESSION_ID をチェックし、ログイン状態を判定
- **セキュリティ対策**
　→ Cookie だけでログイン情報を保持すると、改ざんのリスクがあるため、Sessionを利用して安全に情報を管理
![スクリーンショット 2025-04-06 21.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/ffeadf0b-fb42-4004-9d68-c09bfa4883d4.png)



 
# ③WebサイトでのSession活用例（ECサイト）

以下のような流れでSessionが活用されます：

**1.ECサイトにアクセス**
```http
GET /
```

- サーバーはHTMLを返すだけ。まだSessionは作られていない。

**2.ユーザーがログイン**


```http
POST /login
```
- 認証成功後：
	•	サーバーが SESSION_ID を生成
	•	Sessionに user_id を保存
	•	Cookieに SESSION_ID をセット

```http
Set-Cookie: SESSION_ID=abc123
``` 

**3.商品をカートに追加**

```http
POST /cart/add
```

•	ブラウザが Cookie として SESSION_ID=abc123 を送信
	•	サーバーは SESSION_ID をキーにしてカート情報をSessionに保存


**4.ページを移動（例：商品一覧ページ）**

```http
GET /products
```

•	Cookieの SESSION_ID をもとに、サーバーはセッションを参照
	•	カートの中身などを維持

**5.ログアウト処理**

```http
POST /logout
```

•	セッションを削除し、ログイン情報を破棄
	•	Cookieも無効化

```http
Set-Cookie: SESSION_ID=; expires=Thu, 01 Jan 1970 00:00:00 GMT
```

# ④Sessionの重要性（ステートレスなHTTPとの関係）

HTTP通信はステートレス（状態を保持しない）なため、
ログインやカートの情報は本来ページ間で引き継がれません。

→そこで Sessionを使うことで、サーバー側でユーザーの情報を一時的に保存できるようになり、状態を持たせることが可能になります。

# ⑤ LaravelでのSession設定
Laravelでは、.env ファイルの以下の設定で、**セッションの保存方法（ドライバ）**を変更できます：

```env
SESSION_DRIVER=file
```

主なセッションドライバ：
- **file**
→ファイルとして保存(デフォルト)

- **database**
→データベースに保存

- **redis**
→高速キャッシュ用

- **array**
→一時的(テスト用)

- **その他**
→cookie、apc、memcachedなど

・**CookieにはSession IDのみが保存され、実際のデータはサーバーに保持されます。**
用途に応じて、最適なドライバを選択しましょう！

# ⑥まとめ
- Sessionは、サーバー側でユーザー状態を管理する仕組みです。
- 主にログイン管理・カート情報の保持・アクセス制御に使われます。
- Laravelでは簡単にSessionの保存先を変更可能！
- CookieはSession IDを保持し、セキュリティ面でもSessionが安全
活性化関数の問題の解き方まとめ

以下に、**活性化関数（特に出力層）**の用途と代表的な例を、タスク別・レイヤー（層）別にまとめます。ポイントを整理しておくと、問題を解く際に役立ちます。

---

## 1. 出力層でよく使われる活性化関数

| **タスク**                  | **出力層の活性化関数**       | **主な理由**                                                                                          | **主な損失関数**                     |
|:----------------------------|:-----------------------------|:------------------------------------------------------------------------------------------------------|:-------------------------------------|
| **回帰（連続値予測）**      | 恒等関数（Identity）         | 出力をそのまま実数値とする。                                                                           | MSE（平均二乗誤差）, MAEなど         |
| **2クラス分類**            | シグモイド関数（Sigmoid）    | 出力を\[0,1\]の範囲に正規化して「クラス1の確率」を表す。                                               | バイナリクロスエントロピーなど       |
| **3クラス以上の多クラス分類** | ソフトマックス関数（Softmax） | 各クラスの出力を\[0,1\]に正規化して「各クラスの確率分布」を表す。                                      | クロスエントロピーなど               |

- **恒等関数 (Identity)**  
  - 数式：\( f(x) = x \)  
  - 活性化による変形を行わないので、そのままの値を出力したい場合に使う。  
- **シグモイド (Sigmoid)**  
  - 数式：\( \sigma(x) = \frac{1}{1 + e^{-x}} \)  
  - 出力範囲が\[0,1\]となり、2値分類に適した確率解釈が可能。  
- **ソフトマックス (Softmax)**  
  - 数式：\( \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}} \)  
  - すべてのクラスに対して確率分布（合計1）を生成できるので、多クラス分類に用いられる。  

---

## 2. 中間層（隠れ層）でよく使われる活性化関数

| **名称**             | **数式（イメージ）**                       | **特徴**                                                                               |
|:---------------------|:-------------------------------------------|:----------------------------------------------------------------------------------------|
| **ReLU**             | \( \max(0, x) \)                           | 単純・高速。勾配消失が起きにくい。0より小さい入力は0にカットするため「死んだReLU」問題に注意。 |
| **Leaky ReLU**       | \( \max(0.01x, x) \) など                  | ReLUが0未満のときにも小さな傾きを持たせて、死んだReLU問題を緩和。                          |
| **Sigmoid**          | \( \frac{1}{1 + e^{-x}} \)                | 出力が\[0,1\]に制限される。深い層で勾配消失が起きやすいため、近年はあまり使われないことも多い。 |
| **tanh**             | \( \frac{e^x - e^{-x}}{e^x + e^{-x}} \)    | 出力が\[-1,1\]。Sigmoidよりも中心が0に近く勾配消失が少し緩和されるが、深い層ではやはり問題が起こり得る。 |
| **ELU, SELU, GELU**  | (やや複雑)                                 | ReLUの改良版として提案。学習の安定化・汎化性能向上を狙う。                                  |

- **中間層**（隠れ層）では、一般的に**ReLU系**が主流。  
- シグモイドやtanhは**浅いネットワーク**や**特定の用途**で使われることもある。  

---

## 3. なぜこのように使い分けるのか

1. **回帰では恒等関数**  
   - 出力を連続値としてそのまま扱いたいため。  
2. **2クラス分類ではシグモイド**  
   - 出力を確率（\[0,1\]）とみなし、閾値0.5などでクラス判定できる。  
3. **多クラス分類ではソフトマックス**  
   - 各クラスの確率を出力し、その最大値でクラスを予測する。  
4. **隠れ層はReLU系が主流**  
   - 学習が高速で、深い層でも勾配消失を比較的起こしにくい。  

---

## 4. 覚え方のヒント

- **出力層は「確率分布を作るか否か」で分類する**  
  - 確率分布が必要ならシグモイド（2クラス）かソフトマックス（多クラス）。  
  - 確率分布が不要（連続値出力）なら恒等関数。  
- **隠れ層は「ReLU」をベースに覚える**  
  - 「ReLUが基本、特殊な場合にtanhやLeaky ReLUなど」という流れ。  

---

### まとめ

1. **出力層**  
   - 回帰 ⇒ 恒等関数  
   - 2クラス分類 ⇒ シグモイド  
   - 多クラス分類 ⇒ ソフトマックス  
2. **中間層**  
   - 主流はReLU（またはLeaky ReLUなど）  
   - 場合によってSigmoidやtanhも使用  
3. **覚え方**  
   - 「出力が確率かどうか」で区別する  
   - 「中間層はまずReLUから」

このように**タスクに応じて出力層の活性化関数を使い分ける**ことが非常に重要です。また、中間層ではReLUを中心に必要に応じて他の活性化関数を採用する、というイメージを持っておくと整理しやすくなります。
JavaScript: Arrayの罠

`Array`配下の組み込み関数における注意点
* 添字が0～4294967294
	`map`、`forEach`、`keys`、`values`等で全て読み取れる
* 添字が負数、小数、4294967295以上の整数、その他の文字列
	`Array`配下の組み込み関数では読み取れない。`Object.keys`等では読み取れる

```js
let A=[];
A[4294967295]=A[-1]=A[.1]=A.a=0;
console.log(A.length);//0
A.forEach(a=>console.log(a))//nothing
```
添字が負数の場合は更に深刻な問題がある。Browser次第だが、要素の読み書きが劇的に低速化するという点だ。
```js
for(let a=3,s=String.fromCodePoint;a--;){
	console.time("+");
	for(let a=[],b=0;b<1e6;)a[b]=b++;
	console.timeEnd("+");
	console.time("-");
	for(let a=[],b=0;b<1e6;)a[~b]=b++;
	console.timeEnd("-");
	console.time("s");
	for(let a=[],b=0;b<1e6;)a[s(b)]=b++;
	console.timeEnd("s");
}
```
添字に負数なんか指定していると、かつては**Internet Explorer 6**ごときが**Google Chrome様より高速に**動作したものである。
Agent builderのまとめ



+ [Agent builder UIの問題](https://qiita.com/Keiji_otsubo/items/b9f41e0f0daf42fce766)
+ [Agentforce でのトッピックの操作](https://qiita.com/Keiji_otsubo/items/97273015c29c58a139f6)
+ [【ヘルプ】標準エージェントトピックおよびアクションの探索](https://help.salesforce.com/s/articleView?id=ai.copilot_ref.htm&type=5)

# 「会話データを使用してイベント ログを強化する」チェックボックスをオンにすると何ができますか?

エージェントが応答を返すために実行したアクションを含め、エージェントとユーザーとの各やり取りをキャプチャします。エージェント ビルダーの [イベント ログ] タブでイベント ログのやり取りを表示して、エージェントのテストやトラブルシューティングに役立てたり、エージェントを調整してより的を絞った応答を提供できるようにします。

# データの選択

データの選択ステップでは、ライアンはナレッジ記事、FAQ、その他のヘルプ ドキュメントなどのデータをアップロードして、エージェントがアクセスできるようにし、クライアントとの会話にパーソナライズされたタッチを加えることができます。エージェントに含めるデータには、Data Cloud をオンにする必要があり、追加コストが発生する可能性があります。エージェントが実行するジョブの多くはデータを必要としないため、アップロードしなくても問題ありません。後からいつでもエージェントを編集してデータを含めることができます。ライアンはこの時点では使用するデータを選択しません。

# 会話をカスタマイズする

+ Classification Description:トピックを使用するタイミングをエージェントに伝えます。Agentforce 推論エンジンは、ユーザーの意図を検出し、その意図に一致するトピックを呼び出すことができます。

```
Handles requests from clients who want to talk to a human Event Planner to plan a new event.

新しいイベントを計画するために人間のイベント プランナーと話したいクライアントからのリクエストを処理します。
```

+ Scope:このトピックのパラメータ内でエージェントが実行できる操作を定義します。

```
Your job is to ask the client for details about the event they want to plan so that a human event planner can follow up.

あなたの仕事は、人間のイベント プランナーがフォローアップできるように、クライアントに計画したいイベントの詳細を尋ねることです。
```

+ Instructions:エージェントが実行するジョブの詳細を提供します。指示は、エージェントが作業する際のガイドラインとしても機能します。

```
If a user explicitly asks to transfer to an event planner, tell them no event planners are available and offer instead to create a case for the team to review.


ユーザーがイベント プランナーへの転送を明示的に要求した場合は、イベント プランナーが利用できないことを伝え、代わりにチームが確認するためのケースを作成することを提案します。
```

エスカレーション トピック ラベルの横に「新規」という単語が短時間表示されます。これは、そのトピックの新しいバージョンであることを示します。ケース管理および一般的な FAQ トピック ラベルの前の地球儀アイコンは、それらが標準の編集されていないトピックであることを示します。カスタム トピックおよびトピック バージョンの前にはアイコンが表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2157e060-c183-45bb-898b-35ad64973bc5.png)

ライアンはトピック ラベルのドロップダウン メニューをクリックし、トピックを元のバージョンに戻したり、作成したこのバージョンを必要に応じていつでも編集できることを知ります。

# トピックの追加または削除

[トピック ラベル] セクションで、[一般的な FAQ] の横にあるドロップダウン矢印をクリックし、[エージェントから削除]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8b8383bd-b0bc-46fe-8ba8-8dfa8f369edf.png)


# [新規]をクリックして、[アセット ライブラリから追加]を選択することで標準トピックを使える

アセット ライブラリは、Agentforce サービス エージェントに含めることができる標準トピックのリストです。


上記を編集するには　トピックの新しいバージョンを作成します。
コンパクトな日本語特化LLMを試してみた

## はじめに
SB Intuitionsが日本語に特化したコンパクトな大規模言語モデル（LLM）をリリースしました。
https://www.sbintuitions.co.jp/blog/entry/2025/03/07/093143

MITライセンスでHugging Faceに公開されていたので、試しに使ってみました。

## 実施したこと
* Google Colabで動かしてみる
* ChatGPTとの比較
* 同等の小規模日本語モデル TinySwallow-1.5Bとの比較

## Google Colabで動かしてみる
パラメータ数1Bモデルのsarashina2.2-1b-instruct-v0.1をGoogle Colabで動かしてみました。
https://huggingface.co/sbintuitions/sarashina2.2-1b-instruct-v0.1

モデルのロードからサンプルの応答生成は数分で完了。

## ChatGPTとの比較
日本語特化ということなので、古文を題材にして質問してみます。
枕草子の有名な一節を与え、作者と作品名を答えてもらいます。
### sarashina2.2-1b-instruct-v0.1の結果
```python
user_input = [{"role": "user", "content": "やうやう白くなりゆく山際、という一節は誰の何という作品ですか？"}]

# モデルによる応答生成
responses = chat_pipeline(
    user_input,
    max_length=100,
    do_sample=True,
    num_return_sequences=3,
)

# 応答を表示
for i, response in enumerate(responses, 1):
    print(f"Response {i}: {response['generated_text']}")
```
1分ほど考えて結果が返ってきました。さすがにGoogle Colabでそのまま実行しただけではレスポンスはゆっくり。

結果は次のとおりです。3つ出力されたうちの一つ目をピックアップしています。作者と作品名は見事正解。ただ、この一節は第百十段ではなく、第一段。この辺りは、聞き方を工夫して、作者と作品名に限定すればいいかもしれません。
```text
「やうやう白くなりゆく山際」という一節は、日本の著名な文学作品である『枕草子』の第百十段に登場します。
この一節は、清少納言による随筆の中で、春の夕暮れの情景を美しく描写したものです。
彼女は「やうやう白くなりゆく」という表現を用いて、空の色合いがゆっくりと白んでいく様子 ...
```

### ChatGPT4の回答
同じ質問をChatGPT4にしてみました。芭蕉の俳句になってしまいました。
```text
「やうやう白くなりゆく山際」という一節は、松尾芭蕉の有名な俳句です。この句は、冬の訪れを感じさせる山の風景を描写しています。
芭蕉の俳句は季節感を捉えた表現が特徴的で、自然との一体感を詠み込んでいます。
この句もそんな彼の作品の一つとして、日本の古典文学や俳句愛好家に愛され続けています。
```

### ChatGPT4oの回答
こちらは流石に正解。
```text
「やうやう白くなりゆく山際」という一節は、清少納言の『枕草子』の冒頭部分に含まれています。

### **出典**
『枕草子』の有名な冒頭部分：
春はあけぼの。やうやう白くなりゆく山際、少しあかりて、紫だちたる雲の細くたなびきたる。

この文章は、春の夜明けの美しさを描写したもので、日本の随筆文学を代表する名文の一つです。
```
## sakana.ai TinySwallow-1.5Bとの比較
sakana.aiからも公開されている小規模日本語言語モデルTinySwallow-1.5Bとも比較してみました。こちらのモデルはWebLLMで動くウェブアプリが公開されていて、ウェブブラウザ上でさくさく応答します。素晴らしい。
https://pub.sakana.ai/tinyswallow/
さて、質問に対する答えは以下のとおりです。こちらは夏目漱石になってしまいました。
```
「やうやう白くなりゆく山際」の文は、夏目漱石の小説『夢十篇』に登場します。


この作品では、主人公の老いた父親が、残された息子に自分の晩年の心境を語る場面で使われています。


「やうやう白くなりゆく山際」は、主人公の父親が描かれている晩年の風景を表現したものです。具体的には、



人生の終わりに近づきつつある

自分自身を取り巻く環境が変化し始める

変化に伴って心身ともに衰えつつある


といった内容を含んでいます。


夏目漱石はこの作品を通じて、老いと死について深く考えさせられる内容となっています。
```
## まとめ
はるかにパラメータ数が少ないにも関わらずChatGPT4よりも正確な答えが返ってきました。”日本語特化”のポテンシャルを感じました。
言語モデルはWebLLM等を利用したエッジ処理が今後普及していくのでは？と個人的には考えていますので、コンパクトな特化型モデルは今後も様々なものが出てくるのではないかなと思います。楽しみです。
F1でも利用されているOCI (Oracle Cloud Infrastructure)

# F1とOracle
F1の2025年シーズンが開幕しました
10チーム参戦していますが、そのうちの1つが「Oracle Red Bull Racing」です
Oracleは2022年からタイトルスポンサーになっていて、チーム名や車、レーシングスーツに大きくロゴが入っています

https://www.oracle.com/redbullracing/

https://www.formula1.com/en/teams/racing-bulls

Oracle Red Bull Racingは2022年、2023年と圧倒的に強く、2024年からは少し苦戦しているものの、トップチームの1つであることは間違いありません

# F1でのOracle
## OCIの活用

当然ながらOracle Red Bull RacingはOCIを活用しています
最近それに関するニュースリリースも出ていました

https://www.oracle.com/news/announcement/oracle-red-bull-racing-doubles-down-on-oracle-cloud-and-ai-2025-03-13/

OCIのリソースパワーを利用して、レース前やレース中に数十億のシミュレーションを実行して戦略を立てているそうです

## Ampere（Arm）ベースのCompute活用
記事によると新しいA2とA4 FlexのComputeを利用しているとのこと
A4 Flexはまだマニュアルにも載っていないようです

https://docs.oracle.com/en-us/iaas/Content/Compute/References/computeshapes.htm

ComputeのAシリーズはArmベースのプロセッサーです
非常に低価格で人気があります

https://www.oracle.com/jp/cloud/compute/pricing/

Arm版のOracle Linux / Oracle Databaseもあります

https://www.oracle.com/jp/database/free/get-started/#installing

OCIには無償で利用できるAlways Freeサービスがありますが、「最大4VMとして使用できるArmベースのAmpere A1コアと24GBのメモリを1か月あたり3,000OCPU時間と18,000GB時間で使用可能」ということで、リリース時は大変話題になっていました。
※ 3,000OPCU時間 / 4コア / 24時間 = 31日とちょっと
※ 18,000GB / 24GB / 24時間 = 31日とちょっと

https://www.oracle.com/jp/cloud/free/?intcmp=ohp052322ocift_jp#always-free

## 生成AIの活用
OCIにも当然生成AI機能があり、Oracle Red Bull Racingでも活用されているようです
記事では30分以内に過去の膨大な資料から情報を見つける必要があり、RAG＋LLMを組み合わせた生成AI機能を活用して対応しているとのことです
OCIの生成AIの概要は以下の記事にもまとめています

https://qiita.com/fujid/items/5edb99e8554d2bd62509

## SaaS活用
Oracle Red Bull Racingにはファンとの交流プラットフォームである「The Paddock」がありますが、これはOracle Fusion Cloud Customer Experience（CX）ソリューションを活用しているそうです
OracleではCXの他にもERP、EPMなどのSaaSサービスを提供しています

https://www.oracle.com/jp/applications/products/

OCIのIaaS、PaaSサービスとSaaSを組み合わせて利用するといったこともよくおこなわれています
EmacsのMarkdown ModeでシンプルにPlantUMLを埋め込む一手法

# はじめに

[Emacs](https://www.gnu.org/software/emacs/)で技術資料の[Markdown](https://daringfireball.net/projects/markdown/)を編集していると、[PlantUML](https://plantuml.com/ja/)で生成したダイアグラムを挿入したくなるシーンが多々ある。

[Visual Studio Code](https://code.visualstudio.com)は、[MPE](https://shd101wyy.github.io/markdown-preview-enhanced/#/)プラグインを導入することで埋め込みのPlantUML記法をサポートしている。ただし、埋め込み記法は、Viewerを選ぶのでMPEの方式も一長一短のように思う。

一方で、EmacsもVisual Studio Codeの後塵を排するわけもなく、[Markdown Mode](https://jblevins.org/projects/markdown-mode/)と[chatu](https://github.com/kimim/chatu)のコンビネーションで、シンプルかつ使い勝手の良いPlantUMLのダイアログの挿入手法を提供している。

# 必要パッケージ

- [Markdown Mode](https://jblevins.org/projects/markdown-mode/)
- [chatu](https://github.com/kimim/chatu)
    - [PlantUML mode](https://github.com/skuro/plantuml-mode)

        chatuが`plantuml-jar-path`を使用するので、Emacsの初期化ファイルなどで定義が必要。

        - 例
		
		    macOSに[macportsでplantuml](https://ports.macports.org/search/?q=plantuml&name=on)をインストールした場合の指定例を以下に示す。
		
		        (setq plantuml-jar-path "/opt/local/share/java/plantuml/plantuml.jar")

各パッケージの設定については、それぞれのオフィシャル・サイトを確認されたい。

# 使用方法

以下の全ての操作は、Emacs上で行う。

1. chatu-new関数のコール(デフォルトのキーバインドなし)
    Markdown Modeで編集中のファイルにchatu専用のコメントを挿入して保存。
	
    保存を忘れると、chatuで生成したダイアグラムが想定外のところに挿入されてしまう可能性がある。
2. chatu-open関数のコール(`C-c C-o`)
    関数コールで新たに開いた外部PlantUMLファイルを編集して保存。
3. 1.のMardownファイルのバッファに移動  
4. chatu-add関数のコール(`C-c C-c C-c`)
    1.のコメント上で、chatu-add関数をコールすることで、chatuがコメントの直下にダイアグラムを挿入する。

# 注記

- chatuのplantumlの生成モードはsvgのみをサポート

    [pngのサポートのpullreq。](https://github.com/kimim/chatu/pull/5)

# 使用例

上記の[pullreq](https://github.com/kimim/chatu/pull/5)を適用したchatuを使った使用例を以下に示す。

![chatu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/02a9620b-6bbc-4ca9-ad92-9430f27f44fa.gif)
JConsole接続

# WebLogicでJConsole接続

Oracle WebLogic Serverのスタンドアロン・クライアントの開発
https://docs.oracle.com/cd/F32751_01/weblogic-server/14.1.1.0/saclt/jconsole.html

Oracle WebLogic Server 14.1.1.0.0 > スタート・ガイド > モニターおよびチューニング > モニタリングおよびチューニング・ツールの使用 > JMXクライアント・アプリケーション
https://docs.oracle.com/cd/F32751_01/weblogic-server/14.1.1.0/jmxcu/accesswls.html#GUID-61C3C1FF-1B81-44EA-BE63-E965423D2073


# JBoss6以降でJConsole接続

Red Hat JBoss Enterprise Application Platform > 8.0 > Red Hat JBoss Enterprise Application Platformのパフォーマンスチューニング > パフォーマンスの監視
https://docs.redhat.com/ja/documentation/red_hat_jboss_enterprise_application_platform/8.0/html/performance_tuning_for_red_hat_jboss_enterprise_application_platform/assembly-monitoring-performance_performance-tuning-guide#assembly-monitoring-performance_performance-tuning-guide

JConsole を使用して JBoss EAP に接続する方法
https://access.redhat.com/ja/solutions/439133
改行文字列の読み取り

C#で、複数行にわたる改行された文字列を Console.ReadLine で受け取るには、通常の ReadLine では1行しか取得できません。   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037410/a8f7adb6-b0d1-449b-8cb1-f647f2cedbbd.png)
例えば上記のように3行に分けて改行がされているものを読み込む場合はループを使います。

![2025-03-16_17h01_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037410/2c81e8dd-2283-4395-a960-a4ca74a4f6a9.png)

7行目のiは、ループの繰り返し回数を管理するためのカウンタ変数です。  
通常0から始まるのでi=0としている。3回繰り返すなら、0,1,2の3回なので<3としている。
改めて思う。ブロックチェーンはアナーキーな新世界への地獄の門。

## New World Order
ここ最近、NFTとブロックチェーンの仕組みを勉強し始めたのですが、これは本当にヤバいですね。
巷では、NFTとか暗号通貨って、儲け話。幾らになったとか、億り人が一夜で河原乞食みたいな話題ばっかりな訳ですが、プログラマー目線。またはその元々のコンセプトを理解してみると、未だに表立って流通しているのが信じられないくらい劇物だと言う事が分かってくる。
それは、SATOSHI NAKAMOTOも、本名名乗れないし、表に出れるわけありません。今の世界秩序を破壊しかねない過激なコンセプトな訳であって、間違いなく消されます。

## 個人間でお金をやり取りする事の意味
元々BlockchainとBitCoinは、**個人間で自由にお金を送受信出来る** っていう何となく自由を感じるコンセプトから始まっており、かつてのNapsterのお金バージョンって感じだけど、いや、**個人間でお金のやり取りなんて普通やん。** 銀行振込で出来ますやんって仰いますが、それは銀行の口座間での送金で、**銀行っていう民間企業のデータベースに全ての取引は記録されており、口座凍結や送金差し止めなんて簡単で、信用情報も共有されてます**よね。

いや、今は銀行通さんでもPayPalとかPayPayとか電子マネーとか色々あるやん。って仰ると思いますが、どのオンラインサービスも民間企業のサービスであって、**全ての取引情報は彼らのサーバーにばっちり記録されており、アカウントの凍結とかも彼ら次第**っすよね。つまりはどの送金サービスを使おうと、一緒なんですよ。本当の意味で個人間でお金のやり取りなんてしてないんですよ。

じゃあ現金はってなると思うんですが、そもそも紙幣は国の中央銀行で発行、管理されていて、例えば海外への持ち出しとかなり厳しく制限されてるよね。で、海外で何か取引する場合は、殆どが信用力のあるドル決済で、つまり基軸通貨の発行国が強くて、さらにアメリカはドル取引を禁止する事も出来るんだよ。また、経済制裁というオプションも持てるわけで、SATOSHI NAKAMOTOのコンセプトはこれら全て、国レベルの通貨の支配も、銀行や金融機関の持っている機能も全て無効化しようとしている凄く過激な思想なんです。

**真の意味での個人間のお金のやり取りって、国も金融機関も一切通さないやりとりを指す。**

## ブロックチェーン自体の仕組みは超単純
ブロックチェーン自体の仕組みって、プログラム書いてれば超シンプルで、ただのテキストの取引情報のオブジェクトをSHA-256でハッシュ化したもので、それがいわばarrayでチェーン状になっただけのもの。ただの取り引きデータに過ぎない。それが銀行のデータベースに入っていれば、ただの銀行口座でしかない。

https://blockchaindemo.io/

https://andersbrownworth.com/blockchain/blockchain

革命的なのは、それがP2Pで繋がった無数のコンピュータのノード。つまり無数の、無名のパソコンのネットワーク上に保存されていて、**管理者が誰もいない点である。**
お金の流れが誰にも取り引きを監視、管理されない完全にアナーキーで超フラットなシステムであり、国も金融機関も手の届かない所でマネーが勝手に取引されている。こんなヤバい事はないと思うんだよね。

Metaが開発していたLibraっていうやつがありましたが、Metaという一企業が発行して自前のデータベースに取引情報を記録した時点で、**それはただの電子マネー**であって、真の意味での暗号通貨では無い。それすらも潰されたけど。
**ただの取り引き情報を何処に保存して、それをどうverifyするかっていう部分が少し違うだけで、お金というものの在り方が全く変わってしまい**、お金の流通によって強大な力を持っていた旧来の組織が窮地に立たされてしまう訳で、こんなアナーキーなシステムは許されるはずがない。

なので、各国はその暗号通貨をリアルマネーと交換する取引所に色々な規制を今かけてるよね。暗号通貨になってノード上で取引された途端に、誰が誰に幾ら送ったのか全く分からない闇に入ってしまうからね。
陰謀論っぽくなるけど、大手の取引所が次々ハックされたりして、暗号通貨の信用力を落とそうとしているのって、裏に国家レベルの力が働いてる様にすら感じてしまう。

で、SATOSHI NAKAMOTOが生み出したブロックチェーンって、お金以外でも使えるやんって言う事で、Smart Contractというメタデータを実装したのがEthereumで、NFTの基礎になっている。

知れば知るほど過激で、まだ規制が追いついていない分野って黎明期のネット世界みたいで、やっぱり面白いね。という事で、今更何いってんねんみたいなツッコミがあるやも知れませんが、学んでみると今までイメージしていた胡散臭い投機資産というもの以上にやばい香りがするコンセプトの代物で、クリプトや暗号資産、NFTというと、あまりにも投資方面の記事が多すぎて、少しデベロッパー目線からポエムとして書いてみました。
生成AIで時刻を指定したアナログ時計の画像生成が難しい（らしい）件

# はじめに
[「時刻を指定したアナログ時計の画像を画像生成AIは作れない」](https://note.com/yeyshonan/n/n11e5e4523e12?rt=email&sub_rt=daily_report_followee_notes#a8d89b0a-46ba-4b1d-9a6f-50e59738d759)という記事をnoteで見かけたのでいろいろ試してみました。

# ChatGPT
元記事はChatGPT-4oでは無理だったというものなので[ChatGPT-4.5で試してみました](https://chatgpt.com/share/67d63a7a-e33c-8004-a94c-f5642b2beda4)。残念ながらこのリンクでは作成された画像が共有できないのでここに貼ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/e72e08b6-0497-45e1-95f3-880e26a3a292.png)
要するに元記事あるように１０：０８の画像が時計の画像に多いのでそれに影響されてしまって短針と長針の絵を自由に描けないようです。これはChatGPTの問題というより内部で呼ばれているDALL-Eの問題です。面白かったのは途中でGTPT-4.5は自発的にDALL-Eを諦めてPythonで描くことを選択し、結果的に正しい時計の画像を描けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/9d806df7-1d4c-4551-a3f6-b10661163700.png)
これをどう見るかは難しいですね。自分で限界を吐露して方法を切り替えたのだから賢いとみるべきなのか。

# 他の画像生成AI
他の画像生成AIも試してみましたが悲惨でした。
## Canva
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/4ef1e1c8-9de2-434e-a208-be7f7c4d4bcd.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/abf2dd4d-1e4e-4b56-80ca-def461e83dee.png" width=50%>
## Microsoft Designer
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/9b2aee1d-ce3f-48cc-9807-1d9455dc19e0.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/71b035e6-c455-4f59-ba80-34f8628117e4.png" width=50%>
## Artguru
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/a1839b61-c891-4313-b080-1ed9e3e19559.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/7abdc54c-4db7-423a-9d58-d5f4e2428552.png" width=50%>
## FreeP!K
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/0580e3f2-d6cc-4d31-94f0-f7d43545a8f7.jpeg" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/6c40b5d0-319a-496d-8795-d2bf9c33bd59.jpeg" width=50%>

LLMから呼び出す場合と違って一回だめだったらそれっきりなので難しいですね。

## Gemini Flash
Imagin3を呼び出して絵を描こうとするのですが何度修正を依頼してもダメでした
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/302b32dc-991b-4342-9fbd-4c19b11ce1e4.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/90420750-cf1d-42be-bea3-b45acd4cc2b5.png" width=50%>

# おわりに
勿論こういうのって「手描きの図をアップしてこの通りやれ」とかいえばできるんでしょうけど、言葉だけだと難しいというのは意外だったのでこれを見つけた元記事の人は偉いと思います。FreeP!Kなんかは苦肉の策でデジタルの12:13を描いてますがこれをちゃんと描けるということは12:13を指す時計という「概念」を理解していないわけじゃないけどぴったりの絵が作れないということなんですね。なかなか奥が深いです
AgnoのAgentプロンプト設定の謎をソースコードから追跡してみた

Agnoのエージェントを設定する際、プロンプト関連の引数が複数あり、どう設定すれば良いか迷いました。具体的には`description`、`instructions`、`introduction`という似たような引数があり、特に`instructions`と`introduction`に何を設定するべきなのか理解できません。

公式ドキュメントを見ても、説明がやや曖昧で理解が難しかったため、直接ソースコードを参照して調査しました。

- [公式ドキュメント](https://docs.agno.com/reference/agents/agent)
- [ソースコード（GitHub）](https://github.com/agno-agi/agno/blob/main/libs/agno/agno/agent/agent.py)

## プロンプト生成の仕組み

ソースコードを調べたところ、`Agent`クラスの`get_system_prompt(self)`メソッドでプロンプトが生成される仕組みを確認しました。生成されるプロンプトの基本構造は以下のようになっています。

```
"""
{description}\n
<your_goal>
{goal}
</your_goal>

<your_role>
{self.role}
</your_role>

<instructions>
 - {instructions}
</instructions>

<additional_information>
- The current time is {datetime.now()}
- Your name is: {self.name}.
</additional_information>

"""
```

## プロンプト引数の整理

ソースコードから読み取れる`Agent`の主なプロンプト引数を整理しました。

|引数|Type|意味|
|---|---|---|
|system_prompt|str \| Callable \| Message | システムプロンプトを独自に設定する(以下のパラメータは無視)|
|create_default_system_message|bool|システムプロンプトを生成する/しない|
|description|str \| None|システムプロンプトの冒頭に追加される|
|goal|str \| None|Agentの目標を設定|
|role|str \| None|Agentが演じる役割を設定|
|add_datetime_to_instructions|bool|プロンプト内に現在日時を追加するかどうか|
|name|str \| None|Agentの名前を設定|
|add_name_to_instructions|bool|プロンプト内に名前を表示するかどうか|
|instructions|str \| list[str] \| Callable|Agentが具体的に実行すべき手順や指示|

## system_prompt について

system_promptを指定すると、上記の表のsystem_prompt以外の引数は全部無視して、system_promptの内容が、プロンプトとして設定されます。

## create_default_system_message について

create_default_system_messageをFalseに設定すると、上記の表のcreate_default_system_message以降を無視してシステムプロンプトは生成されません。

## introduction について

`introduction`引数には特別な使われ方をします。この引数が使用される条件は、`storage`が指定されたセッションが最初に生成される時のみです。この時にAgentが最初に生成するメッセージとして使用されます。具体的なユースケースは明確ではありませんが、マルチエージェント連携時の初期導入メッセージなどに使われる可能性があります。

詳しくはソースコードをご覧ください。

以上がAgnoエージェントのプロンプト設定の謎解明のための調査結果でした。
エンジニアのためのタスク管理術 － Notionと朝のタスク整理を駆使して効率化を実現

複数プロジェクトの作業を同時並行で進めたことはありますか？
ここでは、Notionという強力なツールを活用し、どのようにして業務を効率化するかを解説します。

# Notionでタスクの手順をまとめる
Notionを利用する際の基本として、各プロジェクトに専用ページを作成することをお勧めします。

**プロジェクトページの構成**
プロジェクト概要、目的、期日といった基本情報を冒頭に配置します。
**サブページの活用** 
各タスクに関する詳細情報やリソースが多い場合は、サブページを作成し、より深く分けて管理します。

私は以下のようにpageを作成し、階層構造にすることでアクセスしやすくしています
- プロジェクトA
    - レポート作成手順
    - コードの修正手順

3. テンプレートの活用
反復的な作業はテンプレートを活用することで効率化できます。コード開発で共通の手順や必要なチェックリストがある場合、それをNotionにテンプレート化しましょう。これにより、毎回一から作成する労力を省けます。

4. データベースとタグ機能
タスクデータベースを活用して、タスクの状態（To Do, In Progress, Done）や難易度、優先度を管理します。各タスクにタグ付けを行うことで、特定の技術領域やプロジェクトでフィルタリングが可能です。


# 一日のタスクを朝に整理
**1. タスクの確認**
自分がやるべきタスクを洗い出します。
この時にそのタスクの期限についても確認します。

**2. タスクをスケジュールに落とし込む**
タスクにかかる時間を考えて、スケジュールを組んでいきます。
ここで大事なのは予備の時間として1時間程度タスクを入れない時間を組み込むことです。
予定していた時間内に終わらなかった場合や、別の急ぎのタスクが入っても柔軟に対応することができます。

**3. フィードバックループの確立**
仕事の終わりに、その日の成果をレビューし、未完了のタスクに対する教訓を得ます。たとえば、タスクがなぜ遅延したのか、どの部分が時間を要したのかを分析し、次の日以降の改善につなげます。

# まとめ
エンジニアが複数のプロジェクトを同時に管理する際には、効果的なツールとしっかりとした計画が不可欠です。Notionを活用した手順の明確化と、毎朝のタスク整理によって業務の効率を大幅に向上させることができます。これによって、プロジェクトの成功と自己成長を同時に実現しましょう。
【GCP Pub/Sub】ComposerでのPull頻度を増やしてレイテンシを改善する方法

# 背景
GCPのPub/SubをComposerで処理している際、以下の問題に直面しました。
* Pub/Subのバックログ（未処理メッセージ）が増えてしまう
* Composerの処理はエラーなく完了しているのに、Pub/Subのメッセージが減らない
* Oldest Unacknowledged Messageの経過時間がどんどん増えてしまう

Googleサポートからの回答によると、**Pullリクエストの頻度が不足しているため、バックログが解消されない** とのことでした。

## 課題の整理
### 現在の設定

* Composerの実行頻度: 30分に1回
* Pub/SubのPull方法: 単行Pull（Pull API）
* max_messages: 100
* ACKデッドライン: 10分
* 1回のComposer処理時間: 約10分
* 1回のPullで取得するメッセージ数: 5個程度（時々2個しか取得しないことも）

### 問題点
* 1回のPullで取得するメッセージ数が少なく、Pub/Subにメッセージが溜まる
* メッセージが取りきれずに次回のComposer実行まで待たされる（結果、レイテンシが発生）
* **Pullリクエストの頻度が不足している**

### 解決策
* 単行Pullを並列処理する（スレッドを増やす）
    * Pub/SubのPull **APIは単一リクエストでは取得できるメッセージ数にばらつき**があるため、**並列で複数のPullリクエストを実行することでメッセージ取得量を増やす**

### 並列Pullのメリット

* 1回のComposer実行でより多くのメッセージを取得できる
* Pullリクエストを複数並列実行することで、取得漏れを防ぐ
* Pub/Subのバックログ削減につながる

### 注意点
###### Composerのリソース消費に注意
* 並列PullによってCPU・メモリ使用量が増加する可能性があるため、Composerのリソース状況も確認

###### ACK処理を適切に行う
* ACKしないとメッセージが再送されるため、Pull後に確実にACKを実行

### まとめ
* Pull APIを並列実行し、一度に多くのメッセージを取得する
* ACK処理を適切に行い、メッセージの再送を防ぐ
プログラム入門：開発効率UP！pipでPythonパッケージをスマートに管理するためにまとめてみた

## はじめに
ITスクールでの学習やハッカソンへの参加を通じて、Pythonの環境構築やライブラリ管理の重要性を再認識しました。

:::note info
特に、チーム開発においては「**環境が違うと動かない**」「**必要なライブラリがインストールされていない**」といった問題が発生しやすく、その解決策として`pip`コマンドの理解が不可欠だと感じました。
:::

そこで、`pip`の基本から実践的な使い方までを整理しようと思いました。

---

## pipとは？
`pip`はPythonのパッケージ管理ツールであり、Pythonのライブラリやモジュールを簡単にインストール、アップデート、アンインストールできるコマンドです。

## 基本的な使い方

### インストール
```bash
pip install パッケージ名
```
例：
```bash
pip install requests
```

### アップグレード
```bash
pip install --upgrade パッケージ名
```
例：
```bash
pip install --upgrade requests
```

### アンインストール
```bash
pip uninstall パッケージ名
```
例：
```bash
pip uninstall requests
```

### インストール済みパッケージの一覧表示
```bash
pip list
```

**実際のターミナル画面**

![Screenshot 2025-03-16 at 13.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ca4ede58-5614-4dee-89f0-8b148bcbb1fe.png)

### 特定のパッケージのバージョン確認
```bash
pip show パッケージ名
```
例：
```bash
pip show requests
```

**実際のターミナル画面**

![Screenshot 2025-03-16 at 13.26.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c673b18b-efe1-4fb8-86ec-1ef790ebc306.png)

### 依存関係を考慮したインストール
プロジェクトごとに必要なライブラリをまとめてインストールするには、`requirements.txt`を利用します。
```bash
pip install -r requirements.txt
```

### requirements.txtの作成
```bash
pip freeze > requirements.txt
```

---

## pipを使う上でのポイント
1. **仮想環境の活用**
   - プロジェクトごとに仮想環境を作成し、環境を分離することが推奨される。
   - `venv`や`virtualenv`を活用することで、グローバル環境を汚さずに済む。

2. **パッケージの互換性に注意**
   - `pip check`コマンドで、依存関係の問題がないか確認できる。

3. **キャッシュのクリア**
   - `pip install --no-cache-dir`を使うと、キャッシュを使わずに新規インストールできる。

---

## まとめ
`pip`コマンドはPythonの開発に欠かせないツールであり、適切に活用することで環境構築がスムーズになります。

:::note warn
***特にチーム開発では、`requirements.txt`を活用した依存関係の管理が重要です。***
:::

今後も、効率的な開発環境を維持するために、`pip`の使い方をしっかり押さえていきたいと思います。
24GB RAM + 4CPU + 200GBストレージのLinuxサーバーを無料で手にいれる方法

# 概要

エンジニアであれば誰もが、無料で利用できるサーバを求めていると思います。
この記事では、`OCI(Oracle Cloud Infrastructure)`を使用して24GB RAM + 4CPU + 200GBストレージのUbuntuサーバを手にいれる方法を詳しく解説していきます。

無料で利用できるパブリッククラウドとしてAWS, GCPも存在しますが、どちらも無料枠は1年間限定で、期限が切れると有料プランに移行してしまいます。しかしOCIについては期限の制限なしに無料枠を提供してくれています。

# Oracle Cloud のAlways Freeクラウド・サービスとは？

期間の制限なくOCIのサービスを使用できるもの。

✅ ARMベースの`4CPU + 24GB RAM`のVMインスタンスを1か月あたり3,000 OCPU時間と18,000GB時間で使用可能。例えば、`4CPU + 24GB RAM`のVM1台を作ることもできるし、`1CPU + 6GB RAM`のVMを4台作ることも可能。
✅ 2つのBlock Volumesストレージ、合計`200GB`

:::note info
3,000 OCPU時間
4OCPUを750時間（約1か月）使うと、3,000OCPU時間

18,000GB時間
24GBのメモリを750時間使うと、18,000GB時間

公式サイトには難しく書かれていますが、実質「4CPU + 24GB RAM + 200GBストレージのサーバーを無料で期間に制限なく使用できる」ということです！
:::

※詳しくは公式サイトを参照お願いします。

https://www.oracle.com/jp/cloud/free/

# ステップ1 Oracle Cloudに登録する

1. OCIアカウントの登録ページへ移動 https://signup.oraclecloud.com/
1. 必要な情報を入力しメールアドレス認証
1. クレジットカード情報の入力 
※クレジットカードの検証のために少額の決済が発生してしまいますが、すぐに返却されるので安心して下さい。

![スクリーンショット 2025-03-12 21.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620245/06d06af5-2d87-44a1-84fe-c4197f063b9f.png)

もしもアカウントの作成に詰まったら以下のサイトを参考にしてみると良いかもです。

https://qiita.com/fufukuku/items/af58e01ec0ee93f063b0

# ステップ2 無料のインスタンスを作成

アカウントの作成が完了したらOCIにログインして
1\. 「コンピュート > インスタンス」を選択します。

![スクリーンショット 2025-03-12 22.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620245/4fd0fb83-c44d-488e-8de9-9a43d772b0fe.png)


2\. 次に「インスタンスの作成」を選択します。

![スクリーンショット 2025-03-12 22.49.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620245/7cd56806-2d3d-4291-b2ec-cb180be6e935.png)


3\. 次に使用するイメージとシェイプを選択しますが、イメージは無料のものを選択して下さい。シェイプに関しては、以下の赤枠で囲っている「Always Free対象」のものを選択して下さい。

![スクリーンショット 2025-03-12 23.18.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620245/6c5d3c05-1633-4b2e-ac14-eb36d8aa2e7d.png)


4\. 次に「ブートボリューム」を最大200GBで選択します。
5\. 最後に「作成」を押下すればインスタンスの作成が完了します。

# もしインスタンスを作成できない場合

インスタンスを作成しようとしたときに以下のエラーが出て作成できないことがあります。
おそらくOCIが用意しているAlways Freeアカウントで取得可能なリソースを制限しているものだと考えられます。
一部の記事では、自動でトライし続けるスクリプトを組んでいる方もいますが、アカウントのアップグレードすれば作成できる可能性が高いのでそちらも一つの手かもしれません。（コストの管理は注意が必要です。）

:::note warn
可用性ドメインAD-1のシェイプVM.Standard.A1.Flexの容量が不足しています。別の可用性ドメインでインスタンスを作成するか、後で再試行してください。 フォルト・ドメインを指定した場合は、フォルト・ドメインを指定せずにインスタンスを作成します。それでも問題が解決しない場合は、後で再試行してください。
:::

![スクリーンショット 2025-03-14 22.04.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2620245/e55ebccf-ec0e-4a3b-b453-35204d1f2847.png)

# まとめ

OCIのAlways Freeを活用すれば24GB RAM + 4CPU + 200GBストレージを無料で使用できることがわかりました。是非この無料枠を活用してみて下さい！

（実際にSSHしてサーバ確認してみた結果）
```
Architecture:             aarch64
  CPU op-mode(s):         32-bit, 64-bit
  Byte Order:             Little Endian
CPU(s):                   4
  On-line CPU(s) list:    0-3
Vendor ID:                ARM
```

```
               total        used        free      shared  buff/cache   available
Mem:            23Gi       298Mi        22Gi       5.0Mi       426Mi        22Gi
Swap:             0B          0B          0B
```

```
/dev/sda1       194G  1.6G  193G   1% /
```
Power Automate for Desktop 小技①SPOライブラリのファイルを開く

Power Automate for Desktopの小技（こんなときどうする?）について記載したいと思います。
今回は**SPOライブラリ**の**ファイル**を**直接開く**方法になります。

### メリット
そもそもSPOライブラリのファイルを直接開くメリットは以下のとおりと考えています。
・Webシステムへ入力するデータを事前にPower QueryやVBAで加工できる。
・常に最新のクラウド上のデータを扱える。
・ローカルフォルダにダウンロードする手間を無くせる。

### SPO上のファイル例
今回は、以下のテストライブラリのTESTBOOK.xlsxを開く方法を考えたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/2d7b21c8-0cdd-472d-b519-c2e1d26c19b4.png)

### ファイルのパスを取得
テストライブラリのTESTBOOK.xlsxファイルを選択して「⋯」から「詳細」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/cfbc7328-b8d9-406a-bc40-f21587feea57.png)

右側に詳細メニューが開きますので、一番下までスクロールして**パスのコピーアイコン**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/d7fe6872-8c92-4d47-a55a-c2d1eef68663.png)

**補足：「リンクのコピー」では絶対パスが取れない**
ライブラリ上の**絶対パス**を取得する必要があるため、**詳細メニューのパスの機能**を使用するところがポイントになります。
「リンクのコピー」では絶対パスが取得できません。

### フローの作成
ここからPower Automate for Desktopのフローを作成していきます。

#### アプリケーションの実行
「アプリケーションの実行」アクションを配置し以下のパラメータを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/cd1c0214-3b50-428a-9c98-ba28b10f517d.png)


|パラメータ|設定値|備考|
|---|---|---|
|アプリケーション パス|ms-excel:ofe\|ofc\|u\|https://(取得したファイルのパス)|Officeアプリ毎に起動方法が異なる。詳細は以下表を確認|
|コマンドライン引数|設定なし|アプリケーション起動時の付加情報を与えることで起動時の指定が可能になる|
|作業フォルダー|設定なし|コマンドラインでの起動時の作業フォルダー|
|ウィンドウスタイル|最大化|起動したアプリ画面の大きさ|
|アプリケーション起動後|アプリケーションの完了を待機|次のアクションの起動タイミングを設定|
|タイムアウト|180|タイムアウトさせる秒数を指定|

アプリケーションパスについては、以下のとおり指定することが可能です。

**Excelの場合**
|パターン|設定値|
|---|---|
|読取専用で開く場合|ms-excel:https://(取得したファイルのパス)|
|編集モード（通常）で開く場合|ms-excel:ofe\|ofc\|u\|https://(取得したファイルのパス)|

**Wordの場合**
|パターン|設定値|
|---|---|
|読取専用で開く場合|ms-word:https://(取得したファイルのパス)|
|編集モード（通常）で開く場合|ms-word:ofe\|ofc\|u\|https://(取得したファイルのパス)|

**PowerPointの場合**
|パターン|設定値|
|---|---|
|読取専用で開く場合|ms-powerpoint:https://(取得したファイルのパス)|
|編集モード（通常）で開く場合|ms-powerpoint:ofe\|ofc\|u\|https://(取得したファイルのパス)|

アプリケーション起動後については、「アプリケーションの完了を待機」としました。
※「すぐに実行」も指定が可能ですが、後続のアクションが動かない場合もあるため、避けたほうが無難です。

**補足：「Excelの起動」アクションではエラーとなる**
「Excelの起動」のアクションでは、エラーとなりますので上記の「アプリケーションの実行」アクションが必要となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/d6fcf697-f61f-43f4-bc31-7aa4979332c3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/1bfa6d62-fc1b-472a-b6be-a60f66f4a117.png)

#### 実行中のExcelに添付
続いて「実行中のExcelに添付」アクションを追加します。
以下パラメータを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/d63928f7-5b69-47ae-b2fc-c2e93e4a8bee.png)

|パラメータ|設定値|備考|
|---|---|---|
|ドキュメント名|TESTBOOK.xlsx|すでに開いているExcelドキュメントに添付します。と説明があるため、TESTBOOK.xlsxを開いた状態で指定が可能です。|

上記のアクションにより、ExcelInstanceを後続のアクションに渡すことでSPOライブラリ上のファイルの操作が可能となります。
### フローの全体
作成したフローは以下のとおりとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/ade98ab4-185a-42e1-977f-ec6e47f76a98.png)


### まとめ
・「アプリケーションの実行」アクションでSPOライブラリのファイルをPower Automate for Desktopで起動できる。
・「アプリケーションパス」は「ms-excel:https://(取得したファイルのパス)」または「ms-excel:ofe\|ofc\|u\|https://(取得したファイルのパス)」で指定する。
・「実行中のExcelに添付」アクションで起動したファイルのインスタンスを取得可能。