OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeデフォルトショートカット早見表（Mac版）

## ✨ よく使う操作とショートカット一覧（Mac）

### 📁 ファイル・サイドバー関連

| 操作内容               | ショートカット               |
| ------------------ | --------------------- |
| エクスプローラー（サイドバー）を開く | `⌘ + Shift + E`       |
| サイドバーにフォーカスする      | `⌘ + 0`               |
| サイドバー表示/非表示を切り替える  | `⌘ + B`               |
| エディタに戻る（1カラム目）     | `⌘ + 1`               |
| タブ切り替え（前/次）        | `⌘ + Shift + [` / `]` |
| クイックファイルオープン       | `⌘ + P`               |
| ファイルを保存            | `⌘ + S`               |
| 名前を付けて保存           | `⌘ + Shift + S`       |

---

### 🔍 検索・置換・移動

| 操作内容      | ショートカット              |
| --------- | -------------------- |
| プロジェクト内検索 | `⌘ + Shift + F`      |
| ファイル内検索   | `⌘ + F`              |
| ファイル内置換   | `⌘ + Option + F`     |
| 行へ移動      | `⌘ + G`              |
| シンボルへ移動   | `⌘ + Shift + O`      |
| 定義にジャンプ   | `F12` または `⌘ + クリック` |
| 定義をPeek表示 | `Option + F12`       |

---

### 🛠 エディタ操作

| 操作内容         | ショートカット                  |
| ------------ | ------------------------ |
| 複数カーソルを追加    | `Option + クリック`          |
| カーソルを上下に追加   | `⌥ + Shift + ↑ / ↓`      |
| 行の移動（上下）     | `⌥ + ↑ / ↓`              |
| 行をコピー        | `Shift + Option + ↑ / ↓` |
| コメントアウト（トグル） | `⌘ + /`                  |
| フォーマット（整形）   | `Shift + Option + F`     |

---

### 🧱 ターミナル・UI操作

| 操作内容         | ショートカット                    |
| ------------ | -------------------------- |
| ターミナルを表示/非表示 | `` Ctrl + ` `` (backtick)  |
| 新しいターミナルを開く  | `Ctrl + Shift + ~`         |
| ターミナル間の切り替え  | `Ctrl + PageUp / PageDown` |
| コマンドパレットを開く  | `⌘ + Shift + P`            |
| 設定を開く        | `⌘ + ,`                    |
| 拡張機能を開く      | `⌘ + Shift + X`            |
| ショートカット一覧を開く | `⌘ + K`, `⌘ + S`           |

---

## 💡 補足Tips

* **ターミナルが反応しない場合**：`⌘ + Shift + P` → `> Toggle Integrated Terminal`
* **Neovim系プラグインを入れてる場合**、キーコンフリクトに注意
* **カスタムショートカット**は `keybindings.json` で設定可能！

---

少しでもどなたかのお役に立てば幸いです☺️
【Rails】コントローラ生成時の「名前が既に使われています」エラーの原因と対処法（Zeitwerkと名前空間の罠）

## はじめに

Railsで以下のようにコントローラを生成しようとしたときに…

```bash
rails g controller home index
```

こんなエラーが出たことはありませんか？

```bash
The name 'HomeController' is either already used in your application or reserved by Ruby on Rails.
Please choose an alternative or use --skip-collision-check or --force to skip this check and run this generator again.
```

でも確認してみると…

```bash
ls app/controllers/home_controller.rb
# => No such file or directory
```

「ファイルないじゃん！！！」  
…って思ったあなた、安心してください。これは**Railsの予約語チェックによる“誤爆”**の可能性が高いです。

---

## 🔍 結論：ファイルがなくても Rails は“使われてる”と判断することがある

Railsはコントローラ名やモデル名などが「もう使ってるかどうか」をチェックする際に、  
以下のような理由で“存在しないのにあるように見える”と**勘違い**することがあります。

---

## 🔧 よくある“誤爆”の原因

| 原因 | 説明 |
|------|------|
| ✅ `routes.rb` に `root "home#index"` が書かれている | Railsが自動で `HomeController` を探しに行くため |
| ✅ `app/controllers/home/` ディレクトリがある | 名前空間として `Home` が使われていると誤判定される |
| ✅ 過去に `HomeController` を作って削除した | Zeitwerkのオートロードキャッシュに残っている可能性 |
| ✅ `Home` という名前のモジュールやクラスがどこかにある | 名前空間が衝突している可能性 |

---

## 💥 実際のエラーメッセージとその意図

```bash
The name 'HomeController' is either already used in your application or reserved by Ruby on Rails.
```

このメッセージは「**重複の可能性があるから念のため止めるね**」という**Railsの優しすぎる警告**です。  
つまり、「**ファイルがある」とは限らない**ということに注意しましょう。

---

## ✅ 対処法：3つの選択肢

### ✔ ① 実際に存在するか確認して、**あれば編集して使う**

```bash
ls app/controllers/home_controller.rb
```

存在するなら編集して使うのがベストです。

---

### ✔ ② 存在していないとわかったら、**強制生成してOK！**

```bash
rails g controller home index --force
```

上書き確認メッセージが出ても安心してOK。

---

### ✔ ③ 衝突チェックだけスキップ（安全に生成）

```bash
rails g controller home index --skip-collision-check
```

ファイルがなければ、これでも問題ありません。

---

## 🧠 そもそも「予約語」って何？

Railsが内部で使っているクラス名（例：`Application`, `Session`, `Mail`, `Test`など）や、  
MVC構造でよく使われる共通名（`Home`, `User`, `Admin`）などが該当します。

ただし「予約語」と言っても**絶対に使えないわけではありません**。  
問題がなければ `--force` で使ってもOKです。

---

## ✅ 最後に：気をつけること

| 注意点 | 解説 |
|--------|------|
| 再生成は必ず中身確認 | `--force` は上書きするので、ファイルの内容に注意 |
| 複数人開発では事前に確認 | 他の人が定義してないか、Git状況をチェック |
| Slim形式 or ERB形式に注意 | ファイル拡張子とテンプレート構文は必ず一致させましょう（`.html.slim`ならSlim構文） |

---

## おまけ：Docker環境での正しいコマンド

```bash
docker compose exec web bundle exec rails g controller home index --force
```

Docker環境では `bundle exec` をつけるのを忘れずに！

---

##  まとめ

- `rails g controller` で「名前が使われてる」と言われても、**実際には使われてないことがある**
- それは Rails の**親切な警告（だけど誤爆）**
- 安全を確認したら `--force` や `--skip-collision-check` で生成OK！

---

少しでもどなたかのお役に立てば幸いです☺️
【Python】parseモジュール

parseモジュールの関数は名前がまぎらわしいですが、まとめると以下になります。

【urlparse()】
URLをパース（解析）して結果を返します。schemeなどの属性名や、インデックスで値を取得します。


【parse_ps()】
クエリ文字をパースして辞書で返します。urlparse()で取得した属性「query」を引数にすることができます。


【urlencode()】
辞書からクエリ文字を組み立てます。


【quote()、quote_plus()】
文字列をパーセントエンコードしてURLとして使えるようにします。

quote()は空白を「%20」に変換し、quote_plus()は空白を「+」に変換します。

quote()とquote_plus()は、parseモジュールのメソッドで使用してURL全体を変換することもできますが、問題文のようにurlencode()の引数「quote_via」に指定してクエリ文字の変換でも使用できます。

urlencode()はデフォルトでquote_plusが適用され、空白が「+」に変換されます。
RuboCop警告対応：Style/EmptyMethod をやさしく解説

## 🧠 警告内容：Style/EmptyMethod

RuboCopでは、**中身が空っぽのメソッド**に対して「一行で書いてね💡」というスタイルガイドがあります。

```ruby
# 🚫 NG例（複数行）
class HomeController < ApplicationController
  def index
  end
end

# ✅ OK例（一行で定義）
class HomeController < ApplicationController
  def index; end
