OmniAICreator/Qiita-1.07M huggingface dataset:
HCP Terraform API の利用方法

HCP Terraform では、公式 API ドキュメントに沿って API コールを行うことで、様々な操作が可能です。

https://developer.hashicorp.com/terraform/cloud-docs/api-docs

## 認証用トークンの準備

公式ドキュメントに記載されているように、API 認証には Bearer トークンが必要です。

https://developer.hashicorp.com/terraform/cloud-docs/api-docs#authentication

### トークンの種類と選択

トークンには複数の種類があり、利用する API によって適切なトークンを選択する必要があります。

例えば、[Retrieve the JSON execution plan API](https://developer.hashicorp.com/terraform/cloud-docs/api-docs/plans#retrieve-the-json-execution-plan) の場合、下記のように記載されています。

> Note: This endpoint cannot be accessed with organization tokens. You must access it with a user token or team token that has admin level access to the workspace. (More about permissions.)

この場合、Organization token は使用できず、適切な権限を持つ User token または Team token が必要です。

### 重要な注意点

- 使用するトークンの種類を確認
- 対象ユーザーやチームに適切な権限が付与されていることを確認

## API 呼び出し方法

API の呼び出しは、ドキュメントに記載されている curl サンプルに従って実行できます。

### ドキュメントの前提条件

記載されているサンプルは、下記の前提になっているようです。

- 環境変数 `TOKEN` にトークン値が設定されている
- `payload.json` ファイルにリクエストペイロードが保存されている

各 API のドキュメントにはレスポンスコードに関する記述も含まれているため、適切なエラーハンドリングの実装が可能です。

## 具体的な実装例：アカウント情報の更新

ここでは、[Update your account info API](https://developer.hashicorp.com/terraform/cloud-docs/api-docs/account#update-your-account-info) を使用してユーザー名を変更する手順を説明します。

### (1) User token の生成

1. [HCP Terraform の Tokens のページ](https://app.terraform.io/app/settings/tokens)にアクセス
2. `Create an API token` をクリックし、以下の項目を設定
   - Description: トークンの説明
   - Expiration: 有効期限を設定
3. `Generate token` をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/c087b685-3215-2aef-a399-593e362a017f.png)

完了すると、下記の赤枠内に生成されたトークンが表示されます。
他のページに遷移したりブラウザを閉じたりすると消えてしまうため、すぐに安全な場所にメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/73a14d96-912b-590b-0f4d-28063f9c8dbc.png)

### (2) リクエストペイロードの作成

```json:payload.json
{
  "data": {
    "type": "users",
    "attributes": {
      "email": "<アカウントのメールアドレス>",
      "username": "<新しいユーザー名>"
    }
  }
}
```

### (3) API の実行

User token を環境変数 `TOKEN` に設定し、curl を実行します。
(payload.json が存在するディレクトリで実行する想定)

```bash
# トークンを環境変数に設定
TOKEN="<作成したトークン>"

# APIリクエストの実行
curl \
  --header "Authorization: Bearer $TOKEN" \
  --header "Content-Type: application/vnd.api+json" \
  --request PATCH \
  --data @payload.json \
  https://app.terraform.io/api/v2/account/update
```

### (4) 結果の確認

変更が成功したら、[Profile ページ](https://app.terraform.io/app/settings/profile)でユーザー名が更新されていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769407/795044fe-8702-5e32-3295-81f0b57191b3.png)

ユーザー名に使用できない文字が含まれている場合、以下のようなエラーレスポンスが返されます：

```json
{
  "errors": [
    {
      "status": "422",
      "title": "invalid attribute",
      "detail": "Username can include only letters, numbers, and dashes",
      "source": { "pointer": "/data/attributes/username" }
    }
  ]
}
```
Google Drive Android API と Google Play Games Services の Saved Games は死ぬ

Google Drive Android API は死ぬし、その結果 Google Play Games Services の Saved Games も死ぬ。等価な代替手段はない。金払って Firebase(Cloud Firestore とか)使え

Google Drive Android API が今年(2019年)12月6日に死ぬ(Google Drive Android API Deprecation on Dec 6, 2019)
https://developers.google.com/drive/android/deprecation
　Android で良い感じに動く Google Drive の機能が死にます。これは Android で良い感じに動く機能であり、その代替先として Android に限らない、どこでも動く汎用的な REST API があります。

https://developers.google.com/drive/api/v3/about-sdk
　これを使えば、単なる Google Drive と連携してるアプリは生き長らえることができるので、ちゃんと移行していきましょう。

　さて、それとは別に Migration の項目をちゃんと確認していきます。

Accessing App Data
Support for storing and syncing in the app data folder will likely be removed from Drive in the future. Clients requiring app data storage are strongly encouraged to migrate to a non-Drive solution such as Cloud Firestore.
(雑な訳) Google Drive におけるapp data folder への保存と同期のサポートは将来的に削除されます。(Google Drive の)app data storage 機能を使っているものは Cloud Firestore のような Google Drive ではないものへ移行するのを 強く オススメします。

　というわけで、 app data folder の機能は将来的に消えるみたいです……と、ここでいきなり Google Play Games Services の Saved Games を見てみましょう。

https://developers.google.com/games/services/android/savedgames
　なるほどなるほど SnapshotsClient.open() を使ってスナップショットから開く、と言うことか……

public Task<DataOrConflict<Snapshot>> open (SnapshotMetadata metadata)
Required Scopes: SCOPE_GAMES_LITE and SCOPE_APPFOLDER.

SCOPE_APPFOLDER......? さっき出てきた app data folder じゃねーか！！！ つまり Saved Games の機能も will likely be removed from Drive in the future って事じゃん！！！

ついでに言うと

https://developers.google.com/android/reference/com/google/android/gms/drive/Drive
This class is deprecated.
The Google Drive Android API is deprecated and will be turned down on December 6, 2019. See the migration guide for instructions on migrating to the REST API.

com.google.android.gms.drive.Drive クラスも死ぬし、その static final フィールドである

public static final Scope com.google.android.gms.drive.Drive.SCOPE_APPFOLDER も死ぬのでは……？ どうなってんの Google Play Games Services...... これ、どこまで信用できるの？ 迂闊に使ってるとまたハシゴ外されたりしない……？

結論(再掲)
Google Drive Android API は死ぬ し、その結果 Google Play mk sports(https://www.sportsmk.com) Games Services の Saved Games も死ぬ 。等価な代替手段はない。金払って Firebase(Cloud Firestore とか)使え。

個人的な感想
Google Play (Game) Services 周りの機能、昔っからずっと不安定というか、隙あらば消えていくので AWS あたりのマイクロサービス組み合わせてやってくのが一番寿命が長いというか、メンテフリーで維持できる気がします。
go workspaceで`go mod tidy`が失敗するのを回避する

# はじめに
go言語のworkspace機能を利用中、`go mod tidy`コマンドを実行したところ、エラーが発生しました。
workspace内で使用しているパッケージが、ローカルにしか存在しなかったため、パッケージをリモートから取得できずエラーになっていたようです。

workspace内限定の依存関係というのは珍しくなく、むしろworkspace機能を使用している目的の場合もあると思います。
そういうったプライベートな依存と通常のパブリックの依存が入り混じった状況で、依存関係を自動で整理してくれる`go mod tidy`が使えないのは不便です。
回避策がありますので、紹介します。

# この記事で伝えたいこと
`go mod tidy`コマンド実行時、エラーを無視する`-e`オプションを追加します。
```shell
$ go mod tidy -e
```
> The -e flag causes tidy to attempt to proceed despite errors
encountered while loading packages.

issueも立っているため、将来的にgo言語側で対応される可能性はありますが、今のところはこれが回避策です。
https://github.com/golang/go/issues/50750#issuecomment-1018863325

# 前提条件
## go version
この記事は、1.23.1時点でのものです。
```bash
go version
go version go1.23.1 darwin/arm64
```

## 検証環境
workspaceが手元にない方のために、今回検証に使用した環境をGitHubで公開しています。
https://github.com/ymuraki-csc/go-test-work

workspaceの詳しい解説や手順は、公式ドキュメントをご覧ください。
https://go.dev/doc/tutorial/workspaces

# `go mod tidy`をworkspace内で実行してみる
`tidy`で削除されることを期待するパッケージとして、MySQLのドライバーをtestsモジュールに追加します。
```bash
cd tests/
go get github.com/go-sql-driver/mysql
```

`tests/go.mod`は、次のようになっていると思います。
```go
module example.com/tests

go 1.23.1

require github.com/google/go-cmp v0.6.0

require (
	filippo.io/edwards25519 v1.1.0 // indirect
	github.com/go-sql-driver/mysql v1.8.1 // indirect
)
```

## `go mod tidy`（失敗）
まずは何もオプションを付けずに実行しています。　
```bash
$ go mod tidy                          
go: finding module for package example.com/demo-pkg
go: example.com/tests tested by
        example.com/tests.test imports
        example.com/demo-pkg: cannot find module providing package example.com/demo-pkg: unrecognized import path "example.com/demo-pkg": reading https://example.com/demo-pkg?go-get=1: 404 Not Found
```

終了ステータスは`1`で、実行に失敗しました。
```bash
$ echo $?    
1
```

`tests/go.mod`の中身も、MySQLドライバーが残ったままです。

```go
module example.com/tests

go 1.23.1

require github.com/google/go-cmp v0.6.0

require (
        filippo.io/edwards25519 v1.1.0 // indirect
        github.com/go-sql-driver/mysql v1.8.1 // indirect
)
```

## `go mod tidy -e`（成功）
本題の`-e`オプションをつけてみましょう。
```bash
$ go mod tidy -e
go: finding module for package example.com/demo-pkg
go: example.com/tests tested by
        example.com/tests.test imports
        example.com/demo-pkg: cannot find module providing package example.com/demo-pkg: unrecognized import path "example.com/demo-pkg": reading https://example.com/demo-pkg?go-get=1: 404 Not Found
```

終了ステータスは`0`、正常終了です。
```bash
$ echo $?
0
```

`tests/go.mod`を見てみると、使用している`go-cmp`のみが残りました。

```go
module example.com/tests

go 1.23.1

require github.com/google/go-cmp v0.6.0
```

# まとめ
`go mod tidy`の`-e`オプションを紹介しました。
workspaceと併用できないのは非常に不便ですので、同じ事象でお困りの方の助けになれば幸いです。
.ps1スクリプト使用前準備：PowerShellの実行ポリシー変更

少し前にPC変わってその後久しぶりにスクリプト実行しようと思ったら起動せず、そういえば実行ポリシーを変えてなかったなと思ったので簡単にメモ。内容は下記です。

1. PowerShellを管理者権限で実行する方法
1. PowerShellの実行ポリシー変更・確認

PowerShellはPCの初期設定でセキュリティの観点からスクリプトからの機能開始ができないようになっているので、スクリプト書いてイザ実行する前には実行ポリシー変更が必要です。

# 1. PowerShellを管理者権限で実行する方法
PowerShellを管理者権限で実行するには2つ方法があります。
1. PowerShellをエクスプローラで探しアイコン右クリックで「管理者として実行」を選択
1. PowerShellを起動した後コマンド入力して管理者権限に昇格
    * 2の場合は下記コマンドをそのままコピペして実行する。実行すると管理者のパスワード入力などが求められ、その後管理者権限でのPowerShellコンソールが起動します。


```PowerShell
Start-Process powershell -verb runas
```

# 2. PowerShellの実行ポリシーを変更する
詳細はいろいろな記事でまとめられているので割愛しますが、ひとまずは実行ポリシーを"RemoteSigned"という状態にする必要があります。ステップは下記です。

1. Set-ExecutionPolicyコマンドレットを実行する
    * 実行した場合の画面は下記。いくつか入力が求められますが赤線部参考にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/b309a55b-dcf4-2fef-5386-babf288c60d8.png)

1. Get-ExecutionPolicyコマンドレットでRemoteSignedになっているか確認する
    * 下記画像参照。RemoteSignedと出てればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/a429a9fa-e64e-27b7-f78b-5993f5dc15d7.png)


# おわりに
初心者向けのPowerShellの情報ってあんまないなと思ったんで、いい機会だなと思ってまとめておきました。(とはいえ私も全然初心者ですが)

この情報は色々なサイトでまとめられているのでわかりにくかったら他のサイトも参考にしてみてください。
discord.js v15の時代がもうすぐそこへ

# 前置きと感謝
今年の8月にdiscord.js v13が[v13.17.1](https://www.npmjs.com/package/discord.js/v/13.17.1)で開発終了しました。
2021年6月([chore: prepare release](https://github.com/discordjs/discord.js/commit/cfde127072ae06b63f17ba19b3e0d28fddef97d6))から2024年8月までの3年間、お世話になりました！
![goodbye-discordjs-v13.png](https://cdn.oto.pet/img/goodbye-discordjs-v13.png)
[音声ファイル](https://cdn.oto.pet/aud/goodbye-discordjs-v13.mp3)

# discord.jsの今後
discord.jsの現行サポートバージョンはv14です(執筆時点での最新は[v14.16.3](https://www.npmjs.com/package/discord.js/v/14.16.3))。
v13が開発終了した今、近くないとはいえ次に開発終了するのはv14なので、今さらv13用のコードをv14に書き直すのはめんどくさいし無駄になります。
となるとv15がリリースされたときに書き換えるのがベストタイミングであるような気がします。
まだ正式リリースではないですがdevバージョンのほうはすでに始動しています！

- [v15.0.0-dev.1728043488-12e510671](https://www.npmjs.com/package/discord.js/v/15.0.0-dev.1728043488-12e510671) (執筆の3日前に公開)
- [v15.0.0-dev.1728259953-8ab4124ef](https://www.npmjs.com/package/discord.js/v/15.0.0-dev.1728259953-8ab4124ef) (執筆の6時間前に公開)

今後のリリースが楽しみですね。
ラズベリーパイ比較 省電力・対応Wifi・性能・価格

3A 3B 3B+ 4B　の比較です。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/ad6c4ecc-3e8e-e0bb-ac41-38e3f1a5c097.png)

### 1ヵ月の電気代

計算の前提
消費電力：7.6W
稼働時間：24時間×30日＝720時間
電気料金：日本の平均的な電気料金は1kWhあたり約27円と仮定

3A　39円
3B　59円 
3B+ 73円
4B 148円
RAGのチャンクには5つのレベルがあるらしい

## RAGとは
LLMは基本的にすでに学習したデータは持っていますが、リリース以降のデータは持っていません。
当然、自分が手元に持っているドキュメントなど知る由もなく、そうしたドキュメントに関する知識を前提に回答をすることはできません。
しかし、実際にAIを利用する場面では社内や自分が持っているドキュメントをAIに読み込ませて、その資料も検索対象として回答してもらうことが重要になります。
そこで登場するのがRAG(Retrieval-Augmented Generation)になります。RAGはLLMによるテキスト生成に、外部情報の検索を組み合わせることで、回答精度を向上させる技術です。

## ドキュメントを読み込む際
ドキュメントといっても、Webページもあれば、word, excel, power pointといったファイル、C#, Pythonといったコード、書籍など様々です。
たとえばその中でwordのドキュメントがあったとします。中身は200ページだとしたら、それをわたしたちは一気に読んで理解できるでしょうか？
たいてい大きなドキュメントや書籍を考えればよいですが、目次があって、全体の概要をそこから知ることができます。
そのように、ある程度の区切りでドキュメントを分割することで、理解しやすくなるわけです。

---
それと同じようにLLMにドキュメントを読み込んでもらう際には、内容を検索しやすいようにある程度のまとまりで区切って、データのベクトル化を行います。
この区切りやまとまりのことをチャンクといいます。
このチャンクをどのように区切るかで、５つのレベルがあります。

## Lv1. 固定サイズのチャンク
最も単純で、雑な方法です。
ドキュメントの内容や構造に関係なく、100文字ずつといった固定文字数で区切ってしまう方法です。
DifyとかLangchainでもチュートリアルでは400とか数字で区切っているかと思います。わたしたちも、だいたい1000ぐらいでいいだろうとかいった感じで、embeddingの設定をしているように思います。追加で設定するとしたら、文字が少し重なるように調整したりといったところです。

ところが、当然のことですが、これは意味のない区切りなので、わたしたちが目次などで構造化して理解する考え方とは異なります。

## Lv2. 再帰的(反復的)チャンク (Recursive Chunking)
これは改行コードなどの区切り文字を使用してテキストを階層的に分割する方法です。
さらに目的とするチャンクサイズを設定し、分割した結果がそのサイズと合わない場合は、反復(再帰)して、目的のチャンクサイズを生成していきます。
区切り文字を設定していたら、そういうことをしているんだと思ってください。

## Lv3. ドキュメントベースのチャンク
このチャンク方法は、ドキュメント特有の構造に基づいて分割を行います。
最初にお話しした目次を使った構造理解に近いですが、目次ではなく、ドキュメント内の段落、図表などをもとに解析していきます。
コンテンツの流れや構造を、文字の大きさ、段落、スペース、表、図などをもとに解析していきますが、これに適しているものとしては、Markdownがあります。
RAGのための元となるドキュメントとして、Markdownが有効なのは、こうした構造を読み込むのに適しているからだと言えます。
Pythonパッケージのなかで、pyMuPDFというものがありますが、これをLLMに適したものにする拡張機能としてpyMuPDF4LLMがあります。これはPDFをMarkdownにしてLLMに読み込ませるためのものです。

## Lv4. セマンティックチャンク
Lv1からLv3はドキュメントから一定のサイズのチャンクを作成し、それに基づいて各チャンクの解析(ベクトル化)を行います。
それに対しそれぞれのチャンクの意味的なつながり(セマンティック)を考え、チャンク間の関係性や類似性を使用して、埋め込み処理を行います。
Lv3までは機械的な作業だったのに対し、人間の考え方に近い文書理解の仕方になってきているような感じですね。

## Lv5. エージェントチャンク
より人間的な思考に近い方法がエージェントチャンクです。
これはドキュメントの最初から読み進めて、似ている内容、概念などを抽出したり、テーマを見つけて、それらがどのように変化したり、否定されたり、肯定されたりしているかといった感じで、チャンクを構築します。
そのため、最初から500文字でチャンクを区切るのではなく、最初に見つけたテーマに即していれば、そのチャンクに含め、異なれば別のものにするといった、思考的チャートのような流れをしています。
人間的なアプローチといえますが、かなり試行錯誤が必要であることや、何がテーマであるかなど、検証すべきことが多くあり、何回LLMに思考させれば最適となるか、まだまだ解決すべき点が多くあり、実験段階と呼べるものです。

## AIの今後
ここからわかるのは、AI(LLM)というのは、あくまでもビッグデータから解析された様々なベクトルを組み合わせて回答を生成しているのであって、自身が何かしらの思考や学習意欲をもって知識を習得しているわけではないということです。これがRAGにおいてはとても難しい課題になるわけです。
しかし、今後のAIの発展においては、このあたりがブレークスルーになるように思います。AIの学習プロセスそのものの変化、思考パターンの変化など、様々なことが課題とは思いますが、RAGの手段の発想が逆にAI開発そのものを変えていく日も近いかもしれません。
kubernetes: memo

現在、CIプラットフォームよりも、コンテナオーケストレーションプラットフォームははるかに標準化が進んでいる。
=> kubernetesがその一つ
Googleによって開発されたOSSのコンテナオーケストレーションプラットフォーム

kubernetesの使い方は複雑であるが、2つの一般的なコンポーネントに分類することで単純化できる

- クラスタ管理
kubernetesクラスタの設定と構成を行う。
各クラスタには少なくとも１つのリーダーノードと一つ以上のワーカーノードが必要。
- リーダーノード
クラスタの状態を監視し、ワーカーノードのタスクをスケジュールする

- worker nodes
kubernetesクラスタの監視、worker nodesのタスクのスケジューリング
- leader nodes
  - アプリケーションのワークロードを実行する
  - コンテナを通じてワークロードを実行する

- pods
kubernetesにデプロイを行う最小単位。ネットワークとストレージを共有する１つ以上のコンテナのグループ


## AWS

Elastic Kubernetes Service
CLIを利用してSSL証明書の有効期限を確認する方法

セキュリティの要となるSSL/TLS証明書の管理は、IT運用において不可欠なタスクです。本記事では、コマンドラインインターフェース（CLI）を使用してSSL証明書の有効期限を確認する方法を解説します。

## opensslコマンドの活用


`openssl`は、暗号化プロトコルの実装を提供するツールです。このコマンドを使用することで、SSL証明書の詳細情報を簡単に取得できます。

### コマンド構造の解説


以下のコマンドを使用して、特定ドメインのSSL証明書の有効期限を確認できます：

```console
DOMAIN=www.example.com
echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | \
openssl x509 -noout -enddate | \
cut -d= -f2
```


このコマンドは、以下の要素で構成されています：


1. `DOMAIN`変数：検証対象のドメインを指定します。
2. `openssl s_client`：指定されたサーバーとのSSL/TLS接続を確立します。
3. `openssl x509`：X.509証明書を解析し、有効期限情報を抽出します。
4. `cut`コマンド：出力結果から必要な部分のみを切り出します。

### 出力結果の解釈


コマンド実行後、以下のような形式で有効期限が表示されます：

```console
Mar  1 23:59:59 2025 GMT
```


この日時は、証明書の有効期限を示しています。GMT（グリニッジ標準時）で表示されるため、必要に応じてローカル時間に変換する必要があります。

## 確認した環境
- macOS 13.6
- zsh 5.9




## セキュリティ管理の自動化


このCLIベースの方法は、証明書管理の自動化に活用できます。シェルスクリプトやCronジョブと組み合わせることで、定期的な証明書チェックを実装し、有効期限が近づいた際に自動通知を設定することができます。

## まとめ


SSL証明書の有効期限管理は、セキュリティにおいて重要な要素です。CLIツールを活用することで、効率的かつ正確に証明書の状態を監視できます。
【Vim】クリップボード使用許可



## 概要
Vimはデフォルトだと編集内容をコピーしても、エディタ外にペーストできないため、こ>の記事ではクリップボード使用許可にするための方法を解説します。


## 参考

https://ylabdesk.com/vim-copy-paste#%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E5%A4%96%E3%81%A8%E3%81%AE%E9%96%93%E3%81%A7%E3%82%B3%E3%83%94%E3%83%9A


## 手順

**【1】ターミナルからVimの機能を確認するコマンド**
```bash:hash
vim --version | grep clipboard

# -> -clipboard
```


**【2】ツールインストール**
```bash:bash
sudo apt install vim-gnome

# もしvim-gnomeが不可であれば
sudo apt install vim-gtk3
```
**【3】再度確認**
```bash:bash
vim --version | grep clipboard

# -> +clipboard
```

**【4】コピペ機能をクリップボードと連携**
```bash:bash
echo 'set clipboard=unnamedplus' >> ~/.vimrc
```
`set clipboard=unnamedplus` を `~/.vimrc` に追加することで、Vimのすべてのヤンク（コ>ピー）とペーストがデフォルトでシステムのクリップボードと連携されるようになります。


`unnamedplus`はVimの`clipboard`オプションの一つで、「GUI」アプリで使うクリップボード（「Ctrl+C」でコピー、「Ctrl+V」でペーストするクリップボード）です。
VBAのhyperlinkオブジェクトのaddメソッドで気づいたこと

VBAのhyperlinkオブジェクトのaddメソッドで気づいたこと。

Hyperlinks.Add(Anchor, Address, [SubAddress], [ScreenTip], [TextToDisplay])

このAnchorの部分はlistobjectのdatabodyrangeで位置を指定できる。
一方で、AddresとTextToDisplayはstring型の変数に文字列を代入しないとエラーになってしまった。
AWS CloudFormation StackSetsとOU

# 内容
AWS OrganizationsとAWS CloudFormation StackSetsを活用することで、OU内の複数アカウントに一貫したリソースデプロイが可能です。本記事では、アカウントがOUから離脱または参加した際に、デプロイされたリソースの挙動を確認していきます。

## シナリオ
1. SwitchRole用のテンプレートを作成
1. 1.で作成したCloudFormationをOUにStackSetsでデプロイ
1. この状態で、OU内のアカウントをOU外に移動や、再度OU内へ移動したときの様子を確認

## 挙動を確認
### CloudFormationのStackSetsでOUにデプロイ
CloudFormation StackSetsデプロイの様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/102003fe-d870-f929-1383-1f7b81ba10db.png)

### OU内のアカウントにSwich Role入れるか確認
OUにデプロイできたので、SwitchRoleをして確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/ce88e7cf-9880-f2a7-3eaf-dc0577cb1ce6.png)

アカウントIDと作ったSwitchRole用のRole名を入力し切り替える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/50043d2d-f72d-fc3a-5b81-fc8c7e5d12ff.png)

スイッチロール後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/933aba68-a71a-352b-6fd8-a96f463536cf.png)


### OU配下のアカウントのIAMロールの様子
ちゃんと、デプロイできてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/6f125ade-f8ea-716e-06ea-40269615f85c.png)

---
### アカウントをStackSetsをOU外に移動
OU外に移動させたアカウントのIAMRoleを確認するとSwitchRole用のIAMロールが消えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/88b81852-f52e-ce34-eae7-984586bedfbd.png)

---
### 再度、SwitchRoleをデプロイしたOUにアカウントを移動させる
→アカウントX内でCloudFormationの様子を確認すると、SwitchRoleのCloudFormationがデプロイされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/0e22c47e-aa6a-9be9-1e89-bef0f12175db.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/9b1d7a3e-0cf8-b4f6-bb22-20ed2d5da894.png)

## まとめ
AWS CloudFormation スタックセットは、組織内の複数アカウントに対するリソース管理を大幅に簡素化できる。しかし、OU 間でアカウントを移動する際には、スタックセットによるリソースの自動作成・削除が行われるため、アカウントをOU外に移動させたときはリソースが影響が出ないか注意が必要です。
Roadmap.shで学ぶFlutter - Advanced Dart - [Core Libraries③:math]

# 導入
[roadmap.shのFlutter](https://roadmap.sh/flutter)のAdvanced Dart Core Librariesの3本目です。

https://dart.dev/libraries/dart-math

# dart:math
`dart:math`ライブラリは、正弦や余弦、最大値と最小値、円周率（pi）やネイピア数（e）などの定数を利用できる機能を含んでいます。このライブラリをアプリで使用するには、`dart:math`をインポートしてから利用することになります。

```dart
import 'dart:math';
```

## 三角関数

Mathライブラリは基本的な三角関数を提供しています。

```dart
// 余弦
assert(cos(pi) == -1.0);

// 正弦
var degrees = 30;
var radians = degrees * (pi / 180);
// radiansは0.52359になります。
var sinOf30degrees = sin(radians);
// sin 30° = 0.5
assert((sinOf30degrees - 0.5).abs() < 0.01);
```

これらの関数は度数ではなくラジアンを使用します。

## 最大値と最小値

Mathライブラリは`max()`と`min()`メソッドを提供しています。

```dart
assert(max(1, 1000) == 1000);
assert(min(1, -1000) == -1000);
```

## 数学定数

Mathライブラリには、一般的に利用される定数（pi, eなど）も含まれます。

```dart
// Mathライブラリで他の定数も参照できます。
print(e); // 2.718281828459045
print(pi); // 3.141592653589793
print(sqrt2); // 1.4142135623730951
```

## 乱数

`Random`クラスを使用して乱数を生成できます。`Random`コンストラクタにシードを設定することも可能です。

```dart
var random = Random();
random.nextDouble(); // 0.0と1.0の間の数：[0, 1)
random.nextInt(10); // 0から9の間の数。
```

ランダムなブール値も生成できます。

```dart
var random = Random();
random.nextBool(); // trueまたはfalse
```

:::note warn
デフォルトの`Random`実装は、暗号学的に安全でない**擬似乱数ビット**のストリームを提供します。暗号学的に安全な乱数生成器を作成するには、`Random.secure()`コンストラクタを使用してください。
:::

# 終わりに
今回は、`dart:math`ライブラリについて紹介しました。このライブラリは、数学的な計算や定数、乱数生成など、さまざまな機能を提供しています。特に三角関数や数学定数、乱数の生成は、多くのアプリケーションで必要となる基本的な要素です。これらの機能を利用することで、より複雑なアルゴリズムやシミュレーションを簡単に実装することができます。
Truchetタイル

本記事は、以下の記事から続いています。

https://qiita.com/hextomino/items/4439bd32aad380568fb2

# Truchet トルシェット タイル

https://en.wikipedia.org/wiki/Truchet_tiles

正方形を斜めに分け、白黒に塗り分けたタイルを用意する。これを敷き詰める際に向きをランダムにしたり、規則的にすることで、また別の模様が見えてくる。

![truchet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/a070cb05-ab04-ffdc-3357-4e71a2a1b207.png)

```java
int(random(4))*90;
```
乱数0~3.999を発生させ、intで整数に切り捨てる(0,1,2,3)。
その後90を掛けて、0,90,180,270を生成する。
```java
radians(th);
```
度をラジアンに単位変換する命令。

```java
PImage img;

size(640, 640);
img = loadImage("truchet.png");

for (int y=0; y<640; y+=64) {
  for (int x=0; x<640; x+=64) {
    float th = int(random(4))*90;
    push();
      translate(x+32, y+32);
      rotate(radians(th));
      translate(-img.width/2, -img.height/2);
      image(img, 0, 0);
    pop();
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/c8a61ede-2c42-ab83-9b87-eb0e16534c45.png)

















# 六角形充填
　正方形と同様に、六角形を敷き詰める事を考える。
　画像は、イラレから書き出す際に、背景を透過色pngで保存する。
　画像サイズは、64x64として、画像の中心が六角形の中心になるようにする。
![truchetHex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/ed368ed8-9ac5-0a48-c346-152c6ec2eaba.png)
```java
int(random(6))*60
```
これは0,60,120,180,240,300を生成する式である。

```java
((x/(int)w)%2*(h*0.5))
```
これは、xをwで割ったときに、奇数か偶数かで、上下にずらす値を計算する式である。
xを整数で割りたいので、intでwを変換し、
%2で、余りが、０か１を求める。
その結果に、ずらしたい縦の移動量(h*0.5)を掛けている。
h/2だと結果が、整数になるかもしれないので、避けている。

「55.4256」この値は、イラレで表示された値です。

```java
PImage img;

float w=64-16;
float h=55.4256;

size(640, 640);
img = loadImage("truchetHex.png");

for (int y=0; y<640; y+=h) {
  for (int x=0; x<640; x+=w) {
    float th = int(random(6))*60;
    push();
      translate(x, y+((x/(int)w)%2*(h*0.5)));
      rotate(radians(th));
      translate(-img.width/2, -img.height/2);
      image(img, 0, 0);
    pop();
  }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/d40fb7df-324c-361c-8b1f-9da778d43e84.png)


# 改良

truchetパターンは多く考案されているので、正方形や六角形の画像を差し替えて、違うバリエーションを試してほしい。

スクショを撮るか、save("xxx.png");で保存提出。

# おまけ
我が家の、なんかしらん袋
![IMG_6283.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/0a6d9051-2d38-a40e-4497-1de1dbdc4132.jpeg)
exec: "docker-credential-desktop.exe": executable file not found in $PATH

- dockerを起動しようとしたら `error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: `が出た時の話
- これは備忘録ですので特に解説とかはないです
    - [公式](https://forums.docker.com/t/docker-credential-desktop-exe-executable-file-not-found-in-path-using-wsl2/100225)でもそれぽい記事があったのでそちらを参照してみてください


### エラー
- dockerを立ち上げようとした際に以下のようなエラーが発生
```shell
$ docker compose up

error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ``
```

### 解決策

```shell
# config.jsonを修正
$ vim ~/.docker/config.json 

# ファイルの中身を修正
// 修正前
{
        # 一部省略
        "credsStore": "desktop",
        3 一部省略
}

　　　　　　　　　　↓
# 修正後
{
        # 一部省略
        "credStore": "desktop",
        # 一部省略
}
```

### 終わり
- この修正がなぜ必要かを調べる必要があるが放置し続けてしまっている
- いつか続編を出したい
エンジニア歴１ヶ月の人間がCSS設計完全ガイド

　前回の投稿から約１ヶ月が経過し、現在は主にPHPに関するカリキュラムを受講しています。すると、１ヶ月前に比べてできることはかなり増えましたが、CSSに関しては忘れている事項も多いことに気がつきました。
　そこで今回、カリキュラムの一環として、「半田惇志(2020)　『CSS設計完全ガイド　詳細解説＋実践的モジュール集』　技術評論社」を読んでみました。
　CSSに関して忘れていたことだけでなく、過去のモヤッとした知識がクリアになったように思えたので、以下にその内容と感想を、抜粋してまとめました。
　エンジニア歴1週間→１ヶ月の成長が書かれているものとしてご覧いただけますと幸いです。
　細心の注意を払っていますが、稚拙な文体であること、用語の解釈に誤りがあるかもしれないこと、本書の内容や主張を代弁しているわけではないことにつきましては、予めご了承ください。

## CSS設計の意義
　CSSは、文章構造（HTMLなど）とスタイルを分離するために開発され、CSSのおかげでスタイルの変更が容易になりました。
　しかし、PHPに触れてみて思ったことは、ページ数が多すぎてCSSの該当箇所がわかりづらい、ということでした。以前CSS設計について学びましたが、新しく学ぶPHPでいっぱいいっぱいだったので活用できていませんでした。現在約10ページのPHPに触れている段階でそのような状態なのですから、ページが増えれば増えるほどとてもわかりにくいコードになってしまうと感じました。
　また、CSSはグローバルスコープしか持っていないため、スタイリングが増えれば増えるほどCSS同士が相互に干渉する可能性が高くなります。
　さらに、現在は複雑でリッチなウェブサイトが求められているので、上記の問題点やエラーがとても起きやすい状況だといえます。
　したがって、いかにCSSをわかりやすく保つかが大事になってきます。そこで、このCSSを、 抽象化し、分ける ことがCSS設計の意義だといえます（１ヶ月前よりもCSS設計の重要性を深く理解できました）。

## カスケーディング
　単純セレクター・擬似要素・結合子といったセレクターが存在する中で、それらの優先度順で適用するスタイルを決定する規則のことをカスケーディングと言いますが、[その優先度は](https://daynghekimhoan.vn/ruby-la-gi/)、

1 重要度（!importantなど）
2 詳細度
3 コードの順序　{　後のコードが優先。:where()などを使うと強制的に後勝ちにできる。(前回の記事を読んでいただいた方に教えていただきました。)　}

となっています。
## 詳細度に関しても、

1 IDセレクター（#headerなど）
2 擬似クラス・属性セレクター・クラスセレクター
3 要素型セレクター（pなど）

となっています。
そして、同じ優先度のセレクターをいくら用いても、同じ優先度のセレクター同士では優先されても、一つ上の優先度のセレクターより優先されはしません。
　したがって、CSS設計を行うためには、 カスケーディングを理解し、管理できるようになる 必要があります。詳細度の確認に便利なサイトもあるので、それも用いながらわかりやすいCSSを書けるようになりたいです。
セレクトボックスで1~10の選択肢を作る

## はじめに
時間割アプリの開発にあたって、1~10の選択肢が表示されるセレクトボックスを作りました。
その際に記述したコードとその解説をしていきます。

## 機能の詳細
- 完成時の画面表示
![スクリーンショット 2024-10-07 11.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842446/bc671eff-0f28-d5d0-98b9-59cb7fc12a6e.png)
- 実装する機能
1〜10までの選択肢を自動的に作り出して`SelectBox`に表示する
- 最終的なコード
`ClassNumber`コンポーネントは`styled-component`によって`<select>`タグと置き換えられています。
```jsx
<ClassNumber>
    {Array.from({ length: 10 }, (_, i) => (
        <option key={i + 1}>{i + 1}</option>
    ))}
</ClassNumber>
```
## 解説
`Array.from()`を使って10個の数字（1〜10）を選択肢として作成

1\.`Array.from({ length: 10 })`で長さ10の配列を作成
この配列の各要素は未定義の値だが、`(_, i)`というコールバック関数*が渡されており、`i`はインデックスを表しています（0〜9の数）。
*何らかのルーチンやアクションを完了させる関数
```jsx
{Array.from({ length: 10 }, (_, i) => ())}
```
2\.このインデックス`i`に 1 を加えて`（i + 1）`、`<option>`タグの値として使用
つまり、1から10までの数字を表示する`<option>`タグを10個作成する。
```jsx
<option key={i + 1}>{i + 1}</option>
```
3\.各`option`タグには、`key={i + 1}`という一意のキーが設定されている
Reactでは同じ要素をループで繰り返しレンダリングするときにキーが必要。
```jsx
<ClassNumber>
    {Array.from({ length: 10 }, (_, i) => (
        <option key={i + 1}>{i + 1}</option>
    ))}
</ClassNumber>
```

## さいごに
> 時間割アプリで使用した他の機能はこちら

https://qiita.com/naoki-atjp/items/bc8a7028aba7d3725832

https://qiita.com/naoki-atjp/items/43aab60a1ff7e6bc8291

https://qiita.com/naoki-atjp/items/e890c89452dec8573fbd

https://qiita.com/naoki-atjp/items/d361465174a20abf84f4

https://qiita.com/naoki-atjp/items/d71c2bac6b4edefbddcb
【C#】ジェネリックメソッドとは？【<T>】

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/generics/generic-methods

# ジェネリックメソッドとは？
ジェネリックメソッドとは、メソッド呼び出しの際に、型を指定できるように定義したメソッドです。

## ジェネリックメソッドの定義
ジェネリックメソッドを定義するには、メソッド名Swapの後ろに\<T>といった型パラメーター(型引数)を宣言します。
```C#:C#
// ジェネリックメソッドを定義
static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}
```

## ジェネリックメソッドの利用
型パラメーター（型引数）にintを指定して、メソッドSwapを呼び出します。
```C#:C#
public static void TestSwap()
{
    int a = 1;
    int b = 2;

    // 型パラメーターを明示してメソッドを呼び出す
    Swap<int>(ref a, ref b);
    System.Console.WriteLine(a + " " + b);
}
```

型パラメーター（型引数）は省略することもできます。
```C#:C#
public static void TestSwap()
{
    int a = 1;
    int b = 2;

    // 型パラメーターを明示せずにメソッドを呼び出す
    Swap(ref a, ref b);
    System.Console.WriteLine(a + " " + b);
}
```
③VScode から IBM i への接続手順

１．VScode の左下の IBM i のアイコンから「Connect to an IBM i」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/df0eb75a-682b-bb92-4490-dc5a0d046194.png)
<br>

２．IBM i 接続設定情報を入力します。		

    Connection Name     : VScodeで表示する際の任意の名前	
    Host or IP Address  : 接続する区画の情報	
    Port (SSH)          : 接続する際に使用するポート　※IBM i 側の設定時に、ポート22でSSHを開けているため、初期値の22でOK）	
    Username            : IBM i にサインオンする時のユーザーID	
    Password            : IBM i にサインオンする時のパスワード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/60b93221-395a-599a-8374-1d2611803cde.png)
<br>

３．下部の Connect をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/ad68c85a-9e18-362e-51bc-16e23995d508.png)
<br>

４．接続できると、画面左に 「USER LIBRARU LIST」 「OBJECT BROWSER」 等が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/6b4ef0e4-987b-6678-800d-9710b3bf7a68.png)
<br>

以上です。
<br>

↓前　【IBM i 側の SSH 設定手順】
https://qiita.com/irising-va_testuser01/private/499919a89cc266f913d7
②IBM i 側の SSH 設定手順

## 事前確認		
		
１．「939 日本（拡張ローマ字）」に設定する必要があります。
※以下は、IBM i Access Client Solutions より。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/8a48de21-9d0f-f232-c66d-ed21c4e221b1.png)
<br>

