OmniAICreator/Qiita-1.07M huggingface dataset:
OpenAPI仕様と公開されているスキーマファイル群の同期が取れていない件

OpenAPI は広く使われているものの、**OpenAPI 仕様と公開されているスキーマファイル群の同期が取れていない**という問題が存在する。その詳細を備忘録として書き残しておく。

---

[OpenAPI 3.1.0 仕様](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md)によれば、Paths オブジェクト下で `$ref` を次のように使うことは可能である。

```yaml
paths:
  /api/foo:
    $ref: paths/api-foo.yaml
```

しかし、このように記述された OpenAPI 文書の有効性を、(現時点で最新とされる) 下記のスキーマファイル群と、

|OpenAPI 仕様のスキーマ|
|:--|
|https://spec.openapis.org/oas/3.1/schema-base/2022-10-07|
|https://spec.openapis.org/oas/3.1/schema/2022-10-07|
|https://spec.openapis.org/oas/3.1/dialect/base|
|https://spec.openapis.org/oas/3.1/meta/base|

とあるバリデータ ([json-schema-validator](https://github.com/networknt/json-schema-validator)) を用いて確認すると (参照: [Validating an OpenAPI document](https://github.com/networknt/json-schema-validator/blob/master/doc/openapi.md#validating-an-openapi-document))、間違っていると言われてしまう。

調べたところ、どうも https://spec.openapis.org/oas/3.1/schema/2022-10-07 内の `/$defs/paths` の定義↓が OpenAPI 仕様と合致していないことが原因のように思えてきた。

```json
"paths": {
  "$comment": "https://spec.openapis.org/oas/v3.1.0#paths-object",
  "type": "object",
  "patternProperties": {
    "^/": {
      "$ref": "#/$defs/path-item"
    }
  },
  "$ref": "#/$defs/specification-extensions",
  "unevaluatedProperties": false
},
```

`"#/$defs/path-item"` となっている箇所は `"#/$defs/path-item-or-reference"` であるべきなのではないか、という疑念だ。

そこで、OpenAPI コミュニティの Slack に参加して質問したところ、「その問題は [PR 3355: Fix 3.1 Path Item schema](https://github.com/OAI/OpenAPI-Specification/pull/3355) により修正されたが、https://spec.openapis.org/ で公開されているスキーマファイル群は更新されていない」ということだった。

**更新されていない理由は「更新作業をする人がいないから」** だそうだ。

スキーマファイル群の不具合修正や公開スキーマファイル群更新作業の内容については [Issue 3715: Define and document our schema publishing process](https://github.com/OAI/OpenAPI-Specification/issues/3715) に書かれているものの、それを実行するボランティアがいない、と。

---

自社の新製品の API を OpenAPI で記述し、その記述自体のテストを自動化しようと作業していたところ、この問題を踏んでしまった。

もちろん、API 毎に一つの YAML を作成するという次のような書き方を諦め、

```yaml
paths:
  /api/foo:
    $ref: paths/api-foo.yaml
```

かわりに、全ての API の情報を一つのファイルに含める、

```yaml
paths:
  /api/foo:
    post:
      requestBody:
        content:
          application/json:
            schema:
              $ref: components/foo-request.yaml
    # 以下略
```

という書き方にすれば、技術的には有効性確認はできる。しかしながら、本来分割できるものを一箇所にまとめてごちゃごちゃ書くのは、美しくない。

すっきりして美しいかどうかは、品質や維持管理の容易さにとって大切なのだ。

---

とはいえ、OpenAPI 仕様のスキーマファイル群の不具合修正と更新作業の責任をボランティアで引き受けるほどの余裕はない。せいぜいできるのは、[Issue 3715](https://github.com/OAI/OpenAPI-Specification/issues/3715) の作業負担を多少軽減するためのスクリプトを二つ提供することくらいだ。

- [PR 3790: [new] scripts/update-schema-id](https://github.com/OAI/OpenAPI-Specification/pull/3790)
- [PR 3791: [new] scripts/update-schema-latest](https://github.com/OAI/OpenAPI-Specification/pull/3791)

無害なスクリプトなのでさくっと main ブランチにマージしてもらいたいところではあるが、これらの PR をレビュー・承認・マージする作業もボランティアの方々がおこなっているので、残念ながら大きな期待はできない。マージされるとしても、長い年月がかかるだろう。そのため、当面は 2022-10-07 のスキーマ群を使わざるをえない。

---

追記　(2024-05-17)

「このプロジェクトでは Ruby を使ってないんだよなぁ」というコメントがあったので、シェルスクリプトバージョンを作成。

- [PR 3814: [new] scripts/update-schema-id.sh](https://github.com/OAI/OpenAPI-Specification/pull/3814)
- [PR 3815: [new] scripts/update-schema-latest.sh](https://github.com/OAI/OpenAPI-Specification/pull/3815)
Docker on WSL2 (非docker desktop) の Compose で特定のコンテナに大きめのメモリを割り当て

Docker on WSL2 (非 Docker Desktop) の Docker Compose で特定のコンテナに大きめのメモリを割り当てようとして沼ったので、記録を残します。

# 目次
- 解決までの筋道
- 動作を確認したバージョン
- Docker Compose で Memory 割り当てを設定する方法
- WSLconfig の設定方法
- 最後に

## 解決までの筋道

Docker-compose.yml に memory の割り当てを記述
↓
Docker stats で確認すると、memory 割り当てが反映されていない 
(7.75GiB が上限になっている)
↓
Docker の デフォルトの memory 上限 が WSL2 の memory 上限 に依存していることが分かった (けれど、私 WSL の memory 上限なんて設定していない)
↓
WSL2 の memory 上限のデフォルトは物理メモリの X% ということがわかる
↓
.wslconfig に memory 上限を設定し、WSL2 の memory 上限を変更することで、Docker の memory 上限を変更できた 👏

## 動作を確認したバージョン

```
Windows 11
Docker version 26.1.0
WSL version: 2.1.5.0
```

## Docker Compose で Memory 割り当てを設定する方法
[Docker Compose の公式ドキュメント](https://docs.docker.jp/v20.10/compose/compose-file/compose-file-v3.html#resources) を参照してください。

## WSLconfig の設定方法
1. File Explorer のアドレスバーに `%USERPROFILE%` を入力する
2. .wslconfig ファイルを作成する
   以下は、14GB のメモリを WSL2 に割り当てる例

```powershell
@"
[wsl2]
memory=14GB
swap=8GB
"@ | Out-File -FilePath .\.wslconfig
```

3. WSL を 再起動 する

```
wsl --shutdown
```

# 最後に
最後までお読み頂きありがとうございます。励みになるので、良かったらいいね 👍 をお願い致します。
【応用情報技術者試験】勉強方法や採点方法まとめ

# 概要
応用情報技術者試験勉強中です。
自分なりの勉強方法や、採点方法をまとめました。

# 勉強方法

### 午前問題
毎回15問前後、新規テーマがある。
ただ、新規テーマもあきらかにおかしい回答は除外するなどを行う必要があるため、4択問題の解き方のコツを覚えておくことが重要。
※例えば、100％これだ、と決めつけている選択肢は、正解の可能性が低い等…

基本的には過去問道場で問題を解いていくことが良さそう。
※初心者の場合は、過去問同上右下の「情報処理試験キーワード集」からあらかじめ
単語の予習をしておくのもよさそう。

### 午後問題
セキュリティの問題は必須項目なので、必ず勉強が必要。
他の問題は、全て網羅して勉強するのではなく、的を絞って対応する。

以下の動画でお勧めの設問を解説していました。

https://www.youtube.com/watch?v=7eufIh2aJFA

午後問題も過去問道場で過去問を解いていき、問題に慣れることが重要。
また、午前試験の対策をしていると、自然と午後試験の対策もできてくる。
※出題される用語は午前試験と似ている場合が多いため。
なので、まずは問題になれることが重要。また、スピードはかなり求められるため、
問題の解き方も対策しておく必要がある。
※私は、設問に目を通してから、問題の文章を読むようにしています。

また、勉強はインプットも大事ですが、それ以上にアウトプットも大事です。
テスト効果 (Testing effect) といって、インプットよりアウトプット (思い出す) 行為で記憶が強化されます。

※参考URL (動画) ：[アウトプット重視で潜在的記憶力を目覚めさせる。](https://www.youtube.com/watch?v=8cGKcIUVz-c
)
# 過去問道場
過去問道場のリンクです。

### 午前問題

https://www.ap-siken.com/apkakomon.php
### 午後問題

https://www.ap-siken.com/apkakomon_pm.php

# 自己採点方法

IPAの公式サイトに解答例が掲載される。

https://www.ipa.go.jp/shiken/mondai-kaiotu/index.html

### 午前問題
午前問題はIPAの公式サイトで試験日当日に公開されるため、すぐに自己採点が可能。

### 午後問題
午後問題の公式解答は合格発表の数日前になるため、資格会社の回答から自己採点を行うことになる。
下記は回答を掲示している各資格会社。
また、公式の午前・午後の採点については、午前問題が合格点に達していない場合は、午後問題は採点されない。

- 資格の学校TAC

https://www.tac-school.co.jp/kouza_joho.html

- ITEC

https://www.itec.co.jp/

***
**[記載した応用情報技術者試験の記事まとめ](https://qiita.com/MetroOsamu/items/550001240d76e24f505f)**
Dify on WSL2に外部のPCからアクセスできない

Difyの問題ではないですが、localhost以外からのアクセスができなかったので、会社のSlackで聞いたらスペシャリストが教えてくれたのでメモとして残す。
最近はクラウド使ったり、環境はインフラの人がやってくれることが多いの一人でやるとしんどいけど、まあためになる。


必要なのはポートフォーワードの設定


まず、Powershellを管理者モードで立ち上げて、wslのIPを調べる
```
 wsl -e hostname -I
```
結果はこれ
```
172.21.35.156 172.17.0.1 172.30.0.1
```
続いて以下で設定する
```
netsh interface portproxy add v4tov4 listenaddress=* listenport=80 connectaddress=172.21.35.156 connectport=80
```

設定の確認をする
```
 netsh interface portproxy show all
```
結果はこれ
```
ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               80          172.21.35.156   80

```

これで社内の端末同士でホスト名を使ってブラウザからDifyにアクセスができた。
IBM Cloud: ICOS上のデータを再帰的に一括で削除する方法

# 1. はじめに
ICOS(IBM Cloud Object Storage)のようなオブジェクトストレージにおいて、データをまとめて削除する方法の紹介。



- バケットを削除しようと思った
- →バケットの中身が全部消えていないと削除できない。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/16afe6c4-21a0-fde5-d739-234bc1dd503c.png)

- →バケットの中身を消していこうと思っても、下の階層にあるオブジェクトを削除できないので、どんどん下に潜っていく必要がある（フォルダを削除するためには、フォルダの中にあるファイルを先に消す必要があるようなもの）。数が多くて手動では無理・・・

という事態を避ける際に利用する。

# 2. 方法

[Emptying a bucket](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-deleting-multiple-objects-patterns&locale=en)に紹介されている。要は、例えばaws CLIであれば
```
aws --endpoint-url https://s3.direct.jp-tok.cloud-object-storage.appdomain.cloud s3 rm s3://{bucket-name}/xxxx --recursive
```

のようにやってやれば良い。

# 3. 実例

今回は、`OnVUE.app`および`Veeam`を丸ごと削除する。

```txt:bucket一覧
$ aws --endpoint-url https://s3.direct.jp-tok.cloud-object-storage.appdomain.cloud s3 ls s3://mybucketxxx
                           PRE OnVUE.app/
                           PRE Veeam/
2022-07-21 09:02:53        195 error.html
2022-07-21 09:02:53      65235 favicon.ico
2022-08-20 09:26:43          7 hello.txt
2022-07-21 09:02:53        284 index.html
2022-07-21 09:02:53      24237 ninja.jpg
2022-07-21 09:02:54        423 sorry.html
```

```txt:OnVUE.appの削除
$ aws --endpoint-url https://s3.direct.jp-tok.cloud-object-storage.appdomain.cloud s3 rm --recursive s3://mybucketxxx/OnVUE.app/
delete: s3://mybucketxxx/OnVUE.app/Contents/Frameworks/Electron Framework.framework/Resources/
delete: s3://mybucketxxx/OnVUE.app/Contents/Frameworks/Electron Framework.framework/Resources/en.lproj/
delete: s3://mybucketxxx/OnVUE.app/Contents/Frameworks/
（途中略）
```
```txt:Veeamの削除
$ aws --endpoint-url https://s3.direct.jp-tok.cloud-object-storage.appdomain.cloud s3 rm --recursive s3://mybucketxxx/Veeam
delete: s3://mybucketxxx/Veeam/Archive/backup/
delete: s3://mybucketxxx/Veeam/Archive/
delete: s3://mybucketxxx/Veeam/
（途中略）
```

```txt:無事消えてくれた
$ aws --endpoint-url https://s3.direct.jp-tok.cloud-object-storage.appdomain.cloud s3 ls s3://mybucketxxx
2022-07-21 09:02:53        195 error.html
2022-07-21 09:02:53      65235 favicon.ico
2022-08-20 09:26:43          7 hello.txt
2022-07-21 09:02:53        284 index.html
2022-07-21 09:02:53      24237 ninja.jpg
2022-07-21 09:02:54        423 sorry.html
EntityFrameWorkで同じテーブルに対して1対Nを複数つくる方法

どうやったらタイトルがわかりやすくなるか考えたがどう説明したらよいかわからなかったので
暫定でつけました。

初心者なので
・こんな無駄なことする必要ない
・データベースの作り方が悪いだけ
などいろいろあると思いますが、EntityFrameWorkが自動で処理してくれたので
情報としてあげておくと何か別の用途で使えるかもということで上げておくことにしました。

結局どういうことかというと例えば
ParentクラスとChildクラスがあって、(テーブルもParentとChildの２テーブル）
Parentクラス内に男の子と女の子のListを作ってそれをリレーションとして定義するという感じです。
```
//こんな感じ　でもこれでは動きません。
public class Parent{
    public int ParentId;
    public List<Child> Boys { get; set; } = new();
    public List<Child> Girls{ get; set; } = new();
}

public class Child{
    public int ChileId;
    public string Name;
    public int ParentId;
}

//以下はコンテキスト内
public DbSet<Child>? Child { get; set; }
modelBuilder.Entity<Child>()
    .HasOne(c => c.Parent)
    .WithMany(p => p.Boys)
    .HasForeignKey(c => c.ParentId);

modelBuilder.Entity<Child>()
    .HasOne(c => c.Parent)
    .WithMany(p => p.Girls)
    .HasForeignKey(c => c.ParentId);
```
つまり、男の子と女の子を同じテーブルに入れて、親からみたら登録、呼び出しは
Boys、Girlsを使えばよいという状態です。BoysとGirlsはゲッターとセッターでChildテーブルから自分でフィルターしたらよいのではと思いますが、それはなしですべてEntityFrameWorkに処理させる方法の説明になります。

結論からするとChildの派生クラスでGirlsとBoysを作ってやるとEntityFrameWorkがChildのテーブルにDiscriminatorというカラムを追加して処理してくれるみたいです。どうやら
`https://learn.microsoft.com/ja-jp/ef/core/modeling/inheritance#table-per-hierarchy-and-discriminator-configuration`
に書いてるらしいです。
これに従うと今回の例の場合
```
public class Parent{
    public int ParentId;
    public List<Boy> Boys { get; set; } = new();
    public List<Girl> Girls{ get; set; } = new();
}
public class Boy :Child{
}
public class Girl : Child{
}
public class Child{
    public int ChileId;
    public string Name;
    public int ParentId;
}

//以下はコンテキスト内
public DbSet<Girl>? Girls { get; set; }
public DbSet<Boy>? Boys{get;set;}

modelBuilder.Entity<Boy>()
    .HasOne(c => c.Parent)
    .WithMany(p => p.Boys)
    .HasForeignKey(c => c.ParentId);

modelBuilder.Entity<Girl>()
    .HasOne(c => c.Parent)
    .WithMany(p => p.Girls)
    .HasForeignKey(c => c.ParentId);
```
とするとテーブルはBoysテーブル、GirlsテーブルではなくChildテーブルができる形で、ParentからBoysに登録するとChildテーブルのDiscriminatorカラムにBoyという文字列付で登録され、呼び出すとやはりBoyという文字列が付いた行だけが取り出せます。
自分のソースからParentとChildに書き換えたのでもしかするとどこか置換ミスがあって動かないかもしれませんが、これが必要な方には簡単に修正できると思いますのでご勘弁を。
Next.js,Prisma,MySQL環境をDockerで構築する

今回は備忘録として記録に残しておこうと思います

### Dockerの構築
```shell
npx create-next-app
```
ここの設定は各自で

```shell
cd app
touch docker-compose.yml
mkdir -p docker/mysql/sql
touch ./docker/mysql/sql/1_init.sql
touch .env
```

順番に編集していきます
```docker-compose.yaml
version: '3'
services:
  db:
    image: mysql:8.0
    ports:
      - '3307:3306'
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_USER: 'docker'
      MYSQL_PASSWORD: 'docker'
      MYSQL_DATABASE: 'test_db'
      TZ: 'Asia/Tokyo'
    volumes:
      - db-store:/var/lib/mysql
      - ./docker/mysql/sql:/docker-entrypoint-initdb.d

volumes:
  db-store:
```

```docker/mysql/sql/1_init.sql
GRANT CREATE, ALTER, DROP, REFERENCES ON *.* to 'docker' @'%';
```

```.env
MYSQL_ROOT_PASSWORD = your_root_password
MYSQL_DATABASE = mydatabase

DATABASE_URL = mysql://docker:docker@localhost:3307/test_db
```

```shell
docker compose up -d 
npm install prisma --save-dev
npx prisma init
```

```schema.prisma
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  password  String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}
```

```
docker compose down --rmi all --volumes
docker compose up -d
prisma migrate dev
npx prisma generate
npx prisma db push
npm install @prisma/client
```

これで完了！

https://polidog.jp/2023/05/03/prisma-mysql/

参考にさせていただいた記事
リリース更新：REST API で Apex アクションの例外が発生した場合のロールバックの適用



+ [リリース更新にあたり、「例外で終了したトランザクションがロールバックされ、データ整合性が維持されます。REST API を使用して Apex アクションを実行するときにその例外が発生すると、API で Salesforce データが変更されません。」とあるのですが、現状これはAPIの受信側であるSalesforceのREST APIを経由し、Httpリクエストで新規作成などが行われた場合にApexトリガなどが動き、そのApexのエラーがロールバックされない認識でよろしいでしょうか？](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajuX3)

+ [REST API で Apex アクションの例外が発生した場合のロールバックの適用 (リリース更新)](https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_release_update_enforce_rollbacks_for_custom_invocable_action_exceptions_in_rest_api.htm&release=246&type=5)

この更新では、例外で終了したトランザクションをロールバックすることで、データの整合性が維持されます。REST API を使用して Apex アクションを実行すると、その例外が発生しても、API によって Salesforce データは変更されません。この更新は、当初は「Connect REST API で呼び出し可能なカスタムアクションの例外が発生した場合のロールバックの適用」という名前で、Spring '23 で最初に使用可能になり、Spring '24 で適用される予定でしたが、適用日が Spring '25 に延期されました。



:::note
トリガーの実行準を考えるとREST API の Apex アクション 例外処理で更新前に戻ると思いますね。20ステップの前でエラーになったらこのステップは実行されないんでしょうね。

 

20 . After the changes are committed to the database, executes post-commit logic. Examples of post-commit logic (in no particular order) include:

 

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm

ただ、このアップデートを素直に読むと今は、この順序に関係ない？ような感じがします。調べてみると今まではトランザクション処理はない（対象外）のようです。よって、上記のトランザクション処理とは別のように思います。

今回のアップデートでレコードから見たら同じトランザクションに入るとのことらしいので、REST APIでは現状では例外があってもロールバックされないと思います。

transaction control with REST API - does it exist?
https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T43bFSAR

How to rollback Status on an object like Lead if the API response was not successfully?
https://salesforce.stackexchange.com/questions/335333/how-to-rollback-status-on-an-object-like-lead-if-the-api-response-was-not-succes

REST の処理はそもそもトランザクションの外、独立した処理なのかもしれませんね。

https://stackoverflow.com/questions/33060968/rest-and-transaction-rollbacks
:::

つづき

+ [REST API で Apex アクションの例外が発生した場合のロールバックの適用](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007akPJX)
Build a Custom Record Page for Lightning Experience and Salesforce Mobile App



+ [シークレットモードでの対応が必要なトレイルヘッド](https://qiita.com/Keiji_otsubo/items/c8e22d7fc9639e6d7f4f)

# 手順が分からない？

+ [does anyone know how to do the add standard component to each tab step?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clKNw)

:::note
Please check this article.

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4283b300-eb6c-302e-8aa3-2ec4cd843c8d.png)


you should be able to see the 'Related Lists' component under the Standard components.
Just drag and drop it under Related tab. I added a screenshot hope that helps.

標準コンポーネントの下に「関連リスト」コンポーネントが表示されるはずです。
それを「関連」タブにドラッグアンドドロップするだけです。役立つことを願ってスクリーンショットを追加しました。
:::
Ethereum Virtual MachineのスマートコントラクトのProxyを理解する


スマートコントラクトのアドレスを変えずにアプデしたい時の話です。

## 取り扱う話題・取り扱わない話題

今回はProxy全般に関わる一般論を扱い、具体的なProxy Patternについては深く扱いません。

## （スマートコントラクトの）Proxyってなぁに？

Ethereum Virtual Machineのスマートコントラクトにおいて、スマートコントラクトは一度デプロイしたら（変なことをしない限り）書き換えることはできません。
でもそれでは困る場合があり、スマートコントラクトを書き換えられないという制約を迂回するために使うのがProxyというものです。

### Proxyの正体

Proxyはスマートコントラクトです。スマートコントラクトは普通に作れます。決して何かスマートコントラクトとは別の特別な機能を使うわけではありません。

### 背景

まず、スマートコントラクトは他のスマートコントラクトを呼ぶことができますが、その呼び出し方の一つに`DELEGATECALL`というものがあります。これはスマートコントラクトを呼び出して、その**呼び出された側に**記述してあっても**呼び出した側が**行ったものとして実行するというものです。

つまり、

- ストレージの読み書きも
- ネイティブトークンの送金も
- スマートコントラクトの呼び出しも

どれも**呼び出した側が**行ったことになります。

### Proxyの基礎だけど肝心な部分

デプロイする時に、固定のアドレスを持つスマートコントラクトと、実際に実行される命令の入っているスマートコントラクトを分ける、ということをします。

すると今スマートコントラクトは２つあります。

- 固定のアドレス兼ストレージの部分
    - ↓に`DELEGATECALL`する
- 命令が入ってる部分
    - 本当にやりたいことがここにある

ですが今この「本当にやりたいこと」を変えたいとします。
ですのでもう一つ新しいスマートコントラクトをデプロイします。

- 固定のアドレス兼ストレージの部分
- 命令が入ってる部分（古いほう）
- 命令が入ってる部分（新しいほう）

もうあとはかんたんです。「固定のアドレス兼ストレージの部分」がそのストレージに格納している「命令が入ってる部分（古いほう）」のアドレスを「命令が入ってる部分（新しいほう）」のアドレスに書き換えるだけです。

つまり、「固定のアドレス兼ストレージの部分」はただ
- 「命令が入ってる部分」のアドレスを覚えておいて
- そのアドレスにあるスマートコントラクトに対して`DELEGATECALL`する
- 結果に応じて`RETURN`か`REVERT`する

こうすることでふつうのProxyではないスマートコントラクトと同じようにやりたいことを実現しつつも、アプデできる余地を残すことができます。



## 補足：スマートコントラクトを本当に書き換えるには

具体的には`CREATE2`と`SELFDESTRUCT`という命令があります。この２つをうまいこと使うとスマートコントラクトまるごと書き換える（同じアドレスにデプロイする）ことができます。

ここでは方法（悪用された事例）だけ紹介します。

https://twitter.com/ProgrammerSmart/status/1660637281575682048
プロファイルの操作の問題




+ [トレイルヘッドの手順が古いのか拡張インターフェースだと理解できない場合](https://qiita.com/Keiji_otsubo/items/236bd0250fa04b88a233)
+ [Standard Userのプロファイルがない？](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000LIXVo)

:::note
Below are the standard profiles in Salesforce.

https://help.salesforce.com/s/articleView?id=sf.standard_profiles.htm&type=5
If you don't find the standard user profile - Please create a new Dev Org
:::

+ [【未解決】トレーニング モジュールのプロファイル編集権限がないようです](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Djd0B)
+ [I'm unable to edit a profile, I only see the Clone or Del options.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajuIS)

:::note
Click on the part named Custom: Support Profile

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/092f2718-0ca2-6fb7-d840-3f4e69cb6ce5.png)
:::


+ [トレイルヘッドのプロファイルが無い](https://qiita.com/Keiji_otsubo/items/66316d3db95dbdee6aaa)


+ [How can I delete the already taken profile name?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ep5Ak)

:::note
Click Del for Custom Profile

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f2745676-e009-2cc1-a0b9-f935c05b45e3.png)
:::
[Vite] 空白・改行をそのままplotに反映する方法

## 実現したいこと
Vue3 + Viteで、plotに渡される要素の空白・改行を保持したい。

## TL;DR
'@vitejs/plugin-vue'をインポートする。
```js:vite.config.js
import vue from '@vitejs/plugin-vue'
```
vite.config.jsのpluginsを以下のように記述する。
```js:vite.config.js
plugins: [
        vue({
            template: {
                compilerOptions: {
                    whitespace: 'preserve'
                },
            },
        }),
    ]
```

## 環境
```
vue  == 3.4.21
vite == 5.2.0
@vitejs/plugin-vue　== 5.0.4
```

## 状況
Vue3では、plotに渡される要素に含まれる空白・改行は、標準では圧縮および除去されてしまいます。例えばこんな感じです:
```vue:Example.vue
<template>
    <plot></plot>
</template>
```
```vue:main.vue
<script setup>
    import Example from './Example.vue';
</script>

<template>
    <Example>
        ここを改行したい
        ここを改行したい
        ここを改行したい
    </Example>
</template>
```
上のような場合、main.vueの出力は次のようになってしまいます。
```:output
 ここを改行したい ここを改行したい ここを改行したい
```
このように、空白・改行を保持できません。

## 解決策
Vue3では、plotに渡される要素の空白・改行は、コンパイル時に削除あるいは圧縮されてしまいます。したがって、コンパイルオプションを変更してやれば良いのです。
より具体的には、
```
app.config.compilerOptions.whitespace = 'preserve'
```
のように、デフォルトの'condense'から'preserve'に変更します。

今回はViteを使っているので、@vitejs/plugin-vueからオプションを渡してやります。
vite.config.jsを以下のように書き換えます。
```js:vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
    plugins: [
        vue({
            template: {
                compilerOptions: {
                    whitespace: 'preserve'
                },
            },
        }),
    ]
})
```
あとはサーバをリスタートすれば、空白・改行が維持されるはずです。

しかしながら、コンパイルオプションへの変更はアプリケーション全体へ影響を及ぼしますので、当該部分だけでなく、他の要素も確認されることをお勧めします。

## 最後に
改行したいなら`<br>`使えばええやん? と思った読者の皆様、おっしゃる通りでございます。ただ、私自身、どうしてもこの方法が必要であったため、他にも必要とされる方がいるのではと思い、寄稿させていただきました。

## 参考文献
https://ja.vuejs.org/api/application#app-config-compileroptions
https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#options
配列データを動的に分割する方法

## はじめに
個人開発のプロジェクトにおいて、配列データを動的に分割することが求められました。
この記事では、配列の情報を動的に分割し、新たな形式で整理する方法について説明します。

## 実現したいこと
元々のデータ構造は、全ての商品情報が一つの長い配列に格納されています。
```json
[
  {"商品情報":[]},
  {"商品情報":[]},
  {"商品情報":[]},
  {"商品情報":[]}
]
```
この配列を以下のように各行には2つの商品情報が含まれるよう、動的に変更したいと考えています。
```json
[
  [
    {"商品情報":[]},
    {"商品情報":[]}
  ],
  [
    {"商品情報":[]},
    {"商品情報":[]}
  ]
]
```

### 実装方法
下記のTypeScriptのコードは、与えられた配列を指定されたサイズのチャンクに分割する関数です。
この場合、2つの要素ごとに新しい配列を作成しています。

```typescript
const splitArrayIntoChunksOfTwo = <T>(array: T[]): T[][] => {
  return array.reduce((resultArray: T[][], item, index) => {
    const chunkIndex = Math.floor(index / 2);  // 現在の要素が属するチャンクのインデックスを計算
    if (!resultArray[chunkIndex]) {
      resultArray[chunkIndex] = [];  // 新しいチャンクが必要な場合、初期化する
    }
    resultArray[chunkIndex].push(item);  // 現在の要素を適切なチャンクに追加

    return resultArray;  // 累積された結果を返す
  }, []);
}
```
この関数では、reduceを使用して配列の各要素に対して処理を行い、その結果を累積しています。
具体的には、各要素のインデックスを2で割った商を使って、その要素がどのチャンクに属するかを判断します。
新しいチャンクが必要な場合は、その場で初期化し、元の配列の要素を新しいチャンクに追加していきます。
最終的に、この関数は元の配列を指定されたサイズのチャンクに分割した新しい二次元配列を返します。
【JavaScript】Identifierの構成要素

# はじめに

学習ログ記事です。読んでくださる方、ぜひ揉んでください。
対戦よろしくお願いします。
<br>

ECMA Script 公式ドキュメントより、13.1 Identifiers の章

https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#prod-IdentifierReference

# Identifier とは？

https://wa3.i-3-i.info/word19477.html

> 識別子（読：シキベツシ　英：identifier）とは
> 
> **そいつを他のやつと区別するために付けた名前なり番号なり記号なりのこと**
> 
> です。

> サクっと一言で説明すると
> 
> **他と区別するために付けた名前**
> 
> が「識別子」です。

わかりやすいですね。
以下に具体例を示しました。
`x` `func` が識別子です。変数名・関数名・アクション名など・・・のイメージです。

```js
const x = 0;

function func() {
  console.log(x)
}
```

# Identifier の構成要素

Identifier の構成要素[^1]として、以下の3つがあるようです。

## `IdentifierReference` / `BindingIdentifier`

```js
const x = 0; //BindingIdentifier

function func() {
  console.log(x) //IdentifierReference
}
```

JavaScriptで使われる識別子の98%がこれにあたるでしょう。

- 「Reference」：「参照」ための識別子
`console.log(x)` この時の識別子 `x` は「 `x` に紐づいているデータ」への「参照」を意味します。

- 「Binding」：「紐づけ・関連付ける」ための識別子
`const x = 0` この時の識別子 `x` は「 `x` 」へ「 `0` 」を「紐づける」ことを意味します。

# `LabelIdentifier`

```js
loop: for() {
        for() {
          break loop;
        }
      }
```

- 「Label」：「ラベル[^2]」として使用される識別子
ここでは `loop` というラベルでラップすることで、ネストされた `for` から上位の `for` を含めた全体の処理を `break` できています。




[^1]:「構成要素」という訳について
「Syntax」の訳として「構成要素」としました。
「Syntax」直訳すると「構文」です。
しかし、ここでは文の構造というより「定義」や「使用ケースの分類」に近いと感じたため「構成要素」という訳にしています。

[^2]:ラベルについて：[【JS】ラベル #JavaScript - Qiita](https://qiita.com/kohki_takatama/items/649c799f2cf07ff708d1)

# 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/label
ChainlitでBasic認証の実装

[Chainlit](https://github.com/Chainlit/chainlit)でBasic認証を実装したのでその記録です。2つハマってしまった点があるので、こちらでメモしてます。

# 動作
UIアクセス時にユーザーとパスワード入力を求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/bda65266-2c57-4ce5-cc66-f61b56418c2d.png)

ユーザID`admin`でログインしたので、右上に「A」と表示され、クリックするとSettingsとLogoutが選べます。PCの再起動などしてもLoginした情報が残っているらしく、再認証を求められなかったです(ここで認証を実装できていないと勘違いして時間をかけてしまった)。もう一度、認証画面に行きたい場合はLogoutすればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/4bead78c-0a5c-8ffd-bf80-ae22419ea294.png)

# 環境
Pythonと追加パッケージのバージョンです。

- Python: 3.12.2
- Chainlit: 1.0.506
- python-dotenv: 1.0.1

# 実装
## 事前準備
`Chainlit`をインストール後、ターミナルから`chainlit create-secret`と打ってシークレットを生成します。コードに目が行き過ぎてこのプロセスを見落としていて、少し苦しみました。
こちらの公式情報に従っています。

https://docs.chainlit.io/authentication/overview

```terminal
% chainlit create-secret
2024-05-04 18:23:58 - Loaded .env file
Copy the following secret into your .env file. Once it is set, changing it will logout all users with active sessions.
CHAINLIT_AUTH_SECRET="<secret>"
```

で、生成したシークレットを`.env`ファイルに書き込みます(作っていなかったらPythonアプリケーションファイルと同じディレクトリにファイル作成)。

```text:.env
CHAINLIT_AUTH_SECRET="<secret>"
```

## Pythonプログラム
下記のシンプルなChainlitのプログラムに

https://docs.chainlit.io/get-started/pure-python

Basic認証のここの内容を付加。

https://docs.chainlit.io/authentication/password

ユーザとパスワードをハードコーディングしています。ここは自由にファイルから読むでもいいかと思います。

```python:app.py
import chainlit as cl
from dotenv import load_dotenv

load_dotenv()


@cl.on_message
async def main(message: cl.Message):
    # Send a response back to the user
    await cl.Message(
        content=f"Received: {message.content}",
    ).send()

@cl.password_auth_callback
def auth_callback(username: str, password: str):
    # Fetch the user matching username from your database
    # and compare the hashed password with the value stored in the database
    if (username, password) == ("admin", "admin"):
        return cl.User(
            identifier="admin", metadata={"role": "admin"}
        )
    else:
        return None
```
Javaで「浮動小数点数リテラル」の動作を確認してみた

# 概要

Javaで「浮動小数点数リテラル」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/num/index7.html

# 実装

以下のファイルを作成しました。
```JSample7_1.java
class JSample7_1{
  public static void main(String[] args){
    System.out.println(18.225);
    System.out.println(5.23e3);
    System.out.println(1.816e10);
    System.out.println(7.5e-2);
    System.out.println(2.712e-6);
    System.out.println(3.52 + 17.4);
  }
}
```

以下のコマンドを実行しました。
```
$ javac -encoding UTF-8 JSample7_1.java
$ java JSample7_1 
18.225
5230.0
1.816E10
0.075
2.712E-6
20.919999999999998
```

# まとめ

何かの役に立てばと。
Flutter 〜簡単にキレイな日付選択ダイアログを作成できるDatePickerDialogを使う〜

## DatePickerDialogについて
日付入力の際に使用するダイアログが簡単にできるDatePikcerDialogのサンプル。

<img width=40% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743467/44c24dcf-f029-0286-5218-9a88a4f6558c.png">

## サンプルコード
```dart
// 必要なFlutterのMaterialデザイン関連のパッケージをインポート
import 'package:flutter/material.dart';

// アプリケーションのエントリポイントです。プログラムが実行されるとここから開始。
void main() {
  // MyAppクラスのインスタンスを作成し、それをアプリのルートウィジェットとして設定する。
  runApp(MyApp());  
}

// StatelessWidgetを継承したMyAppクラスを定義
class MyApp extends StatelessWidget {
  // buildメソッドはウィジェットが描画される際に呼ばれるメソッド
  @override
  Widget build(BuildContext context) {
    // MaterialAppはMaterialデザインのアプリケーションを作るためのルートウィジェット
    return MaterialApp(
      home: Scaffold(
        // ScaffoldはMaterialデザインの基本的なレイアウト構造を提供するウィジェットで、アプリケーションの基盤となる。
        body: Column(
          // Columnウィジェットは子ウィジェットを垂直方向に並べる。
          // 子ウィジェットを中央に配置。
          mainAxisAlignment: MainAxisAlignment.center,  
          children: [
            // DatePickerDialogは日付を選択するためのダイアログウィジェット。
            DatePickerDialog(
              // 初期選択日を10年前の今日の日付に設定。
              initialDate: DateTime(DateTime.now().year - 10), 
              // 選択可能な最古の日付を100年前の今日の日付に設定。
              firstDate: DateTime(DateTime.now().year - 100),  
              // 選択可能な最新の日付を今日の日付に設定。
              lastDate: DateTime(DateTime.now().year),              
              ),
          ],
        ),
      ),
    );
  }
}
```
Github codespaceの便利な使い方


前提として、VScodeにGithub関係の拡張機能を入れておいてください


まずgithubの自分のプロジェクトをブラウザで開く

それから、緑のCodeって書いてあるボタンを押して、
![Povo43_YOSERI_ 便利な機能集めました! - Google Chrome 2024_05_09 6_04_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726617/636f715b-3f1b-f8d4-0f31-1265f0a1c285.png)

出てきたところの中のCodepaceの横にある + マークを押します
（私の場合は下にもうMy codespaceを作っちゃってます）
![Povo43_YOSERI_ 便利な機能集めました! - Google Chrome 2024_05_09 6_06_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726617/44a2048f-17fb-d737-a41e-a77f71b055b3.png)

すると画面が勝手に変わり、
![Povo43_YOSERI_ 便利な機能集めました! - Google Chrome 2024_05_09 6_06_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726617/eea7de1e-a98b-ac17-41b1-45276c42a966.png)

web版のVScodeが出てくると思います。
ここまでやれば、このVScodeのURLをコピーすればどこでもブラウザ一つでアクセスすることができます

（ちなみに、一人が普通に開発する分には無料枠内でできると思います…確か1カ月に200機械時間だったはず）

ここからが本題で、ローカルで動くVScodeを開いて
![Visual Studio Code 2024_05_09 6_07_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726617/95818baf-0035-17bb-c7f6-bd878306fc44.png)

左下の青いところを押してください（色は環境によって違うかもです）

![Visual Studio Code 2024_05_09 6_07_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726617/cef0d641-547a-c549-6233-4159e5a6fa2f.png)

そして、出てきたリストの中にある、connect to Codespace というのを押し、

![Visual Studio Code 2024_05_09 6_07_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726617/e08bec70-c2d4-df3d-83a7-cd76cc5cb913.png)

さっき作ったコードスペースのリポジトリ名を押すと

![top.js - YOSERI [Codespaces_ My Codespace] - Visual Studio Code 2024_05_09 6_07_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726617/b8a44326-92ed-1038-f1c9-9e64b19bf6f3.png)

開けました

これで、ローカルでしか動かない拡張機能を使えますねぇ
注意点としては、
・ネット環境必須
・操作してるフォルダはCodespace上にあり、ローカルにはクローンされない
・たくさん作りすぎると止められる

ぐらいです。

最後まで見ていただきありがとうございます(_w_)
robloxでassistant その17

# 概要
robloxでassistantやってみた。

# 質問
partに文字を表示する


# 回答

partに文字を表示するためには、SurfaceGuiを使用します。以下の手順に従って、partの面にラベルを追加することができます。

- Explorerウィンドウで、partを選択してSurfaceGuiを追加します。
- partの上で右クリックし、コンテキストメニューからSurfaceGuiを挿入します。
- 新しいSurfaceGuiを選択し、ラベルを追加します。
- SurfaceGuiの上で右クリックし、コンテキストメニューからTextLabelまたはImageLabelを挿入します。

これで、partの面にテキストや画像を表示することができます。必要に応じて、ラベルのプロパティをカスタマイズして、表示を調整することもできます。

例えば、以下のようなコードを使用して、ラベルのテキストを設定することができます。
```
local part = -- partを選択してください
local surfaceGui = Instance.new("SurfaceGui")
surfaceGui.Parent = part

local textLabel = Instance.new("TextLabel")
textLabel.Parent = surfaceGui
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.BackgroundTransparency = 1
textLabel.Text = "Hello, World!"
```
このコードでは、partにSurfaceGuiとTextLabelを追加し、テキストを設定しています。必要に応じて、サイズや背景の透明度などのプロパティを調整してください。

これで、partの面にテキストを表示することができます。

以上。
Postmanの機能について

# はじめに
2024年04月16日に「Postman API Night Fukuoka 2024 Spring」で、便利な機能があったので、まとめます。RESTFull APIのチェックに利用するツールとしか使用していなかったので、もっとツールの使い方も学んだ方が良いなっと感じました。

### Postmanインターセプター

PostmanでCookieが必要なAPIを実行する際に使える機能。 シングルサインオンで認証するような、セッション情報が求められるWebページのAPIを実行する際に活用できるのかも。 Cookieは有効期限があるので、Webブラウザに保存したCookie情報を自動でPostmanに連携できる

### パフォーマンステスト

PostmanでAPI開発しながら、APIの性能フィードバックが得られること機能のこと

下記の記事がとくにわかりやすかった。

[超便利！PostmanのAPIパフォーマンステストで簡単かつ素早く性能フィードバックを手に入れよう](https://qiita.com/yokawasa/items/c172f1765026bf90d3ac)


### Postbot

作ったAPIのテストコードを生成してくれて、修正もしてくれるという優れた機能

これも記事があったので添付

[Postmanで使えるAIテスト生成機能「Postbot」がリリース](https://qiita.com/nagix/items/4ae601117b39b05458ec)

### Postman Flows

API中心のアプリを構築するためのビジュアルエディターのこと

- 複数のAPI連携ができる
- 既存のコレクションにあるAPIリクエストや設定を活用できる

### Postman VS Code 拡張機能

VS CodeでPostmanが使用できる拡張機能。エディター上でできるので、開発しつつ確認もできるので便利かも

### 日本語化

知らなかった機能。日本語化するとわかりやすくて良さげ！
下記の手順で簡単に設定できる

![スクリーンショット 2024-05-08 19.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/333df370-5add-4fc8-1d64-413197df0289.png)


![スクリーンショット 2024-05-08 19.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/91a938fd-ae58-8666-19ae-8f6de9a0aad7.png)

![スクリーンショット 2024-05-08 19.42.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/42b2ad6e-4247-cb6f-532e-bb6c63536d33.png)

# まとめ
普段ポチポチして、APIテストするだけのツールって思っていましたが、こんなに便利な機能があるので、積極的に使って慣れていきたいと思います！
robloxでassistant その16

# 概要
robloxでassistantやってみた。

# 質問
このバーチャル空間は、開始プレースが非公開になっているので利用できません。利用可能にするには、開始プレースを公開してください。


# 回答

開始プレースを公開するには、次の手順に従ってください：

Roblox Studioを開きます。
ホームタブをクリックします。
ゲーム設定をクリックします。
左側のバーで「権限」を選択します。
「公開」を選択します。
「保存」をクリックします。
これで、開始プレースが公開され、他のユーザーが利用できるようになります。


以上。
pytestで参照するモジュールを変更したい

ツリー構成
```
.
├── README.md
├── mocker
│   ├── __init__.py
│   └── __pycache__
├── poetry.lock
├── pyproject.toml
└── tests
    ├── __init__.py
    ├── __pycache__
    ├── stub.py
    └── test_target.py
```


```python:mocker/\_\_init\_\_.py
import mymodule


def target():
    mymodule.get()

```

```python:tests/test_target.py
from mocker import target


def test_target():
    target()

```
target関数をテストしたいが、mymoduleなんてモジュールはないのでエラーが出る
そこでスタブモジュールを作る

```python:tests/stub.py
def get():
    print("stub!")

```
mymodule⇒tests.stubへ参照先を変える

```python:tests/test_target.py
import importlib
import sys

sys.modules["mymodule"] = importlib.import_module("tests.stub")
from mocker import target


def test_target():
    target()

```
これでstubモジュールを参照するようになる

```bash
work-py3.12root@0d652f47a5d9:~/mocker# poetry run pytest -s
===================================================================================================== test session starts =====================================================================================================
platform linux -- Python 3.12.3, pytest-8.2.0, pluggy-1.5.0
rootdir: /root/mocker
configfile: pyproject.toml
plugins: mock-3.14.0
collected 1 item                                                                                                                                                                                                              

tests/test_target.py stub!
.

====================================================================================================== 1 passed in 0.01s ======================================================================================================
work-py3.12root@0d652f47a5d9:~/mocker# 
```
Nuxt.jsとNext.js

先輩エンジニアにNuxt.jsを勉強しなといわれてNext.jsを勉強していました。2度と間違えないように二つの違いと一緒にjavascript周辺の言葉をまとめます。

gptの回答を初学者が書き直したものなので多分に誤りを含みます、容赦ください。

## javascriptとtypescript
JavaScriptは、ウェブ開発に広く使用されている高水準で解釈されるプログラミング言語です。ウェブの言語であり、すべてのモダンなWebブラウザでサポートされています。

TypeScriptはJavaScriptのスーパーセット(特定の対象物に対して既存のものをすべて含んだ上でより機能が拡張されている上位互換となるモノのこと)であり、静的型付けを言語に追加します。

## ReactとVue
ReactはJavaScriptライブラリです。
VueはJavaScriptフレームワークです。
どちらもUI構築に用いられる、コンポーネントに分けて編集ができるといった共通点があります。
Reactは関数型でモバイルアプリ開発も可能です。
Vueはクラス宣言で書かれてソート機能や検索機能など拡張性に優れています。

## Next.jsとNuxt.js
Next.jsはReact上のフレームワークです。
Nuxt.jsはvue.jsの上に構築されたフレームワークです。
サーバーサイドレンダリング（SSR）、静的サイト生成（SSG）、ルーティング、データフェッチングなどの機能を提供します。

## Node.js
Node.jsは、JavaScriptランタイム環境(プログラムを動かすときに必要なあれやこれやを詰め合わせたもの)であり、サーバーサイドでのJavaScriptアプリケーションの実行を可能にします。非同期イベント駆動の性質を持ち、スケーラブルなネットワークアプリケーションを構築するために広く使用されています。


## 追記（2025 01/26） React と vue
Reactは、もともとJavaScriptで始まったフレームワークですが、TypeScriptのサポートが非常に強力です。Reactの開発者がTypeScriptを使用することが一般的で、ReactコンポーネントやState、Propsの型定義に対するTypeScriptの利用が進んでいます。

Vue 2はJavaScript中心で設計されていましたが、Vue 3ではTypeScriptサポートが大幅に強化されました。Vue 3はTypeScriptと非常に親和性が高いです。
Asepriteでドット絵を描いてみた

# 注意事項
ゲーム、デザインなどに関しては全くの素人です。

仕事以外の時間にゲームを作ってみたいと思い、
作業内容を日記にしているような感じです。

# 概要
Asepriteは、主にピクセルアートと2Dアニメーションの作成に特化したグラフィックエディタです。

# 手順
1. Steamアカウントを用意
1. Steamから「Aseprite」を検索
1. ¥ 2,050（2024/05/09 現在）で購入
1. 起動を確認して完了！

https://store.steampowered.com/app/431730/Aseprite/?l=japanese

Asepriteは、GitHubでコードが公開されているので、
自力でコンパイルして無料での利用もできるようです。

今回は、購入しました。

# 日本語化
私は英語が苦手なので、以下の［Aseprite JP Wiki］を参考にして日本語化しました。

https://wikiwiki.jp/aseprite/%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96

# その他
Steam経由でAsepriteを購入すると、Asepriteを起動するたびにSteamが起動します。
Steamの起動にも時間がかかるので非常に鬱陶しいです。

以下の方法でSteamを起動させずに開くことができたので参考までに。
※ Windowsの人は適宜読み替えてください。

macの場合、Steam経由で購入したアプリケーションは以下のディレクトリにあります。


```
/Users/*****/Library/Application Support/Steam/steamapps/common/Aseprite
```

上記ディレクトリのAsepriteは以下にコピー（移動）します。

```
/Applications
```

私はRaycastというランチャーを使用しているので、
Applications配下のAsepriteを起動するように設定。

finderからApplications配下のAsepriteを起動、
ランチャーから起動どちらも問題なく動作しました。

![スクリーンショット 2024-05-09 0.42.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257405/c644934a-ac98-2c1a-a507-cd30cc132b4d.png)

![スクリーンショット 2024-05-09 0.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257405/17b36d9a-992c-11d3-8c7b-aa19dc896516.png)

おそらく推奨されている方法ではないと思うので自己責任で.....

# 使ってみた
とりあえず、触ってみた。
絵は描けないですが、YouTubeで基礎の動画をざっと観て使ってみました。

自画像を32×32で書いてみた。初めてにしては上出来だと思う。
自分で言うのもアレですがまあまあ似てる。

詳しい使用方法に関しては本職の方が記事を書いていると思うので今回は書きません。

![スクリーンショット 2024-05-09 0.49.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257405/e04a57af-da93-78da-214b-29c66babc959.png)

# おわりに
こんにちは。

私はデザイナーでもゲームエンジニアでもないですが、
仕事以外の時間でゲームを作ってみたいと思い......

普段はJavaScriptなどでプログラミングしているのですが
これを機にUnityやC#にも触れてみようと思います。

絵は全く描けないですが、
とりあえず全て自力でやってみたいと思いまずは描いてみることに。
ドット絵なのはただの好みです。

無料で公開されているドット絵もあるので、
あまりにもダメならとりあえずそっちを使って制作してみようと思います。

今後も進捗等を記事にしてみようかと思います。
電池で駆動するNeoPixel制御ボードのサンプルプログラム④

- ## RP2040-ZEROを使ってNeoPixelを制御するサンプルプログラム④です。

- ## サンプルプログラム内容
	虹色に光らせて徐々に色を変化するのを眺めて癒される

- ## プログラム環境
	　ArduinoIDE バージョン：2.2.1
	　使用ライブラリAdafruit NeoPixel Library 1.12.2

- ## ハードウェアの主な仕様
	　マイコン:PR2040-ZERO
	　NeoPixel接続ピン　GPIO8
	　乾電池2本でお外へ持ち出し可能。

- ## 	サンプルプログラム
少し明る過ぎるようでしたら、BRIGHTNESSの数値を下げると暗くなります。

```c++

#include <Adafruit_NeoPixel.h>

#define LED_PIN      8
#define LED_COUNT_X  6
#define LED_COUNT_Y  6
#define BRIGHTNESS   24 // 明るさを24に設定

Adafruit_NeoPixel strip(LED_COUNT_X * LED_COUNT_Y, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(BRIGHTNESS); // 明るさを24に設定
  strip.show(); // 全てのピクセルをオフに初期化
}

void loop() {
  // レインボーサイクルを全体に表示
  rainbowCycle(25);
}

// レインボーサイクル
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for(i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Wheel関数: 色相を取得
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

````

- ## 	このプログラムを作成した時の考え方
メインはloopを繰り返しています。
カッコの数値は、更新時間を設定しています。
数値を大きくすると色の変化がゆっくりになります。
数値を小さくすることで、色変化しているのが分かりやすいですね。

```c++
void loop() {
  // レインボーサイクルを全体に表示
  rainbowCycle(25);
}
```

- ## rainbowCycleの動作
numPixelsでLEDの個数を取得しています。
変数iでLEDの個数分の色を指定しています。
それが終わったらshowでLEDの表示を更新しています。


```c++
// レインボーサイクル
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for(i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

```
- ## WheelでLEDの色を作る。
　上のレインボーサイクルで送信する色の部分を作成
 
```c++
// Wheel関数: 色相を取得
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
```
- ## 	実行結果
虹色に色を変えながら徐々に変わっていくのを眺めると
癒されますね！

![make39_20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/e26b539c-3403-8285-70e6-b66106560b68.jpeg)

![make39_21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/1c46c84c-0dde-bef7-420c-f122c84e0231.jpeg)

![make39_22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/99ab00be-7ad9-e0a1-dd31-90571aa9dec0.jpeg)

![make39_23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/41f97efd-94cf-982e-af13-520acc115a0b.jpeg)

プログラミングは我流でちゃんと勉強しておらず、
動けばOKな感覚でやっているので、
間違っているところがあればご指摘をもらえると嬉しいです
GitHub MobileでCopilotとChatしてみた

# はじめに
2024/05/07にGitHub MobileでGitHub Copilot Chatがリリースされた、とのことだったので、早速使ってみました。

# アプリのリリース情報
確かに5/8時点でCopilotが対応されたような記載があります。
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/723c1a28-de74-0832-eff5-de6b7f61c881.png"/>

# アップデート後の起動
右下にCopilotのアイコンが追加されてました
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/89df6220-2b1f-1edf-ec91-54a805abb85c.png"/>

## アイコンタップ
よくあるAIのチャット画面が表示されました
サンプルとか表示されてるのは個人的に使いやすいので、好印象です。
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/66e25707-dae9-d0df-b947-a306823dd3d5.png"/>

なんとなくMicrosoft Copilotと似てますね(そうでもない？)
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/a6c80097-6061-5c94-de78-c0517bc4fdb2.png"/>


## 実際のチャット操作
個人的に気になってることを聞いてみました
抽象的だったのか、当たり障りのない回答が返ってきました
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/03786062-22a6-58ac-daf8-6948dfb4b258.png"/>

### もう少し具体的な質問
お、自分のリポジトリが参照できるようなので、対象ソースコードの修正やリファクタをお願いしてみようと思います
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/1a39ef3c-0727-055f-9412-d298642f89ad.png"/>

### 雑なリファクタ依頼
雑すぎたようです。
しかし、コード指定すればやってくれそう
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/1de10d97-8ba1-636d-1374-ee509d1bac31.png"/>

### 丁寧なリファクタ依頼
指定するコードのファイル
ElevatedButtonだけのシンプルなwidgetです
クリック時にアニメーションを付与する依頼をしてみます
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/3036b825-cc59-7952-bc87-1a7b6e6f8c34.png"/>


指定のコードがみつからなかったようで、一般的な回答が返ってきました。
こちらの指定が悪いのでしょうか…
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/d943e60f-3c0c-8b2d-869d-61a397b2cd98.png"/>
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/1f2c716c-1d57-9f70-fcaa-78b527c525ec.png"/>

### どうしたらCopilotがソースを見つけられるか質問
必要な情報は提示していますが、上手く伝わってないみたいです。
回答のフォーマットでリトライしてみます
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/651136da-7061-c06d-f8e5-a92413f89704.png"/>

### 回答のフォーマットでリトライ
ダメでした。
ちなみに前回はブランチ指定を間違えてた(masterではなくmain)ので、そりゃ見つからんわ、と思って存在するブランチを指定しましたが、変わらず…
※ファイル指定でパスが邪魔してる？と思い、ファイル名のみでリトライしましたが、結果は変わらずでした。
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/48dfa1a9-8d95-4b47-4ecb-7ae1ab482912.png"/>

### どこまで参照できてるか
リポジトリとブランチは参照できてるようです。
が、ファイル指定を含めると、途端に見つからないと言われてしまいます。
ここまで参照できてたらファイルは見つかりそうなもんですが…
これはアプリのバグなんでしょうか？
一旦、今回はここまでとします。
<img width="370" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569056/8ac9e484-09be-8074-34e9-e68dea0afae7.png"/>

# おわりに
モバイルアプリではIDEでやってくれるようなところまでの確認はできませんでした。

しかし、コードに関して質問するなら一般的なAIのChatGPTやClaudeに聞くよりは正しい回答が返ってくると思います。
※裏では同じChatGPTなどで動いてますが、モデルがプログラミングに特化してると聞きました

そのため、通勤時などでPCのIDEでGithub Copilotが使えないが、暇な時間にコードのキャッチアップしたいな、というような場合に使えそうです。　

後日、いくつか試して良い結果が出たら記事を更新します。

また、「この指定だとできたよ」などがありましたらコメントで教えていただけると助かります。
【userAgent】【UAParser.js】iPhoneかどうかの判定が正常に動かなかった

# 背景

端末で動作を変えたい状況で、iPhoneかどうかの判定を`userAgent`、`UAParser.js`を使用して実装したが、どちらでも想定した動作にならなかった。

# 現象

iPhoneからアクセスしているのに、`MacOS`として判定される

![SL4gR7n0_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/e8c5e6ac-5854-1bba-e0d4-be7e54d2552e.png)

# 原因

iPhoneの設定が「デスクトップ用Webサイトを表示」になっていた。
「モバイル用Webサイトを表示」に切り替えることで想定する表示になった。

![r3-g0wGw_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/832385ca-3c83-954d-e6c9-6ad1b4849ce9.png)

![A042AcYR_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/7485d553-a41d-2469-cd75-2f7c7ec0992d.png)

# おわりに

原因はわかったが、対策は不明……。
どうすればいいんだろう……。
プログラミングは質問するな！

:::note alert
この記事は、完全に主の主観です。鵜呑みにせず、「こんな意見もあるんだなぁ」という意識で読んでください。
:::

タイトル通りです。プログラミング学習では、質問は基本しないようにしましょう。
ただ、全ての場合において質問するなというわけではありません。以下に詳細を記述します。

# どういう状況では質問をしてはいけないのか
以下の条件のいずれかを満たす場合のみ質問していいと私は考えています。
- 急ぎである場合
- 何日考えてもわからない場合
- （少なくとも質問者の環境では）調べても情報がない場合
- 質問する相手として信頼できる人がいる場合

# 理由
:::note warn
ここから先は、すこし気分が悪くなる内容かもしれません。嫌な方はそっとこのページを閉じてください。
:::

理由としては以下のとおりです。
- プログラミングの疑問というのは、案外簡単な場合が多く、簡単な質問には真面目に答えてくれる人が少ない。
- 最近は情報化社会というのもあり、だいたいの情報はネットに載っている。ネットが見れる状態なら、がんばってネットで検索したほうが早い。
- 時間があるなら、わからないプログラムは何日か寝かせる。そうすると、思考が凝り固まっていたことに気づき、エラーを潰すことが出来る。
- 質問サイトには、簡単な質問ばかりでうんざりしている人が多く、ついつい解答が攻撃的になる場合が多い。
- ネットで色々検索すると、他の知識も一緒に入手することが出来る。

いいことだらけですね。
わざわざ質問サイトやコミュニティに質問して、攻撃的な解答に精神を疲弊させられたり、意味のない解答に惑わされたりするよりも、自分で調べたほうがよっぽどいいでしょう。
昔とは違い、最近は初心者向けの内容から超上級者向けの情報まで、様々な情報がネットにあります。
めんどくさくても、がんばってドキュメントを読んだりしましょう。そっちのほうが、いろいろと他の知識もつくので、結果効率がいいです。

# 結論
プログラミングに関しては、基本的にはネットで質問するな！

# 注意
- すべての解答が攻撃的というわけではありません。善良な回答者も多数います。たまにいる攻撃的な人が目立つだけであり、基本は善良です。
- 何度も言いますが、あくまで私の個人的な考えであり、鵜呑みにしないでください。
【Nodo.js】Macでnpmが使えなかった時の対処法

:::note warn
エンジニア初心者の投稿であるため、間違っている箇所が多くあるかと思います。
何かお気づきの点がありましたらご教授いただけると幸いです。
:::

## はじめに
Macにパソコンを変えてからNodo.jsを使用したかったため、Node.jsをインストールしようとコマンドと戦った出来事をまとめます。

## やってみたこと
ターミナルで以下のコマンドを入力した。
```terminal:terminal
$ nodebrew install-binary stable
```

以下のエラーがコマンドさんから返ってきた。
```terminal:terminal
Fetching: https://nodejs.org/dist/v20.12.2/node-v20.12.2-darwin-arm64.tar.gz
Warning: Failed to open the file 
Warning: /Users/ユーザー名/.nodebrew/src/v20.12.2/node-v20.12.2-darwin-arm64.tar
Warning: .gz: No such file or directory
curl: (23) Failure writing output to destination
```

## インストール成功までの手順
上記のエラー文を読んでみるとディレクトリがないとのエラーであったので、ディレクトリを作成することにした。

下記のコマンドを実行する。
```terminal:terminal
$ mkdir -p ~/.nodebrew/src
```
インストールされたことを確認したら、nodeのバージョンを確認する。

```terminal:terminal
$ node -v
```

ここで新たなエラーが発生…。

```terminal:terminal
zsh: command not found: node
```

nodebrewがパスを通せていないことが問題であったので、パスを通した。

```terminal:terminal
$ echo "export PATH=$HOME/.nodebrew/current/bin:$PATH" >> ~/.zprofile
```

これでやっとnpmが使える…。
パスの通し忘れには注意したいと思った今日この頃です。


## 参考文献
https://nomark.ltt.jp/frontend/nodejs-install/

https://tanarizm.com/command-not-found-npm
URLクラス経由でURLSearchParamsを使う

# 背景

URLSearchParamsでクエリを作成する際にクエリより前の部分は別で管理していました。

```ts
const searchParams = new URLSearchParams({x:'a',y:'b'});
const url = `https://qiita.com/sample?${searchParams}`;
url;
//'https://qiita.com/sample?x=a&y=b'
```

https://zenn.dev/megeton/articles/5f1ba5c7e1bfd0

こちらの記事でURLクラス経由で使用するのを紹介されていたので実装してみます。

# サンプルコード

URLインスタンスからsearchParamsプロパティにアクセスしてクエリパラメータをセットします。
```ts
const url = new URL("https://qiita.com/sample");
url.searchParams.set('x','a');
url.searchParams.set('y','b');
url.href;
//'https://qiita.com/sample?x=a&y=b'
```
urlに関する情報をまとめて管理して、最終的に完成系のurlの文字列を作成できるので便利そうです。

課題としては複数のクエリパラメータを設定する時です。
以下のようにすれば良さそうです。

```ts
const url = new URL("https://qiita.com/sample");
const params = {'x':'a','y':'b'};
Object.keys(params).forEach(key=>{
  url.searchParams.set(key,params[key])
})
url.href;
//'https://qiita.com/sample?x=a&y=b'
```

:::note
searchParamsは読取専用のため
searchParams自体を新しいURLSearchParamsオブジェクトで直接置き換えることはできません。
```ts
const url = new URL("https://qiita.com/sample");
url.searchParams = new URLSearchParams({'x':'a','y':'b'});
url.href;
//'https://qiita.com/sample'
```
:::

# 最後に
普段はURLSearchParamsをそのまま使っていました。
パラメータが少ない際はURL経由で使うのが有効そうです。

# 参考
- [MDN URL](https://developer.mozilla.org/ja/docs/Web/API/URL)
- [URLエンコード関連メモ](https://zenn.dev/megeton/articles/5f1ba5c7e1bfd0)
ECS(Rails)×S3で画像取得できなくてつまづいた話

## はじめに
本番環境のECS(Rails)×S3で詰まったエラーの共有ができればと思います。

## 実現したいこと
ECSにデプロイされたRailsアプリケーションからS3に画像をアップロードし、それを取得する機能を実装しようとしていました。
システム構成は以下のようなイメージです。
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365570/1abe175f-8335-1bb4-158d-349e249e40db.png">

## 発生した事象とエラー
S3への画像アップロードは問題なくできましたが、画像の取得ができないという問題が発生しました。ECSのログを調査した結果、以下のエラーが確認できました。
```bash
ArgumentError (Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true):
```
どうやらRailsでURL生成に必要なホスト情報が設定されていない場合に発生するエラーのようでした。

## エラーの発生原因
画像の取得処理として、以下のように画像のURLを生成しており、これが原因でエラーが発生していました。
```ruby
url = url_for(image)
```

## 対処法
ホスト情報が設定されていないために発生するエラーですので、ホスト名を明示的に指定することが解決策です。具体的には、以下のようにECSで使用するURL（エンドポイント）の設定を行う必要があります。
```config/production.rb
### RailsアプリのURLがhttps://example.comの場合
Rails.application.routes.default_url_options[:protocol] = 'https'
Rails.application.routes.default_url_options[:host] ='example.com'
```


### 参考情報

https://qiita.com/jonnyjonnyj1397/items/e31fe746623af74dc5fc
【React】画面上で選択されている文字列を取得する方法

画面上で選択されている文字列を取得するには[Selection API](https://developer.mozilla.org/ja/docs/Web/API/Selection_API)を使用します。

```tsx
import { useCallback, useEffect } from 'react'

export function Sample() {
  const handleSelectionChange = useCallback(() => {
    const selection = document.getSelection()
    console.log(selection?.toStoring()) // 選択されている文字列をコンソールに出力
  }, [])

  useEffect(() => {
    document.addEventListener('selectionchange', handleSelectionChange)

    return () => {
      document.removeEventListener('selectionchange', handleSelectionChange)
    }
  }, [handleSelectionChange])

  return (
    <p>
      サンプルのテキスト。サンプルのテキスト。サンプルのテキスト。サンプルのテキスト。サンプルのテキスト。
    </p>
  )
}

```

https://developer.mozilla.org/ja/docs/Web/API/Document/getSelection

https://developer.mozilla.org/en-US/docs/Web/API/Selection/toString

https://developer.mozilla.org/ja/docs/Web/API/Document/selectionchange_event