OmniAICreator/Qiita-1.07M huggingface dataset:
サーバ開発におけるフレームワーク

# はじめに
サーバー開発において、何らかのフレームワークは組み込むことが多いかと思います。
このフレームワークについて改めて学んだことをこの記事でまとめます。
と言っても超基本的なことばかりですが、個人的に曖昧だった部分を調べ直してまとめた感じです。



# そもそもフレームワークとは
サーバ開発におけるフレームワークとは、Webアプリケーションの作成、保守、および拡張を容易にするソフトウェアの枠組みです。

以下にフレームワークの主な特徴と利点を説明します：

1. 再利用可能な部品と機能のセット: 開発者が共通して必要とする機能があらかじめ用意されています。

2. 標準化された構造: 一定のルールや構造に従って開発を進めることができ、コードの一貫性を保ちやすくなります。

3. 効率性の向上: 繰り返し作業や複雑な処理を抽象化し、開発時間を短縮します。

## 主な機能

- URL のルーティング
- データベースとのやり取り
- セッションとユーザー認証のサポート
- 出力のフォーマット（HTML、JSON、XMLなど）
- セキュリティ対策

# サーバ側でフレームワークを用いる主な理由（メリット）

1. 開発効率の向上: フレームワークには開発に便利なテンプレートやパーツが備わっており、よく使われる機能の再作成の手間が省けます。これにより、開発者はWebアプリの本質的な機能により多くの時間を割くことができます。

2. コードの品質と安定性の向上: フレームワークを使用することで、開発者はバグやエラーが少なく、安定して動作するコードを書くことができます。また、セキュリティ対策もフレームワークによって提供されるため、アプリケーションの脆弱性を最小限に抑えられます。

3. 保守性の向上: フレームワークを使用すると、一定のルールに従ってアプリケーションを作成するため、コードの理解が容易になり、アプリケーションの全体像を把握しやすくなります。

4. 標準化と効率的な運用: 例えば、JavaEEを利用することで、アプリケーションサーバの構築・運用を標準化できます。これにより、システムの安定稼働や効率的な運用が可能になります。

5. 高度な機能の利用: 多くのフレームワークは、データベースアクセスの最適化やセッション管理、トランザクション管理などの高度な機能を提供しています。これらの機能を活用することで、エンジニアは少ない労力でより高機能なサーバーサイドアプリケーションを構築できます。

6. スケーラビリティとパフォーマンスの向上: 多くのフレームワークは、負荷分散機能や流量制御機能を持っており、急な高負荷状況にも柔軟に対応することができます。

これらの理由により、サーバ側でフレームワークを用いることで、開発の効率化、品質の向上、保守性の改善、そして高度な機能の実現が可能となり、結果としてより堅牢で効率的なWebアプリケーションの開発が可能になります。

# サーバーサイドフレームワークの代表的な例

1. Spring Framework (Java): 非常に人気が高く、DI（Dependency Injection）やAOP（Aspect-Oriented Programming）などの機能を提供し、効率的なアプリケーション開発を可能にします.

2. Express (Node.js/JavaScript): Node.jsのWebアプリケーションフレームワークで、ルーティング、ビュー管理、データベース接続などの機能が豊富です.

3. Django (Python): Pythonで書かれた高機能なWebフレームワークで、大規模なWebサイト開発に適しています.

4. Ruby on Rails (Ruby): MVCアーキテクチャを採用し、DRY（Don't Repeat Yourself）原則を重視したフレームワークです。GitHub、Airbnb、Twitchなどの有名サイトで使用されています.

5. Laravel (PHP): PHPベースのフレームワークで、シンプルさと拡張性が特徴です。強力なORM、マイグレーション機能、バックグラウンドジョブ処理などを提供します.

