OmniAICreator/Qiita-1.07M huggingface dataset:
KtorでAuto-reloadを設定し開発効率を上げる

学習メモ。開発時にソースを書き換えた後、いちいちサーバーを止めて再起動させるのは非常にめんどくさいので自動リロードを設定する方法を書く。

基本的にはドキュメントのまま。

https://ktor.io/docs/server-auto-reload.html#watch-paths

# `application.yaml`を修正

```diff
ktor:
    application:
        modules:
            - com.example.ApplicationKt.module
+    development: true
    deployment:
        port: 8080
+        watch:
+            - classes
```

`watch`はリソースの変更監視対象を書く。`resources`も対象にしたい場合は、`classes`の下にさらに追加すればよい。

# 変更時に再コンパイルされるように設定する

以下がそのコマンド。

```
./gradlew -t build -x test -i
```

テストを無視するために`-x test`を追加する。

これをIntelliJの実行構成に`recompile`として登録しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584722/e2dfa79e-e9a9-4413-855d-3d3617a071f9.png)

# 検証

`Application.kt`でサーバーを起動後、`recompile`を実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584722/f929d934-7add-42bc-b30b-02ebcf39cb91.png)

この時点で`http://0.0.0.0:8080/`へアクセスすると次のように表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584722/e14e90c8-71a8-4e5b-a261-356773244df7.png)

今度は`Routing.kt`を以下のように修正する。

```kotlin
package com.example

import io.ktor.http.*
import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.application.*
import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import org.jetbrains.exposed.sql.*
import org.koin.dsl.module
import org.koin.ktor.plugin.Koin
import org.koin.logger.slf4jLogger

fun Application.configureRouting() {
    routing {
        get("/") {
-            call.respondText("Hello Ktor!!")
+            call.respondText("Hello Ktor!! Reloaded!!")
        }
    }
}
```

保存すると再コンパイルが走る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584722/02d779f5-ab6e-4337-978d-a6eb19e715b1.png)

この状態で`http://0.0.0.0:8080/`へアクセスすると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584722/c1650982-b66b-48cc-8caf-99127c3a1cdd.png)

LGTM👍
🧾 `systeminfo`で確認できるWindowsシステム情報の用語解説一覧

# 🧾 `systeminfo`で確認できるWindowsシステム情報の用語解説一覧

Windowsでは `systeminfo` コマンドを使うことで、OS・ハードウェアの詳細情報を一括で取得できます。
本記事では、その中でも**よく使う代表的な項目**をサンプル付きで一覧表にまとめました。

---

## 📋 システム情報の項目解説

| 項目名            | 例（サンプルデータ）                     | 意味・用途                                     |
| -------------- | ------------------------------ | ----------------------------------------- |
| **システムモデル**    | `XPS 15 9500`                  | PCの機種やマザーボード型番を示す。パーツの互換性やドライバ検索時に使用。     |
| **ホスト名**       | `DESKTOP-ABCD123`              | ネットワーク内でPCを識別する名前。共有フォルダやリモート接続などに使用される。  |
| **BIOSバージョン**  | `Dell Inc. 1.14.0, 2023/01/10` | PC起動時に動作する基本ソフトのバージョン。ハードウェア制御や起動順序などを管理。 |
| **システム起動時間**   | `2024/12/01, 08:23:10`         | 最後にPCが起動された日時。現在までの稼働時間の目安となる。            |
| **OS 名**       | `Microsoft Windows 11 Pro`     | インストールされているOSの名称。エディションや環境確認に役立つ。         |
| **OS バージョン**   | `10.0.22621 ビルド 22621`         | OSの内部バージョン番号。アップデート状況や不具合調査で活用。           |
| **物理メモリの合計**   | `32,768 MB`（≒32 GB）            | 搭載されているRAMの総容量。作業速度や同時処理能力に直結。            |
| **利用可能な物理メモリ** | `24,576 MB`（≒24 GB）            | 現時点で空いているRAM容量。処理負荷の目安になる。                |
| **システム製造元**    | `Dell Inc.`                    | PCまたはマザーボードのメーカー名。                        |

---

## 💡補足メモ

### 🖥 ホスト名を変更するには

「設定」>「システム」>「バージョン情報」>「このPCの名前を変更」から変更可能。

---

### ⚠ BIOS更新時の注意

* BIOSはPCの基本制御ソフト。更新すると動作が改善されることもあるが、失敗すると起動できなくなるリスクもある。
* 慣れていない場合や不具合がない場合は**無理に更新しない**のが安全。

---

### 🔁 システム起動時間の活用

* PCが長時間起動したままになっていないか確認できる
* トラブル時には「再起動して改善するか」の判断材料にもなる

---

## ✅ コマンド実行例

```cmd
systeminfo
```

> コマンドプロンプト（cmd）で上記を入力するだけで、すべての情報が表示されます。

---
Serverless Frameworkを使ってX botを作成してみた

## 概要
X（旧Twitter）上には、某格闘ゲームの技名や、某テレビ番組の名前をランダムに並び替えて投稿するbotがありますよね。
今回の記事では、Serverless Frameworkを使って簡単にX botを作成します！

## 準備
#### nodeのインストール
```
$ brew install node
```
#### Serverless Frameworkのインストール
```
$ npm i serverless -g
```
#### awscliのインストール
```
$ brew install awscli
```
次に**IAMを作成**して、発行したアクセスキーとシークレットアクセスキーをAWS CLIに設定します。（IAMの作成方法については今回は省略します。）
```
$ aws configure
AWS Access Key ID [None]: アクセスキーを入力
AWS Secret Access Key [None]: シークレットアクセスキーを入力
Default region name [None]: 
Default output format [None]: 
```
次に、プロジェクトを作成しましょう！

### プロジェクト作成
`sls`コマンドを入力すると、プロジェクトを作成できます。
入力を求められたら以下を参考に適当に進めてください！
```
$ sls
✔ Select A Template: · AWS / Node.js / HTTP API
✔ Name Your Project: · xbot
✔ Create Or Select An Existing App: · Create A New App
✔ Name Your New App: · xbot
```
プロジェクトが作成されたら、ディレクトリを移動します。
```
$ cd xbot
```
以上で準備は完了です！

## 実装
`handler.js`ファイルを以下の内容に書き換えます。
今回は「Switch2当選しますように！」と複数回呟くコードにしています。（現在の筆者の心の叫び）
この部分は好きに書き換えてください。
```js:handler.js
const { TwitterApi } = require('twitter-api-v2');

// ツイート内容を生成
const makeTweet = () => {
  const times = Math.floor(Math.random() * 5) + 1;
  return Array(times).fill('Switch2当選しますように！').join(' ');
};

// ツイート処理
module.exports.hello = async () => {
  const twitter = new TwitterApi({
    appKey: process.env.X_API_KEY,
    appSecret: process.env.X_API_KEY_SECRET,
    accessToken: process.env.X_ACCESS_TOKEN,
    accessSecret: process.env.X_ACCESS_TOKEN_SECRET,
  });
  
  const result = await twitter.v2.tweet(makeTweet());
  
  return { 
    statusCode: 200, 
    body: JSON.stringify({ message: 'succeed!' }) 
  };
};
```
### 環境変数の設定
プロジェクト直下に`env.yml`ファイルを作成し、以下の情報を記述します。
これらの値は、[Xの開発者ポータル](https://developer.x.com/ja/docs/x-api)から発行してください！
※発行した後、ツイートできるように開発者ポータルで権限を修正する必要があるので注意してください。
```yml:env.yml
X_ACCESS_TOKEN: xxx
X_ACCESS_TOKEN_SECRET: xxx
X_API_KEY: xxx
X_API_KEY_SECRET: xxx
```

### 設定ファイルの編集
`serverless.yml`の`provider`に以下の行を追加します。
```yml:serverless.yml
provider:
  name: aws
  runtime: nodejs20.x
  environment: ${file(./env.yml)} # 追加
```

### 必要なパッケージのインストール
```
$ npm install twitter-api-v2
```
## いざ、AWSへデプロイ
以下コマンドを実行すると、AWS Lambdaにアップロードされます。
```
$ sls deploy
```
デプロイが完了すると、エンドポイントURLが表示されます。
そのURLにアクセスするとLambda関数が実行され、ツイートが投稿されます！
レスポンスとして`{"message":"succeed!"}`と返ってきたら成功です！🎉
自分のXアカウントを確認して、投稿されているか確認しましょう！

![スクリーンショット 2025-06-18 23.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3446245/b02a531a-8ebb-4032-9dcf-d54e8567ab47.png)

できてそうですね！
このままだと毎回URLにアクセスする必要がありますが、EventBridgeを使って定期実行するように設定することもできます。設定方法は今回は省略しますが、比較的簡単にできるので、ぜひ試してみてください。

### デプロイしたLambda関数の削除方法
以下コマンドを実行することで、今回デプロイしたリソースを削除できます。
```
$ sls remove
```
## まとめ
今回はServerless Frameworkを使って、簡単にX botを作成しました。Amazon Bedrockなどと連携してAIに内容を考えさせて投稿するbotなども作ることができるので、ぜひ色々な応用を効かせて楽しんでみてください！
Test-NetConnectionでAzure VMへの疎通確認

#### 検証１：成功パターン
1.Azure VMのNSGのinbound規則でClient IPから3389 port通信を許可します。
（補足：VMのNSGはいつも二つ付いています。NicのNSGとSubnetのNSG。それ両方を穴あけする必要があります。）

2.Test-NetConnectionで疎通確認がTure

PS C:\WINDOWS\system32> Test-NetConnection 20.18.X.X -Port 3389            ComputerName     : 20.18.X.X
RemoteAddress    : 20.18.X.X
RemotePort       : 3389
InterfaceAlias   : Wi-Fi
SourceAddress    : 192.168.0.3
TcpTestSucceeded : True

3.RDPで接続してみたが、成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/64c6af1c-2195-4e07-b434-16bee6cacea5.png)