２．NETSTAT コマンドを実行します。

    NETSTAT
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/0919d56f-74d3-b18b-984a-b7195ede81e3.png)
<br>

３．「3. IPV4接続状況の処理」 を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/1f8a0dda-1cb0-368c-5480-10d45066a830.png)
<br>

４．SSHの標準ポート番号 「22」 が使用されていないことを確認します。	
※SHIFT + F2（F14）にてポート番号の表示ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/3f6a085b-df3b-1e2a-2a35-92751d32f263.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/3dcc4e27-b2b7-27c0-2453-a84fb8714c02.png)

## ユーザー作成 ～ コマンド実行まで		
		
１．SSH設定を実行するためのユーザーを用意します。
以下コマンドにて、CCSID が 5035 のユーザーを作成します。
※ユーザー名は任意。ただし文字桁数に制限があり、８文字を超えないユーザーIDである必要があります。

	CRTUSRPRF USRPRF(USER1)
	CCSID(5035) SETJOBATR(*CCSID) LOCALE('/QSYS.LIB/JA_5035.LOCALE')
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/63e8a365-2cda-40ea-952c-ca9fadefe670.png)
<br>

２．作成したユーザーでログインし、以下コマンドを実行します。

    QSH CMD('/QOpenSys/usr/sbin/sshd') 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/e8a558b8-596b-5604-a082-6e3e707ace96.png)
