OmniAICreator/Qiita-1.07M huggingface dataset:
Qiita記事をSlackに自動投稿するBotの機能拡張案

# はじめに
現在、GitHub Actionsを利用して、Qiitaから特定のタグを持つ最新記事を取得し、Slackの特定チャンネルに自動投稿するBotを作成し、利用しています。

本記事では、このBotの機能拡張について検討し、今後の実装計画を整理しようという思いで書きました。

- 関連記事
[親）Pythonのslack_sdkライブラリで最新記事のキャッチアップができるSlackボットを作る](https://qiita.com/banksline_tus/items/7577dfe3467f9d762195)


# 現在の機能
- **Qiita API** を利用し、指定タグを持つ最新の上位3件の記事を取得
- 取得した記事を **Slackの特定チャンネル** に投稿
- **GitHub Actions** を使用し、毎日決まった時間（JST 08:30）に自動実行


# 開発計画

| 機能 | 優先度 | 実装方法 |
|------|------|------|
| **複数タグ対応** | 高 | `fetch_qiita_articles()` を修正し、複数タグを検索 |
| **記事フィルタリング（いいね数, ストック数）** | 高 | APIレスポンスのデータを活用 |
| **Slack投稿フォーマット改善** | 高 | Markdown対応、スレッド化 |
| **手動実行機能** | 中 | Slack Bot コマンド実装 |
| **スケジュール柔軟化** | 中 | GitHub Actions のカスタムスケジュール |
| **複数チャンネル対応** | 中 | 設定ファイルでチャンネルを分岐 |
| **記事の言語フィルタリング** | 低 | 記事の言語情報を判定 |
| **エラーハンドリング・ロギング** | 低 | ログ管理の導入 |
| **記事の要約機能** | 低 | AI要約APIを統合 |
| **ランキング機能** | 低 | 記事のスコアを算出し定期投稿 |



# 機能拡張詳細

### 1. 複数タグ対応
- 現在は **1つのタグ** のみ検索対象
- **複数タグ** を指定し、各タグごとに記事を取得・投稿
- 例: `['生成AI', 'Python', 'SlackBot']` の記事を別々に取得
→**タグ名もSlackへの投稿フォーマットに追加**

### 2. 記事のフィルタリング機能
- **いいね数** や **ストック数** を基準に **人気記事のみ通知**
- 過去に通知した記事を記録し、**重複投稿を防ぐ**
→これ結構優先度高めだと感じてる

### 3. Slack投稿のフォーマット改善
- 現在は **タイトルとURLのみ** 投稿
- **記事の概要（description）** や **投稿者情報** も追加
- Markdownを活用し、見やすいフォーマットに変更
- **スレッド機能** を使い、1つの投稿にまとめる
→ここら辺の**UI的な要素**は優先度高いと思った

### 4. 通知スケジュールの柔軟化
- 現在は **1日1回** 固定
- **設定可能な時間や回数を増やす**（例: 朝・昼・夜の3回）
- **特定の曜日のみ通知する** 設定を追加
→**今後のスケジュール感**によって優先度が変わる

### 5. 手動実行機能
- Slack上で `/qiita 最新3件` のようなコマンドを実行すると、即座に記事を取得・投稿
- GitHub Actions とは別に、**手動実行用スクリプトを用意**
→やってもいいけど、手動で実行ではなく**違う機能を考えたい**

### 6. 複数チャンネル対応
- 特定のタグごとに異なるSlackチャンネルへ投稿可能に
- 例: `生成AI` は `#ai-news`、`Python` は `#dev-python` へ投稿
→意外と良いと思ってる

### 7. 記事の言語フィルタリング
- Qiita記事の **投稿言語** に応じて、日本語記事のみ取得
- 英語記事も対象にする場合、フィルター機能を追加
→投稿言語の比が分からないけど、ほぼ日本語だと思うからいらないかも

### 8. エラーハンドリング・ロギング
- APIエラー時のリトライ処理
- 投稿失敗時のエラーログ収集（例: CloudWatch, ログファイル）
→エラーハンドリングは例外なく重要か

### 9. 記事の要約機能
- 記事の内容を **AIで要約** し、Slack投稿に含める
- OpenAI APIやGemini APIなどを活用
Slackの投稿は、長すぎると隠れるから要約させたい

### 10. 記事のランキング機能
- 直近1週間や1ヶ月の **人気記事ランキング** を定期投稿
→直近1カ月くらいならくどくないかも？？


# おわりに
本記事では、Qiita記事をSlackに自動投稿するBotの機能拡張案を整理しました。

まずは **「複数タグ対応」「記事フィルタリング」「Slack投稿フォーマットの改善」** から進めると、より使いやすくなると考えています。

今後の実装の進捗は、Qiita記事で気長に共有していこうと考えています。


* slackボットのgithubリポジトリ

https://github.com/S-Riku-tus/pj-ai_article_bot
C++にもdefaultdictが欲しいよって話

　C++の `map` はとても便利です。

　高速なのもそうですが、存在しないキーを参照した時には `0` を返してくれるため、実装時のエラーハンドリングが不要になります。しかし、時としてこの仕様が仇になることがあります。

　具体的には、`0` を単位元として扱えないとき、よりわかりやすく言うと、最小値更新や最大値更新のときです。

```c++
#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

int main() {
    map<int, int> mp;
    mp[1] = min(2, mp[1]);
    cout << mp[1] << endl; // 0!?
}
```

　最小値は `2` で更新されるはずですが `0` になっています。

```c++
#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

int main() {
    map<int, int> mp;
    mp[1] = max(-2, mp[1]);
    cout << mp[1] << endl; // 0!?
}
```

　最大値は `-2` で更新されるはずですが `0` になっています。

　例えば、最小値だと初期値は十分大きな値、最大値だと初期値は十分小さな値、一般的には、ある演算に対して初期値を単位元にしないとバグります。

# defaultfict

　Python においては、`map` に相当するデータ構造として `defaultfdict` があります。（ビルトインの `dict` だと、存在しないキーを参照した時にエラーが出るため、ハンドリングが必要になります）

　`defaultdict` はその名の通り初期値をカスタマイズできます。

```python
from collections import defaultdict

# 最小値を求める場合（十分大きな初期値を設定）
min_map = defaultdict(lambda: 10**18)
min_map[1] = min(2, min_map[1])
print(min_map[1])  # 出力: 2

# 最大値を求める場合（十分小さな初期値を設定）
max_map = defaultdict(lambda: -10**18)
max_map[1] = max(-2, max_map[1])
print(max_map[1])  # 出力: -2
```

# C++でもdefaultdictを

　これと同じものを C++ でも定義しましょう。
　以下のように、`map` をオーバーライドして `default_map` を作ります。

```c++
template <typename S, typename T>
struct default_map : map<S, T> {
    T default_value;

    // コンストラクタで初期値を受け取る
    default_map(T default_value) : default_value(default_value) {}

    // []演算子をオーバーライドして、キーがない場合にデフォルト値を設定
    T& operator[](const S& key) {
        return map<S, T>::emplace(key, default_value).first->second;
    }
};
```

# 使用例

```c++
#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

template <typename S, typename T>
struct default_map : map<S, T> {
    T default_value;

    // コンストラクタで初期値を受け取る
    default_map(T default_value) : default_value(default_value) {}

    // []演算子をオーバーライドして、キーがない場合にデフォルト値を設定
    T& operator[](const S& key) {
        return map<S, T>::emplace(key, default_value).first->second;
    }
};

int main() {
    default_map<int, int> min_map(2e9);  // 十分大きな初期値（最小値用）
    default_map<int, int> max_map(-2e9); // 十分小さな初期値（最大値用）

    min_map[1] = min(2, min_map[1]);
    cout << "min_map[1]: " << min_map[1] << endl;  // 出力: 2

    max_map[1] = max(-2, max_map[1]);
    cout << "max_map[1]: " << max_map[1] << endl;  // 出力: -2

    return 0;
}
```

# 追記

　コメントによると、あまり良くない実装らしいので、ご注意ください。一応、競プロのようなインスタントな用途を想定しています。
asdf globalコマンドが消えた / 使えない

# TL; DR
`asdf` を v0.16.0 以降にアップグレードすると、おなじみの `asdf global` コマンドが使えなくなっているのでその対処方法を記しておきます。

### globalのバージョン指定
```
asdf global nodejs 23.5.0
```
は
```
asdf set --home nodejs 23.5.0 
```

で置き換えると良い

### .tool-versionsへのバージョン指定
```
asdf local nodejs 23.5.0
```
は
```
asdf set --parent nodejs 23.5.0 
```

で置き換えると良い

# 背景
### 要約
`global` で設定した値が、`.tool-versions` で上書きされてしまう挙動が、ユーザーの混乱を招くので、変更した。今後は、 `asdf set` コマンドのオプションで `asdf global`と `asdf local` の機能を提供します、ということらしい。

### 和訳(Claude 3.5 Sonnetによるもの)
> asdf globalとasdf localコマンドは削除されました。「global（グローバル）」と「local（ローカル）」という用語は不適切で誤解を招くものでした。asdfは実際には、どこでも適用される「グローバル」バージョンをサポートしていません。asdf globalで指定されたバージョンは、現在のディレクトリにある.tool-versionsファイルで異なるバージョンが指定されていれば、簡単に上書きされてしまいます。これはユーザーにとって混乱の原因となっていました。
新しいasdf setは、デフォルトではasdf localと同じように動作しますが、ユーザーのホームディレクトリ（--homeオプション）や親ディレクトリのいずれかにある既存の.tool-versionsファイル（--parentオプション）でバージョンを設定するためのフラグも備えています。この新しいインターフェースにより、asdfがバージョンをどのように解決するかについてより良い理解が得られ、同等の機能が提供されることが期待されます。
>
> 
### 原文
> `asdf global` and `asdf local` have been removed. The "global" and "local"
terminology was wrong and also misleading. asdf doesn't actually support
"global" versions that apply everywhere. Any version that was specified with
`asdf global` could easily be overridden by a `.tool-versions` file in your
current directory specifying a different version. This was confusing to users.
The new `asdf set` behaves the same as `asdf local` by default, but also has
flags for setting versions in the user's home directory (`--home`) and in an
existing `.tool-versions` file in one of the parent directories (`--parent`).
This new interface will hopefully convey a better understanding of how asdf
resolves versions and provide equivalent functionality.

https://github.com/asdf-vm/asdf/blob/9432bfc5dc732c50ff715460050390cf07e40ce7/docs/guide/upgrading-to-v0-16.md?plain=1#L104
より転載


# Original
https://zenn.dev/kentrino/articles/fb2bd90bf08993
Ubuntsuにdockerとdocker composeを入れる方法

## Ubuntsuにdockerとdocker composeを入れる方法

よくdockerの導入方法を忘れるので、備忘録的に書きます。
環境
Xserver VPS

### 1: Dockerの導入
まずは、以下のコマンドでパッケージのインストールを行う。
```bash
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
```
もし、すでにdockerが入っていたら以下のコマンド
```bash
sudo apt remove docker docker-engine docker.io containerd runc
```

Dockerを入れるにはどうやらGPGキーというものが必要らしい。
とりあえず以下のコマンドでGPGキーを取得
```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```

GPGを使って、dockerのリポジトリをaptに読み込ませている？
※有識者求む
```bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

その後、いったんaptをアップデートして、dockerをインストールする。
apt updateをしないと、先述した情報が更新されないのでエラーが出てしまう。
```bash
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
```

念の為、入っているか確認。
バージョンが表示されたらOK。
```bash
docker --version
```

最後に以下のように起動設定を行う。
```bash
sudo systemctl enable docker
sudo systemctl start docker
```

Docker composeを別途入れる必要があると思ったのですが、すでに導入されていました。
Dockerのインストールで自動で入るようになった？
Windows版Excelで日本の祝日をWEBから取得する方法

# 背景
自身の勤務実態を公的機関に証明するため、出勤簿を作成することになりました。
本来なら改竄できないタイムカードや、WEB就業っぽいシステムが望ましいのですが、法律に関わることに使うわけではないので、お手軽にExcelで作ることにしました。
# 祝日を自動で判別したいよね
ネットを調べると、[内閣府が国民の祝日](https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html)をCSVで提供しています。
[こちら](https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv)からダウンロードできます。
これはありがたいのですが、毎年CSVファイルをダウンロードしてこなくてはいけませんね。
もっとお手軽に祝日を知る方法はないのかを調べていて、とても便利な方法が見つかりました。
# 国民の祝日を取得するWebサービス
[http://api.excelapi.org/datetime/holiday?date=44197](http://api.excelapi.org/datetime/holiday?date=44197)にWebブラウザでアクセスしてみます。
すると、Webブラウザに`元日`と表示されます。

![スクリーンショット 2025-02-14 13.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/f9ffb0f4-4577-4e0e-9aba-f14e0cdb64fa.png)


`44197`という数値はExcelでは`2021年1月1日`のことです。
このWebサービスに渡す数値を把握できれば、国民の祝日を知ることができます。

# WEBSERVICE関数を利用する
Excelの関数に`WEBSERVICE`というものがあります。
AppleのNumbers派の私はあまり詳しくないですが、`Webサービスの結果をセルに表示する関数`のようです。

試しに、下記のようにA列に日付を入れます。
Excelが自動的に日付と認識してくれます。

B列は数式`=A1`、`=A2`、`=A3`を入力し、B列の書式は`標準`にします。
そうすると、日付の数値が表示されます。これがWebサービスに渡す数値です。
C列は数式`=WEBSERVICE("http://api.excelapi.org/datetime/holiday?date="&A1)`と入力します。WebサービスにA列の値を渡せば、国民の祝日が返ってきます。
祝日がなければ空白です。

![スクリーンショット 2025-02-14 13.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/ffbacbf2-f04b-4bdd-9e6a-aa9d9663f3d3.png)

これをうまく利用すれば、出勤簿の祝日を赤色に塗るということができます。
# 出勤簿を作る
WEBSERVICE関数を利用して出勤簿を作ってみました。

![スクリーンショット 2025-02-14 13.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/a2b8e09a-0dd7-467a-9855-0a52c33f7f3c.png)

国民の祝日は確実にお休みです。
また、土日も確実にお休みです。
この辺をうまく検出し、勤務しない日の行を赤色で塗ります。
自動でできて便利ですね。

# Windows版Excelのみで動作する
この動作を検証しているのは、ARM版Windows上で動作させたExcelです。
この環境では動作しています。

Mac版のExcel、およびWEBブラウザで動作させるExcelでは`WEBSERVICE関数`は使えませんでした。

# 参考になるサイト
[ExcelAPI〜Excelにインターネットからデータを取り込むサイト](https://excelapi.org/blog/datetime_holiday_name/)

# 後日談...
ExcelAPIのサイトを読み込んでいたら、Googleスプレッドシートでも使えることがわかりました。
![スクリーンショット 2025-02-14 21.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/654d5026-0ecb-469f-b4b8-d302662e7084.png)

```
=IMPORTXML("https://api.excelapi.org/datetime/holiday?date="&セル, ".")
```
というように、`IMPORTXML`という関数を使えば国民の祝日を取得できます。
とても便利な機能で、こういう情報を提供してくれていることはとてもありがたいですね。
[zsh]端末ウィンドウが一つしか開かないときのための、ファイルの移動機能のおまけ

zshで、端末ウィンドウが一つしか開かないときのために、ファイルをget/putするほんの些細な機能を作りました。

##### ファイルのget

```
function get() {
    export CLIPFILE="`pwd`/$1"
}
```

これを、~/.zshrcに書いておいてください。

##### ファイルのput

```
alias put="mv \$CLIPFILE . && unset CLIPFILE"
```

これを、~/.zshrcに書いておいてください。

##### 実行例

```
$ source ~/.zshrc
$ ls
file1  testdir/
$ get file1
$ ls
file1  testdir/
$ cd testdir
$ ls
$ put     
$ ls
file1
$ 
```
Vueのリアクティブ

Vue 3ではVue 2と異なり、Composition API の使用が推奨されている。

# Ref

Options API よりも、リアクティブな値を扱いたい場合に、ref を使用する。ref でネストされたオブジェクトもリアクティブになる。

記述例：

```Vue
<script lang="ts" setup>
import { ref } from "vue";

const setRef = ref(0);

</script>
```

# Reactive
ただし、String や Number といった基本型を宣言できる一方で、Object や Array を宣言することも可能だが、監視できるのは宣言された変数自身のみである。

Reactive
Object や Array のようなオブジェクト型の中身も監視したい場合は、reactive を使用する。

```vue
<script lang="ts" setup>
import { reactive } from 'vue'

const state = reactive({ count: 0 })
</script>
```
SORACOM SIMの料金、通信量はバンドル内なのに料金が増えていて焦った話

## わからない
ある日、SORACOM SIM Plan-DU（DU-10）を使っていて、通信量は上り下りともにバンドルの範囲内（10GB）であるはずなのに、基本料金1,200円(税抜)を上回っていて焦りました。


![スクリーンショット 2024-12-25 14.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/6b1cc584-43d2-44cd-1406-1a8f4fec5df6.png)

>料金
SORACOM Plan-DU-10GB（10GBバンドル1回線あたり上り10GB/下り1GBのデータ通信量）
税抜き1,200円
バンドル超過時は、上り10GB/下り1GB単位で 1,100円が加算

https://soracom.jp/services/air/cellular/pricing/price_specific_area_sim/#plan-du



ドキュメント[「利用料金ダッシュボードを確認する」](https://users.soracom.io/ja-jp/guides/accounting/check-usage/billing-dashboard/)
などを見てもわかりませんでした。

https://users.soracom.io/ja-jp/guides/accounting/check-usage/billing-dashboard/

## わかった

利用料金と支払い履歴→CSVを落としてわかりました。

![スクリーンショット 2025-02-14 13.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/b6d7587c-9b78-4140-8868-38d298b7c68b.png)

該当のISMIでフィルタリングして見てみると、どうやらそのSIMに関わる料金が全て載っているようです。

bundleChargeForPlanDU-DU-10GB 1200
soracomNapterCharge 300
soracomBeamRequestCharge-inMqtt 0.0009 x n
soracomBeamRequestCharge-outMqtt 0.0009 x n

これを見ると、Plan-DUの1200円の基本料金以外にNapterやBeamの利用料金がかかっていることがわかります。

理解。
Laravel Faker OpenAI でリアルなフェイクデータを生成する

⚠️: 海外の記事をchatGPTで要約しただけのもの、主に自分用

---


## はじめに

Laravel Faker OpenAIは、JP Caparasさんが開発したパッケージで、FakerPHPとOpenAIの強力なAI機能を組み合わせ、実際のシナリオに近いフェイクデータを生成できるツールです。これにより、Laravelアプリケーションの開発やテストの際に、よりリアルで文脈に沿ったデータを簡単に作成できます。

## インストール方法

まずはComposerでパッケージをインストールしましょう。

```bash
composer require jpcaparas/laravel-faker-openai
```

## 設定方法

次に、設定ファイルを作成します。以下のコマンドを実行すると、`config/openai.php`が自動生成されます。

```bash
php artisan openai:install
```

### APIキーの設定

OpenAIのAPIキーを取得し、`.env`ファイルに以下のように記述してください。なお、デフォルトでは`gpt-3.5-turbo`モデルが利用されます。

```env
OPENAI_API_KEY=your-api-key-here
```

## 使い方

設定が完了すれば、FakerのジェネレータークラスまたはLaravelの`fake()`ヘルパーを使って、`promptAI()`メソッドでフェイクデータを生成できます。

### Fakerジェネレーターを利用する場合

```php
$faker = app(\Faker\Generator::class);

// AIを使ってフェイクの名前を生成する
$name = $faker->promptAI('name');
// 例: "Jessica Smith"
```

### Laravelのfake()ヘルパーを利用する場合

```php
fake()->promptAI('English Premier League Team Name');
// 例: "Manchester United"

fake()->promptAI('Summary of soccer match');
// 例: "Manchester United defeated Liverpool 2-1 with goals from Marcus Rashford and Bruno Fernandes."
```

## フォールバック値の設定

万が一、AIからの生成がうまくいかない場合には、フォールバック値を設定することも可能です。

```php
$name = $faker->promptAI('name', 'John Doe');
```

## パッケージの仕組み

このパッケージは、FakerPHPの各メソッド呼び出しをキャッチし、その内容をOpenAIのGPTモデルに送信します。返ってきたAI生成のデータは、FakerPHPが期待する形式に整えられて返される仕組みです。

## まとめ

Laravel Faker OpenAIを使えば、より現実に近いフェイクデータを手軽に生成できます。開発やテストの場面で、実際のデータに近いシナリオを再現したいときに非常に役立つツールです。

ソースコードや詳細な情報は、[GitHubのリポジトリ](https://github.com)で確認できます。

---



## 元記事

https://laravel-news.com/laravel-faker-openai
OCI Logging Analyitcsによるログ分析の手順② -クラスタ分析 - 

今回は、LAの主要な分析方法であるクラスタ分析について説明します。まず、以下のスライドを見て頂きたいのですが、クラスタ分析は大量にあるログのレコードをグルーピング化して表示するという機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/53075dac-9ec5-4ed3-9e24-26534b4ec5bb.png)

特に、ログのフォーマットが定型でないようなLinuxのsyslogやデータベースのアラートログなどには効果を発揮し、大量のログレコードの傾向やその中に埋もれてしまうような僅かなレコードを見つけ出しやすくなります。クラスタ分析のタブには、潜在的な問題や外れ値、トレンドが用意されているのでこちらも便利です。

では、実際にサンプルログのデータを使って試してみます。

## クラスタ分析
[前回の手順](https://qiita.com/western24/items/49b044c733b69a33bae8#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)にてサンプルログを有効化し、時間を過去24時間に指定して、Linux Syslog Logsをクリックし、ビジュアライゼーションからクラスタを選択する。

全部で2396レコードあるSyslogが374にクラスタ化される。カウントの△をクリックで降順に変更し、レコードの多いクラスタを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a4205452-aea6-41ff-a846-729dbc80668b.png)


潜在的な問題は、errorやfailedなどのネガティブワードを抽出する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/49985d29-8053-4310-a828-9e76de06ddc1.png)

外れ値は1件しかないレコードを抽出する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/6ad125f7-538a-4566-8980-68a7f630dc31.png)

トレンドはログの出力推移を表し、類似したトレンドがある場合はクリックすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/3637618d-00ef-46e1-aaf1-a4be59cc966c.png)
以下のように、似たような出力傾向のあるログレコードが表示される。これは、問題の起点を調査する場合などに役立つことも多く、OS、MiddlewareやDB等の異なるログを合わせてクラスタ分析するなどの使い方もおすすめ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/4255226a-431c-4218-9ed5-017981a24559.png)

別のログのクラスタ分析を見る場合は、フィールドのLog Sourceのクリアをクリックし、再度Log SourceをクリックしてDatabase Alert Logsをクリックする。Alertログは、1920レコード -> 123クラスタとなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/89e9da0a-43c1-460b-a884-29388f017b06.png)

同様な手順でOCI VCN Flow Unified Schema Logsのログを選択してみる。VNC Flowログは、ログのフォーマットがほぼ固定なので、ログの件数が多くなっても最大で2クラスタにしかならない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/771ee932-1cea-42dd-83c7-7d4692375911.png)

## クラスタ比較
クラスタには、ベースラインとの比較するという機能がある。アクションの新規作成からLinux Syslog Logsを選択し、時間を過去8時間にする。クラスタ分析内にあるクラスタ比較をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/17de5590-7e07-475e-9762-3cedc0d44f65.png)

ベースラインが8時間になっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/054e5619-3a70-4081-8d59-69dcfa9c944f.png)

クラスタ比較のサマリーが表示される。これは前後8時間で共通のクラスタが15個あり、それらのクラスタを省いてそれぞれの時間帯にしかないクラスタをラジオボタンで切り替えて確認することができる。サンプルログが24時間分しかないので今回は8時間に指定したが、ベースラインのスケールは日、週、月など期間を長くして比較することも可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/73886474-34c7-49d9-8dfc-7bd34949d08c.png)

クラスタ分析は、ざっくりとログの全体像やトレンドが掴みやすく、ログを詳細に詰めて分析していく前段の段階で有効な手法です。LAは、1か月あたり数テラバイトのログを収集することも珍しくはないので、クラスタ分析は膨大なログを短時間・省労力で可視化するための機能として欠かせないものになっています。

[次回](https://qiita.com/Western24/items/f3a76315a20825e7cd04)は、LA機能でも理解しずらいリンク分析について紹介します。
【Oracle APEX】動的アクションのPL/SQLコードの送信・戻すアイテム設定方法

## はじめに
ご覧いただいた方は、Oracle APEXを用いて画面開発を行っており、開発に苦労されている方かと思います。

本記事では、動的アクションを用いてPL/SQLを記述したい方へ設定方法と意味について記述したいと思います。

※本記事は全て日本語表記で翻訳されている名称を用いています。

## 結論
+ PL/SQLにて実行する際に、画面上に設定したアイテムなどを使用する場合は「送信するアイテム」に設定。PL/SQL上で作成した値を画面上に設定したアイテムへ反映させたい場合は「戻すアイテム」に設定することが必要となります。

## 設定について
現在作成している動的アクションの状態を確認したいと思います。
作成したプログラムはシンプルで「P1_DATE」に入力した値を「YYYY/MM/DD」のようなフォーマットにした値を「P1_SDATE」に格納するプログラムとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/4678f2f2-dbf5-499c-af0b-d69022e57525.png)

ここで、PL/SQLにて使用したいアイテムを<font color="green">緑色の枠線</font>(送信するアイテム)に設定することで、プログラムコード上で設定しているアイテムに値を受け渡すことが可能となります。もし、設定していない場合は、値が何も受け渡しされずに処理が行われるため、注意が必要となります。

次にプログラムコード上で作成した、<font color="red">赤色の枠線</font>(戻すアイテム)に設定することで、プログラムコード上で作成した値を画面上に表示することが可能となります。

### 実際に設定したときの挙動について
「送信するアイテム」に設定していない場合は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/0d8b2e83-b6f8-43e3-8700-fb3b83fca83b.png)
上記のように、入力した「P1_DATE」の値を取得できず、「/」のみ表示される状態となってしまいました。

「戻すアイテム」に設定していない場合は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/d152b8d8-8d08-47ea-b461-b3a3d2ed0f40.png)
上記のように、実行しても戻すアイテムに値が何も入らない状態となります。

そのため、「送信するアイテム」と「戻すアイテム」には適切な値を設定するようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/fc528f58-9539-4e3d-8cac-220e5c106571.png)

## 応用手法について
これから記述する内容は、上記記述の応用技となります。
先ほどご説明した「送信するアイテム」や「戻すアイテム」は複数のアイテム指定することが可能となります。
ただし、複数のアイテムを指定する場合は注意が必要となります。

戻すアイテムに複数のアイテムを指定した場合、OracleAPEXは左から順番にアイテムへ値を投入するため、設定したアイテムを用いて別の動的アクションを起動する場合には保管したいアイテムの後に動的アクションを起動するためのアイテムを指定する必要があります。

サンプルとして以下のプログラムを用意しました。
<---------------------------------------------------------------------------------------->
【サンプルプログラムの説明】
内容としては、入力した日付(P1_DATE)が基準日(P1_KDATE)から数えて前後何日離れているかを算出するプログラムとなります。
P1_FLGが変更された際に、②のプログラムが実行されます。
<---------------------------------------------------------------------------------------->
<font color="green">緑色の枠線</font>の順番に設定することで、P1_SDATEを保持した状態で②のプログラムが実行されるため、取得したい値（差分日数）を取得することが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/02843ae5-e4ab-4b92-baee-121ad3b28dcc.png)

それでは、<font color="green">緑色の枠線</font>の順序を逆に設定した場合どうなるのでしょうか。
結果として、実行後の<font color="red">赤色の枠線</font>のように値が計算できずに、数字が何も入っていない状態となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/ad755b87-5e9c-4a13-8aba-e6d07d907295.png)

上記のように「戻すアイテム」に関して、複数のアイテムを設定する場合は、注意が必要となりますので、開発を行う際には、しっかり確認を行ってください。

## おわりに
本記事では、OracleAPEXを用いて画面開発を行う際の動的アクション設定方法について記述させていただきました。
本記事が、どなたかの役に立てたのであれば幸いです。
本記事をご覧頂き、ありがとうございました。
【Oracle APEX】選択肢付きアイテム(LOV)の作成方法

## はじめに
ご覧いただいた方は、Oracle APEXを用いて画面開発を行っており、開発に苦労されている方かと思います。

本記事では、選択肢のあるアイテム(LOV)の作り方について記述したいと思います。
※本記事は全て日本語表記で翻訳されている名称を用いています。

## 結論
+ OracleAPEX上に用意されているLOV専用アイテムを使用することで実装可能となります。
今回は2つの手法を記述させていただきます。

## 選択肢付きアイテム(LOV)の作り方について
前述した通り、2つの手法について記述致します。
1．DBに格納されたマスタデータから選択肢を作り出す方法
2．好きな値を選択肢として作り出す方法
※１．の手法は同一アプリケーション上で流用出来るものとなります。

## DBに格納されたマスタデータから選択肢を作り出す方法
まずは、選択肢を取得する設定を行いたいと思います。
1-1．画面右上の「共有コンポーネント」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/18835b99-f654-46d0-aa3a-e19691ba355c.png)

1-2．「LOV」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/2d702b71-91d1-40a5-8ded-37359157f61d.png)

1-3．「作成」-「次へ」と進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/7d82bdd2-5177-4db4-9a2e-9a0077332642.png)

1-4.「名前」と「タイプ」を設定します。ここでは、「Dynamic」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/f1f6a6ea-4862-40b2-bce3-4db8b10a8c80.png)

1-5.参照するテーブルを指定します。(今回はSQL文を使用して選択肢を取得する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/35a9acc7-c848-43b5-b98f-e5bc1b127849.png)

1-6.「戻り列」と「表示列」を指定します。
戻り列：選択肢から選んだ内容が内部で振られている値
表示列：選択肢として画面上で表示される値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/0767695b-f0d2-49d5-b029-c424db5ebe3b.png)

以上で、選択肢取得(LOV)の設定は完了となります。

最後は、画面上に表示するアイテムへ作成した選択肢(LOV)を設定して完了となります。
「タイプ」と「LOV」に以下の図のような値を設定します。
「LOV」には1-6までに作成したものを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/ddfcfe0c-8228-41d0-beaf-a599fdef7019.png)

### 設定後の画面
実際の画面で確認してみましょう。
先ほど選択肢を取得するためのSQL文の結果が表示される形となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/2aca733a-4045-4593-8eb0-746a4962251d.png)

## 好きな値を選択肢として作り出す方法
このやり方にはさらに2種類の手法があります。
2-1．LOV上で選択肢を手動で設定する方法
2-2．アイテムに直接選択肢を手動で設定する方法

### LOV上で選択肢を手動で設定する方法
1-3．までは同一の手順となります。

2-1-1．「名前」と「タイプ」を設定します。ここでは、「Static」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/6498de42-4c3c-4983-bedb-e0c559cea68e.png)

2-1-2．「戻り値」と「表示値」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/095244b1-fda5-4a66-b394-be434c651ed0.png)

2-1-3．画面上に表示するアイテムへ作成した選択肢(LOV)を設定して完了となります。
「タイプ」と「LOV」に以下の図のような値を設定します。
「LOV」には2-1-2までに作成したものを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/de94d4bf-4bae-40e3-ae59-52536f04f34b.png)

### アイテムに直接選択肢を手動で設定する方法
※設定したアイテムにしか使用できない為、様々なアイテムで使用したい場合は、2-1.の手法をおススメします。
2-2-1．特定アイテムの「LOV」-「タイプ」を「静的値」に設定して、「表示値」と「戻り値」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/8f50ec0d-8608-457e-bc3f-9f928f43656b.png)

### 設定後の画面
実際の画面で確認してみましょう。
先ほど手動で作成した選択肢が表示される形となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/77825f5c-1a24-423c-a9b3-f43e71c594d0.png)

## おわりに
本記事では、OracleAPEXで選択肢付きのアイテム(LOV)の作成方法について記述させていただきました。
本記事が、どなたかの役に立てたのであれば幸いです。
本記事をご覧頂き、ありがとうございました。
【Oracle APEX】アイテムレイアウトのあれこれ

## はじめに
ご覧いただいた方は、Oracle APEXを用いて画面開発を行っており、開発に苦労されている方かと思います。

本記事では、設定によって作成したアイテムを様々なレイアウトで表示する方法について記述したいと思います。

※本記事は全て日本語表記で翻訳されている名称を用いています。

## 目次
１．ラジオボタンの並び方
２．アイテムのラベル表示場所
３．テキスト・フィールドアイテムの入力制限

## ラジオボタンの並び方について
ラジオボタンのアイテムを設定すると以下のような表示の仕方が存在します。
例１）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/3280e38e-eb29-49ee-81e9-117a5a15dac8.png)

基本的に設定する箇所は<font color="red">赤色の枠線</font>の「列の数」にて決定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/b57862bc-80dd-40cd-9019-3d939ba3b013.png)

・「列の数」を「１」とした場合、例１）ラジオボタン１のように表示されます。

・「列の数」をラジオボタンの数と同数とした場合、例１）ラジオボタン２のように表示されます。

・特定の数で折り返して改行した状態で表示したい場合は、「列の数」を折り返したい数で設定となり、例１）ラジオボタン３のように表示されます。

## アイテムのラベル表示場所について
一部抜粋となりますが、アイテムに付与出来るラベルの位置を調整することが可能となります。
例２）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/7b6981d7-6ef5-4e00-98d2-4e01932af075.png)

・「テキストの中」に、ラベルを設定したい場合は、「外観」-「テンプレート」を「Optional - Floating」と設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/1d7e8531-7625-41cb-a9b3-d546a3cf5636.png)

・「テキストの上」に、ラベルを設定したい場合は、「外観」-「テンプレート」を「Optional - Above」と設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/01088a5c-2f69-45c4-9eed-d43353f5abf4.png)

・「テキストの横」に、ラベルを設定したい場合は、「外観」-「テンプレート」を「Optional」と設定してください。
※なお、「Optional」とした場合は、<font color="green">緑色の枠線</font>で記載されている「ラベル列スパン」を「1」以上に設定する必要があるため、注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/ab30af37-670a-4d15-af57-45d6c3bb6e37.png)

## テキスト・フィールドアイテムの入力制限について
「テキスト・フィールド」のアイテムとは、画面上で入力を行い、その値を使用して内部処理を実行することが出来るアイテムとなります。

また、OracleAPEXには「表示のみ」(読み取り専用)のアイテムも存在しているのに、なぜ「テキスト・フィールド」の入力を制限する設定を記述することに疑問を持たれる方もいらっしゃると思います。

私が開発を経験した中で、「表示のみ」アイテムに値を挿入する処理が存在しておりました。もし該当処理を実行しようとすると該当のアイテムへの加工を行う場合、APEXの画面上に値が登録されていても内部的なデータとして保管がされない為、エラーを引き起こす可能性があります。

それでは、実際の設定方法について記述したいと思います。

・読み取り専用としたいアイテムを作成後、「動的アクション」を1つ用意します。
　作成した動的アクションに「JavaScriptコードの実行」を指定した上で、「設定」-「コード」に以下のプログラムを記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/6bd2e94c-694b-4749-9bf3-0066c28f1291.png)

```ruby:記述例
$('#アイテム名').prop('readonly', true);
```

上記設定を行うことで、画面が起動したタイミングに設定したアイテムが入力制限がかかる状態となります。

## おわりに
本記事では、OracleAPEXの作成したアイテムを様々なレイアウトで表示する方法について記述させていただきました。
本記事が、どなたかの役に立てたのであれば幸いです。
本記事をご覧頂き、ありがとうございました。
【Oracle APEX】モーダル・ダイアログの右上「×」の消し方

## はじめに
ご覧いただいた方は、Oracle APEXを用いて画面開発を行っており、開発に苦労されている方かと思います。

本記事では、以下の図のようにモーダル・ダイアログを用いた開発時に右上の「×」ボタンが邪魔と感じた方がいらっしゃるかと考え、対応方法について記述したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/7e3acd0e-6f35-476e-b38a-d2ef602c4513.png)

※本記事は全て日本語表記で翻訳されている名称を用いています。

## 結論
+ OracleAPEX上にてCSSの設定を行うことで、該当の「×」ボタンを消すことが可能となります。

## モーダル・ダイアログについて
そもそもモーダル・ダイアログとは、現在表示されている画面（親ページ）の上に、重ねて小さなウィンドウのような画面（ダイアログ）を表示する機能となります。
入力フォームや確認画面、詳細情報表示などでよく使われるものになりますので、もし機会があれば作成してみてください。

作成方法は、以下のようにページに対してページ・モードを「モーダル・ダイアログ」にしていただくだけとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/47cb6ac9-5d1c-4428-9802-1a0770c9d5d1.png)

## 右上「×」ボタンの消し方について
親ページと子ページ(モーダル・ダイアログ)それぞれに個別の設定を行う必要がございます。

### 親ページでの対応
親ページの上部のページ名称を選択(<font color="red">赤色の枠線</font>)した状態で「CSS」-「インライン」(<font color="green">緑色の枠線</font>)を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/128f669c-d497-4cda-98ae-d27734e95938.png)

「インライン」の中に、以下の内容を記述してください。
```ruby:記述例
.任意の名称 .ui-dialog-titlebar-close {
    display: none;
}
```
上記まで対応したら親ページは終了です。

### 子ページでの対応
先ほど親ページで作成したCSSにて「任意の名称」とした内容を子ページの上部のページ名称を選択(<font color="red">赤色の枠線</font>)した状態で「ダイアログ」-「CSSクラス」(<font color="green">緑色の枠線</font>)の中に記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/77b518ed-87c4-4529-8acc-452be1b78078.png)

上記まで対応したら子ページは終了です。

### 設定後の画面
それでは、設定した内容で実際に起動してみると以下のように「×」ボタンが表示されない状態となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538663/d69e8322-3b33-41ca-b35a-69f4fe15736f.png)

なお、画面のように「終了」ボタンやモーダル・ダイアログを閉じる処理を仕込んでおく必要があるため、注意して開発を進めてください。

## おわりに
本記事では、OracleAPEXのモーダル・ダイアログの気になる右上の「×」ボタンの消し方について記述させていただきました。
本記事が、どなたかの役に立てたのであれば幸いです。
本記事をご覧頂き、ありがとうございました。
DevContainer@VSCode×Go(Gin)×Air×Delveでデバッグ環境構築

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/55720b8e-7d40-4927-8d4a-9d2e8aa2bfdc.png" alt="go" width="90">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/ad76724b-2c55-d1aa-de03-ac1b813dc99e.png" alt="vscode" width="80">

コンテナ開発環境(DevContainers@VSCode) × ホットリロード(air) × ステップインデバッグ(delve)の環境構築メモ

DevContainersならコンテナ内のローカルホストのデバッガポートに直接アタッチ出来るのでシンプルに構成可能できる。

アーキ概要

![image 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/cb81f420-e945-47f3-a944-e5ef76bd394c.png)

## コンテナ

golang:1.22.11-alpine3.21

## delve デバッガ

インストール

```sh:sh
go install github.com/go-delve/delve/cmd/dlv@latest
```

コマンドパレットの`Go Install/Update Tools`からインストールでもOK
※VSCodeServer@コンテナにGoエクステンションが入っていること

![](image.png)

## Air ホットリロード

バイナリインストールと環境初期化

```sh:sh
go install github.com/air-verse/air@latest \
&& cd path/to/app_root
&& air init #=> ./.air.tomlが生成される
```

.air.tomlコンフィグをデバッグ向けに編集

```toml:.air.toml
[build]
  # ビルド設定
  cmd = "go build -gcflags=\"all=-N -l\" -o ./tmp/main ."
  # 起動設定
  # --logオプションで標準出力に詳細ログを出力
  full_bin = "dlv --headless=true --listen=:2345 --api-version=2 --accept-multiclient exec --continue ./tmp/main"

# その他はデフォルト
```
ノーマルビルドと比較してデバッグビルドは時間はかかるようになった


> `-gcflags="all=-N -l"`

デバッガ（delve など）を使う場合、Go の最適化が入っていると変数の値が見えなくなったり、
関数がインライン化されてブレークポイントが期待通り動かなくなることがあるので、Go コンパイラの最適化を無効化するためのオプションを指定する

**オプションについて**

- `-N`: 最適化を無効化してデバッグしやすくする
- `-l`: インライン展開を無効化して関数のインライン化を防ぐ


> `full_bin = "dlv --headless=true --listen=:40000 --api-version=2 --accept-multiclient exec --continue ./tmp/main"`

`dlv exec`でビルドバイナリ`./tmp/main`をデバッグ実行する

**オプションについて**

- —headless=true により、CLI（ターミナル）ではなく、エディタや別のデバッガから接続できる
- --listen=:2345により、ポート2345にデバッガを待機
- --accept-multiclient により、複数のクライアント（VSCode, GoLand など）から同時に接続できる
- --continue により、Delve 起動時に自動的にプログラムを実行（手動で continue を打たなくて済む）

## VSCode 

デバッグ構成はアタッチ式で

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach Server",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "port": 2345,
            "host": "localhost",
            "showLog": true
        }
    ]
}
```


## デバッグ

1. アプリケーションディレクトリでairを実行する

```sh:sh
cd path/to/app_root && air
```

2. VSCodeの`実行とデバッグ` > `Attach Server`でアタッチ開始
3. ブレークポイントを設定してhttpリクエストを入れたらブレークする
esp-idf の使い方　（create-project)

