OmniAICreator/Qiita-1.07M huggingface dataset:
Expoアプリ構築~EASへデプロイ~Expo Goで使用するまでの流れ

# この記事の概要
https://docs.expo.dev/

1. Expoアプリの初期設定手順（詳細な作り方は除く）
1. ExpoアプリをEAS(Expo Application Services)へデプロイする手順
1. Expo Goで使用できるようにする手順
※筆者の環境ではAndoroid端末を所持していないため、Andoroidでも動作するかは確認できていません。なおiOSを前提としいます。
※"Node.js","npm","Git/GitHub","EASアカウント登録"などの初期設定は各個人で設定済みと想定しています。

# 以下を想定して作っています
- 毎回、Expo Goをメンテナンスする際に調べるのが面倒だったので、将来の自分用の記事
- 作ったExpoアプリを他の人にも使ってもらいたいと思っている人
- AppStoreなどを経由させずに、アプリを公開したいと思っている人

# 手順

## Expoアプリ用のプロジェクトの作成
https://docs.expo.dev/

```:初期設定
npx create-expo-app@latest
```
- このプロンプトを実行し、処理手続きに従って、アプリ名を設定する。

```:開始プロンプト
npx expo start
```
- WebブラウザやExpo Goでアプリが起動・動作することを確認して、自分好みに開発していく。 ※開発に関する詳細は省略

## ExpoアプリをEASへデプロイ
https://docs.expo.dev/build/setup/

- EAS CLIをインストール ※これはEASを操作するためのコマンドラインツール
```:EAS CLIインストール
npm install -g eas-cli
```

- EASへログインする ※登録したEASアカウント（メールアドレス）とパスワードが必要となる

```:ログイン
eas login
```

- プロジェクトをビルド ※iOSやAndoroidで使えるようにビルド
```
eas build:configure
```

- プロジェクト内容をデプロイ（意味合い的にはGitHubのmainブランチへのマージ）
```:デプロイ
eas update
```
初回の場合、ブランチ名を設定する必要があります。例えば"master"や"main"とすれば良い。機能追加下などで、次回以降にあっぷでーｔしたい場合は、そのブランチ先にマージしたりすれば良い。

![スクリーンショット 2025-05-26 14.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/c25eb3cb-b119-46cd-a5f8-5d740efdeb26.png)
iOSやAndoroidのフィンガープリントやURLが表示されれば、完了です。URLをクリックしたり、Webブラウザ上からExpoを開くと、プロジェクトがあります。

## Expo Goアプリで読み込み
https://apps.apple.com/jp/app/expo-go/id982107779

- Expo Goアプリをダウンロード
- EASにあるプロジェクトのQRコードを表示して、iPhoneのカメラで読み込む
- Expo Goアプリが起動し、自分が作成したアプリの動作が確認できれば完了
統計学実践ワークブック2



---

##  1. 累積分布関数（CDF: Cumulative Distribution Function）

### 定義：

確率変数 $X$ に対して、ある値 $x$ 以下となる確率を表す関数。

$$
F(x) = P(X \leq x)
$$

### 離散型の場合：

$$
F(x) = \sum_{x' \le x} p(x')
$$

ここで $p(x')$ は確率関数（probability mass function: PMF）。

### 連続型の場合：

$$
F(x) = \int_{-\infty}^{x} f(t) \, dt
$$

ここで $f(x)$ は確率密度関数（probability density function: PDF）。

---

##  2. 生存関数（Survival Function）

### 定義：

「Xがx以下である確率」に対して、「xより大きい確率」つまり生き残っている確率を表す。

$$
S(x) = P(X > x) = 1 - F(x)
$$

---

##  3. ハザード関数（Hazard Function）

### 定義：

時刻 $x$ で生存している人が、瞬間的に死亡する条件付き確率の極限（瞬間発生率）。

$$
h(x) = \frac{f(x)}{1 - F(x)} = -\frac{d}{dx} \log S(x)
$$

### 意味：

「時刻 $x$ においてまだ死んでいない人が、直後に死ぬ確率の比率」

---

##  4. 同時確率関数（Joint Probability Function）

### 離散型：

2変数 $X, Y$ に対して

$$
p(x, y) = P(X = x, Y = y)
$$

### 連続型：

$$
f(x, y) = \frac{\partial^2}{\partial x \partial y} F(x, y)
$$

累積分布関数 $F(x, y) = P(X \le x, Y \le y)$

---

##  5. 周辺確率（Marginal Probability）

### 離散型：

$$
p_X(x) = \sum_y p(x, y)
$$

### 連続型：

$$
f_X(x) = \int_{-\infty}^{\infty} f(x, y) \, dy
$$

---

##  6. 条件付き確率関数（Conditional Probability Function）

### 離散型：

$$
p_{Y|X}(y|x) = \frac{p(x, y)}{p_X(x)}
$$

### 連続型：

$$
f_{Y|X}(y|x) = \frac{f(x, y)}{f_X(x)}
$$

---

##  7. 条件付き独立（Conditional Independence）

変数 $X, Y$ が変数 $Z$ のもとで条件付き独立であるとは：

$$
f_{X,Y|Z}(x, y | z) = f_{X|Z}(x|z) \cdot f_{Y|Z}(y|z)
$$

---

##  8. 例題：単位円内の一様分布

### 条件：

$(x, y) \in \{(x, y) \mid x^2 + y^2 \le 1\}$

### 同時確率密度関数：

$$
f(x, y) =
\begin{cases}
\frac{1}{\pi}, & \text{if } x^2 + y^2 \le 1 \\
0, & \text{otherwise}
\end{cases}
$$

### 周辺確率密度（X軸）：

$$
f_X(x) = \int_{-\sqrt{1 - x^2}}^{\sqrt{1 - x^2}} \frac{1}{\pi} \, dy = \frac{2\sqrt{1 - x^2}}{\pi}
$$

### 条件付き密度：

$$
f_{Y|X}(y|x) = \frac{1}{2\sqrt{1 - x^2}} \quad \text{on } [-\sqrt{1 - x^2}, \sqrt{1 - x^2}]
$$

---

##  9. 母関数（Generating Functions）

### 確率母関数（PGF: Probability Generating Function）

#### 定義（Xが非負整数値をとる場合）：

$$
G(s) = E[s^X] = \sum_{x=0}^\infty s^x p(x)
$$

* s ∈ 実数、|s| ≤ 1 で収束

#### 微分によるモーメントとの関係：

$$
G'(s) = E[X s^{X - 1}], \quad G''(s) = E[X(X - 1) s^{X - 2}]
$$

* 特に $s = 1$ とすると：

$$
G'(1) = E[X], \quad G''(1) = E[X(X - 1)]
$$

---

##  10. モーメント母関数（MGF: Moment Generating Function）

※本文では言及されていないが、補足として重要：

### 定義：

$$
M(t) = E[e^{tX}]
$$

* 正規分布や指数分布などでよく使用
* $k$ 階のモーメントは微分により得られる：

$$
\mu_k = M^{(k)}(0)
$$

---
統計学実践ワークブック1

## 第1章：事象と確率の基礎まとめ

### 1. 事象と確率の定義

* **事象 (event)** A の起こる確率は $P(A)$ または $\Pr(A)$ で表す。
* **余事象 (complementary event)** Aが起きない事象を $A^c$ と書く。
* **積事象 (A∩B)**：AとBが両方起きる。
* **和事象 (A∪B)**：AまたはBが起きる。
* **空集合**：決して起きない事象（$P(\emptyset) = 0$）
* **全事象**：必ず起きる事象（$P(\Omega) = 1$）

### 2. 排反・包除原理

* 排反：$A \cap B = \emptyset$ のとき $P(A \cup B) = P(A) + P(B)$
* 一般形：$P(A \cup B) = P(A) + P(B) - P(A \cap B)$

#### 【例題】

* 番組A視聴者20名、番組B視聴者15名、両方5名 → AまたはB：$20+15-5 = 30$名 → いずれも見ていない：$50 - 30 = 20$名

### 3. 条件付き確率・独立

* $P(B|A) = \frac{P(A \cap B)}{P(A)}$, ただし $P(A) > 0$
* $P(A \cap B) = P(A) \times P(B|A)$
* **独立**：$P(A \cap B) = P(A) \times P(B)$ ⇔ $P(B|A) = P(B)$

### 4. ベイズの定理

* $P(A|B) = \frac{P(B|A)P(A)}{P(B)}$
* $P(B) = P(B|A)P(A) + P(B|A^c)P(A^c)$ を使うと：
  $P(A|B) = \frac{P(B|A)P(A)}{P(B|A)P(A) + P(B|A^c)P(A^c)}$
* **事前確率**：$P(A)$、**事後確率**：$P(A|B)$
* $\Omega = A_1 \cup A_2 \cup \dots \cup A_k$, $A_i \cap A_j = \emptyset$ において：
  $P(A_i|B) = \frac{P(B|A_i)P(A_i)}{\sum_{j=1}^k P(B|A_j)P(A_j)}$

### 5. 条件付き独立

* $P(A \cap B | C) = P(A|C)P(B|C)$

---

## 第2章：確率変数と統計量

### 1. 離散確率変数

* **確率変数 X**：値がランダムに変動する変数（例：サイコロの目）
* **確率関数**：$p(x) = P(X = x)$
* **期待値（平均値）**：$\mu = E[X] = \sum_x x \cdot p(x)$
* **分散**：$V[X] = E[(X - \mu)^2] = \sum_x (x - \mu)^2 p(x)$
* または：$V[X] = E[X^2] - \mu^2$

### 2. 関数の期待値

* 任意の関数 $g(X)$ に対して：$E[g(X)] = \sum_x g(x)p(x)$

### 3. 連続確率変数

* **確率密度関数**：$f(x) = \lim_{\varepsilon \to 0} \frac{P(x < X < x+\varepsilon)}{\varepsilon}$
* **期待値**：$E[X] = \int_{-\infty}^{\infty} x f(x)dx$
* **分散**：$V[X] = \int_{-\infty}^{\infty} (x - \mu)^2 f(x)dx$

### 4. 確率変数版ベイズの定理

* 分子・分母を確率関数または密度関数で置き換えることでベイズの定理は確率変数にも適用可能。

---
アーティテクチャー（MVC,MVVM)まとめみた Swift 言語（初心者向け🔰）