<br>

３．事前準備と同様に、「NETSTAT」⇒「3. IPV4接続状況の処理」を実行して
SSHが増えていることが確認できれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/cbbd444a-d611-a1ec-e7fd-346122905e7a.png)

※SHIFT + F2（F14）にてポート番号を表示すると、22で開かれている事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/cce016cb-7d38-8b7d-7f60-98b4ff36c9bf.png)
<br>

以上です。
<br><br>

↓続き　【Vscode から IBM i への接続手順】
https://qiita.com/irising-va_testuser01/private/356be51b7e37486fb845
<br>

↓前　【VScode のインストール ～ IBM i 拡張機能の導入まで】
https://qiita.com/irising-va_testuser01/private/0abb7f65d140aafffd5e
①VScode のインストール ～ IBM i 拡張機能の導入まで

## VScode をインストールする		
		
※以降、Windows にて説明いたします。	
		
１．VScode の Download ページ の Windows 用リンクをクリックしてインストーラをダウンロードします。
https://code.visualstudio.com/download
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/308b818b-f9e1-f00d-4ee7-c6a6b7cc419b.png)
<br>
 
２．ダウンロードしたインストーラをダブルクリックで実行して、 VScode をインストールします。	
インストールウィザードに従って操作してください。	

## VScodeを日本語に設定する			
			
