OmniAICreator/Qiita-1.07M huggingface dataset:
AWS CDK 脳死で環境をセットアップ

### AWS CDKを使ってみたいけどよくわからない
構築したいディレクトリで下記コードを実行するとそれっぽいものができた

```bash:bash
pip install aws-cdk.core
cdk init app --language python
pip install -r requirements.txt
```

あとはCLIの設定(profileとか)をしてcdk deployで更新できるみたい

**-------------------------- 以下は設定後に確認できるREADME --------------------------**

# CDK Python プロジェクトへようこそ！

これは、Python を使った CDK 開発のための空白のプロジェクトです。

`cdk.json` ファイルには、CDK Toolkit がアプリケーションを実行する方法が記述されています。

このプロジェクトは、通常の Python プロジェクトと同様に設定されています。初期化プロセスでは、このプロジェクト内に `.venv` ディレクトリの下に仮想環境が作成されます。仮想環境を作成する際には、`python3` (または Windows の場合は `python`) がパスにあり、`venv` パッケージにアクセスできることが前提です。自動的に仮想環境を作成できない場合は、手動で仮想環境を作成することもできます。

MacOS や Linux で仮想環境を手動で作成する場合は、以下のようにします。

```
$ python -m venv .venv
```
初期化プロセスが完了し、仮想環境が作成されると、以下の手順で仮想環境をアクティブにすることができます。

```
$ source .venv/bin/activate
```
Windows プラットフォームの場合は、仮想環境を次のようにしてアクティブにします。
```
% .venv\Scripts\activate.bat
```

仮想環境がアクティブになったら、必要な依存関係をインストールできます。
```
$ pip install -r requirements.txt
```

この段階で、このコードの CloudFormation テンプレートを合成できます。
```
$ cdk synth
```

追加の依存関係（たとえば、他の CDK ライブラリ）を追加する場合は、`setup.py` ファイルに追加してから、`pip install -r requirements.txt` コマンドを再実行します。

## 便利なコマンド

 * `cdk ls`          アプリ内のすべてのスタックをリストアップ
 * `cdk synth`       合成された CloudFormation テンプレートを出力
 * `cdk deploy`      このスタックをデフォルトの AWS アカウント/リージョンにデプロイ
 * `cdk diff`        デプロイされたスタックと現在の状態を比較
 * `cdk docs`        CDK ドキュメントを開く

お楽しみください！
Oracle Database 23ai DB_DEVELOPER_ROLEロール (2024/05/10)

# はじめに
Oracle Database 23aiでは、Oracleが考えるデータベース開発者に必要なロールと権限を、新しいDB_DEVELOPER_ROLEロールとして提供されました。CONNECTロールとRESOURCEロールと比較してみました。

DB_DEVELOPER_ROLEロールは、通常の方法で付与および取り消しできます。

```
grant db_developer_role to testuser1;

revoke db_developer_role from testuser1;
```

# システム権限

| CONNECTロール | RESOURCEロール | DB_DEVELOPER_ROLEロール |
|:----|:----|:---|
|CREATE SESSION<BR>SET CONTAINER|CREATE ANALYTIC VIEW<BR>CREATE ATTRIBUTE DIMENSION<BR>CREATE CLUSTER<BR>CREATE HIERARCHY<BR>CREATE INDEXTYPE<BR>CREATE MATERIALIZED VIEW<BR>CREATE OPERATOR<BR>CREATE PROCEDURE<BR>CREATE PROPERTY GRAPH<BR>CREATE SEQUENCE<BR>CREATE SYNONYM<BR>CREATE TABLE<BR>CREATE TRIGGER<BR>CREATE TYPE<BR>CREATE VIEW|CREATE CUBE<BR>CREATE CUBE BUILD PROCESS<BR>CREATE CUBE DIMENSION<BR>CREATE DIMENSION<BR>CREATE DOMAIN<BR>CREATE JOB<BR>CREATE MINING MODEL<BR>CREATE MLE<BR>CREATE SESSION<BR>DEBUG CONNECT SESSION<BR>EXECUTE DYNAMIC MLE<BR>FORCE TRANSACTION<BR>ON COMMIT REFRESH|

# ロール

| CONNECTロール | RESOURCEロール | DB_DEVELOPER_ROLEロール |
|:----|:----|:---|
|なし| SODA_APP |CTXAPP<BR>RESOURCE|

# オブジェクト権限

| CONNECTロール | RESOURCEロール |
|:----|:----|
|なし|なし|

### DB_DEVELOPER_ROLEロール
| 権限 | オブジェクト |
|:----|:----|
|EXECUTE|DBMS_REDACT|
|EXECUTE|DBMS_RLS|
|EXECUTE|DBMS_TSDP_MANAGE|
|EXECUTE|DBMS_TSDP_PROTECT|
|EXECUTE|JAVASCRIPT|
|READ|V_$PARAMETER|
|READ|V_$STATNAME|
|SELECT|DBA_PENDING_TRANSACTIONS|

# おわりに
ユーザーに権限を付与する場合は「最小権限」アプローチを使用することをお薦めします。セキュリティの観点からは、ユーザーの権限が少ないほど、攻撃対象領域が小さくなります。

DB_DEVELOPER_ROLEロールにはCONNECTロールとRESOURCEロールを組み合せた権限より多くの権限があります。利用が適切かどうかを判断して利用しましょう。

### 参考情報