Swiftでアプリ開発を始めるとよく聞く「アーキテクチャ」。
今回は自分が実際に学習・開発で使ったMVCとMVVMを初心者向けにまとめてみました。
----

1. MVC（Model-View-Controller）
概要

- シンプルで学びやすく、小規模アプリに向いています。

構成
Model：データやビジネスロジック（例：ユーザー情報、計算処理）

View：画面のUI（ボタンやラベルなど）

Controller：ModelとViewの仲介役。Viewの操作に応じてModelを更新したり、Modelの変更をViewに反映させる。

特徴
小規模ならシンプルで使いやすいが、大規模になるとControllerに処理が集中し「Fat Controller問題」と呼ばれる複雑さが発生しやすい

----
2. MVVM（Model-View-ViewModel）
概要
- SwiftUIと相性が良く、ロジックとUIをきれいに分離できる設計パターン。
- 大規模開発にも活かせる

構成
Model：データやビジネスロジック

View：UI表示を担当

ViewModel：ModelとViewの橋渡し役。データの整形やUIの状態管理を行い、Viewが必要とする情報を提供する。

特徴
ViewとModelの結合を弱めることで、コードの再利用性やテストしやすさがアップ

SwiftUIの@Stateや@Publishedなどのデータバインディングと相性抜群


自分が感じたMVVMのメリット
メリット	説明
- UIとロジックの分離	Viewがシンプルで見通しがよい
- 再利用性が高い	ViewModelを別のViewでも使い回せる
- テストしやすい	ViewModelはUIに依存しないので単体テストが楽
- SwiftUIとの親和性	データバインディングでUIが自動更新


----

最後に
MVVMは最初は難しく感じるかもしれませんが、練習すれば必ず慣れます。
自分も最初はアーキテクチャがわからなかったですが、実際にアプリを作ってみて理解が深まりました。

ぜひ自分のペースで挑戦してみてください！🚀


ちなみに実際にMVVMで自分が習った動画教材はこちらです！

（参考にしてみてください🤌）
- https://www.youtube.com/watch?v=wEf1YS4vyW8&list=PLwvDm4VfkdpheGqemblOIA7v3oq0MS30i
初期設定のエクスプローラー見づらい…もっと早めにやってればよかったVSCode（Windsurf）の設定…

こんにちは、こんばんは
2025年でバックエンドエンジニア2年目のiniです。
いまさらですが、すごくストレス解消になった設定などを共有できればと思っています。

初めて、記載するのでご了承ください<(_ _)>
# 早速本題
### もっとエクスプローラー見やすくしたいですよね？
普段Pythonのflaskを使って開発していて、
そのベースとなる環境を作ったときのエクスプローラー
まずこちらを見てください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996816/62d1d957-4c4d-46bd-afbc-76f387e39b27.png)
これ、初期の状態です。
階層が一応深く分かれていて一件デフォルトでもいいじゃんって思うかもですが、
これがフォルダー、ファイルが増えていくとどこの階層なのかわからなくなっていきます。
（もちろんこのまま開発していっても行けるとは思います…）

これを最終的には
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996816/c0701170-8cdc-4509-a271-f7611dd4c470.png)
このようにします。
ならべてみると
![見比べ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996816/9ef17e20-4830-4e8f-8eda-75c48639f0cc.png)


結構わかりやすくなったんじゃないでしょうか？
**やったことをまとめると**
- 階層の幅を広げる
- フォルダの中に一つのフォルダしかなくても階層に分ける
- アイコンを付ける

の3ステップです。

設定と拡張機能に分けて手順を説明していきます。（時間ない！って方は[**結論**](https://qiita.com/FunnyB33/items/99d44fd2765fdace37ee#%E7%B5%90%E8%AB%96%E3%81%93%E3%82%8C%E3%81%A0%E3%81%91%E8%A6%8B%E3%82%8C%E3%81%B0%E5%AE%9F%E8%B3%AA%E3%83%96%E3%83%AD%E3%82%B0%E5%85%A8%E4%BD%93%E3%81%A8%E5%90%8C%E3%81%98)まで飛んでください！）

## 設定でやること
設定をいじるには、 `Ctrl`+`,`で設定画面に行くことができます。
そして基本的に検索フィールドに打ってGUI操作します。
※ 検索フィールドとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996816/4f91a432-a39a-4e68-be4a-9d20402b4d77.png)
この画面の`設定の検索`の場所を指しています
（正しくなかったらすみません。人によっては`検索バー`とかかもしれません）
### 階層の幅を広げる
- 検索フィールドに`tree.indent`と入力して、デフォルト値が`8`なのでそれを`20`～`25`の間の数字に変える。

これで幅が広がります！
> 個人的には20が一番見やすいかなと思ってます。

### フォルダの中に一つのフォルダしかなくても階層分けする
>ここに関しては、好き嫌いあるかもなので何とも言えませんが、
>すべてのフォルダ統一して階層をわけて見やすくするのがいいと思い紹介しています。

- 検索フィールドに`explorer.compactFolders`と入力して、✅をはずす。

これですべてのフォルダが統一して階層を表示するようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996816/76364db6-d7e6-4a41-bbc8-1cb5a95bfd32.png)




## 拡張機能を追加

> 名前: `vscode-icons`
> ID: `vscode-icons-team.vscode-icons`
> 説明: `Icons for Visual Studio Code`
> バージョン: `12.13.0`
> パブリッシャー: `VSCode Icons Team`
> VS Marketplace リンク: https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons

これを追加してください。
>**追加方法**は
左のサイドバー(正式にはプライマリー サイドバーらしいです)にある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996816/9494aec7-1137-43d8-90b5-d8a3f9644be7.png)
このアイコンを押して
vscode-icons と検索してもいいですし上の VS Marketplace のリンクから飛んで追加しても構いません。

アイコンがエクスプローラーで表示されます。
フォルダーに色がついたりするので間違えて開いたりしなくなりました！



## 結論（これだけ見れば実質ブログ全体と同じ…）
読んでくださってる皆さんの時間も有限です。
結論から言いますと
### 設定
1. `Ctrl`+`,`で設定に行きます。（⚙マークでも開けます）
2. 検索フィールドに`tree.indent`と入力して、デフォルト値が`8`なのでそれを`20`～`25`の間の数字に変える。
3. 検索フィールドに`explorer.compactFolders`と入力して、✅をはずす。

### 拡張機能
`vscode-icons`を追加する。

終わりです。
これで作業効率が上がると思います。（思うだけかもですが、個人差…ってことにしておきます。）