１．VScode を起動して、ウィンドウの左下にある拡張機能アイコンをクリックすると検索タブが開きます。	
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/94f3ea77-0028-a1af-ee3b-c65017e684e7.png)
<br>
 
２．検索欄から 「Japanese Language Pack for Visual Studio Code」を表示して、 「Install」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/a30277d4-2d38-67e4-1db6-907b0a3e8af0.png)
<br>
 
３．インストールが終わり VScode を再起動すると、日本語設定になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/4f077479-e22c-67c1-7969-abdedf017284.png)

## 拡張機能をインストールする			
			
VScode と IBM i を接続するための拡張機能を導入します。	
日本語機能をイントールした時と同様にこの拡張機能もインストールします。	
			
拡張機能アイコンをクリックして、検索欄から 「IBM i Development Pack」 を表示してインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3903854/2652f277-c857-82cc-8521-0515af0e59e8.png)
<br>

以上です。
<br><br>

↓続き　【IBM i 側の SSH 設定手順】
https://qiita.com/irising-va_testuser01/private/499919a89cc266f913d7
【ChatGPT】公式が出したPrompt Generatorとは？


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

　今回は、OpenAIが公式に出したPrompt Generatorというものを紹介します。

:::note info
本記事は、OpenAIのPlayground
で行なっております。画像は
あります。　あしからず。
:::