6. ASP.NET (C#): Microsoftが開発した、Windows環境で動作するWebアプリケーションフレームワークです.

これらのフレームワークは、それぞれ異なる言語や特徴を持ち、開発者のニーズや好みに応じて選択されます。

# フレームワークの選び方
ポイントは以下となります。

1. プロジェクトの要件と目的との適合性: フレームワークがプロジェクトの要件や目標に合致しているかを確認することが重要です。

2. カスタマイズ性と拡張性: プロジェクトの特殊な要件に対応できるよう、フレームワークのカスタマイズ性や拡張性を事前に確認する必要があります。

3. パフォーマンス: プロジェクトに必要なパフォーマンスレベルをフレームワークが満たせるかを評価します。

4. 学習の難易度とコスト: フレームワークの学習難易度や、有料・無料の別を考慮し、自分の可能な範囲で取り組めるものを選ぶことが大切です。

5. コミュニティの規模と活発さ: 利用者が多く実績の豊富なフレームワークを選ぶことで、問題解決が容易になり、学習リソースも豊富になります。

6. セキュリティ対策: フレームワークのセキュリティ機能や、脆弱性への対応状況を確認することが重要です。

7. 依存関係の管理: フレームワークが依存するサードパーティのライブラリやツールの互換性や維持管理の負担を考慮します。

これらのポイントを総合的に評価し、プロジェクトや開発チームに最適なフレームワークを選択することが重要です。

# フレームワークのメンテナンスコスト
フレームワークに限ったことではありませんが、、
フレームワークのメンテナンスコスト適切に管理しないと時間とともに増加する傾向があります。以下にその要因と影響を説明します：

1. 技術的負債の蓄積: 古いフレームワークを使い続けると、新しい技術や効率的な手法を取り入れられず、生産性が低下します。これにより、開発やバグ修正にかかる時間とコストが増加します。

2. セキュリティリスクの増大: サポートが終了したフレームワークを使用し続けると、セキュリティホールが修正されず、システムが脆弱になります。これに対処するためのコストが発生します。

3. 人材確保の困難: 古いフレームワークの知識を持つ技術者が減少し、システムを維持できる人材の確保が難しくなります。これは人件費の上昇につながる可能性があります。

4. バージョンアップの負担: フレームワークの大規模なバージョンアップは、多大な時間と労力を要する場合があります。例えば、1週間から1ヶ月程度の作業期間が必要になることもあります。

5. 環境の変化への対応: OSやミドルウェアなど、周辺環境の変化に合わせてフレームワークも更新する必要があり、これにもコストがかかります。

適切なメンテナンスを怠ると、これらの要因によりコストが増大し、システムの「レガシー化」が進行します。一方で、計画的にフレームワークを更新し、継続的な改善を行うことで、長期的にはメンテナンスコストを抑制できる可能性があります。







以上
GCP PCA合格(更新)記(2025/2/2投稿)

# はじめに
この度Google Cloud Certified - Professional Cloud Architectを受験してきましたので、勉強した内容と受験した感想を書いておきます。
今回は更新目的の受験なので、これから受験される方の参考にはあまりならないかもしれません。

前回は2023年2月に受験していました。

https://qiita.com/handy-dd18/items/4e2d60db1f68a1f5c5d7

# 前提
* 最近はTerraformでGoogle Cloudリソースを作る機会が増えてきました
* AWS認定は全て取っています(15資格)
* AWSの実務経験あり(一部Azureも)
* MS Azure認定は10個取っています
* Google Cloud認定は10個取ってます

# 学習内容
今回は更新試験ということで、練習問題を解きながら出題サービスの覚え直しのみ行いました。

* 1．練習問題([Udemy](https://www.udemy.com/share/10arYK3@RvfS7J-wlg-_0HXf2dH94FfM2047uDF_md4bNxhunnrfZRdnnqA83XK7t7CHsg18/))を解いて問題に慣れる

## 練習問題
Udemyで公開されている[練習問題](https://www.udemy.com/share/10brOH3@dk2m4_kWJpmUjhtXkFemFAIDVJrUEPhuhfWKandua8CEPgiGFoHKzs6RpflzQ3Mk/)を購入して勉強しました。

試験の練習問題を解くとき、私は割と回答したら即時で正答を知って関連ドキュメントを見て学習したい派なのですが、以前は最後まで解ききらないと正答が確認できず、解くのが毎回億劫でした。
ただ、少し前からUdemyが演習モードという1問1答形式のテストモードを実装して、問題に答えたら即時で正答が見れるようになったので、最近はもっぱらUdemyで問題を解くことが多いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/43cd1e10-6435-995e-0e0b-a1303423df74.png)

直前になって問題を解き始めたので、演習テスト1しかできなかったですが、いくつかは類似問題があったので、ここに載っている問題を一通り解いて理解できていれば合格する確率は上がると思います。

# 受験した感想
今回は1時間程度で解ききって、フラグ付き問題が22問程度で、それも振り返りして14問ぐらいまで減らせたので、前回に比べると余裕もって解けたと思います。

これはAWS試験を受けたことある方向けですが、Google Cloudの試験は割と観点がAWSと近いところがあり、サービス毎の仕組みの違いがある程度わかっていれば、「AWSだとこういう選択肢が選ばれそうだから、それに近しい選択肢はこれ」という解き方ができるようなります。(全ての問題で使えるわけではないです)

また、問題文もAWSに慣れているとかなり少なく感じると思うので、解き慣れればかなり楽になると思います。(たまに「もっと問題文に説明追加して！！」と思うこともなくはないんですが...)

# 受験結果
無事合格でした。
![1000016583.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/bf00f1ea-a76e-66dd-fb01-ed27a9b8b52a.png)

# おわりに
昨年やっとAWS認定試験の更新ラッシュが終わったかと思ったら、今年はGoogle Cloudの更新ラッシュがスタートしました。。
過去に連続で取った自分のせいではあるんですが、勘弁して...ってなってます笑
来月は2つ更新なので、1発合格できるよう頑張っていきます。

内容は薄めですが、この記事がどなたかの参考になれば幸いです。
Java11Silverをオンライン受験してみた！

当方、4月に入ってからJavaの案件に携わらせていただくことになり、急きょ資格を取得しましたので、備忘録がてらその経緯をまとめておこうかと思います。



# なぜJavaの資格をとろうと思ったのか？
会社の先輩には「資格を持っていてもあんまり意味ない」という考えの人が多かったのですが、何かしらの言語の資格を持っておくことで、とりあえずはひとつの言語でコーディングをできるよ、ということの証明になるかと思いました。

また、Javaは業務システムで使われており、安定した収入が得られそうなイメージがありました。新人研修の講師の仕事も多く、ゆくゆくはそういった方向に行きたい場合も役に立ちそうな気がします。



# 受験料が高い…
受験料は2024年2月の時点で2万5千円程度。(今調べたらさらに値上がりしてる…)

試験会場での受験もできるのですが、私はオンラインでの受験を選択しました。この値段は失敗したときのダメージがデカい。

より新しいJava17の試験もあるようなので、そちらにするほうが良かったかな…？(2024年5月ではまだ黒本が出てないらしい)

キャンペーン中に受けると落ちたときに再受験無料になるようなので、Oracle University Japanの新着ニュース等は要チェックかもしれませんね。

オンライン受験では試験の24時間前までに5回までなら日程を変更できたので、私は勉強が間に合わないときにこれをフル活用しました。



# 取得までの道のり
まずは私のステータスですが、新卒で入社してから2年間ほどJavaの現場におり、当時は新人ゆえ、ガッツリ開発したのは後半の半年くらいという感じです。VBやC#など、他の言語ならそれぞれもう少し長く経験があります。

早速紫本と呼ばれるテキストを購入。

問題はソースコードを見てその実行結果を予想するものがほとんどで引っ掛け問題が多く、一見正しそうでもよく見るとエラーになる、という問題があったりします。

仕事がない期間だったので、毎日8時間ほどだらだら勉強して、2週間くらいで紫本3周、章末の確認問題で8割ほど取れるようになりました。しかし、Amazonのレビューにもあるのですが、11の紫本は解説があまり細かくなく、答えは暗記できても、どうしてその結果になるのか腑に落ちない部分がありました。

そこでもう一冊黒本と呼ばれる問題集を購入。

こちらは問題一つ一つについて、なぜその正解になるのかが細かく書かれており、すごくわかりやすかった。最初に出会っておきたかったかもしれません…。

しかし、こちらの問題が紫本と全く違って、全然解けない。

数日後に試験を受けるつもりでいたのですが、一旦断念して次の月に受けることにしました。

結局黒本は仕事しながらの勉強だったので3周するまでに1ヶ月ほどかかかり、受験までに何回決戦の日を移動させたか…。

手続きすれば日付変更できるのは大変ありがたいです。



# オンライン受験当日
そして腹をくくった試験当日、試験を受ける自宅の部屋に誰かいると分かると失格になるらしいので部屋を完全に締め切り、メールのリンクから試験環境のテストを終わらせました。

リンクから画面に従って、受験する部屋の写真や免許証をアップします。試験直前に復習ができるかなと思ったら、これに結構時間がかかりました。

待機画面が出て、しばらくすると画面の向こう側にいる試験官(日本語で話してくださいましたが、外国の方のようです)と繋がりました。ここで、机の周りに筆記用具やノート等があったので、それを届かない場所においてくださいと言われます。他にも机にサブモニターを置いていたら、電源を抜いて裏向きにするように指示されました。そして、机のすぐ横に本棚があったので、そこに手が届かない場所でテストをして欲しいと言われ、棚の反対向きの机に移動。部屋が汚くて試験管の方には申し訳ない…。

そして諸々移動した後の部屋をもう一度カメラに移し直して試験開始。180分で問題を解き終わると、結果は即表示されます。



…とりあえず2冊終わらせておけば大丈夫でした！
JSON ServerでモックアップAPIを作成し、Axiosでデータを取得する

**本記事では、JSON Serverを使用して簡単なモックAPIを作成し、Axiosを使ってサーバーからデータを取得する方法を解説します。**

**用語説明**

**JSON Server**: JSON形式のデータをAPIとして提供できる簡単なツール。開発時のモックAPIとして利用される。

**Axios**: HTTPリクエストを簡単に送受信できるJavaScriptライブラリ。

**モックAPI**: 実際のAPIの動作を模倣したテスト用のAPI。開発中にバックエンドが未完成の状態でもフロントエンドの開発やテストを進められる。

**環境準備**

Node.jsのインストール

Node.jsがインストールされていない場合、公式サイトからインストールしてください。

JSON Serverのインストール
```
npm install -g json-server
```

**Axiosのインストール**

Reactプロジェクトで使用する場合

**npm install axios**

Node.jsで使用する場合も同様にインストール可能です。

JSON Serverの設定

JSONファイルの作成
db.jsonというファイルを作成し、以下のように記述します。
```JSON
{
  "users": [
    { "id": 1, "name": "Taro", "email": "taro@example.com" },
    { "id": 2, "name": "Hanako", "email": "hanako@example.com" }
  ]
}
```

JSON Serverの起動
```
json-server --watch db.json --port 3001

--watch db.json：変更を監視

--port 3001：デフォルトの3000以外のポートで起動
```

Axiosでデータを取得

ReactでJSON Serverからデータを取得する例を示します。
```JSON
import React, { useEffect, useState } from 'react';
import axios from 'axios';

const App = () => {
  const [users, setUsers] = useState([]);

  useEffect(() => {
    axios.get('http://localhost:3001/users')
      .then(response => {
        setUsers(response.data);
      })
      .catch(error => {
        console.error('Error fetching data:', error);
      });
  }, []);

  return (
    <div>
      <h1>ユーザー一覧</h1>
      <ul>
        {users.map(user => (
          <li key={user.id}>{user.name} ({user.email})</li>
        ))}
      </ul>
    </div>
  );
};

export default App;
```

# まとめ

JSON Serverを使うことで簡単にモックAPIを作成できる。

json-server --watch db.json --port 3001 でサーバーを起動。

Axiosを使い、ReactのuseEffectでデータを取得。

以上の手順で、モックAPIの作成とデータ取得の基本が理解できます。ぜひ試してみてください！
Gitの基本的なワークフロー

# はじめに
Gitはソースコードのバージョン管理のため、使われていっており、Gitを楽に使用するためのツールや拡張機能もたくさんあります。
しかし、Gitのワークフローをきちんと理解していないまま、Gitやツールを使っていることではないかと思いました。
そのため、Gitの基本的なワークフローについて、簡単に整理してみたいと思います。

# Gitの各領域
Gitは3つの領域で区分できます。
(`ローカルリポジトリ`と`リモートリポジトリ`を別領域にすると4つで区分)

1. **作業ディレクトリ (Working Directory、Working Tree)**
実際にファイルを修正する作業領域

2. **ステージング領域 (Staging Area、Index)**
コミットする前に変更内容を管理・一時的に保持する領域

3. **リポジトリ (Repository)**
ファイルの変更履歴が格納される領域
`ローカルリポジトリ(Local Repository)`と`リモートリポジトリ(Remote Repository)`がある

ただ、今回は以下のように5つに領域を細分化してワークフローを整理して見ます。

1. **作業ディレクトリ (Working Directory)**
2. **ステージング領域 (Staging Area)**
3. **ローカルブランチ (Local Branch)** : `Local Repository`に含まれるブランチ
4. **リモート追跡ブランチ (Remote-Tracking Branch)** : `Local Repository`に含まれるブランチ
5. **リモートブランチ (Remote Branch)** : `Remote Repository`に含まれるブランチ

# Gitの基本的なワークフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1184971/695a4a1a-6e12-10d8-614a-cd44ac0031be.png)

- **git add**
`作業ディレクトリ`の変更内容を`ステージング領域`に追加
- **git commit**
`ステージング領域`の変更内容を`ローカルブランチ`に追加
- **git push**
`ローカルブランチ`の内容を`リモート追跡ブランチ`と`リモートブランチ`に反映
- **git fetch**
`リモートブランチ`の内容を`リモート追跡ブランチ`に反映
- **git merge**
`リモート追跡ブランチ`の内容を`ローカルブランチ`に統合 (`作業ディレクトリ`にも反映される)
- **git pull**
`git fetch`と`git merge`をまとめて行う

# おわりに
実際に作業するときには、もっと複雑なワークフローで、より多くのGitの機能を使用しますが、今回は簡単に基本的なワークフローだけを整理して見ました。
iOSのProgressViewの太さを変更する

# はじめに
今回はIOS実装でProgressViewの太さを変更する方法を紹介していきます
### 本文
さっそくですが、コードは下記になります。
yに設定した値を乗算した値が太さになります。
自分の環境ではprintを使って確認したところで書記が4pxでした
ここはしっかりと把握したうえで確認をしつつ実装することをおすすめします
```swift
progressView.transform = CGAffineTransform(scaleX: 1.0, y: 2)
```
### 最後に
最近自分が実装をして久しぶりにUIKitで実装してどうしようか考えた場所なので、どなたかのお役に立てれば幸いです
『世界一流エンジニアの思考法』を読んでみた

# はじめに
昔から本を読むことは好きなのですが、
読んだ後に「面白かった」「参考になった」という感想しか残らないことが多いです。

得られたものを言語化して自分の中に定着させるため、今回は記事にしてみます。



# 今回読んだ本
『[世界一流エンジニアの思考法](https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E4%B8%80%E6%B5%81%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95-%E7%89%9B%E5%B0%BE-%E5%89%9B/dp/4163917683)』　著者：牛尾 剛

米マイクロソフトの現役ソフトウェアエンジニアの著者が、超巨大クラウドの開発の最前線で学んだ思考法について書いている本です。

前職（中学校教員）の経験が、良くも悪くも自分の考え方を作り上げているので、
良い方向へ成長するきっかけにしたいと思い、この本を読んでみました。

自分の中で良かったと思った部分を、簡単にまとめていきます。



# 試行錯誤は「悪」である
ログやエラー文を細かく見る癖があまり身についておらず、なんとなく考えられる方法を1つずつ試してしまいます。

- 何が起こっているのか、どこまでは正常な挙動をしているのかを把握する
- 推測して仮説を立てて検証する
上記のステップが大切だと書かれていました。

エンジニアの先輩方からすると当たり前のことなのかもしれませんが、自分はまだこの感覚が薄いです。

「追われているタスクを完遂するために、とりあえず動くようにしよう！」という気持ちになりがちなので、今後似たような不具合が出た時にも対応できるように、今起こっている状況の整理をすることを心がけます。



# 「理解に時間をかける」を実践する
「技術力がある人は、一瞬ですべてを理解する天才」と思ってしまいがちだけど、
1つひとつの事象に対して、基礎的な部分から徹底的に理解をしてきた積み重ねによるもの。

（著者も本で書いていたのですが）私は「ある程度どんなものかを理解すること」は得意な方だと思います。
しかし、基本的な知識や構造の理解が追いついておらず「なんとなくはわかるけど、根本的な理解はできていない」という状況に陥ることが多いです。

前職のときに、
「わかったことを人に説明できて、初めて理解したということだよ」
なんて偉そうに言っていましたが、その感覚が抜け落ちていたことに反省です。



# まずエキスパートに頼る
よく言われる「15分考えてわからなかったら質問する」といった内容です。
（この本では、2時間を区切りとして書かれていました）

自分が一番直さなければいけない部分です。
「聞くのが申し訳ない」「人の時間を奪ってしまう」という感覚が抜けていません。
また、自分の性格上、途中から意地になっている部分あります。
よって、「試せるものはすべて試す。どうにもならなくなって聞く」という方法を取りがちです。

実装済みの部分が複雑であればあるほど、無駄に時間をかけてしまう場合が多いです。
自分の中である程度試したら、見切りをつけて詳しい人に尋ねることを習慣化していきます。



# 仕事の難易度別で考える
「調べなくても解決できること」を増やすことが大切という考え方。
難しいことができるようになることよりも、自分が簡単にできることを増やす。
>L4　自分では無理
>L3　スパイクソリューションがあれば何とかなる
>L2　調べたら解決できる
>L1　何も調べなくても即実装できる

「難しいことをクリアしようと思った時に、簡単にできることの積み重ねが役に立つよね」
という趣旨だと受け取りました。

早く先輩達のように難しいことができるようにならなきゃ、と焦りもありましたが、
まずは自分ができることを地道に増やしていくことが一番の近道だと思って頑張ろうと思います。



# マルチタスクは生産性が最低なのでやらない
わかってはいるのですが、日々やりがちです…。
Slackを見たり、ふと思いついたことを調べたり、別タスクのことが気になったり。

最近は意識をして、ある程度まとまった時間は作業に集中して取り組むようにしています。

しかし、1時間（正確に言うと50分）で作業を区切ることに体が慣れてしまっているので、
90分は集中できるように改善していきたいと思います。

>大前研一氏は、何かを変えたいときは、「住むところ」「付き合う人」「時間配分」のいずれかを変えるべきで、それ以外は意味がいないという考察をしていた。

昨年、移住して住むところを変えた（必然的に関わる人も変わった）ので、時間に対する意識も変えていきたいです。



# 「書く」すすめ
「記憶力」についてフォーカスして書かれている部分がありました。
昔から記憶力には自信がないので、改善したいポイントの1つです。
（人の顔と名前を一致しない、道を覚えられない、2択の問題の正答にいつも迷う、など）

学んだ技術について、書いて、情報を整理して、人に説明できる段階までもっていく。
それによって技術を身につけていく。
このプロセスを繰り返していくことが大切ということですね。

今年はアウトプットに力を入れることを目標にしているので、
技術を本当の意味で身につけるためにも、記事投稿を続けていきたいと思います。



# まとめ
『世界一流エンジニアの思考法』を読んで、意識していきたい部分についてまとめました。
取り上げた部分以外にも、考え方の参考になる内容がたくさんありました。
興味をもった方はぜひ読んでみてください。

「本を読んで学んだことをまとめる」
という作業を初めてやってみましたが、想像以上に難しい作業でした。
考えたこと、感じたことについて、言語化する作業も継続して練習していきます。
CentOS9 StreamにPackstackをインストール

CentOS9 Streamにall-in-one構成のPackstackを導入しました。
備忘録

# ■ハードウェア構成
H/W:CPU：Core i5 6200U 2.3GHz/メモリ：16GB/SSD：240GB
OS:CentOS9 Stream 英語版
# ■導入方法
```
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
sudo systemctl disable --now firewalld
sudo dnf update -y
reboot
dnf install dnf-plugins-core
dnf config-manager --set-enabled crb
sudo dnf install -y centos-release-openstack-zed
dnf install openstack-selinux
sudo dnf install -y openstack-packstack
sudo packstack --allinone

 **** Installation completed successfully ******
```

cat /root/keystonerc_adminの中のexport OS_PASSWORD='6e9e3736a0d948b8'の
パスワードで、dashboardにアクセスできる。
 
https://www.rdoproject.org/install/packstack/
env | grep OS_
#0033（2024/02/02）"陳腐化したデータ"とは何か？

# 陳腐化したデータとは？

IT分野において「陳腐化したデータ」とは、**最新の情報と比較して古くなっており、もはや正確または有用でなくなったデータ**を指します。  
しばしば「stale data」とも呼ばれ、システムやアプリケーションの動作に影響を与えることがあります。

## 特徴

- **最新性の欠如**  
  データが更新されず、現状を正しく反映していない状態です。

- **整合性の問題**  
  他の最新のデータソースやシステムと比べた場合、一貫性や正確性が失われる可能性があります。

- **キャッシュの陳腐化**  
  キャッシュされたデータが元のデータソースと乖離してしまい、利用時に古い情報が返されることがあります。

## 陳腐化の原因

1. **時間の経過**  
   経時的に情報が変化するため、保存されたデータがすぐに古くなってしまう。

2. **データの更新不足**  
   システムが新しい情報を取り込まず、以前のデータをそのまま保持している場合。

3. **キャッシュ戦略の問題**  
   キャッシュに設定された有効期限が適切でない場合や、更新メカニズムが不十分な場合。

## 陳腐化したデータの影響

- **誤った判断**  
  システムやユーザーが古いデータに基づいて意思決定を行うリスクがあります。

- **システムエラーや不整合**  
  複数のデータソース間で整合性が取れず、エラーや不具合が発生する可能性があります。

- **パフォーマンス低下**  
  不要なデータ処理や再計算が行われ、システム全体のパフォーマンスに影響を与える場合があります。

## 陳腐化対策

- **定期的なデータ更新**  
  最新の情報に基づき、定期的にデータを更新する仕組みを導入する。

- **適切なキャッシュ管理**  
  キャッシュに適切な有効期限を設定し、期限切れ後は自動的に更新する。

- **データ監査とクリーニング**  
  システム全体でデータの整合性を定期的にチェックし、不要または古いデータを削除・更新する。

## まとめ

「陳腐化したデータ」とは、時間や更新の遅れにより、最新の状況を反映していないデータのことです。  
システムの信頼性やパフォーマンスを維持するためには、**定期的な更新**や**効果的なキャッシュ管理**が不可欠となります。
#0032（2024/02/02）RSA暗号とは？

# RSA 暗号とは？

RSA 暗号は、**公開鍵暗号方式** の一種で、1977年に Ron Rivest、Adi Shamir、Leonard Adleman によって考案されました。  
その名前は、3人の発明者の名字の頭文字（**R**ivest, **S**hamir, **A**dleman）に由来しています。

## 基本概念

- **公開鍵と秘密鍵のペア**  
  - **公開鍵**：誰でも利用できる鍵。暗号化に使われる。  
  - **秘密鍵**：鍵の持ち主だけが知っている鍵。復号に使われる。

- **非対称暗号方式**  
  一方の鍵で暗号化したデータは、もう一方の鍵でのみ復号できる仕組みです。

## RSA の仕組み

RSA 暗号では、主に以下の3つのステップで鍵の生成、暗号化、復号が行われます。

### 1. 鍵の生成

1. **大きな素数 p と q を選ぶ**  
   秘密にされる2つの大きな素数を用意します。

2. **n の計算**  
   `n = p * q`  
   ここで求められた `n` は、公開鍵と秘密鍵の両方で使われるモジュラス（法）となります。

3. **オイラーの φ 関数の計算**  
   `φ(n) = (p - 1) * (q - 1)`

4. **公開指数 e の選定**  
   `e` は `1 < e < φ(n)` の範囲で、かつ `e` と `φ(n)` が互いに素（最大公約数が1）である必要があります。  
   よく使われる値は `e = 65537` です。

5. **秘密指数 d の計算**  
   `d` は `e * d ≡ 1 (mod φ(n))` を満たす値、すなわち `e` の逆元として計算されます。

これにより生成される鍵は、  
- **公開鍵:** `(n, e)`  
- **秘密鍵:** `(n, d)`

### 2. 暗号化

送信者は、受信者の**公開鍵** `(n, e)` を用いて、メッセージ `M` を暗号化します。  
暗号文 `C` は以下の式で求められます：

``` text
C = M^e mod n
```

※ここで、`M` は暗号化可能な形（通常は数値に変換）に変換されたメッセージです。

### 3. 復号

受信者は、自身の**秘密鍵** `(n, d)` を使い、暗号文 `C` を復号して元のメッセージ `M` を取り出します。  
復号の式は以下の通りです：

``` text
M = C^d mod n
```

この計算により、元のメッセージ `M` が正しく復元されます。

## RSA の安全性

RSA 暗号の安全性は、**大きな整数の素因数分解が非常に困難**であるという数学的な性質に基づいています。  
具体的には、`n = p * q` の `n` を構成する素因数 `p` と `q` を求めることが、現代の計算技術では非常に時間がかかる（実質的に不可能に近い）ため、秘密鍵が守られるとされています。

また、**鍵の長さ**（通常は2048ビット以上）が安全性に直結するため、十分なビット数の鍵が推奨されています。

## RSA の応用例

- **SSL/TLS**  
  インターネット上の安全な通信（HTTPSなど）で、セッション鍵の交換に使われます。

- **電子署名**  
  デジタル署名を生成することで、送信者の認証やデータの改ざん防止に利用されます。

- **暗号化メール**  
  公開鍵暗号を利用してメール内容の機密性を保つシステムで使用されます。

## まとめ

RSA 暗号は、公開鍵と秘密鍵を用いる非対称暗号方式で、以下の特徴があります：

- **安全性**：大きな整数の素因数分解が困難なため、高いセキュリティが実現される。  
- **鍵のペア**：一方の鍵で暗号化し、もう一方の鍵でのみ復号できる仕組み。  
- **応用範囲の広さ**：インターネットのセキュリティ、電子署名、暗号化メールなど、多岐にわたる用途で利用されている。

このように、RSA 暗号は現代の情報セキュリティにおいて非常に重要な役割を果たしています。
【Python】データ型と型の変換をする。

#データ型と型変換
#Pythonのlist と Numpy array は異なる点がある。
#それは、Numpy array は 配列内に同じデータ型した入れられないことである。



data = np. array([1, "2", 3, 4, 5])
data

#上記の dtype='<U21')は、Unicode の文字を表している。
#つまり、ひとつ文字があるだけで、全体が文字型として認識されてしまう。

#整数で統一したい場合は、dtype を指定する。
data = np. array([1, 2, 3, 4, 5], dtype=np.int64)
data

data.dtype #下記はdtype の確認

#型がint64になっていることがわかる。
#また、下記のように、dataのタイプ指定をnp.int64 に指定することも可能
data_int = data.astype(np.int64)
data_int

data_int.dtype #data型がint64になっているか確認する

np.iinfo(np.int8) #8bit がどれだけ表示できるか？ メモリの節約につながるエラー防止。
#よって今回の１から５までは、int64　ではなく、int8 で十分。

メモリの消費量を減らすことで、エラー防止になる。
AndroidStudioでFire TV用のエミュレータ操作を簡単にする方法

AndroidStudioでFireTV用のエミュレータを作成後スクショのオレンジマーク部分をクリック
![スクリーンショット 2025-02-02 20.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/db3d80cf-471c-3938-c00a-979e22726123.png)

すると以下のような操作用のコントローラが出るのでこれで操作が簡単に出来ます。
![スクリーンショット 2025-02-02 20.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/e5b74a4c-b03d-f804-604a-d17984fa864a.png)
【Kotlin】既存の関数を実行対象として指定したいなら、ラムダより関数参照を使用すべし

定義した関数を即時実行ではなく、変数に格納して任意のタイミングで実行したい場合、ラムダより関数参照の方がパフォーマスが良いらしい。

例えば生成した乱数に応じて処理を切り替える場合なんかだと、
```main.kt
fun main() {
    val randNum = (1..10).random()
    println(randNum)
    val exec: ()->Unit = when (randNum % 2) {
        0 -> { { do1() } }
        else -> ::do2
    }
    exec()
}

fun do1() {
    println("do 1")
}
fun do2() {
    println("do 2")
}
```
既存の関数を`{{ do1() }}`という風にラムダに包んで渡すとラムダの生成コストがかかる。
一方で`::do2`とすると関数参照といって、新たな関数を生成せず既存のdo2()のメモリアドレスを渡すだけで済む。

まあラムダは「無名」関数なので、既存の関数をラップするなんてそもそも変な話な気もするけれど。
以上。
ペーストするアプリによって挙動が異なる文字化けの原因と対策を調べてみた

## 概要
本記事では、コピペ時によく起こる文字化けについて調べたので、まとめてみました。

## 起きた現象
ChatGPTからコピーしたテキストをStandard Notesというメモアプリ(どちらもiOS版)にコピペした場合「意味」という文字列が「諢丞袖」という文字に化けてしまいました。

しかし、Apple純正のメモアプリにコピペした場合は文字化けが起きませんでした。　

なぜこの現象が起きるのか、原因を調べてみました。

## そもそも文字化けとは
誤ったエンコードにより文字が正しく表示されず、意味不明な記号や文字列として表示される現象です。(フォントに対応しておらず文字化けが起きる場合もあるようです)

## ペースト先がStandard Notesだと文字化けする理由
ChatGPTを含む多くのサービスは、**UTF-8 BOMなし**でテキストを扱っています。
しかし、ペースト先のアプリケーションがUTF-8設定でなかったり、自動認識に失敗した場合は**バイト列を別のエンコーディングとして解釈**してしまいます。
これが原因で、文字化けが起きていました。

**UTF-8 BOMありであれば、エンコーディングが明示されるため、文字化けしにくい**みたいです。

## ペースト先がApple純正メモだと文字化けしない理由
なぜApple純正メモアプリとStandard Notesでこのような違いが起きるのでしょうか？

Apple純正のメモアプリには**テキストを自動でUTF-8に変換する仕組み**があるみたいで、どんなエンコーディングのデータでも、メモアプリを経由すると統一されたUTF-8のデータに変更されるようです。

そのため、一度Apple純正メモアプリを経由してStandard Notesにペーストすると文字化けは起きませんでした。

## まとめ
まとめると、下記のような状況だったみたいです。
文字化けは「エンコーディングの不一致」が原因で起こります。
特に、**UTF-8 BOMなし**のテキストを、Shift_JISとして開いてしまうことで発生することが多いです。知識として入れておこうと思いました。

- StandardNotes→UTF-8と自動認識できなかった→文字化けが起きる
- Apple純正メモアプリ→内部処理でUTF-8と自動認識する→文字化けが起きない
【langchain】ChatPromptTemplateで画像を受け取る

# コード

langchain v0.3で検証。
ChatPromptTemplate.from_messagesに渡すlistのtuple要素の2つめをリストにすれば良い。

```Python
from langchain.prompts import ChatPromptTemplate

messages = [
    (
        "user",
        [
            {"type": "text", "text": "{question}"},
            {
                "type": "image_url",
                "image_url": {"url": "data:image/jpeg;base64,{base64_image}"},
            },
        ],
    ),
]

# チェインの作成
prompt = ChatPromptTemplate.from_messages(messages)

print(prompt.format_messages(question="質問", base64_image="test"))
```

```
[HumanMessage(content=[{'type': 'text', 'text': '質問'}, {'type': 'image_url', 'image_url': {'url': 'data:image/jpeg;base64,test'}}], additional_kwargs={}, response_metadata={})]
```

以下のようにチェインにも渡せる。

```Python
import base64

import dotenv
import httpx
from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

messages = [
    (
        "user",
        [
            {"type": "text", "text": "{question}"},
            {
                "type": "image_url",
                "image_url": {"url": "data:image/jpeg;base64,{base64_image}"},
            },
        ],
    ),
]

prompt = ChatPromptTemplate.from_messages(messages)


print(prompt.format_messages(question="質問", base64_image="test"))


model = ChatOpenAI(model="gpt-4o-mini")

chain = prompt | model

image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")

print(chain.invoke({"question": "画像の天気は？", "base64_image": image_data}))
```

```
画像の天気は、青空に白い雲が浮かんでいるように見えます。全体的に明るく、穏やかな気候の印象を受けます。湿地や草原が広がっているため、自然の美しさを感じられそうです。
```
Spring Boot @Mapperの実行時エラー解決

# エラー内容

Spring Batchで@Mapperが付与されたインタフェースを@Autowiredしようとしたら下記エラーがでました。

``` :エラー1
***************************
APPLICATION FAILED TO START
***************************

Description:

Field mapper in com.example.demo.config.BatchConfig required a bean of type 'com.example.demo.mapper.TestMapper' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.example.demo.mapper.TestMapper' in your configuration.
```

``` :エラー2
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'testMapper' defined in file [com\example\demo\mapper\TestMapper.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
```

普段は呼び出される方のクラスに@Componentを忘れているのが原因のためアノテーション付与をすれば解決できるのですが、うまくいかなかったので解決した方法を残します。

# エラーが発生したコード

エラー1が出たときのバージョン
``` build.gradle
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1'
```

エラー2が出たときのバージョン
``` build.gradle
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
```

gradle以外はエラー1, 2に関わらず同じコードを使用
``` java:BatchConfig.java
@Configuration
public class BatchConfig {

  @Autowired
  TestMapper testMapper;

  ...
}
```

``` java:TestMapper.java
@Mapper
public interface TestMapper {

  @Select("select * from test")
  Collection<Test> selectAll();
}
```

# 解決方法

``` build.gradle
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.4'
```
mybatisのバージョンを上げます。


```
***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  batchConfig (field com.example.demo.mapper.TestMapper com.example.demo.config.BatchConfig.mapper)
↑     ↓
|  testMapper defined in file [com\example\demo\mapper\TestMapper.class]
↑     ↓
|  dataSourceScriptDatabaseInitializer defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]
└─────┘


Action:

Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
```
上記エラーが出た場合は下記対応をします。
``` java:BatchConfig.java
@Configuration
public class BatchConfig {

  @Autowired
  @Lazy
  TestMapper mapper;

  ...
}
```
@Lazyを付与

これで解決しました。
仕事には2つの種類がある【BLEACH風】

# はじめに
こんにちは！新卒エンジニアのなのさです。
最近案件に参画することになり、上司とのやりとりで勉強になったことを備忘録として書いていきます。

# 背景
最近初めてのタスクをこなしたのですが、結構手戻りが多く、お世辞にもスムーズにいけた、ということではありませんでした。そこで上司に仕事の進め方について相談したところ、タイトルのようなことが返ってきました。
我がバイブルの一つ、BLEACHにて
「戦いには2種類あり、我々は常に俺を見極めねばならない。命を守るための戦いと、誇りを守る戦いだ。」
とあります。上司と話していた際にこれと似てるなあと思った次第です。
社会人の先輩方にとっては当たり前のことだとは思いますが、よろしくお願いします。

# 1種類目：正確性を重視する仕事

データ整理やエビデンス取りなど、ある程度ゴールと道筋が決まっている場合がこの場合に該当する。その際は、

- 手をつける範囲がどこまでなのかをはっきりさせておく
- 作業の順番と時間の見積もりをする
- 外部要因で時間がかかるのは気にしない



を気にしながら進めると良いそう。かくいう自分は作業の順番が雑だったため、今の手順を途中で飛ばして次の資料に手をつけるという感じになってしまいました。
今後は作業見積もりと順序についてもう少し考えてから行おうと思います。

# 2種類目：スピード重視の仕事
例えば、「障害の再発防止策考えて」など、答えがない場合が該当。
こういう場合は

- よくわからん部分は放置
- 叩き台的なものを限りなく早く提出する

を気にすることが重要だそう。こういう場合のタスクは、基本どんなに時間かけても一発クリアされることはないので早めにレビューしてもらってブラッシュアップするのが効率的みたい。

# 一番大事なこと
そして、一番大事なのは **「見極める」** ということ。
タスク、レビュワーによってどっちを選択するのか、配分をどうするかを見極められるようになってほしいと言われました。思えばBLEACHは誇りを守る戦いばかりだったような気がしましたが、自分は両方使えるようになりたいなと思います。
Numpy Arryay で 多次元配列 の作成【作業用コピペ】

ライブラリのインストール Numpy
import numpy as np

乱数用の変数作成

#多次元配列を作成する２つの例
#np.array #np.arange

data = np.array({1, 2 , 3, 4, 5})
data

data = np.arange(10)
data

for i in range(10):
  print(i)
  0
1
2
3
4
5
6
7
8
9
React：超基本

# はじめに
Reactを使用しているプロジェクトにアサインされようとしているが、超初見なので概要や関連する用語について学んだ結果をまとめてみようと思う。

※まとめてみたらほとんどDOMがイマイチ理解できず、半分くらいはDOMの説明となっている。

# Reactとは？
Reactは、ウェブアプリケーションのユーザーインターフェース（UI）を構築するための強力なJavaScriptライブラリです。
※Facebookによって開発され、現在では多くの開発者に愛用されています。

## Reactの主な特徴

### コンポーネントベースのアーキテクチャ

Reactの最大の特徴は、UIをコンポーネントと呼ばれる小さな、再利用可能な部品に分割することです。
これにより、複雑なUIも管理しやすくなり、コードの再利用性と保守性が向上します。

### 宣言的なプログラミング

Reactは宣言的なプログラミングスタイルを採用しています。
これは、「どのように」ではなく「何を」表示するかに焦点を当てるアプローチです。
開発者はUIの最終的な状態を記述し、Reactがその状態を実現するために必要な手順を処理します。

Reactの宣言的なプログラミングの特徴は以下の通り。
1. UIの状態を宣言する：開発者は、UIがどのように見えるべきかを記述します。

2. 自動的な更新：状態が変化すると、Reactが効率的にUIを更新します。

3. 抽象化：DOMの直接操作を避け、コンポーネントベースの設計に集中できます。

4. 可読性の向上：コードが「何を」達成したいかに焦点を当てるため、理解しやすくなります。

例えば、以下のようなコードは宣言的です：

```javascript
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
```

このコードは、「props.nameを使って挨拶を表示したい」ということを宣言しています。Reactが内部でDOMを効率的に更新する方法を処理するため、開発者はその詳細を気にする必要がありません

参考：https://tech.i3design.jp/react-declarative-ui/

### 仮想DOMを使用

Reactは仮想DOMという概念を使用して、効率的にUIを更新します。
これにより、実際のDOM操作を最小限に抑え、パフォーマンスを向上させています。

### 補足１：DOMとは？
DOMとは、Document Object Modelの略で、Webページの構造や内容を表現し操作するための仕組みです。
もう少し言えば、HTMLやXML文書をプログラムから操作するためのインターフェースを提供するAPIと言えます。
以下にDOMの主な特徴を簡潔に説明します：

1. ツリー構造：HTMLやXMLの文書をツリー状の階層構造として表現します。

2. プログラムからのアクセス：JavaScriptなどのプログラミング言語からWebページの要素にアクセスし、操作することができます。

3. 動的な操作：DOMを使用することで、以下のような動的な操作が可能になります：
   - HTML要素の追加や削除
   - 要素の属性変更
   - テキストの書き換え
   - スタイルの変更

4. クロスプラットフォーム：異なるプラットフォームでも同じ方法でWebページを操作できます。

DOMを理解することで、JavaScriptを使って動的なWebページを作成したり、ユーザーの操作に応じてページの内容を変更したりすることができるようになります。

### 補足２；仮想DOMとは？
仮想DOM（Virtual DOM）は、実際のDOMの軽量なコピーをメモリ上に保持し、効率的にUIを更新するための技術です。主な特徴は以下の通りです：

1. メモリ上のDOM表現：UIの仮想的な表現をJavaScriptオブジェクトとして保持します。

2. 差分検出と効率的な更新：新旧の仮想DOMを比較し、変更があった部分のみを実際のDOMに反映させます。

3. パフォーマンス向上：必要最小限のDOM操作で更新を行うため、レンダリングのパフォーマンスが向上します。

4. 開発効率の向上：開発者は直接DOMを操作する必要がなく、コンポーネントの状態管理に集中できます。

5. クロスプラットフォーム対応：実際のブラウザDOMに依存しないため、様々な環境で使用できます。

仮想DOMは、ReactやVue.jsなどの現代的なフロントエンドフレームワークで採用されており、大規模なWebアプリケーション開発において重要な役割を果たしています。

ちょっとこれだけだと（私が）理解できなかったので、もう少し噛み砕くと以下となる。
仮想DOMは差分のみを更新し、仮想DOMの仕組みは以下となる。

1. 初期状態では、実際のDOMの複製として仮想DOMが作成されます。

2. コンポーネントの状態が変更されると、新しい仮想DOMが生成されます。

3. 新しい仮想DOMと前の仮想DOMが比較され、差分が検出されます。

4. 検出された差分のみが実際のDOMに反映されます。

この仕組みにより、仮想DOMは必要最小限の更新のみを行い、パフォーマンスを向上させます。例えば、リスト内の一部の要素だけが変更された場合、変更された要素のみが更新され、リスト全体が再レンダリングされることはありません。

この最適化された更新プロセスにより、Reactなどのフレームワークは効率的なDOM操作を実現し、アプリケーションのパフォーマンスを向上させています。

## Reactを学ぶメリット

1. **需要の高いスキル**: Reactは多くの企業で採用されており、React開発者の需要は高いです。

2. **効率的な開発**: コンポーネントの再利用性により、開発速度が向上します。

3. **大規模アプリケーションの管理**: コンポーネントベースの構造により、大規模なアプリケーションも効率的に管理できます。

4. **パフォーマンス**: 仮想DOMの使用により、高速なUI更新が可能です。


以上
rex0220 スライドビュープラグイン

kintone アプリの一覧画面で、レコードごとに添付ファイルの画像をスライド表示するプラグインです。

# 概要

スライドビュープラグインの特長
・一覧画面でレコードごとに添付ファイルの画像をスライド表示
　※テーブル内の添付ファイルは対象外
・レコード詳細画面へのリンクとタイトル表示
・画像ファイル名とサイズ表示
・矢印キーで、画像移動とレコード移動
・スワイプで、画像移動とレコード移動
・Escキーで、スライドビュー終了
・画像ズーム機能追加
　※ダブルクリックでズーム開始/終了
・PCのみ対応

![2025-02-02_19h07_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0cdd81c9-dc82-7671-d179-c01d87d342a4.png)

※Ver.2 変更点
・スワイプで、画像移動とレコード移動
・画像ズーム機能追加
　※ダブルクリックでズーム開始
・スピナー表示タイミング改善

# 操作方法

- 一覧画面で、画像をクリックするとスライドビューが実行されます
- 左右のアイコンボタンをクリックして、画像を切り替え
- 矢印キーで、画像移動とレコード移動

![2025-02-02_19h50_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/905b867c-8bf0-9c2e-529f-5ed93bc9b2b6.png)

- ズーム操作
    - 画像をダブルクリックすると、ズーム画面に切り替わる
    - マウスのホイール操作で、拡大・縮小
    - 画像をダブルクリックすると終了

![2025-02-05_12h25_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ea489739-6d5e-7e58-c050-f6cf777a0771.png)

# スライドビュープラグイン設定

スライドビュープラグインは、対象アプリにプラグインを追加するだけで使用できます。

![2025-02-02_19h10_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/78f13893-d89a-e775-d7ad-e594d45c71c1.png)

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください
プログラムを効率的に実行する仕組み「バッファリング」について

# この記事について
標準入出力を使用したパイプ処理を実行しようとしたところ、バッファリングの影響で処理が途中で止まってしまいました。
バッファリングについての知識がなかったので調べたことをまとめます。

# バッファリングとは
データを即座に処理せず、一時的に貯めておく仕組みのこと。

プログラムに比較的遅い処理(画面出力やファイルへの書き込み等)が含まれる場合、
これらのデータを一時的にバッファに貯め、ある程度貯まったらまとめて出力や書き込みを行うことで効率的に処理を進める。

# バッファリングの例
### メール送信
1通ごとにメール送信をするとその度に手間や時間がかかるため、複数メールを一括で送信する。
### pythonのprint()
Pythonでprint()を使用すると、すぐに画面に表示されないことがあります。これは、出力がバッファにためられているからです。
```python: python
import time

print("このメッセージは遅れて表示される可能性があります...", end="")
time.sleep(5)
print(" 完了！")
```
上記のコードを実行すると、最初のメッセージが5秒後にまとめて表示されることがあります。

# pythonでバッファリングを無効化する方法
### `flush=True`を使用
print()関数にflush=Trueを指定すると、バッファを無視して即座に出力されます。
`print("これは即座に表示されます！", flush=True)`

### Pythonをアンバッファードモードで実行
ターミナル実行時に、Pythonをアンバッファードモードで実行することで、全ての出力のバッファリングを無効化できます。
`python -u ファイル名.py`

### sys.stdout.reconfigureを使用
すべてのprint()出力を行単位でバッファ解放することも可能です。
```python:python
import sys
sys.stdout.reconfigure(line_buffering=True)
```

# 参考
[Python Official Documentation - Output Buffering](https://docs.python.org/3/using/cmdline.html#cmdoption-u)
【Java】Spring Bootの環境構築（Web UI 版）

**Spring Boot の環境構築** を Web UI（Spring Initializr）を利用して行う備忘録です。ぜひ参考にしてください。
環境はApple M1 Pro、java17です。
## 1. Spring Boot プロジェクトの作成
### 1.1 Spring Initializr にアクセス
以下の URL にアクセスします。

**[Spring Initializr](https://start.spring.io/)**

### 1.2 プロジェクトの設定

| 設定項目 | 値 |
|---------|-----|
| **Project** | Maven |
| **Language** | Java |
| **Spring Boot Version** | 3.4.2 |
| **Group** | `com.example` |
| **Artifact** | `spring-boot-app` |
| **Name** | `spring-boot-app` |
| **Package Name** | `com.example.spring-boot-app` |
| **Packaging** | `Jar` |
| **Java Version** | `17` |

### 1.3 依存関係の追加

プロジェクトの依存関係（Dependencies）を選択します。

- ✅ **Spring Web**（REST API を作成するため）  
- ✅ **Lombok**（ボイラープレートコードを削減）  
- ✅ **Spring Boot DevTools**（開発用のホットリロード機能） 

### 1.4 プロジェクトの解凍
`Generate` ボタンをクリックし、ZIP ファイルをダウンロードします。

ダウンロードした `spring-boot-app.zip` を解凍し、作成されたフォルダを開きます。

```sh
unzip spring-boot-app.zip
cd spring-boot-app
```

## 2. プロジェクトの起動
### 2.1Maven の依存関係をインストール
プロジェクトのルートディレクトリで以下のコマンドを実行し、Maven の依存関係をダウンロードします。
```
./mvnw clean install
```
### 2.2Spring Boot の起動
以下のコマンドで Spring Boot アプリケーションを起動します。
```
./mvnw spring-boot:run
```
成功すると、以下のようなログが表示されます。
```
started on port 8080 (http) with context path '/'
```
ブラウザで http://localhost:8080 にアクセスすると、アプリケーションが動作していることが確認できます。
まだルーティングを設定していないのでWhitelabel Error Pageが出ます。

## 動作確認ようのAPI作成
環境構築が完了したら、簡単な REST API を作成して動作を確認しましょう。
### 3.1 コントローラーの作成
`src/main/java/com/example/springbootapp/controller/HelloController.java` を作成し、以下のコードを追加します。
```
package com.example.springbootapp;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}
```
### 3.2 API の動作確認
ブラウザで http://localhost:8080/api/hello にアクセスすると以下のレスポンスが表示されます。
```
{
  "message": "Hello, Spring Boot!"
}
```

## 4まとめ
✅ Spring Initializr を使用してプロジェクトを作成
✅ Maven で依存関係をインストール
✅ Spring Boot の起動と API 動作確認

この手順で Spring Boot の環境構築が完了しました！
次は、実際のアプリケーション開発を進めていきましょう。
(回答省略)「スーパーが休業日の前日は、食品の何を買えばいいですか。」AI先生に聞きました。

おすすめの聞き方を教えて下さい。


**スーパーが休業日の前日は、食品の何を買えばいいですか。**
**値引きが増える食品は何ですか。**

>(回答省略)

**まずは、スーパーに行って調べて来い。** とAI先生に言われませんでした。ヨカッタ。

# ChatGPT先生へ
# Gemini先生へ
# copilot先生へ




# google検索

スーパー 休業日 前日
【Next.js】publicフォルダの正しい指定方法

 # はじめに
 `Next.js`で画像の表示方法について詰まった箇所があったので、整理して記事にしました。

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

 # Next.jsでの画像の表示の仕方
## imgタグを使う場合
まず、`public`フォルダに画像を配置する場合、`img`タグでは以下のようにパスを指定します。
```
blog-app
└── public
    └── img
        └── xxxx.png
```
この場合、画像を表示するには以下のように`/img/xxxx.png`と記述します。

```tsx
 export default function Page() {
  return <img src="/img/xxxx.png" alt="img" />;
}
 ```
 
***`public`フォルダはURLのルート(`/`)として扱われるため、`public`を含める必要はありません***。

```tsx
 export default function Page() {
  return <img src="./public/img/xxxx.png" alt="img" />;
}
 ```
このように指定すると`public`をディレクトリとして解釈しようとするため、***画像が表示されません***。

## next/imageを使う場合
`next/image`を使用する場合も、`img`タグと同様に`public`フォルダ内のパスを指定できます。

```tsx
import Image from 'next/image'

 export default function Page() {
  return  <Image src="/img/xxxx.png" alt="img" width="64" height="64" />;
}
 ```
`next/image`はパフォーマンスを向上させるため、基本的にはこちらの使用が推奨されています。

# 終わりに
`Next.js`の画像管理は`public`フォルダの扱い方がポイントになることがわかりました。また`public`ディレクトリを使わず、`app`ディレクトリ内に画像を配置する方法もあるのでそちらについても今後学習していきたいと思います。

# 参考

https://nextjs.org/docs/pages/building-your-application/optimizing/static-assets
【安全確保支援士】SSO（シングルサインオン）とは？

## 概要
支援士に出てきたんでまとめます。

## SSOとは
一度のログインで複数のサービスにログインすることです。
例えば、Google Workspaceは、一度サインインするだけで、GmailとかGoogleMeetとか使えますね。
Gmail使うのにログイン、GoogleMeetするのにログインみたいに、その都度その都度ログインする必要ありません。

## SSO仕組み
SSOは、認証方法がいくつかあります。
それぞれ、紹介します

### 代理認証方式
![POP (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890669/fd14f5e2-6b5c-99eb-307d-413f586d01e7.png)
画像の通りです。特に説明は不要かと。
エージェントが、ログインを検知して自動ログインをするというシンプルなものです

### エージェント方式
![POP (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890669/ea0e6dcd-5e55-4571-d3a1-06635b9243c5.png)
代理認証方式が自身のPCにエージェントをインストールしていたのに対し、エージェント方式はwebサイトのwebサーバーやアプリケーションサーバー（APサーバー）にエージェントをインストールするもの。
使用するサーバーにインストールする必要があるため、トラフィックに応じて自動でサーバーを増減するクラウドサーバーだと、サーバーを増やしたときに、手作業でインストールするなどしないといけなくて、クラウドとは不向き。

### リバースプロキシ方式
![POP (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890669/364889d1-1c03-1354-537f-56ec0021b158.png)
リバースプロキシサーバーを経由する方法です。
リバースプロキシサーバーがユーザーの代わりにログインします。
既存のアプリケーションに、変更を加えないでいいため、レガシーなオンプレアプリなどで負担が少なくSSOを実装できます。しかしリバースプロキシサーバーを必ず経由するため、リバースプロキシサーバーに負担が増加した時に# 概要
支援士に出てきたんでまとめます。

## SSOとは
一度のログインで複数のサービスにログインすることです。
例えば、Google Workspaceは、一度サインインするだけで、GmailとかGoogleMeetとか使えますね。
Gmail使うのにログイン、GoogleMeetするのにログインみたいに、その都度その都度ログインする必要ありません。

## SSO仕組み
SSOは、認証方法がいくつかあります。
それぞれ、紹介します

### 代理認証方式
![POP (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890669/fd14f5e2-6b5c-99eb-307d-413f586d01e7.png)
画像の通りです。特に説明は不要かと。
PCに常駐しているエージェントが、ログインを検知して自動ログインをするというシンプルなものです

### エージェント方式
![POP (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890669/ea0e6dcd-5e55-4571-d3a1-06635b9243c5.png)
代理認証方式が自身のPCにエージェントをインストールしていたのに対し、エージェント方式はwebサイトのwebサーバーやAPサーバー（APサーバー）にエージェントをインストールするもの。
使用するサーバーにインストールする必要があるため、トラフィックに応じて自動でサーバーを増減するクラウドサーバーだと、サーバーを増やしたときに、手作業でインストールするなどしないといけなくて、クラウドとは不向き。

### リバースプロキシ方式
![POP (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890669/364889d1-1c03-1354-537f-56ec0021b158.png)
リバースプロキシサーバーを経由する方法です。
リバースプロキシサーバーがユーザーの代わりにログインします。
既存のアプリケーションに、変更を加えないでいいため、レガシーなオンプレアプリなどで負担が少なくSSOを実装できます。しかしリバースプロキシサーバーを必ず経由するため、リバースプロキシサーバーに負担が増加する可能性があります。

### 透過型方式
仕様としては、透過型のゲートウェイが通信の間に立ち、ユーザーの代わりにログインするものです。
リバースプロキシ方式と似てるなと思いますが、正確に言えば、リバースプロキシが表立って門番みたいにあるものだとすれば、透過型ゲートウェイは、裏でこっそり見守ってる感じです。裏でユーザーの知らないところで勝手にログインしてるみたいな？感じです。ここ詳しいことわからないんで深くまで言いません。ごめんなさい。

### SAML
SAMLは、イラストにするより文字のほうが分かりやすいかな？と思うので文字で説明します。
SAMLはidp（アイデンティティプロバイダー：認証を担当する側）とSP（サービスプロバイダー：サービスを提供する側）によって成り立ちます。

話はそれますが、上の画像などここで使ってる画像はcanvaで作成してます。
canvaにはログイン時にGoogleでログインという方法があります。はい、そうです。これがSAMLです。
ここのGoogleでログインする方法がまさしくSAMLです。
誤解がないように言うと、**Googleで**ログインすることがSAMLなのでは**ありません**。例えば、githubアカウントでログインするのにも、YahooアカウントでログインするのにもSAMLは使われます。SAMLは認証の方法であって、あくまでその実用例でGoogelアカウントでログインというのを例に挙げています。

詳しく説明します。
ユーザーがcanvaのログインページに到達し、Googleでログインを指定します。
この時SPといわれるのがcanvaで、idpは、Googleです
↓
ユーザーはGoogleのログインページにリダイレクトされ、認証情報を入力します。
↓
認証が成功すると、ユーザーには見えないところで、GoogleはSAMLアサーション（トークン）を生成します。これにはユーザーの識別情報が含まれています。
↓
そしてそのアサーションをcanvaに送信します。
↓
canvaはその情報をもとにユーザーをログインさせます。

これがSAMLの仕組みです。


以上です。
材料力学「(回答抜粋)構造物の判別式を教えて下さい。」をAI先生に聞きました。8種類

# ChatGPT先生へ
>(回答抜粋)
>1. 静定・不静定構造の判別式
>(1) 平面骨組構造（2Dフレーム）の場合 ...
>(2) 空間骨組構造（3Dフレーム）の場合
>2. 軸力部材（トラス）の判別式
>(1) 平面トラス（2D）の場合
>(2) 空間トラス（3D）の場合
>3. 材料の弾性安定性（座屈）
>4. 材料の破壊判別式
>(1) 最大主応力理論（ランクランの破壊基準）
>(2) 最大せん断応力理論（トレスカの破壊基準）
>(3) せん断ひずみエネルギー理論（フォン・ミーゼスの破壊基準）
>...
>どの判別式を詳しく知りたいですか？

???**難しい。(私は、これから勉強が必要です。)**

# Gemini先生へ

>(回答抜粋)

```python
```
# copilot先生へ

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

#### wikipedia 


#### Qiita


#### Google検索
PHPCompatibilityがインストールされてないと怒られた時の解決法

# はじめに
php5からphp7に移行するため、PHOCoompatilibilityを使って古い関数などをチェックしようとしたところ、インストールしてないと怒られたので対処法を記録。
```bash
ERROR: the "PHPCompatibility" coding standard is not installed. 
```

# 手順
#### 1.phpcsがすでにインストールされているマシンにPHPCompatibilityをインストール
```bash
composer require --dev phpcompatibility/php-compatibility

Using version ^9.3 for phpcompatibility/php-compatibility
./composer.json has been updated
Running composer update phpcompatibility/php-compatibility
Loading composer repositories with package information
Updating dependencies                                 
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking phpcompatibility/php-compatibility (9.3.5)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing phpcompatibility/php-compatibility (9.3.5): Extracting archive
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating optimized autoload files
```

#### 2.動作確認 => インストールされてないよエラー
```bash
vendor/bin/phpcs --standard=PHPCompatibility
ERROR: the "PHPCompatibility" coding standard is not installed. The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz, PSR1 and PSR12
```

#### 3.PHPCompatibilityをオプションとして認識できるようにpathを設定
```bash
vendor/bin/phpcs --config-set installed_paths vendor/phpcompatibility/php-compatibility
Using config file: /Users/honoka.arai/WORKSPACE/docker-boilerplate/data-host/batch/vendor/squizlabs/php_codesniffer/CodeSniffer.conf

Config value "installed_paths" added successfully
```

#### 4.動作確認2 => filenameないよエラーなので、動いてるっぽい🥳
```bash
vendor/bin/phpcs --standard=PHPCompatibility
ERROR: You must supply at least one file or directory to process.

Run "phpcs --help" for usage information
```

# 最後に
意外と簡単に解決できてよかったです...
参考になれば幸いです🍎
AzureのDeepSeekを試す

# はじめに
- 2025年1月29日に[AzureでDeepSeek R1が利用可能](https://azure.microsoft.com/en-us/blog/deepseek-r1-is-now-available-on-azure-ai-foundry-and-github/)になりました。
- 本記事ではAzureでDeepSeek R1を利用するまでの手順を記録します。

:::note warn
- 本記事は2025年2月2日現在の情報で記載しています。
- 手順や料金などが変更となっている可能性がありますので、ご注意ください。
:::

# 手順
[Azure AI Foundry](https://ai.azure.com/) にアクセスし、「モデル カタログとベンチマーク」を選択します。
![Azure_AIF_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/43fc7b7f-42bc-b831-ed71-a29ca5f8e956.png)


一覧から「DeepSeek-R1」を選択します。
![Azure_AIF_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/1c5ef0f9-a525-19b0-0471-6c18b41766a7.png)


「デプロイ」を選択します。
![Azure_AIF_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/d70d7e4c-ccd3-b8f2-9afa-4474b501d8fe.png)


既存のプロジェクトがない場合は、「新しいプロジェクトの作成」を選択します。
![Azure_AIF_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/a4fd8356-2151-9413-94cc-6fb25706d429.png)


任意のプロジェクト名を入力し、「カスタマイズ」を選択します。
![Azure_AIF_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/99f84921-5476-ef4b-57bf-215f2bd6b780.png)


それぞれ任意の名前を入力します。必要に応じて新規作成してください。
入力が終われば「次へ」を選択します。
![Azure_AIF_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/1c64a628-6a44-794f-33f9-8fb8c04376fa.png)

:::note info
2025年2月2日時点で私の環境では「West US 3」以外を選択すると後続でエラーとなり、デプロイできませんでした。
:::


内容を確認し、問題なければ「作成」を選択します。
![Azure_AIF_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/29666d94-4300-daae-4b23-d06e1e9f17d9.png)


必要なリソースが自動で作成されるので待ちます。
![Azure_AIF_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/22d48620-33ff-7b6d-c440-4e0823d476ba.png)


リソースが作成され、デプロイできる状態になると下記画面が表示されます。
問題なければ「同意して続行」を選択します。
![Azure_AIF_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/f5c3ed36-6696-05e5-ea0d-d1c38ca91f39.png)


任意のデプロイ名を入力し、必要に応じてカスタマイズをします。
問題なければ「デプロイ」を選択します。
![Azure_AIF_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/857a4588-4718-46f9-77e4-9bae079c8935.png)


デプロイが完了すると下記画面が表示されます。
実際に触ってみるには「プレイグラウンドで開く」を選択します。
![Azure_AIF_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/51319552-bcad-5850-2c4e-cd183bd9e7d9.png)


DeepSeekをお試しできる状態になりました。
![Azure_AIF_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/e4e5cc25-e6de-3008-33f7-c1dde781244d.png)

以上です。おつかれさまでした。
Mastering KVM Virtualization を読んだ感想

## はじめに

やっと自宅サーバでブログを動かすことができたので、ここ数ヶ月ずっと読んでいてようやく読み終わった本の感想を書こうと思います。
本のタイトルは「Mastering KVM Virtualization」というやつで、仮想化周り、特にQEMU/KVMについて詳しく知りたかったので読んでみました。
リンクを貼っておくので、気になる方は是非読んでみてください。

[Amazon | Mastering KVM Virtualization](https://amzn.asia/d/1C0K8xl)

![Mastering KVM Virtualization](https://m.media-amazon.com/images/I/71+-sEJFCWL._SY385_.jpg)

また、自宅サーバで動かしてるブログの方でより詳細な感想を書いているので、興味を持たれた方はぜひそちらもご覧ください。

https://blog.tomokon.net/posts/mastering-kvm-virtualization/

## 本の概要

この本はQEMUやKVMを中心としたLinuxの仮想化機能、またそれらを管理するシステムについての概要を述べている本です。
洋書で結構分厚い本なのでかなり読み応えがあります。

全体として、各トピックについてそこそこ詳しく記載されているが、Deep Diveというほどではない感じです。
例えば、QEMUやKVMのソースコードレベルでの解説等はほとんどありません（序盤に少しだけある）。

本の構成は以下の様になっています。

- Section 1: KVM Virtualization Basics
    - 1. Understanding Linux Virtualization
    - 2. KVM as a Virtualization Solution
- Section 2: Libvirt and ovirt for Virtual Machine Management
    - 3. Installing KVM Hypervisor, libvirt, and ovirt
    - 4. Libvirt Networking
    - 5. Libvirt Storage
    - 6. Virtual Display Devices and Protocols
    - 7. Virtual Machines: Installation, Configuration, and Life Cycle Management
    - 8. Creating and Modifying VM Disks, Templates, and Snapshots
- Section 3: Automation, Customization, and Orchestration for KVM VMs
    - 9. Cusomizing a Virtual Machine with cloud-init
    - 10. Automated Windows Guest Deployment and Customization
    - 11. Ansible and Scripting for Orchestration and Automation
- Section 4: Sclability, Monitoring, Performance Tuning, and Troubleshooting
    - 12. Scaling Out KVM with OpenStack
    - 13. Scaling out KVM with AWS
    - 14. Monitoring the KVM Virtualization Platform
    - 15. Performance Tuning and Optimization for KVM VMs
    - 16. Trouble Shooting Guidelines for the KVM Platform

「Section 1: KVM Virtualization Basics」ではKVMや仮想化技術に関する基本のおさらいをしてくれます。
そもそも仮想化とは何か、なぜするのかとか、仮想化の種類、仮想化の対象、そしてLibvirtやQEMU、KVMがそれぞれ何なのかみたいなことも説明されていました。

「Section 2: Libvirt and ovirt for Virtual Machine Management」では実際にLibvirtを使い、VMに対する操作を通して様々なリソースをどの様に仮想化して扱うのか、みたいなことを話していました。
virshコマンドの使い方についてはかなり詳しく書かれていて参考になり、またvirt-managerやoVirtといったGUIからVMを管理するソフトウェアの使い方についての記載もありました。

「Section 3: Automation, Customization, and Orchestration for KVM VMs」では仮想化技術そのものではなく、cloud-initやAnsibleを使ってVMの管理の自動化やスケーリングについて語られていました。

「Section 4: Sclability, Monitoring, Performance Tuning, and Troubleshooting」も仮想化技術そのものというよりは、仮想化技術を使ってクラウド基盤を構築するソリューションについての説明といった感じでした。
OpenStackやAWSの概要、仮想化基盤のモニタリング、そして最後にパフォーマンスチューニングや仮想化基盤のトラブルシューティングの仕方についての話が続きました。

## まとめ

もともと仮想化やQEMU/KVM周りの技術的な理解を深めたくてこの本を読み始め、特にSection 1でそれを割と達成できたので非常に満足しました。
QEMU/KVMの実装ベースの理解についてはコードリーディングやVMMの自作等を通して今後さらに深く学んでいきたいです。
また、Section2移行でも仮想化基盤に関連するソフトウェアの使い方や、仮想化基盤の運用のノウハウを学ぶことができて良かったです。

もし仮想化技術に興味があれば、Section 1だけでもぜひ読んでみることをお勧めします！
Power Automateで例外処理を強化！Switchアクションでエラーを分岐・処理する

# 1. はじめに
Power Automateでは、HTTPリクエストを実行する際にエラーが発生することがあります。特に、400（Bad Request）、403（Forbidden）、500（Internal Server Error）など、異なる種類のエラーに対して適切な処理を行うことが重要です。
本記事では、Switchアクションを用いてHTTPステータスコードごとに例外処理を行う方法を紹介します。

# 2. 例外処理の基本概念
## 2.1 HTTPリクエストとエラーレスポンス
HTTPリクエストを送信すると、レスポンスには「ステータスコード」と「レスポンスボディ」が含まれます。代表的なエラーステータスコードは以下のとおりです。

|ステータスコード  |説明  |典型的な原因  |
|---|---|---|
|400 Bad Request  |クライアント側のリクエスト不正  |入力データの形式ミス  |
|403 Forbidden  |アクセス権限がない  |APIの権限不足  |
|500 Internal Server Error  |サーバー側のエラー  |サーバー内部の処理失敗  |

## 2.2. Power Automateにおける例外処理のアプローチ
Power Automateの例外処理には、以下の方法があります。
- スコープアクションと実行条件の構成を使用して、Try-Catchパターンを用いる
- Switchアクションを使用して、ステータスコードごとに処理を分岐する（本記事で解説）

詳細な例外処理の方法については、以下の記事で紹介されています。

https://qiita.com/Min0rity/items/68d14376767cdc56283e


# 3. Switchアクションを用いた例外処理の実装
## 3.1. フローの全体構成
例外処理の流れは以下になります。
1. Tryスコープ内でHTTPリクエストを実行
2. エラー内容を解析するために、Apply to each と JSONの解析 を追加
3. エラー判定のために条件アクション（IF）を設定
4. Switchアクションでエラーの種類ごとに処理を分岐

## 3.2. エラー内容の解析
エラー内容を解析用に［Apply to each］と［JSONの解析］アクションを追加して、「以前の手順から出力を選択」の箇所に```result('Try')```を指定します。これにより、Try スコープで発生した複数のエラー情報に対して処理できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/e1a6b516-ce2f-1584-9d7d-3fbc8af2b972.png)

また、［JSONの解析］の「コンテンツ」には動的なコンテンツから【現在のアイテム】を選択します。そして「スキーマ」には下記のJSONをコピーして、【サンプルから作成】に張り付けて生成します。
```json:スキーマ
{
	"type": "object",
	"properties": {
		"name": {
			"type": "string"
		},
		"status": {
			"type": "string"
		},
		"code": {
			"type": "string"
		}
	}
}
```

## 3.3. エラー判定
エラー判定で［条件］アクションを追加して、左辺には「動的なコンテンツ」から```body('JSON_の解析')?['status']```を設定します。右辺には【Failed】を入力します。

## 3.4. Switchアクションによるエラー分岐・処理
ステータスコードに基づいて処理で［スイッチ］アクションを追加して、状態値に```body('JSON_の解析')?['code']```を設定します。

|ステータスコード  |処理内容  |
|---|---|
|400 Bad Request  |ログを記録し、ユーザーに入力ミスの可能性を通知する  |
|403 Forbidden  |管理者に通知し、権限を確認する  |
|500 Internal Server Error  |一定時間後にリトライ処理を実行する  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/5f7bcdce-7215-afe3-649b-43cd46c0e989.png)



# まとめ
Power Automateでは、Switchアクションを用いてHTTPエラー（400・403・500など）を種類ごとに処理でき、適切な対応を実装することで安定したワークフローを構築できるほか、リトライ処理やログ出力を組み合わせて例外処理を強化できます。