end
```

このスタイルは RuboCop の `Style/EmptyMethod` によって検出され、
**「空のメソッドは `{}` や `;` を使って1行でまとめるべき」**というルールに従います。

---

## 💡 なぜこのルールがあるの？

| 理由 | 内容 |
|------|------|
| ✅ 可読性 | 無駄な改行を省いて、クラス構造が見やすくなる |
| ✅ メンテ性 | 実装がないメソッドを一目で識別できる |
| ✅ スタイル統一 | チームやCIで一貫したコード品質を保てる |

---

## 🛠 対応方法

以下のいずれかで対応できます。

### 方法①：手動で一行にまとめる

```ruby
def index; end
```

### 方法②：自動修正

```bash
docker compose exec web bundle exec rubocop -A
```

`-A`（または `--auto-correct-all`）を使うと、自動で一行化されます。

---

## ✨ 補足ポイント

- 複数のアクションがまだ空実装のときにも便利
- 処理を追加する予定なら、あとで普通の複数行定義に戻してOK！

```ruby
# 後で実装するならこうしてもOK
# def index
#   # TODO: 実装予定
# end
```

---

## まとめ

- `Style/EmptyMethod` 警告は "空のメソッドは1行に" というお作法
- 1行にすれば RuboCop も CI もにっこり😊
- 実装予定がない時点では、潔く `def xxx; end` でまとめるのが美学✨

---

少しでもどなたかのお役に立てば幸いです☺️
[Linux] システムログ設定_/etc/logrotate.conf

# /etc/logrotate.conf
[解説](https://qiita.com/Jochun/items/6ac664fe2f41ef79e9c2#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%AD%E3%82%B0%E8%A8%AD%E5%AE%9A)

# 参考リンク
- [[Linux][directory] ディレクトリ一覧_LPIC-1 102](https://qiita.com/Jochun/items/6ac664fe2f41ef79e9c2#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%AD%E3%82%B0%E8%A8%AD%E5%AE%9A)

# Ping-t
- [4615_/etc/logrotate.conf](https://mondai.ping-t.com/question_subjects/32/question_sessions/33867186/progressing_questions/518471891)
【AWS】無料枠、終わるってさ。。。急がば「問い合わせ」

# はじめに
AWSから**無料枠が間もなく有効期限になります**という件名でメールが先日届きました。
詐欺かなにかか？と思いましたが、、本物でしたｗ
本記事ではこのようなメールが届いたときにどんな対応を行えばいいのかを簡単に紹介したいと思います

# 筆者のAWS使用経緯
- 学習の為にAWSを記事に沿って利用開始した
- 学習時にアカウント等を作成しただけで、それ以降はずっと放置していた（約11か月間）
- 学習段階で「停止」の措置はおそらくしていた

# AWSのサイトを見てみる
⚠️AWSアカウントを単純に削除するだけではどうやらダメなようです。
解約（終了）後に料金が発生しないように、使用しているリソースを終了、削除する必要があります！
正直サイトの見方が全く分からなかったことに加え、私は一体何を利用していたのかも把握していなかった為、いろいろ類似の記事を検索。
終了するリソースを含むサービスのコンソールを開いて、ぽちぽち削除していく必要があるようです💦（めんどう）

https://qiita.com/cane/items/517921a78113d7e261ff

👆上記記事でまず行ったこと
- ルートユーザでログイン
- Billingで使用しているサービスを確認（正直よくわからん）
- リージョンを東京にする

## 1：EC2関連を削除

https://dev.classmethod.jp/articles/ec2terminate-instances-delete-key-pairs-and-delete-security-groups-in-ec2-jp/

- インスタンスの終了
- キーペアの削除
- セキュリティグループの削除
の順番で削除しました

⚠️順番が違うとどうやらうまく削除できないようです


## 2：S3関連の削除

https://business.ntt-east.co.jp/content/cloudsolution/column-try-43.html

![bd6841a7011133e42844900a39d17ca9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/3be68a7c-12d6-4aa0-9387-2ef8c68f8d6c.png)

- 記事を参考に「ファイルの削除」と「バケットの削除」を行いました


## VPC関連削除

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/delete-vpc.html

https://docs.oracle.com/ja-jp/iaas/compute-cloud-at-customer/topics/network/deleting-a-set-of-dhcp-options.htm

- ルートテーブルの削除
- サブネットの削除
- DHCPオプション削除



## ひとまずここまで
おそらくこれで私が学習時に使用したものは削除できたと思うのですが、それでも不安
なので、最終手段「お問い合わせ」





# アカウントの削除方法

https://www.openupitengineer.co.jp/column/it-technology/8329


# お問い合わせしてみた（公式にきくのがはやい）
### 1：問い合わせした内容
```
「お客様の Amazon Web Services の無料利用枠が間もなく有効期限切れになります」
このような件名のメールが先日届きました。

勉強の為、AWSアカウントを作成しましたが、ずっと利用する事無かったので一度削除したいと思いました。
EC2、VPC、S3バケットは削除出来たかと思われます。
ですが、「アクティブなリソースがあるか」確認しましたが、本当に削除できているのか、
まだほかに削除しなければいけないものがあるのではないかと、不安です。

IAMのユーザーグループ、ユーザー、ロールというものについても、覚えていないのですが、
利用している痕跡があります。こちらも削除しないといけないのでしょうか。

具体的にどうすればいいのかご教示のほど、よろしくおねがいいたします。
あわせて、AWSアカウントの削除手順についてもご回答よろしくお願いします。
```

### 2：返信
```
お客様のアカウントは2025年6月末に無料利用枠が終了いたしますことを確認いたしました。
また、現時点の6月ご利用分にて課金は発生しておりませんでした。ご安心くださいませ。

今後AWSをご利用される機会がない旨について承知いたしました。
この場合、AWSサービス/リソースの削除処理を実施いただかなくとも、AWSアカウントをご解約いただくことで、
解約処理時点から課金はすべて停止かつ各種サービス/リソースは自動的に削除されていきます。
このことより、IAMユーザーやユーザーグループ、ロール等も事前に削除いただく必要はございません。
ご安心ください。

AWSアカウントの解約方法や注意点については以下ドキュメントをご参照ください。

▼AWSアカウントを閉じる
https://docs.aws.amazon.com/ja_jp/accounts/latest/reference/manage-acct-closing.html 
```


# つまり、削除すれば解決！！
メール内容に記載のURLを参考に削除します
1：右上の「アカウント」ボタンを押すとページに遷移。「アカウントを削除」を押下。
[![Image from Gyazo](https://i.gyazo.com/2663f9e178ff0888a9865d0e7bd48b31.png)](https://gyazo.com/2663f9e178ff0888a9865d0e7bd48b31)

2：「アカウントID」を入力して「削除」ボタン押下。フィードバックを入力し「送信」すれば完了
[![Image from Gyazo](https://i.gyazo.com/33f9e027d228098b01ee53f5797a85eb.png)](https://gyazo.com/33f9e027d228098b01ee53f5797a85eb)

3：AWSアカウント作成した際に登録したメールアドレス宛てに「AWS アカウント閉鎖の確認」というようなタイトルのメールが届きます。これが確認出来たら、ひとまずOK😊


## 結論
今回私はこのような結果になりましたが、同じ無料枠を利用している方でも、解約後に請求書が届いた！みたいな記事も見かけたので、、不安な方 
### <font color="#FF0000">問い合わせの利用を強くお勧めします！！</font>
Java Gold 合格体験記

## はじめに

先日、Java Gold（Oracle Certified Java Programmer, Gold SE 11）に合格しました。

私が実際に行った学習方法や試験当日の所感、使った教材などをまとめます。
これから受験される方の参考になれば幸いです。

## 受験の目的

* 資格手当がもらえるため
* SESで働いているため、面談時に少しでもアピールになると思った
* Javaの理解をより深めたいと思ったため

## 使用した教材・ツール

* 黒本（徹底攻略 Java SE 11 Gold 認定資格試験 対応問題集）
* ChatGPT（不明点の解消、理解の補助）


## 学習内容

### 勉強期間と時間

2月後半から勉強を始め、**約4か月間**かけて準備しました。
他の方の体験記を見ると、1〜2か月で合格する人も多いので、ややゆっくり目のペースだったと思います。

* 平日：15～30分程度
* 休日：30～60分程度
* 直前1か月：平日30～60分、休日は60～90分ほど

無理のないペースで、ちまちまと進めていました。

### 学習内容の詳細

* 黒本を**5〜6周**解く
* わからない部分はChatGPTで質問し、その回答を自分で記事化・まとめることで、理解を深める
* 基本的にコードはあまり書かずに進めましたが、理解が浅いと感じた部分は実際に書いてみる


## 試験結果と問題傾向

### 試験結果

* 正答率：88%
* 所要時間：約60分で解答完了＋15分見直し（計75分）
* 結果：無事合格

### 問題の印象

* 黒本と非常に似た問題が大半
* 黒本にはないタイプの問題は6問程度といった印象
* ただし、まったく同じ問題ではないため、解説の理解までしっかりやることが重要


## 合格のためのポイント

* 黒本を“理由込みで正答できる”レベルまでやり込む
* わからない点はChatGPTなどで補完し、納得感をもって覚える
* 本番では、最初は難しい問題が多いため、わからない問題にチェックをつけて後回しにするのも効率的


## おわりに

Silverよりも難しいのでは？と緊張していましたが、黒本をしっかりやり込めば十分対応できるレベルだったと思います。

ただし、資格を取ったからといって「Javaができるようになった」わけではないとも感じています。
これからは実際に手を動かし、知識を使える形にすることが目標です。

それでも、体系的な知識が得られたことや資格手当がつくことを考えると、受けて損はなかったと思います。

## 今後の目標

* Oracle DBA Gold 資格の取得
* AWS認定やIPA高度試験（ネットワークスペシャリストや情報処理安全確保支援士など）にも挑戦
AWS学習記録(2025年6月21日)

# 使用教材
https://www.udemy.com/course/webapplication-on-aws/?kw=AWS%E3%81%A7%E4%BD%9C%E3%82%8BWEB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3+%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7&src=sac&couponCode=LOCLZDOFFPJPCTRL

## やったこと
* VPC作成
* サブネット作成
* ルートテーブル作成
* セキュリティグループ作成
* インターネットGW作成
* EC2概要

### VPC作成
* クラウド上に構築された仮想ネットワーク
* EC2やLambdaなどのAWSサービスをVPC上に作成して構築していく
* AWSアカウント作成時に各リージョンにデフォルトでVPCが作成されている
* ネットワークACLやセキュリティグループにてセキュリティを強化することも可能

### サブネット作成
* パブリックサブネットとプライベートサブネットを2つづつ作成
* マルチAZ構成で作成

## ルートテーブル
* 異なるネットワークをつなぐためのもの。ルータの役割をしている。
* ルートテーブルを作成した後、関連付けしたいサブネットを選択する。

### セキュリティグループ
* Webサーバ用、APサーバ用、データベース用、運用監視用に作成
* 各リソースに対してどういったプロトコル/ポートで通信するのかをインバウンド、アウトバンドで指定する
* 通信元や通信先には同一VPCに作成したセキュリティグループS3などのAWSリソース、CIDRなどが指定できる
* 0.0.0.0/0はどのIPアドレスからでも通信できることを示している

### インターネットゲートウェイ
* VPCはデフォルトは閉域網のためインターネットと通信するためのGWが必要になる
* IGWを作成後にVPCにアタッチ→ルートテーブルに設定する(送信先は0.0.0.0/0)

### EC2
* インスタンスタイプ
***
T系：開発環境向け。負荷が少ないときにクレジットをためておき負荷が上がった際にクレジットを利用してバーストする。
M系：本番環境向け
C系：COU最適化。CPU利用単価が安い
R系：メモリ最適化。メモリ利用単価が安い
G系、P系：GPUを使った高速演算処理が可能
I系、D系：高I/Oスループット
***
【図解・初心者向け】PandasのDataFrameとSeriesの違いをやさしく解説

<h2>初心者向けに「DataFrameとSeriesの違い」を図解で解説！</h2>

<p>
Pythonのデータ分析ライブラリ「Pandas」を使い始めると最初に出会うのが「Series」と「DataFrame」ですが、<strong>この違いが直感的に理解しづらい</strong>という声をよく聞きます。
</p>

<p>
本記事では、<strong>図解・構造比較・コード実行結果</strong>を通じて、初心者でも理解しやすいようにまとめました。
</p>

<h3>DataFrameとSeriesの違い</h3>

<p>以下は構造の違いを示した図です。</p>

<p>
<img src="https://pythondatalab.com/wp-content/uploads/2025/05/pandas_difference_series_dataframe.png" alt="SeriesとDataFrameの構造の違い" width="600" />
</p>

<table>
  <thead>
    <tr><th>構造</th><th>説明</th><th>次元</th></tr>
  </thead>
  <tbody>
    <tr><td>Series</td><td>ラベル付きの1次元データ構造</td><td>1次元</td></tr>
    <tr><td>DataFrame</td><td>行・列からなる2次元の表形式</td><td>2次元</td></tr>
  </tbody>
</table>

<h3>コードで理解する違い</h3>

<p>以下のコードは、SeriesとDataFrameの基本的な作成例です。</p>

<pre><code class="language-python">import pandas as pd

# Seriesの作成
s = pd.Series([10, 20, 30], name="A")

# DataFrameの作成
df = pd.DataFrame({"A": [10, 20, 30], "B": [40, 50, 60]})
</code></pre>

<p>出力結果：</p>

<pre><code class="language-text">Series（1次元）:
0    10
1    20
2    30
Name: A, dtype: int64

DataFrame（2次元）:
    A   B
0  10  40
1  20  50
2  30  60
</code></pre>

<h3>よくある疑問：df["A"]とdf[["A"]]の違い</h3>

<p>
同じように見えるこの2つですが、<strong>結果の型と次元が異なります</strong>。
</p>

<table>
  <thead>
    <tr><th>記述</th><th>返り値の型</th><th>次元</th><th>特徴</th></tr>
  </thead>
  <tbody>
    <tr>
      <td><code>df["A"]</code></td>
      <td>Series</td>
      <td>1次元</td>
      <td>1つの列をSeriesとして取得。構造が簡潔。</td>
    </tr>
    <tr>
      <td><code>df[["A"]]</code></td>
      <td>DataFrame</td>
      <td>2次元</td>
      <td>1列でも表（DataFrame）として保持。後処理に便利。</td>
    </tr>
  </tbody>
</table>

<p>出力の違いも確認してみましょう。</p>

<pre><code class="language-python"># Series（1次元）
print(df["A"])
</code></pre>

<pre><code class="language-text">0    10
1    20
2    30
Name: A, dtype: int64
</code></pre>

<pre><code class="language-python"># DataFrame（2次元）
print(df[["A"]])
</code></pre>

<pre><code class="language-text">    A
0  10
1  20
2  30
</code></pre>

<p>
このように、見た目は似ていますが、<strong>データ構造・扱い方・後続処理への影響</strong>が異なります。初心者の方は特に混乱しやすいポイントです。
</p>

<h3>もっと詳しく学ぶには？</h3>

<p>この記事の元記事では、さらに詳しく構造・使い方・操作例を解説しています。</p>

<p>
✅ 図解・コード・出力結果付きで学べる元記事はこちら：<br />
<a href="https://pythondatalab.com/pandas-dataframe-series/" target="_blank" rel="noopener">https://pythondatalab.com/pandas-dataframe-series/</a>
</p>

<h3>関連ハッシュタグ</h3>

<p>
#Python #Pandas #データ分析 #初心者向け #DataFrame #Series
</p>
Amazon Q CLI でゲームを作ってみた

現場の作業待機中にネットサーフィンしていたら、「Amazon Q CLI でゲームを作ろう Tシャツキャンペーン」なるものを見つけたので、挑戦してみることにしました

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

## 実行環境準備
まずは、実行環境を準備する必要があるとのこと
手順に従ってインストールを進めます
私のパソコンはWindowsなので、Windows用の手順を参考にインストールしました

## いざゲーム作成
準備が整ったので、まずは何をすればよいか質問してみます
```
> 「Amazon Q CLI でゲームを作ろう」キャンペーンに応募する為にゲームを作成したいのですが、まずは何からはじめればよい？
「Amazon Q CLI でゲームを作ろう」キャンペーンでのゲーム作成、素晴らしいですね！まずは以下の手順で始めることをお勧めします：