　ニュースはありませんので、
　　本題に入ります。

　OpenAIが公開している
　　Playgroundにある機能のひとつに
　　　Idea to Prototypeとでも
　　　　言うべきものがあります。

　X-Twitter上では、
　　“Prompt Generator”とも
　　　“プロンプトジェネレーター”とも
　　　　呼ばれています。

　これは
　　OpenAI o1公開後の
　　　ChatGPT開発者アカウントにて
　　　　発表されたものです。

　モデルを
　　何に使うか、
　　　それを記述すれば、
　　　　自動的に
　　　　　関数と構造化された
　　　　　　出力のためのプロンプトと
　　　　　　　有効なスキーマを
　　　　　　　　生成します。

　簡単に言えば、
　　アイディアを入れれば、
　　　素早くPromptを
　　　　生成してくれるのです。
***
　では、
　　実際にやってみましょう。
　　　とはいえ、手順だけです。
　　　　自分で確かめてみてください。

　私もここまでのPromptが
　　作成されるとは
　　　思っていませんでした😅

　では、どうぞ。

　まず、
　　[OpenAI公式Rlayground](playground.openai.com)
　　　にアクセス。

　おそらく、
　　最初にログインを
　　　求められるかと思います。

　Googleでも
　　Appleでも
　　　ログインできます。

