OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Connect 導入時に気をつけること（2025年版）

## はじめに
Amazon Connect がリリースされて、2018年に東京リージョンでローンチされた時は、熱く盛り上がったのが遠い記憶の彼方ではあります。これまで様々なアップデートを重ね、Contact Lens の登場で機能拡大は加速し、昨年の生成AIブームにより、Bedrockとの連携で最終系へと進化したと言っても過言ではありません。

![AmazonConnect東京リージョンローンチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628463/dbe7bdde-cf43-4034-bf6e-65610f07d806.png)

Copilotに「Amazon Connectの東京リージョンリリースで歓喜に湧き上がる様子を絵にかいて。」とお願いしたらなかなか個性的なのを描いてくれました（笑）
***
しかしながら、いろいろな案件をしてきた中で、そのほとんどの機能を使っていないことが多いです。それどころか、基本的な仕様を把握せずに移行して（または移行途中で）、お客様から「聞いてないよぉ～　(;´Д｀)　」的なことを言われることもあるのではないでしょうか？

ない？なるほど。であれば結構。あなたは素晴らしいエンジニアです。
ここから離れて、他のもっと有用な、すばらしい記事を読む時間に充ててください。

## 本題

さて、ここからが本題です。
これって今じゃ当たり前なのに、考慮してなくて失敗した！！
ってならないために、これは最初に検討しておこうというのを、徒然と書いていきます。

### 電話番号の取得

むかーしむかしは、日本の電話番号でも画面からポチっと選ぶだけでしたが、いまは申請が必要で、書類なんかもいるので、AWSの作業リードタイムも考えて余裕をもった申請を行いましょう。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/get-connect-number.html#service-quota-phone-numbers

### 内線は使えない
AVAYAなどから移行した際、地味に困るやつです。お客様には提案の段階でお伝えしましょう。

ただ、「内線っぽい」ことは作れば出来ます。

https://repost.aws/ja/knowledge-center/connect-agent-to-agent-extensions

### 同時通話数のサービスクォータ

なんでデフォルトこんなに少ないんだ？と思いますが、忘れがちです。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/amazon-connect-service-limits.html#connect-quotas

### 日本の携帯番号

デフォルトではかかりません。上限緩和が必要です。なんででしょう？？

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/country-code-allow-list.html

ついでですが、今後 060 も追加されると思いますが、注意が必要なのは SMS送信したいとかで、携帯判定を「電話番号の上3桁が 070, 080, 090から始まったら」なんて Lambda を作っている場合ですね。忘れがちです。

### CTRが保存されるのは24ヶ月

これ、いまだに気しないで、２年経ったときにお客様から「聞いてないよぉ～　(;´Д｀)　」ってなること多いです。通録は S3 の設定によりますが、コンタクト検索で HIT しなくなるんですよね。
ここ、「通録ファイルは何年残りますか？」って質問はあっても、「検索って何年できますか？」なんて質問されないですからね。