## 1. 開発環境の確認
現在のディレクトリやシステム環境を確認しましょう：


🛠️  Using tool: fs_read (trusted)
 ⋮
 ● Reading directory: . with maximum depth of 0
 ⋮
 ● Completed in 0.33s

## 2. ゲーム開発用のディレクトリを作成
まずはプロジェクト用のフォルダを作成しましょう：


🛠️  Using tool: execute_bash
 ⋮
 ● I will run the following shell command:
mkdir -p ~/Desktop/amazon-q-game && cd ~/Desktop/amazon-q-game
 ⋮
 ↳ Purpose: ゲーム開発用のディレクトリを作成
```

このアクションを許可しますか?のメッセージが返ってきたので、tを入力すると、
デスクトップにフォルダが作成されたようです
```
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

> t

 ⋮
 ● Completed in 0.9s
 
```

どんなゲームを作りたいか質問されたので、初心者向けのブラウザゲーム
で子供が好きな間違い探しを作成してもらうことにします
```
## 3. 開発言語・技術の選択
どのような技術でゲームを作りたいですか？以下のような選択肢があります：

簡単に始められる選択肢：
• **HTML/CSS/JavaScript** - ブラウザゲーム（推奨初心者向け）
• **Python** - Pygameライブラリを使用
• **Node.js** - コンソールゲームやWebゲーム

