OmniAICreator/Qiita-1.07M huggingface dataset:
ABC411のA〜B問題をPythonで解く

## はじめに

今回は体調不良だったため、ユニークビジョンプログラミングコンテスト2025 夏 (AtCoder Beginner Contest 411)には参加しませんでした。

その代わりとして、翌日(つまり今日)、A問題とB問題を解いてみました。
C問題以降は解きませんでした。恐らく(C問題は)TLE(実行時間制限超過)でダメだろうなー、と。

C問題(以降)が解けないかもしれないと判断したので、バーチャル参加はしていません。

## A - Required Length

[問題文](https://atcoder.jp/contests/abc411/tasks/abc411_a)

文字列の長さを出力する関数があれば楽に解ける問題です。
まあ典型的A問題ということで。

$L$文字『以上』というのはミスしやすい注意点かもしれません。

```python:A.py
def main() -> None:
  p = input()
  l = int(input())
  if len(p) >= l:
    print("Yes")
  else:
    print("No")


if __name__ == "__main__":
  main()
```

## B - Distance Table

[問題文](https://atcoder.jp/contests/abc411/tasks/abc411_b)

階差が与えられるので、その累積和を求める、でいいんでしょうか？

$N$は駅の数、$D_i$は駅間の距離が与えられる、という点には気をつけねばなりません。
つまりミスすると配列の範囲を越えてしまう、と。

```python:B.py
def main() -> None:
  n = int(input())
  d = list(map(int, input().split()))
  for i in range(n - 1):
    r:list = list()
    rc = 0
    for j in range(i, n - 1):
      rc += d[j]
      r.append(rc)
    print(*r)

if __name__ == "__main__":
  main()
```

## C問題以降

C問題は問題文を見てみましたが、どうにも普通にやったらTLEを起こしそうな気配がしたので、今の実力では解けないと判断しました。
ということで解説を見ることに。

……いかん、ざっと見たところ理解不能。コードも合わせて、もう少し読み解きます。
なお、愚直にやるとTLEが確定することだけは当たっていました。

D問題以降も現状では理解不能。数理素養が足りない私には厳しいようです。

## 今後の課題

- [アルゴ式](https://algo-method.com/)で数理素養を身につける(現在は基礎数理が29%完了)
- 思考の柔軟性を高めるための手段を探す
- アルゴ数学本の読み直し、及び鉄則本を読み進める
- 体調を整える

AtCoderの過去問解きはアルゴ式の数理素養を一通り完了してから考えます。
数理素養が出来れば、あとは並行して行っても良いよね、と。

## 終わりに

コンテストは最低でも2週間に1回はRated参加しようと考えています。

ここまで読んで頂き、誠にありがとうございました。
CompTIA Tech+とは？（CompTIA米国本部ブログより）

あなたが教育に携わる方であれば、学習者たちは目まぐるしく変化する雇用市場に置かれていることをご存知でしょう。従来からある職種は進化し、あるいは時代遅れになりつつあり、新しい産業は至るところで生まれています。そのため、安定したキャリアパスを見つけることは容易ではありません。

このような状況にもかかわらず、成長を続けているのがテクノロジー業界です。充実していて経済的にも魅力のあるITキャリアに就くために、トレーニングを受け、認定資格を有する人材への需要は非常に高くなっています。キャリア構築が大きく望める職種。学習者たちに必要なのは、正しい出発点だけです。

CompTIA Tech+のトレーニングコンテンツと認定資格は、学習者がキャリアをスタートする上で必要な基本的な知識と実践的なスキルを提供します。ITの基本となる分野を網羅するため、非ITプロフェッショナルにも最適です。また、ITが自身のキャリアとして最適なものかどうか判断する上でも有効です。

Tech+を取得することで、学習者は自身の技術力を確認すると同時に、求人市場においてより優れた候補者になることができます。彼らは、困難な業務にも取り組む準備ができていることを雇用主に示すことができ、さらにテクノロジーの世界で自身の可能性を高めることができるでしょう。

　
# 教育の場におけるTech+のメリット
Tech+のトレーニングコンテンツは、実践的なシミュレーションを交えながら、学習者たちにITの基本をしっかり修得させる上で有効です。彼らは、コンピュータの設定や、小規模なワイヤレスネットワークのセキュア化といったタスクを学ぶことができます。さらに、AI、ロボティクス、量子コンピューティングなどの新興テクノロジーも扱われます。※一部トレーニングコンテンツは、英語版のみでの提供となります。

学習内容には以下が含まれます：

●　ITの概要と用語：コンピューティング、データの重要性、問題解決の基本を理解します。

●　インフラストラクチャ：デバイスとネットワークを安全に管理するための知識を修得します。

●　アプリケーションとソフトウェア：ソフトウェアアプリケーションとOSの仕組みを理解します。

●　ソフトウェア開発：コーディングとソフトウェア制作の基本を学びます。

●　データベースの基礎：データ管理とデータベースインターフェースについて学びます。

●　セキュリティ：デジタル情報の保護、プライバシーとデータ保護を確保するための洞察を得ます。

●　次のレベル：取得後は、CompTIA A+などのより高度な認定資格の取得を目指すことができます。

　
# Tech+トレーニングコンテンツの内容
CompTIA Tech+のカリキュラムは、最新のテクノロジーと業界の動向を反映しており、ソフトウェア開発、データベース管理、人工知能といった分野での学習を支援します。Chromebook、Mac、PCでご利用できます。※一部トレーニングコンテンツは、英語版のみでの提供となります。

学習者向けのトレーニングの内容：
●　インタラクティブなモジュールと、ビデオレッスン（読み上げ機能付）
●　セクション終了時のクイズと見直しツール
●　ファクトシートと試験対策教材
●　ハンズオン学習のためのインタラクティブラボへのアクセス
●　コース目標に対するタイムラインマッピング
●　他多数

インストラクター向けのカリキュラムの内容：
●　包括的な講師トレーニングと授業計画
●　パワーポイントスライドとLMSの統合
●　州の基準やその他認定資格に準拠
●　コース目標に対するタイムマッピング
●　カスタム可能なクイズビルダー
●　レポートツール

　
# Tech+認定資格試験の概要
●　最新のトピック：すべてのコンテンツは、現在のIT標準を反映するよう開発されています。

●　包括的なスキルと知識：コンテンツは、今日のテクノロジー業界で活躍する上で必要な包括的なスキルと知識に合致するものです。

●　セキュリティの重視：今日のサイバーセキュリティ重視の環境において必要なスキルセットであるデジタル資産の保護に重点を置いています。

　
学習者がテクノロジーを学ぶべき理由
ITは高収入
米国労働統計局によると、2023年のITプロフェッショナルの平均収入は104,420ドルで、全職業の年収中央値の2倍です。

ITは急成長している
テクノロジー分野のキャリアは、全国平均ほぼ2倍のペースで成長しています。Tech+認定資格を取得することで、学習者は選択肢が豊富な求人市場に身を置くことができます。

ITはどこにでも存在します
学習者は、一流企業と共にさまざまな業界で働く機会を得ることができます。ITトレーニングと認定資格を備えた人材は、選択肢の幅が広がります。

　
CompTIA Tech+では、レベル1の技術職に関連するスキルが修得できます
ITサポートスペシャリスト：ITシステムとエンドユーザーへの基本的なサポートとトラブルシューティングを提供し、多くの場合、最初の連絡窓口となります。

ヘルプデスク技術者：ソフトウェアやハードウェアの問題などユーザーの日常的な技術的な問題に対応し、問題解決のための基本的な手順を案内します。

コンピュータ技術者：コンピュータハードウェアとソフトウェアをインストール、メンテナンス、修理し、IT機器の円滑な運用を確実にします。

データエントリー技術者：データの正確性と整合性を確保しながら、データベースにデータを管理し入力します。

テクニカルセールスアソシエイト：技術製品およびサービスのセールスを支援し、基本的な製品知識とサポートを顧客に提供します。

フィールドサービス技術者：ITおよび通信機器のオンサイトでのインストール、メンテナンス、修理を行います。

ITオペレーションアシスタント：システムのモニタリング、バックアップの管理、ドキュメントのメンテナンスなど、IT部門の日常業務をサポートします。

デスクトップサポートアナリスト：システム構成やアップデートなど、デスクトップコンピュータ、アプリケーション、関連テクノロジーに関する問題に対応します。

カスタマサポート担当：多くの場合コールセンターやオンラインサポートプラットフォームを通じて、テクノロジー製品やサービスに関する顧客からの問い合わせや問題に対応します。

ジュニアシステム管理者：シニア管理者の下で、ITシステムとネットワークの保守と管理を支援します。

　
認定資格の概要や、出題範囲のダウンロードは[CompTIA Tech+](https://www.comptia.jp/certif/core/comptia_tech/)の概要ページから！
読書感想文「超熟睡トレーニング」

# 書籍名「超熟睡トレーニング」
Gakken
著者：角谷リョウ
監修：林宏明


# 読もうと思った経緯

睡眠を改善をしたいと思っているため。

睡眠について知識がなく、一通りの知識を得たいと思ったため。



# 印象に残った部分


## p22　睡眠不調の種類
睡眠の問題に由来する不調は一般的に睡眠不調と呼ばれています。

１つ目は「眠れない」ことからくる「不眠症」
２つ目は「睡眠語りていない」ことからくる「睡眠不足」です。昼間に眠気を感じる場合は睡眠不足


## P26 27 メンタルとコミュケーションが大ダメージを受ける
睡眠がうまく取れなくなるとメンタルダウンを起こし、
長引くにつれて鬱に移行していく可能性が高くなってしまう。

よく睡眠が取れている人と慢性の不眠症を担っている人とでは鬱になる確率が４０倍に達する。

## P30 日本特有の睡眠不調を招く原因
日本人は不安遺伝子が多い
太っていなくても、睡眠時無呼吸症候群になりやすい
夜間照明が明るすぎる

## p53 デバイスを使って睡眠を可視化するのも一つの手
もしも、客観的に自分の睡眠を評価することに興味があるのであれば、ウェアラブルのデバイス「スマートウォッチ」を使うことを検討するといい。
レム睡眠やノンレム睡眠などがわかる。



## p58 勝負は夜ではなく、朝についている
・朝にセロトニンを分泌させる仕組みさえ作れば良い。
・眠りにはメラトニンというホルモンが関わってより、朝分泌されるセロトニンが変化したものである。

## p60 夕食は寝る３時間までに終える。
食事からあまり時間が経ていないと胃が活発に活動している状態になってしまい、眠りづらくなる。
スムーズな入眠をしたいのであれば寝ようとしたときに食べ物がすでに胃を通過した状態であることが大事


## p81 温度だけじゃない。「湿度」が快眠に大きく影響する
湿度が高い７月、８月のときはエアコンのドライをかけて湿度を40%~60%に抑えるようにすると断然眠りやすくなります。

## p85 意外に無視できない電化製品の光と音
光るものに対しては、テープで目隠しをしたり余計な電源は切ったりする。

## p105 中途覚醒の理由は「肉体の疲労の不足」
対策としては「歩数を増やす」
最低４０００歩、できれば、８０００歩を目指す。

## p136 すぐにできる眠気にこう対処する
・起床してすぐにはコーヒーを飲まないこと
・起床後１時間後に飲むこと


## p154 たかがいびきと侮っていけない。
・いびきがある時点で「ゴーッ」と耳元で騒音が鳴っているため、睡眠が浅くなるため。
体がスイッチ・オンの状態のままなので十分にリラックスできない状態になる。
スマホアプリで状態を調べることができる。

# 感想
・睡眠について詳しくない自分でも理解しやすい内容なのが良かった。
・これからの生活に実践できることも多く大変満足です。他の人にも薦めたいです。



# 実践すること
・定時で上がれる場合は家で夕食を食べる。
　残業がある場合は、休憩時間中に夕食を食べる

・アプリ「いびきらぼ」を使っていびきの状態を調べる。

・冷凍庫とエアコンと電源タップの光を遮光する。

・「CPAP」を受ける。

・業務中に立ち仕事をする
　可能であればステッパーを使いたい。（歩数を補うため）

・スマートウォッチのGarminを買ってつける。
ChatGPTを使用したアプリ開発記【投げ銭ボタン押下でユーザーネームを取得】

## 投げ銭したユーザーIDを取得
```GiftButton.js
function GiftButton({ toUser }) {
  const [amount, setAmount] = useState(100);
  const [message, setMessage] = useState('');
  const user = useAuth();

  const handleSendGift = async () => {
    if (!user) return;

    await addDoc(collection(db, 'gifts'), {
      //下記でユーザーIDを取得
      fromUser: user.uid,
      toUser,
      amount,
      message,
      createdAt: serverTimestamp()
    });

    alert('🎁 ギフトを送信しました！');
    setMessage('');
    setAmount(100);
  };

     //下記ボタン押下でhandleSendGiftを呼び出す
  return (
      <button
        onClick={handleSendGift}
        className="w-full bg-gradient-to-r from-pink-500 to-purple-600 text-white font-semibold py-2 rounded-md shadow-md hover:from-pink-600 hover:to-purple-700 transition-colors"
      >
        投げ銭🎁 送信
      </button>
 ); 
```

## ユーザーIDの精査

```GiftList.js
const userDoc = await getDoc(doc(db, 'users', data.fromUser));

```
•	data.fromUser は Firestore の gifts ドキュメントに保存されている UID。
•	doc(db, 'users', data.fromUser) で users コレクション内の該当 UID のドキュメント参照を作成。
•	getDoc(...) でそのユーザードキュメントを取得。

```GiftList.js
if (userDoc.exists()) {
  fromUserName = userDoc.data().name || '名前未設定';
}
```
•	userDoc.exists() でその UID のユーザーが存在するかをチェック。
•	存在すれば、.data().name で name を取得。無ければ '名前未設定' を代用。
•	結果は fromUserName に格納され、ギフトリスト表示に使われます。

## プロフィール画面での表示
```profile.js
          <GiftList toUser={uid} />
```


![スクリーンショット 2025-06-01 12.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/58a3451d-851f-4630-adca-cbe19a0db372.png)
0から始めるClaude Code①　爆速で理解する

# はじめに
この記事はClaude Codeの未経験者、初心者向けの記事です。

みなさん **Claude Code**を堪能してますでしょうか？ Claude CodeはAIがプログラムを自動で書いてくれるアプリケーションです。
**夢のプログラム全自動化**に向け、世界中の人が、より良い方法を模索していると思います。しかし、Claude Codeはなかなか思うように動いてくれないのが、現実です。
この記事では、Claude Codeのいいところ、ダメなところ、より良くするための工夫を書いていきます。
CLUADE.mdやカスタムスラッシュコマンドの工夫は別記事で書く予定です。

# Claude Codeとは
ざっくり話します。
- <font color="red">**ターミナル**</font>で動く
- ファイルを読んで、プログラムなどを書いてくれる
- Maxプラン(月100ドル)で、**実質使い放題**
- **CLUADE.md**に記憶を文章で保存して、小さい記憶力を補う
- 2025/06/23現在、**プログラマーで、<font color="red">一番使われている</font>**

# 何が良いのか？
#### Clineと一緒の部分
- ファイルの読み込み、書き込み、実行が自動
- **MCP**(拡張機能)が使える

#### Clineと異なる部分
- Claudeモデルが優秀
- **Maxプラン**(月100ドル)で、使いきれないほどの使用量がある。（Proプラン(月20ドル)でもそこそこ使える）
- **CLUADE.md**に書かれた規則、目標、設定、プロジェクトの状態などに基づいて行動する
- **カスタムスラッシュコマンド**で、簡単に指示が出来る
- **ターミナル**なので、いくつも起動出来る
- たくさん起動して、協力させることも出来る (指示役と実行役のように)
- ターミナル好きの開発者が喜び庭をかけまわる

必要な機能はすべてあって<font color="red">**実用的**</font>です！
(画像、pdf、markdown、ipynbなどの読み込み)

自分はコードをClaude Codeが書いたコードを見て評価、指示するだけで、<font color="red">**コードを書くことがなくなりました！**</font>

# 何が良くないのか？
- **Windowsで動かない** (WSLかDockerがいる)
- ターミナル嫌いな人は使いづらい
- やっぱり記憶力に欠けると感じる
- **細かな指示を出さないと想像通りに動いてくれない**
- ゲームプレイなどは出来ない。人間のフィードバックが必要

**CLAUDE.md**によってパフォーマンスが全然変わります。

# もっと良くするには？
- **MCP**を使う
    - 動画閲覧
    - ウェブサイトの操作 (クリックなど)
    - Deep Research的な検索
- **カスタムスラッシュコマンド**を作る
    - 良く使うプロンプトをコマンドに出来る
    - gitのコミット、テストの実行、レポートの作成など
- **CLAUDE.md**を超詳しく書く
    - 構造化する
    - 箇条書き使う
    - 指示をとても細かくする
    - 文章が多ければいいわけではない (記憶力の限界がある)
    - <font color="red">**人間が見て分かりやすく書く**</font>

# 向いてること、向いていないこと。
#### pythonを用いた研究　　◎ 超おすすめ
- コーディング、テスト、実行、評価を自動で進めれる
- CLAUDE.md次第では**全自動化可能**
#### Webサイト　　〇 おすすめ
- サーバー周りのことは、パターン化されているため**全投げ**出来る
- フロントエンドも優秀。十分良いグラフィックにしてくれる。
- 通常はWebサイトの閲覧、操作が出来ず、**評価が出来ない**が、**MCP**を使うと何とか出来る
#### ゲーム作成　　△ 微妙
- 可読性が低いプログラムは後々大打撃を与える
- **素材の取得が難しい**。MCPで**画像生成**するなどの手はあるが、APIキーが必要
- **テストプレイが出来ない**。人間によるフィードバックが必要でループしない

# 結論
- AIは**短期的**な作業は**超優秀**
- 記憶力が低く、**長期的**な作業は**苦手**
- そのためCLAUDE.mdで、プロンプトを工夫して、**記憶力を補い**優秀にする
- でもオブジェクト指向が苦手、プログラムは無駄が多く**可読性が低くなりがち**
- なのでそれを修正する人間の力はまだ必要
- それでも十分に<font color="red">**実用的**</font>、エンジニアは全員すべき
実験データを活かす多目的最適化の困難性

実験データを活かして、深層学習でモデル化し、逆解析を行っている。＝モデルベース開発
現在、壁にぶつかっているのは、下表で、？欄に何を入れるか？
単純には、実験レポート２の〇仕様の平均値。結果、評価項目１，２ともに合格するのは１仕様のみ。
評価１，２ともクリアする実験材料を増やしたい。
背反する評価項目が多く、一発で、多目的最適化は甘かった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115450/a614b0c5-7d79-4619-87fa-309b793b3514.png)

？欄に入れるベストは、各実験材料ごとに変えること。
流石に、実験材料ごとに、optunaでブラック最適化を行うには時間が掛かり過ぎる。が、他に案はなく、トライの準備中。TABNETモデルが、３００MB近くあり、１０個は重い。

ちなみに、実際は、
　材料、製造条件、全部で１４０個くらい（変数の数）
 　　各実験レポートごとに条件の数は違う。全レポートを集計すると１４０個くらい。
　評価項目は、１０個以上（多目的最適化の数）
　実験レポートにあるデータ数は、２０個以下(実験レポートとしては普通の話）
 
 データの数＜＜変数の数で、モデル化できるのは、TABNETの凄さ。
 評価項目１０個以上で、optunaで多目的最適化しても、解は求まらなかった。
 （１０個の評価項目をパスする実験仕様は求まらなかった）

その他の困難性
１．この実験レポートの一元化で、挫折するクライアント様が多い。
.watchmanconfig ファイル解説 🕵️‍♀️

:::note info | message
この`.watchmanconfig`ファイルは、Facebookが開発した**Watchman**というツール用の設定ファイルです。Watchmanは、ファイルシステムの変更を効率的に監視し、特定の変更が検出されたときにアクションをトリガーするための高性能なツールです。特に、大規模なコードベースやモノレポ環境での高速なビルドや再起動に役立ちます。⚡
:::

### 📝 ファイルの全体像と目的

通常、`.watchmanconfig`ファイルは非常にシンプルで、空のオブジェクト `{}` であったり、最小限の設定しか含まれていないことが多いです。しかし、その存在自体が重要です。

このファイルは、以下の目的を持っています。

  * **Watchmanの有効化**: このファイルが存在することで、Watchmanは当該ディレクトリ（およびそのサブディレクトリ）を監視対象として認識します。
  * **監視対象のルート指定**: Watchmanデーモンがどのディレクトリから監視を開始すべきかを明確にします。
  * **（オプションで）監視動作の調整**: 特定のファイルやディレクトリを無視するなどの詳細な設定が可能です。

-----

### 🚀 各セクションの詳細解説

#### 1\. **空のオブジェクト `{}` または最小限の設定**

```json
{}
```

  * もし`.watchmanconfig`ファイルの中身が`{}`のように空であっても、その**ファイルの存在自体が重要**です。Watchmanは、このファイルが存在するディレクトリを「監視ルート」として扱います。つまり、このディレクトリ以下のファイルシステムの変更をトラッキングし始めます。👀
  * このシンプルさの背後には、Watchmanの強力な機能が隠されています。設定を細かく記述しなくても、基本的なファイル監視機能は有効になります。

#### 2\. **（高度な設定例）`ignore_dirs` など**

```json
{
  "ignore_dirs": [
    "node_modules",
    "build",
    ".git"
  ]
}
```

  * `ignore_dirs`: Watchmanが監視をスキップするディレクトリのリストを指定できます。これにより、頻繁に変更されるが監視の必要がないディレクトリ（例: ビルド成果物、依存関係がインストールされる`node_modules`）を無視し、監視のオーバーヘッドを減らすことができます。これはパフォーマンスの最適化に非常に役立ちます。🚀
  * 他にも、様々な設定オプションがありますが、一般的な開発ワークフローでは、多くの場合、空のオブジェクトか`ignore_dirs`程度の使用に留まります。

-----

### 💡 Watchman (`.watchmanconfig`) を使用した場合と使用しない場合の比較

Watchmanは、特にReact NativeやMetro Bundler（React Nativeのビルドツール）、Jest（テストフレームワーク）など、ファイル変更に基づいて迅速な再ビルドやテスト実行を必要とする開発環境で非常に重要な役割を果たします。

#### Watchman (`.watchmanconfig`) を使用した場合

```bash
# Watchmanが稼働している状態でファイル変更
# 例: React NativeのJavaScriptファイルを編集
```

:::note info | message
**効果**:

  * **高速なファイル変更検出**: WatchmanはカーネルレベルのAPIなどを活用し、ファイルシステム変更を非常に効率的かつリアルタイムに検出します。これは、従来のポーリング（一定間隔でファイルをチェックする方法）よりもはるかに高速です。⏱️
  * **即座なフィードバック**: ファイルを変更すると、Metro Bundlerやテストランナーがその変更を即座に検知し、アプリケーションのホットリロードや再ビルド、テストの再実行が素早く行われます。これにより、開発サイクルが短縮され、快適な開発体験が得られます。🎉
  * **リソースの節約**: 変更がない限りポーリングを行う必要がないため、CPUやバッテリーなどのシステムリソースの消費を抑えられます。🔋
  * **モノレポでの強み**: 大規模なモノレポではファイル数が膨大になりますが、Watchmanはそのような環境でも効率的な監視を維持できます。
    :::

#### Watchman (`.watchmanconfig`) を使用しない場合（または正しく設定されていない場合）

```bash
# Watchmanが稼働していない状態でファイル変更
# 例: React NativeのJavaScriptファイルを編集
```

:::note alert | message alert
**問題点**:

  * **ファイル変更の検出遅延**: Metro Bundlerなどのツールがファイル変更を検出するために、ポーリングなどの非効率な方法に頼るしかなくなります。これにより、変更がアプリケーションに反映されるまでに時間がかかります。⏳
  * **開発サイクルの遅延**: 少しのコード変更でもアプリケーションの更新に時間がかかるため、開発のフローが中断され、フラストレーションが溜まりやすくなります。😩
  * **システムリソースの消費増大**: 定期的なファイルシステムのポーリングは、CPUサイクルを余分に消費し、特にラップトップのバッテリー寿命に悪影響を与える可能性があります。🔥
  * **開発環境の不安定化**: 特に大きなプロジェクトや多くのファイルがある場合、ファイル監視が非効率だと、ビルドが不安定になったり、期待通りに再ロードされなかったりする問題が発生しやすくなります。⚠️
    :::

-----

結論として、`.watchmanconfig`ファイルは、その内容がたとえ空であっても、モダンなJavaScript開発（特にReact Native）において、開発ワークフローをスムーズかつ高速に保つための縁の下の力持ちのような存在です。このファイルがあることで、開発者はコードの変更が迅速に反映される快適な環境で作業できます。🌈
Watchman とは 🕵️‍♀️ ファイル監視の達人！

:::note info | message
**Watchman（ウォッチマン）** とは、Facebook（現在のMeta）が開発した、**ファイルシステムの変化を高速かつ効率的に監視するサービス（デーモン）** です。ファイルが作成、変更、削除されたことを検知し、その情報に基づいて様々なアクションをトリガーするために使用されます。特に、大規模なコードベースや、開発中に頻繁なファイル変更が発生するプロジェクトで、ビルドプロセスや開発サーバーの応答性を劇的に向上させるために使われます。🚀
:::

### 📝 Watchman の主な特徴と目的

1.  **高速なリアルタイム監視**:
    * Watchmanは、OSが提供するネイティブのファイルシステムイベントAPI（Linuxの`inotify`、macOSの`FSEvents`、Windowsの`ReadDirectoryChangesW`など）を直接利用します。これにより、従来の「ポーリング」（定期的にファイルの状態を確認する方法）よりもはるかに高速かつ効率的に変更を検知します。⏱️
    * 多数のファイルがある大規模なプロジェクトでも、パフォーマンスのオーバーヘッドを最小限に抑えながら動作します。
2.  **永続的な監視（デーモン）**:
    * Watchmanはバックグラウンドでデーモンプロセスとして動作し続けます。これにより、一度監視を開始すれば、開発ツールを再起動しても監視状態が維持され、高速なレスポンスが可能です。🔄
3.  **クロスプラットフォーム対応**:
    * Windows、macOS、Linuxなど、主要なオペレーティングシステムすべてで動作します。💻
4.  **イベントのフィルタリングとクエリ**:
    * 単にファイル変更を通知するだけでなく、特定のパターンに一致するファイルのみを監視したり、特定のディレクトリを無視したり、変更の種類（作成、変更、削除）に基づいてフィルタリングしたりできます。また、ファイルシステムの変更履歴に対してクエリを実行することも可能です。🔍
5.  **信頼性**:
    * ネットワークドライブやファイルシステムが一時的に利用できなくなった場合でも、堅牢に動作するように設計されています。

### 💡 Watchman はなぜ必要とされるのか？

現代のウェブ・モバイル開発、特にJavaScriptエコシステムでは、以下のようなツールやフレームワークが、開発中に頻繁にファイルの変更を監視し、迅速なフィードバックを提供する必要があります。

* **React Native / Metro Bundler**:
    * React Nativeアプリを開発する際、JavaScriptや画像ファイルなどの変更を検知して、アプリにホットリロードやライブリロードを提供します。Watchmanがないと、これらのリロードが遅くなったり、動作しなかったりする可能性があります。📱
* **Jest (テストフレームワーク)**:
    * Jestの「watchモード」では、テスト対象のソースコードやテストファイルが変更されたときに、関連するテストを自動的に再実行します。Watchmanは、この変更検知を高速化します。🧪
* **Webpack / Rollup / Vite などのバンドラー**:
    * 開発サーバー（dev server）モードで、ソースコードの変更を監視し、自動的にリビルドしてブラウザに反映させます（ホットモジュールリプレイスメントなど）。⚙️
* **TypeScript コンパイラ (tsc --watch)**:
    * TypeScriptファイルを監視し、変更があった場合に自動的にJavaScriptに再コンパイルします。
* **ESLint / Prettier (リンター、フォーマッター)**:
    * エディタの統合機能で、ファイルを保存したときにリンティングやフォーマットを自動的に実行するために、ファイル変更を検知する必要があります。

これらのツールは、ファイル変更の検知にWatchmanを利用することで、開発体験を大きく向上させています。ファイル変更からビルド/リロードまでの時間を短縮し、開発者が「待ち時間」を感じることなく、スムーズにコーディングに集中できるようになります。🌈

### 🧐 `.watchmanconfig` と Watchman の関係

前の回答で説明した`.watchmanconfig`ファイルは、Watchmanデーモンに対して、「このディレクトリを監視対象のルートとして追加してほしい」と指示するための目印です。このファイルがプロジェクトのルートディレクトリに存在することで、そのプロジェクトのファイルがWatchmanによって監視されるようになります。

このように、Watchmanは開発プロセスの「見張り役」として、コード変更を素早くキャッチし、関連する開発ツールが適切に反応できるようにする、非常に重要なインフラツールなのです。🕵️‍♀️
Prettierとは？💅✨

:::note info | message
Prettier（プリティア）は、コードのフォーマット（整形）を自動的に行ってくれる「意見の強い（opinionated）」コードフォーマッターです。開発者が書いたコードを、事前に定義された一貫性のあるスタイルに自動で修正し、見た目を統一してくれます。手動でのフォーマット作業から解放され、コードレビューの際にスタイルに関する議論を減らすことができます。🎨
:::

### Prettierの主な特徴とメリット 🚀

1.  **自動フォーマット**: ファイル保存時やコミット時など、様々なタイミングでコードを自動的に整形できます。
2.  **意見が強い (Opinionated)**: ほとんどの設定が固定されており、ユーザーが細かくカスタマイズできる余地は少ないです。これにより、チームやプロジェクト全体で一貫したスタイルを簡単に適用できます。
3.  **多様な言語とエコシステムに対応**: JavaScript (JSX, Flow, TypeScript), CSS (SCSS, Less), HTML, JSON, Markdown, YAML など、多くの言語をサポートしています。
4.  **開発効率の向上**:
      * **手動フォーマットの不要化**: コードを書く際にインデントや改行、引用符の種類などを気にしなくてよくなります。
      * **コードレビューの効率化**: スタイルに関する議論が不要になり、本質的なロジックのレビューに集中できます。
      * **一貫性の確保**: チームメンバー全員が同じスタイルでコードを書くため、可読性が向上し、新しいメンバーもすぐにコードベースに慣れることができます。
5.  **ツールの統合**: VS Codeなどのエディタ、ESLintなどのリンター、Git Hooks（コミット時に自動整形）など、様々な開発ツールと連携できます。

### Prettierのサンプルコードと使用した場合・使用しなかった場合の比較 📊

ここでは、JavaScriptコードの整形を例に、Prettierを使用した場合と使用しなかった場合の比較を見てみましょう。

-----

#### 📌 サンプルコード (Prettierを使用した場合)

**Prettierを適用する前のコード (`src/index.js`):**

```javascript
const my_array = [ 1, 2,  3 ];
function    add(  a,b) { return a+b; }
if(true){
    console.log("hello" );
}
const obj = {
  name:  "Alice",
  age: 30
};
```

**Prettierを適用するためのコマンド:**
`prettier --write src/index.js`

**Prettier適用後のコード (`src/index.js`):**

```javascript
const my_array = [1, 2, 3];
function add(a, b) {
  return a + b;
}
if (true) {
  console.log("hello");
}
const obj = {
  name: "Alice",
  age: 30,
};
```

✨ **注目ポイント:**

  * インデントが2スペースに統一され、一貫したスタイルになりました。
  * 配列の要素や関数の引数周りの不要なスペースが削除されました。
  * `if` 文の条件式の括弧と中括弧の間にスペースが入りました。
  * オブジェクトのプロパティの末尾にカンマが追加されました（trailing comma、設定による）。

-----

#### 📌 Prettierを使用しなかった場合の比較

Prettierのようなフォーマッターを使用しない場合、コードのスタイルは開発者個人の習慣や、プロジェクトで手動で定めたコーディング規約に依存します。

**複数の開発者が各自のスタイルでコードを書いた場合:**

```javascript
// 開発者Aが書いたコード
const my_array = [ 1, 2,  3 ];
function    add(  a,b) { return a+b; }

// 開発者Bが書いたコード
if( true )
{
    console.log("world") ;
}

// 開発者Cが書いたコード
const obj = { name: "Bob", age: 25 };
```

上記のコードは、文法的には全て正しいですが、一貫性がなく、見た目がバラバラです。

:::note alert | message alert
Prettierを使用しないと、複数の開発者が関わるプロジェクトでは、コードのフォーマットがばらばらになりがちです。これにより、コードの可読性が低下したり、コードレビューの際にスタイルに関する無駄な指摘が増えたりする可能性があります。Prettierは、このような課題を自動的に解決し、チーム全体の生産性を向上させる強力なツールです。🚨
:::

Prettierを導入することで、開発者はコードの「書き方」ではなく、コードの「内容」に集中できるようになり、より高品質なソフトウェア開発に貢献できます。👍
レフトフックの設定ファイル解説 🚀

:::note info | message
この`lefthook.yml`ファイルは、Gitのフックを自動化するための設定です。特に、コミット前（`pre-commit`）とコミットメッセージ作成時（`commit-msg`）に特定の処理を実行するように定義されています。🤖
:::

### 📝 `lefthook.yml` の各セクションの解説

#### 1\. `pre-commit`（コミット前フック） 🎣

このセクションでは、コミットが行われる直前に実行されるコマンドを定義します。`parallel: true`なので、定義された各コマンドは並行して実行されます。これにより、複数の処理を同時に行い、時間を節約できます。⏱️

  * **`commands`**: 実行するコマンドのリストです。
      * **`lint`**:

          * `glob: "*.{js,ts,jsx,tsx}"`：このコマンドは、`.js`, `.ts`, `.jsx`, `.tsx` の拡張子を持つファイルに対して実行されます。つまり、JavaScriptやTypeScriptのファイルが対象です。💡
          * `run: npx eslint {staged_files}`：`eslint`を使って、ステージングされている（コミット対象になっている）ファイルをリントします。これにより、コードのスタイルや潜在的なエラーをチェックし、統一されたコード品質を保つことができます。✅
              * **使用した場合**: コードの品質が向上し、チーム全体のコードスタイルが統一されます。リリース後のバグも減らせる可能性があります。
              * **使用しない場合**: コーディングスタイルがバラバラになり、可読性が低下する可能性があります。また、潜在的なエラーが見過ごされ、後でデバッグに時間がかかることがあります。

      * **`types`**:

          * `glob: "*.{js,ts, jsx, tsx}"`：こちらも同様に、JavaScriptやTypeScriptのファイルが対象です。🔍
          * `run: npx tsc`：`tsc`（TypeScriptコンパイラ）を実行し、型チェックを行います。これにより、TypeScriptの型定義に問題がないかを確認し、実行時エラーを防ぎます。🛡️
              * **使用した場合**: 型の不整合によるエラーをコミット前に発見でき、堅牢なアプリケーション開発に繋がります。
              * **使用しない場合**: 型のエラーが実行時まで気づかれず、想定外の挙動やバグの原因となることがあります。

#### 2\. `commit-msg`（コミットメッセージフック） 💬

このセクションでは、コミットメッセージが作成された後に実行されるコマンドを定義します。これも`parallel: true`なので、複数のコマンドがある場合は並行して実行されます。🚀

  * **`commands`**: 実行するコマンドのリストです。
      * **`commitlint`**:
          * `run: npx commitlint --edit`：`commitlint`を使って、コミットメッセージの形式をチェックします。これは、特定のルール（例：Conventional Commits）に従ってコミットメッセージが書かれているかを確認するために使われます。これにより、コミット履歴が読みやすくなり、自動生成ツール（changelogなど）との連携もスムーズになります。📝
              * **使用した場合**: コミットメッセージの品質が統一され、プロジェクトの履歴管理がしやすくなります。後から変更履歴を追う際も非常に便利です。
              * **使用しない場合**: コミットメッセージの形式がバラバラになり、履歴を追うのが困難になったり、自動化ツールの恩恵を受けられなくなったりします。

-----

### 💡 サンプルコードと比較

#### Lefthookを使用しない場合（手動での実行）

:::note alert | message alert
以下の作業は、コミットごとに手動で実行する必要があり、非常に手間がかかります。また、チェックを忘れる可能性もあります。⚠️
:::

```bash
# コミット前に手動でlintを実行
npx eslint .

# コミット前に手動で型チェックを実行
npx tsc

# コミット後、コミットメッセージを確認し、必要であれば修正
# commitlintはコミットメッセージを編集する際に使われるので、手動では少し扱いづらい
# 例: git commit -m "fix: something" してから、手動でcommitlintのルールに沿っているか確認
```

#### Lefthookを使用した場合（自動化）

:::note info | message
`lefthook.yml`を設定することで、以下のコマンドが自動的に実行されます。✨
:::

```bash
# ファイルを変更し、ステージングする
git add .

# コミットを試みる
# これにより、上記lefthook.ymlに設定されたlint, types, commitlintが自動実行される
git commit -m "feat: add new feature"
```

この`git commit`コマンドを実行するだけで、裏で以下の処理が自動的に走ります。

1.  `npx eslint {staged_files}` (linting) ➡️ コードスタイルチェック！
2.  `npx tsc` (type checking) ➡️ 型の整合性チェック！
3.  `npx commitlint --edit` (commit message linting) ➡️ コミットメッセージフォーマットチェック！

:::note info | message
このように、Lefthookを使うことで、開発者はコミット前の手間を大幅に削減し、品質保証プロセスを自動化できます。これにより、開発効率が向上し、チーム全体の生産性も高まります。🚀
:::
ESNextについて 🚀

:::note info | message
ESNext（いーえすねくすと）は、JavaScriptの次期バージョンを指す総称です。毎年新しい仕様がリリースされるECMAScriptの、まだ正式に承認されていない、開発中の機能を指すことが多いです。つまり、将来JavaScriptに実装される可能性のある、新しい構文やAPIなどを指します。✨
:::

ESNextは、JavaScriptをより強力に、より便利にするための進化の最前線と言えますね！ 💪

### ESNextのサンプルコードと使用した場合・使用しなかった場合の比較 💡

ここでは、ESNextの代表的な機能の一つである「Null合体演算子 (Nullish Coalescing Operator) `??`」を例に見てみましょう！

-----

#### 📌 サンプルコード (Null合体演算子 `??` の使用)

```javascript
// 値がnullまたはundefinedの場合にのみデフォルト値を適用
const userName = null;
const displayName = userName ?? "ゲスト"; // userNameがnullなので"ゲスト"が代入される
console.log(displayName); // 出力: ゲスト

const age = 0;
const displayAge = age ?? 18; // ageは0なので0が代入される (0はnullでもundefinedでもない)
console.log(displayAge); // 出力: 0

const country = undefined;
const displayCountry = country ?? "日本"; // countryがundefinedなので"日本"が代入される
console.log(displayCountry); // 出力: 日本
```

-----

#### 📌 Null合体演算子 `??` を使用しない場合の比較

Null合体演算子がない場合、これまでは論理OR演算子 `||` や三項演算子を使用していました。

```javascript
// 論理OR演算子 || を使用した場合
// || は、左辺がfalsyな値（false, 0, "", null, undefined, NaN）の場合に右辺を返すため、
// 0や空文字の場合にも意図せずデフォルト値が適用されてしまう可能性があります。
const userNameOld = null;
const displayNameOld = userNameOld || "ゲスト"; // userNameOldがnullなので"ゲスト"
console.log(displayNameOld); // 出力: ゲスト

const ageOld = 0;
const displayAgeOld = ageOld || 18; // ageOldが0（falsy）なので18が代入されてしまう
console.log(displayAgeOld); // 出力: 18 (意図しない結果)

const countryOld = undefined;
const displayCountryOld = countryOld || "日本"; // countryOldがundefinedなので"日本"
console.log(displayCountryOld); // 出力: 日本

console.log('---');

// 三項演算子を使用した例
const userNameTernary = null;
const displayNameTernary = (userNameTernary !== null && userNameTernary !== undefined) ? userNameTernary : "ゲスト";
console.log(displayNameTernary); // 出力: ゲスト

const ageTernary = 0;
const displayAgeTernary = (ageTernary !== null && ageTernary !== undefined) ? ageTernary : 18;
console.log(displayAgeTernary); // 出力: 0 (これは意図通り)

const countryTernary = undefined;
const displayCountryTernary = (countryTernary !== null && countryTernary !== undefined) ? countryTernary : "日本";
console.log(displayCountryTernary); // 出力: 日本
```

-----

:::note alert | message alert
Null合体演算子 `??` は、`null` または `undefined` の場合にのみデフォルト値を適用するため、`0` や空文字列 `""` のような「falsy」な値でも、それが意図された値である場合には正しく扱えます。一方、論理OR演算子 `||` は、`null` や `undefined` だけでなく、`0` や `""` などもfalsyと見なしてデフォルト値を適用してしまうため、注意が必要です。 ⚠️
:::

このように、ESNextの新しい機能は、コードをより簡潔に、そしてより意図通りに記述できるように進化していますね！これからもJavaScriptの進化に注目していきましょう！ 👀✨
Rustで検索エンジン作ったからコード共有します

## github
https://github.com/lechatthecat/searchengine_by_rust

こちらにコードはアップロード済みです。コードが汚いのはご勘弁…。

## 検索エンジンを作った理由
何か役に立つものをRustで作りたいと思ったんですが、その一方でログイン機能は自作したくありませんでした。

たくさんの人がアカウントを作るとメルアドとか、個人情報が溜まっていきます。個人情報を保持する以上はプライバシーポリシーを作らないといけないし、万が一個人情報が流出してしまえば責任が取れません…。

そこで、人の役に立ちそうで、かつログインしなくても使える検索エンジンを作ろうと思いました。

## 検索エンジンをどう作るか
最初はクローラーなどでウェブサイトを自動巡回させようと思ったんですが、ここで2点気になりました。

- 勝手にクーウラーでサイトを巡回して犯罪にならないのか?
たとえば以前、[岡崎市立中央図書館事件](https://ja.wikipedia.org/wiki/岡崎市立中央図書館事件)という事件で図書館のシステムに対してクローラーを実行した男性が逮捕されています。当然、robot.txtは守るプログラムを書くつもりでしたが、しかし、それだけで本当に訴訟されるようなことがないのかよくわかりませんでした。

- そもそも見境なくURLをクローラーで集めていたら、それを保存するために何百GB,もしかしたら何百テラバイトのストレージが必要になります。サーバーはGCPを使うつもりでしたので、そんな巨大ストレージを使うととんでもない料金を払うことになります。

## ◯◯専用、みたいな検索エンジンに
そこで、見境なく情報を集めるのではなく、なにかジャンルを絞って情報を集めることにしました。

具体的にはStackoverflowみたいなエンジニア向けの情報だけを集めたエンジニア専用検索エンジンにしてはどうかと思いました。

## 情報の取得
Stackoverflow系のサイトのデータは別にクローリングで集める必要はありません。
定期的にこちらにdumpがアップロードされているようです。
https://archive.org/details/stackexchange

また、手続きを踏めばツールやStack exchangeのRest APIでデータを取得することもできます。
https://data.stackexchange.com/

このあたりからデータを取得し、Elasticsearchにデータを保存して、stackoverflowに限らず、stack exchange系のサイトの横断検索を良い精度で提供できれば需要はあるはずです。

## 挫折の理由
- オンプレミスサーバーじゃないと検索エンジンは厳しい

まず、データ自体は別にGoogleからもStack exchangeのツールからも検索できます。
それらを差し置いて私のサイトを使ってもらうにはそれらを上回る価値を提供しないといけません。たとえばより高い検索精度を提供できればいいんですが、残念ながらそれがクラウドサーバーだと難しいことがわかりました。

まずElasticsearchは一度indexを作ってしまうとあとからanalyzerの変更ができません。そのため、analyzerを作り直そうとすると、それまでに蓄積した巨大データの移行が必要です。

これをクラウドサーバでやるとデータを移動するだけでストレージへの書き込みの分お金がかかってしまいます。そのためある程度データが溜まってしまうとなかなかanalyzerのチューニングがやりづらくなってしまい、あまり検索精度の向上ができませんでした。

オンプレミスのほうがそのあたりの自由が聞くと思うのでやはりオンプレミスサーバじゃないと
検索エンジンはキツそうです。
[PoC]Github ActionsとDependabotでライブラリ脆弱性チェックをCIに組み込む

# はじめに
- 基本的に無料で試せます。
- 間違っている部分があれば教えてください。
- 「もっとこうやるといいよ」や「こんなのもあるよ」と教えてもらえると喜びます

## 今回やること
main(default)ブランチへのPRをトリガーにdependabotで脆弱性診断する。
簡単にPoCできるので興味ある人は試してみてください。

:::note warn
defaultブランチじゃないとうまく動作しませんでした
dependency-reviewはデフォルトブランチにある依存関係との差分をチェックするらしい
:::


## 手順
### 適当なgradleプロジェクトを作る
https://start.spring.io/
適当に依存関係をdependenciesに追加しておくとなお良い。

### 適当にgithub リポジトリを作る
こちらも適当でいいが、無料で試したかったのでpublicリポジトリにする。
privateリポジトリでやりたかったら、「GitHub Advanced Security」（有料）が必要になる。
 リポジトリのSetting / Advanced Securityで以下をEnabledにする。
- Dependency graph
- Automatic dependency submission
- Dependabot alerts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/cd091359-e257-441e-99a4-d68a4c79fa67.png)


### プロジェクトのルートディレクトリに .githubディレクトリを作る
### dependabotの設定
.githubディレクトリにdependabot.ymlを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/e40a2ee1-bc01-4f03-9c93-0caaa392a912.png)

内容はこんな感じ

```
# dependabot.yml
version: 2
updates:
  - package-ecosystem: "gradle" # 今回はgradleプロジェクトでやるのでgradle
    directory: "/" # build.gradleがあるディレクトリのパスを入れる　今回はルート
    schedule:
      interval: "daily" # 依存関係の更新をチェックする頻度
    open-pull-requests-limit: 10
    commit-message:
      prefix: "by dependabot:"
    target-branch: "main" # Dependabotが依存関係の更新PRを作る向き先ブランチ
```

### workflow作る
- .githubディレクトリ下にworkflowsディレクトリを作る
- workflowsディレクトリにdependency-review.ymlを作る
内容はこんな感じ
```
# dependency-review.yml
name: 'Dependency Review'

on:
  pull_request:
    branches:
      - 'main' # トリガーになるブランチ

jobs:
  dependency-review:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Dependency Review
        uses: actions/dependency-review-action@v4　# さっき作ったやつ
        with:
          fail-on-severity: low
```
### いざ、実験
- とりあえずmainブランチをpush
- 適当なブランチ（今回はfeature-dependabotというブランチ）を作る
- feature-dependabotブランチで適当に変更を加えてpushする
- main <- feature-dependabotのPRを作る
- dependency-reviewが走ってくれる
- Dependency Reviewステップでdependency-review-actionが走り、脆弱性チェックされる
- PRでこんなのが出てたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/49db93fe-af35-4f7c-8115-95a4aea7a009.png)

### 脆弱性チェックに引っかかってみる
- build.gradleに脆弱性が検知されているライブラリに依存してみる
```
implementation 'org.apache.logging.log4j:log4j-core:2.13.3'
```
こんな具合に脆弱らしい
> Apache Log4jが動作するサーバーにおいて、遠隔の第三者が本脆弱性を悪用する細工したデータを送信することで、任意のコードを実行する可能性があります。

https://www.jpcert.or.jp/at/2021/at210050.html

:::note alert
大丈夫だと思いますが、実サービスには絶対使わないでください。
:::

- 再度feature-dependabotブランチをpushしてmainブランチへのPRを作成
- こんな感じでworkflowがfailして、PRも作られていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/b86ef88d-949d-48d6-a544-9e949f083a0d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/201a3515-f949-4ea7-8735-28579e5f822f.png)
ClaudeCodeをWSLで使うときの初期設定

基本的には[公式](https://docs.anthropic.com/ja/docs/claude-code/getting-started)に脳死で従えばいいですが、ダウンロードしていざClaudeを起動！というタイミングで`Unabled to connect to Anthropic Service`というエラーが発生します。

こちらの[記事](https://github.com/anthropics/claude-code/issues/689#issuecomment-2904282103)の通りに対処すればいいですが、IPV6を無効化する必要はなく、.wslconfigファイルに`networkingMode=mirrored`を記述するだけでOKです。

↓こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372370/2414e29c-22d7-4b21-8908-93cc6e2c67b4.png)
Dockerの基本概念と利点

# Dockerの基本概念と利点

## 1. はじめに

最近Dockerを学んでいて、その基本的な仕組みとメリットについて整理する。
Dockerはコンテナ技術を使ってアプリケーションを動かす環境をパッケージ化するツールで、開発現場での環境差異やデプロイの問題を解決するために広く使われている。

## 2. Dockerの基本概念

Dockerの中核になるのが「イメージ」と「コンテナ」だ。  
- **イメージ**は、アプリケーションの動作に必要なファイルや設定、ソフトウェアの部品がまとまった読み取り専用のテンプレートのようなもの。  
- **コンテナ**は、そのイメージを元に実際に動いているインスタンス。つまり、イメージが設計図で、コンテナはその設計図を使って作った「動く箱」だ。

また、DockerはホストマシンのOSの「カーネル」という部分を直接利用している。  
このカーネルはOSの中核で、ハードウェア資源（CPUやメモリ、ネットワークなど）を管理している。Dockerはこのカーネルを共有しながら、コンテナごとに隔離された環境を作り出している。この仕組みのおかげで、仮想マシンよりも軽量で起動が速い。

コンテナ内部はまるで独立したOSのように振る舞うが、実態はホストのカーネルを使い回しているので、リソースの無駄が少ない。この仕組みを「OSレベルの仮想化」と呼ぶ。

## 3. 仮想マシンとの違い

仮想マシンはホストOSの上で「ハイパーバイザー」と呼ばれるソフトウェアが動き、その上に別のOS（ゲストOS）を丸ごと立ち上げる。ハイパーバイザーは物理ハードウェアと仮想マシンの間に立って資源を割り当てる役割。  
つまり、仮想マシンは「OSを丸ごと仮想化」しているため、起動に時間がかかり、メモリやCPUも多く消費する。

対してDockerはカーネルを共有しているので、OS部分を丸ごと仮想化する必要がない。だから起動が数秒で済み、リソースも軽い。複数のコンテナを同時に動かすのに適している。

## 4. Dockerの利点

Dockerを使うと環境構築が圧倒的に楽になる。アプリの動作環境を「イメージ」という形で保存できるので、同じ環境を誰でも簡単に再現できる。これは環境差異による「動く・動かない」の問題を減らす効果が大きい。

また、コンテナは非常に軽いので、開発やテストのたびに環境を作り直すのが手軽だ。仮想マシンのように起動待ちのストレスが少ない。

さらに、コンテナは小さい単位でサービスを分割して動かすことができる。この考え方を「マイクロサービスアーキテクチャ」という。マイクロサービスは大きなシステムを機能単位に分けて独立して開発・運用するやり方で、Dockerのようなコンテナ技術と相性が良い。

また、CI/CD（継続的インテグレーション／継続的デリバリー）と呼ばれる、自動テストや自動デプロイの仕組みにDockerを組み込むと、環境の差異をなくしたまま素早く確実にリリースができる。

## 5. 代表的なユースケース

チーム開発では、メンバー全員が同じDockerイメージを使うことで環境の違いを気にせずにコードを書ける。  
テスト環境では、コンテナを切り替えて異なるバージョンの依存関係や設定をすぐ試せる。  
本番環境では、複数のコンテナを組み合わせて稼働させることで、サービスの拡張や障害時の切り離しが柔軟に行える。

## 6. まとめ

Dockerは、ホストOSのカーネルを共有しつつ隔離された軽量環境（コンテナ）を作り出す技術で、仮想マシンよりも高速かつ効率的に環境を管理できる。イメージという形で環境を定義し、環境差異の問題を減らせる点が大きな強みだ。

マイクロサービスのような細かく分割されたシステムや、自動化されたCI/CDパイプラインとの相性も良く、現代の開発スタイルにマッチしている。

DockerfileやDocker Composeでの実際の設定や、開発環境と本番環境の差異をなくすテクニックは別途学ぶ必要があるが、まずはこの基礎的な仕組みとメリットを理解することがスタートになる。
Amazon Q CLIで子供の頃好きだったパズルゲーム作った🧩

## Tシャツもらえるキャンペーンが6月末まで延長中
Amazon Q　CLIでゲーム作って応募すると。Tシャツもらえるキャンペーンが延長されていたので、ゲーム作ってみました。

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

## 子供の頃よくやったスライドパズルゲーム

作ったアプリはこんな感じの仕上がり。

![game2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/b1887aae-0c6e-4477-a926-f69c1706d5fb.gif)

[ここから](https://mkdev10.github.io/aws-icon-slidepuzzle/)実際に遊べます。

https://mkdev10.github.io/aws-icon-slidepuzzle/

リポジトリはこちら

https://github.com/mkdev10/aws-icon-slidepuzzle

### ゲームの流れ
ゲームはランダムで出題されるアイコンのスライドパネルを作るところから始まります。

![スクリーンショット 2025-06-22 0.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/d11cda3f-79da-48b6-b551-cee17d619083.png)

作り終わるとアイコンのサービス名を当てるゲームと切り替わります。

![スクリーンショット 2025-06-22 0.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/0beb25c2-538b-445e-8d22-2ffb05b0c983.png)

なんやこのアイコン。。。

![スクリーンショット 2025-06-22 0.05.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831737/2958a5f2-67b4-44f0-b91d-f82072bfe2f6.png)

正解したようです。

結構面白いので[ぜひ遊んでみてください](
https://mkdev10.github.io/aws-icon-slidepuzzle/)。

## プロンプト
```md
ブラウザで動くゲームを作りたい。
ゲームはAWSのサービスアイコンを利用したスライドパズル。
スライドパズルをクリアすると。そのアイコンのサービス名を答える4択問題がでてきて正解するまでの速度を競うゲーム。

ゲームはWebブラウザで動くようにしたいので。
html、javascript、cssのシンプルなものにしたい

アイコンはservice-iconsの中にsvgがあるのでそれをassetの中に集めてそれを参考にするようにしてください。
Svgのアイコン全て利用してください。
```

基本こんな感じ。あとは適当にやりたいことを伝えるだけで完成。

特に面白かったのは、AWSのアイコンセットからサービス名の推測や選択の答えなのど勝手に作ってくれたこと。

## まとめ
CLIが何度かクラッシュしてMacのターミナルが起動しなくなったり焦りましたが。1~2時間で簡単に思い描くゲームをつくれました。こどものころ欲しかったゲームや懐かしいゲームを簡単に作って遊べるのはすごいです。
Laravel 12 の新公開APIについて調べてみた

> **詳細フルリファレンスは自サイトで公開しています**  
> 👉 <https://mikaduki.info/laravel/laravel12-public-api-ref>

---

## この記事でやること
* Laravel 12 に追加された **公開 API 21 本** を **ざっくり** 紹介
* 「これ気になる！」と思ったら **↑ リンク先** で完全サンプル＆検証コードをチェックできるようにする
* 元記事に新機能をTestしたPestコードがあります


## 新 API ダイジェスト

| Tag | API | ひとことで |
| --- | --- | --- |
| 12.1.0 | `Arr::partition()` | 真偽で 2 分割 |
| 12.1.0 | `Context::scope()` | 一時スコープ実行 |
| 12.2.0 | `Context::increment()` / `decrement()` | 数値を ±N |
| 12.4.0 | `Arr::sole()` | 単一ヒット取得 |
| 12.4.0 | `QueueFake::listenersPushed()` | キュー済リスナー数 |
| 12.6.0 | `Rules\Password::appliedRules()` | パスワード制約確認 |
| 12.6.0 | `Model::fillAndInsert()` | 一括 fill→insert |
| 12.6.0 | `Http::failedRequest()` | 直近の失敗取得 |
| 12.8.0 | `Collection::fromJson()` | JSON→Collection |
| 12.10.0 | `Fluent + Conditionable` | when/unless チェイン |
| 12.13.0 | `TestResponse::assertRedirectBack()` | 戻りリダイレクト検証 |
| 12.14.0 | `Context::except()` | 指定キー除外 |
| 12.14.0 | `Context::exceptHidden()` | 隠しキー除外 |
| 12.14.0 | `Arr::from()` | iterable→配列 |
| 12.15.0 | `TestResponse::assertClientError()` | 4xx 検証 |
| 12.15.0 | `TestResponse::assertRedirectToAction()` | アクション遷移検証 |
| 12.16.0 | `Arr::hasAll()` | 全キー存在判定 |
| 12.16.0 | `Rule::contains()` | 配列値包含バリデーション |
| 12.16.0 | `Stringable::toUri()` | URL エンコード |
| 12.19.0 | `TestResponse::assertRedirectBackWithErrors()` | エラー付き戻り検証 |

## 🧩 配列 & 文字列系
```
// Arr::partition — 偶数と奇数に分けるだけで地味に便利
[$even,$odd] = Arr::partition([1,2,3,4], fn($v)=>$v%2===0);

// Arr::sole — 「唯一を取りたい」時の安全版 find()
$user = Arr::sole($users, fn($u)=>$u['id']===42);

// Arr::hasAll — Config チェックの if 連発とおさらば
if (Arr::hasAll($payload, ['name','email'])) {
    // all good
}

// Arr::from — コレクションを即座に生配列へ
Arr::from(collect(['a','b'])); // ['a','b']

// Stringable::toUri — UI で使うとき地味に書きやすい
$url = Str::of('Hello World!')->toUri(); // Hello%20World!
```

配列関数以外も本記事でコード付き紹介してますので、良かったら見に来てください！
👉 <https://mikaduki.info/laravel/laravel12-public-api-ref>
【SAPUI5小ネタ】sapUiTinyMarginEndでちょっとした余白をスマートに調整しよう

## 最初に
SAP FioriアプリのUI調整で、こんなことありませんか？

- ボタン同士が詰まりすぎていて見づらい…
- ちょっとだけ右側に余白を入れたい…

そんなときに便利なのが `sapUiTinyMarginEnd` です。

この記事では、このクラスの用途や使い方、他のマージン系クラスとの違いについて簡単に紹介します。


## ✔️ sapUiTinyMarginEndって何?
このクラスは、右側に8pxの余白を追加してくれるシンプルなCSSユーティリティクラスです。
ボタンやアイコン、テキストのあとに少しだけスペースを空けたいときにぴったり。
```
<Button text="保存" class="sapUiTinyMarginEnd" />
<Button text="キャンセル" />
```
これで「保存」ボタンと「キャンセル」ボタンの間にちょうどよい間隔が生まれます。

## 🤝 “End”って右側？左側？
SAPUI5では多言語対応を前提としているため、Begin や End は言語の表示方向（LTR/RTL）によって自動的に左右が切り替わります。
|表示方向|Begin|End|
|---|---|---|
|LTR（左→右：日本語、英語など）|左|右| 
|RTL（右→左：アラビア語、ヘブライ語など）|右|左|

つまり、sapUiTinyMarginEnd を使えば、言語を問わず自然なUIが実現できるというわけです。

## 🧩 他にもある！マージンバリエーション
UIの間隔を調整したい場面は多いですよね。
SAPUI5ではほかにも以下のようなバリエーションがあります。
|クラス名|サイズ|ピクセル|
|---|---|---|
|sapUiTinyMarginEnd|小|8px|
|sapUiSmallMarginEnd|中|16px|
|sapUiMediumMarginEnd|やや大きめ|32px|
|sapUiLargeMarginEnd|大きい|48px|

用途に応じて使い分けると、ぐっと見やすいUIになります。

## よくあるミス：左右の固定指定
margin-left や margin-right を直接CSSで書いてしまうと、RTL対応が難しくなります。SAPUI5では Begin / End による指定を基本としましょう。

## 👀 まとめ
- sapUiTinyMarginEnd は 右側に8pxの余白を追加するSAPUI5標準クラス
- 見た目を整えるだけでなく、RTL対応にもなる便利な設計
- 他のサイズのクラスと組み合わせて、柔軟にレイアウト調整が可能

ちょっとした余白も、ユーザーの印象に大きく影響します。クラスを正しく使い分けて、スマートな画面づくりをしていきましょう！
超初心者向けGitHub Pagesの使い方まとめ

## はじめに

今回はGithub Pagesの使い方について分かりやすく解説していきたいと思います。
プログラミング初心者の私は初めて言葉を聞いたとき「GIthubって付いているだけで難しそう！」って感じましたけどとても簡単なものなので安心してください。

## Github Pagesとは

Github PagesとはGithubのリポジトリ内に作成したファイルをWebページとして公開できるサービスのことです。
こちらはGithubのアカウントを作成していれば無料で使用することができます。

## Webページの作成方法

ではGithub PagesでWebサイトを公開する手順を見ていきたいと思います。
順番としては
1. Githubアカウントを作成
1. リポジトリの作成
1. ファイルの追加
1. 公開

という流れになります。

### 1.Githubアカウントを作成

まずGithubアカウントを持っていない方はアカウントを作成してください。
[こちらから登録できます](https://github.co.jp/)
![スクリーンショット 2025-06-21 22.51.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086711/01681b53-f1e2-43b4-a082-de1ed35a1195.png)

### 2.リポジトリの作成

次にgithubにリポジトリを作成します。
Githubリポジトリ右上の`New`タブをクリックすると新規のリポジトリを作成することができます。

![スクリーンショット 2025-06-21 23.07.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086711/7a05f7d4-5d4a-452d-870a-a13f847faa64.png)

ここで一点注意点なのですが`Private`ではなく`Public`でリポジトリを作成してください。Privateにしてしまうと作成したWebサイトを公開できなくなってしまいます。

### 3.ファイルの追加

リポジトリが作成できたらその中にWebサイトとして公開するためのファイルを追加します。
ファイルの追加方法は

- Githubリポジトリに直接追加する
- Gitからcommit、pushして追加する

という２つのやり方がありますが今回は簡単なGithubリポジトリに直接追加するやり方を紹介したいと思います。
リポジトリ内の`creating a new file`をクリックして

![スクリーンショット 2025-06-21 23.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086711/2ec3f682-ba54-454a-9fad-0af23729d1d8.png)

今回はindex.htmlファイルを追加します。
ファイルを書き終わったら右上の`Commit changes`を押します。

![スクリーンショット 2025-06-21 23.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086711/2baaad60-e755-4301-a955-0a53118239f0.png)

ファイルの追加ができました。

![スクリーンショット 2025-06-21 23.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086711/0ffdabea-da22-4aaf-b078-2407fa8765f4.png)


必要に応じてcss,js,画像ファイルを追加します。画像は右上の`Add file`→`Upload file`から追加することができます。

![スクリーンショット 2025-06-21 23.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086711/2a161c92-13af-4949-a84f-903abdcd77d6.png)

必要なファイルをすべて追加できました。

### 4.公開

最後にGithub Pagesで公開するための設定を行いましょう。やり方としては上部`Settinng`リンクからメニューの`Pages`を開きます。Branchが`none`になっている場合は`main`に変更し`save`をします。
少し時間を空けてページを更新すると下の画像のように上部にリンクが表示されます。リンクか`Vist site`をクリックすると作成したWebページを表示することができます。

![スクリーンショット 2025-06-21 23.53.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086711/ba239f7b-5877-42a3-88a6-b344b4c242f4.png)

しっかりとWebページが表示されていますね。

![スクリーンショット 2025-06-21 23.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4086711/d4d58d94-1de8-41b4-bc15-4517bb140cf3.png)



### おわりに

いかがだったでしょうか。簡単にWebページを公開できるので皆さんもぜひ試してみてください。
読んでいただきありがとうございました。
JavaScriptの「||」と「? :」の違いをカンタン解説！

## はじめに
JavaScriptを書いていると、こんなコードに出会うことがあります。

```
パターン１
const No = this._Param.No || this.No;
```
一見便利そうなこの書き方。
でも、少し複雑な事情があります。
例えばこんな書き方とも比較されることが多いです。
```
パターン２
const No = this._Param.No !== undefined ? this._Param.No : this.No;
```
両方とも「_Param.No があればそれを使って、なければ this.No を使う」と思いがちですが、実は結果が異なるケースがあるんです。

## 「||」を使った代入：シンプルだけど false や 0 には注意
```
const No = this._Param.No || this.No;
```
この書き方では、this._Param.No が true と評価される値（たとえば文字列や正の数など）であればその値を使います。ただし、次のような値は「値がない」とみなされてしまいます

- false
- 0
- ''（空文字）
- null
- undefined
つまり、ちゃんと意味のある値なのに無視されてしまう可能性があるんです。

### 例：
```
this._Param.No = 0;
const No = this._Param.No || 100; // No は 100 になってしまう！
```

## 「? :」を使った代入：false や 0 もきちんと使える
```
const No = this._Param.No !== undefined ? this._Param.No : this.No;
```
この書き方では、「_Param.No が undefined かどうか」だけを判定します。なので、false, 0, '' などの値もしっかり「ある値」として扱われるのがポイント。
### 例：
```
this._Param.No = 0;
const No = this._Param.No !== undefined ? this._Param.No : 100; // No は 0 のまま、期待通り！
```

## まとめ：どちらを使うべき？
|書き方  |特徴  |向いているケース  |
|---|---|---|
|パターン1|シンプルで短い  |値が false や 0 でも問題ないとき（ざっくりチェック）|
|パターン2|より正確な判定ができる|0 や false を無視せずに使いたいとき|

## 最後にひとこと
false や 0 を正しく扱えるようになると、コードのバグも減って安心感がアップします。用途に応じて適切な構文を選んでいきたいですね！
ABC410Eを解いた【動的計画法】



筆者はレート800前後の茶～緑コーダ

ABC当日にACできなかった問題を解いていく

ABCの問題を解いていく
    
https://atcoder.jp/contests/abc410/tasks/abc410_e


# 実装コード

dp[H][M] でどこまで倒せるか動的計画法する

```python:main.py
from bisect import bisect_left, bisect_right, insort_left, insort_right
from collections import defaultdict, Counter, deque
from functools import reduce, lru_cache
from itertools import product, accumulate, groupby, combinations
import sys
import os
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rdp(): return sys.stdin.readline().rstrip()
def rLdp(): return list(sys.stdin.readline().rstrip().split())
Idp_LOCAL = int(os.getenv("ATCODER", "0"))==0
err = (lambda *args, **kwargs: print(*args, **kwargs, file=sys.stderr)) if Idp_LOCAL else (lambda *args, **kwargs: None)

def main():
    N, H, M= rLI()
    dp = [[0]*(M+2) for _ in range(H+2)]
    AB = [rLI() for _ in range(N)]
    # err(AB)
    for i in range(H+1):
        for j in range(M+1):
            t = dp[i][j]
            if H*M<5000:err(i,j,t)
            dp[i+1][j] = max(dp[i+1][j],t) 
            dp[i][j+1] = max(dp[i][j+1],t) 
            if t < N:
                a,b = AB[t]
                if N<100:err(a,b)
                if i+a<=H: dp[i+a][j] = max(dp[i+a][j],t+1) 
                if j+b<=M: dp[i][j+b] = max(dp[i][j+b],t+1) 
        
        # err(i,len(dp),len(ndp))
    print(dp[H][M])
if __name__ == '__main__':
    main()

```

# 感想

当日はsetを使った動的計画法もどきをやってしまっていた
DP最近実装していなかったので感覚鈍ったなこりゃorz
疑うと理性

疑うことは理性の出発点であり、公民が政府を批判、監督することは、憲法によって保障された権利です。この権利を行使しなければ、それはただの紙切れにすぎません。

一つの塔の真偽さえも見逃さないという思考習慣を持ってはじめて、神の存在を疑う勇気が持てるのだ。-胡適
Vscode 言語モード機能の使い方

## はじめに
Vscodeには、言語モードを自由に選択できる機能があります。
開発で利用する場面は少ないですが、
本記事では言語モードの機能の使い方について記載します。

## 使い方
Vscodeにて、新しいテキストファイルを作成します。
すると、画像のように、テキストファイルの現在の言語が表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245592/a57e3cea-0ba5-4bad-9ac7-c551a75a3025.png)

たとえば、このファイルに少し複雑なSQLを書きたいとします。
たとえば以下のようなSQLです。
```sql
SELECT
    d.department_name,
    COUNT(e.employee_id) AS total_employees,
    AVG(e.salary) AS average_salary,
    MAX(e.salary) AS max_salary,
    MIN(e.salary) AS min_salary
FROM
    employees AS e
JOIN
    departments AS d ON e.department_id = d.department_id
GROUP BY
    d.department_name
HAVING
    AVG(e.salary) > (SELECT AVG(salary) FROM employees)
ORDER BY
    average_salary DESC;
```
これをゼロから書いていく際に、現在のプレーンテキストでは、うまくフォーマットがされず、見づらいSQLとなってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245592/a8c33af2-af8a-4a96-8cdd-674f4b6490c3.png)

これを、「プレーンテキスト」と表示されている言語をクリックし、SQLに切り替えると、SQLのファイルとして認識され、`Shift + Alt + F`コマンドで、書いたSQLをフォーマットすることができます。

サクッとコードを書いて実行したいときは、この機能はとても便利です。

:::note warn
'sql' ファイルのフォーマッタがインストールされていません。
と出た場合は、フォーマッタをインストールしてください
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245592/168244f9-5fb4-41fc-8c45-e6aea3452079.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245592/9911419f-3fa1-44f1-b1cd-a19e8c061bcf.png)

## おわりに
以上、Vscodeの言語モードの使い方の紹介でした。
簡単ですので、みなさんもぜひ使ってみてください
JavaScriptの「ラベル」とは

## JavaScriptの「ラベル」とは？：多重ループを意図通りに制御する「名前」

### ラベルとは？

**ラベル**は、JavaScriptの特定の文（主に`for`や`while`などの**ループ**、または単なる`{}`で囲まれた**コードブロック**）に「**名前（目印）**」を付ける機能です。この名前は、`break`や`continue`と一緒に使うことで、プログラムの処理を特定の場所へ直接ジャンプさせるために使われます。

-----

### なぜラベルを付けるのか？

ラベルを付ける主な理由は、**入れ子になった（多重の）ループを、思い通りに抜け出したり、スキップしたりしたい**からです。

JavaScriptの通常の`break`や`continue`は、**自分が今いる一番内側のループに対してしか効きません。** 外側のループを制御したい場合、ラベルが非常に役立ちます。

-----

### ラベルを使った場合と使わなかった場合の比較

ここでは、2次元の配列から特定の数字（例: `5`）を見つけたら、すぐに全ての探索を終了する例で比較します。

#### 1\. ラベルを使わない場合：内側のループしか制御できない

```javascript
const matrix = [[1, 2], [3, 5]];
const target = 5;

console.log("--- ラベルなしの場合 ---");
for (let i = 0; i < matrix.length; i++) { // 外側のループ
  for (let j = 0; j < matrix[i].length; j++) { // 内側のループ
    if (matrix[i][j] === target) {
      console.log(`見つけた！ (${i}, ${j})`);
      break; // ① break は、内側の j のループだけを抜ける
    }
  }
  // ② break しても、外側の i のループはまだ続く
  console.log(`外側ループの i: ${i} (処理継続)`);
}
console.log("全ての処理が完了。\n");

/* 実行結果:
--- ラベルなしの場合 ---
見つけた！ (1, 1)
外側ループの i: 1 (処理継続) <-- ここがまだ実行される
全ての処理が完了。
*/
**問題点:** `5` を見つけても、外側のループは続き、不要な処理が行われます。
```

#### 2\. ラベルを使った場合：意図した場所へ直接ジャンプできる

```javascript
const matrix = [[1, 2], [3, 5]];
const target = 5;

console.log("--- ラベルありの場合 ---");
searchLoop: // ←これがラベル。外側のループに名前を付ける
for (let i = 0; i < matrix.length; i++) { // 外側のループ
  for (let j = 0; j < matrix[i].length; j++) { // 内側のループ
    if (matrix[i][j] === target) {
      console.log(`見つけた！ (${i}, ${j})`);
      break searchLoop; // ③ ラベル名 'searchLoop' を指定して、外側のループごと抜ける
    }
  }
  // ④ break searchLoop が実行された場合、この行は完全にスキップされる
  console.log(`外側ループの i: ${i} (処理継続)`);
}
console.log("全ての処理が完了。\n");

/* 実行結果:
--- ラベルありの場合 ---
見つけた！ (1, 1)
全ての処理が完了。
*/
**メリット:** `5` を見つけた瞬間に、**全てのループを完全に終了**できます。意図した通りに処理を制御し、無駄なループをなくせます。
```

-----

### まとめ：ラベルは多重ループ制御の「奥の手」

ラベルは、普段のプログラミングではあまり使いませんが、**多重にネストしたループから特定の条件で一気に抜け出したい（`break`）**、あるいは\*\*特定の外側のループの次の繰り返しに進みたい（`continue`）\*\*といった、複雑な制御が必要な場合に非常に有効です。コードを簡潔にし、意図を明確にする強力な手段となります。
【AtCoder】ABC411 振り返り📝


## ABC411 - A 【AC】
[問題はこちら](https://atcoder.jp/contests/abc411/tasks/abc411_a)
最初```>=```を```>```にして提出してしまった…
あるあるだから気をつけよう！
```py
P = input()
L = int(input())

if(len(P) >= L):
    print("Yes")
else:
    print("No")
```

## ABC411 - B 【AC】
[問題はこちら](https://atcoder.jp/contests/abc411/tasks/abc411_b)
なんかﾜﾀﾜﾀしてしまってたけど、len(D)ってNでは？
まあ解けたのでヨシ！
先頭を捨てるのはなかなか良い思いつきだったと思うます。
```py
N = int(input())
D = list(map(int,input().split()))

for i in range(len(D)):
    meter = 0
    distance = []
    for j in range(len(D)):
        meter += D[j]
        distance.append(meter)
    print(*distance)
    D.pop(0)
```

## ABC411 - C 【AC】
[問題はこちら](https://atcoder.jp/contests/abc411/tasks/abc411_c)
わりかし愚直だけどACできた！うれしい！
毎回カウントしてたらTLEするよな～と思っていたところに、前回のカウントの数値の使い道がいい感じに思い浮かびました！
たぶんもうちょっと綺麗な書き方ありそう。でも解けてうれしい！！
```py
N,Q = map(int,input().split())
A = list(map(int,input().split()))

square = ["w"]*N
count = 0

def reverse(num):
    global square
    if(square[num] == "w"):
        square[num] = "b"
    else:
        square[num] = "w"
        
        
for i in range(Q):
    num = A[i]-1
    if(N==1):
        reverse(num)
        print(square.count("b"))
    else:
        if(i==0):
            count = 1
        elif(num==N-1):
            if(square[num-1]=="w" and square[num]=="w"):
                count += 1
            elif(square[num-1]=="w" and square[num]=="b"):
                count -= 1
        elif(num==0):
            if(square[num]=="w" and square[num+1]=="w"):
                count += 1
            elif(square[num]=="b" and square[num+1]=="w"):
                count -= 1
        else:
            if(square[num-1]==square[num] and square[num-1]==square[num+1]): # www bbb の時
                count += 1
            elif(square[num-1]!=square[num] and square[num-1]==square[num+1]): # wbw bwb の時
                count -= 1
        reverse(num)
        print(count)
```

## 今回の感想
今回ひっっっさしぶりにC問題が解けてはっぴ～～！！！
余裕があったのでD問題を覗いてみたら解き方はわかったけどTLEって感じでした。
てかこれ似たような問題最近やらなかったっけ？
私は解き方のロジックはわかっても実行時間がかかりすぎる書き方をしてしまうみたい。
実行時間なんてぜーんぜん考えたことがなかったので、今後はここを鍛えねば…！
仮想ホストから、仮想ゲストのメモリ上昇率を調査する。

# 概要

仮想ホスト上で仮想ゲストを構築・運用するにあたり、仮想ホストのメモリが上昇していたりするパターンがある。
その際に、どの仮想ゲストがどれくらいの使用率を利用しているかを確認するための方法を記載していく。

#  psコマンドの活用
psコマンドを参考にして、仮想ホスト内の使用率を確認していく。

https://qiita.com/dokozon0/items/6ba806a16884b865979d

```
ps -eo pid,ppid,user,%cpu,%mem,vsz,rss,stat,lstart,etime,time,args --sort=-%mem | head -n 10 | column -t
```

Linuxシステム上で実行中のプロセスを、メモリ使用量の多い順に上位10件表示する。

引数の内容はざっくり以下のような形である。


| フィールド    | 意味                       |
| -------- | ------------------------ |
| `pid`    | プロセスID                   |
| `ppid`   | 親プロセスID                  |
| `user`   | 実行ユーザー                   |
| `%cpu`   | CPU使用率                   |
| `%mem`   | メモリ使用率                   |
| `vsz`    | 仮想メモリサイズ（KB）             |
| `rss`    | 常駐セットサイズ（実メモリ使用量, KB）    |
| `stat`   | プロセス状態（例：R=実行中、S=スリープなど） |
| `lstart` | プロセスの起動日時（5フィールド分ある）     |
| `etime`  | 経過時間（起動からの時間）            |
| `time`   | 累積CPU時間                  |
| `args`   | 実行コマンド                   |


# 仮想ゲストのプロセスを検索

仮想ゲスト名がわかるのであれば、以下のコマンドで仮想ホストのプロセス名がわかる。
```
 ps aux --sort=-%mem | head
```

実行結果。これの中に、guest=～～という部分に配当するのが、ゲスト名である。ここでは`vm0176`である。

```
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
qemu 111951 30.1 46.1 72241516 67106320 ? Sl 2023 279169:39 /usr/libexec/qemu-kvm -name guest=vm0176,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-19-vm0176/master-key.aes -machine pc-i440fx-rhel7.6.0,accel=kvm,usb=off,dump-guest-core=off -cpu Cascadelake-Server,ss=on,vmx=on,hypervisor=on,tsc-adjust=on,umip=on,pku=on,md-clear=on,stibp=on,arch-capabilities=on,xsaves=on,ibpb=on,rdctl-no=on,ibrs-all=on,skip-l1dfl-vmentry=on,mds-no=on,tsx-ctrl=on -m 65536 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 3046bc94-312e-4481-9172-639d466c6c1d -display none -no-user-config -nodefaults -chardev socket,id=charmonitor,fd=37,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x2.0x7 -device ich9-usb-中略。
```
こいつのPIDは`111951`で、メモリ使用率は46.1%になっている。

仮想ゲストの詳細を確認する場合は、以下のコマンドでゲストを調査する事ができる。
```
 sudo virsh dominfo ゲスト名
```

# 恒久対策

ゲスト等を、Zabbix等でどのプロセスのメモリ使用率が右肩上がりになっているのかを可視化して見れるようになると発見が容易になる。しかし、それは標準のテンプレートでは実装ができないので、zabbix_senderなどを利用してカスタムする必要があると思われる。

自分が担当していた機器のメモリ使用率の場合では、zabbixのバグによりメモリ使用率に影響が出るようであった。

https://support.zabbix.com/browse/ZBX-17036