　ログインすると、
　　Rlaygroundの画面になります。
　　　ここでは、スマホ画面で
　　　　説明しますので、ご注意を。
![Screenshot_20241007-011103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/75ee181a-c326-7c61-1b0b-0c5e44695301.png)

　左上に“Chat”とありますが
　　その下に注目してください。
　　　最初は“gpt-3.5 Turbo-0125”と
　　　　なっていますね。

　それをタップすると、
　　モデル選択になります。
　　　使用するAPIなのでしょう。

　念のため、
　　“gpt-4o-mini”を選択。

　GPT-3.5よりも
　　GPT-4系の方がいいですし、
　　　新しいものよりも
　　　　安定している、と
　　　　　考えました。

　次に
　　その下の部分の右側に
　　　ふたつのアイコンがあります。

　十字星✦の
　　左上に点のあるアイコンを
　　　タップします。

　すると、
　　入力枠が出てきます。

　ここに
　　あなたのアイディアを
　　　書き入れます。
　　　　箇条書きでも構いません。

　入力し終わりましたら、
　　“Create”ボタンをタップ。

　❗注意❗：
　　ボタンをタップする前に
　　　入力した内容を
　　　　コピーしておきましょう。
　　　　　消えてしまいますから。
　　　　　　修正するのに困ります。

　内容にもよりますが、
　　数秒〜十秒ほどで終了します。

　出力枠内にPromptが
　　出来上がっていますので、
　　　コピーしてください。

　あとは、
　　そのPromptを
　　　実際に使用するだけです。

　もちろん、
　　完璧とは言えません。
　　　修正が必要な部分も
　　　　あることでしょう。

　それでも
　　最初から記述するよりも
　　　手早く済みます。

　もちろん、
　　複雑になりますから
　　　修正は大変かもしれませんが😅

　あるいは、
　　調整した入力内容で
　　　再度、Rlaygroundで
　　　　作成する手もあります。
***
　Prompt Generatorを使った例が
　　ポストされています。

　[木内翔大さんポスト](https://x.com/shota7180/status/1842399867970408538?t=CeSLqOEvgNagM9daPAhbLg&s=19)

```
1/ 会議の議事録を効率よくまとめるためのプロンプト
2/ カスタマーサポートの質を向上させるためのプロセスを提案してくれるプロンプト
3/ 製品開発プロセスの効率化のためにタスク分解を手伝ってもらうプロンプト
4/ チーム内のコミュニケーション効率を改善するためのアイデアを提案してくれるプロンプト
5/ リモートワークでのタイムマネジメント方法を提案してもらうプロンプト
6/ タスクの優先順位を整理してくれるプロンプト
7/ メール対応の効率化のためのプロンプト
8/ クライアントへのプレゼンテーション資料作成を支援するプロンプト
9/ 社内アンケートの設計を手伝ってくれるプロンプト
10/ 予算管理やコスト削減のための提案を考えてくれるプロンプト
```
***
　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
MetaQuest3に新規アカウントを追加して既存アカウントの開発モードをぶちぎった話( ; ; )

# はじめに
:::note alert
絶対に勝手にアカウントを追加しないでください
:::
これは僕がVR制作物発表会当日に起きた肝っ玉が縮こまった話です．
諸々の設定方法を知ってる前提で話を進めていますが，もし気になる方は[設定方法](https://qiita.com/drafts/eb9389c947bb1d9183c1/#%E8%AB%B8%E3%80%85%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95)にリンクを貼っているのでみてください！

# 経緯

 ハッカソンでVRアプリケーションを作ったぞ！！
 ---
よし，展覧会ではHMDをミラーリングをしよう!
---
HMDのホストアカウント持ってるサークルの会長が寝てるぞ
---
会長を起こすのも悪いし、新しくアカウントを作ろうか！！
---
よし！作れた！ミラーリング簡単にできる♪
----
あれ，開発者モードができない？？？
---
あっ，開発者モードはホストアカウントしか使えないんだ
---
しょうがない，ミラーリングなしでホストアカウント使うか...
---
え！？？？？ホストアカウントでも開発者モードが切れている？？
---
うわ〜〜〜💦💦
これじゃあアプリの最新版をアップロードできないぃぃぃ！！
---

# 原因
MetaQuestでは新しくアカウントを作成すると，開発者モードの設定をMetaのスマホアプリを使って再設定する必要があったようです。

# 解決方法
ホストアカウントのMetaアプリを開いて，再度開発者モードを設定する!

# おわりに
今回はホストアカウント保有者がいないというレアな状態で起こったため，余計焦りました。しかし，サークルなどでMetaQuestを共有している場合には大いにあり得ることだと思います！

:::note alert
勝手にアカウントを作らない！！
:::
これを約束してください！
もし作るなら

::: note
有識者 or ホストアカウント保持者がいるときに
:::
ということを覚えていてくれたら嬉しいです！

以上で僕の失敗談を終わります。

みなさんには，このような失敗が起きないように祈っています。
それではみなさん良いエンジニアライフを〜👋

# 諸々の設定方法

- 開発者モード

https://orentame.com/how-to-enable-developer-mode/

- ミラーリング

https://qiita.com/bearl27/items/53a4a327f427f0332bc1
Reactにおける配列レンダリングとkeyの役割

Reactで複数の要素を表示する際に、map関数を利用して配列からリストを生成するのはよくあるパターンです。しかし、配列の要素をレンダリングする際、特に動的なコンテンツ（増減や順序変更が発生するリストなど）において、Reactは各要素を追跡して効率的にレンダリングを管理する必要があります。このとき、keyという一意の識別子を設定しないと、以下のような警告がコンソールに表示されます。
```
Warning: Each child in a list should have a unique "key" prop.
```
この警告は、各リスト要素にkeyが設定されていない場合に表示されます。keyプロパティは、Reactがリストの各項目を特定し、効率的にレンダリングの差分を計算するための重要な要素です。

## なぜkeyが必要なのか？
keyはReactにとって、どの要素が追加、削除、または変更されたかを識別するために必要です。例えば、以下のようなシナリオを考えてみましょう：

1. ユーザーがリストに新しい項目を追加する
1. リストの項目が並べ替えられる
1. 特定の項目が削除される

これらの変更に対してReactが適切に対応しないと、パフォーマンスが低下したり、意図しないレンダリングが行われたりします。keyがないと、Reactはすべての要素を無条件に再レンダリングする可能性が高くなりますが、keyが正しく設定されている場合、必要な要素だけを最小限に再レンダリングすることでパフォーマンスが向上します。

## keyプロパティの使い方

次に、具体的にmapを使ってリストを表示する例

```jsx
const persons = ["Tom", "Jiro", "Taro"];

const Example = () => {
  return (
    <>
      <ul>
        {/* map関数を使用して配列をループし、リスト要素を作成 */}
        {persons.map((person) => (
          // 各リスト要素には必ず一意の key プロパティを設定
          <li key={person}>Hello, {person}</li>
        ))}
      </ul>
    </>
  );
};

export default Example;
```
## keyに一意の値を設定する方法
- 単純な配列の場合：配列内の値自体がユニークであれば、上記の例のように値をkeyに設定できます。この場合、personが一意であることが前提です。


- 重複の可能性がある場合：リストの要素に重複がある場合や、要素が動的に増減する場合には、インデックスを使うことができます。ただし、リストの順番が変わる可能性がある場合は、インデックスは推奨されません。順序の変更が発生すると、インデックスが正確な追跡を妨げるためです。

```jsx
{persons.map((person, index) => (
  <li key={index}>Hello, {person}</li>
))}
```
- オブジェクトの場合：オブジェクトの配列をレンダリングする場合、各オブジェクトが持つ一意のプロパティ（例えばidなど）をkeyに使用します。

```jsx
const persons = [
  { id: 1, name: "Tom" },
  { id: 2, name: "Jiro" },
  { id: 3, name: "Taro" },
];

const Example = () => {
  return (
    <ul>
      {persons.map((person) => (
        <li key={person.id}>Hello, {person.name}</li>
      ))}
    </ul>
  );
};
```

## まとめ
- keyプロパティは、Reactにおいてリストの各要素を効率的に追跡するために必要
- keyには配列内の要素が持つ一意の値を使用するのが理想的
- 配列のインデックスをkeyに使用するのは、リストの順序が変わらない場合に限り有効ですが、通常は推奨されない
- keyが正しく設定されていないと、パフォーマンスの低下や意図しない再レンダリングが発生する可能性あり
5分刻みで時間を選択するセレクトボックスの作り方

## はじめに
時間割アプリの開発にあたって、9:00~21:00までを5分刻みで選択できるセレクトボックスを作成しました。
その際に記述したコードとその解説をしていきます。

## 機能の詳細
- 完成時の画面表示
![スクリーンショット 2024-10-07 10.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842446/74c3d03e-85ed-74f5-2abd-a8ad4447f28f.png)

- 実装する機能
セレクトボックスをクリックすると、9:00~21:00までを5分刻みで選択できる
- 最終的なコード
コンポーネント名は`TimeTableForm`、呼び出し関数名は`generateTimeOptions`。
```関数部分.jsx
export const TimeTableForm = ({ day, isInvalid }) => {
  const generateTimeOptions = () => {
    const options = [];
    for (let hour = 9; hour <= 21; hour++) {
      for (let minute = 0; minute < 60; minute += 5) {
        const time = `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
        options.push(<option key={time}>{time}</option>);
      }
    }
    return options;
  };    