こちらでは、サンプルのプロジェクトをコピーしましたが、新規のプロジェクトを作成する方法です。
[esp-idf の使い方](https://qiita.com/ekzemplaro/items/b12d4d3bc0b770cf8986)

## プロジェクトの作成

```bash
idf.py create-project hello01
```

作成されたフォルダー構造

```text
$ tree hello01
hello01
├── CMakeLists.txt
└── main
    ├── CMakeLists.txt
    └── hello01.c
```

## プログラムの修正

```c:main/hello01.c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main(void)
{
	int count = 0;
    printf("Hello world!\n");
    printf("Good Morning!\n");
    printf("Good Afternoon!\n");
    printf("こんにちは\n");

while (1) {
    printf("Hello world! %d\n" , count);
	vTaskDelay(2000 / portTICK_PERIOD_MS);
	count ++;
	}
}
```

## Build

```bash
idf.py set-target esp32
idf.py build
idf.py -p /dev/ttyUSB0 flash
```

## 実行結果

```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.
Hello world! 190
Hello world! 191
Hello world! 192
Hello world! 193
```
【UiPath】特定のパッケージを依存関係に持つローカルプロジェクト検索方法メモ

# はじめに

- 本記事は、特定のパッケージを依存関係に持つローカルプロジェクト検索する内容です。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 24.10 バージョンのもので構成しています。

# 古い共通部品を使ってるプロジェクトを確認したいときありませんか？

![影響調査.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7436246c-fe3d-4327-99cd-8f73a1549edf.jpeg)

https://docs.uipath.com/ja/automation-ops/automation-cloud/latest/user-guide/tools

2025年1月31日現在プレビュー版ですが、***Automation Cloud の管理者権限をお持ちの方***であれば Automation Ops ＞ 「フィードを管理」 ＞ 「ツール」から、任意テナント・フォルダ内に対して特定パッケージを含むプロジェクトの検索機能が実装されています。

::: note warn
一般向けにリリースされる際に対応があるかはわかりませんが、***「フィードを管理」は Automaion Ops のアクセス権の管理画面で「AutomaionOps Administrator」を付与してもアクセスできません。
「フィードを管理」は Automaion Cloud の管理者（組織管理者）のみアクセス可能です。***

![影響調査2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a0768476-bf71-4a64-a4da-312a98d69bd2.jpeg)
:::

# てっとり早く、ローカルで検索するならPowerShellスクリプト

運用に依るので、次のケースであれば役に立つとおもいます↓↓
- シンプルに自分の開発フォルダ（ドキュメント\UiPath）以下を検索したい
- 部署に貸与されてるUR実行端末に自部署のパッケージはほとんどインストールされている

次のPowerShellスクリプトの中央の検索パッケージ（★印）のパッケージ名とバージョンNoの部分を編集して実行してみてください。（以下は systemアクティビティのv22.10.X を検索する例）
結果はダウンロードフォルダ以下に出力されます。

```
# 検索するフォルダのパスを指定
# 　特定のアカウントにインストールされたパッケージを検索：
# 　　$folderPath = "C:\Users\{アカウント}\.nuget\packages"
# 　開発フォルダ内のパッケージを検索
# 　　$folderPath = "C:\Users\{アカウント}\Documents\UiPath"
# 自身のアカウントにインストールされたパッケージを検索：
$folderPath = "$env:USERPROFILE\.nuget\packages"

# ★検索パッケージ
$searchString = '"UiPath.System.Activities": "\[(22\.10\.\d+)\]"'

# 指定したフォルダ以下のproject.jsonファイルを検索
Get-ChildItem -Path $folderPath -Recurse -Filter "project.json" | ForEach-Object {
# ファイルの内容を読み込み、指定した文字列が含まれているか確認
if (Select-String -Path $_.FullName -Pattern $searchString -SimpleMatch:$false) {
# 含まれている場合、ファイルパスを出力
Write-Output $_.FullName
}
} | Out-File -FilePath "$env:USERPROFILE\Downloads\output.txt"
```
（出力例）
![影響調査3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0678e055-3315-44eb-85b6-09e465e18aad.jpeg)

# OCにあがってるもの全部を対象にちゃんとやりたい

Ouyang さんの記事が参考になるのでご参照ください↓↓

https://qiita.com/Ouyang/items/51deb38d07ef190d2083

https://qiita.com/Ouyang/items/37ea16d87a305cd88b11

https://qiita.com/Ouyang/items/e8c346dfeac1268ed8b6

# さいごに
いかがでしたでしょうか。
「フィード管理」のツール機能が充実したら、上に書いた様なローテクは不要になるので機能改善に期待します( ﾟДﾟ)　じっそうして　はやく　たのんます
最後までお読みいただきありがとうございます(・ω・)ノ
"月月火水木金金"から休日を探し出す(Ruby正規表現リテラル)

:::note warn
Rubyをメインに勉強中の初学者です。
自分用のアウトプットメモです。Qiitaの書き方も知りません(；ω；)
間違ってる箇所が多数あるかもしれませんg何卒ご了承ください。
:::

---
正規表現と一緒に使えるメソッド、scanとかmatchとか色々あるけど、

私が今まであまり知らなかったやつ。メモしていくよ。

:::note warn

いくら探しても"月月火水木金金"に土日は存在しませんでした(；ω；)
:::

前提
---

まず前提っ♪

正規表現オブジェクトは`//`で囲まれてるよ。Regexpクラスのインスタンス。

```ruby
/bb/.class #=> Regexp
```

生成方法は

```ruby
# 単純に書くなら//で囲む
/bb/
# %記法で書くなら%rが正規表現オブジェクトにあたるよ。
%r(bb)
# あとはRegexpクラスのインスタンスやから、クラスメソッド経由でも作れるよ。
Regexp.new "bb"
```

とかいろいろ。








土曜日曜どこなん
---

A子さん、超ブラック企業に入っちゃいました。
オフィスの壁に「月月火水木金金」の文字。
ここは大日◯帝国か？私の知らない曜日が並んでる。

え、土と日の文字が無いんやけど気のせい？？

目の前の現実を受け入れられないA子さん。正規表現で確認してみることにしたよ(？？？)

正規表現オブジェクトにおける===演算子
---

現実を知る前に、まずせめて華金があるのか知りたいA子さん。

正規表現オブジェクトに対して`===` を使用すると正規表現が文字列にマッチするかtrueかfalseでわかるよ。===はどのクラスに対して使うかで意味が変わってくるんですな。

```ruby
# 正規表現(Regexp)における===は「マッチするかどうか」
/金/ === "月月火水木金金"
# => true

# 逆に文字列(String)に対して===を使用するとfalseになる。
# これは===が「値が完全一致してるか」を確認する演算子になるからですね。
"月月火水木金金" === /金/
# => false
```

よかった。金曜はあるみたい。

週の終わりにも始まりにも日曜がないねんけど幻覚？確認してみるよ。

```ruby
# $は末端を表す正規表現。^は先頭を表す正規表現
# つまり週の始めか終わりに日の文字があればtrueや！！
/^日|日$/ === "月月火水木金金"
# => false
```

え無いねんけど。土曜か日曜の文字が一つでもあればええんやけど

```ruby
# []は指定されたいずれか一文字を表すよ。[土日]なら土か日の文字が一つでも存在すればtrueやね。
/[土日]/ === "月月火水木金金"
# => false
```

一つもないねんけど。

マッチする文字列を抜き出す。
---

現実を受け入れ始めたA子さん。

土曜と日曜がないのはわかったけど、もう涙で目の前の曜日が見えない。

正規表現で実態を確認してみましょう(??)

`=~` メソッド
---

まず抜き出すよ〜っていう準備として`=~`っていうクラスメソッド。

これ使うとマッチした時に文字列のどの位置からマッチしてるのかのインデックスが返ってくる。

「火」は月月火(012)、2の位置から始まってるから2と返ってくる感じ。

```ruby
/火/ =~ "月月火水木金金"
#=> 2
```

位置が知りたいんやなくて、マッチした文字を抜き出したいんや〜って言う場合。

`=~` を使用したときに`$&`っていう組み込み変数に格納されるらしい。

```ruby
/火/ =~ "月月火水木金金"

# =~と同一スコープ内で$&を確認すると？
p $& 
#=> "火" 
```

ちなみにマッチした部分より前の文字列は`` $` `` に後ろの文字列は`$'` に格納されるらしい。

```ruby
/火/ =~ "月月火水木金金"
p $&. #=> "火"
p $` #=> "月月"
p $' #=> "水木金金"
```

火曜の前に「月月」？？
何を言ってるんですか？
もう頭がパンクしてしまったA子さん。


締め！！
---
と、
そんなことはもうどうでもいいですね。それより`` $` ``と`$'` 。前者がバッククォートで後者がシングルクォート。老眼でなくても違いがわからないですね。そもそもこれほとんど使う機会ないのでは？

シングルクォートとバッククォート。私もこれまで散々悩まされてきました。

この２つについて、ただひたすら怒りをぶちまけた2000字ほどの記事を昔Noteに書いたのを思い出しました。ご興味あればぜひ(*´꒳`*)

[「シングルクォーと」変換にイライラしない方法をひたすら考える。｜まなぶいぬかぶ](https://note.com/inukabu_sub/n/n98bb4b0a04c8)
★compactの使い方


#### 参考記事

https://qiita.com/yastinbieber/items/0c7b23ac382ac8afdb0e

https://www.php.net/manual/ja/function.compact.php

***

compact関数はPHPの関数。（Laravel独自関数ではない）
Laravelでcompact()を使う場合、ControllerからViewに値を渡す際に使われ、表記を短縮できる。
**変数名と配列キーは同じ表記になる**ため、タイプミスを減らせるというメリットもある。

### A.compact()なし
```PHP:①
return view('list', ['products'->$products, 'companies'=>$companies])
```
```PHP:②
$user = [ 'name' => 'example',
          'email' => 'example@email.com',
          'address' => 'ExamplePrefecture'
        ];
```

### B.compact()あり
```PHP:①
return view('list', compact('products','companies'));
```
```PHP:②
$name => 'example',
$email => 'example@email.com',
$address => 'ExamplePrefecture'

$user = compact('name','email','address');
```

***

終わり👋
広い範囲を /* */ でコメントアウトする時にコメントアウトのオンオフを簡単にする方法

タグは C++ に指定しているが、他のだいたいのプログラム言語で使用できる。
# 結論：コメントアウトをコメントアウトすればよい
### 例
・コメントアウトする時
``` cpp:main.cpp
void Kansu() {
    /*

    printf("コメントアウトしたい処理");
    
    //*/
}
```
・コメントアウトを外す時
``` cpp:main.cpp
void Kansu() {
    //*

    printf("コメントアウトしたい処理");
    
    //*/
}
```

# 解説

### 大抵のプログラム言語には2つのコメントアウト方法がある

- ``` /* ``` と ``` */ ``` で囲む方法
　これは行を跨いでコメントアウトできる。

- ``` // ``` を文頭に置く方法
　これはその一行の指定位置以降をコメントアウトできる。

### なら ``` /* ``` と ``` */ ``` を ``` // ``` でコメントアウトすれば範囲のコメントアウトを取り消しできるやん
という発想。

``` */ ``` に使用している ``` // ``` は、範囲のコメントアウトの内側にあるので、
範囲のコメントアウトを有効化した際一緒にコメントアウトされるのでそのままで良い。
``` /* ``` の手前に ``` / ``` を付け外しするだけ。

2種類のコメントアウト用の ``` / ``` を共有しているところがオシャレポイント

# ショートカットキーでいいのでは？
ショートカットを使い慣れているならそれも良いが、この方法の利点は
``` / ``` を1つ足せばいいだけという所にある。

ショートカットの「範囲を選択」「コメントアウト」という2動作に対して、
さらに手間が省ける。

特定の範囲のコメントアウトの切り替えを何度も行うのであればこちらの方法の方が便利だと思う。

ショートカットの利点を挙げるとすれば、
「範囲」の部分を能動的に変えられる事だろう。

そこらへんは上手く使い分けてほしい。


以上。
JavaScriptで任意のカスタムオブジェクトを作る方法

## 概要
カスタムオブジェクトは「Object.create(null);」と、プロパティ追加で作成していきます。
## 定義
```js
function empObj(){
    return Object.create(null);
}
```
## 使用例
```js
const o = empObj();
o.aaa = 1;
o.bbb = 2;
console.log("o.aaa + o.bbb = " + (o.aaa + o.bbb));
```

## 表示結果
```text
o.aaa + o.bbb = 3
```
OWASAP ZAPのインストール時のエラー解決方法

現在学習中の本「体系的に学ぶ 安全なwebアプリケーションの作り方」にて、OWASP ZAPのインストールがうまくいかなかったので備忘録用にメモ
(環境はwindows11)

https://amzn.to/3EMZwKy


OWAZP ZAPのインストール中に、すでに64bitのjavaをインストールしているにも関わらず
「install4jウィザードは、システム上にjava(TM)ランタイム環境を見つけることができませんでした。適切な64-bitのJREを検索してください。(最小バージョン: 11)」とエラーダイアログが表示される。

ならばと思い、「配置する」ボタンからjava.exeを選択すると
「No JVM could be found on your system, Please define EX4j_JAVA_HOME to point to an installed 64-bit JDK or JRE or download a JRE from https://adoptium.net. Log (C:\パス~)」
というエラーダイアログが表示される。

とりあえず指示されたURLに飛び、ページの指示に従ってインストール

https://adoptium.net/


→再びOWASP ZAPのインストーラを起動すると、問題なくインストールが進むようになっている。
Geminiで特定の分野学習する際の内容を考えてもらうプロンプトテンプレートを作ってもらった

こんにちは、普段マルチクラウドを利用しながら
インフラエンジニアをしているServer Campのキタです。

今まで生成AIを活用する際にプロンプトで命令内容を細かく記載していたのですが、
**ぶっちゃけ面倒だな**と思っていませんでしたか？

私は思っていました。

そこでふと、「面倒なことを生成AIにお願いしているのにそのために面倒なことをしているのは負のループや…」と思い題名の通りですが、今回はAIを活用して特定の分野で学習をする際のプロンプトをgeminiに直接教えて貰おうと思います。

命令内容はこんな感じ。
```
gemini を活用して特定の分野学習する内容を考えてくれるプロンプトのテンプレートを教えてください。
細かい内容まで設定できるようにしてください。
```

## 結果
結果として以下のような内容を出力してもらいました。
```:主力されたテンプレート
## Gemini を活用した [分野名] 学習プラン

### 学習目標

*   [具体的な学習目標を記述]
    *   例: [分野名] の基礎知識を網羅的に理解する
    *   例: [分野名] の応用技術を習得し、実践的なスキルを身につける
    *   例: [分野名] に関する最新の研究動向を把握する

### 学習内容

1.  **基礎知識の整理**
    *   [分野名] の基本的な概念、用語、歴史的背景などを解説してください。
    *   [参考文献や参考資料があれば記述]
2.  **主要なテーマの深掘り**
    *   [テーマ1]: [テーマ1 の詳細な説明]
        *   [テーマ1 に関する具体的な質問や疑問点を記述]
    *   [テーマ2]: [テーマ2 の詳細な説明]
        *   [テーマ2 に関する具体的な質問や疑問点を記述]
    *   [テーマ3]: [テーマ3 の詳細な説明]
        *   [テーマ3 に関する具体的な質問や疑問点を記述]
    *   [必要に応じてテーマを追加]
3.  **応用技術の習得**
    *   [具体的な応用技術の例を記述]
        *   [応用技術の習得に必要な知識やスキルを解説してください]
        *   [応用技術に関する具体的な演習問題や課題を出してください]
4.  **最新動向の調査**
    *   [分野名] に関する最新の研究論文、ニュース記事、業界レポートなどをまとめてください。
    *   [最新動向に関する専門家の意見や見解を紹介してください]
5.  **[その他の学習内容]**
    *   [あなたの学習ニーズに合わせて自由に項目を追加]

### 学習方法

*   [学習方法を具体的に記述]
    *   例: Gemini との対話形式で学習を進める
    *   例: Gemini に関連書籍やWebサイトを紹介してもらい、自習する
    *   例: Gemini に演習問題や課題を作成してもらい、理解度を確認する

### 学習期間

*   [学習期間の目安を記述]
    *   例: 1週間
    *   例: 1ヶ月

### その他

*   [その他、Gemini に伝えたい事項があれば記述]
    *   例: [分野名] に関する資格試験の対策をしたい
    *   例: [分野名] に関するキャリアパスについて相談したい

```
はい、やばさがわかりましたでしょうか。

私は心の中でこう思いました。
**「むちゃくちゃええやん！！！」**

ちなみにプロンプト例まで出力してくれた。
優しいね。
```:プロンプト例
## Gemini を活用した AI 技術学習プラン

### 学習目標

*   AI 技術の基礎知識を網羅的に理解する
*   機械学習、深層学習の主要なアルゴリズムを習得し、簡単なプログラムを実装できるようになる
*   AI 技術の倫理的な問題点について考察する

### 学習内容

1.  **基礎知識の整理**
    *   AI 技術の定義、歴史、種類、応用分野などを解説してください。
    *   [参考文献: AI技術入門 (東京大学出版会)]
2.  **主要なテーマの深掘り**
    *   **機械学習**: 教師あり学習、教師なし学習、強化学習の違いについて、具体的な例を挙げて説明してください。
        *   教師あり学習の代表的なアルゴリズムである線形回帰とロジスティック回帰について、数式とPythonコードを用いて解説してください。
    *   **深層学習**: ニューラルネットワークの構造と学習方法について、分かりやすく説明してください。
        *   深層学習の代表的なモデルであるCNNとRNNについて、画像認識と自然言語処理への応用例を挙げながら解説してください。
    *   **AI倫理**: AIの偏見、差別、プライバシー侵害などの問題点について、具体的な事例を挙げて議論してください。
3.  **応用技術の習得**
    *   画像認識: CNNを用いた画像分類モデルをPythonで実装し、MNISTデータセットで学習・評価する。
    *   自然言語処理: RNNを用いた文章生成モデルをPythonで実装し、簡単な文章を生成する。
4.  **最新動向の調査**
    *   AI技術に関する最新の研究論文、ニュース記事、業界レポート (例: 「AI白書 2024」) などをまとめてください。
    *   AI技術の進化によって社会がどのように変化するかについて、専門家の意見を紹介してください。
5.  **[その他の学習内容]**
    *   AI技術に関する資格試験 (例: G検定) の対策をしたい

### 学習方法

*   Gemini との対話形式で学習を進める
*   Gemini に関連書籍やWebサイトを紹介してもらい、自習する
*   Gemini に演習問題や課題を作成してもらい、理解度を確認する

### 学習期間

*   3ヶ月

### その他

*   AI技術に関するキャリアパスについて相談したい
```

## まとめ
生成AIに命令するためのプロンプトを生成AIに教えて貰うということをしてみましたが
思った以上に高い精度で出力してくれましたね。

今回いい感じのテンプレを作ってもらったので次回以降の記事はこれを利用して
記事を書いていこうと思います。
【ChatGPT】の説明をわかりやすくしてくれるPromptのご紹介です。


　どうも、カーブミラーです。

　今回は、ChatGPTの説明をわかりやすくしてくれるPromptのご紹介です。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、ニュースです。

　o3-miniとDeepSeek-R1の
　　安全性に関する論文が
　　　提出されました。

　Rohan Paulさんが
　　ポストしてくれました。
　　　彼は、AI関連のライターさんです。

　こちらが、そのポストです。
　　[Rohan Paulさんポスト](https://x.com/rohanpaul_ai/status/1889380382212235412?t=nXoM6fNXHZ5UDTYfAKuf2w&s=19)

　もとの論文が、こちらです。
　　[論文“o3-mini vs DeepSeek-R1: Which One is Safer?”](https://arxiv.org/abs/2501.18438)

　詳細は省きます。
　　詳しくは、ポストと論文を
　　　ご確認ください。

　DeepSeek-R1は、
　　中国企業DeepSeek社が
　　　開発した生成AIてす。

　創造的思考、
　　コード生成、数学、
　　　プログラムの自動修復など、
　　　　多岐にわたるタスクで
　　　　　優れた性能を示し、
　　　　　　実行コストも低い
　　　　　　　とされています。

　この論文では
　　自動安全性テストツールASTRALを
　　　使用し、1,260のテスト入力を
　　　　生成・実行した結果を
　　　　　提出しています。

　このテストケースで
　　安全でない応答を示したのは、
　　　DeepSeek-R1は12%、
　　　o3-miniは1.2%
　　　　でした。

　また、
　　DeepSeek-R1は、
　　　危険な応答は
　　　　より明示的かつ詳細であり、
　　　　　より大きな害を引き起こす
　　　　　　可能性があります。

　　金融犯罪や暴力などの
　　　特定の安全カテゴリ、
　　　　および技術用語や
　　　　　ロールプレイなどの文体が、
　　　　　　DeepSeek-R1の
　　　　　　　危険な応答を
　　　　　　　　引き出しやすいことが
　　　　　　　　　わかりました。

　なぜ、このような結果に
　　なったのでしょうか。

　o3-miniの高い安全性は、
　　強力なポリシー違反検出機構
　　　によるものであり、
　　　　潜在的に危険な入力を
　　　　　処理する前の
　　　　　　重要な防御策と
　　　　　　　なっています。

　これは、OpenAIが、
　　このAI業界で
　　　トップ企業としての経験から
　　　　出来上がった仕組み。
　　　　　安全性の面では
　　　　　　トップランクでしょう。

　　“その分、つまらない”という方も
　　　おいでかと思います。

　　でも考えてみて。

　　毒や武器の製造法を尋ねて
　　　毒や武器を作り、
　　　　他者に危害を加える。

　　ユーザーを
　　　精神的に追い込んで
　　　　自殺を選ばせる。

　　こんなことが
　　　過去にあれば、
　　　　それを止めねば
　　　　　どうなることか。

　　これが自分のパソコンのみで
　　　動く生成AIならば、
　　　　問題は小さいかと思います。

　　でも一般に公開された
　　　生成AIでは、危険です。

　なお、
　　DeepSeek-R1が
　　　“完全に悪いもの”という
　　　　つもりはありません。

　　まだ出てきたばかりの
　　　生成AIです。

　　これからの対策を
　　　望んでいます。
***
　では、【本題】です。

　今回は、
　　ChatGPTの説明を
　　　わかりやすくしてくれる
　　　　Promptのご紹介です。

　このPromptは
　　すぐるさんが
　　　教えてくださいました。

　すぐるさんは
　　AIの研修・開発を行なう
　　　株式会社UravationのCEOです。

　今回のポストが、こちら。
　　[すぐるさんポスト](https://x.com/SuguruKun_ai/status/1889953475162939615?t=WXh4cvS6eNJa2TmANAu5dQ&s=19)　

　とても簡単なので
　　誰でも使えます。
```Text:対話物語形式での説明依頼Prompt
対話物語形式で説明して。
```

　次のようにしても
　　いいかもしれません。

　＊＊＊に説明して欲しいことを
　　入力して、送信してください。
```Text:対話物語形式での説明依頼Prompt（改）
“＊＊＊”について、対話物語形式で説明して。
```

　とても
　　シンプルなPromptですし、
　　　出力されるのも
　　　　ふたりの人物の対話形式なので
　　　　　読みやすく感じました。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Vue.js環境構築

# はじめに
使ってみたシリーズ「Vue.js」編になります

前回は同じくフロントで使われるフレームワークのReactを使ってみました
色々調べてみたり聞くところによるとReactは遅いがVueは軽くて早いという噂を耳にしました

なので動作が早いものはVue、機能が豊富なReactという認識になりつつあります(知らないことが多いので、本質的には違う部分もありそうですが)

とりあえず触ってみないと話がわからないということで、Vueの環境構築を行っていきたいと思います

# 環境構築
ローカルの環境はMacBook Air(M1, 2020)です

## 1. Node.jsをインストール
こちらについては[Reactの環境構築の記事内](https://qiita.com/ryo0819/items/c222c140d6553ddfaf03#react%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)でも行っていますので、そちらを確認していただければと思います

## 2. Vueプロジェクトの作成
基本的にはVueの公式ページを参考にすれば問題なく進められると思います
(https://ja.vuejs.org/guide/quick-start.html#creating-a-vue-application)

Vueのプロジェクトを作成したいディレクトリに移動して以下のコマンドを実行します

```sh
npm create vue@latest

# 以下のようなオプションの選択文が表示されると思います(オプションについて特にわからなければNoで良いとのこと)
✔ Project name: … <your-project-name>
✔ Add TypeScript? … No / Yes
✔ Add JSX Support? … No / Yes
✔ Add Vue Router for Single Page Application development? … No / Yes
✔ Add Pinia for state management? … No / Yes
✔ Add Vitest for Unit testing? … No / Yes
✔ Add an End-to-End Testing Solution? … No / Cypress / Nightwatch / Playwright
✔ Add ESLint for code quality? … No / Yes
✔ Add Prettier for code formatting? … No / Yes
✔ Add Vue DevTools 7 extension for debugging? (experimental) … No / Yes
```

<details><summary>オプション内のざっくり理解</summary>

```plaintext
Add TypeScript? → TypeScriptを追加するかどうか
Add JSX Support? → JSX（JavaScript XML）を追加するかどうか
Add Vue Router for Single Page Application development? → ルーティング制御をするための公式プラグインを追加するかどうか
Add Pinia for state management? → 状態管理ライブラリを追加するかどうか
Add Vitest for Unit testing? → 単体テストツールを追加するかどうか
Add an End-to-End Testing Solution? → E2E Testを追加するかどうか
Add ESLint for code quality? → 構文解析ツールを追加するかどうか
Add Prettier for code formatting? → フォーマッターを追加するかどうか
Add Vue DevTools 7 extension for debugging? (experimental) → 
Prettier
フォーマッター。js/ts以外にもhtmlとか色々対応してる。
```

</details>

今回僕は「vue-pra」というプロジェクト名で作ることにしました
無事にプロジェクの作成が完了した後は開発サーバーを起動します

```sh
cd vue-pra
npm install
npm run dev
```

すると「Local:   http://localhost:xxxx/」と表示されると思います
実際にWebページで開いてみると以下のようにデフォルトのページが表示されます

![スクリーンショット 2025-02-14 11.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/4e22910f-7d39-4aff-b243-c13bb9c6e369.png)

# おわりに
はい、ということでほぼvueの公式ページをなぞる形になりましたが、開発ページを開くところまでスムーズに行うことができました

やはり、最終的にはjsが書けなければ意味ないのでそこら辺が今後の課題になりそうだなと思いました
【Laravel】SQLiteからMySQLへの移行用Seederを作成

## はじめに
今回、**SQLite**から**MySQL**への移行作業が発生しました。
移行作業にて、**Seeder**を使い、一括でデータを移行するようにしたいと思います。

## Seederの役割
1.**データの初期化:**
　＊データベースに初期データを投入するために使用されます。
　＊これにより、開発環境やテスト環境で必要なデータを簡単に準備できます。

2.**テストデータの生成**
　＊テストを行う際に必要なデータを自動的に生成することで、手動でデータを入力する手間を省きます。

3.**データの一貫性**
　＊一貫したデータセットを提供することで、テスト結果の信頼性を高めます。
## Seederの主な書き方
例えばuserテーブルに初期のアカウントを作成する方法


```microsoftshell:Seederを以下のコマンドで作成
php artisan make:seeder UserSeeder
```

Seederに以下のコードを記載
```php:UserSeeder/userテーブルをきれいにする(UserModelがある前提)
use App\Models\User;

User::truncate();
```

```php:UserSeeder/userテーブルに挿入するデータを作成
use Illuminate\Support\Facades\Hash;

$user = [
    'email' => 'test@example.com',
    'password' => Hash::make('password'), // パスワードをハッシュ化
    'name' => 'userName',
];
```
```php:UserSeeder/userテーブルにデータを挿入(UserModelがある前提)
User::create($user);
```
以下でSeederを実行
```microsoftshell:Seeder実行コマンド
php artisan db:seed --class=UserSeeder;
```
これでuserテーブルに初期データが投入されました！！

## SQLiteからMySQLへの移行用作成
本題のSeederをここで作成します！
今回はuserテーブルにある50万件のデータを移行します。
まずはconfigにSQLite、MySQLの情報をそれぞれ記載します。
```php:config/database.php
'sqlite' => [
    'driver' => 'sqlite',
    ... その他必要な設定記載
],

'mysql' => [
    'driver' => 'mysql',
    ... その他必要な設定記載
    
],
```
次にSeederに以下コードを記載
```php:Seeder
use Illuminate\Support\Facades\DB;

DB::connection('mysql')->table('user')->truncate() // MySQLのuserテーブルをきれいにする

$bacthSize = 1000;
$offset = 0; // メモリ不足にしないために設定

while (true) {
    $records = DB::connection('sqlite')->table('user')->offset($offset)->limit($batchSize)->get(); // sqliteのuserテーブルの情報を取得

    if (empty($records)){
        break;
    }

    $records = array_map(function ($user) {
        $user = (array) $user;
        return $user;
    }, $records);

    DB::connection('mysql')->table('user')->insert($records); // mysqlにバルクインサート
    $offset += $batchSize;
}
```
バルクインサートを使用することも大切です。
実行速度に明らかな差が出ました。
**バルクインサート未使用時：2,927,279ms
バルクインサート使用時：357,306ms**


以上Seederを活用して、SQLiteからMySQLへのデータ移行Seederを作成してみました。
Seederはうまく活用するととても便利なものなので、随時活用していきたいと思います。