OmniAICreator/Qiita-1.07M huggingface dataset:
【ChatGPT】ハルシネーション対策 5選をご紹介です。


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

　今回は、ハルシネーション対策 5選をご紹介です。

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

　昨日（2025/02/16）
　　書きましたとおり、
　　　GPT-4oが新しくなりました。

　それと
　　Web版では
　　　“編集ができない”とも
　　　　書きました。

　それが直って、
　　編集できるようになりました。

　また、
　　編集だけでなく、
　　　コピーもできるように。

　ただし、
　　このコピー、
　　　クセがあります。

　セッション最初の入力には
　　カスタマイズの文言が
　　　含まれていますし、
　　　　ほかの場合は
　　　　　コピーできないことも。

　ChatGPTからの回答のコピーは
　　ふつうに行なえます。
***
　次に

　イーロン・マスクが
　　ポストしました。
　　　[イーロン・マスクポスト](https://x.com/elonmusk/status/1890958798841389499?t=McJxSjLggyqJh1ueFX9J-g&s=19)

　“Grok 3を、
　　月曜夜8時（PT）に
　　　ライブデモとともにリリース予定”

　日本時間(JST)では
　　2025年2月18日(火)午後1時ね。
***
　では、【本題】です。

　今回は、
　　ハルシネーション対策
　　　５選をご紹介します。

　ハルシネーションは、生成AIが
　　事実とは異なる情報を生成したり、
　　　架空の内容を作り出したりする
　　　　ことを言います。

　すぐるさんのポストを
　　参考にしました。
　　　[すぐるさんポスト](https://x.com/SuguruKun_ai/status/1890787119087452234?t=B_Tc0Yu5_8zDRzmbpevgEA&s=19)

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

　すぐるさんのポストは
　　Anthropicが出した
　　　Claudeのための
　　　　ハルシネーション対策をもとに
　　　　　作成された模様です。
　　　　　　[Anthropic公式ページ](https://docs.anthropic.com/en/docs/test-and-evaluate/strengthen-guardrails/reduce-hallucinations)

　なお、すぐるさんのポストは
　　画像のため、ChatGPTに
　　　読み込ませ、体裁を整えました。

***（ChatGPT）***
### **ハルシネーション対策 5選**

近年、AIの活用が進む中で「ハルシネーション」と呼ばれる誤情報や事実と異なる回答の生成が問題視されています。本記事では、AIのハルシネーションを防ぐための5つの方法を紹介します。



## **1.「わからない」と言える環境を作る**  
AIが不確実な情報を生成しないようにするためには、AIに「わからない」と回答する許可を明示的に与えることが重要です。AIが無理に回答を作成するのではなく、確実な情報がない場合は正直に答えるよう促します。

**例：**
```
この質問に確信が持てない場合は、「わかりません」と正直に答えてください。
```



## **2. 直接引用を使用して事実を根拠付ける**  
長文の分析や回答を行う際には、まず関連する直接引用を抽出し、その情報に基づいて回答を作成するようにします。これにより、AIが独自に情報を生成するリスクを減らし、正確な事実に基づいた回答を得ることができます。

**例：**
```
まず、文書から関連する直接引用を3つ抽出し、それらに基づいて回答を作成してください。
```



## **3. 引用による検証**  
AIの回答が信頼できるかどうかを確認するために、各主張の根拠となる引用を求めるようにします。これにより、AIが適当な回答を生成するのを防ぎ、回答の信頼性を向上させることができます。

**例：**
```
あなたの回答の各ポイントについて、文書から直接引用を提供してください。
```



## **4. 段階的思考の検証**  
AIの推論過程を段階的に説明させることで、論理の誤りを発見しやすくなります。特に、複雑な問題や推論が求められる質問に対しては、結論を出す前にその過程を明確に説明させるとよいでしょう。

**例：**
```
最終的な結論を出す前に、あなたの推論過程を段階的に説明してください。
```



## **5. 反復的な改善**  
AIの出力をそのまま使用するのではなく、前回の回答を確認し、誤りや不一致がないかを検証するプロセスを取り入れます。不正確な情報が含まれている場合は、それを修正し、より信頼性の高い回答に改善していくことが重要です。

**例：**
```
前回の回答を再確認し、不一致や不正確な点があれば修正してください。
```



### **まとめ**
AIを活用する際には、ハルシネーションを防ぐための対策を意識することが重要です。  
1. AIに「わからない」と言わせる環境を作る  
2. 直接引用を用いて事実を根拠付ける  
3. 引用を求めて回答の正確性を確認する  
4. 段階的な思考を促して論理の誤りを防ぐ  
5. 反復的な確認と修正を行う  

これらの対策を実践することで、より正確で信頼性の高いAIの利用が可能になります。
***

　ハルシネーションは
　　うまく使えば、
　　　アイディアになりますが、
　　　　事実とは異なるという点では
　　　　　実務執行には
　　　　　　障害となります。

　事実とすぐにわかるレベルなら
　　問題はありませんが、
　　　文脈からそれを判断するには
　　　　事実を知っている必要が
　　　　　あります。

　生成AIから得たい
　　回答の多くは、
　　　得てして、事実を知らない場合が
　　　　多いかと思います。

　ハルシネーションをなくすことは
　　難しいと聞きます。

　しかし、今回紹介したことを使えば、
　　ハルシネーションを抑えることは
　　　可能です。

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

　今回は、ここまで。
【pygame】smoothscaleを使わない理由 is 何？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922095/a4fa3510-c43e-4786-b340-2a70e97d9908.png)


## はじめに
　先日ゲーム制作中に、`smoothscale`というものを使ったのですが、何気にこれってめちゃくちゃ大事じゃね？と気づきました。そこで、初心者や、`pygame`を普段使わない人向けに、簡単な紹介をしようと思います。

## smoothscaleとは
　`smoothscale`は通常の`scale`と同様に、画像を拡大、縮小するためのメソッドです。以下のように使うことができます。`Surface`が画像のことです。

```python
scaled_surface = pygame.transform.smoothscale(Surface, (width, height))
```

これを見て気づいた方も多いと思いますが、`pygame.transform.scale`とは、使い方も手間も一緒です。つまり、普段使っている`scale`の前に`smooth`という6文字を入れるだけで、拡大、縮小後の画像が、ワンランク上の仕上がりになります。

記事の冒頭にも載せてありますが、実際に画像を拡大し比較したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922095/f262a5b9-d4dc-402d-ba2e-05c09ad21b4b.png)


　`scale`を使った画像の方は、なんだか画質が悪いような感じがしませんか？あるいは、それに見慣れている人は、`smoothscale`を使った画像の画質が特別良いと感じるでしょうか。いずれにせよ、`smoothscale`を使った方が、きれいな仕上がりになっているということが、お分かりいただけると思います。
 
　付け焼き刃の知識ですが、一応説明っぽいものを置いておきます。`scale`を使って普通に拡大、縮小を行うと、ジャギーというギザギザが生じてしまうので、仕上がりが少し残念になります。一方、`smoothscale`を使うと、拡大縮小だけでなく、名前の通り滑らかにしてくれます。これにより、ジャギーが気にならない、きれいな仕上がりになるというわけです。この点から、`smoothscale`の方は計算コストが高いという点をデメリットとして挙げられます。しかし、個人でゲームを作っている分には全く気にならない程度なので、基本的には`smoothscale`を使う方針で問題ないと考えています。

:::note warn
あまりに大量の画像を読み込む場合や、ゲームループ内で繰り返し画像を読み込む場合には、パフォーマンスに影響することがあるかもしれません。もしパフォーマンスに影響が生じたときは、優先度の低い画像から`scale`に置き換えていくのが良いでしょう。
:::

### 使い方の補足

　他には`dest_surface`という引数があります。これを指定することで、新しく生成するのではなく、指定した`Surface`に上書きする形で生成できます。しかし、指定する先の`Surface`のサイズと形式を合わせる必要があるので、以下のように手順が多くなります。
 
```python
width = 128
height = 128
source_surface = pygame.image.load('test.png')
scaled_surface = pygame.Surface((width, height)).convert(source_surface)
pygame.transform.smoothscale(Surface, (width, height), dest_surface = scaled_surface)
```

サイズを合わせないといけないので、元の画像を破壊的に変更するような使い方はできなそうです。

:::note
画像の拡大縮小を多用するときは、こちらの方法を使った方が、効率が良いと説明が載っていたので、場合によっては使ってみるといいかもしれません。
:::

## まとめ
　特に理由がなければ、`scale`よりも`smoothscale`を使ったほうがゲームの見た目が良くなる！今すぐ置き換えよう！

## 最後に
　ここまで読んで下さりありがとうございました。`smoothscale`はだいぶ前から使ったことがあったのですが、そこまで大きく拡大や縮小をしていなかったので、今まで真価に気づいていませんでした。ゲームって見栄えで印象が全然変わってくると思うので、pygameでゲームを作る際には、必須の知識だと思います。ぜひ皆さんもお試しください。

　また、他にも拡大縮小のメソッド自体がいくつかあるので、場面ごとに最善を求める方は、参考に貼ってあるページを覗いてみると良いかもしれません。（そのようなレベルの方は既に見ているでしょうし、筆者より知識もあると思いますが）

## 参考
日本語訳

https://westplain.sakura.ne.jp/translate/pygame/Transform.cgi

原文

https://www.pygame.org/docs/ref/transform.html
【Rails】testでよく使用されるvalid?メソッド

# はじめに
こんにちは。アメリカにて独学でエンジニアを目指している者です。
現在、Railsチュートリアルを用いて学習を進めていますが、Railsのテストでよく使用される `valid?` メソッドについて、「valid」という英単語の意味である「有効な」と単純に解釈していたため、本来の動作を十分に理解していませんでした。
そこで本記事では、`valid?` メソッドの基本的な動作とテストでの利用例について解説します。

# valid?メソッドの基本動作
Railsの`valid?`メソッドは、**モデルに定義された全てのバリデーションを実行し、その結果に基づいてオブジェクトが「有効か無効か」を判断します。**
以前は、`valid?` が単にオブジェクトの状態(`true` or `false`)を返すだけだと勘違いしていましたが、実際には以下のようなプロセスで動作しています。

* バリデーションの実行
モデルで設定した`presence: true、uniqueness: true、format: { with: ... }`など、各種バリデーションが順に評価されます。

* エラー情報の蓄積
バリデーションに失敗した場合、そのエラー情報が`errors`オブジェクトに追加され、どの属性がどのような理由で無効になったかを明確にします。

* 真偽値の返却
全てのバリデーションが成功すれば`true`、1つでも失敗すれば`false`が返されます。

## テストにおけるvalid?の利用例
テストコードでは、`valid?` を用いてモデルの状態が期待通りになっているかどうかを検証します。
以下に、モデル側のコード例とテストケースのコード例を併記して説明します。

### モデル側のコード例
例えば、Userモデルでは `name` と `email` に対して、必須性と一意性のバリデーションを設定します。
```ruby:user.rb
class User < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  validates :email, presence: true, uniqueness: true
end
```

### テストケースのコード例
次に、メールアドレスの一意性を検証するテストケースの例です。

```ruby:test_user.rb
test 'email addresses should be unique' do
  duplicate_user = @user.dup
  @user.save
  assert_not duplicate_user.valid?
end
```
### テストの流れ

1. `@user.dup`でオブジェクトを複製
オリジナルのユーザーオブジェクト`@user`の属性を引き継いだ新しいオブジェクト`duplicate_user`を作成します。

2. 元のユーザーを保存
`@user.save`により、元のユーザーがデータベースに登録されます。この時点で、メールアドレスの一意性がデータベース上で確認できる状態になります。

3. バリデーションの実行
`duplicate_user.valid?`が呼ばれると、`uniqueness: true`のバリデーションが実行され、データベースに問い合わせが発行されます。
既に同じ名前とメールアドレスが存在するため、`duplicate_user`は無効と判断されます。

このように、`valid?` はメモリ上のオブジェクトに対してバリデーションを実行しますが、一部のバリデーション（例：`uniqueness`）はデータベースの状態を反映するため、実際にDBへの問い合わせが発生する仕組みになっています。

## まとめ
Railsの `valid?` メソッドは、単にオブジェクトの状態を返すだけでなく、その場でバリデーションを実行し、エラー情報を収集しながらオブジェクトの有効性を判断します。
特に、`uniqueness: true` のようにデータベースの状態に依存するバリデーションが含まれている場合、`valid?` は実際にデータベースへクエリを発行して確認を行います。
もしコードの意味がすぐに理解できない場合は、自分の先入観にとらわれず、１つ１つのコードの意味や動作を考察することが、エンジニアとして成長するための大切なプロセスだと感じました。
スプレッドシート：１行下のセルとのdiffを調べる

# 利用場面
２つのCSVデータの差分を知りたい場合に使えます。
before/afterのデータを比べたいときってありますよね。
diffコマンドで行単位で調べることはできますが、列数が多いデータの場合はなにかと不便…
スプレッドシートで視覚的に一発で差分がわかる方法です。

# 期待する結果
以下のように、１つ下のセルと差分があるセルに色がつきます
![スクリーンショット 2025-02-17 11.36.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2045017/687382f8-ce8c-458d-ac87-5765eee1ea64.png)


# 手順
### 1. データを用意
スプレッドシートにデータを貼り付け、A列にbefore/afterといったデータの区分を書きます
![スクリーンショット 2025-02-17 11.33.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2045017/bc830eaf-f10d-4b92-a9bd-71375860b765.png)
### 2. 並び替え
比較したい行が前後になるように並び替えます。
今回はB列の都道府県コードで並び替えました。
![スクリーンショット 2025-02-17 11.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2045017/531e3d3c-d6d0-465a-828e-d3a058c507d7.png)
### 3. 条件付き書式を設定
見出しを除いたデータ内容を選択し、条件付き書式にてカスタム数式を選択し、以下の数式を入れる
```
=and(iseven(row()), indirect(address(row(),column())) <> indirect(address(row() + 1,column())))
```
![スクリーンショット 2025-02-17 11.36.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2045017/f1c6bdda-1d56-46e2-b0a7-3b708becea4d.png)

これで色がついているセルが１行下のセルとのdiffになります。
23H2に固定する

# 固定するコマンド

### 1つ目のコマンド
```reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v TargetReleaseversion /t REG_DWORD /d 1 /f```

* reg add: レジストリキーや値を追加するコマンドです。
* HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate: レジストリキーのパスを指定します。この場合、これはWindows Update関連の設定が保存される場所です。
* /v TargetReleaseversion : 追加もしくは変更する値の名前 (キー) を指定します。ここでは TargetReleaseversion というキーを追加・変更します。
* /t REG_DWORD : 値のデータ型を指定します。ここでは DWORD 型（32ビット整数）を指定しています。
* /d 1 : 設定する値のデータを指定します。ここでは 1 を設定しています。
* /f : 強制的に変更を行うためのフラグです。このフラグを付けることで、確認のプロンプトを表示せずに変更が適用されます。

### 2つ目のコマンド
```reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v TargetReleaseversionInfo /t REG_SZ /d 23H2 /f```

* reg add: レジストリキーや値を追加するコマンドです。
* HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate: レジストリキーのパスを指定します。この場合、これはWindows Update関連の設定が保存される場所です。
* /v TargetReleaseversionInfo: 追加もしくは変更する値の名前 (キー) を指定します。ここでは TargetReleaseversionInfo というキーを追加・変更します。
* /t REG_SZ: 値のデータ型を指定します。ここでは文字列型（REG_SZ）を指定しています。
* /d 23H2: 設定する値のデータを指定します。ここでは文字列 "23H2" を設定しています。
* /f: 強制的に変更を行うためのフラグです。このフラグを付けることで、確認のプロンプトを表示せずに変更が適用されます。

```ps1
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v TargetReleaseversion /t REG_DWORD /d 1 /f

reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v TargetReleaseversionInfo /t REG_SZ /d 23H2 /f

echo "下記のディレクトリにあるアップデートファイルをすべて削除"
cd C:\Windows\SoftwareDistribution\Download

$dirname = dir -Name

echo "削除対象"
echo $dirname
echo "-------------------\n"

foreach($d in $dirname){
    echo "処理中です"
    echo $d
    icacls $d /grant administrators:F /t /c > $null 2>&1
    del $d -Recurse -Force -ErrorAction SilentlyContinue > $null 2>&1
}

dir

```


# このコマンドを無効化
```ps1
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v TargetReleaseversion /f

reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v TargetReleaseversionInfo /f

```



## おまけ
* batから起動したい場合
```bat
@echo off
set currentDrive=%~d0

powershell -ExecutionPolicy Bypass -File "%currentDrive%\23h2_static.ps1"
```
【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】

# システムパフォーマンス関連まとめ

- 理解のために小咄形式でまとめました。
- それぞれ５分程度で読めると思います。
- 花子と太郎。

## システムパフォーマンス全般

- [システムパフォーマンス分析の方法論（メソドロジ）](https://qiita.com/nouernet/items/8143ebc0bc7dcae99088)

## CPU

- [CPU の動作モデル](https://qiita.com/nouernet/items/d7f4e629a4d8bb71188a)
- [CPU の基本概念（コンセプト）](https://qiita.com/nouernet/items/7d4d0fa908082599d63b)
- [CPU のアーキテクチャ](https://qiita.com/nouernet/items/8df24555304baae15a8e)
- [CPU のパフォーマンス分析の方法論（メソドロジ）](https://qiita.com/nouernet/items/5054ddcb817439ff69ef)
- [CPU の可観測性ツール](https://qiita.com/nouernet/items/5c32f0dd0cd908ce4a86)
- [CPU のパフォーマンス可視化（ビジュアライゼーション）](https://qiita.com/nouernet/items/fd0de6010831a284a04c)
- [CPU のベンチマーク](https://qiita.com/nouernet/items/61a29bae745afd23d4a6)
- [CPU 関連の用語](https://qiita.com/nouernet/items/e6b4a9ad006685ebb693)

## メモリ

- [メモリの基本概念（コンセプト）](https://qiita.com/nouernet/items/0cb15174797d523ae733)
- [メモリのアーキテクチャ](https://qiita.com/nouernet/items/1de7c9e84a7afcc05b95)

## ファイルシステム

- [ファイルシステムの動作モデル](https://qiita.com/nouernet/items/40e684665aed5978d433)
- [ファイルシステムの基本概念（コンセプト）](https://qiita.com/nouernet/items/baeb0a23cb8b176c18ca)
- [ファイルシステムのアーキテクチャ](https://qiita.com/nouernet/items/6aae02d06a46747a238e)
- [ファイルシステムのパフォーマンス分析の方法論（メソドロジ）](https://qiita.com/nouernet/items/28747c9d8154797be7c1)
- [【初心者向け】ファイルシステムのパフォーマンス調査の方法論（メソドロジ）メモ](https://qiita.com/nouernet/items/62ed9a9f708075a5da42)
- [ファイルシステムのパフォーマンス可観測性ツール](https://qiita.com/nouernet/items/12f2c4426731c160fa7f)
- [ファイルシステムのベンチマーク](https://qiita.com/nouernet/items/d1e294c8520179c0a78c)
- [ファイルシステムのチューニング](https://qiita.com/nouernet/items/3945737930475e097b1c)
- [ファイルシステム関連の用語](https://qiita.com/nouernet/items/c0ca7942c91dbbd491f3)

## ディスク I/O

- [ディスク I/O の動作モデル](https://qiita.com/nouernet/items/97ba536aab21fb7169f7)
- [ディスク I/O の基本概念（コンセプト）](https://qiita.com/nouernet/items/5f1174de87217140e1e4)
- [ディスク I/O のアーキテクチャ](https://qiita.com/nouernet/items/59752cc499ff63dc290d)
- [ディスク I/O の分析の方法論（メソドロジ）](https://qiita.com/nouernet/items/7245bfff5853bc5bc5e3)
- [ディスク I/O の可観測性ツール](https://qiita.com/nouernet/items/e62f85d7efc13e557bd9)
- [ディスク I/O の可視化（ビジュアライゼーション）](https://qiita.com/nouernet/items/25dc5fe4c12646d765ee)
- [ディスク I/O のベンチマーク](https://qiita.com/nouernet/items/ee91a5e0916ad055a863)
- [ディスク I/O のチューニング](https://qiita.com/nouernet/items/c9d4677576e1d126c3b7)
- [ディスク I/O 関連の用語](https://qiita.com/nouernet/items/ec78c8802d8894542f1e)

# 参考リンク

システムパフォーマンス関連記事は、以下の書籍を参考に記述しています。

- [［改訂新版］プロのためのLinuxシステム構築・運用技術](https://www.amazon.co.jp/dp/B01LZURAPK)
- [改訂2版 ネットワークエンジニアの教科書](https://www.amazon.co.jp/dp/B07NXQ4TDV)
- [絵で見てわかるシステムパフォーマンスの仕組み](https://www.amazon.co.jp/dp/B00LHFOTF4)
- [詳解 システム・パフォーマンス 第2版](https://www.oreilly.co.jp/books/9784814400072/)
- [入門 モダンLinux](https://www.oreilly.co.jp/books/9784814400218/)
- [Linuxシステム管理](https://www.oreilly.co.jp/books/9784873113463/)
UnityでSQLiteUnityKitを使ってSQLiteを利用する。

# UnityでSQLiteを利用する
C#の勉強としてゲーム開発をしたときに上手くいかなかった点を、個人的なメモとして残させていただきます。

実行環境・想定は下記。
・Windows 10 
・64 ビット オペレーティング システム、x64 ベース プロセッサ
・Unity 2022.3.43f1
・SQLiteUnityKit

## 基本的には以下の手順
https://qiita.com/hiroyuki7/items/5335e391c9ed397aee50

要点を抜粋。
1. SQLiteUnityKitを取得する
1. プロジェクトに配置する
DataTable.cs -> Assets/Scripts
SqliteDatabase.cs -> Assets/Scripts
1. DBを作成する
xxxx.db -> Assets/StreamingAssets ※フォルダなければ作成する。

この状態で、下記も格納しておく必要がある。
libsqlite3.so -> Assets/Plugin/x64 ※フォルダなければ作成する。
（32bitであれば x86に格納する。）

ここまでで利用準備が完了だが、配布されているSQLiteUnityKitはいくつか問題点もあるよう。
[Unity SQLiteUnityKit のスクリプト修正・変更のポイント](https://shikaku-sh.hatenablog.com/entry/unity-sqliteunitykit-correction-points)

私は、「マルチバイト文字の対応」のみ修正して利用することとしました。

## 追加対応
この段階で利用しようとすると、下記のようなエラーが発生した。

```.log
DllNotFoundException: sqlite3 assembly:<unknown assembly> type:<unknown type> member:(null)
SqliteDatabase.Open (System.String path) (at Assets/Scripts/SQLite/Common/SqliteDatabase.cs:152)
SqliteDatabase.Open () (at Assets/Scripts/SQLite/Common/SqliteDatabase.cs:143)
SqliteDatabase.ExecuteQuery (System.String query) (at Assets/Scripts/SQLite/Common/SqliteDatabase.cs:218)
SQLite.SystemInfoDao.SelectSystemInfo () (at Assets/Scripts/SQLite/Dao/SystemInfoDao.cs:17)
Home.HomeInitializer.Start () (at Assets/Scripts/Home/HomeInitializer.cs:19)
```

どうやら、UnityがSQLiteライブラリ（sqlite3.dll）を見つけられないことが原因だと言っている。
「sqlite3.dll」を配置する必要がありそうだった。

[（参考）Unity Android/Windows 環境における SQLite の使い方の基本](https://shikaku-sh.hatenablog.com/entry/unity-how-to-use-sqlite-in-standalone-android)

公式よりダウンロードする。
・https://www.sqlite.org/download.html

今回は、64bitなので「sqlite-dll-win64-x64-XXXXXXX.zip」を取得して、解凍後格納する。

sqlite3.dll -> Assets/Plugin/x64
※libsqlite3.so は不要か。

以上で、エラーは解消されて実行することができた。

## 利用方法
・DB名を"config.db"とした場合、以下の指定方法でSqliteDatabaseに渡す。
```C#
    new SqliteDatabase(Application.streamingAssetsPath + "/config.db")
```

・サンプル
```DatabaseConnectionController.cs
using System.IO;
using UnityEngine;

namespace SQLite
{
    public class DatabaseConnectionController
    {
        public string dbPath { get; private set; }
        public SqliteDatabase Conn { get; private set; }

        public DatabaseConnectionController(): this(Application.streamingAssetsPath + "/config.db") { }
        
        public DatabaseConnectionController(string dbPath)
        {
            this.dbPath = dbPath;
        }
        public void CreateConnection()
        {
            if (!File.Exists(dbPath))
            {
                Debug.LogError($"ERROR: Database is not found : {dbPath}");
                return;
            }
            Conn = new SqliteDatabase(this.dbPath);
        }
    }
}
```

```SystemInfoDao.cs
using UnityEngine;

namespace SQLite
{

    public class SystemInfoDao : DatabaseConnectionController
    {
        public string sql { get; private set; }

        public SystemInfoDao()
        {
            sql = "SELECT * FROM system_info Limit 1;";
            this.CreateConnection();
        }
        public SystemInfoMapper SelectSystemInfo()
        {
            return new (Conn.ExecuteQuery(sql));
        }
    }
}
```
【初心者向け】ディスク I/O の動作モデル【5分で読める】

# ディスク I/O の動作モデル

理解のために小咄形式でまとめました。

:::note info
システムパフォーマンス関連記事の目次
- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)
:::

**登場人物**
- **太郎（後輩）**：入社1年目の若手エンジニア。
- **花子（先輩）**：システムエンジニア歴3年の先輩。

**場面：オフィスのホワイトボード前**
*太郎が `ディスク I/O モデル` に関する資料を見ながら、花子に質問する。*

**太郎**：「花子先輩、`ディスク I/O` について調べているんですが、 `ディスクのモデル` って具体的にどういうものがあるんですか？」

**花子**：「いい質問ね！ `ディスク I/O のパフォーマンス` を理解するためには、 `ディスクがどのようにデータを処理するか` という `モデル` を知っておくことが大事よ。 `基本的な 3 つのモデル` を紹介するわね。」

---

### **ディスク I/O のどうさモデルの解説**
**花子**：「`ディスク I/O のモデル` には、大きく `3 つの要素` があるの。」

1. **単純ディスク（Simple Disk）**
2. **オンディスクキャッシュ（On-Disk Cache）**
3. **コントローラ（Controller）**

---

#### **1. 単純ディスク（Simple Disk）**
**花子**：「`単純ディスク` とは、 `基本的なディスク I/O の動作モデル` を表す概念よ。」

- **ディスクは I/O キューを持ち、I/O リクエストが到着すると処理を行う。**
- **I/O リクエストが増えると、キューにリクエストが溜まり、処理待ちが発生する。**
- **このモデルは、 `スーパーマーケットのレジ待ちの行列` に例えられるわね。**

「たとえば、 `顧客（I/O リクエスト）がレジ（ディスク）で順番待ちをする` のと似ていて、 `レジの処理が遅いと行列が伸びる` のよ。」

**太郎**：「つまり、 `ディスクの処理能力を超えるリクエストが来ると、待ち時間（レイテンシ）が増える` ってことですね！」

---

#### **2. オンディスクキャッシュ（On-Disk Cache）**
**花子**：「次に `オンディスクキャッシュ` ね。これは、 `ディスク内部に搭載されたメモリキャッシュ` を指すの。」

- **リードキャッシュ（Read Cache）**: 直前に読み取ったデータをキャッシュし、再利用を高速化。
- **ライトキャッシュ（Write Cache）**: 書き込みデータを一時的にキャッシュし、後でまとめて書き込む。

「このキャッシュを使うことで、 `I/O のレイテンシを削減` できるわ。たとえば、 `コンビニのレジ横にある小銭トレイ` みたいなものね。」

**太郎**：「なるほど！ `事前にキャッシュしておくことで、実際のディスクアクセス回数を減らせる` んですね！」

---

#### **3. コントローラ（Controller）**
**花子**：「`ディスクコントローラ` は、 `ディスク I/O の制御を行う専用チップ` のことよ。」

- **I/O スケジューリング**: I/O リクエストの順序を最適化。
- **エレベータアルゴリズム**: HDD の `シーク時間を最小化` するための手法。
- **フラッシュ最適化**: SSD の `書き込み負荷を分散` するウェアレベリング。

「たとえば、 `バスの運行管理システム` みたいなもので、 `効率的なルート` を考えて、 `無駄な移動を減らす` のと同じよ。」

**太郎**：「ってことは、 `ディスクの性能を引き出すために、コントローラのアルゴリズムが重要` になるんですね！」

---

**花子**：「これらの `ディスクモデル` を `ファストフード店のオペレーション` に例えると、こんな感じね。」

1. **単純ディスク** → `お客さんが注文して、調理待ちの行列ができる`
2. **オンディスクキャッシュ** → `ポテトや飲み物を事前に準備しておいて、注文時にすぐ渡せる`
3. **コントローラ** → `店員が注文の順番を最適化して、効率よく提供する`

**太郎**：「なるほど！ `キャッシュがあると、処理が早くなるし、オペレーションが最適化されると、全体の流れがスムーズになる` ってことですね！」

---

### **まとめ**
**花子**：「ディスク I/O の `基本モデル` を理解することで、 `なぜ遅延が発生するのか` や `どうすれば最適化できるのか` を考えやすくなるわ。」

**太郎**：「ありがとうございます！ `オンディスクキャッシュの影響` を確認するために、 キャッシュ設定を調べてみます！」

# 参考リンク

システムパフォーマンス関連記事の目次

- [【初心者向け】システムパフォーマンス関連まとめ【それぞれ５分で読める】](https://qiita.com/nouernet/items/d3efe67e0f52a92e061d)

システムパフォーマンス関連記事は、以下の書籍を参考に記述しています。

- [［改訂新版］プロのためのLinuxシステム構築・運用技術](https://www.amazon.co.jp/dp/B01LZURAPK)
- [改訂2版 ネットワークエンジニアの教科書](https://www.amazon.co.jp/dp/B07NXQ4TDV)
- [絵で見てわかるシステムパフォーマンスの仕組み](https://www.amazon.co.jp/dp/B00LHFOTF4)
- [詳解 システム・パフォーマンス 第2版](https://www.oreilly.co.jp/books/9784814400072/)
- [入門 モダンLinux](https://www.oreilly.co.jp/books/9784814400218/)
- [Linuxシステム管理](https://www.oreilly.co.jp/books/9784873113463/)
【簡単AWS】【AWS Auto Scaling】デフォルトの終了ポリシーを徹底解説

# **はじめに**  
AWS Auto Scalingグループを使用する際、スケールイン（縮小）が発生したときに、どのインスタンスが終了されるかを理解することは、安定した運用にとって重要です。  
本記事では**デフォルトの終了ポリシー**がどのように動作するのかを解説します。  

---

## **デフォルトの終了ポリシーの動作順序**  
デフォルトの終了ポリシーでは、インスタンスを終了する際に以下の手順が順番に実行されます。  

### **1. インスタンス数が最も多いアベイラビリティゾーンを選択**  
- Auto Scalingグループが複数のアベイラビリティゾーンにまたがっている場合、**インスタンス数が最も多いゾーン**が選ばれます。  
- これにより、ゾーン間でインスタンス数のバランスを維持します。  

### **2. 古い起動設定（Launch Configuration）を使用しているインスタンスを優先的に終了**  
- 選ばれたゾーン内で、古い起動設定を使用しているインスタンスがある場合は、それが優先的に終了されます。  

### **3. インスタンスの起動時間が最も古いものを終了**  
- もし複数のインスタンスが同じ条件で存在する場合は、**起動時間が最も古いインスタンス**が終了されます。  

---

## **デフォルトポリシーの特徴**  
- **スケーラビリティ**を重視し、ゾーン間でインスタンス数のバランスを確保します。  
- **古いリソースを優先的に削除**することで、新しい設定を使用したインスタンスを維持します。  

---

## **注意点**  
- デフォルトの終了ポリシーは自動で適用されますが、**カスタム終了ポリシー**を設定することも可能です。  
- カスタムポリシーを設定することで、特定のタグや条件に基づいてインスタンスを終了できます。  

---

## **まとめ**  
デフォルトの終了ポリシーは、バランスを取りつつ効率的にインスタンスを管理する重要な仕組みです。  
Auto Scalingの動作を理解し、適切な終了ポリシーを設計することで、システムの安定運用につながります。  
もしカスタムポリシーの設定方法について詳しく知りたい場合は、別記事で紹介しますのでぜひご覧ください！
【Salesforce】バケット列とグループ化の違い

## この記事は
Salesforceの勉強メモです。
今回はバケット列とグループ化の違いについて。

## 背景
認定アプリケーションビルダーの勉強中に気になったので調べました。

## 目標
バケット列とグループ化の違いがわかるようになる！

## 前提環境
Winter'25 Trailhead Playground

## 一言でいうと
バケット列はグループ化の一種。
グループ化はデータをグルーピングして集計したり分類したりすること。

## もうちょい詳しく
### バケット列（バケット項目）とは
+ 各項目をレポート上で分類する機能の一つ。
+ 数式やカスタム項目を作成せずにグルーピングができる。
+ 「××を〇〇別で分類したい」
というときに使う。
（例：「都道府県を地域別で分類したい」）
+ 使い方
    + バケット化する列で「この列をバケット化」を選択、バケットを作成し項目を追加する

### グループ化とは
+ 複数の項目を集計したり分類したりすること。
+ サマリーレポート、マトリックスレポート、結合レポートで列や行のデータをグループ化できる。
+ 「××を〇〇ごとに集計したい」
というときに使う。
（例：「商談金額を取引先ごとに集計したい」）
+ 使い方
    + 項目をドロップゾーンにドロップする
    + 列メニューをクリックして「この項目でグループ化」を選択

## 更新記録
2025/02/17 1.0.0

## 参考資料
+ [Salesforce Classic でのレポートデータのグループ化](https://help.salesforce.com/s/articleView?id=sf.concept_data_processing_engine_group_aggregate.htm&language=ja&type=5)
+ [バケット列によるデータの分類](https://help.salesforce.com/s/articleView?id=sf.reports_bucketing_overview.htm&language=ja&type=5)
+ [レポートを使いこなす裏ワザ（その2：ドリルダウン・バケット列）](https://successjp.salesforce.com/article/NAI-000123)
【ISSUEと共同開発】AIを活用して、給与マップを作成しました

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115497/b8fa32ec-b172-4d25-bfe4-78e79209e110.png)](https://i-ssue.com/lp/check_salary)


[![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115497/20e004b3-87fc-461a-8961-abc59341882b.png)](https://i-ssue.com/lp/check_salary)


## はじめに

企業とエンジニアのマッチングプラットフォームを展開している「ISSUE」さんと共同でAIを活用した給与マップを作成しました。ISSUEさんでは、エンジニアが稼げる手段を増やすことを1つの目標に様々な機能が提供されています。過去に出した業務委託単価診断は4,000名以上の回答実績があります。そういった情報を収集する中で、今自分が市場のどのポジションにいるのか今後自分はどのようなキャリアを歩んでいけばいいのか知りたいというエンジニアのニーズがたくさんあることに気づきました。そのニーズに応えるため、業界で自分のポジションを視覚的に捉えることができるサービスを作ろうというのがこのプロジェクトのきっかけです。

記事を移動しました。
https://i-ssue.com/topics/74407cf5-c32f-4b98-8c8b-491d65ca636a
テキストコミュニケーションで気をつけていること5選

## はじめに

仕事していると、SlackとかTeamsとかでテキストコミュニケーションをする機会多いですよね。というか四六時中している気がします。

かれこれ4年くらいそういう状況に身を置いていると気をつけることも増えてきたので、今回は私が気をつけていることを公開します！

前提として、私はテキストコミュニケーションは**受け手ファースト**であることが必須だと思っています！受け手ファーストにするために、送り手はあらゆる工夫を織り込むべきだと思ってます。
今回公開するのは、どうやって連絡を受けてファーストにするかという観点で気をつけていることです！

## 1. 『結論から伝える』の前に連絡した意図を伝える

『結論から伝える』はよく言われていることだと思うので既に実践されているかと思うのですが、
私は更にその前段として**連絡した意図**を伝えるようにしています。

**連絡した意図**というのは、**依頼・相談・報告**のことです。
連絡の内容がこれらのうちどれに該当するのかをまず述べるようにしています。

なぜこれをするかというと、連絡の受け手がパッと見で内容の優先度・緊急度を判断できるからです。
あとは、受け手の回答を要している(依頼・相談)のかそうでないのか(報告)が判断しやすい点も受け手ファーストで良いと思ってます。

## 2. スタンプだけのレスは基本的にNG

>13時からmeet良いですか？
:+1:

>上記問題ありませんか？
:+1:

みたいな返信、NGです！！これはよくない。
なにがよくないかと言うと、相手に通知がいかないので受け手は**常にメッセージをポーリングする必要がある**からです。
私は依頼や相談を受けたときは、**メンションでレス**するようにしています。

ただし、「どのような場面で相手に通知を飛ばす必要があるか」という観点から状況を整理しておく必要があります。

この状況整理は人によって変わってくる部分かと思いますが、私は以下のように考えています！

- 通知必要(=メンションレスすべき)
  - 依頼・相談全て
- 通知不要(=スタンプレスでもOK) 
  - 報告
  - 送信者がスタンプレスを要求している場合

## 3. マークダウンのリンクを乱用しない

マークダウンのリンク、いいですよね。PRと一緒に参考資料のリンクを添付するみたいなことを自発的にしてくれる人、好きです。
が、リンクを添付する時にマークダウンを使うかどうかは適宜判断するように筆者はしています。

なぜかというと、
**マークダウンを使わない方がリンクのテキストが長くなり、結果としてリンクを踏む側がリンクを踏みやすく(=クリックしやすく)なるから**
です。

意味がわからないと思うので、説明します。

マークダウンを使う場合、[このように](https://foo.bar.baz.com/foo/bar/1234567890987654321/baz?foo=foo&bar=bar&baz=baz)リンクのテキストによってはクリックできる領域がめちゃくちゃ小さくなります。

:::note warn
リンクは適当なので踏んでも何も起きません
:::

一方で、リンクを直接貼るパターンだと、
https://foo.bar.baz.com/foo/bar/1234567890987654321/baz?foo=foo&bar=bar&baz=baz
このようにクリックできる領域が増え、**リンクのエイムコスト**が大きく削減されます。

ただ一方で、マークダウンを使った場合の視認性の恩恵は無視できないと思います。
なので、**マークダウンを使う場合に向上する可読性**と、**使わない場合に削減されるテキストエイムのコスト**を天秤にかけて判断するのが良さそうです。

私の判断基準としては以下のような感じです。

- 対社外/対社内
  - 社外の場合、やはり体裁は大事なのでシンタックスを使用することが多い気がします
- リンクの長さ
  - リンクがあまりにも長い場合はシンタックスを使うようにしています
  - エイムコスト削減の恩恵が得られないほど短いリンクの場合、シンタックスを使うようにしています

## 4. コードブロックの活用

ここで言いたいのは、コードやエラーメッセージをコードブロックで送りましょうということではありません。
私が主張したいのは、
**コピペされることを想定したメッセージ、およびコピペされることが十分に想定されるメッセージはコードブロックで送りましょう**
ということです。

なぜかというと、コードブロックには右上にcopyボタンがありすよね。なので受け手がコピーするときに楽なのです。
ID/PWなど受け手が何某かの入力に利用するであろうメッセージは、コードでなくてもコードブロックにするようにしています。

## 5. そもそもマークダウンを乱用しない

まず筆者はマークダウンのメリデメを以下のように捉えています。

- メリット
  - 見やすい
- デメリット
  - 編集コストがかかる
  - コピペした時にレイアウトが崩れる

本節はデメリットの2つ目
**コピペした時にレイアウトが崩れる**
という点についてです。

上述の通り、基本的にマークダウンというのはReadableなものであり、Writableなものではありません。
なので**送ったメッセージがコピペされ得るような状況においては、マークダウンを使うことはむしろNG**というのが私のスタンスです。
例えば以下のような状況ですね。

- メールの本文を連携する
  - 送ったメッセージがコピペor微修正される可能性しかない
- 問い合わせに返信する
  - 返信内容がコピペされて他に展開される可能性がある

マークダウン使用の是非は、場面によって適宜検討されるべきだと思ってます！

## 最後に

書き終えて見返すとマークダウン関連のことが多いですね。まあ、みんな大好きだからいっか。
皆さんの気をつけていること、コメント待っていますよ。
JavaScriptで「Firefoxでコンソールを表示しJavaScriptを実行する」の動作を確認してみた。

# 概要

JavaScriptで「Firefoxでコンソールを表示しJavaScriptを実行する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/javascript/console/index2.html

# 実装

以下のコマンドを実行しました。

```
let sum = 8 + 18 + 7;
console.log(sum);
```

実行結果は以下の通りでした。

![Screenshot from 2025-02-17 10-12-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/26deca6e-d300-4981-988a-62f0ce4aea9b.png)

# まとめ

何かの役に立てばと。
【心理学】UIデザインの「なんとなく」を減らしたい

# はじめに
UIデザインを作成するときやデザインのレビューをするときに、こんな経験をしたことはありませんか？

![【Qiita用】UIデザインの「なんとなく」を減らしたい」 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/a7ec1b4a-0c5a-45d2-898e-61704079ae94.png)


この「なんとなく」の感覚は「直感」とも言えますが、根拠を説明できなくてモヤモヤしますよね...。

しかし、UIデザインはアートではなく、ユーザーのための設計です。
つまり、判断には必ず何かしらの根拠があるはずです！

この「なんとなく」の感覚を少しでも減らし、デザインの根拠を説明できるようになるために、心理学の法則・原則について調べてみました。

その中でもUIデザインに役立つ法則や原則を5つ紹介したいと思います。

# 1. ゲシュタルト原則
ゲシュタルト原則は、物事を全体として捉える人間の認知の傾向を示す法則です。

「ゲシュタルト崩壊」という言葉は耳にしたことがある人も多いのではないでしょうか。
ゲシュタルト崩壊とは、このゲシュタルト原則によるまとまりの認識が崩れて個々の要素がバラバラに見えてしまう現象を指します。


「ゲシュタルト原則」には基礎となる6原則がありますが、その一部を簡単に紹介すると、


- **近接の法則** → 近くにあるものはグループとして認識される
- **類似の法則** → 形や色が似ているものはまとまりとして見える
- **閉鎖の法則** → 一部が欠けていても、脳が補完して全体の形として認識する

このゲシュタルト原則を念頭に置いてUIデザインを考えてみます。

例えば、入力フォームでラベルとフォームの位置が離れていると、関連性が薄れるためユーザーが入力しづらくなる可能性があります。

![【Qiita用】UIデザインの「なんとなく」を減らしたい」.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/d3853118-4c5e-4c73-b35c-01d6756ab748.png)



今までなんとなく「ラベルとフォームの位置は近いほうが良い」と思っていたあなたも、今日からこう発言できます。

「ラベルとフォームは縦並びのデザインの方が良いです。なぜかというと、ゲシュタルト原則によれば、それぞれの位置が離れていると関連性が認識しにくく、ユーザーが入力に手間取る可能性があるからです（ｷﾘｯ）」

これで「なんとなく」を1つ減らせました🎉

# 2. フィッツの法則
フィッツの法則は、ポインタで指そうとするターゲットが大きければ大きいほど、またターゲットが動作の開始点の近くにあればあるほど、ポインタで到達する時間が短くなる法則です。
直感的に理解しやすい法則ですね。

例えば、ドラッグ＆ドロップでファイルをアップロードする場合、アップロードフォームのサイズを大きくすると、ポインタで指すまでの所要時間を短縮できます。

また、チェックボックスのクリック領域をテキストにも広げることで操作のしやすさを向上させる工夫も、この法則に基づいています。

![【Qiita用】UIデザインの「なんとなく」を減らしたい」 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/3a56944f-f8e5-43b1-a864-1a5976ae3321.png)



# 3. ステアリングの法則
これは2つ目のフィッツの法則から派生した法則です。
ステアリングの法則は、ポインタを狭い経路に沿ってターゲットまで移動させる場合、その経路が広いほど移動に要する時間が短くなる、というものです。

UIデザインでは、メニューやボタンの配置を最適化し、ユーザーが目的の場所に素早く到達できるようにするために活用されます。

![スクリーンショット 2025-02-13 17.05.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/022928c3-1a7b-443e-ad24-2b3165d38aee.png)

経路が広いとスムーズに選択できるようになりますが、逆に狭いと目的の場所に辿り着きにくく、UIの使い勝手が悪くなります。

# 4. ヒックの法則
ヒックの法則は、選択肢の数や複雑さが増えるほど意思決定に時間がかかる、という法則です。
選択肢が少ないほど、すぐにユーザーは決断できるようになります。

コロンビア大学のシーナ・アイエンガーの「ジャムの実験」では、選択肢が少ない方が購買率が高くなることが示されました。

ウェブサイトでは、選択肢を整理し、ユーザーが迅速に意思決定できるようにすることが重要です。
特に購入前のフォームの選択項目などは最小限にすると良いでしょう。

# 5. ドハティの閾値
ドハティの閾値は、システムの応答時間が**0.4秒以内**であると、ユーザーがスムーズに操作できるという概念です。
応答時間が0.4秒を超えると、ユーザーの関心が薄れ、操作がストレスになる可能性があります。

画面の表示速度やボタンの応答時間を常に意識しましょう。
また、待機時間を感じさせないインタラクションを取り入れたり、ユーザーが完了を待たずに他の作業ができる仕組みにするのが効果的です。

# おわりに
いかがでしたか？

「なんとなく」の判断を心理学の原則に置き換えることで、デザインの意図を明確に説明できるようになり、自信を持って判断できるようになります。
デザインを考える際には、「このデザインが良い理由は何か？」を心理学の観点からもぜひ考えてみてください！

# 参考

https://baigie.me/blog-ui/2022/03/29/psychology_for_uidesign/
算出プロパティ



テンプレート内に式を書けるより、もっと複雑な計算の場合、Vueが提供された算出プロパティ"computed"を推奨です。

## 使い方

```Vue
<script setup>
const getmouthA = computed(()=>{
    return 2
})
</script>

<p>{{getmouthA}}</p>
```
ナレッジ管理システムの完全見直し：NotionからBookStack+Redmine+WordPressへの移行

## 前回設計からの主な変更点

以前の記事（Notionを活用したナレッジ管理システムの構築）


https://qiita.com/EasyCording/items/15f15e5bbf678d5b6d8f



### 3層アーキテクチャの採用
前回からアーキテクチャを更新した。

* 情報収集トリガー →  BookStack（ナレッジベース）→  Redmine（プロジェクト管理）→ WordPress（情報発信）

### 各システムの役割
* BookStack: 情報の構造化（タイトル、URL、情報源、取得日時、カテゴリ、タグなど）
* Redmine: チケット化によるタスク管理、担当者割り当て、優先度設定
* WordPress: SEO対策、アフィリエイト管理、情報発信


```plantuml
@startuml
!define RECTANGLE class

skinparam packageStyle rectangle
skinparam backgroundColor white
skinparam handwritten false

' 情報収集トリガー
package "Information Triggers" {
    [Line Webhook] as LW #LightGray
    [Google Alert] as GA #LightGray
    [RSS Reader] as RSS #LightGray
    [IFTTT] as IFTTT #LightGray
    note right of IFTTT
        情報収集トリガー:
        - キーワード検知
        - 更新通知
        - SNS連携
        - 外部サービス連携
    end note
}

' 3層アーキテクチャ
package "Information Layer" {
    [WordPress] as WP #LightBlue
    note right of WP
        情報発信層:
        - ブログ記事公開
        - SEO対策
        - アフィリエイト
        - 読者交流
    end note
}

package "Knowledge Layer" {
    [BookStack] as BS #LightGreen
    note right of BS
        ナレッジ層:
        - 技術文書管理
        - バージョン管理
        - API仕様書
        - マニュアル類
    end note
}

package "Project Layer" {
    [Redmine] as RM #Pink
    note right of RM
        プロジェクト管理層:
        - チケット管理
        - タスク進捗
        - 工数管理
        - ワークフロー
    end note
}

' 情報の流れ
LW --> BS : LINE情報
GA --> BS : キーワード情報
RSS --> BS : 更新情報
IFTTT --> BS : 外部サービス情報

BS --> RM : タスク生成
RM --> BS : ステータス更新
BS <--> WP : コンテンツ同期

' データストア
database "Document Store" as DS #LightYellow
BS <--> DS : 保存/取得

@enduml

```

### RAG活用

このアーキテクチャは、BookStack（ナレッジ層）、Redmine（プロジェクト管理層）、WordPress（情報発信層）の3層構造に、RAGシステム（Vector Store、Embedding Service、LLM）を組み合わせた知識管理システムとなっている。

```plantuml
@startuml
!define RECTANGLE class

skinparam packageStyle rectangle
skinparam backgroundColor white
skinparam handwritten false

' RAGシステム
package "RAG System" {
    [Vector Store] as VS #LightYellow
    [Embedding Service] as ES #LightGreen
    [LLM (OpenAI API)] as LLM #Orange
    
    note right of VS
        - 文書ベクトル
        - メタデータ
        - インデックス
    end note
}

' 3層アーキテクチャ
package "Knowledge Sources" {
    [BookStack] as BS #LightGreen
    note right of BS
        - 技術文書
        - APIドキュメント
        - マニュアル
    end note
}

package "Task Management" {
    [Redmine] as RM #Pink
    note right of RM
        - チケット情報
        - 進捗データ
        - 工数情報
    end note
}

package "Content Publishing" {
    [WordPress] as WP #LightBlue
    note right of WP
        - 公開記事
        - コメント
        - アクセス分析
    end note
}

' 情報の流れ
BS --> ES : 文書ベクトル化
ES --> VS : ベクトル保存
RM --> ES : タスク情報
WP --> ES : 公開記事

VS --> LLM : コンテキスト提供
LLM --> WP : 記事生成
LLM --> RM : タスク分類
LLM --> BS : 文書要約

@enduml
```

### 今回の刷新のポイント

* おっさんなんで、ハイカラなものは苦手
* データも自社保有できる
* コストと情報保持の部分が大きい
RDS for PostgreSQLメジャーバージョンアップの事前検証でやったこと



# 目次
- [はじめに](#はじめに)
- [前提](#前提)
- [バージョンの選択](#バージョンの選択)
- [Postgresqlのリリースノート確認](#postgresqlのリリースノート確認)
- [検証環境で思い切ってバージョンアップ](#検証環境で思い切ってバージョンアップ)
- [パラメータグループの差分確認](#パラメータグループの差分確認)
- [既存のパラメータグループの確認](#既存のパラメータグループの確認)
- [製品の画面を操作して動作検証](#製品の画面を操作して動作検証)
- [おわりに](#おわりに)

# はじめに
チームで使用していたRDS for PostgreSQLのバージョンが12.17だったのですが、[リリースカレンダー](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/PostgreSQLReleaseNotes/postgresql-release-calendar.html)より2025年2月28日に標準サポートが終了してしまうため対応しました。
この手のバージョンアップは初めてで、「バージョンアップしても問題ないことをどうやって調べればいいんだ」という感じで行っていたため、今後のために備忘録として残します。

# 前提
- RDSのリソースはAWS CDKで管理している
- 事前確認はもちろん検証環境で行っている

# バージョンの選択
AWSの公式ドキュメントの[RDS for PostgreSQL のメジャーバージョンアップグレードの選択](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.MajorVersion.Process.html)でサポート可能なバージョンを選択します。
12.17に関して、最新のアップグレードターゲットは16.1だったため、16.1でひとまずバージョンアップすることにしました。
(最新のアップグレードターゲット以降のバージョンは選択できない)

# PostgreSQLのリリースノート確認
日本語版を参照しました。
12.17~16.1にあげるうえで懸念すべき点はないか確認しました。

https://www.postgresql.jp/

# 検証環境で思い切ってバージョンアップ
本番環境ではないし、最悪壊れたらバージョン戻せばいいだろうということで「えいっ」と思い切ってバージョンアップしました。
バージョンアップ後は統計情報再生成のため以下を実行しました。
```
ANALYZE VERBOSE;
```
参考↓

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.MajorVersion.Process.html


パラメータグループはCDK側で自動的に作成してくれる処理だったのでその辺は楽でした。

# パラメータグループの差分確認
バージョンアップした環境(検証環境)とまだバージョンアップしてない環境(本番環境)のパラメータグループを比較して、差分が出てきたパラメータに対して問題ないかも調査しました。
メリットがあったり、逆に問題がありそうなパラメータに関しては本番環境にRDSの変更を適用する際にはデフォルト値から値を変更しました。
やり方は以下を参考にしました

https://dev.classmethod.jp/articles/diff_rds_parameter/

20個近く差分があったので大変だった記憶はあります笑

各パラメータに関しては、AWSやPostgreSQLの公式ドキュメント、qiitaの記事などを参考にさせていただきました。中でも[@nuko_yokohama](https://qiita.com/nuko_yokohama)さんの記事はとても分かりやすくまとまっており、重宝していました。ありがとうございました:bow_tone2:

https://qiita.com/nuko_yokohama/items/68adcab33e004efeef66

# 既存のパラメータグループの確認
もともとパラメータの中でデフォルト値ではなく、値を明示的にセットしていたものもあったのでそれらが問題なく動いているかどうかも確認しました。
調べたパラメータ

```
pgaudit.role
shared_preload_libraries
pgaudit.log
pgaudit.log_catalog
pgaudit.log_relation
pgaudit.log_parameter
pgaudit.log_statement_once
rds.log_retention_period
log_min_duration_statement
```
# 製品の画面を操作して動作検証
いくら調べても実際に製品が動かなければ意味ないので、お客様の基本的な操作を開発側でも検証して問題ないかを調べました。特に動かなくなったとかはなく、問題がありませんでした。あとは実際に運用をしてみて様子を見る感じです。

# おわりに
最後まで読んでいただき、ありがとうございました。
僕のように初めてRDSのメジャーバージョンアップをやるがどうやって検証すればいいかわからないという方にとって少しでも参考になれば幸いです。

バージョン16.1も2025年3月31日に標準サポート終了するからまた対応しないといけないよなあ...
【Promise.all】複数の非同期処理を並列処理させる 

# はじめに
インターンの中でPromise.allというものに出会ったので勉強がてら少しまとめます。

# Promise.allとは？
Promise.allは複数の非同期処理を直列ではなく並列で処理できるメソッドです。
引数にはプロミスの配列などの反復可能な値が入ります。もし全てのプロミスが正常に処理された場合は結果の配列、1つでも正常に処理されなかった場合は即座にエラーが返ります。また処理は並列ですが返り値は引数で渡した順番と同じ順番で配列に格納されます。

例えば以下のような複数のプロミスがあるとします。
```js
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});
```
これらのプロミスをPromise.allの引数に渡して実行すると以下のような結果になります。

```js
Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});

// 結果: [3, 42, "foo"]
```

Promise.allは1つでもプロミスの処理が失敗すると即座にエラーが出て処理が止まりますが、もし1つのプロミスが失敗したとしても引数で受け取った全てのプロミスの処理を行いたい場合はPromiss.allSettledというのを使うみたいです。どちらを使うかは何を実現したいかで変わってきそうです。


# Promise.allを使うと良さそうな場面
実行順序が重要ではなく、各処理が互いに独立している場合はPromise.allを使うと良さそうです。

例えば以下のように引数で受け取った値を1秒後に解決する関数があるとします。
```js
function func(task) {
  return new Promise((resolve) =>
    setTimeout(() => {
      resolve(task);
    }, 1000)
  );
}
```

Promise.allを使う場合と使わない場合で以下のように書けます。
```js
const tasks = [1, 2, 3]

// Promise.allで並列処理する場合
async function usePromiseAll() {
  await Promise.all(tasks.map(func));
}

// for ofで直列処理する場合
async function useForOf() {
  for (const task of tasks) {
    await func(task);
  }
}
```

単純計算でPromise.allを使う場合はtasksの値が全て並列で処理されるので1秒、forで行なっている方は1つ1つ実行するので3秒かかることになります。


# おわりに
あまり直列や並列という考えが今までなかったので勉強になりました。

# 参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
【PHP】Allowed memory size of *** bytes exhausted エラーの対応

## エラー内容
`
PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes) in ファイルパス on line 〇〇
`
処理に必要なメモリサイズが、PHPのメモリ使用上限設定（memory_limit）を超えてます！！！

## 対策1　そもそもメモリを使いすぎない実装にする
コードを見直しましょう。
- 非効率なロジックになっていないk

## 対策2 メモリ上限を上げる
- まず、現在のPHPのメモリ上限を確認します
```bash
php -i | grep memory_limit
```
memory_limit => 512M => 512M のように表示されます。

- php.ini ファイルを編集して、 メモリ上限を変更します。（vim以外でも可）
    - ファイルの場所は`php -i | grep php.ini`で探します
```bash
vim /opt/homebrew/etc/php/7.3/php.ini
```
memory_limit の設定を検索し、適切な値に変更します。
※vimだと/memory を入力すると対象箇所が検索できます。

memory_limit = 1024M など、に適宜書き換えます。

変更後、もう一度メモリ上限が適用されているか確認します。

```bash
php -i | grep memory_limit
```

必要に応じて、PHPを再起動します。

```bash
brew services restart php
```
bundle install 実行時の Don't run Bundler as root という警告を無視する

# 方法

root ユーザで `bundle install` コマンドを実行すると、毎回以下の警告が表示される。

```shell-session
# bundle install
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.
```

> Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.
>
> Bundler を root として実行しないでください。Bundler は必要であれば sudo を要求することができます。root としてあなたのバンドルをインストールすると、このマシン上の全ての非 root ユーザーに対してこのアプリケーションを壊してしまいます。

「分かっとるわい！」という場合、`silence_root_warning` という設定を有効にすることで、この警告を非表示にすることができる。

```shell-session
# bundle config silence_root_warning true
```

# 参考

- [Bundler: bundle config](https://bundler.io/v2.6/man/bundle-config.1.html)
Windowsで独自のショートカットキーを作る方法の流れ

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

Windowsで、AutoHotKeyというフリーソフトを使用して独自のショートカットキーを作る方法の流れです！

# 流れ
## AutoHotKeyをダウンロード

こちらからダウンロード＆インストールしましょう〜↓

https://www.autohotkey.com/

## ショートカットキーのファイルを作る
ChatGPTに作ってもらいましょう！
> AutoHotKeyで、Ctrl+Win+↑で音量アップ、Ctrl+Win+↓で音量ダウンするショートカットキーを作ってください

みたいな感じで！

## 作ったファイルをダブルクリックで起動する
これにてショートカットキーが使えるようになっています🙌🙌

## （おまけ）毎回起動するのが大変なので、スタートアップ登録
1. 作ったAutoHotKeyのファイルを右クリックし、ファイルのショートカットを作成
1. Win+Rで開いた画面にて`shell:startup`を入力しエンター
1. 開いたエクスプローラーに、AutoHotKeyファイルのショートカットを置く！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/e6bb1b7a-8490-5013-62e2-2b85ce13ffb7.png)

# おわりに
お読みいただきありがとうございました。
どなたかの参考になれば嬉しいです。
[Swift] 補色 と 反対色

　
Swift言語に限った内容ではありませんが、


# 補色 と 反対色

補色 と 反対色 は、異なる色です。

- 補色　：色相上 正反対に位置する色
- 反対色：色相だけでなく 明度や彩度も 反対に位置する色

<br>

![color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ac48ef99-6237-466e-8136-430bfdc9abc1.png)


# コード

`UIColor`/`NSColor`から **補色** と **反対色** を求める Swift のコードです。

```swift:Swift
#if os(macOS)
typealias UIColor = NSColor
#endif

extension UIColor {
    
    //補色を求める
    var complementaryColor: UIColor {
        guard let (r, g, b, a) = self.getRGBA() else { return self }
        let mix = [r, g, b].min()! + [r, g, b].max()!
        return UIColor(red: mix - r, green: mix - g, blue: mix - b, alpha: a)
    }
    
    //反対色を求める
    var oppositeColor: UIColor {
        guard let (r, g, b, a) = self.getRGBA() else { return self }
        return UIColor(red: 1 - r, green: 1 - g, blue: 1 - b, alpha: a)
    }

    //RGBAを求める
    func getRGBA() -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat)? {
        var r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat
        (r, g, b, a) = (0, 0, 0, 0)
#if os(macOS)
        self.getRed(&r, green: &g, blue: &b, alpha: &a)
#else
        guard self.getRed(&r, green: &g, blue: &b, alpha: &a) else { return nil }
#endif
        return (r, g, b, a)
    }

    //おまけ
    //RGB を 0-255 で指定するイニシャライザ
    convenience init(_ r: Int, _ g: Int, _ b: Int) {
        self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: 1)
    }
}
```

---

今さらの内容ですが、補色の求め方を間違って理解していたので、ここに残しておきます。

**以上**
g_userについて【ServiceNow】

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# `g_user` とは？
- `g_user` は、現在ログインしているユーザーの情報を取得するためのオブジェクトである
- ServiceNowのクライアントスクリプト（Client Script）やUIスクリプトで使用できる

# `g_user` の主なメソッドとプロパティ

### 1. `g_user.userID`
- 現在のユーザーのSys IDを取得する
- 例
```javascript
  console.log(g_user.userID);
```

### 2. `g_user.userName`
- 現在のユーザーのユーザー名を取得する
- 例
  ```javascript
  console.log(g_user.userName);

### 3. `g_user.hasRole(roleName)`
- 指定したロールをユーザーが持っているか確認する
- 戻り値: true（持っている）または false（持っていない）
- 例
    ```javascript
        if (g_user.hasRole('admin')) {
        console.log('このユーザーは管理者です。');
    } else {
        console.log('管理者権限がありません。');
    }
    ```

### 4. `g_user.hasRoles()`
- ユーザーが1つ以上のロールを持っているか確認する
- 戻り値: true（1つ以上のロールあり）または false（ロールなし）
- 例
    ```javascript
    if (g_user.hasRoles()) {
        console.log('ユーザーには少なくとも1つのロールがあります。');
    } else {
        console.log('このユーザーにはロールがありません。');
    }
    ```
### 5. `g_user.isLoggedIn()`
- ユーザーがログインしているかどうかを判定する
- 戻り値: true（ログイン済み）または false（未ログイン）
- 例
    ```javascript
    if (g_user.isLoggedIn()) {
        console.log('ユーザーはログインしています。');
    } else {
        console.log('ユーザーはログインしていません。');
    }
    ```
### `6. g_user.getFullName()`
- ユーザーのフルネームを取得する
- 戻り値: string（ユーザーのフルネーム）
- 例
    ```javascript
    console.log(`ユーザーのフルネーム: ${g_user.getFullName()}`);
    ```

# まとめ
- g_user は、現在ログインしているユーザーの情報を取得し、UIの制御に役立てることができる便利なオブジェクトである
- 特定のロールを持っているかのチェックや、ユーザー情報の表示などに活用できる
PerplexityのDeepResearchに、AI業界の最新動向と成功するキャリア戦略を聞いてみた

:::note warn
注意
本記事は**Perplexity**の**DeepResearch**を使用し、その出力結果をそのまま掲載しています。内容の正確性についてはご自身でご確認ください。(僕も)
:::




# AI業界への就職を成功させるための2025年最新ガイド

人工知能（AI）業界は2025年現在、技術革新の最前線として世界中から注目を集める成長分野です。世界経済フォーラムの報告によると、AI関連職種の需要は2030年までに年平均32%の成長率を見込んでおり、特に深層学習技術者の需要が顕著に増加しています。本稿では、AI業界への参入を目指す方々に向け、業界動向分析から具体的なキャリア構築手法までを体系化した実践的ガイドを提供します。



## 業界構造と主要セクターの最新動向

### 技術基盤分野の進化
2025年のAI業界は、従来の機械学習に加えて**量子コンピューティング統合技術**が実用段階に入りつつあります。主要クラウドプロバイダーが量子機械学習APIを一般公開する中、従来のニューラルネットワークモデルでは処理不可能な複雑な最適化問題への対応が可能になりました。  
特に**医療分野**では、量子AIを用いた創薬プロセスの高速化が注目を集め、大手製薬企業とAIスタートアップの共同研究が活発化しています。

### アプリケーション分野の拡大
- **製造業**：AI品質管理システムの導入率が75%に達し、統計的工程管理手法を超える異常検知精度を実現。
- **小売業**：行動予測AIとAR技術を組み合わせた仮想試着システムの普及により、ECサイトのコンバージョン率が向上。
- **金融業**：分散型AIによるリアルタイムリスク評価モデルが規制当局の認可を得て、与信管理プロセスに本格導入。


## 必須技術スキル体系

### コアプログラミング能力
- **Python**と**R言語**に加え、**Julia言語**の習得が先端研究分野で求められる傾向。
- **PyTorch 3.0**と**TensorFlow Quantum**の連携運用スキルが機械学習エンジニアの採用選考で重視。

### 数学的基礎理論
- **微分幾何学**と**トポロジーデータ解析**の基礎理解が必須。
- 多様体学習と層状ニューラルネットワークの数学的基盤が主要大学のAI学科で必修化。



## 戦略的キャリア開発手法

### 能力可視化戦略
- **GitHubポートフォリオ**ではMLflowを用いた**実験トラッキング**の実装が期待される。
- **Kaggleコンペティション**では、メダル獲得だけでなく、**独自の特徴量エンジニアリング手法**の技術ブログ発信が有効。

### ネットワーク構築戦略
- **国際学会**でのポスター発表実績が新卒採用の評価基準に含まれる傾向。
- **オープンソースプロジェクト**（PyTorch EcosystemやApache MXNet）への継続的コントリビューションが実務適性の証明に。



## 資格戦略と継続的学習

### 技術者認定制度
- **IEEE Certified AI Professional (CAIP)** 資格がグローバルスタンダードに。
- **IPAのAIエンジニア検定**が国家プロジェクト認定資格としての地位を確立。

### 学際的知識体系
- **AI倫理審査官資格**制度がISO規格化され、AIシステムの社会的影響評価スキルの標準化が進行。
- **EU人工知能法対応コンサルタント資格**が欧州市場進出支援専門職として需要拡大。


## 採用市場の最新傾向

### 選考プロセスの高度化
- **LeetCode形式**のアルゴリズム課題に加え、**実データセットを用いたEDA（探索的データ分析）課題**が課される傾向。
- **グループディスカッション**では、倫理的ジレンマを含むAI応用ケーススタディが評価基準に。

### 給与体系の多様化
- **深層学習研究者の初任給**が年収800万円〜1200万円台に到達。
- **強化学習専門家**の報酬水準が突出し、年収2000万円台の例も。



## 業界別キャリアパス

### 医療AI分野
- **AIバリデーション専門家**の需要が急増し、治験データの匿名化処理技術とGXP準拠のモデル検証スキルが求められる。
- **臨床工学技士資格とAI技術者資格**のダブルライセンス取得が有効。

### 金融AI分野
- **暗号資産市場の変動予測AI開発者**がヘッジファンドから高く評価される。
- **時系列解析＋強化学習のスキル**が年収2000万円超えのキャリアパスに直結。



## 長期的キャリアビジョン

### 技術経営（MOT）への展開
- **CTO候補育成プログラム**で**AI技術戦略策定能力**が最重要選考基準に。
- **分散型AIガバナンスモデルの設計経験**が大企業経営陣の昇進要件化。

### 国際標準化への参画
- **ISO/IEC JTC 1/SC 42**のAI規格策定作業への参加経験がグローバル企業の執行部登用条件に。
- **倫理的AI認証スキーム**策定に携わった専門家のキャリアパスが急成長。



## 結論

AI業界への参入を成功させるためには、**技術的専門性と業界固有の課題解決能力の深化が不可欠**です。  
2025年現在、**量子機械学習**と**倫理的AIガバナンス**の分野で人材不足が発生しており、これらの領域で早期に専門性を確立することがキャリア加速の鍵となります。  

継続的な技術進化に対応するため、以下の学習戦略が有効です。  
- **MOOCを活用したマイクロクレデンシャルの取得**
- **オープンソースプロジェクトへの能動的参加**

AI業界のダイナミックな発展をキャリアチャンスと捉え、**技術的深掘りと業界横断的視野の拡大を両立**させた職業設計が成功への道標となります。


## 参考文献
- https://www.dlri.co.jp/report/ld/413916.html
- https://tensyoku-kenkyujo.com/aijidainiikinokoru-shikaku/
- https://ai-shikaku.com/ai/dx-shikaku/
- https://forbesjapan.com/articles/detail/74306
- https://note.com/onchaba/n/n4d53b1118b01
- https://note.com/powertravelers/n/n3089a3aa251f



追記
- 全然わからなかったので個人で調べ直します。
On the Field Edit page our "Promote to Global Value Set" button is greyed out.  [フィールド編集] ページでは、[グローバル値セットに昇格] ボタンがグレー表示になっています。


+ [How can we get our "Promote to Global Value Set" button on the edit page of a field to be active?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A7lIFSAZ)

:::note
このオプションは、選択リスト項目で「選択リストを値セットで定義された値に制限する」オプションがチェックされている場合に有効になります。

The option will be enabled if "Restrict picklist to the values defined in the value set" Option is checked on the Picklist Field.
 
See the below image

Before: - 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e3df5b3a-f1bb-4d54-9a44-8db6990a6260.png)

After 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d2032ea5-b69a-4486-839e-84654f270951.png)

What you need to do is Edit the picklist field and check "Restrict picklist to the values defined in the value set" and Save. Edit again and you will get the Option enabled.


行う必要があるのは、選択リストフィールドを編集し、「選択リストを値セットで定義された値に制限する」にチェックを入れて保存することです。再度編集すると、オプションが有効になります。
:::

+ [Promote to Global Value Set is not available on the Macaron Flavor field, the check box Restrict picklist to the values defined in the value set is greyed out. Is it possible to undo previous promotion on this field?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000TTIr)

:::note
According to my guess, there is no chance to use the Promote Global Value Set button twice on the same field. The Restrict picklist to the values check box will be grayed out (de facto disabled - it cannot be checked) on a field where someone has already used the Promote Global Value Set button before. I was only able to complete the task after I deleted the already existing picklist field (Macaron Flavor) and replaced it with a new one field (doing this work was a bit pointless, but before I followed the instructions from the content of the lesson). 

私の推測では、同じフィールドで [グローバル値セットの昇格] ボタンを 2 回使用する機会はありません。誰かが以前に [グローバル値セットの昇格] ボタンを使用したことがあるフィールドでは、[選択リストを値に制限] チェック ボックスがグレー表示されます (事実上無効 - チェックできません)。既存の選択リスト フィールド (Macaron Flavor) を削除し、新しいフィールドに置き換えた後でのみ、タスクを完了できました (この作業を行うのはやや無意味でしたが、レッスンの内容の指示に従う前に行いました)。 
:::
IBM i Services Directory : QSYS2.NETSTAT_Info ビュー

前回ご紹介した[QSYS2.NETSTAT_Interface_Info ビュー](https://qiita.com/gomAnomalocaris/items/aa6bdde598cf8863dfcf)が1つのIBM i 側のIPアドレスに対して1行返すのに対して、こちらの場合は、ポート毎、リモートからの接続毎に１行を返します。（つまり、5250 NETSTATコマンドと同じフォーマットで返してくれます。）

## 概要
■ビュー名：QSYS2.NETSTAT_INFO
■カテゴリ：通信サービス
■サポート：IBM i 7.2 SF99702 Level 9以降, IBM i 7.3 SF99703 Level 11以降 で拡張
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-netstat-info-view

## 実行例①

```
SELECT * FROM QSYS2.NETSTAT_INFO
```

WHERE句を指定しないと下記のようにちょうどNETSTAT コマンドと同様な結果が返ります。ただしSQLですので、NETSTATコマンドではオプション5 詳細の表示をしないと見えない情報も一括で取得できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c7b63f9c-8766-41b0-bf59-e2c26bf3419d.png)

## 実行例②

こちらはマニュアル記載のサンプルで、WHERE句に接続時ユーザー名 QLWISVR　を指定しています。QLWISVR はLight Weight Integration SerVeR の略だと思いますが、IBM i 上で実行されるAPサーバーのデフォルトユーザー名です。IBM i のAPサーバーはかつてはWAS Express, BASE版をIBM i 対応したものでした、近年のそれはWAS Libertyベースになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ea2bcd9e-b098-4af5-8df1-026e780bc95f.png)

実行時点で当システム上でクライアントからの接続が無かったため、、ちょっと寂しいですが(^^;どのような情報が返るかはお分かりいただけると思います。local-port-name欄がas-admin2-httpなどとなっていることからこれはLibertyのそのもののポート使用情報だと分かります。

## 実行例③
実行例②の接続時（バインド時）ユーザー名をQUSERにすると一般的な接続ポート情報が取得できます。QUSERはバインド時に指定されるユーザーIDとして最も一般的です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b66dcd68-ef34-4aef-b151-9baa77d61eb8.png)
Oracle 19c SQLモニタリング方法

# この資料について

Oracle Database 19cには、リアルタイムSQL監視の機能がある。
リアルタイムSQL監視を有効にする方法を記載する

## モニターの適用条件

### 公式ドキュメントより抜粋

https://docs.oracle.com/cd/F19136_01/tgsql/monitoring-database-operations.html#GUID-573B83E0-15D4-4132-9ABE-91FB5D398B9C


> 単純データベース操作
>
>単一のSQL文、あるいは単一のPL/SQLサブプログラムはシンプル・データベースの操作です。SQL監視機能が有効な場合は、次のいずれかの条件が満たされるときに、データベースは単純データベース操作を自動的に監視します。
>
>- SQL文やPL/SQLのサブプログラムが、CPUまたはI/O時間を1回の実行で5秒以上消費した
>- SQL文がパラレルで実行される
>- SQL文で/*+ MONITOR */ヒントを指定している
>- イベントsql_monitorで監視対象の文のSQL IDのリストを指定している
>   - たとえば、次の文では、SQL ID 5hc07qvt8v737と9ht3ba3arrzt3に対してインスタンス・レベルの監視を強制しています

### 結論：ヒント区が安定

- /*+ MONITOR */ヒントを一時的に設定することでクエリをキャプチャすることが可能

## SQLレポートの出力方法

### 公式ドキュメントより抜粋

https://docs.oracle.com/cd/F19136_01/tgsql/monitoring-database-operations.html#GUID-11748F62-BE24-4511-B77B-F28D5E443A0A


```sql

SET FEEDBACK OFF
SET TERMOUT OFF
SET TRIMSPOOL ON
SET TRIM ON
SET PAGES 0
SET LINESIZE 1000
SET LONG 1000000
SET LONGCHUNKSIZE 1000000

SPOOL /tmp/long_sql.htm
SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(
         report_level => 'ALL', 
         TYPE         => 'active') 
FROM   DUAL;
SPOOL OFF

```