```
```呼び出し部分.jsx
              <div>
                <SelectWrapper contains="LargeSelectBox">
                  <LargeSelectBox>{generateTimeOptions()}</LargeSelectBox>
                </SelectWrapper>
                ~
                <SelectWrapper contains="LargeSelectBox">
                  <LargeSelectBox>{generateTimeOptions()}</LargeSelectBox>
                </SelectWrapper>
              </div>
```

## 解説
時間(時と分)を文字列にして`<option>`タグ内に埋め込み選択肢として生成している。
1\.空の配列`option`を作成
```jsx
 const options = [];
```
2\.外側の`for`ループで 9時から21時（9:00～21:00）までの時間を 1 時間刻みで繰り返す
```jsx
for (let hour = 9; hour <= 21; hour++) {}
```
3\.内側の for ループで、各時間に対して、0分、5分、10分...と5分刻みで繰り返す
```jsx
 for (let minute = 0; minute < 60; minute += 5) {}
```
4\.時と分を `padStart(2, "0")` を使って2桁に揃え、例えば 9 時を "09" とし、: で結合した文字列を作成
（例: "09:00", "09:05", "09:10"...）
```jsx
const time = `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
```
5\.生成した時間を`key`として持つ`<option>`タグを配列`options`に追加
```jsx
options.push(<option key={time}>{time}</option>);
```
6\.最終的に`options`配列を返しコンポーネント内で使用できる
```jsx
export const TimeTableForm = ({ day, isInvalid }) => {
  const generateTimeOptions = () => {
    const options = [];
    for (let hour = 9; hour <= 21; hour++) {
      for (let minute = 0; minute < 60; minute += 5) {
        const time = `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
        options.push(<option key={time}>{time}</option>);
      }
    }
    return options;
  };    
```

## さいごに
もし言葉不足や誤解を生む表現、誤った描写があれば教えていただけると助かります。
また、別のもっと適切な方法があればぜひ教えていただきたいです。

>時間割アプリで使用した他の機能はこちら

https://qiita.com/naoki-atjp/items/e890c89452dec8573fbd

https://qiita.com/naoki-atjp/items/43aab60a1ff7e6bc8291

https://qiita.com/naoki-atjp/items/bc8a7028aba7d3725832

https://qiita.com/naoki-atjp/items/d71c2bac6b4edefbddcb
GitHub Copilot 使い方・コツ

# この記事対象
- GitHub Copilot を最近使い始めた方
- GitHub Copilot を導入したけどイマイチ使いこなせていない方
- VScodeを使っている

# この記事に書いていないこと
- GitHub Copilotの導入方法
    - VScodeにてGitHub Copilot拡張機能が導入されていればOK

（Copilot導入までに、弊社のバックオフィスチームやCTO室のメンバーが尽力してくださったため、私はVScodeに拡張機能を入れるだけですみました。ものすごくありがたいです、、、、）

# 日本語設定
VScodeの設定から日本語に設定すると、投げた質問が日本語で返ってきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/e0f17f48-321c-b524-c858-0dfc396c18f9.png)

# よく使う機能
Copilotの基本的な使い方、使えそうな機能を以下に紹介します。

## コード補完
特に何も設定しなくても、補完してくれるので割愛

## チャット機能
![hoge.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/a1c021f1-0092-b7b2-65aa-7c904f39e0bf.gif)

チャットGPTのようにチャット形式で質問に答えてくれます

## 特定の箇所のエラーを探してもらう
間違っていそうな箇所のコードを選択してから質問を投げるとその箇所を修正してくれます

![abc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/b2c371a1-3572-4be8-bbb6-4d8fd8d86fef.gif)
他にもコードを選択した状態で `/explain` `/tests` などをチャットに投げると、選択部分のコードの説明やテストコードを書いてくれたりもします。

**※ 基本的に、チャット機能は右半分でアクティブになっている（タブで開いている）ファイルに対しての質問に答えてくれるみたいです。**

## workspaceを横断してエラーを見つける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/6a6b1652-1c77-24b4-33f8-97ef1443d00b.png)

`@workspace` をつけると、プロジェクト全体を横断してエラーを見つけてくれます

## コミットメッセージを考えてくれる
コミットしたいファイルをステージに上げて、ボタンを押すとコミットメッセージを提示してくれます。

![fefe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/282836c2-6499-5800-3a6a-b5cc4175a19c.gif)


# Copilotを最大限活用するためのコツ

## 解析して欲しい関連ファイルはタブに開いておく
Copilotでは修正や、提案してほしい、回答に関連するファイルを開いておくと、回答の精度が高くなります。
ファイルを閉じている状態だとCopilotはファイルの内容を見ることができないようです。
エラーに関連していそうなファイルは開いておいて、関係なさそうなファイルは閉じておくと良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/04f7bae7-c3cb-a2ad-f7ae-5efa335f0e97.png)

## コメントを上手に利用する
必要に応じてコメントを書くとCopilotのサジェストの精度も高くなります。
数ヶ月後に自分が書いたコードが理解しやすいものであると、それはCopilotにとっても理解しやすいようです。

## 関数、変数名をわかりやすいものにする
`def get_data` などの関数は人間にとっても、何のデータを取ってくるものなのかわかりませんし、Copilotにとっても同様です。
具体的な名前をつけましょう。

## Copilotのチャットを利用するとき関係ない話はリセットする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/a4093a3e-f400-2af7-e995-f7e6c54957ee.png)

Copilotのチャット機能はこれまでの話の流れを汲み取って回答してくれるようです。不要な会話は削除しましょう。

もしくは + ボタンから新しいチャットを始めることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/a3a6609f-7d49-72c7-383a-6f88ae7b2440.png)


# まとめ、感想
Github Copilot、初めて使った時は衝撃的でした。もはやほぼググったりすることなくどんどんコードが書けてしまうのはとても便利です。
そうなってくると、Copilotがどんどん先導してコードを書いてくれる気になってしまいますが、Copilotという名前にもあるとおり「副操縦士」で、あくまでも操縦士は人間にあります。

Copilotが提示してくれたコードのどれを使うか、ちゃんと動くように手を加えるのは最終的には人間で、提案してくれたコードの中にバグがないかなどは人間が注意深く見る必要があります。Copilotが提案してくれたコードをそのまま利用するのではなく、書いてあるコードを十分に理解した上で使用することが大事かなと思いました。

# 参考
https://github.blog/developer-skills/github/how-to-use-github-copilot-in-your-ide-tips-tricks-and-best-practices/
エクセル（XLSX）でシートを動的に増やす場合のメモ

sheet3を追加するパターンです。シート名はSheet4です。

```xml:[Content_Types].xml
<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
<Override PartName="/xl/worksheets/sheet2.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
<Override PartName="/xl/worksheets/sheet3.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
```
```xml:docProps/app.xml
<HeadingPairs>
<vt:vector size="2" baseType="variant"><vt:variant><vt:lpstr>ワークシート</vt:lpstr></vt:variant>
<vt:variant><vt:i4>3</vt:i4></vt:variant></vt:vector>
</HeadingPairs>
<TitlesOfParts>
<vt:vector size="3" baseType="lpstr">
<vt:lpstr>Sheet2</vt:lpstr>
<vt:lpstr>Sheet3</vt:lpstr>
<vt:lpstr>Sheet4</vt:lpstr>
</vt:vector></TitlesOfParts>
```
3の部分をシートの数だけ増やすのがポイントです。
```xml:一部抜粋
[元のxml]
<vt:vector size="2" baseType="lpstr">
<vt:i4>2</vt:i4>
↓
<vt:vector size="3" baseType="lpstr">
<vt:i4>3</vt:i4>
```
```xml:xl/workbook.xml
<sheet name="Sheet2" sheetId="2" r:id="rId1"/>
<sheet name="Sheet3" sheetId="3" r:id="rId2"/>
<sheet name="Sheet4" sheetId="4" r:id="rId7"/>
```
```xml:xl/_rels/workbook.xml.rels
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
<Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet3.xml"/>
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet2.xml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
<Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain" Target="calcChain.xml"/>
<Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>