より本格的な選択肢：
• **Unity (C#)** - 2D/3Dゲーム
• **Godot** - オープンソースゲームエンジン

## 4. ゲームのアイデア
どのようなゲームを作りたいですか？例えば：
• パズルゲーム（テトリス風、マッチ3など）
• アクションゲーム（シューティング、プラットフォーマーなど）
• RPG要素のあるゲーム
• クイズゲーム
• カードゲーム

どの技術とゲームジャンルに興味がありますか？それに応じて具体的な開発手順をご案内します！

> ブラウザゲームで間違い探しのゲームが作りたいな

素晴らしい選択ですね！ブラウザで動く間違い探しゲームを作りましょう。HTML/CSS/JavaScriptで作成します。
```
作成したいゲームを入力すると、
プロジェクトの基本構造のコードが表示されて、アクション許可確認が返ってきたので、tを入力後、しばらく待機していると・・・
```
素晴らしい！間違い探しゲームが完成しました！🎉

## 作成したファイル
• index.html - ゲームのメイン画面
• style.css - スタイリング（美しいデザイン）
• script.js - ゲームロジック

## ゲームの特徴
✅ 5つの間違いが隠されています：
1. 太陽の色（黄色→赤）
2. 木が1本消失
3. 家の屋根の形（三角→平ら）
4. 花が1つ消失
5. 鳥の向き（上向き→下向き）

✅ ゲーム機能：
• 60秒のタイマー
• スコアシステム（正解+100点、不正解-10点、ヒント-20点）
• ヒント機能
• レスポンシブデザイン

## ゲームを起動してみましょう！
```

ゲームが完成しました！とのこと
え、これだけでできちゃうの・・・？

## やってみた
プレイ方法を確認して、ゲームを実際にやってみました。
多少改善点はあったものの、問題なくプレイすることができました！
![スクリーンショット 2025-06-21 154708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119265/a43e8c2b-64db-4993-9a95-018be06f0558.png)


## さいごに
・２、３回のやり取りで、かつノーコードでここまでの精度のゲームが作成できることにひたすら感動しました
・さらに具体的な指摘をすれば色々修正してくれるので、ゲームの完成度もどんどん高くなるようです
Perl の pos はどういう場合に初期化される？実験。

Perl の ``pos`` はどういう時に初期化されるのかを実験してみた。

Perl の ``pos $var`` は変数 ``$var`` に対してする次回の正規表現マッチングの開始位置を示すプロパティを取り出したり、設定したりするのに使うための仕組み。このプロパティは ``$var`` に対して ``m/正規表現/g`` のマッチングをすると更新される。そして ``$var`` に代入操作がある場合には初期化されて ``undef`` になる。だけど、``$var`` に対してまったく同じ値を入れたらどうなる？今回はそれを調べてみた。

## テストコード

```Perl:
$ABC = 'A B C' ;

  {
  my $var = $ABC ;
  $var =~ m/\s/g ; # 👈マッチングで pos を更新する。この場合は「2」になる。
  $p = pos $var ;
  $var = $ABC ; # 👈👈 pos は代入で更新される。ここをいろいろ替えてるのが今回の実験！
  $q = pos $var ;
  say '[$var = $ABC] => ', ($p eq $q ? 'Not Initialized' : 'Initialized') ;
  }
```

## 結果

マッチング ``m/\s/g`` の後に ``$var`` に、色々なやりかたで同じ値を代入してみて（「👈👈」の箇所を振って）、``pos $var`` が初期化されるかどうかを確かめてみた。

<table>
<tr>
<th>初期化されなかったもの
<th>初期化されたもの
<tr>
<td>
<ul>
<li><code>$var = $var ;</code>
<li><code>$var = $var = $var ;</code>
<li><code>$var = ($var = $var) ;</code>
<li><code>$var = scalar $var ;</code>
<li><code>$var = 0 ? $var : $var ;</code>
<li><code>$var = 1 ? $var : $var ;</code>
<li><code>$var = $c ? $var : $var ;</code>（<code>$c==0</code>）
<li><code>$var = $c ? $var : $var ;</code>（<code>$c==1</code>）
<li><code>$var = 1 && $var ;</code>
<li><code>$var = $c && $var ;</code>（<code>$c==1</code>)

</ul>
<td>
<ul>
<li><code>$var = $ABC ;</code>
<li><code>$var = "$var" ;</code>
<li><code>$var = eval {$var} ;</code>
<li><code>$var = sub {$var}->() ;</code>
<li><code>$var = $xyz = $var ;</code>
<li><code>($var) = ($var) ;</code>
<li><code>$var = substr $var, 0 ;</code>
</ul>
</table>

### 規則性？

よく分からないけども、``$var`` そのものの評価が必要となった場合に、``$var`` の値が元のものとは違うという扱いをされているようだということ。

面白いというのか、よくわからないのは&hellip;

* ``$var = $var = $var ;`` は値に変化がないという扱いを受けている一方で、<br>``$var = $xyz = $var ;`` は値が変化しているという扱いを受けたているという点。
* ``($var) = ($var) ;`` は値が変化しているという扱いを受けている一方で、<br>``$var = scalar $var ;`` とか <code>&hellip; ? $var : $var</code> とか <code>&hellip; && $var</code> は値に変化がないという扱いを受けている点。

最適化とも関係がありそうな気がする。となると Perl の処理系のバージョン次第では異なる可能性もありそうだ。``$var = "$var" ;`` でさえ今後のバージョンの最適化次第では ``$var = $var ;`` と同じ扱いを受けるようになる可能性もあるかもしれない。これはちょっと厄介だ…。

## 補遺 -- Perl バージョン

```
% perl -v

This is perl 5, version 40, subversion 2 (v5.40.2) built for x86_64-cygwin-threads-multi
(with 3 registered patches, see perl -V for more detail)

Copyright 1987-2025, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at https://www.perl.org/, the Perl Home Page.

% 
```
IT系独り言（日々更新中）

自分用のメモ

6/21
語学アプリ　→　復刻版　→　リリース　　https://github.com/chnmotoTmz/multi-language-dict
語学教材アプリ　→　リリース　https://github.com/chnmotoTmz/youtube_downloader

6/21
・ＬＩＮＥつぶやきブログシステム　→　稼働中　https://lifehacking1919.hatenablog.jp/

＜問題点＞
ＵＲＬリンク先　→　適当
アフェリエイト　→　未対応
自己記事（ＲＡＧ関連性）　→　未対応
→　記事校正のエージェント準備中
Cloud GPU Vast.aiとPaperspaceの使い分けについて

(2025年6月時点。実際に利用した体験に基づく記載です。利用には費用がかかるCloud GPUの比較や使い分けをしたい方に向けた内容を記載しました。)

# どんな人向け？何についての話？
NVIDIAのGPUをCloudで利用しようという話です。
良い点は、自宅に限らず、出先やMacからでも操作できます。他にも多数利用した筆者が個人的におすすめの２つについて記載。いずれも電気代や騒音と発熱を考えるとCloud利用がおすすめ

## ２つについて：GPU時間貸し (Cloud GPU) サービス
- Vast.ai：Vast.ai社提供のGPUレンタルインフラ。世界中のGPU提供者（一般からデータセンター（以下DC）まで）と利用時間単位による精算でGPUを利用できるサービス。 (以下V)
- Paperspace : Digital Ocean社による契約日から月末までの契約でGPUを利用できるサービス。制限あり定額時間割に加えて、制限緩和有料機器のレンタルが可能 (以下P)

ある方が良いスキル：ssh による遠隔操作 および Linux のコマンドラインの知識(CLI)
もし無くても、Jupyter Notebookを介した操作が可能。 ＊Google Colaboratoryと同等

# Vast.ai
良い点：
- 利用時間単位で世界最安が見つかる：利用時間帯の精算で全世界の業者を一つのインフラで利用できること。世界最安の機器が見つかる。使い終わったら即利用解除可能。料金は利用時間で精算
- 環境が汚れない：コンテナ環境で毎回新規構築。(メリットでもありデメリットでもある）

注意点：
- セキュリティ：V社のサービス説明にも記載がある通り、DC業者以外の場合、情報漏洩を完全に排除できない。
- 品質：ハズレがある。　＊最悪は利用開始してもコンテナが立ち上がらない。途中で止まる。返金もない。＊価格重視で選ぶと、ある程度の頻度で発生する。自分なりのホワイトリスト（お気に入りの提供者）の管理が重要
＊セキュリティと品質の回避策：Certified業者の場合は、ハズレなし。品質も問題なし。（価格は上がる）
- 毎回セットアップが必要：必要なデータは都度準備する(SSHで転送や都度ダウンロード)

# Paperspace
良い点：
- 定額：定額料金で利用できるGPUがある。（Pro PlanはA4000, Growth PlanはA6000 [売りとしてA100もあるが少数。空きはまず無い])
- セキュリティ：データセンター業者の提供するサービス。情報流出は限りなく低い
- 永続Storage：＊無償Planに下げても、一定容量は保存され続けるストレージがある

注意点：
- 時間制限：定額で利用する場合は、最大6時間ごとにセッションが切断される。　追加料金を払う機器は制限なし
- 同時動作制限：定額マシンは１契約１台。　追加料金を払う機器は緩和
- 定額料金の機器に空きがない時がある。日本時間18時以降など

## 他のCloud同様、使い分けが有効
向いている内容：
V：
時間で区切る内容：
・新規モデルやアプリケーションの動作テストおよび環境構築のテスト。
・1契約で複数機器を同時にレンタルできる。＊秒単位で業界最低価格　＊同時に世界中から 4090*1 の機器を5台分契約。などが可能。

P：
プロセス構築後の連続稼働（6時間制限で良い場合）
　ー定額プラン範囲内は無敵と思います
　　Free Plan 0USD 都度払いのみ。 Pro Plan 8USD A4000(16GB)。 Growth Plan 39USD A6000(48GB)
Chromeで素早くプロフィール切り替え！（ショートカット）（Mac）

Chromeで素早くプロフィールを切り替えたい
`ctrl + F3`(Dockにフォーカス)、 `→`、 `↑↓でプロフィール選択` 

![Screenshot 2025-06-21 at 15.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237839/bde566bf-4448-44df-88d1-c210bdddf9d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237839/97cd09a6-58ef-4f39-8cfa-168294dc7a51.png)
Kaggleコンペ「カロリー消費量予測」参加の振り返り

Kaggleコンペ「カロリー消費量予測」参加の振り返りをしていきます。


# 1.最終的に提出したもの
CatBoostとXGBoostの予測を加重平均
final_preds = (catboost_preds * 0.4) + (xgboost_preds * 0.6)

# 2. 結果

Public Score：0.05664（202位 / 4318人中）→ トップ5%以内
Private Score：0.05899（1008位 / 4318人中）

→ Public LBでは精度が高く見えましたが、Private LBでは大きく順位が下がりました。
これは、特定のデータに過剰適合していた（Publicに過学習していた）可能性が高いと考えられます。


Public Scoreと Private Score の違い
Kaggleでは評価をPublicとPrivateに分けて行います：
Public Score：テストデータの一部（例えば30%）のみで評価され、コンペ期間中に見えるスコア。
Private Score：残りのデータ（例えば70%）で評価され、コンペ終了後に最終順位が決定される。


# 3.学んだこと
・XGBoost・CatBoost・LightGBMのOptunaによるチューニング
・SHAPによる特徴量の可視化と重要性分析
・評価指標（MAE）をもとにした、パラメータの取捨選択の考え方
・スコア向上のための思考法
・どの特徴量・モデル・前処理が最も効果的かを常に検証する習慣がついた。


# 4.悪かったこと・今後の改善点
O・ptunaでn_trialsを上げすぎると逆効果になる場合がある
→ 過剰にチューニングを行ったことで、Publicデータに過学習し、Privateでスコア悪化。
→ n_trials=10 程度がベストだった（検証結果より）
・過学習に対する意識が足りなかった
→ クロスバリデーションのfold数等の見直しが必要
・新しい特徴量を多く作りすぎて、精査が不十分だった
→ 今後はSHAPや特徴量重要度を用いて、効果の高い特徴量のみを採用していきたい。
・XGBoostあるいはcatboost単体ではスコアが思うように上がらなかったため、CatBoostとXGBoostの予測を加重平均をした
→Publicスコアが上げる為にやっており、加重平均でたまたまスコアが上がっただけでした。
→次回以降はスタッキングなどの本格的なアンサンブルを取り入れ、各モデルの強みを活かせる構成を意識したいと思います


# 5.今後に活かしたいこと
・特徴量設計の工夫が大事
・SHAPなどを使いこなし、モデルの解釈性を持たせた予測ができるようにする
・コンペ中盤以降は、Publicスコアばかりを見るのではなく、安定性・再現性を意識して全体の汎化性能を重視する
【Discord Bot】メモ帳アプリを作った話

# 📒 はじめに

Discord Botの開発の練習と勉強のため、簡単なメモ帳アプリを作ってみました。また、ディレクトリ構造を模した機能も実装しました。

# 📒 自己紹介
初めまして！趣味でweb開発を勉強している273*(ﾂﾅｻﾝﾄﾞ) と申します。フルスタック開発やツール制作を楽しんでいる人です。

# 📒 完成品

`Myeo`というメモ帳botを作成しました。
名前の由来は`My Memo`から共通因数で括ったものになります。

https://github.com/273Do/Myeo

# 📒 セットアップ

1. 上のリンクからリポジトリをクローンして、Dockerコンテナを起動します。
2. [Discord Developer Portal](https://discord.com/developers/applications)からアプリを登録し、トークンをenvファイルに登録します。
3. 任意のサーバーにボットを追加します。 
4. コンテナに入り、`python3 main.py`を実行します。

# 📒 使い方

- 起動に成功したら以下のログが出力されます。

![スクリーンショット 2025-06-21 0.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530539/7a4c103e-fcba-4575-9a58-c258336547c5.png)

- 使い方は`/help`で確認しましょう。

![スクリーンショット 2025-06-21 0.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530539/634678eb-1f69-4b25-8a05-60f4391e085d.png)
![スクリーンショット 2025-06-21 0.49.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530539/890ec887-6f1d-4898-94e0-ead72c390580.png)

- メモはタイトルと内容をセットで作成します。
![スクリーンショット 2025-06-21 0.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530539/7a552db2-029c-4e78-abaf-9b406edcef6c.png)
![スクリーンショット 2025-06-21 1.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530539/c5b06892-e811-4ce3-ab08-29a090a572d7.png)

- 他にもメモを編集したり、フォルダ構成を確認したりできる機能があるのでお試しあれ！オートコンプリート機能も実装しています。
![スクリーンショット 2025-06-21 0.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530539/5663a91d-4214-430b-a7dd-38d5c573dbe3.png)

# 📒 最後に
今回は初めてDiscord Botを作成してみました！
基本的な機能は実装できたので、今後はGUI対応やAWS RDSとの接続、EC2へのアップロードにも挑戦してみようかと思います。
最後まで読んでいただきありがとうございました！
それではまた！
GitHubへの接続はSSHではなく、HTTPSが推奨されている



- [Git からの GitHub による認証](https://docs.github.com/ja/get-started/git-basics/set-up-git#git-%E3%81%8B%E3%82%89%E3%81%AE-github-%E3%81%AB%E3%82%88%E3%82%8B%E8%AA%8D%E8%A8%BC)
  - [HTTPS で接続 (推奨)](https://docs.github.com/ja/get-started/git-basics/set-up-git#connecting-over-https-recommended)

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237839/762b4e41-bd9c-4c58-bab5-3aed2972fe7f.png">
RAGを活用したシステム稼働後に『これがあったほうがいいよね』と言われた5選

# はじめに
RAGに関する説明は別途行います。その為、今回はあくまで前提としてRAGを活用したシステムというものが分かっているうえで進めさせていただきます。

さて、今回はシステム稼働後に要望をいただいた機能5選について共有させていただきます。ぜひ、今後のシステム開発の参考にしていただけたら幸いです。

# こんな方にお勧め
①RAGを用いたシステム開発を行っている
②生成AIを活用したシステム開発を行っている
③生成AIを活用したシステムを利用している

# RAGを用いたシステムとChatGptなどのLLMの違い
前提知識として、RAGを用いたシステムはAPI連携を活用しChatGptなどに直接情報を入力せずに、前提となる知識は別途DBへ格納しその情報を必要に応じて提供することで、企業や自治体などの独自の情報を検索することが可能なシステムです。

その為、LLMを直接利用するよりももっと踏み込んだ質問を投げかけることが可能です。しかし、それならば同じようにAPI連携を用いてLLMを使い、全文をプロンプトにいれれば解決するのではないか、と思われるかもしれません。

その点においては、RAGはベクトル情報というテキストを数値化した値を持っていることを強みとして活用できます。
LLMは文章を与えすぎると、中身の読解において最初と最後以外の文章が進むにつれて徐々に理解度が薄くなる傾向にあります。
その為、ベクトル情報がプロンプトに近いものだけをピックアップして抽出し、LLMへ提供するというRAGの技術を用いることで、LLMが回答するものに必要な情報を渡すことが可能となっております。

その点において、LLMへ直接プロンプトを実行するよりもRAGを用いたシステムが勝っている点と言えます。

# 要望をいただいた5選
そんな前置きを経たうえで早速、5選について記載したいと思います。

①個人情報および機密情報を入力してしまった場合に制限したい。
②LLMを管理者で設定できるようにしたい。
③資料や学習情報を修正、投入できるユーザーを権限が欲しい。
④根拠情報があるページや場所が分かるようにして欲しい
⑤一般論は含まれないようにして欲しい。

理由はそれぞれ説明するほどのことはないと思いますが、みなさんどのような感想を抱かれたでしょうか？

意見は各々あるかと思いますので、必要に応じてシステムに入れていただけるとよいかと思います。

それを踏まえて、少し開発の観点を補足をしたいと思います。

# 個人情報と機密情報の入力に関する制限
入力に制限をかける手法はいくつかあると思いますが、汎用的に対応する手法としてわたしはLLMを活用することにしました。

個人情報や機密情報が入力された場合は、1を返却してくださいとすることで返却された値が1の場合は、処理を中断しプロンプトの修正を促すメッセージを表示させるようにしています。

そして、内容確認して特に問題が見受けられない場合などには『警告を無視して実行する』チェックをつけて再度プロンプトを実行していただくことで制限をかけることが出来ています。

この実装を行ううえでの注意点として、制限をかける際は可能な限り具体例も踏まえて、記載しましょう。LLMは指定された内容が抽象的であるほど、正確に回答を出すことが出来なくなります。

よく、LLMを理解力が高く頭の良い新人社員と例えられることがあります。
これは、理解力が高く教えてあげれば聞いたことはすぐに理解し、理解した情報から更に理解を広げてくれる。まさに『1を知って10を知る』を体現する存在です。

その分、新人社員であるため、知らないことは回答できないのでちゃんと具体的に教えてあげようという例えです。

例）
　LLMへプロンプトを実行する前にその内容の精査を行いたい。
  個人情報や機密情報が含まれている場合は、1を返却し、含まれない場合は0を返却してください。具体的な例は以下です。

 個人情報
　氏名　　　例）田中　太郎、Taro Tanaka
　生年月日　例）1999年2月22日、1999/2/22、平成11年2月22日
　住所　　　例）福岡県福岡市西区AAA町1-1-1
　性別　　　例）男、男性

 機密情報
　IPアドレス　例）10.10.10.10
　財務情報　　例）売上高1000万円、利益100万円

このような書き方です。実際はもっと多いですが、注意点として記載を増やすほどLLMが制限をかける幅が広がり意図せず処理を止める可能性が広がります。

その為、少しずつ検証しながら記載を増やしていくことがポイントです。

# LLMの指定
これは自治体などのお客様によるのですが、利用してよいLLMが決まっている場合があります。

複数LLMを利用できるようにしている場合などに、利用できるものを選択式にしていないと必要以上に利用できてしまい、機能過多が仇となるパターンがあります。

それも踏まえて、様々なLLMを利用できる場合にはその制限をシステム管理者で行えるようにしておきましょう。

# 資料や学習情報を更新できるユーザー権限
こちらは機能というよりも制限に関する内容です。

利用者と管理者で権限を2パターンに割り振りできるのが一般的ですが、更にただ使うだけの人とユーザーやデータを管理する人、資料取込や学習情報を管理する人と3パターンで切り分けをしたいというお話でした。

これに関しては純粋にどのように運用したいかによります。

その為、運用パターンの1つとして実装するのが好ましいですね。

# 根拠情報があるページや場所が分かるようにしたい
　根拠資料を表示することは、RAGの技術を用いたシステムを実装するうえでほぼ必須といえるほどに大切なことです。特にどこにその情報があるか存在するかが分かればなお、その信ぴょう性が増します。

　最近のLLM（ChatGptやGemini）は、取り込んだ情報にページ数が含まれていると、ページ数まで読み込んで返答を作ってくれます。

 　なので、なるべく取り込む情報にページ数を含んで取り込むことがおすすめです。

 # 一般論は含まれないようにする
　一般論を含めたくない。この要望は、実はケースバイケースだったりします。
 例えば、法律や国が定めた制度などに関わるものに関してはネットの制度に関する情報も回答に含まれて欲しい場合があります。

  ただ、基本的にはRAGは取り込んだ情報だけで回答を生成することが好まれる為、回答を生成する前提条件に、『通常は一般論を含めない。ただし、法律などに関する情報はその限りではない。』などの細かい情報を設定してあげるのがいいです。

# まとめ
　今回、現在構築しているシステム稼働後に要望をいただいた中で共有したい5選をピックアップしました。これらは、導入しておくと喜ばれる可能性は高いと思います。

 　これを呼んだ方もぜひ、システムを作っている場合は参考にしてみてください。
JavaScriptのPromiseを外から操作可能にする ― Supabaseから学ぶDeferredパターン

JavaScriptには `Promise` という非同期処理のための仕組みがありますが、  
通常のPromiseは**resolve/rejectをPromiseコンストラクタの中でしか呼べない**という制約があります。

ですが、Supabaseのコードベースではそれを柔軟に扱うために、`Deferred` クラスという仕組みが使われています。

---

## Deferredクラスの実装

```ts
export class Deferred<T = any> {
  public static promiseConstructor: PromiseConstructor = Promise

  public readonly promise!: PromiseLike<T>
  public readonly resolve!: (value?: T | PromiseLike<T>) => void
  public readonly reject!: (reason?: any) => any

  public constructor() {
    ;(this as any).promise = new Deferred.promiseConstructor((res, rej) => {
      ;(this as any).resolve = res
      ;(this as any).reject = rej
    })
  }
}
```
## 何が嬉しいのか？

通常の Promise の使い方はこうです：

```ts
const promise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("done"), 1000)
})
```
この場合、resolve/rejectを外部から呼ぶことはできません。

一方で Deferred を使うと、後から明示的に resolve や reject を呼び出すことが可能になります：
```ts
const deferred = new Deferred<string>()