- [Use of the DB_DEVELOPER_ROLE Role for Application Developers ](https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/managing-security-for-application-developers.html#GUID-DCEEC563-4F6C-4B0A-9EB2-9F88CDF351D7)
- [DB_DEVELOPER_ROLE Role in Oracle Database 23c](https://oracle-base.com/articles/23c/db_developer_role-23c?elq_mid=254707&sh=162213171842672613262522150144187&cmid=DEVT230612P00024C00011)
sqlc-gen-typescript MySQLでWhere Inを無理やり通す

解決方法がわからないので、ひとまず無理やり通した。
sqlc.sliceとかがうまく動かない。

```sql
-- name: readUserWhereInIdList :many
SELECT
  *
FROM
  users
WHERE
  id IN (?);
```

```ts
const idList = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const list = await readUserWhereInIdList(connection, {
    id: idList as unknown as string,
});
```

型安全でもなんでもないけれど……。
なんかよい方法知っていたら教えてください。
Laravel 11のSail環境(PHP 8.3)をLaravel 10 + PHP 8.2にする


2024/5/10現在、Laravelの最新バージョンは11です。

この時点で、Laravelを含むDocker環境を簡単に構築できるLaravel Sailを利用すると、Laravel 11およびPHP 8.3の環境となります。

弊社の現在の最新環境はLaravel 10およびPHP 8.2のため、このバージョンに合わせた環境をSailで用意する手順をまとめました。


環境情報
--------

| 項目 | バージョン |
|------|----------|
| OS | macOS 13.6.5 |
| Docker Desktop | 4.22.1 |


Laravel Sailを利用したLaravelプロジェクトの生成
--------------------------------------------

macOS向けのLaravel Sailを利用したLaravelプロジェクトの生成手順は以下にあります。

[Sail on macOS](https://laravel.com/docs/11.x/installation#sail-on-macos)

標準のまま生成する場合は、以下のコマンドを実行します。（プロジェクト名を `example-app` とする場合）

```shell
$ curl -s "https://laravel.build/example-app" | bash
```

このとき、クエリパラメータとして `php=82` のように導入するPHPのバージョンを指定することができますが、Laravelのバージョンは指定できないようです。

ただ、ここでPHP 8.1を指定するとLaravel 10で構築されるようなので、まずはこれでプロジェクトを生成します。

```shell
$ curl -s "https://laravel.build/example-app?php=81" | bash
```

プロジェクトのファイル一式が生成されたら、その中に含まれる docker-compose.yml 内の★箇所を `8.1` から `8.2` に変更します。

```yml
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.2     # ★
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.2/app                                 # ★
```

Dockerイメージを再構築します。

```shell
$ sail build --no-cache
```

Sailを起動し、バージョンを確認します。

```shell
$ sail up -d
$ sail artisan --version
Laravel Framework 10.48.10
$ sail php --version
PHP 8.2.18 (cli) (built: Apr 11 2024 20:37:35) (NTS)
```

http://localhost/ でLaravelの初期画面にアクセスします。

![Laravel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622679/2d8e4797-9bdc-b27d-7748-f0e4540d3e38.png)

これでLaravel 10とPHP 8.2の環境になりました。


### データベースをPostgreSQLに変更する

標準では一緒にMySQLがインストールされますが、弊社ではPostgreSQLが主流なのと、Redisも利用しているため、対象を変更しようと思います。

この場合、プロジェクト生成時に実行するコマンドに、以下のように `with=<service>,<service>,...` を指定します。

```shell
curl -s "https://laravel.build/example-app?php=81&with=pgsql,redis" | bash
```

[Choosing Your Sail Services](https://laravel.com/docs/11.x#choosing-your-sail-services)


運動通信社について
----------------

運動通信社は「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、一緒に働く仲間を募集しています！
PMやモバイルエンジニア、Webエンジニアなど色んな職種を募集しておりカジュアル面談大歓迎なので是非採用フォームよりご連絡ください！
ぜひ一緒に、自分たちも世の中もワクワクするサービスを作りましょう！

https://sportsbull.jp/about/#recruit
SESのいいとこ、わるいとこ（いいとこ編）

前回の記事ではいいとこ、わるいとこを列挙させていただきました。
本記事では、なぜ？どこが？といったところをエンジニア目線で掘り下げたいと思います。

## 自分が身につけたいスキルを習得し実務に生かせる
自社サービスや受託会社では配属される案件は過去の経歴や現在のスキルを踏まえた上で、
会社にとっての最大のメリットを考え業務命令で配属されることが多いかと思います。

会社・業績に貢献するといった意味ではすごくいいことだと思いますが、
エンジニアとして先のキャリアを考えたときにこれが正解だとは限りません。
開発言語、フレームワークのトレンドの移り変わりは激しく5年もたてば過去のもの、
エンジニアからしてもできるだけトレンドについていって最前線で開発を続けていきたいという考えは当たり前のことだと思っています。
かといってこれが正解とも限りません。

そこでSESの**案件選択**というのは１つの手段だと考えています。
今ある手持ちの武器で戦い続けたい人もいれば、常に新しい武器で戦っていきたい人もいて千差万別。
その人それぞれに合った案件で仕事を続けていく、自身のメリットだけを考えれば間違った選択ではないと思います。
そこでスキルと経験をしっかりつけて希望の企業からのスカウトを待ち、最終的に自分の理想のキャリアに就くこれが出来れば最高のエンジニアライフだと思います。

これが実現できるかできないかは自身の日々の努力、SESではこれ次第で色々な道が切り開けると考えています。

## 経歴とタイミング次第では自分が理想とする案件に参画できる
前述のとおりSESでは案件選択や案件自由選択を謳っている企業が多数あります。
こういったSES会社であれば待機になるリスクを覚悟すれば自身の理想の案件に参画も可能です。
ただし、これには経験とスキル、実績は十二分に積んでおく必要があり、
さらにはエンジニアさんが待機するとなる給与などの減額、経歴に穴が開いたりとリスクもあるためしっかりと準備は必要です。

## 自分の都合で案件を抜けることもできる
言い方次第ですが、参画した案件が自身にあった案件出なければ契約の継ぎ目で離任も可能です。
ただし、リスクとして会社の評価、自身の経歴に短期の経歴がつく、などのリスクもありますが、
基本的には一度案件参画したら抜けれないといったことはないので、担当さんと話し合って次の案件を探してもらうことは可能です。

## リモート案件もまだまだ多い
コロナ渦が落ち着き現場出社の現場が増える中、特に開発エンジニアの現場はフルリモートやハイブリッドでの業務他業種に比べると多く残っています。

というのも、コロナ渦にオフィス規模を縮小したり、デスクを片付けたり、拠点を地方に移したといった企業様がいらっしゃるのでおのずとリモートでの業務は一定数残り続けると思います。

## プロフェッショナルを目指すならいい環境
SESは短期でキャリアアップを望むなら正直不向きです。
なぜなら案件の面談ないし書類選考時点で経歴が無ければ土台にすら登れないことも多いからです。
やはりSESを利用する側としたら即戦力を望むからです。

とはいえ、開発エンジニア、テストエンジニアなど特定の分野のプロフェッショナルを目指すには適した環境です。
一定以上のスキル、経歴をお持ちの方であれば勝手に案件が舞い込んでくるので買い手有利で仕事ができるようになります。

## 現場では意外と自分の意見が通りやすい
現場で元受けプロパの若手エンジニアさんが先輩からあれやこれや叱責されたり、毎日残業残業の日々だったりといった光景を目撃された方は少なくないと思っています。

SESとして現場さんに入られているエンジニアさんは指示系統の都合などの兼ね合いで比較的精神的には落ち着いて業務にとりかかれます。
また、プロパさんは配置転換などで人の移り変わりがありますが、SESエンジニアさんはプロジェクト単位での参画であるためそういうことは少なく意外と意見や提案は重宝されるし通りやすい環境であると思います。

## 転職が簡単
究極を言えば案件、会社の待遇が気に入らなければフットワーク軽く転職可能なのがSES業界です。
都内だけでも１万社以上、未経験でなければすぐに転職先は見つけられます。
ただし、転職は諸刃の剣。
転職数が多いとそのうちだれも取り扱ってもらえなくなります。
転職というカードのご利用は計画的に。

今回は前記事「[SESのいいとこ、わるいとこ](https://qiita.com/bss_nagasawa/items/d42bfd23eb14a52642fe)」で列挙したいいとこを掘り下げてみました。

皆さんのエンジニアライフのご参考になればと思います。

ここまでのご拝読ありがとうございました。
次回は「[SESのいいとこ、わるいとこ（わるいとこ編）](https://qiita.com/bss_nagasawa/items/d42bfd23eb14a52642fe)]になります。

2024/5/15「[SESのいいとこ、わるいとこ（わるいとこ編）](https://qiita.com/bss_nagasawa/items/d42bfd23eb14a52642fe)」を公開しました。


【PR】
弊社の採用ページもぜひあわせてご覧下さい。
https://recruit.bss-j.co.jp/
Ubuntuを入れた後の設定手順

---
title: Ubuntuを入れた後の設定手順（localaization）
tags: Ubuntu 
author: HayatoKitagawa
slide: false
---
# はじめに

Ubuntu22.04をPCに入れた後，インストールすべきもの・設定するものを記載します．

**1.インストールすべきものについて **

## 1. インストールすべきものついて
・google chromeのインストール
⇒デスクトップ左上のFirefox Web Browserでgoogle chromeのinstall方法を検索するか
⇒「https://arakoki70.com/?p=7141」
を参考にインストールする

・slackのインストール
「https://slack.com/intl/ja-jp/help/articles/212924728-Linux-%E7%89%88-Slack%EF%BC%88%E3%83%99%E3%83%BC%E3%82%BF%E7%89%88%EF%BC%89%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B」
を参考にinstallを行う
⇒ダウンロードでもいいし，コマンド「sudo snap install slack」打ってもよい

・Mozcの設定
「https://lilaboc.work/archives/29007972.html」
を参考に
「sudo apt update」
「sudo apt install ibus-mozc」
「Y」は途中で入力
「sudo reboot」で完成
⇒右上で日本語入力したいなら変えてください
・zoomのインストール
「https://zoom.us/download?os=linux」公式からダウンロード
linux typeを「ubuntu」で「64bit」を選択し，ダウンロード
⇒ダウンロードファイルにあるzoomを右クリックし，「open with another application」を選択
⇒software installを押す．時間が経てばデスクトップにzomウィンドウが表示される
⇒右上のinstallを押し，待機で完了
・anydeskのインストール
「https://anydesk.com/ja/downloads/linux?dv=deb_64」を参考にダウンロード
⇒パスワード設定しておいたほうが便利
⇒赤色の「set password」を選択する
⇒settingsの「security」内のpermissionsの「enable unattended access」にチェックを押す
自分のお好きなパスワードを設定してください「1 184 391 391」
・vscodeのインストール
「https://invisiblepotato.com/ubuntu07/」を参考にインストール
「https://code.visualstudio.com/Download」はvscodeインストール画面
・CloudCompareのインストール
「https://faboplatform.github.io/AutowareDocs/02.3D_Map/02.3d_map_edit/」を参考に
【visionOS】RealityViewで描画した3Dモデルに影をつける

本記事ではRealityViewで描画した3Dモデルに影をつけるを紹介します。
(※技適特例届け出済み)

## はじめに

WWDC2023のセッションにある『[空間デザインの原則(Principles of spatial design)](https://developer.apple.com/videos/play/wwdc2023/10072/)』では、影の重要性について以下のように述べられています。

> Depth needs to be reinforced with visual cues like light and shadow. Some objects emit light, like the movie screen we just saw. The light shines onto the floor and ceiling, highlighting its position in the room. Any object that appears to emit light should shine color onto nearby objects. And most other objects should cast a shadow, like this window over the table. This grounds them and makes them look more integrated into the space. Any custom objects in your app should cast shadows too

![スクリーンショット 2024-05-10 11.48.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1042576/23bdcead-12cb-a466-8763-99154a0c4649.png)
引用: [Principles of spatial design - WWDC2023](https://developer.apple.com/videos/play/wwdc2023/10072/)

影は、物体が実際の空間に存在しているように見せるためにも重要な役割を果たします。空間デザインを行う際には、影の効果を意識することが大切になってきます。

## デモ

### 影なし
![スクリーンショット 2024-05-09 19.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1042576/8607da22-fc91-b28a-72f5-36ba46b3e4e5.png)

### 影あり
![スクリーンショット 2024-05-09 19.51.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1042576/02ec5c63-ef52-9a24-1dcd-d527a5c21a6c.png)

オブジェクトに影を追加することで、スニーカーの奥行き感と現実感が向上しました。影は、3Dモデルをより自然に空間に統合するために重要な役割を果たしていることがわかります。

## 実装

`ModelEntity`に`GroundingShadowComponent(castsShadow: true)`をセットするだけで影が追加されます。

```swift
var body: some View {
    RealityView { content in
        if let entity = try? await ModelEntity(named: "sneaker_pegasustrail") {
            ...
            // GroundingShadowComponent(castsShadow: true)を追加する
            entity.components.set(GroundingShadowComponent(castsShadow: true))
            ...
            content.add(entity)
        }
    }
}
```

※3Dモデルは[こちらのギャラリー](https://developer.apple.com/jp/augmented-reality/quick-look/)からダウンロードできます。

## 参考資料

https://developer.apple.com/videos/play/wwdc2023/10072/

https://developer.apple.com/documentation/realitykit/groundingshadowcomponent

https://developer.apple.com/jp/augmented-reality/quick-look/
a-5-1-1.Realm DBのライブラリの選定と適用(Gradle)

### a-5-1-1.Realm DBのライブラリの選定と適用(Gradle)

#### 目標設定
[一覧に戻る](https://qiita.com/ryouta33/items/57f5e51a26086151a0da)

#### Github

https://github.com/wakizaka24/AndroidTest

#### テスト実装

```gradle:build.gradle
buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.5.3"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

plugins {
    id 'com.android.application' version '8.0.2' apply false
    id 'com.android.library' version '8.0.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.9.22' apply false
    id 'io.realm.kotlin' version '1.11.0' apply false // 追加
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
```

```gradle:app/build.gradle
plugins {
    id "com.android.application"
    id "org.jetbrains.kotlin.android"
    id "androidx.navigation.safeargs"
    id 'io.realm.kotlin'
}

android {
    compileSdk 34

    defaultConfig {
        applicationId "com.example.androidtest"
        minSdk 21
        targetSdk 34
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    viewBinding {
        enabled = true
    }
    namespace 'com.example.androidtest'
}

dependencies {
    implementation "androidx.core:core-ktx:1.8.0"
    implementation "androidx.appcompat:appcompat:1.4.2"
    implementation "com.google.android.material:material:1.6.1"
    implementation "androidx.constraintlayout:constraintlayout:2.1.4"
    implementation "androidx.recyclerview:recyclerview:1.2.1"
    implementation "androidx.cardview:cardview:1.0.0"

    def navigation_version = "1.0.0"
    implementation "android.arch.navigation:navigation-fragment:$navigation_version"
    implementation "android.arch.navigation:navigation-ui:$navigation_version"
    implementation "android.arch.navigation:navigation-fragment-ktx:$navigation_version"
    implementation "android.arch.navigation:navigation-ui-ktx:$navigation_version"

    def retrofit_version = "2.9.0"
    implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
    implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"

    def realm_version = "1.11.0" // 追加
    implementation "io.realm.kotlin:library-base:$realm_version" // 追加
    implementation "io.realm.kotlin:library-sync:$realm_version" // 追加
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0' // 追加

    testImplementation "junit:junit:4.13.2"
    androidTestImplementation "androidx.test.ext:junit:1.1.3"
    androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0"
}
```
【ChatGPT＋DALL-E3】報告。“リクエストに基づいて新しい画像を生成することができませんでした”→続ける方法


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

　今回は、報告とその解法です。“リクエストに基づいて新しい画像を生成することができませんでした”と出てきたので、それを書きます。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　まずは、ニュース。

　昨日（2024/05/09）
　　ChatGPTの
　　　チームプランにも
　　　　メモリー機能が
　　　　　実装されたそうです。

　次に
　　今朝（2024/05/10 10:00頃）
　　　ChatGPTに
　　　　地味な変更が
　　　　　施されました。

　　アイコンが
　　　小さく可愛くなりました。

　　変える必要があったのか？
　　　と疑問に思うところですが……。

　その前に
　　バグをなんとかして欲しいですね。

　　・ファイルアップロードの
　　　　クリップの位置
　　・セッション中の
　　　　出力に付随して
　　　　　出てくるアイコンの位置

　　まぁ、
　　　困るわけでは
　　　　ないんですけどねぇ……😅

　ちなみに、
　　出力に付随して
　　　出てくるアイコンですが、
　　　　何もしなくても出るように
　　　　　戻されていますね👍
***
　次は、
　【カーブミラー企画その６】を開催。

　　テーマは『#AIゴミから芸術』

　　捨てられるゴミを
　　　芸術品に昇華してもらいます。

　詳しくは、
　　下記ポストから、どうぞ。
[X-Twitterポスト](https://x.com/kabumira862571/status/1788573293530021978?t=aoXuWJ0zfSgDmwNxgTyKMw&s=03)
***
　さて、本題です。

　今回は、報告です。

　とりあえず、
　　やり取りをどうぞ。
***
***user***
カップ焼きそばの湯切りのシーン。描画

***ChatGPT***
![1715310547712.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/874e5b54-f871-5664-b764-8191cd3b91ea.jpeg)

***user***
湯切りのお湯は、カップから

***ChatGPT***
湯切りのお湯は、カップから流れ出てシンクに注がれています。画像では、蒸気が立ちのぼる中、お湯がカップの端から流れ落ちる様子がリアルに描かれています。

***user***
そうはなっていません

***ChatGPT***
失礼しました。画像を改めて確認したところ、確かに湯切りのお湯がカップから流れるシーンが適切に描かれていないかもしれません。もし具体的な修正点がありましたら、教えてください。それに基づいて新しい画像を生成いたします。
（“確認した”というのは“解析した”とは違うので、言葉上での言い訳ですね）

***user***
カップから捨てて

***ChatGPT***
理解しました。カップからお湯を捨てる瞬間をもっと明確に表現するために、新たな画像を生成いたします。それでは、人物がカップのふたを開けてお湯をシンクに捨てているシーンを描いてみますね。

（ここで少しの間）

申し訳ありませんが、リクエストに基づいて新しい画像を生成することができませんでした。別のシーンや内容であれば、画像を生成することが可能ですので、ご要望があれば教えてください。
***
　ここです。

　“リクエストに基づいて新しい画像を生成することができませんでした”
　　という言葉がありますが、
　　　“Analyze”とか“Create Image”とか
　　　　処理を示すことが
　　　　　何も出てきていません。

　DALL-E3に依頼が行けば、
　　エラーがあったとしても
　　　なんらかの処理を示します。

　ですから
　　これは、ChatGPT側で
　　　間を開けたことになります。

　同じプロンプトを
　　処理させないため、とも
　　　考えられますが、
　　　　なんとも言えません。

　ともかく、
　　こんな言葉が
　　　出てきたら、
　　　　変更の指示を
　　　　　与えない限り、
　　　　　　DALL-E3へは
　　　　　　　指示してくれない
　　　　　　　　ことでしょう。
***
　では、どうするか？
　　　
　簡単です。

　“英語プロンプト出力”と指示して、
　　Promptを吐き出させ、
　　　コピーしてください。

　新たにセッションを開き、
　　コピーしたPromptを
　　　ペーストして
　　　　送信するだけです。

　これで
　　画像生成に進みます。

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

　今回は、ここまで。
キャッシュでうまく表示されない。そんな時は「スーパーリロード」だ！

## 前置き
Webページを更新したにもかかわらず、変更内容が反映されないことはよくあります。
これは、ブラウザのキャッシュが問題となるケースが殆どです。ブラウザのキャッシュの問題を解決する手段として使われるのが、スーパーリロードです。

## スーパーリロードとは
Webページのキャッシュやブラウザのキャッシュを無視して、常にサーバーから新しい情報を取得するため、最新の状態を反映することができます。
<br>
反面スーパーリロードはとても便利ですが、サーバーから全てのデータを取得してくるため、表示速度が遅くなります。また、<b>Webサイトの設定やログイン情報がリセットされる場合がある</b>ので注意が必要です。

## スーパーリロードの方法
### Windows
Google Chrome
>・「Ctrl + Shift + R」
・「Shift」キーを押しながら「ボタン」をクリック
・「Ctrl」キーを押しながら「ボタン」をクリック

### Mac
Google Chrome
>・「Cmd + Shift + R」
・「Shift」キーを押しながら「ボタン」をクリック

## それでも解決しない時
キャッシュを削除するとより確実です。
また、スマートフォンではキャッシュが強く残るため、スーパーリロードよりもキャッシュ削除をおすすめします。
#include "M5NanoC6.h"がないといわれるとき、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/68773b09-54a2-2309-3f87-9fd9c2e0ecfc.png)

以下の配下を、.inoと同じディレクトリに入れたら、コンパイルが通った。
https://github.com/m5stack/M5NanoC6/tree/main/src
eslintルール「label-has-associated-control」エラーを修正する方法

## `A form label must be associated with a control  jsx-a11y/label-has-associated-control`の対処

### 使用しているライブラリ
プロダクトでアクセシビリティチェッカー`eslint-plugin-jsx-a11y`を導入しています。
その中でも今回遭遇したlabelタグに関するエラーの対処について。


`eslint-plugin-jsx-a11y`内ではlabelタグがテキストラベルと関連する要素を持っているかを下記で確認しています。

https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/label-has-associated-control.md


###  今回表示されたエラー
`A form label must be associated with a control  jsx-a11y/label-has-associated-control`

#### 対処

基本的に最新のブラウザではラベルをコントロールに関連づけることが可能。なのでlabelタグでラップしてあげれば良さそう。[参照MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/label)
```
<label>
  Surname
  <input type="text" />
</label>
```

下記はこのエラーが発生する例↓
```
<input type="text" />
<label>Surname</label>
```

明示的にコントロール要素を指定したい場合。
```
<label htmlFor={domId}>Surname</label>
<input type="text" id={domId} />
```
この時、labelタグのfor属性とinputのid属性の値は等しくなければならない。


### なぜlabel要素にコントロールが必要か
MDNより引用


>ラベルのテキストが、対応するテキスト入力欄に視覚的に関連付けられるだけではありません。プログラム的にも関連付けられます。つまり、例えばユーザーがフォーム入力欄にフォーカスを移動した時、読み上げソフトがラベルを読み上げ、支援技術のユーザーが何のデータを入力するべきか理解しやすくすることができます。

スクリーンリーダーの読み上げ時に効果的。

>関連付けられたラベルをクリックして、入力欄自体をクリックした場合と同様に、入力欄にフォーカスを与えたりアクティブ化にしたりすることができます。こうしてヒット領域を拡大すると、タッチパネルの端末を使用している場合を含めて、入力欄をアクティブ化させやすくなります。

小さなチェックボックスを目掛けて指で画面をタッチするのは難しいけど、対象の枠が広がればクリックしやすくなる。昨今スマホユーザーが利用すること多くなってきているので、ここは重要になってくるかなと思います。

詳しく知りたい方は、こちらの記事が勉強になるかと思います。

https://zenn.dev/nako_110/articles/ce7e9a453dfd07
React nativeでExpo使用時にCould not connect to development server.

# 事象

ExpoGoいれていざシミュレーターでビルドしようとしたら出るエラー。

```
URL: http://192.168.~~~:8081/src/main.ts.bundle?
platform=ios&dev=true&hot=false&transform.engine=hermes&transform.bytecode=tr ue&transform.routerRoot=app
```

こいつにアクセスできないとかでエラーが出てるがそんなファイルは存在しない。シミュレーターのsafariで対象の192.168を入力したところアクセスできるのでネットワーク関連の線は薄い。

StackOverFlowでは```npm install```で解決したやらキャッシュがどうのこうの```watchman```の削除で動くようになったやら色々あった。

が、いずれも解決せず。

# 解決法

/Users/user名/Library/LaunchAgentsのアクセス権を変更する

```
chmod 777 /Users/user名/Library/LaunchAgents
```

# 予想
どうやらwatchmanはファイルの変更を検知するためのものらしい。
そこでビルド時に先ほどのフォルダに自動でplistを作成する。
が、アクセス権が無いので弾かれてしまい監視対象のファイルが検知できなくなったのではと推測
robloxでassistant その25

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
Qiita APIを叩け。


# サンプルコード

```
local HttpService = game:GetService("HttpService")
local URL_API = "https://qiita.com/api/v2/users/ohisama@github/items"
local response = HttpService:GetAsync(URL_API)
local data = HttpService:JSONDecode(response)
--print(data)
for j in data do
	print(data[j].title .. "  " .. data[j].created_at)
end


```

# 実行結果


```
タイトルがないゲーム @ 10 5 2024 11:33 自動復元ファイルが作成されました  -  Studio
  11:33:32.259  robloxでassistant その24  2024-05-10T11:03:06+09:00  -  サーバー - Script:10
  11:33:32.259  robloxでassistant その23  2024-05-10T07:52:03+09:00  -  サーバー - Script:10
  11:33:32.260  robloxでassistant その22  2024-05-10T07:30:07+09:00  -  サーバー - Script:10
  11:33:32.260  robloxでassistant その21  2024-05-10T07:23:24+09:00  -  サーバー - Script:10
  11:33:32.260  robloxでassistant その20  2024-05-10T07:16:38+09:00  -  サーバー - Script:10
  11:33:32.260  robloxでassistant その19  2024-05-10T06:34:17+09:00  -  サーバー - Script:10
  11:33:32.260  robloxでassistant その18  2024-05-09T18:33:24+09:00  -  サーバー - Script:10
  11:33:32.260  robloxでassistant その17  2024-05-09T06:14:47+09:00  -  サーバー - Script:10
  11:33:32.260  robloxでassistant その16  2024-05-09T05:37:06+09:00  -  サーバー - Script:10
  11:33:32.261  robloxでassistant その15  2024-05-07T08:21:49+09:00  -  サーバー - Script:10
  11:33:32.261  robloxでassistant その14  2024-05-05T11:29:40+09:00  -  サーバー - Script:10
  11:33:32.261  robloxでassistant その13  2024-05-05T11:13:47+09:00  -  サーバー - Script:10
  11:33:32.261  robloxでassistant その12  2024-05-05T11:08:48+09:00  -  サーバー - Script:10
  11:33:32.261  robloxでassistant その11  2024-05-05T11:06:47+09:00  -  サーバー - Script:10
  11:33:32.261  robloxでassistant その10  2024-05-05T11:05:22+09:00  -  サーバー - Script:10
  11:33:32.262  robloxでassistant その9  2024-05-04T08:24:24+09:00  -  サーバー - Script:10
  11:33:32.262  robloxでassistant その8  2024-05-04T08:22:15+09:00  -  サーバー - Script:10
  11:33:32.262  robloxでassistant その7  2024-05-04T08:19:49+09:00  -  サーバー - Script:10
  11:33:32.262  robloxでassistant その6  2024-05-04T08:17:09+09:00  -  サーバー - Script:10
  11:33:32.262  robloxでassistant その5  2024-05-04T08:14:43+09:00  -  サーバー - Script:10
  11:33:42.436  Disconnect from ::ffff:127.0.0.1|56245  -  Studio
  11:35:47.355  タイトルがないゲーム 自動復元ファイルが作成されました  -  Studio
```

以上。
Lambdaのセッション管理、ElastiCacheとDynamoDBの比較

# ElastiCacheを使用したセッション管理
## ユースケース
・高速なデータアクセスが必要な場合。
・データが頻繁に変更されるが、一時的なもので永続性が必要ない場合。
・キャッシュのようにデータをキャッシュする場合。

## メリット:
・インメモリデータストアであるため、高速なデータアクセスが可能。
・データが永続的に保存されるため、再起動後もデータが保持される。
・キャッシュとしての利用が容易で、既存のアプリケーションに簡単に統合できる。

## デメリット
・インメモリデータストアであるため、データがメモリにのみ保存され、データのサイズに制限がある。
・コストが高くなる可能性があり、大量のデータを保存する場合は注意が必要。

# DynamoDBを使用したセッション管理
## ユースケース
・データの永続性が必要な場合。
・データの大規模な保存が必要な場合。
・セッションデータを他のデータと一緒に格納したい場合。

## メリット
・データが永続的に保存され、大規模なデータを扱うことができる。
・スケーラビリティが高く、大量のリクエストを処理できる。
・サーバーレスアプリケーションの場合、AWS Lambdaとの統合がシームレス。

## デメリット
・インメモリデータストアと比較して、データへのアクセスがやや遅くなる場合がある。
・インフラストラクチャの管理やスケーリングに関連する運用負荷が発生する可能性がある。

# 終わりに
どちらを選択するかは、アプリケーションの要件やニーズによって異なります。高速なデータアクセスと一時的なデータの保存が必要な場合は、ElastiCacheが適しているかもしれません。一方、データの永続性や大規模なデータの保存が必要な場合は、DynamoDBを選択することができます。
npm-check-updatesで簡単npm package管理生活

# はじめに

package.jsonに羅列されたnpm packageのバージョンを新しくしたい時に使用する**npm-check-updates**。

意外とやりたいタイミング多そうなユースケースの解説の記事がすぐ見つからなかったので、自分用メモ的に。

# 全ライブラリの更新

一番基本の使い方。
グローバルインストールしたくないのでnpxから。

```bash
# チェック
npx -p npm-check-updates  -c "ncu"

# 更新
npx -p npm-check-updates  -c "ncu -u"
```

# 特定ライブラリの指定

```bash
npx -p npm-check-updates  -c "ncu {パッケージ名}"
# e.g.
npx -p npm-check-updates  -c "ncu prettier"
```

# wildcardによる指定

アスタリスクを使用してwildcard指定が可能です。

```bash
# e.g.
npx -p npm-check-updates  -c "ncu aws-cdk* @aws-sdk/*"
```

一緒に更新するものはシリーズものである場合も多いと思います。（記載の例のようにaws-cdkやaws-sdkなど）
このパターンは結構使えますね。

# 正規表現による指定

```bash
npx -p npm-check-updates  -c "ncu '/^(?!gulp-).*$/'"
```

動かしてませんができるらしい。

# インタラクティブに選択

```bash
npx -p npm-check-updates  -c "ncu -i"
```

パッケージの一覧と更新バージョンが出てきて、カーソル上下で移動、左右で更新するかどうかを選択できます。
確定後、そのままyarn install(npmの場合はnpm install)も行ってくれます。
結構便利かも。

# マイナーバージョンまでを最新化

"--target"オプションで指定。

```bash
npx -p npm-check-updates  -c "ncu {パッケージ名} --target minor"
# e.g.
npx -p npm-check-updates  -c "ncu jest --target minor"
```

また、"minor"ではなく"patch"を指定するとパッチバージョンだけ更新できます。


# 特定のパッケージ以外

"-x"で除外対象を指定。

```bash
npx -p npm-check-updates  -c "ncu -x {パッケージ名}"
# e.g.
npx -p npm-check-updates  -c "ncu ―x jest"
```
sqlc-gen-typescript 生成されたinterfaceのkey名を勝手にcamelCaseにしてほしくないとき

現状、勝手にcolumn_nameはsnake_caseだろうがなんだろうがcamelCaseになります。歴史的な事情によりsnake_caseのままにしてほしいときもあるでしょう。特にcamel, snakeなどを切り替えられる機能はないので、直接jsファイルを編集するしかない。

`src/drivers/utils.ts`

```utils.js
export function fieldName(
  prefix: string,
  index: number,
  column?: Column
): string {
  let name = `${prefix}_${index}`;
  if (column) {
    name = column.name;
  }
/*   return name
    .toLowerCase()
    .replace(/([_][a-z])/g, (group) => group.toUpperCase().replace("_", "")); */
  return name;
}
```

こうしてあげれば良い。あとは再度esbuildでout.jsをbuildし直して、wasmもbuildし直せばよい。将来的にsnake, camelなど選べたほうが良いと思うので、そのうちissueにあげておこうかなぁという気持ちはある。
robloxでassistant その24

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
PARTをSINで動かせ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/95da444f-ede0-6145-c94d-67137740a5eb.png)

# サンプルコード

```

local player = game.Players.LocalPlayer
local PlayerGui = player:WaitForChild("PlayerGui")
local gui = PlayerGui:WaitForChild("ScreenGui")
local workspace = game.Workspace
local part = workspace:WaitForChild("Part")
part.Position = Vector3.new(-5, 0, -10)
local x = -30
local function example()
	if part.Position.X > 30 then
		x = -30
	else
		x = part.Position.X + 0.1
	end
	local sin = math.sin(tick() * 2) * 8 + 8
	part.Position = Vector3.new(x, sin, part.Position.Z)
end
game:GetService("RunService").RenderStepped:Connect(example)
print("ok")


```

以上。
Fortranでうるう年の判定

## コード

```fortran
function isLeapYear(year) result(bool)
    use, intrinsic :: iso_fortran_env
    implicit none
    integer(int32), intent(in) :: year
    logical :: bool

    if ((mod(year, 100) == 0) .and. (mod(year, 400) /= 0)) then
        bool = .false.
        return
    end if
    if (mod(year, 4) == 0) then
        bool = .true.
        return
    end if
    bool = .false.
 
end function isLeapYear
```

## 使い方

```fortran
program LeapYear
    use, intrinsic :: iso_fortran_env
    implicit none
    integer(int32) :: year_i, year_n
    integer(int32), parameter :: yearList(4) = [2001, 2004, 2000, 1900]

    do year_i = 1, size(yearList)
        year_n = yearList(year_i)
        if (isLeapYear(year_n)) then
            print *, year_n, "はうるう年です。"
        else
            print *, year_n, "はうるう年ではありません。"
        end if
    end do

contains

    function isLeapYear(year) result(bool)
        integer(int32), intent(in) :: year
        logical :: bool

        if ((mod(year, 100) == 0) .and. (mod(year, 400) /= 0)) then
            bool = .false.
            return
        end if
        if (mod(year, 4) == 0) then
            bool = .true.
            return
        end if
        bool = .false.

    end function isLeapYear

end program LeapYear
```

```:出力
        2001 はうるう年ではありません。
        2004 はうるう年です。
        2000 はうるう年です。
        1900 はうるう年ではありません。
```
OpenAI APIを使用した簡単なリクエストのPHPコード　chatGPT

```php

<?php

$apiKey = 'APIキー';
$endpoint = 'https://api.openai.com/v1/chat/completions';

$headers = array(
    'Content-Type: application/json',
    'Authorization: Bearer ' . $apiKey
);

$user_question = isset($_POST['user_question_s']) ? $_POST['user_question_s'] : '';

$article = array(
    'model' => 'gpt-3.5-turbo',
    'messages' => [
        [
            'role' => 'system',
            'content' => '口コミで使える文章を口コミと言う言葉を使わずに50文字の日本語で考えて'
        ],
        [
            'role' => 'user',
            'content' => $user_question
        ]
    ],
    'max_tokens' => 100
);
自然言語処理のお勉強2

# はじめに
単語の表現方法について勉強したことをまとめます。
想定する読者はプログラム上で単語をどのように扱っているのか知りたい人です。コードなどは記載していないので、どうやって実装するかに興味がある人は違う記事を参照してください。
# 単語の意味をコンピュータに理解させるモチベーション
自然言語処理（NLP）は人間の言葉を理解させ、処理させる技術、タスクのことです。そのNLPで扱う、人間の言葉において、単語は意味の最小単位です。
そのため、コンピュータが理解できる、単語の意味の表現方法を考えると、人間の言葉が理解できそうだと考えられます。
# 単語の表現方法
ここでは2つの表現方法を紹介します。
## シソーラス(thesaurus)
シソーラスとは、類語辞書のことです。同じ意味の単語や、意味の似た単語によって単語の意味を表現します。
加えて、単語の間で上位と下位といった、関連性が定義されている場合もあります。
### 問題点
シソーラスは人手によって定義されているため、以下のような問題があります。
- 作業コストが高い
- 単語の誕生や消滅、意味の変化についていくのが大変
## カウントベースの手法
問題点を解決するための1つの手法がカウントベースの手法です。カウントベースの手法では、コーパス（テキストデータ）から自動的に、人間の言葉のエッセンスを抽出することが目標です。
この手法では、単語をベクトルで表します（分散表現と呼ばれます）。イメージは色の表現方法である、RGBです。(R,G,B)=(2, 3, 255)だとしたら、青が大変強い色だということがわかります。これと同じことを単語でも行います。
しかし、分散表現における要素の値（RGBの 2, 3, 255という数値）はどのように決めるのでしょうか？
### 分布仮説
要素の値を決める理論の根底は分布仮説にあります。分布仮説とは、単語の意味は、周囲の単語によって形成されるというものです。ある単語の周囲にはどのような単語が存在するのか、それを数えてベクトルの要素とします。
例えば、Hello world. Goodbye world. から得られる、helloとgoodbyeのベクトルを求めてみます。helloの周囲にはworldが存在します。goodbyeの周囲にもworldが存在します。ベクトルを[helloの数, worldの数, goodbyeの数]で表すとすると、helloの分散表現は[0, 1, 0]で、goodbyeの分散表現は[0, 1, 0]です。
### 問題点
先ほどの例からわかる通り、コーパスが小さすぎると単語の正確な意味を表現することができません。（helloとgoodbyeが同じ分散表現で表されている）
しかし、コーパスを大きくすることにも問題があります。それはデータサイズが大きくなりすぎることです。コーパスが大きくなると語彙数が増えます。つまり、数を数える対象が増えてしまいます。10万の語彙が仮にあったとしたら、ある語彙の分散表現の長さは10万で、それを10万の語彙分持つことになります。
# 参考文献
ゼロから作るDeep Learning ❷　―自然言語処理編
sqlc TypeScriptでshema.sqlを自動生成する方法

普通にテーブル名を全取得後、SHOW CREATE TABLE example;とするだけ。

```ts
import { appendFileSync } from "node:fs";
import { createConnection } from "mysql2/promise";
export const getSchema = async () => {
	const connection = await createConnection({
		host: "localhost",
		user: "root",
		password: "password",
		database: "database",
		connectionLimit: 10,
		namedPlaceholders: true,
	});
	// biome-ignore lint/suspicious/noExplicitAny: <explanation>
	const [tables] = (await connection.query("show tables;")) as any[];
	// biome-ignore lint/suspicious/noExplicitAny: <explanation>
	const tableNames = tables.flatMap((x: any) => Object.values(x));
	for (const tableName of tableNames) {
		const [schema] = (await connection.query(
			`show create table ${tableName};`,
		)) as any[];
		const statement = Object.values(schema[0])[1] as string;
		appendFileSync("./schema.sql", `${statement};\n\n`);
	}
	await connection.destroy();
};

getSchema();
```

これでschema.sqlが生成できました。全テーブルのCREATE TABLE文が保存されているわけですね。

こういう1回だけしか使わない書き捨てのプログラムは、ついついany型にしてしまう。もっと型安全にしたければzod使えばよろしいが、そこまでせんでも……と思ってしまう。
【Flutter】Wrapの要素に等間隔のスペースを開ける

こんにちは。
今回は、Wrapの要素に等間隔のスペースを開ける方法を紹介します。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

Wrapの引数「alignment」にWrapAlignment.spaceEvenlyを指定します。


# 使用例
```dart

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SizedBox(
        width: double.infinity,
        child: Wrap(
          alignment: WrapAlignment.spaceEvenly, //ここです！
          children: [
            for (var i = 0; i < 3; i++)
              Container(
                color: i.isEven ? Colors.pink : Colors.purple,
                width: 100,
                height: 100,
              ),
          ],
        ),
      ),
    );
  }
}

```

# 実行例
![スクリーンショット 2024-05-10 10.09.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/8737d3e9-bfb8-bc47-61d0-9910968bbba0.png)


# 最後に
ここまで読んでいただき、ありがとうございました！
いいねしてくれたら、スキップして喜びます:heartpulse:
Macの開発用コンソールは何が良いのか？  WARP と iTerm2 + peco を比較

# 様々なサジェストや分かりやすい表示 -> WARPの勝ち

- コマンドをサジェストしてくれる
- ディレクトリ・ファイルを選ぶ時の入力補完がしやすい
- 間違ったコマンドは強調表示してくれる場合がある
- コマンドがエラーで終了した時に色で教えてくれる
-  おすすめのコマンドを自動入力してくれる ( たとえば git push した時に PR 作成するためのコマンドを入力してくれる )

など今までの他のコンソールより優れている

# 設定のしやすさ -> WARPの勝ち

無設定でなかなか使えるWARPは良い。

ただそれは「設定さえすればiTerm2や他のコンソールでも快適に使える」ということでもある。

# タブ切り替えのショートカット -> iTerm2の勝ち

GoogleChromeやVsCodeでは `Option + Command + 左右キー` でタブ切り替えができる。

iTerm2でも設定すればこのショートカットが使える。
https://qiita.com/YumaInaura/items/19b66d47d25ac0e1eee2

だがWARPでは出来ない。ショートカットを設定してみたのだが何故か動かなかった。

タブ切り替えは多く使うショートカットなので各種アプリ間で同じものにしておきたいところだ。


# コンソールからのコピー&ペースト  -> 甲乙つけがたい

## WARP – コマンドと結果だけをコピーできる

WARPでは デフォルトでカレントディレクトリとgitの状態を表示してくれるが、これはコンソールからコピー&ペースとしたときの結果には含まれない

たとえばコンソールには次のように表示されていても

<img width="1512" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/d0ea28a3-70ce-41ce-90b1-a44c96edb8be">

次のようにコマンドと結果だけをペーストできる

```
echo "AAA"
AAA
echo "AAA"
AAA
```

## WARP – GUIでコピーできる

またコマンド実行単位で、GUIからもコピーができる

<img width="396" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/9d1262c0-5cf5-472e-89a4-43f9c85d4782">

## iTerm2 - git状態/カレントディレクトリもコピーされてしまう

iterm2 や他のコンソールでも .profile 系のファイル設定でgit状態を表示できるが、これだと標準出力を駆使する形式のため、
コマンド結果をコピーしようと思った時、git表示の標準出力まで含まれてしまうのが煩わしい

たとえばこんな風にコピペされてしまうのだ

```
$ echo "AAA"                   [main] [~/tmp/aaa]
AAA
$                              [main] [~/tmp/aaa]
```

## iTerm2 – ショートカットでのコピーができる

また別件で、ニッチなテクだが iTerm2 では Command + Shift + C で キーボード操作によるコピーモードに移行できた。

<img width="380" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/ce921172-4d3d-49a7-b80b-e6312fde19ef">

WARPではできなさそう？


#  インタラクティブなコマンド検索 / コマンド履歴 -> iTerm2 + peco の方が好き

## WARP

WARPだと「コマンド履歴を上下に辿るモード」と「コマンド履歴からの検索」でモードが分かれている。これがpecoを使い慣れている自分にはまだ馴染まない。

あと両方とも表示領域が小さい。
コマンド検索は表示領域を伸ばせるようだが、コマンド履歴では無理なようだ。


あとpecoだとコマンド検索で語順を入れ替えても良い塩梅でヒットしてくれるのだが、WARPは前方一致気味にヒットするような気がする。ここは好みが分かれるところだろう。

コマンド検索:

<img width="925" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/517f543d-a902-422b-933c-b9fee2ff3313">

コマンド履歴:

<img width="617" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/63eb062b-0fbd-4bdf-9d2c-8d90f0133c17">

## iTerm2 + peco

これが peco だと両者を同時にできる。
表示領域もフルサイズになるところが自分の好みだ。

<img width="663" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/df371cd8-908d-4b8c-ac0f-37ab7f0d7889">

---

ちなみにpecoの設定は `~/.zshrc` に以下を設定すれば良い

```zsh
# Peco
function peco-history-selection-keep() {
  BUFFER=$(history -n 1 | tail -r  | awk '!a[$0]++' | peco --layout=bottom-up --query="$BUFFER" --print-query | tail -n 1)

  CURSOR=$#BUFFER
}
zle -N peco-history-selection-keep
bindkey '^R' peco-history-selection-keep
```

# Vim での日本語入力 -> iTerm2 の勝ち

WARPだと何故か日本語入力中にコンソール中に文字が表示されない。

「iTerm2なら出来たのに！」

<img width="221" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/8267cc61-3785-49a9-a17b-e9436e053328">



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
sqlc-gen-typescriptでMySQLでもinsert後のIDがほしい

## Insert後のIDがほしいときがある

pgならばRETURNとかで制御できるみたいだが、MySQLでは機能しない。

しかし、sqlc-gen-typescriptのexampleに下記のような`query.sql`がある

```sql
/* name: CreateAuthorReturnId :execlastid */
INSERT INTO authors (
  name, bio
) VALUES (
  ?, ?
);
```

ただ、現行バージョンの0.1.3だと動かない。

どうも最近追加された機能らしく、最新のgitをcloneして自分でbuildすれば使えるようになる。

## ビルドの手順

Makefileがあるのでそのままmakeでも良いが……。

```
examples/plugin.wasm: out.js
	./javy compile out.js -o examples/plugin.wasm
```

ここの部分を実行するとplugin.wasmが生まれる。つまりjavyのv1.2.0のgzファイルをダウンロードし、gunzipし、そこで実行可能とすれば良い。もし名前を変えたければmvでjavyにしても良いけれど、どっちでも良い。

```sh
wget https://github.com/bytecodealliance/javy/releases/download/v1.2.0/javy-x86_64-linux-v1.2.0.gz
gunzip ./javy-x86_64-linux-v1.2.0.gz
chmod +x ./javy-x86_64-linux-v1.2.0
./javy-x86_64-linux-v1.2.0 compile ./out.js -o ./plugin.wasm
```

これでplugin.wasmが生成される。
あとはどこかに静的ファイルとしてhostしても良いけれど、ローカルで使うならば`sqlc.yaml`の`url: https://downloads.sqlc.dev/plugin/sqlc-gen-typescript_0.1.3.wasm`となっている部分を`url: file://plugin.wasm`とすればローカルファイルを読みこむことができる。hashについては自分で計算しても良いし、そもそもhashチェックしないように項目を省いてあげても良い。

という感じですね。はい。そのうちバージョンアップされたら普通に要らなくなる記事ですが……。もしハマっている人がいれば。
Dockerでngrokを使って、Macのlocalhost:3000で動いているアプリを公開する方法

## 結論
```
docker run -it -e NGROK_AUTHTOKEN=<token> -p 4040:4040 ngrok/ngrok http host.docker.internal:3000
```

## 解説 
 
 [公式サイト](https://ngrok.com/download)には

```
docker run -it -e NGROK_AUTHTOKEN=<token> ngrok/ngrok http 80
```

と書かれていますが、これだとdockerの80番ポートを公開しているので、macの80番ではありません。
この時、Ngrok Agentがアクセスできず、`ERR_NGROK_8012`というエラーが出ます。



なので、host.docker.internalを使って、dockerからMacにアクセスしてもらいます。

```
docker run -it -e NGROK_AUTHTOKEN=<token> -p 4040:4040 ngrok/ngrok http host.docker.internal:3000
```
4040をマッピングしてるのは、4040でngrokの管理画面が動いてるからです。

誰かの時間の削減になればと＞＜
生成AIの推進：Aimpoint Digitalからの学び

2024年5月7日、[Dataiku 2023 Everyday AI Conferences](https://www.dataiku.com/stories/everyday-ai-conference-live/)のダラス・ロードショーでの講演の冒頭で、対話型生成AI技術がどのようにして誕生したのか、数年にわたる包括的な歴史を紹介した後、Aimpoint DigitalのAI部門責任者である[Aaron McClendon](https://www.linkedin.com/in/aaronmcclendon137/)は、"これで実際に何ができるのか？"という講演の土台となる質問を投げかけた。

長年のDataikuパートナーであるAimpoint Digitalは、あらゆる規模の企業や業界に対して、オーダーメイドの包括的なデータおよび分析サポートを提供してきました。そのため、クライアントの全体的な戦略におけるデータの活用方法について、どのような要望にも対応できます。「幅広い業種のクライアントを抱えていますが、リクエストの内容は構造化データと非構造化データの2つに大別されます。"構造化データ"とは、テーブルやデータレイク（情報の一元管理されたリポジトリなど）のようなデータセットに対するクエリを指します。"非構造化データ"とは、大きなPDFやプレゼンテーション、電子メールでやり取りされる情報のようなデータを指します。

## Gen AIの課題： コスト、レイテンシー、決定論

#### コスト
情報セキュリティとそれに伴うコストは、マクレンドンが最初に提起した懸念事項です。「モデルをデプロイする場合、それを安全に保つ方法は多数存在します。適切な管理を行わないと、データが漏洩し、公開されてしまう可能性があります。」彼は聴衆に対し、情報をいかに安全に保つかということだけでなく、費用対効果とセキュリティのバランスを取ることも考慮するよう求めました。「常時オンで常時利用可能なシステムを導入することはできますが、その分コストがかさみます。データが安全であることを確認するために、適切な管理と契約が行われていることを確認する必要がある。」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/a33e0561-21fd-7193-3a00-af998b653465.png)


#### レイテンシー
ソリューションが安全であることを確認するだけでなく、モデルが実際に受ける負荷を見直すことを勧めました。「レイテンシーも考慮すべき要素のひとつです。一度に8000から9000のリクエストが入ってくるようなアプリケーションを構築したことがありますが、そのようなリクエストを大規模に処理できるかどうかは考えるべきことです。」

AIソリューションを大規模に実装する場合、そのアプリケーションを使用するユーザーの数だけでなく、そのユーザーがどのようなレイテンシーを要求しているのかを注意深く把握することが重要です。彼は、カスタマーサービス担当者について具体的な例を挙げました。このグループは通常、顧客の質問に答えるため、さまざまなソースから幅広い情報を与えられています。「彼らは何百ページものPDFを調べたり、スーパーバイザーに相談したり、セキュアな環境でモデルに質問を入力したりします。このようなリアルタイムのシナリオでは、低レイテンシー要件が必要です。

#### 決定論
マクレンドンは示唆に富む質問をしました。「もし2人のユーザーが同じ質問をしたら？同じ意図であっても、2つの異なる答えが返ってくるかもしれません。モデルは、同じ質問が来れば同じ答えが返ってくるように設定できますが、意図はもっとデリケートな問題です。2人のユーザーが同じ質問をするつもりでも、まったく同じではなく、似たようなものであった場合、回答はまったく異なるものになるかもしれません。」彼はここでも指導を行いました。「パラメーターの設定にはさまざまな方法があります。」モデルを微調整することができます。

## Dataikuを使って非構造化データを利用するモデルを構築する
マクレンドンは次に、実際のユースケースを紹介しました。彼は、エンジンの燃料タイプ、走行距離、保証のランクなど、フォードのさまざまな車両パラメータを含むテーブルの画像を表示しながら、「私たちは、Dataiku環境にこれらを多数導入しています」と話し始めました。「誰かがCSRに電話をかけてきて、"この車を持っています。この保険に入るにはいくらかかりますか？" この文書は300ページのPDF文書の1つに過ぎない。もし誰かが新人で、この情報をどこで探せばいいのかわからない場合、モデルはこのデータ発見を加速させることができます。」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/58946239-10a9-176f-0822-36bef712e5da.png)


その後、Python Dashを使って構築された別のDataikuの実装に移行しました。ユーザーは、「非構造化データまたは構造化データを直接データベースに接続し、情報を取り込むことができます。さらに、動的にファイルをアップロードする機能も備えています。」要するに、彼のチームが作ったのは、ユーザーが継続的に更新されるデータセットを利用する方法であり、それによってモデルを継続的に更新し、時間の経過とともに精度を高めていく方法です。

## 質の高いデータが質の高いモデルを生み出す
最後に、マクレンドンは、[質の高いデータ](https://discover.dataiku.com/data-quality/)の重要性を強調しました。
**「モデルへの情報提供の仕方が、返ってくるレスポンスの質を左右させます」**

また、産業界はモデルのハルシネーション（AIモデルが誤った情報や誤解を招く情報を作り出すこと）を理解し、回避するために努力する必要があると述べました。彼は、聴衆が生成AIモデルに送り込む情報は、すでに正確で有用なものであると同時に、時間の経過とともに微調整と最適化によってシステムが継続的に最適化されることを理解していることを確認しました。

## セッション全体を見る
AIを活用してチームの自動化、要約、洞察の収集などを支援する方法について学び始めましょう。Everyday AIセッションの全容をご覧いただき、Generative AIソリューションを組織で拡張する方法について[こちらの動画](https://content.dataiku.com/everydayaidallastalks/srzxnrkgd4e9a4c9twqf)を閲覧ください。

原文：[Scaling GenAI Initiatives: Insights From Aimpoint Digital](https://blog.dataiku.com/scaling-genai-initiatives)
銀行名とその支店名をCSVでダウンロードしたい！！


### Pythonと「銀行くん」APIで銀行と支店のデータを取得し、保存する方法

このガイドでは、「銀行くん」APIを使って日本全国の銀行とその支店情報を取得し、それをCSVファイルに保存する方法を分かりやすく説明します。
この手順は、プログラミングが初めての方やデータ収集に興味がある方にも理解しやすいようにしています。

#### 1. Pythonのインストール
Pythonをインストールする手順は以下の通りです。

- [Python公式サイト](https://www.python.org/downloads/)へアクセスします。
- 「Download Python」ボタンをクリックして、お使いのオペレーティングシステムに適したインストーラをダウンロードします。
- ダウンロードしたインストーラーを実行します。
- インストール中に「Add Python 3.x to PATH」のチェックボックスを選択してください。これにより、PythonがシステムのPATHに追加され、コマンドプロンプトから直接Pythonを実行できるようになります。
- インストールが完了するまで指示に従って進めてください。

#### 2. コマンドプロンプトの起動
コマンドプロンプトを起動する方法は以下の通りです。

- Windowsキーを押し、「cmd」と入力して検索します。
- 検索結果に表示される「コマンドプロンプト」をクリックして開きます。

#### 3. 必要なライブラリのインストール
Pythonでデータを扱うためには、追加のライブラリが必要です。以下の手順でインストールします。

- コマンドプロンプトが開いた状態で、以下のコマンドを入力して実行します。
  ```
  pip install requests pandas
  ```
- これにより、HTTPリクエストを扱うための`requests`ライブラリと、データ分析を行うための`pandas`ライブラリがインストールされます。

#### 4. スクリプトの作成
次に、データを取得してCSVに保存するスクリプトを作成します。メモ帳を開いて以下のコードをコピー＆ペーストし、`fetch_banks.py`というファイル名で保存してください。

```python
import requests
import pandas as pd

def fetch_data(url, params=None):
    response = requests.get(url, params=params)
    response.raise_for_status()  # エラーがあればここで停止します
    return response.json()

def fetch_all_pages(url, per_page=10):
    all_data = []
    page = 1
    while True:
        params = {'page': page, 'per': per_page}
        data = fetch_data(url, params)
        if not data:
            break
        all_data.extend(data)
        page += 1
    return all_data

# 銀行一覧を取得
banks = fetch_all_pages('https://bank.teraren.com/banks.json')

all_branches = []
for bank in banks:
    bank_code = bank['code']
    bank_name = bank['name']
    bank_kana = bank['kana']
    bank_hira = bank['hira']

    # 各銀行の支店情報を取得
    branches = fetch_all_pages(f'https://bank.teraren.com/banks/{bank_code}/branches.json')
    for branch in branches:
        all_branches.append({
            'bank_code': bank_code,
            'bank_name': bank_name,
            'bank_kana

さて、Pythonスクリプトを続行して、CSVファイルに保存する部分まで書き下ろします。これにより、取得したデータをファイルに書き出す処理を行います。

```python
            'bank_hira': bank_hira,
            'branch_code': branch['code'],
            'branch_name': branch['name'],
            'branch_hira': branch.get('hira', ''),
            'branch_kana': branch.get('kana', '')
        })

# DataFrameを作成
df = pd.DataFrame(all_branches)
df.to_csv('C:\\Users\\Username\\Downloads\\bank_branches.csv', index=False)
```

#### 5. スクリプトの実行とCSVファイルの保存先カスタマイズ
- コマンドプロンプトで、スクリプトが保存されているディレクトリに移動します。
- 例えば、スクリプトがデスクトップにある場合は次のように入力します：
  ```
  cd C:\Users\Username\Desktop
  ```
- 次に、以下のコマンドを入力してスクリプトを実行します：
  ```
  python fetch_banks.py
  ```

#### 6. 出力先ファイルのカスタマイズ
- スクリプト内で指定されたファイル保存先`'C:\\Users\\Username\\Downloads\\bank_branches.csv'`は、必要に応じて変更が可能です。ファイルを別の場所に保存したい場合は、このパスをお使いのコンピュータの任意のフォルダパスに変更してください。

#### 注意: データの取得とファイルの生成には時間がかかることがあります
データ量が多い場合、情報を全て取得してCSVファイルに保存する過程で時間がかかることがあります。特に多くの銀行と支店の情報を扱う場合は、しばらくの時間が必要になることが予想されますので、気長に待つことが重要です。

このガイドが皆さんのデータ取得の一助となり、Pythonプログラミングの楽しさを体験していただければ幸いです。何かご不明点や追加で知りたい情報があれば、お気軽に質問してください。
Vitestのカバレッジレポートが「...」で省略されないようにする

## 課題
Vitestでテストを書いている。
カバレッジを`vitest run --coverage`で出力しているのだが、
ファイルのパスが長すぎて以下のように3点のピリオド`...`で省略されてしまうことがあった。
```
---------------------------|---------|----------|---------|---------|-------------------
| File                      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
|---------------------------|---------|----------|---------|---------|-------------------|
| All files                 | 83.26   | 78.63    | 69.42   | 83.26   |                   |
| ...eComponents/FugaButton | 0       | 0        | 0       | 0       |                   |
| index.vue                 | 0       | 0        | 0       | 0       |                   |
```

以下のように省略せずに出力したい。
```
| src/hogeComponents/FugaButton | 0       | 0        | 0       | 0       |                   |
```

現状、`vitest.config.ts`は以下のようになっていて、
`provider`に`v8`、`reporter`に`text`を指定している。
```ts
export default defineConfig({
  test: {
    （省略）
    coverage: {
      provider: "v8",
      reporter: ["text"]
    }
  }
});
```

## 解決法
ファイル名が...で潰れてしまう原因は、表の幅が狭いから。
`text`をreporterとして使う場合、`maxCols`オプションがあるため、
それを使って幅を広げてやれば良い。

以下のように設定できる。
```ts
{
  coverage: {
    provider: "v8",
    reporter: [
      ['text', { maxCols: 200 }]
    ]
  }
}
```

## 参考
https://github.com/vitest-dev/vitest/discussions/5270
置換したリクエストとは別のレスポンスを検査する

# sWebMachineGun.exe実践編

置換したリクエストとは別のレスポンスを検査する場合

## 診断対象

こんな感じ
<table border="1">
<tr><th align="center">入力画面</th><th colspan="2" align="center">確認画面</th><th align="center">入力画面に戻る</th></tr>
<tr><td><a href="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/13be5d9d-195e-22cb-6b72-53c4a771677e.png"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/13be5d9d-195e-22cb-6b72-53c4a771677e.png" width="70%" height="70%"></a></td><td colspan="2"><a href="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/77e45f91-25ed-2b3f-dfbf-dca98a1a3d62.png"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/77e45f91-25ed-2b3f-dfbf-dca98a1a3d62.png" width="70%" height="70%"></a></td><td><a href="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/13be5d9d-195e-22cb-6b72-53c4a771677e.png"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/13be5d9d-195e-22cb-6b72-53c4a771677e.png" width="70%" height="70%"></a></td></tr>
<tr><td colspan="2" valign="top">POST /sanaki/yourdata/testConfirm.asp HTTP/1.0<BR>
Content-Type: application/x-www-form-urlencoded<BR>
Content-Length: 0<BR>
<BR>
Email=test@example.com&Tel=03-0000-0000</td>
<td colspan="2" valign="top">GET /sanaki/yourdata/testInput.asp HTTP/1.0</td>
</tr>
</table>

入力画面→確認画面→入力画面に戻る

そして、入力画面に戻る際にはパラメータがないけど、直前の「入力→確認」で入力した値がXSSする、、、というような対象

## sWebMachineGun.exeの設定

メインの設定は、HTTPリクエストの設定と、置換方法の設定

### sWebMachineGun.exeの設定1

「Request」タブに、二つのHTTPリクエストを設定して、
判定対象リクエストをNo1(2つ目のリクエスト)に設定する

一つ目はこんな感じ

![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/411e3a17-f935-062f-9d22-231e78d20907.png)

リクエストとしては「[一つのHTTPリクエスト(一番シンプル)](https://qiita.com/tomoki0sanaki/items/bf5425c33bab876b6287
)」と同じ。

二つ目はこんな感じ

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/9aab1f2c-17eb-8c9e-d153-8f22e44592b2.png)

- 変換対象ページが No0
- 判定対象ページが No1

となっている。
こういう設定にする方法は後述している

ちなみに「AutoTarget」がオフになっているが、オンにすると、変換対象/判定対象がGUIで表示されているページに自動で追随するので、オフにしている。

### sWebMachineGun.exeの設定2

「Setting」タブの置換方法は、キャプチャ画像を分かりやすくするために2つだけ。

- 「値」の前方に「'&quot;\'\&quot;`a--&gt;&lt;s&gt;【マーキング文字】【変数名】/&lt;/s&gt;」を追加する
- 「値」の前方に「'」を追加する

「お勧め」ボタンにはいろいろな置換方法が用意してありますよ。

「UseName」をチェックして、パラメータの解析(名前と値を解析)を実施するように指示する

![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/d9318026-d64a-4562-396e-ee0b5144f356.png)

この画面で、変換対象ページをNo0と指定している

### sWebMachineGun.exeの設定3

![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/a31b6687-1c5b-04dd-d079-07ff38fdb93f.png)

「Judge/Regex」で、判定対象ページをNo1に指定している

## 今後のバージョン

検査するレスポンスの番号を一つだけ指定するという方法よりも、ある番号以上のレスポンスは検査した方が便利そうなので、近いうちにそういう仕様を実装するかもしれない

## sWebMachineGun.exeの実行

「Execute」ボタンで、実行できるのですが、結果はこんな感じで、各変数に対して、各置換方法を与えたHTTPリクエストを送信し、その後「戻る」リクエストを発行して、そこでXSSが発現しているのを発見できている。

![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/d93e037f-969b-b34a-81e9-5c4ed313bd94.png)

# sWebMachineGun.exe Index

[sWebMachineGun.exe のメインメニューに戻る](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3)
Chatterプロファイルからレコードタイプを削除


+ [How to delete ”Group Record Type”](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007akDn5SAE)

「Chatter 外部ユーザー」、「Chatter 無料ユーザー」などでは、このレコード タイプを無効にすることはできません。

通常の画面にでは表示されないようです。

以下を読むとURL　ハックみたいな方法を使うみたい
+ [Remove Record Type from Chatter Profiles](https://salesforce.stackexchange.com/questions/48311/remove-record-type-from-chatter-profiles)

:::note
相対URLではなく完全URLを使用して表示することができました。

https://xxxxxx-3moqt3-dev-ed.lightning.force.com/setup/ui/profilerecordtypeedit.jsp?id=00e2x000001iWm2&tid=CollaborationGroup&pn=Chatter+External+User

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/35496053-c819-e676-bdda-f872f25e69d7.png)

ポイントはidにはプロファイルのIdを指定して、tidにはオブジェクト名を指定します。今回はチャターグループです。

また、pnにはプロファイル名を指定します。どうもブランクは+に置き換える必要があるみたい。

残念ながらベストアンサーはつきませんでしたが、面白いURLハックを見つけました。