```
xlsxに圧縮してご確認ください！
【C#】既定のインターフェースメソッドとは？

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods?WT.mc_id=dotnet-00000-cephilli

# 既定のインターフェースメソッドとは？
C#の既定のインターフェースメソッドを使用すると、インターフェースにメソッドを実装することができるようになります。

## 既定のインターフェースメソッドを定義
インターフェースIAで、具象メソッドMを定義しています。
```C#:C#
interface IA
{
    // 既定のインターフェースメソッドを定義
    void M() { WriteLine("IA.M"); }
}
```

## 既定のインターフェースメソッドの利用
このインターフェースIAを実装する具象クラスCで、具象メソッドMを利用できます。
```C#:C#
class C : IA { } // OK

IA i = new C();
i.M(); // prints "IA.M"
```

注意点として、既定のインターフェースメソッドを利用するには、オブジェクトをそのインターフェースの型に型変換してある必要があります。
```C#:C#
new C().M(); // error: class 'C' does not contain a member 'M'
```
ユーザーアクセスポリシー




https://trailhead.salesforce.com/content/learn/modules/user-access-policies

# ユーザーアクセスポリシーの使用を開始する

ユーザー アクセス ポリシーを使用すると、1 回の操作でユーザーの集約されたアクセスを定義できます。セットアップで複数のページをクリックして、ライセンス、権限セット、公開グループを個別にユーザーに割り当てる必要はありません。代わりに、特定のユーザーを対象とするポリシーを設定し、複数の機能へのアクセスを一度に許可 (または取り消し) することで、時間とクリック数を大幅に節約できます。

ユーザー アクセス ポリシーでは、次の機能へのアクセスを許可または取り消すことができます。

+ 権限セット
+ 権限セットグループ
+ 権限セットライセンス
+ パッケージライセンス
+ 公開グループ
+ キュー

# 自分でやってみた

:::note alert
In the policy’s user criteria, we can’t find a filter on the ‘Title’ equalling ‘Lead Sales Rep’.
:::

あああ、pが抜けている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d67a6dc6-df6a-7a66-155a-a61a66335a4d.png)

修正して保存... できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/80874c81-3a7e-ac5e-2922-9678b81d877c.png)


アクティブになっているから？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/110c3e8c-6c19-92b4-292e-10ea9d47eeb1.png)

おおおお、できた


あっれ、またエラー

:::note alert
It looks like the ‘Sales_Team_Leader’ permission set group is not assigned to the ‘edona’ user.
:::

ああ、ユーザが更新されないといけませんね。一度役職を消して保存して、再度設定したらOKみたい


# トレイルヘッド

+ [Missing Permission Group and Group](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erwLg )

:::note
私も同様の問題を抱えていましたが、正しいタイプの組織を作成していなかったことが判明しました。 
:::
文字の上下左右中央揃え、上下中央揃え


### display: grid;を使用


```css
.container {
  display: grid;
  place-items: center; 
  /* 
	  上下のみ中央揃えにしたい場合
	  place-items: center　start; 
  　*/
}
```


### display: flex;を使用


```css
.container {
  display: flex;
  justify-content: center;
  align-items: center;
}
```
[tips][cpp][problemSolver] 無限大INFの定義

# 無限大の定義

## `long long` の場合

`long long`の時は、long long 型は符号付き 64 ビットなので、次の値。

```cpp
const long long INF = 1LL << 60;
```

※LL書き忘れとか型宣言ミスとかでこんな書き方したらエラーです。桁溢れで０になっちゃう。
<details><summary>桁溢れちゃった書き方</summary>

```cpp
const long long INF = 1 << 60;
```

```cpp
const int INF = 1LL << 60;
```
</details>



## `int`の場合

```cpp
const int INF = 1<<30;
```

または、
```cpp
#include <climits>
INT_MAX;
```
企業Techブログ個人まとめ

# はじめに
色々な企業がTechブログを公開しています。
私自身、色々な企業のTechブログも見て、技術トレンドや開発事例など学ばせていただいており、あまり企業のTechブログを見たことがない人に紹介できたらいいなあと思って記事として書きました。


# 国内企業

## 株式会社リクルート
https://www.recruit.co.jp/employment/students/engineers/techblog/

## 株式会社メルカリ
https://engineering.mercari.com/blog/

## 株式会社ディー・エヌ・エー
https://engineering.dena.com/blog/

## 株式会社サイバーエージェント
https://developers.cyberagent.co.jp/blog/

## freee株式会社
https://developers.freee.co.jp/

## LINEヤフー株式会社
https://techblog.lycorp.co.jp/ja

## 株式会社ZOZO
https://techblog.zozo.com/

## 株式会社カカクコム
https://kakaku-techblog.com/

https://tech-blog.tabelog.com/




# 海外企業

## Google
https://developers.googleblog.com/ja/

## Netflix
https://netflixtechblog.com/

## Amazon Web Services
https://aws.amazon.com/jp/blogs/news/

## LinkedIn
https://www.linkedin.com/blog/engineering

## Oracle
https://blogs.oracle.com/developers/



## おわりに
ここに記載した以外にもたくさんの企業がTechブログを公開しています。
気になった企業のTechブログがあれば、日々ウォッチしてみることも大事かなって思います！
私自身もあまり最近はできていませんが、引き続き色々な企業のTechブログを見て学んでいきます！
VSCodeでペットを飼うゾ！！！！！

# VSCodeでvscode-pets拡張機能を使う方法

## 概要
「vscode-pets」は、Visual Studio Codeの拡張機能で、エディタ内にペットを表示することができます。

![スクリーンショット 2024-10-07 100134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807734/30962964-5c29-ad63-dd88-3ee6fa094735.png)

---

## 目次
1. [vscode-petsのインストール](#vscode-petsのインストール)
2. [vscode-petsの使い方](#vscode-petsの使い方)
   - [ペットを表示する](#ペットを表示する)
   - [ペットをカスタマイズする](#ペットをカスタマイズする)
3. [ショートカットキーの設定](#ショートカットキーの設定)

---

## vscode-petsのインストール

1. **VSCodeを開く**  
   まず、Visual Studio Codeを起動します。

2. **拡張機能パネルを開く**  
   左サイドバーにある「拡張機能」アイコン（四角形が並んだもの）をクリックします。

3. **vscode-petsを検索**  
   検索バーに「vscode-pets」と入力し、結果から「vscode-pets」拡張機能を選択します。

4. **インストール**  
   「インストール」ボタンをクリックして、拡張機能をインストールします。

---

## vscode-petsの使い方

### ペットを表示する

1. **コマンドパレットを開く**  
   `Ctrl + Shift + P`（Macの場合は`Cmd + Shift + P`）を押して、コマンドパレットを開きます。

2. **vscode-petsを検索**  
   コマンドパレットに「Pets: Start Pet Panel」と入力し、エンタキーを押します。これでペットがエディタ内に表示されます。

### ペットをカスタマイズする

1. **ペットの種類を選ぶ**  
   コマンドパレットで「Pets: Select Pet」と入力し、利用可能なペットの中からお気に入りのペットを選択します（例: 猫、犬、恐竜など）。
   個人的には鶏がかわいくておすすめです(？)

2. **ペットのサイズを変更する**  
   「Pets: Change Pet Size」と入力し、小さいペットから大きなペットまでサイズを選べます。

3. **ペットの速度を調整する**  
   「Pets: Change Pet Speed」で、ペットの動く速度を設定できます。

---

## ショートカットキーの設定

「vscode-pets」をさらに便利に使うために、ショートカットキーを設定することができます。

1. **キーボードショートカット設定を開く**  
   `Ctrl + K` その後に `Ctrl + S`（またはMacでは `Cmd + K` その後に `Cmd + S`）を押して、キーボードショートカット設定画面を開きます。

2. **コマンドの検索**  
   上部の検索バーに「Pets: Start Pet Panel」や「Pets: Select Pet」などのコマンドを検索します。

3. **ショートカットキーを割り当てる**  
   ショートカットを設定したいコマンドにカーソルを合わせ、「キーを編集」をクリックし、好きなキーを割り当てます。

---

## まとめ

とにかくかわいい。仕事がはかどる、、、気がする。