構築する際はバックアップの設定は必須ですべきと思います。お客様が「いらない」と言っていたのに、数年後「やっぱり必要になっちゃった(n*´ω`*n)」なんてことになっても後の祭りです。
※下記はサーバーワークス様の記事。

https://blog.serverworks.co.jp/amazon-connect-save-ctrs

### Contact Lens の有効化について
これはコストも別途かかるのでお客様と相談になりますが、昔はACWの改善という費用対効果が目的でしたが、今や文字起こしや感情分析などは当たり前についているべき機能だと思います。
その他の恩恵も多いので、既に同様の別サービスを導入している場合を除いて、デフォルトで有効にすべきと思っています。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/contact-lens.html

## おわりに
まだまだたくさんあるんですが、いったんここまでにしておきます。
「これも忘れがち」みたいなのがあれば、ぜひコメントください。アップデートしていきます！！

弊社は、AVAYA などのオンプレのシステムから Amazon Connect のようなクラウドネイティブなシステムに豊富な知識を持ち、なおかつコンタクトセンターの知識も併せ持つ日本でも数少ない企業です。
何かお困りの際は、ご遠慮なくご相談ください！！

https://www.mieta-cc.com/

https://ari-jp.com/cnaris/

https://ari-jp.com/dataris/

https://ari-jp.com/
【JavaScript】JavaScriptで1桁の月や日をゼロ埋め！padStartとsliceの使い方

# はじめに
`JavaScript`で日付を表示する際に、1桁の月や日を2桁（"01", "02" など）で表示したい場合 があります。

例えば、`new Date().getMonth() + 1`をそのまま表示すると、1月が`1`になってしまいますが、これを`01`のように表示する方法を調べました。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::


# padStartを使うパターン
`padStart`は文字列の長さを指定し、不足分を特定の文字で埋めることができます。
+ 第一引数 (`targetLength`) … 目標とする文字数
+ 第二引数 (`padString`) … 不足分を埋める文字

```js
const today = new Date();
const month = today.getMonth() + 1;
const newmonth = month.toString().padStart(2, "0");
console.log(newmonth); //出力結果　02
```
***ポイント***
+ `toString()`で数値を文字列に変換する必要がある
+ `"0"`を埋めることで、`1 → "01"`のように変換できる

# sliceを使うパターン
`slice`を使う方法では、先頭に`"0"`をつけた後、後ろ2桁を取得 することでゼロ埋めを実現します。

```js
const today = new Date();
const month = ("0" + (today.getMonth() + 1)).slice(-2);
console.log(month); //出力結果　02
```

***ポイント***

+ `("0" + 数値)`で先頭に`"0"`を追加
+ `slice(-2)`で後ろ2文字を取得（例: `"012" → "12", "09" → "09"`）

# 終わりに
どちらの方法でも 1桁の月を`"01"`のように2桁表示できます。
場面に応じて使い分けてみてください！ 

# 参考

『JavaScriptでゼロパディングする』Zenn

https://zenn.dev/captain_blue/articles/zero-padding-in-javascript

『JavaScriptで0パディングを行う方法』Qiita

https://qiita.com/rei1129/items/e0f33d02ea5a80f7b16e

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
AWSのDNSレコードタイプ

# はじめに
AWS ANSの試験勉強をしていて、DNSレコードタイプについて混乱してしまったので学習の整理を兼ねて記事を投稿しようと思った。

# DNSレコードタイプ
ANS試験でよく出題されるレコードタイプは下記のものがある。

* Aレコード
* AAレコード
* Aliasレコード
* CNAMEレコード

## Aレコード
ドメイン名を IPv4 アドレスに紐づけるレコード。
例: example.com → 192.0.2.1

## AAレコード
ドメイン名を IPv6 アドレスに紐づけるレコード。
例: example.com → 2001:0db8:85a3::8a2e:0370:7334


## CNAMEレコード
ドメイン名を別のドメイン名に紐づけるレコード。
別名であるドメインを正規のドメインにリダイレクトしたい場合などに使用。

www.example.com を example.com にリダイレクトする場合、www.example.com にCNAMEレコードを設定することで、どちらの名前でも同じウェブサイトにアクセスできるようになります。

## Aliasレコード
特定の AWS リソース (CloudFront ディストリビューション, ALB, S3 バケットなど) を DNS 名として紐づけるレコード。
example.com → my-load-balancer-1234567890.us-east-1.elb.amazonaws.com

CloudFrontのIPアドレスは動的に変わる可能性がある。Aliasレコードを使用することで常にCloudFrontを向くようになる。イメージ的にはexample.comのドメイン名が指し示すのは特定のCloudFrontだよ〜と指定するようなもの
現場で知った、OracleライセンスのAAR（サポート年次調整率）8%とTermライセンス20%の話

![oracle001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/257a9e3d-d275-4f2a-95db-010d3e0d6234.jpeg)


## はじめに
Oracleライセンスの契約更新や新規購入の際に、気をつけたいポイントがあります。  
業務上での備忘録的な記事ですが、最近話題になっている以下の2点についてお伝えします。

- **AAR（サポート年次調整率）が8%に引き上げられた**
- **Termライセンスが定価の20%で購入できる**

本記事では、これらの変更がライセンスコストや運用に与える影響について、ビジネス寄りの視点で情報共有します。  
正式な契約条件や適用範囲は、**必ずOracleの営業さんに確認してください**。

---

## AAR（サポート年次調整率）とは？
AAR（Annual Adjustment Rate）は、Oracleの**サポート費用に毎年適用される調整率**のことです。  
以前は4%程度だったのですが、**2023年6月以降、8%に引き上げられました**。

例えば、サポート費用が **100万円** の場合、AAR8%が適用されると**翌年は108万円**になります。  
さらにその翌年は、108万円の8%増し＝**116.6万円** というように、**複利で増加**していきます。

| 年度 | サポート費用（AAR 8%適用） |
|------|--------------------|
| 初年度 | 1,000,000円 |
| 2年目 | 1,080,000円 |
| 3年目 | 1,166,400円 |
| 4年目 | 1,259,712円 |
| 5年目 | 1,360,489円 |

投資などで福利の強さをご存じの方はピンとくると思いますが、**約9年でサポート費用がほぼ倍増**する計算になります。  
長期的なIT予算を考える際には、この増加分を織り込んでおくことが重要です。

### AARの注意点
- **更新時に想定以上のコスト増になる可能性**がある  
  → 例年の増加率を前提に予算計画を組むと、突然の値上げで予算超過するリスクあり
- **AARの変更はOracle側で決定される**  
  → 企業側でコントロールできないため、契約前に最新のAARを確認する必要がある
- **契約更新時にOracleの営業さんと交渉する余地がある場合も**  
  → 交渉によっては条件調整ができるケースもあるため、事前相談は必須

参考：[Oracle年次保守料金値上げのお知らせ(2024年)](https://corp.ba-net.co.jp/news/20240731)

---

## Termライセンスの価格について
**Termライセンス** は、**一定期間のみ利用できるOracleライセンス**です。  
最近、**Termライセンスは永久ライセンスの20%で購入できる**ケースがあるとの話を聞きました。

例えば、永久ライセンスが **1,000万円** のソフトウェアなら、  
1年のTermライセンスは **200万円程度** で購入できます（ただし、別途サポート費用が発生）。

### Termライセンスのメリット
- **初期費用が安い**（永久ライセンスの20%で導入可能）
- **短期間の利用に適している**（一時的なプロジェクトやシステム移行時の並行稼働など）
- **長期契約を避けられる**（契約終了後に不要なら、そのまま終了できる）

### Termライセンスの注意点
- **保守サポート費用も発生する**  
  → Termライセンスでも通常のサポート費用がかかるため、トータルコストを試算すべき
- **長期間利用すると割高になる**  
  → 3～5年以上利用するなら、永久ライセンスの方が安くなる場合がある
- **利用可能な製品や条件に制限がある**  
  → Oracle営業に事前確認し、適用対象かどうかをチェック


参考：[システム更改におけるOracle Databaseライセンスの考慮点](https://www.ashisuto.co.jp/db_blog/article/Oracle-Licence-systemrenewal.html)

---

## 実際の経験談
### **AAR適用で想定以上のコスト増**
ある企業でサポート契約の更新時、「**サポート費用が想定以上に高い**」と問題になりました。  
理由を確認すると、**AARが4% → 8%に変更されていた**ためでした。  
この結果、**予算超過が発生し、追加承認を取ることに…**。  

**対策としては以下が重要**
✅ **契約更新時にOracleの営業さんへ最新のAARを確認する**  
✅ **年間の増加額を考慮し、予算計画を立てる**

---

### **Termライセンスの活用例**
あるプロジェクトでは、**旧システムと新システムの並行稼働**のためにOracleライセンスが必要でした。  
しかし、1年間のみの利用だったため、永久ライセンスを買うと無駄に。  

そこで**1年Termライセンス（20%価格）を活用**し、**コストを80%削減**できました。  
ただし、**Termライセンスでも保守費用は別途かかる**ため、契約時にトータルコストを試算することが重要です。

---

## まとめ
Oracleライセンスの契約更新や新規購入時には、以下の点をチェックしましょう。

✅ **AAR（サポート年次調整率）が8%に変更**されているので、更新時の費用増加に注意  
✅ **Termライセンスが20%の価格で購入可能**なケースがあるので、短期利用には有利  
✅ **契約前にOracleの営業さんと詳細を確認し、交渉の余地があるか相談する**

本記事は「こんなことがあったよ」という情報共有です。2025年2月28日時点の内容です。
**具体的な契約内容については、必ずOracleの営業さんに確認してください！**
🚀MP4からEDL/SRTファイルを生成するツールの開発

今回は、動画編集作業の効率化を目指して開発中の「mp4_to_edl_srt」というツールについて紹介します。

## ツールの目的

このツールは、以下の機能を提供することを目指しています：

- MP4動画ファイルから音声を抽出し、文字起こしを行う
- 編集作業用のEDL（Edit Decision List）ファイルを生成する
- 字幕用のSRTファイルを生成する

## 現在の開発状況

### 実装済みの基本機能

- FFmpegを使用したMP4からの音声抽出
- Whisper AIによる基本的な文字起こし
- 単純なEDL/SRTファイルの生成
- 基本的なGUIインターフェース（ファイル選択、実行ボタン）

### 設定とカスタマイズ

現在、config.jsonで以下の基本設定が可能です：

```json
{
  "input_path": "入力ファイルのパス",
  "output_path": "出力先のパス",
  "scene_duration": "シーンの長さ（秒）"
}
```

※ 将来的にWhisperのモデル選択や言語設定、音声処理オプションなどの詳細設定にも対応予定ですが、現時点では実装されていません。

### 既知の問題点

1. 音声抽出に関する問題
   - 一部のMP4ファイルで音声ストリームの検出に失敗することがある
   - 音声品質によって文字起こしの精度が大きく変動する

2. EDL/SRT生成の課題
   - タイムコードが正確に同期しないケースがある
   - 長時間の動画処理時にメモリ使用量が増大する

3. GUI関連
   - プログレスバーの更新が不安定
   - 処理中のキャンセル機能が未実装

## 使用方法

### 基本的な使い方

1. リポジトリをクローン
2. 必要なパッケージをインストール
```bash
pip install -r requirements.txt
```
3. run_gui.bat（Windows）またはrun_gui.sh（Mac/Linux）を実行

### 必要な環境

- Python 3.8以降
- FFmpeg（システムにインストール済みであること）
- 最低4GB以上のメモリ

## 今後の開発予定

1. 設定のカスタマイズ機能の拡充
   - Whisperモデルの選択機能
   - 言語設定オプション
   - 音声処理パラメータの調整機能

2. 既知の問題への対応
   - 音声抽出処理の安定化
   - メモリ使用量の最適化
   - GUIの機能改善

## フィードバックのお願い

このツールは開発途中であり、多くの改善の余地があります。以下のような情報をいただけると助かります：

- バグや動作の問題点
- 必要な機能やオプション
- 使用時の気づき

## リポジトリ

GitHubリポジトリ：[mp4_to_edl_srt](https://github.com/chnmotoTmz/mp4_to_edl_srt)

※ 現在はアルファ版として公開しています。本番環境での使用は自己責任でお願いします。

## 最後に

このツールは、動画編集作業の効率化を目指して開発を進めています。まだ多くの課題が残っていますが、徐々に改善を重ねていく予定です。フィードバックやプルリクエストをお待ちしています。
rex0220 印刷屋プラグイン 一覧画面の合計欄

[rex0220 印刷屋プラグイン 一覧画面のPDF作成](https://qiita.com/rex0220/items/642d40299017c261a61e)に、合計欄を追加してみます。

# 概要

![2025-02-28_20h41_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a876d107-bfc1-4abe-9a54-5f5cb227da61.png)

- 選択したレコードの集計

![2025-02-28_20h43_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8da05fe2-8a98-46c1-88fd-18c3c74db400.png)


# 印刷屋プラグイン設定

- 合計欄を追加する場合、OPTに "footer","Y" を指定

```js:
   OPT("title","案件情報 " & TODAY() ,
       "pagination","Y",
       "perPage","10",
       "footer","Y"
    ),
```

- 合計は、文字列で4番目に 「"YEN(RECS_SUM(プラン費用))"」　を指定
- RECS_SUM 関数は、各レコードの合計を算出

```js:    
 ARRAY("プラン費用", YEN(プラン費用), "value-right","YEN(RECS_SUM(プラン費用))"),
```

![2025-02-28_20h39_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/100664d9-9a8a-43ae-b19e-d864756085e6.png)


![2025-02-28_20h45_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9200f9bf-4250-4723-82c6-37be472cbf30.png)

```css:
.pcraft-table-row {
  height: 60px;
}
```

```js:
RECS_HTML(
    OPT("title","案件情報 " & TODAY() ,
       "pagination","Y",
       "perPage","10",
       "footer","Y"
    ),
    ARRAY("#",$rseq+1),
    顧客名,部署名, 案件名,
    ARRAY("確度",確度,"value-center"),
    ARRAY("プラン費用", YEN(プラン費用), "value-right","YEN(RECS_SUM(プラン費用))"),
    ARRAY("オプション費用", YEN(オプション費用), "value-right","YEN(RECS_SUM(オプション費用))"),
    ARRAY("合計費用", YEN(合計費用), "value-right","FIXED(RECS_SUM(合計費用))")
)
```
S3の403エラー



## 403エラーの発生理由

### 権限設定の問題

CloudFrontからS3へアクセスする際、S3側のバケットポリシーやオブジェクトのアクセス権限が正しく設定されていないと、S3はリクエストを拒否し、403（Forbidden）エラーを返します。

### S3の仕様による特性

通常、存在しないファイルなら「404 Not Found」エラーを返すと考えがちですが、S3はセキュリティ上の理由から、対象オブジェクトが存在しない場合でも403エラーを返す仕様になっています。これは、オブジェクトの存在有無を外部に知られないようにするための設計です。

<br>

## ■ 403エラー（Forbidden）

サーバーはリクエスト内容を理解しているが、**アクセス権がないため処理を拒否する**エラーです。

* 対象のリソースは存在するものの、アクセス許可がない場合に発生します。

## ■ 404エラー（Not Found）

サーバーはリクエストを受け取ったものの、**指定されたリソースが見つからない**場合に発生するエラーです。

* リソース自体が存在しない、またはURLが誤っている場合に起こります。
ビットコイン、イーサリアム、ソラナの違いを徹底解説

近年、暗号資産（仮想通貨）の世界は急速に発展し、さまざまなブロックチェーンが登場しています。その中でも特に注目されるのが**ビットコイン**（Bitcoin）、**イーサリアム**（Ethereum）、**ソラナ**（Solana）です。

本記事では、それぞれのチェーンの特徴や違いを分かりやすく解説します。

---

## **1. ビットコイン（Bitcoin）**
### **特徴**
- **目的**：デジタルゴールドとしての価値保存、分散型の決済ネットワーク
- **コンセンサスアルゴリズム**：Proof of Work（PoW）
- **ブロック生成時間**：約10分
- **スケーラビリティ**：
  - 1秒あたりの取引処理数（TPS）：約7 TPS
  - スケーリング手法：Lightning Network（オフチェーンスケーリング）

### **設計**
- **シンプルなスクリプト機能**：基本的な送金には十分だが、スマートコントラクトは限定的
- **セキュリティ重視**：長期間の運用実績があり、最も安全なブロックチェーンとされる
- **非中央集権的**：最も分散化されたネットワーク

---

## **2. イーサリアム（Ethereum）**
### **特徴**
- **目的**：スマートコントラクトと分散型アプリケーション（DApps）の実行プラットフォーム
- **コンセンサスアルゴリズム**：
  - 以前はProof of Work（PoW）
  - 2022年の「The Merge」でProof of Stake（PoS）に移行
- **ブロック生成時間**：約12秒（Ethereum 2.0では可変）
- **スケーラビリティ**：
  - 1秒あたりの取引処理数（TPS）：約30 TPS（Layer2ソリューションで拡張可能）
  - スケーリング手法：Rollups（Optimistic Rollups, zk-Rollups）、Sharding（将来的に導入予定）

### **設計**
- **スマートコントラクト**：Turing完全なプログラムが実行可能（Solidity, Vyperなど）
- **分散型アプリケーション（DApps）**：DeFi、NFT、DAOなどのエコシステムが発展
- **手数料（ガス代）**：
  - ネットワークの混雑状況により変動
  - EIP-1559導入後、基本手数料（Base Fee）がバーン（焼却）される

---

## **3. ソラナ（Solana）**
### **特徴**
- **目的**：高速・低コストなトランザクション処理を実現するスケーラブルなブロックチェーン
- **コンセンサスアルゴリズム**：
  - Proof of Stake（PoS）+ Proof of History（PoH）
- **ブロック生成時間**：約0.4秒
- **スケーラビリティ**：
  - 1秒あたりの取引処理数（TPS）：理論値で最大65,000 TPS（実際は数千TPS）
  - スケーリング手法：単一レイヤー（Layer1でのスケーラビリティ）

### **設計**
- **高スループット**：独自のPoH技術により、効率的な並列処理が可能
- **低コスト**：ガス代が非常に安価（0.00025 SOL程度）
- **分散化の課題**：
  - 高速化のためにハードウェア要件が高い（ノード運営が集中しやすい）
  - 過去にネットワーク停止の問題が発生

---

## **比較表**
| チェーン | コンセンサス | ブロック生成時間 | TPS | スマートコントラクト | 主要な用途 |
|---|---|---|---|---|---|
| **Bitcoin** | PoW | 約10分 | ~7 | 限定的 | 価値保存・決済 |
| **Ethereum** | PoS | 約12秒 | ~30（Layer2で数千） | あり（Solidity） | DeFi, NFT, DApps |
| **Solana** | PoS + PoH | 約0.4秒 | ~65,000（理論値） | あり（Rust, C） | 高速決済, DeFi, NFT |

---

## **まとめ**
- **ビットコイン**は最も分散化され、安全性が高いが、スケーラビリティが低い。
- **イーサリアム**は汎用性が高く、DAppsやDeFiの中心だが、ガス代が高いことが課題。
- **ソラナ**は高速・低コストな取引が可能だが、分散化や安定性に課題がある。

それぞれのブロックチェーンは異なる用途に最適化されており、目的に応じて使い分けることが重要です。今後の技術革新によって、それぞれのチェーンがどのように進化していくのか注目です！
AWS SAM は リソース(Type)毎に Tags の設定方法が違う

AWS SAM の `template.yaml` を設定していたところ、Function と Role で Tags の設定方法が違っていたので、公式ドキュメントを確認して整理しました。

まず、設定方法の一覧をお伝えした後に、実際の `template.yaml` への設定方法を見ていきます。

# Tags の設定方法

| リソースタイプ | マップ形式 | キーバリューペア形式 |
|:-|:-:|:-:|
| AWS::Serverless::Api | ● |   |
| AWS::Serverless::Application | ● |   |
| AWS::Serverless::Function | ● |   |
| AWS::Serverless::GraphQLApi |   | ● |
| AWS::Serverless::HttpApi | ● |   |
| AWS::Serverless::SimpleTable | ● |   |
| AWS::Serverless::StateMachine | ● |   |
| その他（AWS::IAM::Role 等） |   | ● |

# template.yaml の書き方

下記の例では、AWS::Serverless::Function と AWS::IAM::Role に、それぞれ Key: `Project`, Value: `MyProject` と Key: `Environment`, Value: `dev` という2つのタグを設定しています。

## AWS::Serverless::Function の場合、Tags はマップ形式

```yaml:template.yaml
Resources:
  FooFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: fooFunction
      CodeUri: foo/
      Role: !GetAtt FooRole.Arn
      Timeout: 3
      # タグはマップ形式
      Tags:
        Project: MyProject
        Environment: dev
```

## その他のリソースの場合、Tags はキーバリューペア形式

```yaml:template.yaml
Resources:
  ...（省略）...
  FooRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: LambdaBasicExecution
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: "*"
      # タグはキーバリューペア形式
      Tags:
        - Key: Project
          Value: MyProject
        - Key: Environment
          Value: dev
```

# 設定方法が違う理由
AWS SAM の各リソースの Type は、CloudFormation のラッパーとして定義されているようです。
なので、同じ Lambda ファンクション でも、`AWS::Lambda::Function` はキーバリューペア形式ですが、それを拡張した `AWS::Serverless::Function` はマップ形式がサポートされるようになったようです。

# 参考サイト

公式ドキュメントも併せて確認してみてください。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-function.html

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html


下記の関連記事もどうぞ！

https://qiita.com/mkin/items/9684387591fa853e2c4a
点電荷−永久双極子間相互作用を図示してみたよ

# 点電荷−永久双極子間相互作用
$Z$の点電荷と$\mu$の双極子間の相互作用は次のようになります。

```math
F(r, \theta) = -\frac{1}{4 \pi \epsilon} \frac{Z \mu \cos{\theta}}{r^2} 
```

$r$が点電荷−双極子間の距離、$\theta$が双極子の角度、$\epsilon$が誘電率です。状況としては以下のイメージです。

![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/9c8521f4-33b6-4825-ab4c-c51bbc74462f.png)



# プロット

プロットの関数を示します。今回は電気素量を$e$とした時、$Z=+e$, $\mu=1 \times 10^{-10} \times e$の系を考えて、$r=[1\times 10^{-10}, 4\times 10^{-10}]$、$\theta=[0, 180]$の範囲でプロットしてみます。

```python
import matplotlib.pyplot as plt
import numpy as np

e = 1.60e-19
Z = 1
q = 1
l = 1e-10
mu = q*l
ep = 8.85e-12

theta = np.linspace(0, 180, 100)
r = np.linspace(1e-9, 4e-9, 100)

R, Theta = np.meshgrid(r, theta)

F = - Z * mu * np.cos(np.deg2rad(Theta)) / (4 * np.pi * ep) * (1 / R**2)

contourf_level = 15

# color map
fig, ax = plt.subplots()
contf = ax.contourf(R*1e9, Theta, F, contourf_level)

#contour
cont = ax.contour(R*1e9, Theta, F, levels=contourf_level, colors="k")
ax.clabel(cont, fmt='%1.2g', fontsize=12)

plt.xlabel("R (nm)", fontsize=20, color='black')
plt.ylabel(r"$\theta$ ($^{\circ}$)", fontsize=20, color='black')
plt.colorbar(contf, label="F (N)")
plt.subplots_adjust(left=0.15, right=0.95, bottom=0.15, top=0.95)

plt.show()
```

以下がプロットの結果です。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/318e8d31-9322-40f0-b492-9bd53b045600.png)

$r$が小さくて、$\theta$が0に近い時は引力が働いて、$\theta$が180に近いときは斥力が働いています。$\theta=90$のとき働く力はいつでも0です。計算としてはよさそうです。

想定としては、一価の陽イオンが、数nmの距離にある、長さ1 Åで$e$だけ電荷が偏った直線分子から受ける力を考えていました。結果としては、$1\times 10^{17}$Nほどの大きな値になってしまって、明らかに大きすぎる気がします。意外に、クーロン力ってそれだけ大きな力なのかもしれません。
Microsoft製のOSSに個人でコミットする時の備忘録

# 概要

Microsoft製のOSSにコミットする時は、CLA(Contributor License Agreement)に署名しなければなりません。よってその方法を備忘録に残しておこうと思います。

# PRの作成
まずPRを作成します。PRの作成方法は以下の過去記事に詳細を解説しているので割愛します。

https://qiita.com/y-vectorfield/items/b955617712f3b66359f2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/a92b3c26-0141-4125-977b-ec753a4ab53c.png)

# CLA Botがメッセージを表示
CLAに同意する様にBotに促されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/24353ca5-2f41-4380-adaf-33dc12475a60.png)

# CLAに同意
CLAに同意する場合はコメント欄に`@microsoft-github-policy-service agree`と入力し、`Comment`ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/84c46fb9-77af-4b3e-954b-6b9099bba207.png)

## 参考
https://opensource.microsoft.com/cla/

https://github.com/microsoft/ContributorLicenseAgreement?tab=readme-ov-file#accepting

# Reference
https://github.com/microsoft/ContributorLicenseAgreement?tab=readme-ov-file#accepting
Power Apps のデータテーブルが表示されない

現在 PowerApps のデータテーブルにて SharePoint リストからのデータが表示されない可能性があります。
日本語列名で作成している場合に発生しています。

米国のチームにて、原因の調査をしているようですが、ユーザーが調査状況を確認することができないため、待つしかありません。
SharePoint リストの列名を半角英数字で作成を行うことで解決します。

回避策としましては、
明示的な列選択を無効にした状態でアプリの公開をしていただくことで解決する可能性がございます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4023855/e8b5aac6-fd01-4043-9d02-ae5dfa3c664c.png)


明示的な列選択にを無効にした状態で事象が改善されない場合は、SharePointリスト名を半角英数字で作成をしていただくことで解決いたします。
個人的備忘録：MySQLのmysql.sockの基本理解と一般的なエラーの対処法をまとめてみた

## はじめに
MySQLはデータベース管理システムとして広く使用されており、ローカル環境での効率的な通信方法として`mysql.sock`（UNIXソケット）が存在します。

本記事では、`mysql.sock`の概要や設定方法、トラブルシューティングについて解説します。

## 書こうと思ったきっかけ
MySQLを使用する際に`mysql.sock`に関連するエラーに遭遇することが多く、その対処法を調べる機会がありました。

同様の問題に直面する方々の助けになればと思い、この記事を執筆しました。

## MySQLのmysql.sockとは？

`mysql.sock`は、MySQLサーバーとクライアント間の通信に使用されるUNIXソケットファイルです。

https://qiita.com/Haruto1431/items/78dd7500b213b3232162

https://zenn.dev/fujishiro/scraps/4b74cdc50670d4

これは、ローカル環境でMySQLクライアントとサーバーがより高速かつ効率的に通信できるようにするための仕組みです。

### 仕組み
通常、MySQLサーバーはTCP/IPを使用してクライアントと通信できますが、同じマシン内で動作している場合は、`mysql.sock`（UNIXドメインソケット）を使用することで通信のオーバーヘッドを減らし、パフォーマンスを向上させることができます。

### 設定と確認
#### ソケットの場所を確認する
デフォルトでは、`mysql.sock`の場所は環境によって異なります。一般的な場所は以下の通りです。

- `/var/lib/mysql/mysql.sock`
- `/tmp/mysql.sock`
- `/run/mysqld/mysqld.sock`

現在のMySQL設定での`mysql.sock`の場所を確認するには、以下のコマンドを実行します。

```sh
mysqladmin variables | grep socket
```
または、MySQLの設定ファイル (`/etc/my.cnf` や `/etc/mysql/my.cnf`) を確認することで、明示的に設定されているパスを確認できます。

#### 設定の変更
MySQLのソケットファイルの場所を変更したい場合は、設定ファイル (`/etc/my.cnf` など) を編集し、以下のように修正します。

```ini
[mysqld]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock
```

変更後、MySQLサーバーを再起動する必要があります。

```sh
sudo systemctl restart mysqld
```

### `mysql.sock`に関連するエラーと対処法
#### 1. `Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'`
このエラーは、`mysql.sock`が存在しない場合に発生します。MySQLサーバーが起動しているか確認し、起動していない場合は以下のコマンドで起動します。

```sh
sudo systemctl start mysqld
```
また、`mysql.sock`の場所が異なっている場合、クライアントの接続時に`--socket`オプションを指定することで解決できる場合があります。

```sh
mysql --socket=/run/mysqld/mysqld.sock
```

#### 2. `mysqld.sock`が勝手に削除される
一部の環境では、MySQLのソケットファイルがシステムの再起動時に削除されることがあります。その場合、MySQLの設定でソケットファイルの作成場所を`/tmp`以外に変更することで対策できます。

```ini
[mysqld]
socket=/var/lib/mysql/mysql.sock
```

## まとめ
- `mysql.sock`はMySQLのローカル通信に使用されるUNIXソケットファイル。
- `mysql.sock`を利用すると、TCP/IPよりも高速な通信が可能。
- `mysql.sock`の場所は環境によって異なり、設定ファイルで変更可能。
- ソケット関連のエラーが発生した場合は、サーバーの起動状態や設定を確認する。

MySQLのソケット通信を理解し、適切に設定することで、効率的なデータベース運用が可能になります。
grpcurl

```sh
# no TLS
grpcurl -plaintext
  # Use plain-text HTTP/2 when connecting to server (no TLS).
```

## cli flags

```
-max-time 10

-insecure
  Skip server certificate and domain verification. (NOT SECURE!) Not valid with -plaintext option.
```

## geyser

```sh
grpcurl -plaintext -import-path yellowstone-grpc-proto/proto/ \
-proto geyser.proto list

geyser.Geyser
```

```sh
GRPC="127.0.0.1:9000" # no protocol

grpcurl -plaintext -import-path yellowstone-grpc-proto/proto/ \
-proto geyser.proto $GRPC geyser.Geyser/GetVersion

{
  "version": {
    "version": {
      "package": "yellowstone-grpc-geyser",
      "version": "5.0.0",
      "proto": "5.0.0",
      "solana": "2.1.13",
      "git": "",
      "rustc": "1.81.0",
      "buildts": ""
    },
    "extra": {
      "hostname": ""
    }
  }
}
```

```sh
grpcurl -d @ -plaintext -import-path yellowstone-grpc-proto/proto/ -proto geyser.proto <server_addr>:<port> geyser.Geyser/Ping <<EOF
{
  "count": 1
}
EOF
```

## geyser method

```
geyser.Geyser/Subscribe
geyser.Geyser/SubscribeReplayInfo
geyser.Geyser/IsBlockhashValid
geyser.Geyser/GetLatestBlockhash
geyser.Geyser/GetBlockHeight
geyser.Geyser/GetSlot
geyser.Geyser/GetVersion
geyser.Geyser/Ping
```

---

Ref:

https://github.com/fullstorydev/grpcurl

https://github.com/rpcpool/yellowstone-grpc
WSL+DevContainerによる開発環境でファイルの編集が出来なくなった

# はじめに
WSL+DevContainerでの開発環境でファイルの編集が出来なくなりました。
ひとまず解決することは出来たので備忘録として残します。

# 背景
WSL+DevContainerでフロントエンドの開発環境を構築しています。
今回はNodejsのバージョンをアップデートするためにDockerfileを編集してビルドをし直しました。
すると、chownによるファイルオーナーの変更が効かずファイルの編集が出来なくなってしまいました。
その後、Nodejsのバージョンを戻しDockerfileを差分のない状態にしても改善は見られませんでした。

Dockerfileは下記のようなイメージです。

```Dockerfile:Dockerfile
FROM node:22-alpine

RUN mkdir -p /app/node_modules &&\
    chown -R node:node /app

USER node

ENV HOST 0.0.0.0
EXPOSE 3000
```

このDockerfileで`docker-compose build`と`docker-compose up`をし、コンテナ上でファイルの権限を確認しても、設定している通りのnodeにならずrootのままになってしまいました。

# 解決
Dockerバージョンのアップデート・ダウングレード、WSL再インストール、Dockerfileの記述の変更など色々と試したのですが、最終的には**WSLのユーザーをrootではなく任意のユーザーにする**ことで解決しました。

WSLインストール時にUNIXユーザー名を聞かれるのですが、今までは特に入力せずrootユーザーで作業していました。
そこで任意のユーザー名およびパスワードを入力することで、正常にファイルオーナーが設定できるようになりました。

# おわりに
以前は出来ていたのに何故急に出来なくなったのか、何故この対応で解決したのかの原因までは調査出来ていませんが、もし同じことで悩んでいる方がいれば参考になると幸いです。
もし原因が分かれば追記しようと思います。
【terraform】AWSコンソールで手動で作成するべきリソースについて

# AWSコンソールで手動作成し、Terraformのデータソースで取得すべきリソース

大前提として「全てをTerraformで管理するのが理想」です。IaC (Infrastructure as Code) の恩恵を最大限に受けるためには、定義ファイルでインフラ全体を記述し、バージョン管理するのがベストです。
※Terraformで誤って削除してはいけない重要なリソース（例：基幹システムのデータベース）を意図的にTerraform管理外とし、データソースで参照のみに留めることで、人的ミスによる事故を防ぐことができます。


以下は、AWSコンソールでリソースを手動作成し、Terraformでは**データソース**として取得する際のベストプラクティスです。  

これらのリソースは、ステートフルであったり既存のリソースであったり、セキュリティやコンプライアンス上の理由、または設定の複雑さから手動管理が推奨されるものです。



---

## 1. VPC／サブネット／ルートテーブル／IGW

- **理由**  

  ネットワークの基盤となるリソースはステートフルであり、誤った変更がネットワーク全体に影響を与える可能性が高いため、既存リソースとして手動管理するのが望ましい。

- **データソース例**  

  `aws_vpc`（必要に応じてサブネットやルートテーブル、IGWも個別にデータソースで取得可能）

- **実務上のポイント**  

  複数チームで共有する共通基盤の場合、既存のVPCや関連リソースを手動で管理し、Terraformでは参照専用とする。

---

## 2. セキュリティグループ

- **理由**  

  インスタンスのセキュリティを管理する重要なリソースであり、直接Terraformで管理するとルールの競合や意図しない削除が発生するリスクがある。

- **データソース例**  

  `aws_security_group`

- **実務上のポイント**  

  セキュリティチームなどが手動で設定・変更する場合、Terraformはあくまで既存の設定を参照するに留める。

---

## 3. IAMロールとポリシー

- **理由**  

  アクセス管理はセキュリティおよびコンプライアンスの要であり、誤設定によるリスクを回避するために、組織で手動管理するケースが多い。

- **データソース例**  

  `aws_iam_role`

- **実務上のポイント**  

  組織全体でIAMの管理を集中化する場合、Terraformでの変更を避け、既存リソースとしてデータソースで取得する。

---

## 4. KMSキー

- **理由**  

  機密データの暗号化に利用されるリソースで、セキュリティや監査要件を満たすために、手動でポリシーやキー管理を行うことが望ましい。

- **データソース例**  

  `aws_kms_key`

- **実務上のポイント**  

  セキュリティガバナンス上、KMSキーは既存リソースとしてTerraformで参照し、変更管理を厳格に行う。

---

## 5. RDSインスタンス

- **理由**  

  ステートフルなデータベースサービスであり、データの永続性・整合性を担保するため、運用中のRDSをTerraformで直接管理するとリスクが伴う。

- **データソース例**  

  `aws_db_instance`

- **実務上のポイント**  

  本番環境のデータベースは手動管理し、Terraformではその状態や設定を参照するに留める。

---

## 6. S3バケット

- **理由**  

  オブジェクトストレージはステートフルで、既存バケットをTerraformで直接管理すると、データの削除や設定の競合が発生する恐れがある。

- **データソース例**  

  `aws_s3_bucket`

- **実務上のポイント**  

  既存のデータ保管用バケットや複数システムで共有するバケットは、Terraformのデータソースとして安全に参照する。

---

## 7. CloudFrontディストリビューション

- **理由**  

  CDNサービスは設定が複雑で依存関係が多いため、手動管理することで柔軟性と安全性を確保できる。

- **データソース例**  

  `aws_cloudfront_distribution`

- **実務上のポイント**  

  配信設定をカスタマイズする場合、既存のCloudFrontディストリビューションをTerraformで参照し、管理リスクを軽減する。

---

## 8. Route 53ゾーン

- **理由**  

  DNSゾーンはステートフルなリソースで、Terraformで直接管理するとドメイン運用に影響を及ぼす可能性がある。

- **データソース例**  

  `aws_route53_zone`

- **実務上のポイント**  

  ドメイン管理を外部のチームやプロセスが担当している場合、既存のゾーンをTerraformで参照するのが安全。

---

## 9. ACM証明書

- **理由**  

  SSL/TLS証明書はAWSコンソールで発行・管理するケースが一般的であり、更新や運用の制御を手動で行うことが望ましい。

- **データソース例**  

  `aws_acm_certificate`

- **実務上のポイント**  

  CloudFront、ALB、API Gatewayなどで利用する際、既存のACM証明書をTerraformのデータソースで参照することで、証明書の管理リスクを低減できる。

---

## まとめ

Terraformのデータソースを活用することで、既存のインフラストラクチャを安全かつ一貫性のある形で管理しつつ、構成の追跡、再現性、自動化といったTerraformのメリットを享受できます。
よわよわエンジニア、UI・UX修行を始める ~番外編：ポスターをいい感じに印刷したい話~

## はじめに
本記事では、UI・UXデザイン方面でつよつよになりたい筆者が、UI・UXデザインに取り組んでいくなかで身に染みて感じたことを書いています。

今回は番外編です。UI/UXというよりは、印刷物に利用するデザインの話になります。

デザインに興味がある、ということで、ポスターやノベルティなどのデザインを請け負う機会を時折いただくことがあります。これらは印刷会社への入稿が必要なデザインになります。
今回は、入稿が必要なデザインを作成するうえで学んだことを少し紹介しようと思います。

## 裁ち落とし(裁ち切り・塗り足し)って何？

印刷物は一般的に、出来上がりのサイズより少し大きめの用紙に印刷して、まとまった枚数を機械で一気に断裁して目的のサイズにします。
そのため、本来の仕上がり位置とは若干ズレた位置で断裁されてしまうことが起こり得ます。
裁ち落としは、そのズレを吸収するために仕上がりサイズよりも外側に用意しておく、予備の領域のことです。一般的には、仕上がりのサイズの外側に3mm程度用意します。
基本的には断裁で切り落とされますが、背景色がある印刷物などでは、ズレが発生したときにデザインが破綻しないためにその裁ち落としの範囲まで背景色を塗っておく必要があります。

**ところで、外側にズレることがあるということは、内側にズレることも起きると思いませんか？**

## 印刷のセーフティーゾーンについて

断裁のズレによって文字やデザインが切れてしまうことを防ぐために、切れてはならない文字やデザインは仕上がり位置よりもある程度内側に配置します。
範囲については印刷会社にもよりますが、裁ち落としと同様に3mm程度のことが多いようです。

裁ち落としと仕上がり位置、セーフティーゾーンの関係は以下の画像のようなイメージです。
黒い線を仕上がり位置として、赤い範囲が裁ち落とし、青い破線の内側がセーフティーゾーンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062427/d877f1d9-b6f9-410d-8ff3-58c1a9337c8c.png)