ちなみに、好奇心でこのAzure VMからさらにAzure Application Gateway にTest-NetConnectionで疎通確認してみました。同じAzure内部のリソースで何か違うでしょう。
でも結果は同じです。App GW側のNSGが許可していないので、Azure上のVMでもfalseになります。これは予想された挙動です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/0ecfeb42-7131-4d0d-bb28-883f62d47ff1.png)


#### 検証２：失敗パターン

1.Azure VMのNSGのinbound規則でClient IPから3389 port通信の許可規則を削除します。

2.Test-NetConnectionで疎通確認がFalse
PS C:\WINDOWS\system32> Test-NetConnection 20.18.X.X -Port 3389            ComputerName     : 20.18.X.X
RemoteAddress    : 20.18.X.X
RemotePort       : 3389
InterfaceAlias         : Wi-Fi
SourceAddress          : 192.168.0.3
PingSucceeded          : False
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

3.RDPで接続してみたが、それも失敗です。

発見：
失敗のパターンでNSG許可しない前提ですが、
AppGWの場合は、TcpTestSucceeded : Falseですが、PingSucceeded : Tureですね。
Azure VMの場合は、両方Falseになります。なぜでしょう。
すべての年齢のユーザーに対する Gemini アプリへのアクセスを管理する（日本語訳）

### [すべての年齢のユーザーに対する Gemini アプリへのアクセスを管理する](https://support.google.com/a/answer/16309563)