※ この記事は基本的にVSCodeをフォーカスして話していますが、VSCodeライクな[**Windsurf**](https://windsurf.com/editor)も同様に設定できますのでぜひ同じように設定してみてください！
GinフレームワークとMySQLを使用した、シンプルなRESTful APIのCRUDプロジェクト

# Gin + MySQL REST API CRUD

Laravel、Express、FastAPI、Flask、Next.js などのフレームワークの経験はありますが、Golang の Gin フレームワークは最近触れ始めたところです。
そこで Gin フレームワークに早く慣れるために、Gin と MySQL を使った RESTful API の CRUD プロジェクトを作成し、GitHub に公開しました。

- Gin は、Go言語で書かれた 高速・軽量なWebフレームワークです。
マイクロサービスやRESTful APIの構築に最適で、Goらしいシンプルさと高性能を両立しています。
ちなみにGinの日本語発音は「ジン」です。

## 🚀 機能

- モール情報のCRUD操作
- Dockerコンテナ化された環境
- MySQLデータベース連携
- RESTful API設計

## 🛠 技術スタック

- Go (Gin Framework)
- MySQL 8.0
- Docker & Docker Compose
- GORM (ORM)

## 📋 必要条件

- Docker
- Docker Compose
- Git

## 🚀 セットアップ手順

1. リポジトリのクローン
```bash
git clone https://github.com/softjapan/gin-rest-api-crud.git
cd gin-rest-api-crud.git
```

2. 環境変数の設定
`.env`ファイルを作成し、以下の内容を設定します：
```env
DB_USER=root
DB_PASS=password
DB_NAME=mydb
DB_HOST=db
```

3. アプリケーションの起動
```bash
docker-compose up --build
```

## 📚 API仕様

### エンドポイント一覧

| メソッド | エンドポイント | 説明 |
|---------|--------------|------|
| GET | /api/malls | モール一覧の取得 |
| POST | /api/malls | 新規モールの登録 |
| PUT | /api/malls/:id | モール情報の更新 |
| DELETE | /api/malls/:id | モールの削除 |

### API使用例

#### 1. モール一覧の取得
```bash
curl -X GET http://localhost:8080/api/malls
```

#### 2. 新規モールの登録
```bash
curl -X POST http://localhost:8080/api/malls \
  -H "Content-Type: application/json" \
  -d '{
    "name": "サンプルモール",
    "address": "東京都渋谷区",
    "phone": "03-1234-5678"
  }'
```

#### 3. モール情報の更新
```bash
curl -X PUT http://localhost:8080/api/malls/1 \
  -H "Content-Type: application/json" \
  -d '{
    "name": "更新されたモール名",
    "address": "東京都新宿区",
    "phone": "03-8765-4321"
  }'
```

#### 4. モールの削除
```bash
curl -X DELETE http://localhost:8080/api/malls/1
```

### レスポンス例

#### 成功時のレスポンス
```json
{
  "id": 1,
  "name": "サンプルモール",
  "address": "東京都渋谷区",
  "phone": "03-1234-5678"
}
```

#### エラー時のレスポンス
```json
{
  "error": "指定されたIDのモールが見つかりません"
}
```

## 🔧 開発環境の構築

1. 依存関係のインストール
```bash
go mod download
```

2. ローカルでの実行
```bash
go run main.go
```

## 📝 ライセンス

MIT

## Github
https://github.com/softjapan/gin-rest-api-crud
Laravel12のミドルウェア 例外処理 検証

前回の記事の続きからの続き。
https://qiita.com/pig_buhi555/items/15594aa216a9deaa6c87

ミドルウェアの例外処理について、個人的なメモとして書いていく。

withExceptionsの箇所に処理を追加している。
# 1. ソース

```laravel12/bootstrap/app.php
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use App\Http\Middleware\AppendMiddleware;
use App\Http\Middleware\CustomEmptyStringsToNull;
use App\Http\Middleware\PrependMiddleware;
use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use App\Exceptions\Handler;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        /*** ここに使用するMiddleware記載 ***/
        /*** php artisan make:middleware ミドルウェア名 で作成 ***/
        // 最初に追加
        $middleware->prepend(PrependMiddleware::class);
        
        // 最後に追加
        $middleware->append(AppendMiddleware::class);
        // デフォルトのミドルウェアの書き換え
        $middleware->replace(ConvertEmptyStringsToNull::class, CustomEmptyStringsToNull::class);

        // ミドルウェア削除(例. PrependMiddleware)
        $middleware->remove(PrependMiddleware::class);
        // PrependMiddlewareは実行されない
        $middleware->prepend(PrependMiddleware::class);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
        $exceptionHandler = new Handler();
        $exceptionHandler->handleExceptions($exceptions);
    })->create();

```

ここでは、前回作成したファイルでthrowを行う。
```laravel12/app/Http/Middleware/AppendMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class AppendMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        throw new NotFoundHttpException();
        logger('AppendMiddleware');
        return $next($request);
    }
}

```

以下のartisanコマンドでHandlerクラスを作成し修正。
```
php artisan make:exception Handler
```

```laravel12/app/Exceptions/Handler.php
<?php

namespace App\Exceptions;

use Exception;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Illuminate\Http\Request;

class Handler extends Exception
{
    public function handleExceptions($exceptions)
    {
        logger('Handler');
        $exceptions->render(function (NotFoundHttpException $e, Request $request) {
            return response()->view('welcome');
        });
    }
}
```

# 2. URLにアクセス
http://localhost:8000/

# 3. ログ
```laravel12/storage/logs/laravel.log
[2025-05-26 07:10:18] local.DEBUG: CustomEmptyStringsToNull  
[2025-05-26 07:10:18] local.DEBUG: Handler  
```

# 4. 参考
ありがとうございました。
https://zenn.dev/dialog_capybara/scraps/d04772c884ed28
Qiitaのはじめかた（アカウント作成）


# Qiitaのはじめかた

はじめまして!
この度、Qiitaにアカウントを登録し、初投稿として、自分の覚書用にアカウント登録方法をまとめました。
どなたかの参考になれば幸いです。

# アカウント登録の流れ
[Qiitaのホームページにアクセス](#Qiitaのホームページにアクセス)
[画面右上の「ユーザに登録」をクリック](#画面右上の「ユーザに登録)
[興味のあるタグやユーザーのフォローを行う](#興味のあるタグやユーザーのフォローを行う)


## Qiitaのホームページにアクセス
1. Qiitaのホームページにアクセスする。
　 →[Qiitaのホームページ](http://qiita.com "Qiita Home")

## 画面右上の「ユーザに登録」をクリック
1. 画面右上の「ユーザー登録」をクリックする。(赤枠内)
![Inkedimage17_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2580785/2a43dbe6-2d4d-a8b6-f6dd-f10eee80e667.jpeg)

2. 選択すると下記のような画面に推移するので、登録する方法を選択する。
<img width="500" alt="image4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2580785/3b86c2f0-ac85-ec90-60fc-05ff9d483c5f.png">


## 興味のあるタグやユーザーのフォローを行う
1. 登録の最後に興味のあるタグやユーザーのフォローを行って完了です。
フォローしたタグはこのようにプロフィールの下の方に表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4097554/fecd031b-2634-4655-be1f-fdce67c15ce3.png)

これで登録は以上です！


今回は、初めての記事投稿として、アカウントの登録方法を記事にさせていただきました。
今後、初心者エンジニアの技術メモとして使っていけたらと思います。

初めての投稿でわかりにくいところもあったかと思いますが、
どなたかの参考になれば幸いです。
Ubuntu 22.04 Bluetooth サウンドすぐ切断される

# サウンドがならないがヘッドセットを使いたい

![Screenshot from 2025-05-26 15-29-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/1862f77d-e952-47e0-8440-6506058a3f8d.png)

- 現状、AlsaやらPulseの設定を弄くってもどうにもならない状態
- このPCではまだ困っていないので、しばらく放置している状態
- 正常な筐体ではマイクとスピーカは両表示されている
- 音声が出ている状態でも内蔵スピーカからは無音
- 外付けスピーカなら音は聞こえる

# ヘッドセット必要

:::note info
参考
- ヘッドフォン端子にイヤホン、マイク端子に外付けスピーカをつけて話が通話不良
  商談ご破産になった経験あり
:::

# alsamixer音がならないので試したこと
## ドライバの入れ替え
- マイクがなくなった・・・

## Bluetoothヘッドセット導入
**接続しても瞬時に切断される**

### 参考にしたサイト

https://askubuntu.com/questions/1331009/bluetooth-on-ubuntu-20-04-constantly-disconnecting

:::note info
結果
- Bluetoothデバイスはすぐに切断されてしまう
- 対応プロファイルは問題ないはず
:::

# 今回改善した手順

1. PipeWireのリポジトリ設定

```Ubuntu:ターミナル画面

sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream

```

2. pipewireのライブラリをインストール  

```Ubuntu:ターミナル画面

sudo apt update
sudo apt install pipewire pipewire-audio-client-libraries

```
3. GStreamer使っているので関連ライブラリをインストール  

```Ubuntu:ターミナル画面

sudo apt install gstreamer1.0-pipewire libpipewire-0.3-{0,dev,modules} libspa-0.2-{bluetooth,dev,jack,modules} pipewire{,-{audio-client-libraries,pulse,media-session,bin,locales,tests}}

```

4. systemctl でリロード

```Ubuntu:ターミナル画面

systemctl --user daemon-reload

```

4. Pulseオーディオを停止

```Ubuntu:ターミナル画面

systemctl --user --now disable pulseaudio.service pulseaudio.socket

```

4. PipeWire　スタート

```Ubuntu:ターミナル画面

systemctl --user --now enable pipewire pipewire-pulse

```

5. 設定が問題なさそうか確認

```Ubuntu:ターミナル画面

~$ pactl info
Server String: /run/user/1000/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 388
Tile Size: 65472
User Name: manyan3
Host Name: manyan3-Thin-GF63-12VE
Server Name: PulseAudio (on PipeWire 0.3.48)
Server Version: 15.0.0
Default Sample Specification: float32le 2ch 48000Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.pci-0000_00_1f.3.analog-stereo
Default Source: alsa_output.pci-0000_00_1f.3.analog-stereo.monitor
Cookie: 1bfe:b994

```

# ペアリングしても切れなくなった

![Screenshot from 2025-05-26 15-27-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/dfce09ad-c292-49da-a9fc-15ab9d7f5bd1.png)

:::note info
インフォメーション
有線買うならとダイソーのBluetooth5.3 ヘッドセットを購入しました
:::
- ヘッドセット越しの音楽鑑賞、通話も問題なくできました。

:::note info
課題
- AIのみなさん曰く、使用中のPCの内蔵スピーカが故障していると言っている。
- この問題が本当か時間があるときに情報収集するつもりです。

:::
Open/Closedな例外処理

# はじめに

Open/Closed原則を守った例外処理について考えてみました。

# 問題

新しい例外が増えるたびにcatch句やif文を追加して対応する

```java
try {
	// 処理
} catch (SqlException e) {
	// ...
} catch (IOException e) {
	// ...
} catch (BusinessLogicException e) {
	// ...
} // 新しい例外が増えるたびに追加
```

# 解決策

Strategyパターンを使う

```java
// 共通インターフェース
public interface ExceptionHandler {
    boolean supports(Throwable cause);
    void handle(Throwable cause);
}

// 具体ハンドラ
public class SqlExceptionHandler implements ExceptionHandler {
    public boolean supports(Throwable cause) {
        return cause instanceof SQLException;
    }
    public void handle(Throwable cause) {
        System.out.println("DB error handled by SqlExceptionHandler");
    }
}

// 具体ハンドラ
public class IoExceptionHandler implements ExceptionHandler {
    public boolean supports(Throwable cause) {
        return cause instanceof IOException;
    }
    public void handle(Throwable cause) {
        System.out.println("IO error handled by IoExceptionHandler");
    }
}

// 例外ハンドラDI
List<ExceptionHandler> handlers = List.of(
    new SqlExceptionHandler(),
    new IoExceptionHandler()
);

// 例外処理
try {
    someService.doTask();
} catch (MyAppException e) {
    Throwable cause = e.getCause();
    handlers.stream()
            .filter(h -> h.supports(cause))
            .findFirst()
            .ifPresentOrElse(
                h -> h.handle(cause),
                () -> System.out.println("Unhandled error: " + cause)
            );
}

```

このようにしておけば、新たに例外を追加する際、

```java
// 新しい例外ハンドラ追加
public class AnotherExceptionHandler implements ExceptionHandler {
	public boolean supports(Throwable cause) {
        return cause instanceof AnotherException;
    }
    public void handle(Throwable cause) {
        System.out.println("Another error handled by AnotherExceptionHandler");
    }
}

// 例外ハンドラDI
List<ExceptionHandler> handlers = List.of(
    new SqlExceptionHandler(),
    new IoExceptionHandler(),
    new AnotherExceptionHandler() // <- 追加
);
```

を追加するだけで済みます。
二分探索を実装してみた

# はじめに
こんにちは、kuwaです。

本記事では、C言語による **二分探索（Binary Search）** のサンプルコードを紹介します。

> ⚠️ 本記事は個人的な学習メモとして作成したものであり、内容に誤りが含まれている可能性があります。参考にされる際はご注意ください。

---

## 二分探索

n個の整数を含む昇順に整列された数列 S と、q 個の異なる整数を含む数列 T が与えられます。
数列 T に含まれる整数のうち、S にも含まれているものの個数 C を求めるプログラムを作成してください。

---

## 入出力仕様

### 入力

1行目：整数 n（数列 S の要素数）
2行目：数列 S（n 個の整数、昇順に整列済み）
3行目：整数 q（数列 T の要素数）
4行目：数列 T（ q 個の異なる整数）
 
### 出力
S に含まれる T の要素の個数 C を1行に出力してください。

---

## 制約
- S の要素は昇順に整列されている
- n≤100,000
- q≤50,000
- 0≤Sの要素≤109
- 0≤Tの要素≤109
- T の要素は互いに異なる


---

## 入出力例

#### 入力例 1
```
5
1 2 3 4 5
3
3 4 1
```
#### 入力例 1 に対する出力
```
3
```

#### 入力例 2
```
3
3 1 2
1
5
```
#### 入力例 2 に対する出力
```
0
```
#### 入力例 3
```
5
1 1 2 2 3
2
1 2
```
#### 入力例 3 に対する出力
```
2
```

## サンプルコード



```c
#include <stdio.h>
#include <stdlib.h>

int binarySearch(int *a, int n, int key) {
    int left = 0;
    int right = n;
    while (left < right) {
        int mid = (left + right) / 2;
        if (a[mid] == key) {
            return mid;
        } else if (key < a[mid]) {
            right = mid;
        } else {
            left = mid + 1;
        }
    }
    return -1;
}

int main(void) {
    int s[100000];
    int t[50000];

    int n, q, i;
    int count = 0;

    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &s[i]);
    }
    scanf("%d", &q);
    for (i = 0; i < q; i++) {
        scanf("%d", &t[i]);
    }

    for (i = 0; i < q; i++) {
        int key = t[i];
        if (binarySearch(s, n, key) != -1) {
            count++;
        }
    }

    printf("%d\n", count);
    return 0;
}

```
Java Spring入門

# Java Spring入門

## はじめに

Spring Frameworkは、Javaアプリケーション開発のための最も人気のあるフレームワークの1つです。この記事では、Spring Frameworkの基本的な概念と使い方について説明します。

## Spring Frameworkとは

Spring Frameworkは、以下のような特徴を持つフレームワークです：

- 依存性注入（DI）による疎結合な設計
- アスペクト指向プログラミング（AOP）のサポート
- 豊富な機能を持つモジュール群
- 高い拡張性と柔軟性

## 主な機能

### 1. 依存性注入（DI）

依存性注入は、オブジェクト間の依存関係を外部から注入する設計パターンです。これにより：

- コードの疎結合化
- テストの容易さ
- 保守性の向上

が実現できます。

### 2. Spring Boot

Spring Bootは、Spring Frameworkをより簡単に使用するためのフレームワークです：

- 自動設定機能
- 組み込みサーバー
- 開発者ツール
- 監視機能

## 基本的な使い方

### プロジェクトの作成

1. Spring Initializrを使用してプロジェクトを作成
2. 必要な依存関係を選択
3. プロジェクトをダウンロード

### 基本的なアプリケーションの作成

```java
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

## まとめ

Spring Frameworkは、エンタープライズアプリケーション開発に必要な機能を提供する強力なフレームワークです。この記事で紹介した基本的な概念を理解することで、より効率的なアプリケーション開発が可能になります。

## 参考資料

- [Spring Framework公式ドキュメント](https://spring.io/projects/spring-framework)
- [Spring Boot公式ドキュメント](https://spring.io/projects/spring-boot)
sshユーザー作成スクリプト

# はじめに
インフラ運用しているとちょこちょこ発生するユーザー作成をスクリプトにしてみました。

# スクリプト概要
このスクリプトは、指定されたユーザー名のLinuxユーザーを作成し、そのユーザーのSSH公開鍵用のディレクトリとファイル（.ssh と authorized_keys）を準備する処理を行っています。

# スクリプト
以下、スクリプトになります。
```bash:createUser.sh
#!/bin/bash

USER_NAME=$1

echo ${USER_NAME}

id ${USER_NAME}
if [ $? -eq 0 ];then
	echo "${USER_NAME} is already exist. Create is skipped."
else
	useradd ${USER_NAME}
	if [ $? -eq 0 ];then
		usermod -aG wheel ${USER_NAME}
	else
		echo "Error: Can't add user."
		exit 1
	fi
fi

if [ -d "/home/${USER_NAME}/.ssh" ];then
	echo ".ssh: This directory is already exist. - /home/${USER_NAME}/.ssh"
else
	echo ".ssh: Create directory."
	mkdir /home/${USER_NAME}/.ssh
	chmod 700 /home/${USER_NAME}/.ssh
fi

if [ -f "/home/${USER_NAME}/.ssh/authorized_keys" ];then
	echo "authorized_keys: This file is already exist. - /home/${USER_NAME}/.ssh/authorized_keys"
else
	echo "Create authorized_keys."
	touch /home/${USER_NAME}/.ssh/authorized_keys
	chmod 600 /home/${USER_NAME}/.ssh/authorized_keys
	chown -R ${USER_NAME} /home/${USER_NAME}/.ssh/
fi

ls -la /home/${USER_NAME}/.ssh/

exit 0
```

# スクリプトの処理概要
スクリプトについてどのような処理を行なっているかを以下で説明します。

## 1. ユーザー名の取得と表示
```bash:bash
USER_NAME=$1
echo ${USER_NAME}
```

- 引数で指定されたユーザー名を **USER_NAME** として取得
- そのユーザー名を表示


## 2. ユーザーの存在確認
```bash:bash
id ${USER_NAME}
if [ $? -eq 0 ];then
    echo "${USER_NAME} is already exist. Create is skipped."
```

- `id` コマンドでユーザーが既に存在するか確認
- 存在していれば「作成をスキップ」と表示して以降の処理をスキップ


## 3. ユーザーの作成とwheelグループへの追加
```bash:bash
useradd ${USER_NAME}
if [ $? -eq 0 ];then
    usermod -aG wheel ${USER_NAME}
```

- ユーザーが存在しない場合、`useradd` で新規作成
- 作成成功時に、*wheel* グループ（sudo 権限を与える）に追加
- 作成失敗時はエラーを出力して終了


## 4. .sshディレクトリの確認と作成
```bash:bash
if [ -d "/home/${USER_NAME}/.ssh" ];then
    echo ".ssh: This directory is already exist."
else
    mkdir /home/${USER_NAME}/.ssh
    chmod 700 /home/${USER_NAME}/.ssh
```

- `/home/ユーザー名/.ssh` が存在するか確認
- 存在しない場合、作成してパーミッションを *700* に設定（所有者のみアクセス可能）


## 5. authorized_keysファイルの確認と作成
```bash:bash
if [ -f "/home/${USER_NAME}/.ssh/authorized_keys" ];then
    echo "authorized_keys: This file is already exist."
else
    touch /home/${USER_NAME}/.ssh/authorized_keys
    chmod 600 /home/${USER_NAME}/.ssh/authorized_keys
    chown -R ${USER_NAME} /home/${USER_NAME}/.ssh/
```

- `authorized_keys` ファイルが存在するか確認
- 存在しない場合、作成し、パーミッションを *600* に設定（所有者のみ読み書き可能）
- ディレクトリごとユーザーに所有権を設定


## 6. ディレクトリ内容の表示と終了
```
ls -la /home/${USER_NAME}/.ssh/
exit 0
```

- .`ssh` ディレクトリの中身を表示
- 正常終了

# authorized_keys の追加
スクリプトではからのファイルを作成しています。
キー情報は利用者個々に用意していただく必要があるので共有してもらった共有キーを上書き保存して完了です。


# おわりに
ちょっとしたことはスクリプト化などで自動化しておくことで作業内容の統一化もできて便利です。
OCIの永久無料枠を踏み台にして自宅サーバを公開する手順

# 1.経緯
学習用にミニPCを購入し、自宅サーバにして公開しようと計画。
↓
Apacheをインストールするも、自宅のマンション回線ではグローバルIPアドレスが割り当てられていなかった。
↓
OCIの永久無料枠を踏み台にして、自宅サーバを公開しよう。
↑今ココ

# 2.作業前提
サーバはRocky Linux9.5、踏み台OCIはOracle Linux7.9は、VPNはTailscaleを使用。
サーバと踏み台OCIはVPNを使って通信可能な状態にあること。
サーバにWebサーバ用のミドルウェアがインストールされており、テストページにアクセスできること。

# 3.作業内容
## OCI側のfirewalldでポートフォワーディングの設定をする
```bash:bash
#Linuxカーネルにパケット転送を許可
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
#内容を反映
sudo sysctl -p
```
```bash:bash
#80番ポートへの通信を許可
sudo firewall-cmd --zone=public　--permanent --add-port=80/tcp
#80番ポートへの通信を転送するよう設定
sudo firewall-cmd --zone=public --permanent --add-forward-port=port=80:proto=tcp:toaddr=[サーバのIPアドレス]:toport=80
#SNAT設定
sudo firewall-cmd --zone=public --add-masquerade --permanent
#設定の読み込み
sudo firewall-cmd --reload
```

マンション回線でもインターネット経由で通信できるのは便利ですね。
ChatGPTが切り開く「大個人」の時代：かつての夢が、今ひとりで叶う

はじめに

ChatGPTに代表される生成AIの登場により、「かつては複数人のチームでしか実現できなかったこと」が、今では個人の手の中に収まり始めています。

Webサイト制作、アプリの試作、ブログ記事の執筆、構成、レビュー、翻訳、さらには簡単なマーケティング戦略まで——これまではデザイナーやエンジニア、ライター、編集者が分業で担っていたような作業が、ツールを組み合わせることで一人でも実現可能になってきました。

この記事では、「保守的で新しいものに乗り遅れがち」と感じていた筆者自身が、ChatGPTというツールを通して「変化を内側から実感した」体験をもとに、これからの“個人”と“技術”の関係について考察します。

⸻

ChatGPTを通して見えた“過去の夢”と“新しい役割”

個人的に、ChatGPTを使っていて最も大きな衝撃だったのは、子供の頃に夢見ていたゲーム制作が、今や一人でも可能になっていると気づいた瞬間でした。

当時は就職氷河期の真っただ中で、ゲームメーカーへの道は事実上閉ざされていました。夢は夢として胸の奥にしまい込み、そのまま年月だけが過ぎていったわけですが——ChatGPTを使ってプロトタイプを作り始めた今、あの頃諦めたはずの夢に現実味が宿ってきています。

加えて、最近感じているのは、「コードを書く力」よりも「構想を描く力」こそが重要になるという点です。GPTがコードを実装してくれるなら、自分は設計者・演出家・ディレクターとして立ち回ればいい。その認識が持てるようになったとき、技術に対する恐れや苦手意識が大きく和らぎました。

このような変化は、ただツールが進化したという話ではなく、個人の役割や可能性そのものを根底から揺さぶる出来事だと感じています。

⸻

「大個人」の時代に必要な力とは

AIによって支援される範囲が広がれば広がるほど、個人に求められる力も変わってきます。
	•	選ぶ力（判断力）：AIが出す提案や選択肢の中から、何を採用するかを決める力
	•	統合力：複数のツールやサービスを組み合わせて目的に応じて使いこなす力
	•	意味づける力（哲学・美意識）：AIには真似できない「人間らしさ」「価値判断」を持つこと

かつてのように「とにかく手を動かせること」が第一の時代から、「自分がどんな世界を作りたいのか」を描き、道具を使いこなす力へとシフトしているのです。

⸻

変化に飲み込まれず、変化に乗る

技術に乗り遅れることへの不安は、多くの人が抱えるものです。筆者自身も、もともと保守的で、新しいものに対して慎重な姿勢が強くありました。

だからこそ、ChatGPTを実際に使って「これは意味がある」と感じられたこと自体が、大きな価値の転換点だったのです。

「自分はこうならないようにしたい」——技術の変化を拒むのではなく、静かに観察し、必要に応じて受け入れていく姿勢こそが、これからの時代を生きる上での柔軟さなのではないでしょうか。

⸻

おわりに

AIは決して魔法の道具ではありません。ですが、私たちが思考し、構想し、判断するための**「知的な相棒」**として、これほど心強い存在はないかもしれません。

一人でゲームをつくり、一人で世界に向けて発信できる時代。

それは決して孤独な時代ではなく、「大個人」が自由に創造できる、新しい可能性に満ちた時代のはじまりなのだと思います。
zabbix7 で web インターフェイスのログインが出来なくなったときのパスワードリセット方法 docker compose 版

# ストーリー
VMware ESXi の中で構築している最中にスナップショットがバグりだし、にっちもさっちも往かなくなって、強制シャットダウンしたら、再起動後に web インターフェイスで登録済みのアカウントでログインできなくなった💦
# 何が起こったんじゃ
postgresql のデータベースファイルの構造破壊があったらしく、docker が再起動時にある程度の復旧を試みてくれたようだが、完全には戻らなかった模様。
# ほいじゃ、実際にどうやったら戻るん？
```cmd:まずは docker の postgresql 動いてるコンテナ目掛けて psql コマンドぶち込む
docker exec -it zabbix-docker-postgres-server-1 psql -h localhost zabbix zabbix
```
```text:SQL コマンド受付プロンプトが出る(筈)
psql (16.6)
Type "help" for help.

zabbix=#
```
https://www.zabbix.com/documentation/7.0/jp/manual/web_interface/password_reset
この SQL コマンド(呪文)を唱えることで、Admin アカウントの初期化が出来る
```text:postgresql じゃなくても MySQL でも文言は同じ模様
UPDATE users SET passwd = '$2a$10$ZXIvHAEP2ZM.dLXTm6uPHOMVlARXX7cqjbhM6Fn0cANzkCQBWpMrS' WHERE username = 'Admin';
```
```text:これが出ればコマンド受付完了
UPDATE 1
```
```text:SQL コマンドラインから抜ける
zabbix=# \q
```
# 結び
docker と postgesql と双方を理解してないから、アンチョコ回答をメモしておくので、小んまい説明は出来ませんYo
【用語解説】カーネルヘッダーとは・・・

## 概要

### 定義
カーネルヘッダーとは、Linuxカーネルと外部プログラムのインターフェースを定義するヘッダーファイル群のこと。
具体的には、C言語で他のプログラムから呼び出せる関数や構造体、定数などの宣言が含まれている。

### 一般的な配置場所
標準的にはカーネルソースツリーの`include/`以下や、ディストリビューションでは、`/usr/src/linux-headers-<バージョン>/include/`のようなディレクトリに配置される。

### 目的
カーネルヘッダーは、カーネルの外にあるユーザースペースのライブラリやアプリケーションがカーネル機能を利用する際に必要不可欠だそう。また、それらをビルドする際も対象のカーネルバージョンに一致したヘッダーが必要となる。


## 参考文献（参照日：2025年5月26日）

https://unix.stackexchange.com/questions/47330/what-exactly-are-linux-kernel-headers

https://stackoverflow.com/questions/76495059/what-are-linux-headers-and-why-do-we-need-them
【備忘録】自作osの作る機能とかmemomemoo

しょうもない　時間かかるけど作るのたのｓ

## 茶番
学校で体育祭があるんですが全員リレーの順番勝手に決められたんですけど
それはいいとしてなぜか自分の前が女子になったんですがなぜか謝れとその周りが切れてる
俺決めてないし謝る理由ないのにくそ

## May'n

### どんなosつくんのか
カルト的で、一度使って便利さがわかるとやめられない消せないosにする

boot ->自作　ほかのosでもつかえるようにするんだze

コマンド-> meowとかのコマンドをするとシステムがmeow.catcmdなるコマンドの動作が書かれたファイルを探して実行メタコードでrootだけなどの制御->新しく.catcmdを追加すればいろいろ無限に拡張できる->乗っ取られて exit.catcmdとかの終了が消されたらオワタ
helpコマンドの内容も .catcmd にして、使い方もメタ情報で書く
これ、普通にUNIX並にいい感じかも(自画自賛)
ほかのcatcmdのコマンドをcatcmdから呼び出せる
再起で永久再起しないようにしなきゃ
ぱっけーじ　

以上　完璧　これにそってos作る　よし、しばらくqiitaに書く内容に困らないな:v:

我ながらいい感じに狂ってるけど倫理的で筋が通ってる。　うんうん

追記〜
OSのスローガン確定！！
🐱 Catnix™：猫吸いと同じくやめられない、消せない、気まぐれ猫OS
やめようとしても再起動してまた戻ってくる

バグっても愛着が勝る

何してくるか分からないけど、それがいい
```
[Boot]        自作ASMで美しく起動
[Kernel]      Cで書いた32bit構造
[Shell]       CatLang専用起動器
[CatLang]     $arg対応、syscall対応、メタ情報付き
[Permissions] root/sudo/su/exit全部ある
[Include]     他スクリプト呼び出しOK
[CatPkg]      疑似パッケージでスクリプト配布可
[IRC]         計画中（または偽装）
[Functions]   仕様設計中（includeベースが現実路線）
[Slogan]      疲れてる
```

bootに色々書いてあるosあるけどあれ何書いてるん意味あるん？

+-----------------------------+
| Catnix (気まぐれ猫OS)       |
| 🐾 Boot msg: やめられないOS |
| 🧠 CatLang with `def()`    |
| 📦 catpkg (疑似OK)          |
| 🧩 include 機能あり         |
| 🛡️  sudo / root / su -      |
| 🔁 スクリプトから関数定義   |
| 🧵 ファイル編集 / パーミッション制御あり |
| 🛰️ IRC実装準備中（真面目） |
+-----------------------------+
こうなった

ブートでスローガン絶叫

自作シェルとスクリプト言語で構成
ついでにゲームも入れる

basicも実装するとして　どうするか->catlangにいれるか

cpuは、過労死するまではたらかせ
自治体システム標準化勉強会「#標どう札幌」に参加して学んだこと

# 勉強会への参加
自治体システム標準化に関わる自治体、ベンダー、その他ステークスホルダーが腹を割って話す勉強会「標どう塾」（※メインは飲み会）に、前回の静岡に続いて参加してきました。この勉強会は、登壇者からの「LT・セッション」、参加者同士の議論を深める「アンカンファレンス」、そしてメインの「飲み会」といった構成です。少人数制で、参加者一人ひとりが主役であるという考えのもと、インプットとアウトプットのバランスが非常に良いと感じております。

# 自分が関わっている領域と必要な知識について
私は、自治体標準化においては、主にネットワーク運用補助者といった立場で関わっています。地方自治体のオンプレミス環境とガバメントクラウド上に構築された標準準拠システムを接続する役割となりますが、自治体標準化といった大きな枠組みで見た際には関わっている箇所はほんの一部分になります。

![hyu01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/56262d90-2827-4bcf-9c9b-c0ab881371e0.png)

とはいえ、プロジェクトを円滑に進めるには、他の領域の知識もある程度必要です。本記事では、自分が関わっている領域を中心に大きく以下のように整理しました。（多くの観点や領域が存在すると思いますが、下記以降の説明のために簡略化した考えとなります。）

![hyu02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/3ec75423-b4cd-433e-b33a-4b8caa7a23ab.png)


* ①標準化プロジェクト全体に必要な知識（全体方針・ルール・方向性など）
* ②インフラ・ネットワーク領域の専門知識（自分が主に担当している範囲）
* ③業務システム側の知識（他部署や他社が担当）

①について理解した上で②の自分の専門領域を完璧にしつつ、連携する③の分野の知識を付けていく必要があると感じています。②の領域は自分の専門でもあり、比較的自力で理解を進められますが、①や③については、一人での学習には限界があると感じています。①については、標準化に関する大量のドキュメントを読み解き、背景やルール、今後の方向性などを理解する必要がありますし、③のようにこれまで自分が関わってこなかった業務システム側については、他の方の話を聞くことでしか得られない知見も多く、意識的に学びを深めていく必要性を感じています。

## セッションで学んだこと

今回のセッションでは、ガバメントクラウドに関するデータ主権の課題や、CSP側の大規模障害に関する話がありました。これらは主に①にあたる内容で、自分にとって大きな学びがありました。すぐに業務に直結する話ではないかもしれませんが、ガバメントクラウドの方向性は政治判断などで変化する可能性があるため、リスクとして把握しておくべきだと感じました。こうした現場の最前線で実際にガバメントクラウド導入に携わっている方々から話を聞ける機会は非常に貴重であり、とても有意義な時間でした。

## LTで発表した内容
他の方のLTからは、内容・切り口・プレゼン方法など多くの学びがありました。私自身のLTでは、「社内での標準化勉強会の実施」について発表しました。前回参加した「標どう静岡」をきっかけに、社内で標準化に関する勉強会を始めたという取り組みです。この活動は、上記③の知識補完にもつながるものと考えています。詳細は下記の記事にもまとめています。

https://qiita.com/infra365/items/c5671e988402d87945f4


## アンカンファレンスで議論した内容
「人材育成」をテーマに、参加者と議論を行いました。どの組織でも中心となる人が意欲的に取り組んでいますが、自治体のように人事異動が頻繁に発生する現場では、担当者が変わるたびに知識の引き継ぎが課題になります。自治体側、ベンダー側ともに標準化を継続的に推進できる人を増やしていく必要性はあります。明確な解決策はありませんが、参加者からは「やる気のある人を募って巻き込む」という意見をいただきました。

* 「システムを理解して、自分の業務を楽にしたい」
* 「システムが好きだからやってみたい」

もしかしたら、こうしたモチベーションを持つ人たちが、まだ表に出ていないだけで社内にいるかもしれません。私自身も、AWSに触れる楽しさをもっと社内に広めたいと考えています。一方で、「AWSができるようになった人が、もっとモダンな分野に移ってしまい、公共領域に留まりにくいのでは」という意見もあります。だからこそ、公共ITの面白さを伝える活動も重要であると感じています。最近ガバメントクラウド関連では明るい話題は少ないですが、「標どう塾」「Gov-JAWS」「自治体クラウド勉強会」などといった公共分野の勉強会の取り組みは、非常に良い取り組みであると感じています。

# 最後に

実際に顔をあわせて、貴重な話が聞けたり、現場レベルの悩み相談などが出来る機会は多くはありません。標どう塾を企画してくださった方、運営の方、発表で話を聞かしていただいているから、飲み会などで色々お話をさせていただく方には非常に感謝しております。
apt-get upgrade中にSub-process /usr/bin/dpkg returned an error code (1)というエラーが出たが....しかし....。

## 該当エラー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/3dab0f79-e11d-4f62-9c01-dc1da5d9d1a3.png)

### `Sub-process /usr/bin/dpkg returned an error code (1)`の意味

**何が起きているか**
・`dpkg`（debian系のパッケージを管理するエンジン）が途中で止まってしまい正常に終了できなかった。
・例で出ていたパッケージ名は`iodine`。このパッケージのインストール(?)時に何らかの問題が起きて処理が中断した。

**一般的に原因として考えられる理由**
・インストール中のスクリプトで失敗。
・依存関係が壊れている。←多分今回はこれっぽい。
・ディスク容量不足。

:::note info
ここでは indineというdnsサーバーを介してIPv4データをトンネリングできるソフトウェアが原因となっていた。
https://www.kali.org/tools/iodine/
:::

### `E: パッケージ 'linux-headers-5.16.0-kali7-amd64' が見つかりません`の意味。
**何が起きているか**
・今動いているカーネルのバージョンに合わせた「開発用ヘッダー（ソースコードの一部）」をインストールしようとしたが、リポジトリ内に同じバージョンのパッケージが存在しなかったというエラー。

**一般的に原因として考えられる理由**
・リポジトリ情報が古いor不足　←多分今回はこれっぽい。（`apt update`で成功）
・実行中カーネルとリポジトリのミスマッチ
→例えばカーネルだけアップグレード済み。ヘッダーは古いリポジトリにしかまだ反映されていない場合。
・特殊ビルドのカーネル
→Kali linux独自のパッケージネーミング（kali7のような識別子）がリポジトリに揃っていない場合。

### 結局解決しなかった・・・（やったことをそのまま記録する...。）

```
# 未設定パッケージの設定を再実行
sudo dpkg --configure -a

# 途中で壊れた依存関係を自動で直す
sudo apt --fix-broken install
```
ここでまた`iodine`が原因で止まってしまった。
```
sudo apt remove --purge iodine
sudo apt --fix-broken install
```
これで一回依存関係を削除＆復旧した
次にリポジトリ更新&カーネルのアップグレードをすることに
```
sudo apt update
```
ここまでは順調
```
# システムを最新カーネル含め丸ごとアップグレード
sudo apt full-upgrade -y
```
ここで悲劇が....
スクショはないが、またSub-process /usr/bin/dpkg returned an error code (1)というエラーが出た。
これは入れ直したほうが早いのでは...という結論になった。

またこのサイトを見て再構築しなおすことに・・・

https://www.kali.org/get-kali/#kali-virtual-machines

↑で大人しく最新版をDLする...。

https://qiita.com/TAKANEKOMACHI/items/428f47999c834656eb64


:::note info
カーネルヘッダーについての学習は別の記事でまとめた。

https://qiita.com/ettottooo/items/6f2fa2392f19265db7da

:::

## 参考文献（参照日2025年5月26日）

https://qiita.com/RUrushi/items/71343f3832421c5e3e3b

https://www.kali.org/blog/advanced-package-management-in-kali-linux/

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1411760239
音楽とPythonの融合 ― 創作・解析・AI活用カリキュラム



## 第1章: 音楽とPythonの出会い

* 音名と周波数の変換

  * 音名↔周波数の関数化
  * 音後の比較分析: 平均徳、純正徳、ピタゴラス徳

* 音階とモードの生成

  * 主要/从後/合成/歌調等
  * 各音階に基づいたスケールパターン生成

---

## 第2章: music21による楽曲解析と可視化

* 楽譜構造の理解 (Part, Measure, Note, Chord)
* 音符の分析: 調性検出, 転調判定, ローマ数学表示
* 楽譜の表示/書き出し: MIDI, MusicXML, MuseScore

---

## 第3章: 音響信号処理 (librosa)

* 音声ファイルの読込み: 波形, スペクトルグラム
* 特徴量抽出: chroma, MFCC, ピッチ, テンポ
* music21と統合したコード上の表示

---

## 第4章: MIDIキーボードとPython

* `mido`, `pygame.midi`を使った実況デバイス接続
* 入力ノートの実施検出, 音階/コード表示
* 入力メロディの記述化, 楽譜化

---

## 第5章: 自然言語処理と音楽

* 歌詞の解析: MeCab, spaCy を用いた文章構造分析
* 感情分析と音楽構造の連携
* GPTを使った自動歌詞生成、対応メロディの生成

---

## 第6章: 機械学習と音楽

* 特徴量抽出: 音高, 音範囲, リズム密度, n-gram
* 分類: 作曲者識別, ジャンル判定, 調性推定
* クラスタリング: K-means, DBSCAN による作風分類



---

## MIDIの技術解説

* MIDIメッセージのバイト構造, ノート番号と音名
* 基本イベント (Note On/Off, Control Change, Program Change)
* SMF構造: ヘッダチャンク、トラックチャンク
* Pythonとmido, pretty\_midi での解析コード
C言語で線形探索を実装してみた

# はじめに
こんにちは、kuwaです。

本記事では、C言語による **線形探索（Linear Search）** のサンプルコードを紹介します。

> ⚠️ 本記事は個人的な学習メモとして作成したものであり、内容に誤りが含まれている可能性があります。参考にされる際はご注意ください。

---

## 線形探索

n 個の整数を含む数列 `S` と、q 個の異なる整数を含む数列 `T` が与えられます。  
`T` に含まれる整数のうち、`S` にも含まれているものの個数 `C` を出力するプログラムを作成してください。

---

## 入出力仕様

### 入力


1行目：整数 `n`（`S` の要素数）  
2行目：数列 `S`（`n` 個の整数）  
3行目：整数 `q`（`T` の要素数）  
4行目：数列 `T`（`q` 個の異なる整数）


### 出力
`S` に含まれる `T` の要素の個数 `C` を 1 行で出力してください。

---


## 制約
- `n ≤ 10,000`
- `q ≤ 500`
- `0 ≤ S の各要素 ≤ 10^9`
- `0 ≤ T の各要素 ≤ 10^9`
- `T` の要素はすべて異なる


---

## 入出力例

#### 入力例 1
```
5
1 2 3 4 5
3
3 4 1
```
#### 入力例 1 に対する出力
```
3
```

#### 入力例 2
```
3
3 1 2
1
5
```
#### 入力例 2 に対する出力
```
0
```
#### 入力例 3
```
5
1 1 2 2 3
2
1 2
```
#### 入力例 3 に対する出力
```
2
```

## サンプルコード



```c
#include <stdio.h>

int linearSearch(int *a, int n, int key) {
    int i = 0;
    a[n] = key;  // 番兵を配列の末尾にセット（ここは配列のサイズが n+1 必須）
    while (a[i] != key) {
        i++;
    }
    if (i == n) {
        return 0;  // 番兵に到達したので見つからなかった
    }
    return 1;      // 見つかった
}

int main(void) {
    int s[10001];  // n が最大10000なので、+1 で番兵分確保
    int t[500];
    int n, q;
    int count = 0;

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &s[i]);
    }

    scanf("%d", &q);
    for (int i = 0; i < q; i++) {
        scanf("%d", &t[i]);
    }

    for (int i = 0; i < q; i++) {
        if (linearSearch(s, n, t[i])) {
            count++;
        }
    }

    printf("%d\n", count);
    return 0;
}


```
入緑しました！！

# はじめに
はじめまして！　tyokousagiと申します
競技プログラミングを始めてから10ヶ月で入緑できたので入茶と入緑についての記事を書いてみようと思います

# 入茶まで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671894/4a082444-8119-4f29-a3d3-d0b83c971b07.png)
レート遷移です
去年の９月から始めて今年の２月に入茶しました
入茶までにしたことはあまり覚えていませんが、鉄則本をやったり、C問題を解いたりしていました
鉄則本は二次元累積和のところで躓いてからやらなくなりましたが...
茶色になるためには計算量を意識する必要のある問題を解いていかないといけないので
C問題を解いていっていました
これをしたことによりABC391で茶色になることが出来ました

# 入茶から入緑まで
今年の２月から茶色になったので緑色になるのは約４ヶ月位で入緑できました
入緑までにしたことは鉄則本を進めることとNoviStepsの1Q,2Qをしていました
特にNoviStepsを使い始めたのには大きな意味がありました
そのおかげで、最近のABCではほとんどの2Qを解けるようになり、結果としてレートも安定してきました
入緑したABC407ではコンテスト中に初めて1Qが解けて、崖だったこともあり
水パフォが取れて入緑できました

# これから
最近JOIの本選(セミファイナル)がオンサイトで開催されることになりました
色々言われていますが、自分はオンサイトになるのを楽しみにしていたので絶対に二次予選を突破して本選に行きたいと思っています
本選に行くためにも１０月までに水色になりたいです
今年は受験もありますが勉強と競プロをがんばっていきたいです
システムアプリをアンインストール後インストールできなくなった

## やりたかったこと
インストール済みapkより古いapkを入れたかった

## 問題
システムアプリをアンインストール後インストールできなくなった

## やったこと
1 . システムアプリをアンインストール
```
$ adb shell pm uninstall -k --user 0 <package>
```
2 . インストール済みパッケージの確認 → 1でuninstallしたpackageがないことを確認OK
```
$ adb shell pm list packages
```
3 . システムアプリをシステム領域にインストール
```
$ adb shell
$ push YourApp.apk /sdcard/
$ su
# mount -o rw,remount /system
# cp /sdcard/YourApp.apk /system/priv-app/YourApp
# chmod 644 /system/priv-app/YourApp/YourApp.apk
# reboot
```
4 . インストール済みパッケージの確認 → インストールしたはずのpackageがない🥶💧💧

## 解決策
アプリの有効化
```
adb shell cmd package install-existing <package>
```

## 解説
`uninstall --user 0`は、システムアプリをアンインストールするのではなく、無効にするコマンドだった
アプリ本体（APK）は /system に存在し続けているが`pm list packages`などで見えなくなっていただけだった
`install-existing`で、存在しているシステムアプリを有効化（再登録） した

## 参考
- [[要root化] androidでシステムアプリとしてinstallする方法](https://qiita.com/htano/items/75fb3f620c32fbb8a7ab)
日本語 Comparer

# Comparer_jp
日本語を比較(ソート)するための Comparer クラスと
static なメソッド Compare() です
string.Compare() の代わりに Comparer_jp.Compare() を使用します

```c#:Comparer_jp.cs
using System.Globalization;

namespace System.Text
{
    public sealed class Comparer_jp : IComparer<string>
    {
        public readonly CompareOptions options;

        public readonly CompareInfo compare_info;

        public Comparer_jp(bool ignorecase = false)
        {
            options = CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType;

            if (ignorecase)
            {
                options |= CompareOptions.IgnoreCase;
            }

            var ci = new CultureInfo("ja-JP");

            compare_info = ci.CompareInfo;
        }

        public int Compare(string? s1, string? s2)
        {
            return compare_info.Compare(s1, s2, options);
        }

        public readonly static Comparer_jp comparer = new Comparer_jp();
        public readonly static Comparer_jp comparer_ignorecase = new Comparer_jp(true);

        public static int Compare(string? s1, string? s2, bool ignorecase = false)
        {
            if (ignorecase)
            {
                return comparer_ignorecase.Compare(s1, s2);
            }
            else
            {
                return comparer.Compare(s1, s2);
            }
        }
    }
}
```
新卒就活どう違う？アジア2国のリアルな就職事情📝

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title></title>
  <style>
    body { font-family: 'Segoe UI', sans-serif; padding: 20px; background: #f9f9f9; color: #333; }
    h1, h2 { color: #2c3e50; }
    h3 { color: #27ae60; margin-top: 30px; }
    table { width: 100%; border-collapse: collapse; margin: 20px 0; }
    th, td { border: 1px solid #ccc; padding: 10px; text-align: left; }
    th { background: #eeeeee; }
    ul { margin-left: 20px; }
    .highlight { color: #e74c3c; font-weight: bold; }
  </style>
</head>
<body>

<h1>日本と韓国の「就活」を徹底比較！</h1>
<h2>〜 同じアジアでもこんなに違う！？ 〜</h2>

<li> みなさん、こんにちは！ 韓国在住のsanaです:girl_tone1:<li>

<li> 近年韓流ブームが「流行」から「文化」に変わり韓国に関心のない層でも日常の一部に韓国がある人も少なくないと思います。<li>

（ちなみに韓国には日本風の居酒屋やカフェができたり、お店でJ-POPが流れることがすごく多いです:eyes:）

<li>IT業界だけでなく様々な分野でも韓国就職を目指す方が増加していると思います！
そこで今回は韓国就職を目指す方のために日本就職の現状と比較してまとめてみました！<li>

最後まで見てくださると嬉しいです:ok_woman_tone1:


<h2>📋 簡単！丸わかり比較表</h2>
<table>
  <tr>
    <th>項目</th>
    <th>日本</th>
    <th>韓国</th>
  </tr>
  <tr>
    <td>🎓 対象</td>
    <td>新卒一括採用が中心</td>
    <td>新卒＋若手中途どちらも重視</td>
  </tr>
  <tr>
    <td>📅 就活時期</td>
    <td>大学3年3月〜4年夏がピーク</td>
    <td>大学4年後半〜卒業後に本格化</td>
  </tr>
  <tr>
    <td>📄 応募書類</td>
    <td>エントリーシート・履歴書</td>
    <td>自己紹介書＋履歴書</td>
  </tr>
  <tr>
    <td>📢 採用方式</td>
    <td>合同説明会・リクルーター等</td>
    <td>公採と随時採用 併用</td>
  </tr>
  <tr>
    <td>📈 選考過程</td>
    <td>SPI＋面接（複数回）</td>
    <td>AI面接＋性格検査＋面接（基本1〜2回）</td>
  </tr>
  <tr>
    <td>✨ 評価ポイント</td>
    <td>協調性・志望動機・ガクチカ</td>
    <td>スキル・TOEIC・インターン経験</td>
  </tr>
  <tr>
    <td>💼 人気業界</td>
    <td>メーカー・インフラ・公務員</td>
    <td>財閥系・IT・スタートアップ</td>
  </tr>
  <tr>
    <td>📋 就活サイト</td>
    <td>リクナビ・マイナビ等</td>
    <td>JOBコリア・サラミンなど</td>
  </tr>
</table>

<h2>📐 詳細ポイント比較</h2>
<h3>🇯🇵 日本：「就社文化」</h3>
<ul>
  <li>どの会社に入るかが重視される</li>
  <li>配属先は入社後に決定</li>
  <li>新卒一括で“会社に育ててもらう”風土</li>
</ul>

<h3>🇰🇷 韓国：「即戦力文化」</h3>
<ul>
  <li>職務別採用が一般的</li>
  <li>スペック（学歴・TOEIC・資格・インターン歴）重視</li>
  <li>随時採用が主流に移行中</li>


//

  
  韓国の大学に通いながら日本の就活の少ししていたのですが、日本は就活の準備が早い...。　完全に出遅れた人でした（笑）

  韓国でも一年生の時からインターンやサポーターズ活動に積極的に取り組みながらスペックを積んでいくのですが、ほとんどの人は大学を卒業して一年～程 資格などの準備を得て就職する人がほとんどです！

経歴のある新人という言葉があるほど、実力重視な韓国。。　
（経歴のある新人は新人ではないんじゃないかと思いますが）

自分のタイミングで就活ができるので、周りと比較することなく就活できるのがいいと思う反面、「同期」という存在があまりないので一緒に切磋琢磨できる同期がいる日本の就職システムもいいなと思ったりもします:grinning:
  
</ul>

<h2>🌟 韓国で就活するなら？</h2>
<ul>
  <li>自己紹介書は必須（志望動機・価値観など）</li>
  <li>AI面接に慣れておくと◎（表情・声・姿勢が評価される）</li>
  <li>TOEICスコアは750〜900点以上が目安</li>
  <li>韓国語能力試験TOPIK５級以上あるとビジネス韓国語で有利</li>
</ul>

<p class="highlight">👉 韓国就職に挑戦してみたい方、まずは文化や就活スタイルの違いを知ることから始めましょう！</p>

</body>
</html>
プロセススケジューリングを実装してみた（ラウンドロビン方式）

# はじめに
こんにちは、kuwaです。

本記事では、C言語による **キューを使ったラウンドロビンスケジューリングのシュミレーション** のサンプルコードを紹介します。

> ⚠️ 本記事は個人的な学習メモとして作成したものであり、内容に誤りが含まれている可能性があります。参考にされる際はご注意ください。


## キューとラウンドロビンスケジューリング

**ラウンドロビンスケジューリング** は、OSのCPUスケジューリングなどで用いられる方式で、すべてのプロセスに公平にCPU時間を割り当てる方法です。

各プロセスには最大 `q` ミリ秒（**クオンタム**）の処理時間が与えられ、処理が終わらなければ再び待ち行列の末尾に追加されます。

### 例：

クオンタム `q = 100` のとき、以下のようなキューがあったとします：
``` 
A(150) - B(80) - C(200) - D(200)
```

- A を 100ms 処理 → A(残り50) を末尾に追加  
- B を 80ms 処理 → 終了（時刻 180ms）  
- C を 100ms 処理 → C(残り100) を末尾に追加  
- D を 100ms 処理 → D(残り100) を末尾に追加  
- A を 50ms 処理 → 終了（時刻 450ms）  
…というように、すべてのプロセスが完了するまで繰り返します。

---


## 入出力仕様

### 入力

入力の形式は以下の通りです。
```
n q
name_1 time_1
name_2 time_2
...
name_n time_n
```
- `n`：プロセスの数  
- `q`：クオンタム（1回の実行で最大何ms処理できるか）  
- `name_i`：各プロセスの名前（英数字からなる文字列）  
- `time_i`：各プロセスが必要とする実行時間（ms）



### 出力
各プロセスが **終了した順** に、

```
プロセス名 終了時刻
```
の形式で出力します。

---


## 制約


- 1 ≤ n ≤ 100,000  
- 1 ≤ q ≤ 1,000  
- 1 ≤ time_i ≤ 50,000  
- 1 ≤ name_i の長さ ≤ 10  
- ∑time_i ≤ 1,000,000  
---

## 入出力例

#### 入力例 1
```
5 100
p1 150
p2 80
p3 200
p4 350
p5 20
```
#### 入力例 1 に対する出力
```
p2 180
p5 400
p1 450
p3 550
p4 800
```

## サンプルコード



```c
#include <stdio.h>
#include <stdlib.h>

#define LEN 100005
#define NAME_LEN 100

typedef struct pp {
    char name[NAME_LEN];
    int time;
} Process;

Process Q[LEN];
int head = 0;
int tail = 0;

void enqueue(Process x) {
    Q[tail] = x;
    tail = (tail + 1) % LEN;
}

Process dequeue() {
    Process x = Q[head];
    head = (head + 1) % LEN;
    return x;
}

int main(void) {
    int elaps = 0; // 経過時間
    int n, quantum;
    scanf("%d %d", &n, &quantum);

    for (int i = 0; i < n; i++) {
        Process p;
        scanf("%s %d", p.name, &p.time);
        enqueue(p);
    }

    while (head != tail) {
        Process p = dequeue();
        if (p.time > quantum) {
            elaps += quantum;
            p.time -= quantum;
            enqueue(p);
        } else {
            elaps += p.time;
            printf("%s %d\n", p.name, elaps);
        }
    }

    return 0;
}

```
Database ManagementによるOracle Databaseのパフォーマンス監視 実践編②

[前回](https://qiita.com/Western24/items/db97c7e2e9553e683d2e)は、SQLチューニング・アドバイザーを使用したSQLチューニングを実施しました。今回は、ADDMを使用したデータベースのパフォーマンス分析の方法について紹介します。
<font color="darkgreen">ADDM(Automatic Database Diagnostic Monitor)</font>とは、自動診断データベースモニターのことで、AWRのスナップショットのデータを基にインスタンス全体のパフォーマンスを検出するパフォーマンス分析ツールです。デフォルト1時間毎に実行されるAWRと共にADDMも実行されます。
ADDMは、Oracle Database EE 12c以降のCDBでサポートされており、19cからはPDBでも使用することが可能です。
ADDMの実行結果は、SQLやスクリプトでADDMレポートとして取り出すことができますが、Database ManagementではGUIからオンデマンドで生成することが可能です。また、新機能のADDMスポットライトでは時系列にサマリーした情報を表示することもできるようになりました。

今回は、このADDMとADDMスポットライトの操作手順について紹介します。

## 索引の削除
SQLチューニング・アドバイザで作成した索引を削除しておく
```
##SOEスキーマで接続
sqlplus soe/パスワード@ホスト名:ポート/サービス名

##SQLチューニング・アドバイザ作成された索引名
select index_name from user_indexes where index_name like 'IDX$$%';

##索引の削除
drop index IDX$$_XXXXXXXX;
drop index IDX$$_XXXXXXXX;
```

## ADDMの手動実行
- パフォーマンス・ハブのADDMからADDMタスクの実行をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/29021c5b-6155-4fbb-8a4f-7e270cd96100.png)

- 現在のパフォーマンスを取得して分析を実行。過去のAWRからADDMレポートを作成したい場合は、過去のパフォーマンス分析からAWRのスナップショットを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/cbb4eaa1-39d1-45eb-a608-f5fce556cfa5.png)

- 作成されたADDMレポートのTOP SQL Statementsをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/46b92a7d-0a4c-46b6-be38-421e4ad9fd4b.png)

- 2つのSQLに対してSQLチューニング・アドバイザの実行が推奨されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/389b78a0-446a-4a9a-9978-e6a615bf1521.png)

- 以降のSQLチューニング・アドバイザの実行手順は前回と同じ

## ADDMスポットライト
- 左メニューのADDMスポットライトをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/868b1e44-e0aa-47d0-a099-0aab7ae81d16.png)

- ADDMスポットライトは、蓄積されたADDMのデータを任意の時間軸でサマリーしてくれる。AWRスナップショットの間隔でデータベース全体のパフォーマンス情報を収集しているので、SQLだけでなくデータベース・パラメータ変更によるパフォーマンス変化などもデータベースの総合的な診断をしてくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1b94af5a-29fd-44be-90aa-fc5c23d343e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/69a6180e-d232-4ca5-ad83-8eedcb57ac3b.png)

PDB単位でADDMを使用する場合、AWR_PDB_AUTOFLUSH_ENABLED初期化パラメータをTRUEに設定し、AWRスナップショット間隔を0より大きく設定して、PDBのAWRスナップショットを有効にする必要があります。また、Oracle Dabase 23ai以降では、AWR_PDB_AUTOFLUSH_ENABLEDのデフォルト値はTRUEです。 

[次回](https://qiita.com/Western24/items/707eef8d9b98ed1d2251)は、その他のDatabase Managementの機能について紹介します。