setTimeout(() => {
  deferred.resolve("OK!") // 外からresolveできる！
}, 1000)

await deferred.promise // => "OK!"
```
## なぜ便利なのか？
Deferredパターンは以下のような場面で非常に役立ちます：

* コールバックベースのAPIをPromiseに変換したいとき

* 複数イベントの完了を待ちたいとき

* 一度だけ解決されるフラグ的な非同期処理が欲しいとき（例：ロックの開放）

* await で外から制御可能なPromiseを生成したいとき

## Supabaseでの利用例
SupabaseのSDKでは、ロック機構や状態遷移の管理、非同期イベントの通知など、
Promiseの解決タイミングを後回しにする必要がある場面でこの Deferred が使われています。

## まとめ

* Deferred は Promise をより柔軟に制御するための仕組み  
* resolve() や reject() を 外部から呼べる  
* Supabaseのような高機能ライブラリでは非同期制御の要となっている  

---

## 参考リンク

* [Supabase GitHub](https://github.com/supabase/supabase)  
* [MDN: Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)
Supabaseのソースコードから学ぶ、JavaScriptでのリトライ処理（retryable関数）

Supabaseの認証周りの実装を読んでいたところ、非常に参考になる**非同期リトライ処理のユーティリティ関数**がありました。

今回はそれを読み解きつつ、**柔軟なリトライ処理のパターン**について学んでいきましょう。

---

## retryable関数とは？

まずはSupabaseの中にある `retryable` 関数のソースコードを見てみましょう。

```ts
/**
 * Converts the provided async function into a retryable function. Each result
 * or thrown error is sent to the isRetryable function which should return true
 * if the function should run again.
 */