*この機能がサポートされているエディション: すべての Education エディション。[ご自身のEditionを比較する](https://support.google.com/a/answer/6043385)*

Gemini アプリは、Gmail、Google カレンダー、ドキュメントなどと同様に、Google Workspace for Education アカウントにログインしているすべての年齢のユーザーに対してデフォルトで「オン」となるコアサービスになりました。コアサービスとして、Gemini アプリは [Google Workspace for Education 利用規約](https://workspace.google.com/terms/education_terms/)の対象となります。

### 「オン」がデフォルトになる展開

**既存のアカウント** — Google アカウントに変更が加えられる前に、Gemini アプリがコアサービスになり、デフォルトで「オン」になることを通知するMSA（必須サービスアナウンス）が届きます。管理者にも、Google 管理コンソールを通じて今後の変更が通知されます。45日間のオプトアウト期間が設けられており、この期間中に組織への Gemini アプリの提供をオプトアウトできます。8月1日までにオプトアウトしない場合、8月に組織のトップレベルでGeminiアプリがコアサービスとしてオンに切り替えられます。Gemini アプリがオフになっている下位組織部門がある場合、その設定に変更はなく、その組織部門ではアプリはオフのままになります。

この変更は、2025年8月中に段階的に展開されます。

**新規アカウント** — Gemini アプリは、2025年8月より新規の Education アカウントに対してデフォルトで「オン」になります。

既存のアカウントで、Gemini アプリを組織で「オン」にしたくない場合は、以下の手順に従って管理コンソールでオプトアウトしてください。

### Gemini アプリのオプトインまたはオプトアウト

1. 管理者アカウントで Google 管理コンソールに[ログイン](https://admin.google.com/)します。管理者アカウントを使用していない場合は、管理コンソールにアクセスできません。
2. [このリンク](https://admin.google.com/ac/managedsettings/453172576738/default_opt_out)をクリックして、オプトアウトページにアクセスします。これには、[サービス > Gemini アプリ > Gemini 設定](https://support.google.com/a/answer/1219251)の管理者権限が必要です。
3. **Gemini 有効化**に移動し、**オプトアウト**をクリックします。
4. **保存**をクリックします。

**注記:** オプトアウトの選択は、Gemini アプリが2025年8月に有効になった際に適用されます。有効になった後でも、管理コンソールを通じていつでも Gemini アプリへのアクセスを制御できます。

変更が反映されるまでに最大24時間かかる場合がありますが、通常はより迅速に反映されます。[詳細はこちら](https://support.google.com/a/answer/7514107)。

### Related topics
[Google Workspace for Education Core and Additional services](https://support.google.com/a/answer/6356441)
[Turn a service on or off for Google Workspace users](https://support.google.com/a/answer/182442)
[Turn on or off new services by default](https://support.google.com/a/answer/82691)
[Gemini for Google Workspace](https://support.google.com/a/answer/13623623?hl=en&co=DASHER._Family%3DEducation)

---
### 参考情報

[教育機関向け Gemini および NotebookLM クイックスタートガイド（日本語訳）](https://qiita.com/kotatsurin/items/9ef1346ebc554cacbbfb)
Check if ‘Customer Support’ is the topic assigned to the ‘When will my bike arrive?’ article.

+ [Check if ‘Customer Support’ is the topic assigned to the ‘When will my bike arrive?’ article.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Tj765)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8d113ee8-4376-4aed-b14d-9362b3c2a16d.png)

+ [Module Add Knowledge to the Site Using Topics - Error "Check if ‘Customer Support’ is the topic assigned to the ‘When will my bike arrive?’ article."](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Tj7AC0AZ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e9933619-b6b4-4134-a0ad-d23d57b4d706.png)
Advanced Seller Home

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

---------------


# トライアル版では機能しない

+ [Can't go further the step 6 - "For Advanced Seller Home, toggle the setting to Inactive".](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkllQ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3aa547c9-ec87-4389-a7ab-f4a11684e5cb.png)

# Spring 24での変更、バグ？

+ [【公式】Salesforce Spring '24 documentation review request](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIPVFSA5)

+ [Cannot find where to set Quarterly Goal in Playground](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvfsV)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e843d0a7-b57e-5e58-9acd-d995720f9c76.png)


:::note
On the Home menu deactivate "Advanced Seller Home"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3a407859-e30b-2ba6-6693-54e8a1069180.png)
:::

:::note
Try deactivate "Advanced Seller Home" 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/08b6c90e-56bb-c0ef-5a64-66d39dcd8840.png)

:::
「Agentforceでセールスコーチングを有効にする」というチャレンジのプレイグラウンド組織では、UIがかなり異なります。


+ ["I'm unable to access the Agentforce Sales Coach settings in Trailhead. Is there a specific step or permission I might be missing? How can I enable or view these settings?"](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkbyB0AR)

:::note
They have updated the Trailhead to reflect the new UI. Now if we just go back into the trail head and follow the steps, we should be able to complete it.  

If you have issues with the demo org, please disconnect it, create a new demo org and follow the trail.  

Thats how I was able to complete it. 

Trailhead が新しい UI を反映するように更新されました。Trailhead に戻って手順に従えば、完了できるはずです。

デモ組織で問題が発生した場合は、接続を解除し、新しいデモ組織を作成して Trail に従ってください。

私はその方法で完了できました。
:::


+ [In my playground org for the challenge "Enable Sales Coaching in Agentforce" the UI is quite different](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SXQfF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cf73a93c-77b1-4bd6-91c2-336a47b51868.png)

:::note
https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SXQfF
:::

+ [i have tried every option but it does not work never showing enable all option in sales coach](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkbwA0AR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/714e2eb3-2120-4a86-8a0c-99e79edb1a93.png)

+ ["I'm unable to access the Agentforce Sales Coach settings in Trailhead. Is there a specific step or permission I might be missing? How can I enable or view these settings?"](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkbyB)

:::note alert
Page not found   

The page you requested was not found, or you do not have permission to view this page." 

if you click "Agentforce Sales Coach" in setup. 
:::
動的関連リスト - 単一コンポーネントのエラー



Data Cloudのお題のところでエラーになているので、プレイグランドの一連の不具合ではないかと思うけど...

+ [関連リスト フィールドへの「フィールドの追加」オプションに「最大フィールドが追加されました。別のフィールドを追加するには削除してください」と表示されていますが、リストされているフィールドはレコード ID の 1 つだけであり、これを削除したり、さらにフィールドを追加したりすることはできません。  ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000T)
+ [データクラウドとCRMをエンリッチメントで接続 - フィールドを追加できない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkwMt0AJ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b822bcd6-f7bd-488d-9c71-680b68d429e1.png)

+ [Connect Data Cloud and CRM with Enrichment - Unable to add fields](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkwMt)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/525f78f6-41bd-46f6-a683-0e99a1c403f3.png)

+ [Data Cloud Related List exists, but it’s not yet on any page layouts](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TkoC9)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d3747098-86d5-4b1f-918d-0c8c051d1b21.png)

+ [Bring External Data into the Contact Page Layout](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SY2E10AL)
+ [Not getting other fields in Lightning Record Page of Contact for Adding Dynamic Related List for Reservation.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TlCPs0AN)
プロデル、調査 その49

# 概要
プロデルが、CLRらしいので、調べて見た。
サンプル、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8ef32ae2-228b-456f-b246-ace41585a80d.png)


# サンプルコード

```
ーー// [77] もぐらたたきゲーム //
ーー動作環境　プロデル1.6.667以降
ーー投稿日　2019-08-12 22:16:53
ーー投稿者　ゆうと  
// もぐらたたき //

穴画像という画像(「images\tile.png」)を作る
もぐら画像という画像(「images\mogura.png」)を作る
当たり画像という画像(「images\mogura-hit.png」)を作る
当たり音は「sounds\button51.mp3」
メイン画面を表示する
待機する

メイン画面とは
	ウィンドウを継承する
	-穴一覧
	-得点=0
	-残り時間:日時期間形式
	はじめの手順
		初期化する
		穴一覧={}
		残り時間=日時期間形式(「0:01:00」)を作ったもの
		9回数にカウントして繰り返す
			N=数-1
			キャンバス1へ画像を描いて穴一覧(数)とする
				その位置と大きさは｛20 + N % 3 * 110, 20 + ((N - N % 3) / 3) * 110, 100, 100｝
				その伸縮は○
				そのタグは、数
				その画像は、穴画像
				そのクリックされた時の手順は、画像クリック
		そして
		キャンバス1へ「もぐらたたき」という文字を描く
			その位置は｛350, 20｝
			そのフォントは「メイリオ」
			その文字色は、緑色
			その文字サイズは16
		キャンバス1へ「Score:0」という文字を描いて得点ラベルとする
			その位置は｛350, 60｝
			そのフォントは「メイリオ」
			その文字色は、緑色
			その文字サイズは18
		キャンバス1へ文字を描いて残り時間ラベルとする
			その位置は｛350, 100｝
			そのフォントは「メイリオ」
			その文字色は、赤色
			その文字サイズは16
		キャンバス1へ「GAME OVER」という文字を描いてゲームオーバーラベルとする
			その位置は｛60, 150｝
			その文字色は、赤色
			その文字サイズは、30
			その表示は×
		キャンバス1に子キャンバスを作って表紙キャンバスとする
			その位置と大きさは｛0, 0, 520, 520｝
			その背景色は、白
			そのクリックされた時の手順は、スタートする
		表紙キャンバスへ「もぐらたたき」という文字を描く
			その位置は｛60, 100｝
			その文字色は、緑色
			その文字サイズは32
		表紙キャンバスへ「クリックしてスタート」という文字を描く
			その位置は｛40, 200｝
			その文字色は、青色
			その文字サイズは24
		キャンバス1を更新する
			タイマー1というタイマーを作る
			タイマー1の時間になった時の手順は、時間になった
		終わり
	初期化する手順
		この実質大きさは｛740, 540｝
		この内容は「もぐらたたき」
		初期化開始する
			キャンバス1というキャンバスを作る
				その位置と大きさは｛0, 0, 740, 540｝
				そのフォントは「メイリオ,9」
				その実質大きさは｛740, 540｝
				そのドッキング方向は「全体」
		初期化終了する
		メイン画面の設計スケール比率は｛144, 144｝
	終わり
	スタートする手順
		表紙キャンバスの表示は×
		タイマー1の間隔は2000
		タイマー1を開始する
	終わり
	画像クリックの手順
		発生元の画像がもぐら画像なら
			発生元の画像は、当たり画像
			得点を10だけ増やす
			得点ラベルの内容は「Score:[得点]」
			得点が100なら
				タイマー1の間隔を1000に変える
				タイマー1を開始する
			他で得点が200なら
				タイマー1の間隔を800に変える
				タイマー1を開始する
			他で得点が300なら
				タイマー1の間隔を500に変える
				タイマー1を開始する
			そして
		そして
	終わり
	時間になった手順
		9回数にカウントして繰り返す
			穴一覧(数)の画像を穴画像に変える
		そして
		番号は、1から9までの乱数
		穴一覧(番号)の画像をもぐら画像に変える
		番号は、1から9までの乱数
		穴一覧(番号)の画像をもぐら画像に変える
		残り時間から1秒引く
		残り時間ラベルの内容は、残り時間を「mm:ss」に整えたもの
		残り時間の合計秒数が0なら
			ゲームオーバーラベルの表示を○に変える
			タイマー1を停止する
		そして
	終わり
終わり

【ファイル名】を鳴らす手順
	エイリアス名は「wave1」
	メディア制御へ「open "［ファイル名］" alias ［エイリアス名］」を命令する
	メディア制御へ「play ［エイリアス名］」を命令する
	繰り返す
		もし［メディア制御から「status ［エイリアス名］ mode」を取得したもの］が「playing」でないなら、繰り返しから抜ける
		0.1秒待つ
	そして
	メディア制御へ「stop ［エイリアス名］」を命令する
	メディア制御へ「close ［エイリアス名］」を命令する
終わり




```

以上。
プロデル、調査 その48

# 概要
プロデルが、CLRらしいので、調べて見た。
練習問題、やってみた。

# 練習問題
ブロック崩しを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/cb44ed97-a415-49c0-95b7-d59a4d98acee.png)

# サンプルコード

```


メイン画面を表示する
待機する

メイン画面とは
　　	ウィンドウを継承する
　　	はじめの手順
　　　　	初期化する
　　　　　　	ゲームを初期化する
　　　　　　	メインタイマーというタイマーを作る
　　　　　　	メインタイマーの時間になった時の手順は、ゲームを進行する
　　　　　　	メインタイマーの間隔を100に変える
　　　　　　	メインタイマーを開始する
　　	終わり
　　	初期化する手順
		ーー自動生成された手順です。ここに書き加えたプログラムは消える可能性があります
		初期化開始する
		キャンバス1というキャンバスを作る
		この実質大きさは{911,580}
		この初期位置は「手動」
		この内容は「ブロック崩し」
		この移動順は0
		この間隔は{6,5,6,5}
		キャンバス1を使う
			その位置と大きさは{0,0,911,580}
			その移動順は0
			そのドッキング方向は「全体」
			その間隔は{4}
		初期化終了する
		この設計スケール比率は{120,120}
	終わり
　　	ゲームを初期化する手順
　　		キャンバス1へ四角形を描くして、枠とする
		その位置と大きさは｛1,1,730,580｝

　　　　	キャンバス1へ円を描いてボール図形とする
　　　　  　　		その位置と大きさは、｛20, 50, 10, 10｝
　　　　　　		その線色を「#ff8c00」に変える
　　　　　　		その太さを3に変える
　　　　　　		その背景色を「#ffff00」に変える
　　　　　　	キャンバス1へ四角形を描いてラケット図形とする
			その線色を「#00008b」に変える
			その太さを3に変える
			その背景色を「#00bfff」に変える
		マイラケットの縦は、400
		マイラケットの横は、10
		ラケット図形の大きさは、｛マイラケットの幅, マイラケットの高さ｝
		 //キャンバス1の位置と大きさを報告する

		 行を1から5まで増やしながら『
　　			列を1から6まで増やしながら『
　　　　			キャンバス1へ四角形を描いてブロック配列(列,行)とする
　　　　　　			その位置と大きさは、｛(列-1)*110+30,行*30+60,100,20｝
　　　　　　			その背景色を緑色に変える
　　			』ことを繰り返す
		』ことを繰り返す
　　	終わり
　　	ゲームを進行する手順
　　　　	Yは、マイボールの縦 + マイボールの縦方向
　　　　	Xは、マイボールの横 + マイボールの横方向
　　　　	もしYが580 - マイボールの高さ以上なら『
　　　　　　		マイボールの縦方向は、-マイボールのスピード
　　　　　　		Y = 580 - マイボールの高さ』
　　　　	他でもしYが0以下ならマイボールの縦方向は、マイボールのスピード
　　　　	もしXが730 - マイボールの幅以上なら『
　　　　　　		マイボールの横方向は、-マイボールのスピード
　　　　　　		X = 730 - マイボールの幅』
　　　　	他でもしXが0以下ならマイボールの横方向は、マイボールのスピード

		もしYがマイラケットの縦以上 かつ Yがマイラケットの縦+マイラケットの高さ以下 かつ Xがマイラケットの横以上 かつ Xがマイラケットの横+マイラケットの幅以下なら
　　			もしマイボールの縦方向が0以上なら、Yは、マイラケットの縦
　　		そうでなければ、Yは、マイラケットの縦+マイラケットの高さ
　　			マイボールの縦方向は、-マイボールの縦方向
		もし終わり
		
		消えた数は、0
		行を1から5まで増やしながら『
　　			列を1から6まで増やしながら『
　　　　			判定ブロックは、ブロック配列(列,行)
　　　				もし判定ブロックの表示かつYが判定ブロックの縦以上かつYが判定ブロックの縦+判定ブロックの高さ以下
　　　				かつXが判定ブロックの横以上かつXが判定ブロックの横+判定ブロックの幅以下なら
　　　					マイボールの縦方向は、-マイボールの縦方向
　　　					//跳ね返り音を再生する
　　　					判定ブロックの表示は、×
　　　				もし終わり
　　　				もし判定ブロックの表示でないなら、消えた数を増やす
　　			』ことを繰り返す
		』ことを繰り返す

		もし消えた数が5*6なら
　　			「クリア！」を表示する
　　			メインタイマーを停止する
		もし終わり

		もしYが500以上なら
　			　「ゲームオーバー！」を表示する
　　			メインタイマーを停止する
		もし終わり
		
　　　　	マイボールの縦は、Y
　　　　	マイボールの横は、X
　　　　	ボール図形の位置と大きさは、｛マイボールの横, マイボールの縦, マイボールの幅, マイボールの高さ｝
　　　　	キャンバス1を更新する
　　	終わり
　　	キャンバス1のマウスカーソルが移動した時の手順
	　　	マイラケットの横は、この時の座標(1) - マイラケットの幅 / 2
　　		ラケット図形の位置は、｛マイラケットの横, マイラケットの縦｝
	終わり
終わり

マイボールとは
　　	+縦=300
　　	+横=100
　　	+スピード=5
　　	+縦方向=5
　　	+横方向=5
　　	+幅=10
　　	+高さ=10
終わり

マイラケットとは
 	+縦
 	+横
 	+幅=50
 	+高さ=30
終わり




```

以上。
パソコンで「愛の夢第３番」を演奏させる。

Archlinuxの端末で、フランツ・リストの「愛の夢第３番」を演奏させてみました。

midiファイル(.mid)の演奏には、`adlmidi`を使います。

インストール

```
yay -S adlmidi
```

以下から、Liebestraumのmidiファイルを引っ張ってきます。画面右に小さくある'DOWNLOAD'というリンクをクリックします。

https://onlinesequencer.net/1336871

演奏

```
adlmidi Liszt\ Liebestraum\ No.3\ \(full\).mid -nl
```

-nlオプションはループをしないで終了するという指定です。
Geminiでタヌキと遊ぶ魔法少女を描いてみた。

# 概要

Geminiでタヌキと遊ぶ魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
水のタヌキと遊ぶ魔法少女を描いてください。
```

![水のタヌキと遊ぶ魔法少女_20250619.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/4be827e0-eb61-45c6-ab70-34944a7c886a.png)

# まとめ

可愛い。何かの役に立てばと。
JSON & XML

Choose JSON when:
• Performance, speed, and efficiency are critical (e.g., web APls, mobile applications).
• Data exchange is between browsers/ servers and typically involves less complex data structures.
• You prefer a more human-readable and concise format.
• You are working with JavaScript or languages with native JSON support.

Choose XML when:
• Your data structure is complex and requires robust validation (e.g., using
XML Schema Definition - XSD).
• You need to support namespaces or transform data into different formats (e.g., using XSLT).
• You are working with legacy systems that primarily use XML.
• Metadata and comments are essential components of your data.
学習15日目

# 今日学んだこと
find・find_by・whereメソッド


## 内容
(例)
```
Hoge.find(1)
⇒ hogesテーブルのid=1のレコードを取得する。
```

(例)
```
Hoge.find(1,2)
⇒ hogesテーブルのid=1とid=2のレコードを取得する。
```

id以外の条件で取得したい時は、find_byを用いる。

(例)
```
Hoge.find_by(name: "Hoge")
⇒ hogesテーブルのnameカラムが「Hoge」のレコードのうち、一番最初のものを取得する。
```

(例)
```
Hoge.find_by(name: "Hoge", age: "30")
⇒ hogesテーブルのnameカラムが「Hoge」かつ、ageカラムが「30」のレコードのうち、一番最初のものを取得する。
```

条件に該当するレコードを全て取得したい場合は、whereを用いる。

(例)
```
Hoge.where(name: "Hoge")
⇒ hogesテーブルのnameカラムが「Hoge」のレコードを全て取得する。
```

(例)
```
Hoge.where(name: "Hoge").where(age: "30")
⇒ hogesテーブルのnameカラムが「Hoge」かつ、ageカラムが「30」のレコードを全て取得する。
```
※上記以外でも、OR条件や、ANDとOR条件を組み合わせた記述も可能。

## 感想
find_byが最初のレコードしか返さないことを理解していないと、予期せぬエラーの原因になると感じた。
Automating GIS Processes 2024 写経　Lesson 3（Intersect）

https://autogis-site.readthedocs.io/en/latest/lessons/lesson-3/intersect.html

> Similar to the spatial relationships `within` and `contains` covered in the previous section, another common geospatial query asks whether two geometries intersect or touch.

前回は、`within()` と `contains()`でした。

https://qiita.com/t_t_japan/items/d091c393f0cf349df3d5

https://qiita.com/t_t_japan/items/8e2fac435aa319bf43e7

今回は、`intersects()` と `touchs()`です。


> Both queries are implemented in shapely: - intersects(): two objects intersect if the boundary or interior of one object intersect in any way with the boundary or interior of the other object. - touches(): two objects touch if the objects have at least one point in common, but their interiors do not intersect with any part of the other object.

いずれも`shapely`で用意されています。 
- `intersects()` ：２つのオブジェクトがあり、１つのオブジェクトの境界線か内部が、もう１つのオブジェクトの境界線か内部に対して、交差している
- `touches()`：2つのオブジェクトがあり、それらが少なくとも１点は共通する、しかし、内部は全く交差していない

> Let’s try these functions out, for instance, using two lines:

２つの`LineString`でやってみましょう。

```
import shapely.geometry

line1 = shapely.geometry.LineString([(0, 0), (1, 1)])
line2 = shapely.geometry.LineString([(1, 1), (0, 2)])
```
```
line1.intersects(line2)
```
```
line1.touches(line2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/d8d7010c-d731-42c3-af29-4247eae26fcf.png)


> `line1` touches`line2`. Adding them both to a multi-line is a quick way of drawing them inside a Jupyter notebook:

`line1`と`line2`は接しています。`MultiLineString`で表現してみましょう。
```
shapely.geometry.MultiLineString([line1, line2])
```
※画像には座標を上書きしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/29a19990-13b2-4dc0-b33e-ed78dfea08a8.png)

> We can see here, that the share the point `(1, 1)`, in which `line1` ends, and `line2` begins. The two lines do not intersect otherwise (‘in their interior’), so the predicament ’`touch()`’ - as defined above - is true.

> If the lines would share some of their interior, that would not be counted as touching. For instance, `line1` does not touch `line1` (itself), but fulfils all requirements to be counted as `intersect()`ing with itself:


point `(1, 1)`は、`line1`の終点かつ`line2`の始点であり、`line1`と`line2`両方にあります。この２つの線はこの点以外では（線の内側では）交差していません。なので、`touches()`は`True`を返します。

２つの線が内部でも交差していたとしたら、`touches()`は`False`を返します。例えば、`line1`が`line1`自身に`touch()`したとすると、戻り値は`False`になります。一方、`intersects()`した場合、戻り値は`True`になります。この場合、（`touch()`の要件は満たしていないが）`intersects()`の要件は満たしているからです。
```
line1.touches(line1)
```
```
line1.intersects(line1)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/e4fbea2f-12a5-42bf-8c2a-b35f5540291d.png)
8x8を4倍角に変換して遊ぶ(ビット操作


いろいろ、注意
----

- arduinoでの予定は、未定


プログラム
----

オンラインコンパイラ　paiza


```c++



#include <iostream>
using namespace std;

#define b_put(aa) for(int ii=8;ii!=0;ii--){if(aa & 0x80){printf("#");}else{printf(".");}aa=aa<<1;}
#define bit8_put(bb) for(int jj=0;jj<32;jj++){b_put(bb[jj*4]);b_put(bb[jj*4+1]);b_put(bb[jj*4+2]);b_put(bb[jj*4+3]);printf("\n");}

int main(void){
    // Your code here!

    unsigned char font[] = {
        0b00100000, //  #     
        0b01111100, // #####  
        0b00100000, //  #     
        0b01111100, // #####  
        0b10101010, //# # # # 
        0b10110010, //# ##  # 
        0b01100100, // ##  #  
        0b00000000  //
    };  
    
    unsigned char font2[4*32];


    int j = 0; //2倍角出力フォントのカウンター
    for (int i = 0; i < 8; i++) { //フォントの2倍角化ループ

      int al = font[i]; //入力フォントの読み出し
      int a=0;int b=0;int c=0;int d=0;


      //8bit
      if( (al & 0x80) != 0 ){
          a = a | 0xf0;
      }

      //7bit
      if( (al & 0x40) != 0 ){
          a = a | 0x0f;
      }

      //6bit
      if( (al & 0x20) != 0 ){
          b = b | 0xf0;
      }

      //5bit
      if( (al & 0x10) != 0 ){
          b = b | 0x0f;
      }


      //eeeeeeeeeeeeeeeeeeeeeeeeeeeeeee


      //4bit
      if( (al & 0x08) != 0 ){
          c = c | 0xf0;
      }

      //3bit
      if( (al & 0x04) != 0 ){
          c = c | 0x0f;
      }
      
      //2bit
      if( (al & 0x02) != 0 ){
          d = d | 0xf0;
      }

      //1bit
      if( (al & 0x01) != 0 ){
          d = d | 0x0f;
      }


      font2[j++] = a;
      font2[j++] = b;
      font2[j++] = c;
      font2[j++] = d;

      font2[j++] = a;
      font2[j++] = b;
      font2[j++] = c;
      font2[j++] = d;
      
      font2[j++] = a;
      font2[j++] = b;
      font2[j++] = c;
      font2[j++] = d;

      font2[j++] = a;
      font2[j++] = b;
      font2[j++] = c;
      font2[j++] = d;

    }  //for



     bit8_put(font2);

    
} //main



```


```

........####....................
........####....................
........####....................
........####....................
....####################........
....####################........
....####################........
....####################........
........####....................
........####....................
........####....................
........####....................
....####################........
....####################........
....####################........
....####################........
####....####....####....####....
####....####....####....####....
####....####....####....####....
####....####....####....####....
####....########........####....
####....########........####....
####....########........####....
####....########........####....
....########........####........
....########........####........
....########........####........
....########........####........
................................
................................
................................
................................


```
次世代AIアプリ「SUNIE」の基本動作原理(=アーキテクチャー)について説明してみた

## はじめに
前回は、本件アプリを紹介したり、その概要について説明させていただきました。
今回は、本件アプリの基本動作原理(=アーキテクチャー)について説明いたします。
どうぞ、お付き合い、よろしくお願いします。

## アプリ全体の流れ
①まず「(入力担当)自然言語トランスフォーマー(=LLM)」が、ユーザーメッセージの中から、ユーザーニーズを成す重要な語句を抽出して、それを後続の「RAGシステム」に引き継ぎます。

②次に「RAGシステム」が、自身の管理する「RAGベース(=データベース)」から、
ユーザーメッセージに含まれる重要語句と関連のある「RAGナレッジ」と「RAGルール」を効率的に検索・収集します。
※RAGナレッジ = ある特定の事実に基づく情報・データ。
※RAGルール = RAGナレッジに対して適用される推論規則・推測規則。たとえば「猫が 穴に向かって進み出た」を前提とすると「猫は 穴の中に落ちる」が結論となります。
つまり、RAGルールとは、前提と結論の「組」のことです。

③次に「RAGシステム」から「RAGナレッジ」と「RAGルール」を受け取った「(推論・推測担当)エキスパートシステム」が、「RAGナレッジ」と「RAGルール」を基に知識推論・知識推測を行います

④そして最後に「(推論・推測担当)エキスパートシステム」の実行結果を受け取った「(出力担当)自然言語トランスフォーマー(=LLM)」が、
それを人間に分かりやすい自然言語テキストの形式に変換してユーザーに対して出力・返答します。

## アプリ全体の構成
つまり、SUNIE全体としては、基本的には、
「(入力担当)自然言語トランスフォーマー(=LLM)」「RAGシステム」「(推論・推測担当)エキスパートシステム」「(出力担当)自然言語トランスフォーマー(=LLM)」の4者によって構成されます。

## アーキテクチャーの理由・根拠
従来は「LLM」に、あらゆる知識・データを詰め込んだ上で、推論・推測までをも担わせていたのですが、確率ベースを原理とする「LLM」には、そもそも推論・推測を行わせるのは無理がある訳です。
ですので、ファクト(=信頼に足るソース)の提供を「RAGシステム」に担わせます。
さらに、それを材料として「エキスパートシステム」に加工を行わせることで、事実ベースの推論・推測が可能となります。
加えて、ルールベースを原理とする「エキスパートシステム」をシステム全体の処理フローに取り入れることで、実行結果に対する「説明性」と「解釈性」を担保できるという訳です。

## おわりに
いかがでしたでしょうか？。
まだ、この仕様・設計案は、基本に留めてあるので、詳細はもう少し複雑なのですが、
あまり、公開初期から内容を詰め込みすぎるのもどうかと思いましたし、
いきなり、スタートから全力疾走していると、私自身が疲れてしまうので、
この辺でセーブしておきました(笑)。
また、懲りずに記事を上げたいと思います。
それではまた～。
このアプリは Google で確認されていません

# Google Apps Script 実行時の「このアプリは Google で確認されていません」警告の対処方法

## 🔍 警告の意味

Google Apps Script（GAS）でスクリプトを初めて実行したときに、次のような警告メッセージが表示されることがあります：

> **このアプリは Google で確認されていません**
> アプリが、Google アカウントのプライベートな情報へのアクセスを求めています。デベロッパー（[xxxx@gmail.com](mailto:xxxx@gmail.com)）と Google によって確認されるまで、このアプリを使用しないでください。

これは、「Gmail 送信」「Google Drive へのアクセス」「スプレッドシート操作」など、ユーザーの個人情報にアクセスするスクリプトを使う場合、**Googleが未審査の状態では警告を出す**仕様です。

---

## ✅ 安心して進めてよい条件

* このスクリプトは**自分自身で作成したもの**、または
* 信頼できる人が作成し、**コード内容を確認済み**であれば

→ 警告を無視して進んで構いません。

---

## 🛠 操作手順（手動で承認して実行）

以下の手順で「未確認アプリ」でも自分のアカウントで実行できるようになります。

### 1. スクリプトを実行する（例：`executeAutoProcess()`）

Apps Script のエディタで関数を選択し、「▶実行」ボタンを押します。

### 2. 「このアプリは Google で確認されていません」という警告画面が表示される

そのまま以下の手順で進みます：

### 3. 左下の「詳細」をクリック

👇
![詳細をクリック](https://user-images.githubusercontent.com/65068782/202769710-0477e1d8-5c76-46e1-8510-69fd2fc1234e.png)

### 4. 「（安全ではないページ）に移動」をクリック

👇
![移動をクリック](https://user-images.githubusercontent.com/65068782/202769783-10e9a5c3-4b8f-47a5-918b-97b4ea3949c7.png)

### 5. アカウントの権限リストが表示されるので「許可」する

スクリプトが使用する機能（Gmail、Drive、スプレッドシートなど）の権限が表示されます。内容を確認し、\*\*「許可」\*\*をクリックすれば実行が開始されます。

---

## 📌 ワンポイント補足：この警告はなぜ出る？

* Googleでは、OAuth（認証）の安全性を確保するために、**他人の情報にアクセスするようなスクリプトは原則「審査済み」であるべき**としています。
* しかし、**個人または社内利用のスクリプトには審査不要**なので、自己責任で許可する流れが用意されています。

---

## ✏ Qiita向けまとめテンプレ

```markdown
# 【GAS】「このアプリは Google で確認されていません」の対処法

## ⚠ なぜ出るのか？
Google Apps Script で Gmail や Drive を操作する際、最初の実行時に警告が出ることがあります。

## ✅ 自作スクリプトであれば安心して進めてOK

## 🔧 操作手順
1. スクリプトを実行（▶ボタン）
2. 「このアプリは～」と出たら「詳細」をクリック
3. 「（安全ではないページ）に移動」をクリック
4. 権限リストが表示される → 「許可」

## 🔐 注意点
- 他人のスクリプトを安易に許可しない
- 内容を確認してから進める
```
ChatGPTを使用したアプリ開発記【投稿詳細ページの実装】

## PostDetail.jsの作成
```PostDetail.js
import React, { useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';
import {doc, getDoc} from 'firebase/firestore';
import { db } from './FireBase';
import ShareButtons from './ShareButtons';

function PostDetail() {
  const { postId } = useParams();
  const [post, setPost] = useState(null);
  console.log("postId:", postId);
  const [author, setAuthor] = useState(null);

	//Firestoreのposts/{postId}ドキュメントを取得。
	//存在する場合、対応するユーザー情報も取得。
	//両方を setPost, setAuthor でステートに保存。
  useEffect(() => {
    const fetchPost = async () => {
      const postDoc = await getDoc(doc(db, 'posts', postId));
      if (postDoc.exists()) {
         const postData = postDoc.data();
         setPost(postData);

         const userDoc = await getDoc(doc(db, 'users', postData.uid));
         if (userDoc.exists()) {
          setAuthor(userDoc.data());
         }
      } else {
        console.warn("投稿が存在しません");
      }
    };
    fetchPost();
  }, [postId]);
  
  if (!post) return <p>読み込み中...</p>;

  const shareUrl = `${window.location.origin}/post/${postId}`;
  console.log("共有URL:", shareUrl);
  const shareTitle = `Keruma SNSで面白い投稿を見つけました!「${post.text?.slice(0,30)}...」`;

  return (
    <div className="max-w-2xl mx-auto p-6 mt-10 bg-white shadow rounded">
      <div className="flex items-center mb-4">
        <img
          src={author?.photoURL || '/default-icon.png'}
          alt="ユーザーアイコン"
          className="w-10 h-10 rounded-full mr-2"
        />
        <div>
          <p className="font-semibold">{author?.name || '匿名ユーザー'}</p>
          <p className="text-sm text-gray-500">{post.time}</p>
        </div>
      </div>

      <p className="mb-4">{post.text}</p>

      {post.imageUrl && (
        <img src={post.imageUrl} alt="投稿画像" className="rounded-md mb-4 max-w-full"/>
      )}

      {post.videoUrl && (
        <video controls className="rounded-md mb-4 max-w-full">
           <source src={post.videoUrl} type="video/mp4"/>
        </video>
      )}

      <ShareButtons url={shareUrl} title={shareTitle}/>

      <div className="mt-6">
          <h3 className="font-semibold">コメント一覧</h3>
          <ul className="list-disc list-inside mt-2">
            {(post.comments || []).map((c, i) => (
              <li key={i}>{c}</li>
            ))}
          </ul>
      </div>
    </div>
  );

}

export default PostDetail;
```

## AppRouter.jsにパスを設定
```AppRouter.js
import PostDetail from './PostDetail';

<Route path="post/:postId" element={<PostDetail />} />
```

## プロフィール画面・投稿一覧画面にクリックイベントを記述
```js
    <div
      className="cursor-pointer"
      onClick={() => navigate(`/post/${post.id}`)}
    >

    //投稿内容を上記onClickで囲む
    
      </div>
    
```

## 投稿詳細画面UI

![スクリーンショット 2025-05-31 8.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/ae713932-3c3d-4313-abe1-aa3cf7a1abfa.png)
Test-NetConnectionでApplication Gateway の通信を確認

### ■検証目的：Application Gateway にNSG上で通信を拒否/許可する際、Powershell commandのTest-NetConnectionではその結果を検証できますか。

### ■検証結果：Test-NetConnectionを用いて、NSG上で通信を拒否/許可することを検証できます。これから通信テスト上でTest-NetConnectionを使ってOKですね。

### ■検証詳細：
検証①：AppGWのNSG上でMyClientIPからの通信を許可します。
以下の通りです。
1.Client IPからAppGWへのアクセスは成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/6bcb967e-f30d-4d97-a53d-9c2c100320d1.png)

2.Test-NetConnecitonの結果も予想通り、Tureになります。

Test-NetConnection  20.243.xx.xx -port 80
ComputerName     : 20.243.xx.xx
RemoteAddress    : 20.243.xx.xx
RemotePort       : 80
InterfaceAlias   : Wi-Fi
SourceAddress    : 192.168.0.3
TcpTestSucceeded : True


検証②：AppGWのNSG上でIPを許可しないです。以下の通りです。
まず、NSG上でわざわざ拒否します。
該当IPからアクセスできないことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620054/e577b009-d428-457b-9b60-4e35d95231e1.png)

Test-NetConnecitonの結果も予想通り、Falseになります。                                 
Test-NetConnection  20.243.xx.xx -port 80
警告: TCP connect to (20.243.xx.xx : 80) failed
ComputerName     : 20.243.xx.xx
RemoteAddress    : 20.243.xx.xx
RemotePort             : 80
InterfaceAlias         : Wi-Fi
SourceAddress          : 192.168.0.3
PingSucceeded          : True
PingReplyDetails (RTT) : 8 ms
TcpTestSucceeded       : False
[VRChat] 違うアバターをキプフェル化

## ⭐️目的

- ショコラをキプフェル体型にする

## ⭐️参考

https://booth.pm/ja/items/6382006

### ☂️公式

https://booth.pm/ja/items/6382006

## ⭐️インストール

https://booth.pm/ja/items/6382006


## ⭐️使い方

:::note info
事前にキプフェルとショコラをヒエラルキーに入れておく必要がある?
:::

- ファイルを実行する

![スクリーンショット 2025-06-19 3.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/318627f7-cb2c-4da3-b2cf-9b8325856418.png)

- プレハブをヒエラルキーに移動する

![スクリーンショット 2025-06-19 3.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/dc5de64b-821b-47ef-889a-2a7e76e675c7.png)
PostgreSQL 18の新機能「GINインデックスのパラレル作成」の簡易性能検証

約430万件の[日本語Wikipediaタイトルデータ](http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles.gz)を使って、[pg_bigm](https://github.com/pgbigm/pg_bigm)による(GINインデックスベースの)全文検索インデックスの作成時間を計測します。PostgreSQL 17以前のように1プロセスで作成する場合と、PostgreSQL 18で導入された[「GINインデックスのパラレル作成」](https://github.com/postgres/postgres/commit/8492feb98f6df3f0f03e84ed56f0d1cbb2ac514c)を使った場合とで、どれだけ時間に違いが出るかを比較します。

## 結果
**GINインデックスのパラレル作成により、インデックス作成時間を半分以下に短縮！**

| パラレル度 | インデックス作成時間 | 補足 |
|:-:|:-:|:-:|
| 1  | 66512.356 ms (01:06.512)  |   |
| 5  | 28669.585 ms (00:28.670)  | パラレルワーカーが4つ起動され、バックエンドと合わせて合計5多重でインデックスをパラレル作成)  |

## 計測方法
psqlで以下を実行します。

```sql
-- psqlの時間計測機能を有効化
\timing on

-- 日本語Wikipediaタイトルデータをダウンロードして解凍
\! wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles.gz
\! gunzip -d jawiki-latest-all-titles.gz

-- 日本語Wikipediaタイトルデータを格納するテーブルを作成
CREATE TABLE wikipedia_title (title text);

-- 日本語Wikipediaタイトルデータをテーブルにロード
-- * タイトルデータは、タブ区切りでpage_namespaceとpage_titleの2つのフィールドがあり、今回はpage_titleのみロード
-- * タイトルデータは、先頭業がヘッダ情報のため、\copyではheaderオプションを指定
\copy wikipedia_title from program 'cut -f2- jawiki-latest-all-titles' header

-- pg_bigmを登録
CREATE EXTENSION pg_bigm;

-- max_parallel_maintenance_workersを0に設定して、1プロセスでのインデックス作成時間を計測
SET max_parallel_maintenance_workers TO 0;
CREATE INDEX wikipedia_title_idx ON wikipedia_title USING gin (title gin_bigm_ops);

-- 3回インデックス作成した時の時間は以下の通り
-- Time: 67314.715 ms (01:07.315)
-- Time: 66512.356 ms (01:06.512)
-- Time: 66541.476 ms (01:06.541)

-- max_parallel_maintenance_workersを8に設定して、パラレルでの(実際には5多重での)インデックス作成時間を計測
SET max_parallel_maintenance_workers TO 8;
CREATE INDEX wikipedia_title_idx ON wikipedia_title USING gin (title gin_bigm_ops);

-- 3回インデックス作成した時の時間は以下の通り
-- Time: 28510.586 ms (00:28.511)
-- Time: 29249.084 ms (00:29.249)
-- Time: 28669.585 ms (00:28.670)
```

GINインデックスのパラレル作成時のpsの様子
```shell
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
postgres 27860  99.3  3.2 36057372 541108   ??  Rs    3:42AM   3:58.95 postgres: postgres postgres [local] CREATE INDEX  
postgres 35437 100.0  0.4 36002944  66028   ??  Rs    3:50AM   0:06.89 postgres: parallel worker for PID 27860   
postgres 35438  99.3  0.4 36001916  66692   ??  Rs    3:50AM   0:06.89 postgres: parallel worker for PID 27860   
postgres 35439 100.0  0.4 36001720  65740   ??  Rs    3:50AM   0:06.89 postgres: parallel worker for PID 27860   
postgres 35440 100.0  0.4 35999704  66644   ??  Rs    3:50AM   0:06.89 postgres: parallel worker for PID 27860
```
珈琲手帳 - コーヒーメモアプリを制作しました。

[こちらのリポジトリ](https://github.com/Hal739/coffee-app)にて公開している自作のコーヒーメモアプリについて紹介します。

ぜひ、ダウンロードして試してみてください。

## アプリ概要
### 機能
- レシピの記録
    コーヒー粉量、抽出温度、時間など詳細なレシピを記録できます
    <br>
- コーヒー豆管理
    購入した豆の種類、焙煎度、精製方法などを記録できます
    <br>
- テイスティングノート管理
    アロマ、酸味、甘味、苦味、ボディの5項目で評価できます
    <br>
- タイマー機能
    記録したレシピをもとに、タイマーを設定できます

### スクリーンショット
<img= src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4117221/6fadd40f-f5c5-4d38-981e-14ebd40dd945.png" width=30%><img= src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4117221/362681da-e7a6-40d0-8567-68cafe3eaa0f.png" width= 30%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4117221/e0589267-36a3-400d-95dc-03391c88af50.png" width=30%>


### 開発言語・フレームワーク
- TypeScript 
- Expo (React Native)

### 今後追加したいこと
- UI/UXの改善
- データベースを用いた機能

## このアプリを作った目的
日々のハンドドリップで『この前上手くいったレシピ、どうやったっけ？』と忘れてしまうことがありました。そこで、自分だけのオリジナルレシピ帳として、気軽に記録できるアプリが欲しいと思ったのが開発のきっかけです。

## 最後に
初めてのアプリ開発になるので、不具合や機能面での不足などがあるかもしれませんが、少しずつ改善しながら学んでいる段階です。  
アドバイスやご意見などいただけると、とても嬉しいです！
(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #6 HomNAND

# 目次
1. [(完全)準同型暗号の最前線1（入門編)](https://qiita.com/nindanaoto/items/98335ad4d32b927effa9)
2. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #1 TLWE](https://qiita.com/nindanaoto/items/82b63cb5453380c029b1)
3. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #2 TRLWE & SampleExtarctIndex](https://qiita.com/nindanaoto/items/6796dcf21a37362ce557)
4. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #3 TRGSW & CMUX](https://qiita.com/nindanaoto/items/5d33dcbabddfb3f6880e)
5. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #4 Blind Rotate](https://qiita.com/nindanaoto/items/c1941561d5d3524bf02a)
6. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #5 Identity Key Switching](# 目次
1. [(完全)準同型暗号の最前線1（入門編)](https://qiita.com/nindanaoto/items/98335ad4d32b927effa9)
2. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #1 TLWE](https://qiita.com/nindanaoto/items/82b63cb5453380c029b1)
3. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #2 TRLWE & SampleExtarctIndex](https://qiita.com/nindanaoto/items/6796dcf21a37362ce557)
4. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #3 TRGSW & CMUX](https://qiita.com/nindanaoto/items/5d33dcbabddfb3f6880e)
5. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #4 Blind Rotate](https://qiita.com/nindanaoto/items/c1941561d5d3524bf02a)
6. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #5 Identity Key Switching](https://qiita.com/nindanaoto/items/dc82a31aee0ba2532d59)
7. (完全)準同型暗号の最前線２（原理編）: TFHEの原理 #6 HomNAND←イマココ

# 全体の中での位置づけ
![HomNANDdiagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251439/e5ba35e4-8dec-87e6-4185-026a0b00cd09.png)

今までのものをくっつけてHomNAND、つまり暗号上でNANDを行う方法について述べます。

# 復号を使ったアイデア

実はアイデア自体はTLWEの暗号化・復号と加法準同型性だけでも説明できたりします。(そのうち#1の方に書き足すかも)

二つのTLWE暗号文を$(\mathbf{a}_0,b_0),(\mathbf{a}_1,b_1)$とし, その平文が$-1/8,1/8$のいずれかであるとします. 
TLWEの加法準同型性から以下の計算を行うことができます.
$$-(\mathbf{a}_0,b_0)-(\mathbf{a}_1,b_1)+(\mathbf{0},1/8)$$
この結果として出てくる出力TLWE暗号文の平文は明らかに$-1/8,1/8,3/8$のいずれかです. 
また, 実際に計算してみればわかるとおり, $-1/8$となるのは両方の入力暗号文の平文が$1/8$である場合だけです. 
この出力暗号文に対して復号関数を適用すると符号が正の場合は$1$を, 負の場合は$0$を返すため, これは両方の入力が$1$の場合だけ$0$を返す, つまりNANDを計算している関数であると見なすことができます. 

# Bootstrappingを使ったアイデア

ここまで読まれている方はおそらくお気づきだと思いますが, Bootstrappingは復号を暗号上で実行する関数ですから, 上で述べていたアイデアを暗号上で実行できます. 
あたりまえですが, 上で述べたアイデアは復号関数の適用を前提としているので, 復号をしなかった場合$3/8$が出てしまう場合があり平文空間の外に出てしまうので複数の演算を行うことができません. 

# 終わりに
とりあえずなんか下書きに残ってたので出したんですが, 何なら最初から書き直しても色々足せる気はしますね......また更新したいところですが
自己署名証明書を無視する必要はあるのか？

# はじめに

HTTPS通信では通常、認証局（CA）によって発行された証明書を使ってサーバーの正当性を検証します。ですが、以下のようなケースでは**自己署名証明書**が使われることがあり、そのままでは `axios` などのライブラリで接続時にエラーが発生します。

# 自己署名証明書とは？

通常、HTTPSは「信頼された認証局（CA）」によって発行された証明書を使って、通信相手の正当性を保証します。

一方、**自己署名証明書**は「自分自身で署名した証明書」であり、**外部の信頼機関による検証がされていない**という違いがあります。

# よくあるケース

1. **ローカル開発環境やステージング環境**

開発用に `mkcert` や OpenSSL で生成した自己署名証明書を使って HTTPS を立てている場合。

* ✅ 本番と同じHTTPS環境を再現したい
* ❌ でも正式な証明書を取得するのは面倒 or コストがかかる

2. **イントラネットで使う社内サーバー**

閉じたネットワーク内で使われており、社内CAや自己署名で構築されたサーバー。

* ✅ 外部公開されていないためLet's Encrypt等が使えない
* ❌ 通常のSSL検証では弾かれてしまう

3. **レガシーな外部サービスや開発中API**

まだ正式な証明書を取得していないテスト用サービスに接続する場合。

# 無視しないとどうなる？

例えば以下のようなエラーが発生します：

```bash
Error: unable to verify the first certificate
```

または

```bash
UNABLE_TO_VERIFY_LEAF_SIGNATURE
```

これは、**証明書の発行元が信頼できないため、Node.jsが接続を拒否している**状態です。

# 対策
> `https.Agent({ rejectUnauthorized: false })` を使う

```ts
const agent = new https.Agent({
  rejectUnauthorized: false,
});
```

この設定を `axios` に渡すことで、**自己署名証明書でも接続できるようになります**。

```ts
axios.get(url, {
  httpsAgent: agent,
});
```

# 注意：**本番環境で使ってはいけない**

これはあくまで**一時的な開発用・検証用の措置**です。`rejectUnauthorized: false` を使うと**中間者攻撃（MITM）に対して完全に無防備**になります。

**👎 危険な使い方**

* 本番APIへの常時通信
* インターネット越しに使う社外向けサービス

**👍 安全な代替**

* 信頼されたCAから証明書を取得（Let's Encrypt など）
* `NODE_EXTRA_CA_CERTS` で自己署名証明書を信頼リストに追加
* 自前のCAを作り、それを信頼する設定を行う

# おわりに

自己署名証明書を使う場面は確かにあります。

自己署名証明書のままではAPIとの通信がブロックされるため、「開発効率」を優先してあえて無視することがありますが、**そのリスクと使用範囲を正しく理解したうえで限定的に使うことが重要**です。

| 利用目的          | 推奨 | 対応策                               |
| ------------- | -- | --------------------------------- |
| ローカル開発・社内検証環境 | ✅  | `rejectUnauthorized: false` で回避可能 |
| 本番運用・公開サービス   | ❌  | 必ず認証局から正式な証明書を取得                  |

SSLを回避するaxiosラッパーをご参考ください。

https://qiita.com/oharu121/items/82f02f6d077b0bafd565
[VRChat] VRCHierarchyHighlighterでunityにアイコンを入れたりヒエラルキーを強調する

## ⭐️目的

- ヒエラルキの階層表示をハイライトで強調表示する
- VRCで扱う重要コンポーネントをアイコンで表示する


## ⭐️参考

https://qiita.com/YukiLulu0229/items/6bdb8538524cbb102b23

### ☂️公式

https://booth.pm/ja/items/1326573

https://scrapbox.io/azurite-tech-note/VRCHierarchyHighlighter%E3%81%AEVCC%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95



## ⭐️インストール

![スクリーンショット 2025-06-19 1.09.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/66800748-86da-479f-bfff-1f4bcf1590c9.png)

- vcc または alcomで下記のurlを入力してパッケージを追加する

https://raw.githubusercontent.com/AzuriteLab/azlab_vrc_repos/main/index.json

![スクリーンショット 2025-06-19 1.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/ebfeee45-fe5e-4d48-a910-d794fbbace79.png)



## ⭐️使い方

### ☂️特になし

![スクリーンショット 2025-06-19 1.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/a329f2a0-6c48-4af3-ba4a-acb3bf905fb6.png)

- インストールしたらそのまま使える
- 改装がわかりやすいアンダーラインが引かれる
- 右のところにアイコンが表示される

### ☂️こちらの設定をオフにする

- あくまで個人が思うおすすめの部分

![スクリーンショット 2025-06-19 1.16.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/08a979e7-767f-4bc4-a4ce-063b67c4db71.png)

- lilEditorToolboxのコンポーネント周りをオフにする


https://qiita.com/YukiLulu0229/items/6bdb8538524cbb102b23
Excel職人のワイがAmazonQ CLIでゲーム開発者！？

# はじめに

「Amazon Q CLI を使ってゲームを作ろう Tシャツキャンペーン」がやっていたので滑り込みでゲームを作成してみました!

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

# 作成したゲーム

ヴァンパイアサ〇イバーっぽい2Dアクションゲームを作成しました。
クリック操作の攻撃も結構なめらかにできたと思います。

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3985098/86c5084e-5141-4ddf-b1cb-5b1fcce3cfe8.gif)







# ソース
![スクリーンショット 2025-06-19 004016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3985098/ee465a63-69a9-48a5-a6f9-cf5bfc227ccc.png)

amazonQ君がまとめてくれたのでPygameがインストールされていれば遊べると思います！

https://github.com/Potippy/amazon-q-game![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3985098/93457dcc-84ae-41a3-8f6d-400b8e2ea505.png)


# 作成の流れ
まず以下を参考にAmazon Q CLIのインストール

https://community.aws/content/2v5PptEEYT2y0lRmZbFQtECA66M/the-essential-guide-to-installing-amazon-q-developer-cli-on-windows?trk=e07eca93-fa2f-4351-b567-f293b83eb635&sc_channel=el_

Pygameのインストール
```
python3 -m pip install -U pygame
```

amazonQ君を呼び出した後に以下のようなプロンプトでゲームをつくってもらいました。
```
Pygameを使って、マンマルサバイバー（Manmaru Survivor）という2Dシューティングゲームを作成してください。

このゲームの主な特徴は：
1. プレイヤーは青い円で表示され、WASDキーで移動
2. マウスクリックでビーム攻撃が可能
3. 敵は画面外からスポーンし、プレイヤーに向かって進む
4. 敵を倒すと経験値とスコアを獲得
5. レベルアップすると新しい武器や能力が手に入る
6. メニュー画面、ゲームオーバー画面、操作説明画面がある
```

# 作ってみた感想
最初の命令だけでほとんど完成形に近い形で作成できてびっくり！
最初は文字化けとか表記のずれがあったけど、指摘したらきちんと直してくれた。
でも一気に大幅な修正をしてもらおうとすると思考時間が長くなってエラーを吐いてしまった。少しづつならいけるみたいです。
（難易度を追加してその仕様も細かく設定したらキツそうだった）
実務でコーディングほぼできない民だったけどamazonQがいればゲーム開発者ダゼ:sunglasses:
Pythonの学習もこいつと一緒に頑張ろうと思います。