背景色のあるデザインなので、赤い範囲(裁ち落とし)までデザインする必要があります。
そして、青い破線よりも内側に、切れてほしくないデザインは配置する必要があります。
このようにすることで、断裁の都合で多少ズレが発生しても、出来上がりのデザインが破綻しないようになります。

裁ち落としやセーフティーゾーンの大きさは作る印刷物にもよるため、依頼する印刷会社のガイドラインに沿って適切に対応することが大事です。

## さいごに

今回の記事は印刷に関わる知識で、アプリケーションのUI/UXからは少し離れた内容にはなります。
しかし、例えば制作物が製品紹介のポスターであれば、そのポスターを見た人が製品に興味を持って買ってくれることにつながるかもしれません。
それはまさしく、ユーザーが受け取る一連のUXにおける最初の一歩の部分だと思います。
せっかくのポスターが文字切れしていたり、端が塗り残されて白くなっていたりしたら、その「最初の一歩」の機会を失ってしまうかもしれません。
アプリケーション開発においては縁遠く感じる話かもしれませんが、知っておいて損はないかも……？
Windows11 Intel I225-Vのドライバ

## 対象
- Windows11-64bit
- ネットワークアダプタがIntel I225-V
- 通信が安定しない
## Windows11 24H2
３年くらいOSのクリーンインストールしてなくて、なんかすっきりしないので仕事の合間を縫って再インストール敢行。
すんなり終わって、仕事用のソフトをダウンロードしているときに気が付いた。
「なんかネットワーク、ぷちぷち切れてる？」
ハブを挟んでリモートデスクトップ接続してるパソコンとの通信も切れたりつながったり。
## LAN環境の確認
ハブのポートを入れ替えても切れる。
「そういえばハブもずっと触ってないなぁ」と言うことで、部屋にある2台のハブの電源再投入。
変化なし。
## ドライバ
ここにきてドライバを疑い始める。
イベントビューアーを見てみたら、InterのEthernet Controller(3) I225-Vで警告やらエラーが連発していた。
「え？ドライバ？でも何とかダウンロードした最新ドライバは入れてるしデバイスマネージャは正常に動作しているって言ってるし」
どうやら無線LANアダプタは正常動作しているから、外には出られるな。
## 集合知
とりあえず他に同様の事象が起きていないか確認してみた。
「Windows11 I225-V 不安定」
うん、いっぱい出てきた。
いろいろリンクをたどりながら出た結果が
**「Windows11用のドライバ入れてね」**
だった。
はー？マザーボードのドライバダウンロードページでちゃんとWindows11選択しましたし、何なら今も確認したけど間違えてダウンロードとかしてませんけどー？