export function retryable<T>(
  fn: (attempt: number) => Promise<T>,
  isRetryable: (attempt: number, error: any | null, result?: T) => boolean
): Promise<T> {
  const promise = new Promise<T>((accept, reject) => {
    ;(async () => {
      for (let attempt = 0; attempt < Infinity; attempt++) {
        try {
          const result = await fn(attempt)

          if (!isRetryable(attempt, null, result)) {
            accept(result)
            return
          }
        } catch (e: any) {
          if (!isRetryable(attempt, e)) {
            reject(e)
            return
          }
        }
      }
    })()
  })

  return promise
}
```
### 何をしている関数なのか？

この関数は、一言で言うと：

> **非同期関数にリトライの仕組みを追加するユーティリティ**

です。

---

### 引数の構成

* `fn: (attempt: number) => Promise<T>`  
  リトライ対象の非同期関数。試行回数（`attempt`）を引数で受け取ります。

* `isRetryable: (attempt: number, error: any | null, result?: T) => boolean`  
  「再試行すべきか？」を判定するコールバック関数。  
  結果またはエラーを元に、リトライするかどうかを返します。

---

### 中身の流れ

* 無限ループで `fn(attempt)` を実行する。
* 成功した場合：
  * `isRetryable()` が `false` を返したらその結果で `resolve`
  * `true` なら再実行
* 失敗（例外）した場合：
  * `isRetryable()` が `false` ならそのエラーで `reject`
  * `true` なら再実行

---

### 実際の使用例（アクセストークンの再取得）

Supabaseの認証処理の中では、`refresh_token` を使って `access_token` を取得する際に、この `retryable` 関数が使われています：

```ts
const startedAt = Date.now()

await retryable(
  async (attempt) => {
    if (attempt > 0) {
      await sleep(200 * Math.pow(2, attempt - 1)) // 200, 400, 800, ...
    }

    return await _request(this.fetch, 'POST', `${this.url}/token?grant_type=refresh_token`, {
      body: { refresh_token: refreshToken },
      headers: this.headers,
      xform: _sessionResponse,
    })
  },
  (attempt, error) => {
    const nextBackOffInterval = 200 * Math.pow(2, attempt)
    return (
      error &&
      isAuthRetryableFetchError(error) &&
      // retryable only if the request can be sent before the backoff overflows the tick duration
      Date.now() + nextBackOffInterval - startedAt < AUTO_REFRESH_TICK_DURATION_MS
    )
  }
)
```
### 解説ポイント

* `attempt` 回数に応じてリトライ間隔を指数関数的に長くしている（**指数バックオフ**）
* 単純に「何回目か？」だけでなく、「今リトライしてもまだセッション更新に間に合うか？」をチェック
* `isRetryable` 関数が柔軟な再試行制御を可能にしている  
  例: **リトライ回数上限、時間制限、エラー種別など**

---

### まとめ

`retryable` 関数のように、**再実行を呼び出し側で制御できる仕組み**は非常にパワフルです。

* 明確なリトライ制御  
* エラーの粒度に応じた対応  
* 無限ループだけど安全に止められる構造  

Supabaseのコードを読むことで、**堅牢な非同期処理設計のヒント**がたくさん得られます。
---

### 参考リンク

* [Supabase GitHub](https://github.com/supabase/supabase)
* [指数バックオフとは（Wikipedia）](https://en.wikipedia.org/wiki/Exponential_backoff)
【Python】タイムゾーン

タイムゾーンを含むdatetimeオブジェクトをAwareオブジェクト、タイムゾーンを含まないdatetimeオブジェクトをNaiveオブジェクトと呼びます。

英語のawareは「気づいている、知っている、認識している」という意味で、ここでは「タイムゾーンを認識している」と覚えます。

英語のnaiveは「素朴」や「単純」という意味です。スペルはNative（ネイティブ）ではなくNaive（ナイーブ）です。
【Python】マッチオブジェクト

マッチオブジェクトとは、正規表現にマッチした文字列の情報を格納したオブジェクトです。


正規表現を「()」で囲むとサブグループが生成され、グループとして取り出すことができます。

「()」で囲んだマッチオブジェクトに対して、group()メソッドやインデックスで要素を指定すると、特定のグループの文字列を取得できます。
閉域網でも使える！CloudWatchダッシュボードにUIを組み込む方法

# 内容
先日、 [AWS ガバメントクラウドワークショップ](https://aws.amazon.com/jp/blogs/news/lg-gov-cloud-workshop-2025/)で、ガバメントクラウド環境における生成 AI 活用事例をご紹介させて頂きました。その中で取り上げた「ログ要約ツール」は、指定した時間とキーワードを入力するだけで、該当ログを抽出・要約してくれるものです。ツールの詳細は [AWS Blog のこちらの記事](https://aws.amazon.com/jp/blogs/news/gov-cloud-ops-with-genai/)をご参照ください。このツールを作成する上で、工夫した点は CloudWatch カスタムウィジェットという機能の使用です。以下の流れでカスタムウィジットを作成することによって、CloudWatch ダッシュボード上から直接アプリケーションを呼び出せるようにしました。

* Lambda 関数内に HTML／CSS を記述
* CloudWatch ダッシュボードの作成
* 作成した Lambda 関数をカスタムウィジェットとして追加

![cw01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/8a45c300-477f-4b0c-b608-2f24611951b4.png)

# この構成のメリット
閉域網で構築した環境では、インターネット経由でアプリケーションの UI にアクセスできないケースがあります。CloudWatch カスタムウィジェットを使えば、AWS マネジメントコンソールに入れる権限さえあれば ネットワーク経路を気にせずアプリケーションを利用できます。

# 作成するアプリケーション
CloudWatch ウィジェットで動く簡易アプリ 「WEBサイト確認」 を作ってみます。URL を入力し 実行 を押すと、内部で curl を実行して到達可否を返します。

![cw02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/858ddd05-a499-441f-ac0c-914619b58630.png)

* アクセス可能な場合

![cw03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/e12fd390-7f23-4f39-ac60-42b10c248bc7.png)

* アクセス不可の場合

![cw04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/308cd725-00f2-4421-b7ec-ce60237b081c.png)

# 作成手順

https://github.com/Toru-Kubota/cw-widget-cfn

上記リポジトリに CloudFormation テンプレートを公開しています。
```bash
git clone https://github.com/Toru-Kubota/cw-widget-cfn.git
```
または GitHub から `cw-widget-cfn.yml` をダウンロードしてください。

## CloudFormation スタック作成
テンプレートを指定し、他のパラメータはデフォルトのままデプロイします。

![cw05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/6434083a-9f74-4d6e-bb30-a4dd315f94ca.png)

プロイ完了後、以下 2 つの関数が作成されます。

* cw-01-lambda ：curl を実行するバックエンド
* cw-02-lambda ：UI を返すフロントエンド

![cw06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/c0014b2b-103d-4a81-a26d-441fae9df0b1.png)

## CloudWatch ダッシュボード作成
CloudWatch コンソールでダッシュボードを新規作成します。

![cw07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/27bbb350-3214-4a6c-a791-2e9b1c1cfa0d.png)

「その他のコンテンツタイプ」から「カスタムウィジット」を選択します。

![cw08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/cb7fb860-4672-4781-98e9-00af1f6dd105.png)

この画面は何も選択せず、「次へ」をクリックします。

![cw09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/b28cd13e-caf9-4bc2-bcb6-ffdad1635154.png)

「Lambda関数」に「cw-02-lambda」を選択後、「ウィジットの追加」をクリックします。

![cw10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/6da2a66a-e5db-42f4-bfcd-3aab55a7b213.png)

ダッシュボート内に下記の様なUI画面が追加されます。「Lambdaの実行を許可するか？」の警告が表示されるため、許可します。また、ここで忘れずに右上の「保存」をクリックしてダッシュボードを保存します。

![cw02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/0f1324da-f06d-4b2d-90c7-3c5c09b89c29.png)

# まとめ
CloudWatch カスタムウィジェットを使えば、Lambda でホストした小さな Web アプリをダッシュボードに埋め込み、閉域網でも簡単に利用できます。運用改善に使用出来るアイデア等があれば、教えて頂ければ幸いです。
Zustand - React状態管理ライブラリ

## Zustandとは
Zustandは、React向けのシンプルで柔軟な状態管理ライブラリ。
ContextやProviderなしでどこからでも状態にアクセスでき、再レンダリングの最適化や非同期処理・永続化にも対応している。

## Storeの作成
- すべてのコンポーネントからアクセスできる状態管理用の場所(Store)を作成
- create関数を使って状態とそれに関する操作を定義

```typescript
import create from 'zustand'