Asus Intel I225-V Windows11用

このあたりのワードで検索したら、別のマザーボード用のページのダウンロードファイルには、W11なるフォルダがあって、そこに探しているドライバがあるらしい。
のでダウンロードして確認。
あるじゃん v(^^)v
## あるべき世界へようこそ
インストールして動作確認をして終わり。
混乱に満ちた時間が続くのかと思われたが、そのようなことはなかった。
先人の知恵に助けられ、正しい世界にたどり着つくことができた。
ありがとう、インターネット。
## リンク先
[ProArt B650-CREATOR DRIVER & TOOLS](https://www.asus.com/jp/supportonly/proart%20b650-creator/helpdesk_download/)
Intel I225/I226 LAN Driver V2.1.3.3
## 追記
がんばって記事を書いた翌日ですが、プチプチ再発 :<
先達の知恵で「デバイスのプロパティから速度を1Gに制限するのも良いかもね」と言われていたのでそちらも試してみたのですが、症状変わらず。
あきらめてUSB-LANポートの導入を考えたほうが無駄な時間を使わなくて済みそうです...。
【Laravel 開発入門】usersテーブルにテスト用ユーザーを作成する

# Laravelでusersテーブルにテスト用ユーザーを作成する方法

## 動作環境

- Laravel 8.x以降
- PHP 7.3以上

Laravelアプリケーションの開発やテストでは、`users`テーブルにテスト用のユーザーデータを挿入することがよくあります。この記事では、シーダー機能を使用してテスト用ユーザーを簡単に作成する方法を解説します。

## テスト用ユーザー作成の手順

### 1. シーダークラスの作成

```bash
php artisan make:seeder UsersTableSeeder
```


### 2. シーダークラスの実装

`database/seeders/UsersTableSeeder.php`を以下のように編集：

```php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'テストユーザー',
            'email' => 'test@example.com',
            'password' => Hash::make('password'),
            'created_at' => now(),
            'updated_at' => now()
        ]);
    }
}
```


### 3. シーダーの実行

```bash
php artisan db:seed --class=UsersTableSeeder
```


## まとめ

この方法を使用することで、`users`テーブルに簡単にテスト用ユーザーを作成できます。開発やテストの際に、必要に応じてユーザーデータを容易に追加できるため、効率的なアプリケーション開発が可能になります。
【TypeScript】ビット演算子をまとめてみた。

# はじめに
今回はTypeScriptで使用するビット演算子について、勉強がてらまとめてみました。

# まずビット演算って？
ビット演算とはデータをビット列（0と1が多数並んだもの）とみなして、各ビットの移動や論理演算を行う演算のことです。

高速な処理やメモリの節約などのメリットがあります。

ビット演算の詳しい情報については別の記事を参照してください。

# TypeScriptのビット演算子

### AND (&)
AND演算はビット単位での論理積を計算します。2つの数値の同じ位置のビットが **両方とも1の場合に結果が1** となり、それ以外は0です。

TypeScriptでAND演算を行う場合の演算子は **&** です。

```ts
let x: number = 3; // 2進数は0011
let y: number = 2; // 2進数は0010

let result: number = x & y;
console.log(result); // 出力結果:2 2進数は0010
```

### OR ( | )
OR演算はビット単位での論理和を計算します。2つの数値の同じ位置のビットが **片方だけ1の場合でも結果が1** となり、両方とも0の場合は0となります。

TypeScriptでOR演算を行う場合の演算子は **|** です。

```ts
let x: number = 3; // 2進数は0011
let y: number = 2; // 2進数は0010

let result: number = x & y;
console.log(result); // 出力結果:3 2進数は0011
```

### XOR (^)
XOR演算はビット単位での排他的論理和を計算します。2つの数値の同じ位置のビットが **異なる場合は1となり、同じ場合は0** となります。

TypeScriptでXOR演算を行う場合の演算子は **^** です。

```ts
let x: number = 3; // 2進数は0011
let y: number = 2; // 2進数は0010

let result: number = x ^ y;
console.log(result); // 出力結果:1 2進数は0001
```

### NOT (~)
NOT演算はビット反転演算と呼ばれ、各ビットの値を反転します。もっと簡単に表現すると **1の値を０に、0の値を１** に変換します。

TypeScriptでNOT演算を行う場合の演算子は **~** です。

```ts
const num: number = 3 // 2進数は0011
const notNum: number = ~num // NOT演算

console.log(notNum); // 出力結果:-4
```
JavaScriptやTypeScriptでは整数は **内部的に2の補数形式で表現されるため、ビット反転をするとその補数** が得られます。よって、3をビット反転すると"1100"ですが、これを2の補数形式で解釈すると-4になるのです。

### 左シフト演算 (<<)
左シフト演算とは、 **指定したビット数だけ左方向へシフトさせる演算** のことです。左方向にシフトさせると右側の桁が空いてしまうので、0を埋めます。

左シフト演算は数値を2のn乗するのと同じです。

TypeScriptで左シフト演算を行う場合の演算子は **<<** です。

```ts
const x: number = 6; // 2進数は0110
const shiftX: number = x << 2; // xを2ビット左へシフトする

console.log(shiftX); // 出力結果:24 2進数は00011000
```

### 右シフト演算 (>>)
右シフト演算とは左シフト演算の逆で、 **指定したビット数だけ右方向へシフトさせる演算** のことです。

右シフト演算は、数値を2の塁上で除算するのと同じです。

TypeScriptで右シフト演算を行う場合の演算子は **>>** です。

```ts
const x: number = 12; // 2進数は1100
const shiftX: number = x >> 2; // xを2ビット右へシフトする

console.log(shiftX); // 出力結果:3 2進数は0011
```

# まとめ
TypeScriptでは様々なビット演算子を扱うことができ、これらを駆使することでコードの品質を向上させたり、処理を高速化させたりすることができます。

### 参考文献
2025年2月28日閲覧

https://jp-seemore.com/web/13742/#toc5
Gitのエイリアスおすすめ設定10選！コマンド短縮で作業効率化（Mac編）

# はじめに

Gitを使っていると、毎回長いコマンドを入力するのが面倒になることはありませんか？
そこで便利なのが **Gitエイリアス** です！

本記事では、エイリアスの設定方法とオススメのエイリアス10選を紹介します。

:::note warn
本記事はmacユーザ向けです
:::

# **1. Gitエイリアスとは？**

Gitエイリアスとは、**よく使うGitコマンドを短縮して入力しやすくする設定** です。

例えば、`git status` を `git s` に設定すれば、少ないキー入力で操作できるようになります。

```sh
# 通常のGitコマンド
$ git status

# エイリアスを設定すると...
$ git s
```

# 2. エイリアスを設定する方法

### `~/.zshrc` を編集

ターミナルで下記のコマンドを入力

```sh
open ~/.zshrc
```

ファイルが開けたら、以下のようにコードを追加または編集してください。

```ini
s = status
co = checkout
br = branch
cm = commit -m
lg = log --oneline --graph --decorate --all
```

編集完了後保存を行い、ターミナルで下記コマンドを入力してエイリアス設定は完了です。

```sh
source ~/.zshrc
```

:::note info
コマンド打ち込んでも設定が反映されていない場合は、エディタの再起動を試してみてください。
:::

# 3. オススメのエイリアス設定10選

ここでは、おすすめのエイリアス設定10選をご紹介します。

| コマンド | エイリアス | 説明 |
|----------|-----------|------|
| `git status` | `git s` | 作業ツリーの状態を確認 |
| `git checkout <branch_name>` | `git co <branch_name>` | 指定したブランチに切り替え (`branch_name` はブランチ名に置き換え) |
| `git commit -m "message"` | `git cm "message"` | コミットの簡略化 |
| `git branch` | `git br` | ブランチ一覧の表示 |
| `git log --oneline --graph --decorate --all` | `git lg` | 視覚的にログを表示 |
| `git diff` | `git df` | 変更内容を確認 |
| `git pull origin <branch_name>` | `git pl <branch_name>` | リモートリポジトリから指定したブランチを取得 |
| `git push origin <branch_name>` | `git ps <branch_name>` | ローカルのブランチをリモートリポジトリの指定したブランチに反映させる |
| `git reset --hard` | `git rh` | コミットや変更をリセット |
| `git stash` | `git st` | 変更を一時的に退避 |

これらのエイリアスを設定するだけで、Gitのコマンド入力が格段に速くなります。

# 4. まとめ

Gitエイリアスを活用すると、作業がスムーズになり、入力ミスも減ります。
少しの設定で開発効率が大幅に向上するので、ぜひ試してみてください！
メモリ付き水筒のすすめ

お疲れ様です。秋並です。

皆さん、水分はとれていますか？

「仕事に集中して、振り返ってみたら全然水分とれていなかった」というようなこともありがちだと思います。

そこで、今回は水分管理に役立つアイテム
- メモリ付き水筒

を紹介します。

# 目次
- [水分補給が仕事に及ぼす影響](#水分補給が仕事に及ぼす影響)
- [1日に必要な「飲料水」の量](#1日に必要な「飲料水」の量)
- [メモリ付き水筒のすすめ](#メモリ付き水筒のすすめ)

# 水分補給が仕事に及ぼす影響

最初に、メモリ付き水筒について話す前に、水分が体に及ぼす影響についてお話しします。

何となく「水分は健康に良さそう」というイメージがあると思いますが、実際に仕事に及ぼす影響はどの程度になるのでしょうか。

イギリスのイースト・ロンドン大学とウェストミンスター大学が実施した調査によると
- 知的作業に集中する前に500mLの水を飲んだ人は、飲まなかった人に比べて**14％も反応時間が速くなった**

という調査結果が出ています。

このように、水分を摂取することは仕事をするにおいても、とても重要ということがわかります。

参考：[在宅ワークを快適に。こまめな水分補給で集中力アップ](https://fummynokurashi.com/hydration/?utm_source=chatgpt.com)

# 1日に必要な「飲料水」の量

水分が体にとって重要ということは分かったので、次は1日に必要な水分量を確認しましょう。

1日に必要な水分量は体重などによって、個人差はありますが成人男性の場合は一般に「2.5リットル」程度は必要とされています。


しかし、ここで注意するべき点として2.5リットルは「食事などから得られる水分も含んだ総量」であることに注意してください。

そのため、実際に**飲料水として飲む必要のある水分量は**

- **1.2リットル程度**

と言われているため、これを目安にして水分を補給するとよいでしょう。

# メモリ付き水筒のすすめ

さて、ここまでで水分の重要性と、必要な摂取量について話してきたので、最後に私がおすすめする水分補給アイテム

- メモリ付き水筒

を紹介します。

<br>

メモリ付き水筒は、下画像のように**半透明でメモリが書かれた水筒**になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/6fab0045-4cba-4aa6-8249-c625103a32ad.png)

[Amazon: BREMENT](https://www.amazon.co.jp/dp/B0CB3X8W2G/ref=sspa_dk_hqp_detail_aax_0?sp_csd=d2lkZ2V0TmFtZT1zcF9ocXBfc2hhcmVk&th=1)

なお、メモリは表裏に書かれており、表側には「時間のメモリ」、裏側には「水分量のメモリ」が記述されています。

どちらのメモリを基準にしてもよいと思いますが、私は基本的には「時間のメモリ」を参考にして、水分を摂取するようにしています。

::: note
ちなみに、**人間が1時間あたりに吸収できる水分量は限られている**ため、一気に大量の水分を摂取するのではなく、この水筒のメモリも参考にして、少しずつ水分を摂取することが大切です
:::

# さいごに

今回紹介したように、メモリ付き水筒は水分管理に最適なアイテムだと思うので、健康で効率的に仕事をすすめるためにも、是非購入してみてください！
Pythonを使用してWord文書から空白行を削除する

空白段落は、文書の構造を乱し、レイアウトの混乱や可読性の低下を引き起こすだけでなく、自動化されたテキスト分析、データ抽出、フォーマット変換などの後続プロセスに干渉する可能性があります。数百ページに及ぶ文書や定期的なメンテナンスが必要な場合、手動で削除するのは時間がかかり、人的ミスが発生しやすいため、Pythonを使ってプログラムで自動化処理を行うことで、操作の精度とプロセスの標準化が大幅に向上します。本記事では、**Pythonを使用してWord文書から空白段落を一括削除する方法**について説明します。

本記事で使用する方法には、無料の[Free Spire.Doc for Python](https://jp.e-iceblue.com/introduce/introduce-free-doc-for-python.html)ライブラリが必要です。PyPI: `pip install spire.doc.free`

## PythonでWord文書の空白段落を削除する方法
ライブラリのクラスとメソッドを使用して、Word文書の各セクションとその中の段落を繰り返し処理し、空の段落を検出して削除することで、文書内の空白段落を一括で削除できます。以下は、詳細な操作手順です：

1. `Document`オブジェクトを作成し、Word文書を処理します。
2. `LoadFromFile`メソッドを使用して指定されたWord文書を読み込みます。
3. 文書内の各セクション（section）を繰り返し処理し、その中の各子オブジェクトをチェックします。
4. 各子オブジェクトが`Paragraph`型であり、その内容が空であれば、その段落を文書から削除します。
5. すべてのセクションと段落の処理が完了した後、修正された文書を新しいファイルとして保存します。
6. リソースを解放するために文書オブジェクトを閉じます。

**コード例**
```python
from spire.doc import Document, DocumentObjectType, Paragraph

# Documentクラスのオブジェクトを作成
doc = Document()

# Word文書を読み込む
doc.LoadFromFile("Sample.docx")

# 文書内の各セクションを繰り返し処理
for i in range(doc.Sections.Count):
    section = doc.Sections.get_Item(i)
    j = 0
    # セクション内の各子オブジェクトを繰り返し処理
    while j < section.Body.ChildObjects.Count:
        # 子オブジェクトがParagraph型かどうかをチェック
        if section.Body.ChildObjects[j].DocumentObjectType == DocumentObjectType.Paragraph:
            objItem = section.Body.ChildObjects[j]
            # 子オブジェクトがParagraphクラスのインスタンスかどうかをチェック
            if isinstance(objItem, Paragraph):
                paraObj = Paragraph(objItem)
                # 段落のテキストが空かどうかをチェック
                if len(paraObj.Text) == 0:
                    # テキストが空の場合、セクションの子オブジェクトリストから削除
                    section.Body.ChildObjects.Remove(objItem)
                    j -= 1
        j += 1

# 文書を保存
doc.SaveToFile("output/空白行の削除.docx")
doc.Close()
```

結果
![2025-02-28_175616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d1bd5b84-24d1-4aa8-8acf-180f10041848.png)

本記事では、Pythonを使用してWord文書内の空白段落を削除する方法について紹介しました。
http-serverで静的ファイル用のローカルサーバーを立てたい



## 目的
復習システムを作成するために、忘却曲線に基づいて復習するものリストを表示するページを簡単に作りました。DBとかバックエンドを実装する時間（というか力）はなく、cookieでデータを保存しようと考えたので、ローカルサーバーを立ててる必要があったのですが、GPTに言われるがままに訳も分からず行ったので、後から調べている次第です。

## 必要な用語

### 1. HTTPサーバー（Webサーバー）とは？
HTTPサーバーは、ウェブサイトのファイル（HTML、CSS、画像など）をインターネットを通じて他の人に届けるコンピュータのことです。  
例えば、作ったHTMLファイルをブラウザで見るためには、サーバーというコンピュータがそのファイルを「ここにありますよ！」と教えてくれなければなりません。

Webサーバーは、ファイルをインターネットを通じて提供するコンピュータです。  
自分のPCでウェブサイトを試したいとき、「自分のPCでサーバーを立てる」ことで、インターネットを通じてウェブサイトを動かすことができます。

### 2. Node.jsのモジュールとは？
Node.jsは、JavaScriptを使ってサーバーサイドのプログラムを動かすための環境です。  
モジュールは、Node.jsの中で使える「便利な機能の集まり」で、いろんなことを簡単にできるようにしてくれます。  
http-serverは、Node.jsのモジュールの一つで、指定したフォルダ内のファイルを簡単にサーバーとして配信できるツールです。

## やったこと

### 3. サーバーの立て方
```bash
npx http-server
```
## コマンドの説明

このコマンドは、ローカルサーバーを立てるためのコマンドです。  
`npx`は、Node.jsのツールを一時的に使いたいときに便利なコマンドです。  
`http-server`は、簡易的にファイルを配信するサーバーを立てるツールです。これを使うと、ファイルを簡単に配信できるサーバーが立ちます。

### ポート番号の指定（-pオプション）
`http-server`は、デフォルトでポート番号8080を使いますが、`-p 8081`と指定することで、8081番のポートを使うことができます。  
ポート番号は、サーバーが動作する場所を示していて、8080や8081などの番号を使って、ネットワーク上でアクセスできる場所を指定します。

## 用語解説

### 静的ファイル
静的ファイルとは、内容が変わらない、ただのファイル（例えばHTMLファイルや画像ファイル）のことです。  
サーバーはこれらのファイルをそのまま配信します。

### クッキー
クッキーは、ウェブサイトでユーザーの情報を保存しておく仕組みです。  
例えば、ログイン情報やサイト設定を保存するために使われます。

## まとめ

- **HTTPサーバー**は、インターネットで他の人にファイルを渡す役割を果たすコンピュータのこと。
- **Node.js**は、JavaScriptを使ってサーバーを動かす環境で、その中の便利な「モジュール」として`http-server`があります。
- `npx http-server`コマンドで、ローカルのPCにサーバーを立てて、HTMLや画像ファイルを配信できるようにしました。
- **ポート番号**で、サーバーの通信場所を指定できます。

このように、ローカルサーバーを立てることで、サイトのデータをクッキーに保存し、ブラウザで簡単にテストすることができました。
Supabaseのブランチング機能が便利！GitHub＋Vercel＋Supabaseでプレビュー環境を使ってみた感想

最近、Supabaseがリリースした**ブランチング機能**を試してみたのですが、これが想像以上に便利だったので感想をまとめます。  
特に、**GitHubリポジトリのブランチに応じて自動で新しいSupabase環境を作れる** という点と、**Vercelのプレビュー機能と簡単に組み合わせられる** ところに惹かれました。

もともと、Next.js＋Supabase＋Vercelという構成で開発しており、Pull Requestベースのフローを取り入れていました。そこに **Supabaseのブランチング機能** を導入すると、**ブランチごとに独立したデータベースやAuth、ストレージが使えるプレビュー環境** が手軽に作れます。  
おかげで、**本番環境への影響を気にせず大幅なDBスキーマ変更を試せる** ようになったり、**複数ブランチで開発が並行していても衝突しない** 点がとても助かっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944846/59cc1499-e41b-4fbe-bc58-3888bdb75437.png)

## ブランチング機能の概要

- **有料プラン (Proプラン以上)** で利用可能  
- GitHubリポジトリと連携し、ブランチ単位で **新しいSupabase環境** を自動生成  
- 本番環境とは別の「プレビュー環境」が作られるので、**DBスキーマ変更やEdge Functionsの検証** を安全に実施可能  

さらに、**VercelのプレビューURL** とセットで運用すると、**PRが立ち上がるたびにフロントエンドもバックエンドも同期された状態でテスト環境** を準備できます。  
複数の開発ブランチを並行して進めるチームであれば、かなり相性がいいと思います。

## 実際に使ってみて便利だと感じたポイント

### 1. 本番環境からの完全分離
「ステージング用のSupabaseプロジェクト」を別途用意する必要がなく、**1つのプロジェクト内で本番とプレビュー環境を切り替え** られます。  
ブランチが増えるたびに新しいDBやAuth情報を設定する手間が減り、大きな開発が入っても本番を壊す心配なく動作確認できます。

### 2. DBマイグレーションをブランチ単位で検証
GitHubリポジトリの `./supabase/migrations` にSQLファイルを置いておくと、プレビュー環境生成時にそのブランチ用のマイグレーションが自動適用されます。  
**「本番にはないテーブルやカラムを試す」** といったことが容易にできて、PRレビューもしやすくなりました。

### 3. Vercelプレビューとの組み合わせでURLが自動生成
Pull Request を作ると、VercelがプレビューURLを発行 → Supabaseもブランチ用の環境を起動 → **それぞれの環境変数（NEXT_PUBLIC_SUPABASE_URLとANON_KEYなど）を紐づけるだけ** で動くので、導入障壁が低いです。  
フロントエンドとバックエンドが同じブランチ状態を参照し合うので、**余計な設定ミスが減って** 助かっています。

### 4. 複数のSupabaseプロジェクトを管理せずに済む
開発ブランチが増えるたびに新規プロジェクトを作るのは手間ですが、ブランチング機能では**1つのProプランプロジェクト内で複数ブランチを発生させる** だけなので、**プロジェクトの乱立** を防げます。


## 気になる料金や注意点

- **Proプラン以上** の契約が必要で、**プレビュー環境1つあたり1日0.32 USD** 程度の課金がかかります。  
- プレビュー環境は5分間リクエストがないと自動的に休止（コールドスタート）するため、**再開時は少し遅延が発生** することがあります。  
- 放置しているブランチが多いと、その分料金が積み上がるので**こまめにブランチを整理** しましょう。

## まとめ

実際に使ってみて、**Supabaseのブランチング機能は開発チームにとって非常に有用** だと感じました。  
- **本番環境への影響を抑えつつ** ダイナミックにDBスキーマをいじれる  
- **Vercelのプレビュー** と合わせると、PR単位で**独立したテスト環境** を簡単に準備  
- **複数のSupabaseプロジェクトを作る必要なし** で管理コストも削減  

もちろん有料機能なので、チームの開発規模や利用頻度によってコスト対効果を考える必要はあります。ただ、**PRベースの開発フローを採用している** のであれば、かなり導入の価値があると思います。

もし気になる方がいれば、ぜひ一度試してみてください！  


### 参考リンク
- [Supabase公式ドキュメント：Branching](https://supabase.com/docs/guides/branching)

以上、**Supabaseのブランチング機能を使ってみた感想** でした。皆さんの開発にも役立てば嬉しいです。
split(" ") の初心者らしいミスと正しい使い方

今日は改行出力の問題を解いた！「配列を split(" ") で分割すればいいっしょ？」って思った僕、無事撃沈しました。
実は split() は文字列専用 なので、配列に使うとエラーになります。

NG例
```js
const numbers = lines.split(" "); 
// ❌ エラー！（linesは配列）
```

OK例
```js
const numbers = lines[1].split(" "); // 2行目の文字列を分割
numbers.forEach(num => console.log(num)); // 各要素を改行出力
```

☆ポイント
lines[1] を指定して 文字列 を取得
それに対して split(" ") を適用


💡 まとめ
split(" ") は 文字列にしか使えない（配列に使うと死ぬ）
改行出力は forEach() か join("\n") でOK

[僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/02/28/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-split-%e3%81%a7%e6%94%b9%e8%a1%8c%e5%87%ba%e5%8a%9b/)
[Linux][command] ディレクトリ・ファイル管理_ファイル操作_cp, mv, touch

# cpコマンド
~~~terminal
$ cp [オプション] コピー元 コピー先
~~~

|オプション|由来|説明|
|:--|:--|:--|
| default | copy | - 指定したファイルをコピーする |
| `-r`<br>`-R` | recursive | - ディレクトリを再帰的にコピーする |
| `-p` | preserve | - コピー元のファイルの属性（パーミッション、所有者、タイムスタンプなど）を保持したままコピーする |
| `-i` | interactive | - 既存のファイルを上書きする際に確認を求める |
| `-f` | force | - 書き込み権限がない場合でも強制的にコピーする |

# mvコマンド
~~~terminal
$ mv [オプション] 移動元 移動先
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| default | move | - ファイルやディレクトリを移動またはリネームする |
| `-i` | interactive | - 上書きの際に確認を求める |
| `-f` | force | - 上書き時に確認せず強制的に移動する（`-i`より優先） |
| `-v` | verbose | - 処理内容を詳細に表示する |




# touchコマンド
~~~terminal
$ touch [オプション] ファイル名
~~~


|オプション|由来|説明|
|:--|:--|:--|
| default | なし | - 指定したファイルのタイムスタンプ（アクセス日時、変更日時）を現在の日時に更新する<br>- 指定したファイルが存在しない場合、ファイルを新規作成する |
| `-c` | no-create | - 指定したファイルが存在しない場合、新規作成を行わない |
| `-t` | timestamp | - 明示的に指定したタイムスタンプに変更する（例：`touch -t 202301010101 file.txt`） |
| `-a` | access time | - アクセス日時のみを変更する（変更日時は変更しない） |
| `-m` | modify time | - 変更日時のみを変更する（アクセス日時は変更しない） |





# Ping-t

cp
- [3141_cp -i](https://mondai.ping-t.com/question_subjects/31/question_sessions/31869840/progressing_questions/488361812)
- [3142_cp -p](https://mondai.ping-t.com/question_subjects/31/question_sessions/32193725/progressing_questions/493221748)
- [3143_cp -r, cp -R](https://mondai.ping-t.com/question_subjects/31/question_sessions/32246633/progressing_questions/494045383)

mv
- [3164_mv](https://mondai.ping-t.com/question_subjects/31/question_sessions/31870469/progressing_questions/488372708)





touch
- [3168_touch -at](https://mondai.ping-t.com/question_subjects/31/question_sessions/30890995/progressing_questions/473266339)
- [3180_touch -t](https://mondai.ping-t.com/question_subjects/31/question_sessions/32018863/progressing_questions/490569328)
- [3190_xargs touch](https://mondai.ping-t.com/question_subjects/31/question_sessions/31223415/progressing_questions/478442914)
- [3280_touch -m](https://mondai.ping-t.com/question_subjects/31/question_sessions/31069115/progressing_questions/476102911)
Chrome133以降で使えるようになったスクロールコンテナクエリ

# はじめに

:::note warn
本記事で紹介する内容は2025/2/28現在、Chrome133でのみ動作しているものです！
他ブラウザの適応状態はおなじみの[Can I use...](https://caniuse.com/)にて確認お願いします。
:::

おしゃれなHPに行くとよく、スクロールしたらヘッダーが見えたり、スライドアニメーションがピタッと止まったりとスクールすることをトリガーとした多くのアニメーションが実装されてますね。
今までですと、CSSをこねくりまわしたり、JSでサクッと状態検知して書いたり、あきらめてjQueryを使ったりと何かと手間がありました。
そんな中、Chrome133からは割とサクッと簡単にスクロールに関する動作がCSSだけで組めるようになったので紹介します。

# scroll-state() 

コンテナクエリの1種でスクロールしたことによって、固定、スナップ動作、スクロール可能状態へ変更ができるようになりました！
原文は[こちら](https://developer.chrome.com/blog/css-scroll-state-queries#stuck)になります。

実際にどういうことができるようになるかというと...

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="gbOgOLd" data-pen-title="Untitled" data-user="ipeibcld-the-solid" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ipeibcld-the-solid/pen/gbOgOLd">
  Untitled</a> by 渉櫻井 (<a href="https://codepen.io/ipeibcld-the-solid">@ipeibcld-the-solid</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

このようにスクロールすることで、ヘッダー部分に色がつくようになりました。
実際にどういうことをしているのかですが...

1.  コンテナ対象のタグに`container-type:scroll-state;`プロパティの定義をする
1.  状態変化させる子セレクタに対して`@container`を付与し、`scroll-state(〇〇: ××)`を記入する

今回のデモでは.stuck-topクラスに `container-type:scroll-state;` を、子セレクタのnavに対して`@container scroll-state(stuck: top) `を付与しています。
こうすることで今回はtopにスタックされている状態になれば状態が変化するようになります。
今回のデモではすでにヘッダとして固定されており、わかりくいのでもう少しわかりやすい公式のデモはこちらになります。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="ByBxpwR" data-pen-title="First scroll-state() query" data-user="web-dot-dev" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/web-dot-dev/pen/ByBxpwR">
  First scroll-state() query</a> by web.dev (<a href="https://codepen.io/web-dot-dev">@web-dot-dev</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

[CSS scroll-state()](https://developer.chrome.com/blog/css-scroll-state-queries#stuck)

画面TOPまでスクロールされた結果、ハイライトが変更されたことが確認できます。

このように、スクロールされたときの状態で様々な処理が今後できるようになっていきます。

他にも、スクロール可能な状態を読み込み、画面TOPに戻るボタンを表示させたり、スライドがスナップされたことを読み取り、スライド強調させたりなど、スクールに関して多くの動作がCSSだけで完結します。

# 最後に

まだまだすべてのブラウザへの普及は先になりますが、CSSだけでできることがどんどん増えていきますね！
CSSの勉強がまだまだ未熟な自分にとって学ぶべきことが多いので、この先何がCSSだけでできるようになるのか楽しみです✨
PNG 形式の画像を WebP の base64 に変換

```bash
# PNG -> WebP -> base64
./convert.sh <PNG FILE PATH>

# クリップボードにコピー
cat xxx.txt| pbcopy
```

```bash:convert.sh
#!/usr/bin/env bash

origImage="$1"
name=$(basename "$origImage" .png)

# https://developers.google.com/speed/webp/docs/cwebp
cwebp "${origImage}" -mt -quiet -hint picture -o "${name}".webp
base64 -i "${name}".webp -o "${name}".txt
rm -rf "${name}".webp
```
Word　ページ番号を途中から1ページ目を設定する

# ページ番号設定でいつも Word さまに遊ばれてしまう。

分かっていれば１分で済むものを毎回３０分はかかってるだろう。  
２度と使いたくないと思いながらも再び使用することを強要される。
この状況は今後もかわらないだろーね。 


1. 次のページから番号を振りたいページの文末にカーソルを合わせる。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/97bece0e-2747-42a9-a72d-8049dd8e4974.png)

1.  レイアウト ＞ 区切り ＞ セッション区切り 次のページから開始  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/0d5a57e2-7f66-4523-b827-81839adfb8ae.png)

1. 次のページが追加される  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/1c8d4937-f09e-4f4d-a901-66f122cf159b.png)

1. 挿入 ＞ フッター ＞ フッターの編集  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/e9e23025-93dd-4ee5-88eb-7edf71eb6148.png)

1. 前と同じヘッダー／フッター をクリックして「前と同じ」を消す  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/87abcc56-d48c-4551-81df-7d2ae7261dab.png)

1. 挿入 ＞ ページ番号 ＞ ページの下部 ＞番号のみ２  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/5dfe36c7-2aeb-472d-9867-9b17fa4a0aeb.png)

1. ページ番号を挿入すると１行増えてしまうので削除（BackSpace）する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/ac5d8307-e913-4e54-8a3a-05f7b49edb57.png)

1. まだページ番号は２のままなので１にするため、ページ番号の ２ を右クリックする  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/483a5531-4dca-4020-ae94-bd62e850037f.png)

1. ページ番号の書式設定をクリック  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/1042d6b7-0391-4827-8ddd-cad543d66634.png)


1. 開始番号を １ からに設定してOK  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/e54c6eda-8a2b-45f9-95da-6e9da0187091.png)


1. できた。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278020/862e3add-12bf-4671-bc95-35cd2a10fa3a.png)

以上
Vue/React メソッド対応表

Vue(composition API)とReact(関数型)のメゾッドの共通点を見出したので出力します。
| Vue | React |
|:-:|:-:|
| 通常変数 | useRef |
| ref, reactive | useState |
| computed | useMemo |
| watch | useEffect |

## なぜ通常変数がuseRefになるか
まず、Vueは変数宣言などのコードは一回のみ呼び出すのに対し、Reactは再描画ごとに呼び出します。
つまりReactは全体が別々で呼び出されるため、関数内の変数の値は`useRef`などのフックを使わないと維持できないためです。

また、Vueでは通常変数で宣言した場合それに代入しても再描画はされないためReactのフックは再描画が起こらない`useRef`をチョイスしました