type State = {
  count: number
  increment: () => void
  reset: () => void
}

const useCounterStore = create<State>((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
  reset: () => set({ count: 0 }),
}))
```

## コンポーネントでの使用
- 作成したストアは、コンポーネント内でカスタムフックのように呼び出して利用
- 必要な状態や関数を取り出して、画面の表示やイベントハンドラに組み込める

```typescript
import React from 'react'

const Counter = () => {
  const { count, increment, reset } = useCounterStore()

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>+1</button>
      <button onClick={reset}>Reset</button>
    </div>
  )
}
```
kubernetes入門 - Part4 - jsonnetを使ってみよう（jsonnet⇒json⇒yaml）

# ダウンロード、解凍、Path追加
1. [これ](https://github.com/google/go-jsonnet/releases/download/v0.20.0/go-jsonnet_0.20.0_Windows_x86_64.tar.gz)をダウンロード
2. 7zipでtar.gzを解凍し、用意した任意のディレクトリ（例えば、tools）とかに配置
3. システム環境変数のPathに追加
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/38b43532-fd3f-4b58-8feb-9960b7403c84.png" width="300">

# インストール確認として、バージョン確認

```bash
C:\Users\abc>jsonnet --version
Jsonnet commandline interpreter (Go implementation) v0.20.0
```

# サンプルjsonnet

```jsonnet:test.jsonnet
{
  configMaps: [
    {
      name: "config-" + std.toString(i),
      data: { "val": std.toString(i * 2) }
    }
    for i in std.range(1, 3)
  ]
}
```

# configmap作成

```bash
jsonnet test.jsonnet > configmap.json
```

こんなやつができました。環境別に設定ファイルとか作るときに便利そうです。

```json:configmap.json
{
   "configMaps": [
      {
         "data": {
            "val": "2"
         },
         "name": "config-1"
      },
      {
         "data": {
            "val": "4"
         },
         "name": "config-2"
      },
      {
         "data": {
            "val": "6"
         },
         "name": "config-3"
      }
   ]
}
```

# jsonnetからyamlを作るために、yqをインストール

[ここ](https://github.com/mikefarah/yq/releases/tag/v4.45.4)から`yq_windows_amd64.exe`をダウンロードし、jsonnet同様、システム環境変数のPathに追加 
<span style="color:red;">※ファイル名はyq.exeに変更しておく</span>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/919ed337-70cf-486d-b0ff-252b2c362ae6.png" width="300">

バージョン確認

```bash
C:\Users\abc>yq --version
yq (https://github.com/mikefarah/yq/) version v4.45.4
```

# jsonnetからyaml作成

```bash
jsonnet example.jsonnet | yq -P > configmap.yaml
```

こんなyamlができました。

```yaml:configmap.yaml
configMaps:
  - data:
      val: "2"
    name: config-1
  - data:
      val: "4"
    name: config-2
  - data:
      val: "6"
    name: config-3
```
スーパー鳩時計



paizaの、多重ループとFIZZBUZZ（条件分岐）を組み合わせた「スーパー鳩時計」の問題に挑戦！


<br>

# 問題概要

「時刻の ‘時’ と ‘分’ を足して、その合計が3の倍数なら ‘FIZZ’、5の倍数なら ‘BUZZ’、両方なら ‘FIZZBUZZ’ と鳴かせよ」という問題。0も3と5の倍数とする。

<br>

- 24時間の「時」を0から23までループ
- 60分の「分」を0から59までループ
- それぞれの時と分を足した値を判定
- 3の倍数かつ5の倍数 → FIZZBUZZ
- 3の倍数だけ → FIZZ
- 5の倍数だけ → BUZZ
- どれでもなければ無音（空行）

<br>

https://paiza.jp/works/mondai/double_roop_problems/double_roop_problems__cuckoo_clock

<br><br>

# ✅ OK例：
```js
for (let i = 0; i < 24; i++) {  // 時（0〜23）をループ
    for (let j = 0; j < 60; j++) {  // 分（0〜59）をループ
        
        const time = i + j;  // 現在の時 + 分の合計を求める

        // time が 3 と 5 の両方の倍数のとき → FIZZBUZZ
        if (time % 3 === 0 && time % 5 === 0) {
            console.log("FIZZBUZZ");
        } 
        // time が 3 の倍数のとき → FIZZ
        else if (time % 3 === 0) {
            console.log("FIZZ");
        }
        // time が 5 の倍数のとき → BUZZ
        else if (time % 5 === 0) {
            console.log("BUZZ");
        }
        // それ以外のときは何も鳴かない（空行を出力）
        else {
            console.log("");
        }
    }
}
```

<br><br>

# ✅ OK例2：出力を一括でまとめて表示
```js
// 出力をためておく配列
const output = [];

for (let i = 0; i < 24; i++) {      // 時（0〜23）
    for (let j = 0; j < 60; j++) {  // 分（0〜59）

        const time = i + j;      // 現在の時 + 分の合計を計算

        // 3と5両方の倍数＝15の倍数 → FIZZBUZZ
        if (time % 15 === 0) {
            output.push("FIZZBUZZ");  
        } 

        else if (time % 3 === 0) {
            output.push("FIZZ");      // 3の倍数 → FIZZ
        } 
        
        else if (time % 5 === 0) {
            output.push("BUZZ");      // 5の倍数 → BUZZ
        } 

        else {
            output.push("");      // どれでもない場合は空文字
        }
    }
}

// 最後に一括で出力
console.log(output.join('\n'));
```
    
- 配列にためて最後に一度だけ出力した方が効率的。
- 後でまとめて加工したりソートしたりしやすい
- 3と5の倍数　＝　15の倍数

<br><br>

# 🗒️ メモ＆まとめ

- FizzBuzz問題は判定順が命！最も厳しい条件から順に書くべし
- `console.log`で毎回出力するより、一旦配列にためて最後にまとめて出すのも効率的！
- 3と5の倍数＝15の倍数（最小公倍数）を使って少し短縮できる


<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/21/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e3%82%b9%e3%83%bc%e3%83%91%e3%83%bc%e9%b3%a9%e6%99%82%e8%a8%88/)
スマホでPDFサイトを表示する方法

AndoridのWebViewは、ネイティブでPDFの描画に対応していないのでうまく表示されないことがあります。  

- Google Docs Viewerを使う（非推奨）
```kotlin
val pdfUrl = "https://example.com/sample.pdf"
webView.loadUrl("https://docs.google.com/gview?embedded=true&url=$pdfUrl")
```
Google Docs ViewerはPDFをGoogleのサーバー上でレンダリングしてくれます。2024年以降サービスの不安定化や廃止の可能性があります。セキュリティ性も問題があり将来的なメンテナンス性を考えると、推奨度は低いです。



- 外部アプリでPDFを表示する

WebViewを使わず、インストール済みのブラウザアプリで開く方法です。
```kotlin
val i = Intent(Intent.ACTION_VIEW, "https://example.com/sample.pdf".toUri())
startActivity(i)
```
簡単で確実にPDFを表示できますが、アプリ外に出ることとなり端末にブラウザアプリが必要です。


PDFの表示で困っている方の参考になれば幸いです。
Notionのトグルがグレーの意味

Notionのトグルは中に何も入っていないときは、黒でなく、薄いグレーになっている

![Screenshot 2025-06-21 at 14.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237839/79ff2ac1-f1f2-4627-b7ff-1450cd37fe9d.png)
Reactのスニペットを早く出現させたーい！！

お先にまとめです。

| React Hook    | 略記     |
| ------------- | ------ |
| `useStateSnippet`    | `usss` |
| `useEffectSnippet`   | `ueeee` |
| `useReducerSnippet`  | `urrs` |
| `useMemoSnippet`     | `umms` |
| `useContextSnippet`  | `utts` |
| `useCallbackSnippet` | `ulls` |
| `useRefSnippet`      | `urfs` |

## スニペットとは？

コードを一部書くだけで補完で書いてくれる機能です

![hidouki.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738967/12f3a518-42b7-42e7-ba50-771717afc37d.gif)

世は大生成AI時代、スニペットなんてCopilotが出してくれるのが当たり前ではありますが、時代に逆行して書いていきます

まず、早く出現させたい理由としては、先程のgifにもあるのですが、一番上に出てこなかったり、他のスニペットと競合して、選択するのが面倒だったりします。

![スクリーンショット 2025-06-21 13.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738967/83325ca1-65b4-470b-9e77-09e214c73807.png)

例えば、`useState`なんかはusssと打つと確実に一番上に出現できるので、usss→enterですぐに実行できるのです。便利です。

![スクリーンショット 2025-06-21 13.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738967/00ef74c8-bd44-4cb1-9947-81d456578624.png)


こんな感じでスニペットを簡単に出す方法を書いていきます。

補足しておくと、恐らく最速なのはスニペットを自作して、表示順を自作を上にするということです。

ただ面倒なのと、元からいいのが溢れてるのでそれを使いたいですよね。

さらに分かりやすい、覚えやすいスニペットがあれば教えてください。

## 基本編

スニペット自作は大変なので、以下のものが有名でおすすめです。

![スクリーンショット 2025-06-21 13.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738967/6c9b5ce9-ed72-4f5a-a8be-3c10c1725d59.png)

### 有名なHooksたち

よく使う`useState`,`useEffect`,`useRef`,`useReducer`,`useContext`,`useMemo`,`usecallback`について書いていきましょう。`useState`はusssでしたね。

| React Hook    | 略記     |
| ------------- | ------ |
| `useStateSnippet`    | `usss` |
| `useEffectSnippet`   | `ueeee` |
| `useReducerSnippet`  | `urrs` |
| `useMemoSnippet`     | `umms` |
| `useContextSnippet`  | `utts` |
| `useCallbackSnippet` | `ulls` |
| `useRefSnippet`      | `urfs` |

userefは出なかったなぁ,,,,

## 自作編

設定から自分で追加することができます。(Win : ctrl+shifft+p ,Mac : com +shift+p)

![スクリーンショット 2025-06-21 13.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738967/2057c478-bc82-4c68-9eb5-3114c9b106a9.png)

![スクリーンショット 2025-06-21 13.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738967/aa4e39e2-256d-433f-a1b8-aec2ce91b183.png)

以下のように記載していくと、使うことができるようになります。`$1`,`$2`なんかはtabで次のとこに行けることを示しています。

```json
  "Arrow Function": {
    "prefix": "af",
    "body": "($1) => {$2}",
    "description": "Creates an arrow function"
  },
  "Arrow Function Single Line": {
    "prefix": "afs",
    "body": "($1) => $2",
    "description": "Creates a single line arrow function"
  },
  "className": {
    "prefix": "cn",
    "body": "className=\"$1\"",
    "description": "Add className attribute"
  },
```

私がよく使うのは`() => {}`をafで出現させたり、cnでclassNameを出現させたりしています。
他にもReactHookFormだったり、愛用のTailwindValiantsのスニペットを入れたりしています。（計1100行）

まぁでもみんな自分で見つけてるんだろう、きっと
Depth Anything v2 (単眼深度測定モデル)で自己キャリブレーションした話

初投稿です。とある研究室でカメラ画像の研究をしているのですが、技術者の皆さまならお分かりの通り、距離を測定するのは大事です。センサですから。

最近ではLiDARでスマホのカメラをぶっ壊す破壊マシーンが有名です

https://x.com/niccruzpatane/status/1924485047580586294

そこで最近現れたカメラ一台で距離を測っちゃおうという超革新的なモデルです。良ければ動かしてみてね。ちなみにお持ちのカメラからは、すぐに距離の測定するのは難しいかも。誤差が結構あるので。そこで今回キャリブレーションしてみました。

https://github.com/DepthAnything/Depth-Anything-V2

ここのmetric depthのやつで絶対深度が求められる。
絶対深度ほしい人は下の方にあるから注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4113514/f6b4d69d-6fb2-460f-bee3-0d3e8142bec1.png)
これが絶対深度を求めるやつのリンク。。。わかりにくいわ！！！

※普通のやつは相対深度。それでも動かすとおもろい
※metric depthのモデルは相対深度とまた別にあるからそれも注意

やってみたら誤差がひどく。Stereo cameraとDepth Anythingで比較して線形関係を調べてみしました。その結果のがこちら


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4113514/b9c95314-a59e-4239-9fa1-61f8cc7841d2.png)

なんか線形的な関係かも！RMSEを求めてみたよ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4113514/e411405c-685e-4673-8e21-ab31ff0901ff.png)

真値との誤差31mmとは！！これは実用可能だ。とても驚きました。今の技術はここまで来ているのか。。。論文を読むと二人のアノテーターが頑張ったと書いてある。お疲れさまでした。

この技術が自動運転とかに使われるときが来るかもしれない。4月から始めてpythonとAIをいじって、何もITを知らない人が書いた酷い記事ですのでお手やらかにお願いします
SwiftのDispatchQueue.main.asyncAfterとは？簡単に説明してみました！

Swiftでアプリを作っていると、○秒後に何か処理をしたいという場面がある場合
例えば
- アニメーションの後に処理を続けたい
そんな場面で使えるのがDispatchQueue.main.asyncAfterです！


DispatchQueue.main.asyncAfterとは？
--
簡単に言うと、
一定時間待ってから、メインスレッドで処理を実行するためのコードです。

基本の書き方
---
```swift
DispatchQueue.main.asyncAfter(deadline: .now() + 秒数) {
    // 実行したい処理
}
```
例：2秒後にテキストを表示する
```swift
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    print("2秒経ちました！")
}
```
このコードを実行すると、2秒後に「2秒経ちました！」と表示されます。

例 : ローディング画面を一時的に表示
```swift
isLoading = true

DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
    isLoading = false
}
```
- 1.5秒後にローディングを消す処理


注意点
--
- 秒数はDouble型で指定（例：2.0、0.5など）

- .now() は現在の時刻を表す

まとめ
--
内容	詳細
用途	一定時間後に処理を行いたいとき
書き方	DispatchQueue.main.asyncAfter(deadline: .now() + 秒数) { 処理 }


最後に
--
DispatchQueue.main.asyncAfterは、Swiftでちょっと時間をおいて処理したいときに便利です
ぜひ参考にしてみください！✌️
MacでChromeを左右画面分割ショートカット（英字キーボード）

※英字キーボードを使っているため、日本語キーボードの場合は、画面上の`メニュー→Window`から対応のショートカットをご確認ください。

### 画面寄せ系
`ctrl + fn + ←(→)` 左寄せ（右寄せ）
`ctrl + fn + shift + ←(→)` 左寄せ左右入れ替え（右寄せ左寄せ左右入れ替え）

`ctrl + fn + F` 画面全体に広げる
`ctrl + fn + C` マージンを残して画面全体に広げる

### タブ切り替え系
`ctrl + fn + ↑(↓)` 前(後)のタブへ移動
`ctrl + fn + shift + ↑(↓)` タブを前
(後)へ移動

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237839/6a332604-cac2-41bd-a437-98e0ac8919eb.png">

#### 英語配列キーボードの場合 
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237839/0fe6d366-236c-46b1-ab8c-b4624e5e512a.jpeg)
材料力学「変断面ばりのたわみと傾斜角」様を参考にsympyでやってみた。

・作図は未です。
・作図イメージは、
　しゅう 様の
　はりの基本問題「はりの基本問題は、つぎの図の3つにまとめられます。」
　**変断面ばり中央位置で2EIとEIで、壁が右側です。**
　左右逆です。
https://qiita.com/ShuseiNakahara/items/bfbe9069b4f5fffd02ac#%E4%BD%BF%E7%94%A8%E4%BE%8B:~:text=%E3%81%AF-,%E3%82%8A,-%E3%81%AE%E6%9B%B2%E3%81%92%E5%95%8F%E9%A1%8C%E3%81%AE%E6%A6%82%E8%A6%81

# sympyで(エネルギー法で)
#### ver0.1  

```python
# ver0.1　(1) 
from sympy import *
var('M,P0,x,l,EI')
MM=M+P0*x
U= integrate(1/(2*(  EI))*MM**2,(x,  0,l/2)) \
  +integrate(1/(2*(2*EI))*MM**2,(x,l/2,l  ))
rep={P0:0}
print("#",diff(U,P0).subs(rep),",",-diff(U,M).subs(rep)) 
# 〃 (2) 
from sympy import *
var('P,x,l,EI,M0')
M=P*x+M0
U= integrate(1/(2*(  EI))*M**2,(x,  0,l/2)) \
  +integrate(1/(2*(2*EI))*M**2,(x,l/2,l  ))
rep={M0:0}
print("#",diff(U,P).subs(rep),",",-diff(U,M0).subs(rep)) 
# 〃　(3) 
from sympy import *
var('P0,x,l,EI,q,M0')
M=Rational(1,2)*q*x**2+P0*x+M0
U= integrate(1/(2*(  EI))*M**2,(x,  0,l/2)) \
  +integrate(1/(2*(2*EI))*M**2,(x,l/2,l  ))
rep={P0:0,M0:0}
print("#",diff(U,P0).subs(rep),",",-diff(U,M0).subs(rep)) 
# 5*M*l**2/(16*EI) , -3*M*l/(4*EI)
# 3*P*l**3/(16*EI) , -5*P*l**2/(16*EI)
# 17*l**4*q/(256*EI) , -3*l**3*q/(32*EI)
```

# sympyで作図
・未。これからです。

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

#### Qiita内

https://qiita.com/mrrclb48z/items/9bf3ba2792dc865f8e46


#### オリジナル
・sympyは、表の最初の3つだけです。順番は「はりの基本問題」順です。
**「表2-4 変断面ばりのたわみと傾斜角 p76」**
＞不静定構造の解法 単行本 – 1993/4/1
＞平嶋 政治 (著), 宮原 玄 (著)

https://www.amazon.co.jp/%E4%B8%8D%E9%9D%99%E5%AE%9A%E6%A7%8B%E9%80%A0%E3%81%AE%E8%A7%A3%E6%B3%95-%E5%B9%B3%E5%B6%8B-%E6%94%BF%E6%B2%BB/dp/4627463804

・他3つあり。つづく