OmniAICreator/Qiita-1.07M huggingface dataset:
# GenAIと共に歩むF5資格試験の道: Day2 〜 BIG‑IPアーキテクチャの基礎理解

続きです。  
Day1の勢いを引き継ぎ、今回はBIG‑IPのアーキテクチャの概要理解にフォーカスしました。

ちなみにChatGPTが用意してくれたDay2のタスクでは、"翌日にディスカッションを行う"という、なかなかアグレッシブな内容だったので少し修正してもらいました。

```yaml:title=変更前のDay2タスク
目標: "BIG‑IPのアーキテクチャの基本構成を理解する"
タスク:
  - "F5の公式ドキュメントやDevCentral内の記事で「BIG‑IPアーキテクチャ」に関する資料を探し、読む (例: 「BIG‑IP TMOSの基本概念」や「F5のハードウェアとソフトウェアの連携」など)"
  - "アーキテクチャ図（ブロック図）を印刷またはスクリーンショットして、自分のノートに貼り付け、各コンポーネントの役割を整理する"
  - "不明点や疑問があれば、メモを取り、翌日のディスカッション用に準備する"
```



```yaml:title=修正後のDay2タスク
目標: "BIG‑IPのアーキテクチャの基本構成を理解する"
タスク:
  - "BIG‑IPアーキテクチャに関する資料を読み、主要コンポーネントの概要を把握する"
  - "アーキテクチャ図をキャプチャし、ノートに貼付して整理する"
  - "疑問点やキーポイントをリストアップする"
  - "振り返りレポートを作成する"
```

## 実際の取り組み

1. **資料読解と概要把握**  
   指示通りやろうと思いましたが、まだ概要把握の段階では、公式サイトの英語の資料に手が伸びませんでした。
   そこで、ChatGPT o3‑mini‑highに以下の問い合わせを行い必要な質問をすることで、タスク遂行とさせてもらいました。
   
   「BIG‑IPアーキテクチャに関して、詳しく教えてほしい。いったん網羅的に何があるのか教えてください。」
    　
2. **アーキテクチャ図のキャプチャとノート作成**  
3. **疑問点・キーポイントの整理**  
   この内容についても、真面目にやる気が起きず引き続きChatGPT o3‑mini‑highに問い合わせることで完了としてみました。

     「それぞれのコンポーネントがなぜ必要なのか教えてください？」
「フルプロキシ方式について、イメージが湧かないんだけど、普通のプロキシと比較した比較表を作って」
「各アーキテクチャの連携方法はどうなっているのか？について、もっと詳しく教えて」
「F5関連で、アーキテクチャ、コンポーネント、モジュール、コンテナなどに似た別の言葉で混同してしまいそうな言葉ある？」
「それらの言葉の関係性をマーメイド記法で視覚的に表現して」

    　
4. **振り返りレポートの作成**  
   こちらのタスクは、まさに今Qiitaに投稿していることで完了ということにしようと思います。

---

## まとめ

ちなみに、ChatGPT o3‑mini‑highがマーメイド記法で作成してくれた図はこちらです：

```mermaid
flowchart TD
  %% 内部設計レベル（技術的構成）の階層
  subgraph Internal[内部設計レベル]
    A["アーキテクチャ<br>(設計思想・全体構造)"]
    B["コンポーネント<br>(主要部品：TMM、MCPなど)"]
    C["モジュール<br>(個別機能提供：LTM、ASMなど)"]
    D["コンテナ<br>(独立実行環境・最新展開形態)"]
  end

  %% 運用／サービス提供レベルの階層
  subgraph Operational[運用/サービス提供レベル]
    E["プラットフォーム<br>(物理／仮想／クラウド基盤)"]
    F["システム／サブシステム<br>(大枠のシステム単位)"]
    G["ファンクション／サービス<br>(個々の機能・サービス)"]
    H["マイクロサービス／仮想ファンクション<br>(細分化した独立サービス)"]
  end

  %% 内部設計層の連携
  A --> B
  B --> C
  C --> D

  %% 運用層の連携
  E --> F
  F --> G
  G --> H

  %% 内部設計と運用層の対応（概ね1対1の関係）
  A --- E
  B --- F
  C --- G
  D --- H
```

誤った情報や改善すべき点を見つけた場合は、ご指摘いただけると幸いです。  
あくまで奮闘記として、温かく見守っていただけると嬉しいです。

明日の計画は以下ですが、ChatGPTに試験要綱を食わせて、スケジュールを微修正してもらってから始めようと思っています。
明日以降も、生成AIのサポートを受けながら、F5資格試験合格に向けた学習を着実に進めていきます。
```yaml:title=Day3タスク
目標: "F5の基礎機能（ロードバランシング、SSLオフロード、セキュリティ機能）の概要を理解する"
タスク:
  - "F5公式の技術記事や動画（YouTube、F5 DevCentralのWebinarなど）から、『ロードバランシングの仕組み』や『SSLオフロードの基本』を学ぶ"
  - "動画視聴後、要点を自分の言葉で簡単にまとめ、スライドノート形式で整理する"
  - "主要なF5機能のリストを作成し、各機能の目的と基本的な設定例をメモする"
```
Unityで2Dアクションをつくってみる(2) -プロジェクト作成とEditor初期画面の説明-

# はじめに
当方初学者につき内容に誤りのある場合があります。
調べた上で理解し、納得した内容を書くようにしていますが、ご了承ください。
私自身の知識を深める目的と、同じく初学者の方々の助けになればと思い記事にさせていただいています。
# 概要
本記事ではUnityHubでのゲームプロジェクトの作成と、初期のEditor画面の説明を行います。
操作については次回以降の記事で行う予定です。
# 環境について軽く
OSはMacOS
UnityのバージョンはUnity 6(6000.0.35f1)
コードエディタはVSCode バージョン: 1.96.4 (Universal)
## 1.UnityHub上でのプロジェクト作成
Unity Hubを日本語化している前提で
1.プロジェクトタブを開き、右上のNew Projectをクリック
2.コアタブからUniversal 2Dを選択し、必要であれば右のプロジェクト設定からプロジェクト名・保存場所を変更し、右下の「プロジェクト作成」をクリック

そうして、しばらく待ったのちにEditorが開くと思います

## 2.UnityEditorの画面について
デフォルト画面について簡易的に
![UnityEditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992369/51c8f229-1808-4e75-cdac-bbadc7c14cbd.png)
- Hierarchyタブ(左枠(紫))
現在のシーン上のゲームオブジェクトの一覧を保持しています。
ゲームオブジェクトはプレイヤー、スライムなどの敵、配置されているアイテム、背景、音楽などゲームを構成する各要素です。
敵が複数いるならその数だけゲームオブジェクトがあります。
- Scene/Gameタブ(中央(青))
  - Sceneタブ
Sceneは現在のシーンを確認できます。シーンは「タイトル」「ゲーム画面」「ロード画面」など
ゲーム画面についてはステージの分だけ存在することになります。
  - Gameタブ
Gameは実際に表示されるゲーム画面です。
- Inspectorタブ(右枠(赤))
Hierarchyタブで選択しているGameObject、またはProjectタブで選択しているもの(PrefabやSpriteと呼ばれるものなど)の情報の確認及び編集ができます。
- Project/Consoleタブ(下枠(黄))
  - Projectタブ
ProjectタブではProject内で使用する用のキャラクターの画像やBGMといった要素や、またはプロジェクト内で作成したゲームオブジェクトの複製(Prefab)やC#スクリプトを保持できます。
同プロジェクト内であれば各シーンで使い回すことができます。
  - Consoleタブ
Consoleタブではエラーが表示される他、自ら表示させたい内容について表示させることができます。
自ら表示させたい場合は例えば、HPを実装する際にそれを表示するUIが準備できてない場合にHPを表示させたり、複雑な条件分岐を行う際に機能しているかのチェックを行えます。

画面のレイアウトが使いにくい場合は右上(画像ではDefaultとなっているところ)から変更することができます。
また、自由に各タブは動かすことができるため、完全に自分用のレイアウトにすることができます。

# おわりに
次の記事ではゲームの基本の構成要素としてプレイヤーと地形のゲームオブジェクトの作成を作成する予定です。
Python3で使えるフレームワークの特徴

こんにちは、齋藤です。
Pythonには、WebアプリケーションやAPIを作成するためのフレームワークがいくつかあります。特に有名なのが、**Django**、**Flask**、**FastAPI**の3つです。
これらはそれぞれ特徴が異なり、プロジェクトの目的や規模に応じて選ぶことが大切です。

## 1. Pythonのフレームワークとは？

フレームワークとは、Webサイトやアプリを作るときに役立つ道具やルールのセットです。これを使うと、基本的な部分を一から作る必要がなくなり、効率的に開発できます。

## 2. 各フレームワークの特徴

### Django

**概要**

Djangoは、必要な機能が最初からたくさん入っているフレームワークです。
ユーザー登録やログイン、データベースとのやり取り、管理画面など、多くの機能が最初から使えます。

**特徴**

- **オールインワン**：多くの機能が最初から組み込まれているので、追加で用意する手間が少ない

- **情報が豊富**：長い間使われているので、学習資料や解説が多い

- **セキュリティ対策**：XSS、CSRF、SQLインジェクションなどの対策がデフォルトで提供されており、安全なWebアプリケーションの構築が容易

**適した用途**

- 大規模なWebアプリケーションや管理ツールの開発

- データベースを活用したアプリケーション

- 迅速な開発が求められるプロジェクト

### Flask

**概要**

Flaskは、必要最低限の機能だけを持つシンプルなフレームワークです。
必要に応じて、自分で機能を追加していく柔軟性があります。

**特徴**

- **軽くてシンプル**：最小限の構成で動作し、開発者の自由度が高い

- **学びやすい**：シンプルな構造のため、初心者でも比較的短期間で習得可能

- **自由度が高い**：必要な機能を選択的に追加でき、プロジェクトの要件に応じてカスタマイズが容易

**適した用途**

- 小規模から中規模のWebアプリケーションやAPIの開発。

- シンプルで柔軟な構造を求めるプロジェクト。

- 学習目的やプロトタイプの作成。

### FastAPI

**概要**

FastAPIは、新しいタイプのフレームワークで、特にAPIを高速に作ることに特化しています。
Pythonの新しい機能を活用して、効率的に開発できます。

**特徴**

- **高速なパフォーマンス**：非同期処理をサポートしており、高速なAPIの構築が可能

- **自動生成ドキュメント**：OpenAPIやJSON Schemaに基づくドキュメントを自動生成し、開発者とユーザー双方にとって利便性が高い

- **型ヒントの活用**：Pythonの型ヒントを活用することで、コードの可読性と信頼性が向上

**適した用途**

- 高速なAPIの開発

- 非同期処理を活用したアプリケーション

- 自動生成ドキュメントが求められるプロジェクト

## 3. まとめ

それぞれのフレームワークには、得意な分野や特徴があります。以下の表に、各フレームワークのメリットとデメリットをまとめました。

| フレームワーク | メリット | デメリット |
|---|---|---|
| **Django** | ・ 必要な機能が最初から揃っている<br> ・ 情報が豊富で学びやすい<br> ・ セキュリティ対策がしっかりしている | ・ 覚えることが多い<br> ・ 自由に設計しにくい |
| **Flask** | ・ シンプルで理解しやすい<br> ・ 自由に設計できる<br> ・ 学習のハードルが低い | ・ 必要な機能を自分で追加する必要がある<br> ・ 大きなアプリには向かない場合がある |
| **FastAPI** | ・ 高速に動作する<br> ・ APIの説明書を自動で作成<br> ・ 新しい技術を活用している | ・ 新しいフレームワークのため、情報が少ない場合がある<br> ・ 学習にはPythonの新しい機能の理解が必要 |

自分のプロジェクトの目的や規模、チームのスキルに合わせて、最適なフレームワークを選ぶことが大切です。
github と IPv6

# IPv6 じゃないと快適でない環境・・・
IPv4 だと何かと ssh が詰まるような僻地に行くことがあります。
DoCoMo回線のMVNO　かつCGNATされているようなところだと、IPv4での作業はHTTPSトラヒックが優先されているので、頻繁にタイムアウトします。正直使えません。

## github に ssh接続 でコミットできる環境=IPv4
```
~> dig aaaa github.com @8.8.8.8

; <<>> DiG 9.20.4 <<>> aaaa github.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39114
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;github.com.			IN	AAAA

;; AUTHORITY SECTION:
github.com.		1308	IN	SOA	dns1.p08.nsone.net. hostmaster.nsone.net. 1656468023 43200 7200 1209600 3600

;; Query time: 12 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Wed Feb 12 18:36:32 JST 2025
;; MSG SIZE  rcvd: 104

```

DevOps業界では常識なんでしょうか、IPv6を使って快適に作業できるのは、限られた世界になっているようです。　もうとっくのとうにIPv6リーチャブルになっていると思い込んでいたらそうでもなかったです。

## 2022年にすでに問題提起されていた。ge
[IPv6 support for cloning Git repositories #10539](https://github.com/orgs/community/discussions/10539)

特に権威ある回答がないままです。

## IPv4だけで いいじゃないという話にはちょっとならなそう。
* Reddit などでは、DDos対策の問題ではないか？という外野の意見も散見。
*　↑ 現状IPv4のほうがDDoSをIPアドレス単位で行う際のコストが低そうだということはありますが、IPv6も個別の配布が/64であったりと決して小割りのブロックのリストが爆発するという可能性は少ないと思われるのですが・・・
*　純粋に費用の問題なのか、スポンサー企業の競合にならないような規模感で維持ということも考えられると・・・
* 表立って出さず、IPv6 をテストしているのかもしれませんが、今のところはIPv6-Only ネットワークからgithub.comには届きません。
* 今後どうなるのかという話は、僕の知る限りでは見つけることができませんでした。　気になる人は多いと思います。
* 今後の動き、注目していきたいと思います。
GCP PCSE合格(更新)記(2025/2/12投稿)

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

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

https://qiita.com/handy-dd18/items/3fa22b081ed5685c1679

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

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

* 1．練習問題([Udemy](https://www.udemy.com/course/google-cloud-professional-cloud-security-engineer-exam-d/))を解いて問題に慣れる

## 練習問題
Udemyで公開されている[練習問題](https://www.udemy.com/course/google-cloud-professional-cloud-security-engineer-exam-d/)を購入して勉強しました。

この練習問題は25問×2セットと数が少なく、類似問題はそこまで多くなかったので、あまりお勧めはしません。
また、解説も一部なかったり間違った内容も多かったので、別のUdemy講座を使ったほうが良いと思います。

私は自分の知識が合っていることを確認するために色々調べたりしたので、逆に記憶に良く残りました。

# 受験した感想
今回も前回同様に1時間程度で解ききって、フラグ付き問題が25問程度、振り返りして15問ぐらいまで減らしました。
大分忘れているサービスも出てきていましたが、概要が理解できていれば選択肢を絞りやすい問題もそれなりにあったので、思ったほどは苦戦しませんでした。

初めて受ける方はUdemyの問題数が多い講座を解いて、しっかり基礎知識を入れてからの方が良いと思います。

# 受験結果
無事合格でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/2915a210-d551-4ee9-b1b0-bee943c347b4.png)

# おわりに
また2週間後に別のGoogle Cloud資格の更新があるので、連続合格できるように頑張ります。

内容は薄めですが、この記事がどなたかの参考になれば幸いです。
Macで選択範囲のスクリーンショットからOCRを自動実行する

# はじめに
この記事では、macOS環境で選択した範囲を文字起こしするシェルスクリプトの作り方を紹介します。

# 動機
AIに何かを聞く時、言葉を入れる。いろんなものをすぐ入れられるように、画面上の文字情報で範囲選択したところをOCR化するものがほしくなった。

# 実装
## 1. 必要なツールの準備

### Homebrewのインストール
HomebrewはmacOS用のパッケージマネージャです。まだインストールしていない場合は、[Homebrew公式サイト](https://brew.sh/)の手順に従ってインストールしてください。

### Tesseractのインストール
OCRエンジンとしてTesseractを利用します。ターミナルを開いて以下のコマンドを実行します：

```bash
$ brew install tesseract
```

これでTesseractがインストールされます。

## 2. スクリプトの作成

ターミナルでテキストエディタ（nanoやVSCodeなど）を使い、以下の手順でスクリプトファイルを作成します。

### ファイルの作成場所と名前
例として、`/usr/local/bin/quick_ocr.sh` に作成します。管理者権限が必要なため、以下のコマンドを実行してください：

```bash
$ sudo nano /usr/local/bin/quick_ocr.sh
```

### スクリプト内容

以下のコードをコピーして貼り付けます。出力先のファイルパスはうまく調整してください

```bash
#!/bin/bash
echo "連続OCRモードを開始しました。停止するには [CTRL+C] を押してください。"

# 出力先のファイルパス（必要に応じて変更）
OUTPUT_FILE="/Users/memo.txt"

while true; do
    # 一時ファイルのパス設定（PNGとJPEG）
    PNG_IMG="/private/tmp/screenshot.png"
    JPG_IMG="/private/tmp/screenshot.jpg"

    # 選択範囲のスクリーンショットを取得（PNG形式で取得）
    screencapture -i -t png "$PNG_IMG"

    # PNGが撮れているか確認
    if [ ! -f "$PNG_IMG" ]; then
        osascript -e 'display notification "スクリーンショットが取得できませんでした" with title "OCRエラー"'
        # 取得できなかった場合は次のループへ（例：キャンセルした場合）
        continue
    fi

    # PNGからJPEGに変換（sipsで）
    sips -s format jpeg "$PNG_IMG" --out "$JPG_IMG"

    # (オプション) 変換後のファイル情報をログ出力
    echo "再エンコード後のファイル情報:" 
    file "$JPG_IMG"

    # Tesseract のパス（環境に合わせて変更してください）
    TESSERACT_PATH="/opt/homebrew/bin/tesseract"

    # TesseractでOCRを実行し、結果を変数に格納
    OCR_RESULT=$("$TESSERACT_PATH" "$JPG_IMG" stdout)

    # OCR結果をテキストファイルに追記
    echo "$OCR_RESULT" >> "$OUTPUT_FILE"

    # 結果通知
    osascript -e 'display notification "OCR結果がmemo.txtに追加されました" with title "OCR完了"'

    # 一時ファイルを削除
    rm "$PNG_IMG" "$JPG_IMG"
done
```

#### スクリプトのポイント
- **連続処理**: `while true; do ... done` により、ユーザーが停止するまで連続してスクリーンショットとOCR処理を実行します。
- **スクリーンショット取得**: `screencapture -i` で選択範囲を取得。ユーザーが選択をキャンセルした場合は次のループへ進みます。
- **画像変換**: 取得したPNGファイルを`sips`コマンドでJPEGに変換。TesseractはJPEGの方が動作しやすい場合があるためです。
- **OCR実行**: Tesseractを呼び出してOCRを実行し、得られたテキストを指定のファイル（ここではDesktop上の`memo.txt`）に追記します。
- **通知**: `osascript` を使用して、macOSの通知センターに処理結果を表示します。

## 3. スクリプトに実行権限を付与

作成したスクリプトに実行権限を設定します。ターミナルで以下を実行してください：

```bash
$ sudo chmod +x /usr/local/bin/quick_ocr.sh
```

## 4. macOSのプライバシー設定

macOSでは、スクリーンショットの撮影やシステム操作には適切な権限が必要です。以下の手順で許可を与えてください。

1. 「システム環境設定」→「プライバシーとセキュリティ」を開く。
2. 「スクリーンレコーディング」または「画面収録」の項目で、使用するターミナル（Terminal.appやiTermなど）にチェックを入れる。
3. 必要に応じて、他のセキュリティ関連の設定も確認してください。

# スクリプトの実行

設定が完了したら、ターミナルで以下のコマンドを実行してスクリプトを開始します：

```bash
$ /usr/local/bin/quick_ocr.sh
```

スクリプトが起動すると、選択範囲のスクリーンショットを撮るためのカーソルが現れます。選択範囲を決めると、その画像に対してOCRが実行され、結果が指定したファイルに追記されます。停止する場合は、ターミナル上で [CTRL+C] を押してください。

# まとめ

新しいMacBookに変えたとき、再現できるようにまとめました。
Webスタンプラリーにおけるユーザー識別方法の比較と考察

# はじめに
スタンプラリーの状態はユーザー毎に管理する必要があります。LINEであればユーザーIDで管理できますが、Webの場合は代替手段が必要になります。
本稿では、Webでユーザーを識別する代表的な3つの実現方法（会員登録方式、UUID、ブラウザフィンガープリント）に焦点を当て、それぞれの概要、メリット、デメリットをまとめました。

# 実現方法
## 1. 会員登録方式
### 概要
ユーザーに会員登録をしてもらい、会員登録時にユニークなユーザー識別子を生成します。

### メリット
ユーザーを確実に識別できる。
ユーザー情報を管理できるため、属性情報に応じたサービス提供やマーケティング施策に活用できる。

### デメリット
ユーザーに会員登録の負担がかかる。
会員登録を面倒に感じたユーザーが離脱してしまう可能性がある。
会員登録の開発が必要になる。

## 2. [UUID (Universally Unique Identifier)](https://wa3.i-3-i.info/word13163.html)方式
### 概要
ユーザーが初回アクセス時にUUIDを生成＆Cookie等に保存します。以降はそのUUIDでユーザーを識別します。

### メリット
ユーザーに特別な操作を求めることなく、自動的に識別できる。
開発が比較的容易。

### デメリット
Cookie削除などにより、UUIDを再取得した場合にUUIDが変更されてしまい、スタンプラリー状態が引き継げなくなる可能性がある。
UUIDは、完全にユニークであることを保証するものではなく、わずかながら衝突の可能性がある。

## 3. [ブラウザフィンガープリント](https://www.saitolab.org/2023/11/25/web-browser-fingerprint%E8%A7%A3%E8%AA%AC%E3%83%9A%E3%83%BC%E3%82%B8/)方式
### 概要:
ユーザーのブラウザ情報（OS、ブラウザの種類、プラグインなど）を組み合わせてフィンガープリントを生成し、ユーザーを識別します。

### メリット
ユーザーに特別な操作を求めることなく、自動的に識別できる。
開発が比較的容易。

### デメリット
ブラウザのアップデートや設定変更、OSのアップデートなどによって、フィンガープリントは変化する可能性がある。
完全にユニークであるとは限らず、複数のユーザーで同じフィンガープリントを持つ可能性がある。
プライバシーの観点から問題視される可能性がある。

# まとめ
それぞれの方法にはメリットとデメリットがあり、Webスタンプラリーの目的によって適切な方法を選択する必要があります。

・開発予算に余裕がありユーザーを完全に識別したい場合：会員登録方式
・開発予算が少なく、Cookie削除時にスタンプラリー情報が引き継げないのは割り切り可能な場合：UUID方式

ブラウザフィンガープリント方式は、プライバシーの問題や識別精度に課題があるため、安易な利用は避けるべきでしょう。

免責事項
本稿はWebスタンプラリーにおけるユーザー識別方法について一般的な情報をまとめたものであり、特定のサービスや技術を推奨するものではありません。
MagicPodとSeleniumの比較

# イントロ

初投稿となります、ヨシナといいます。約3年QAエンジニアをしています。よろしくお願いします。

最近まではSeleniumというブラウザ操作自動化ツールを使用していて、現在は似たようなツールMagicPodを使っています。主な違いは、Seleniumはコードを書くツール、MagicPodはノーコードのツールです。Seleniumは２年半の経験があり、MagicPodは使い始めてから3カ月になりました。本記事ではMagicPodに触れ始めてから感じている各ツールのメリットとデメリットについて書きます。

# コードとノーコード

ノーコードツールの一番のメリットは何といってもコードを書く必要がないことです。SeleniumはPythonで書き、フレームワークや環境を構築して実際に運用できるようになるまで半年かかりました。又、プログラミングの知識が必要であり、QAエンジニアは必ずしもプログラミングを経験していません。MagicPodは画面の要素をクリックするだけでテストケースを簡単に作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996946/292582c1-8a9e-4139-a40b-9ac75db7c3fe.png)
（図１）MagicPodのテストケース作成例

# 要素の管理

MagicPodではテストケースの作成が簡単になった分、要素の管理が難しくなったと思います。Seleniumでは全ての要素のロケーターをコンフィグファイルで管理し、UIに変更があった際は一行を変更するだけで対応が可能でした。使っている要素も一覧になっていて分かりやすいです。MagicPodではテストケースに入って変更に該当するUI要素を操作しないといけません。

```
open_btn=//button[id=”open”]
close_btn=//input[id=”close”]
...
```

（図２）ロケーターの管理例

# インフラ

MagicPodはSaaS ( Software as a Service )のため、ユーザはインフラの管理が不要です。Seleniumではユーザが実行環境を管理し、停電、ドライバーの更新、実行環境のアップデートなどに対応する必要があります。管理する分、リソースなどに対する柔軟性はありますが、メンテナンスコストは高くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996946/d6d46e37-e723-4546-90aa-5142dff8f887.png)
（図３）ブラウザのドライバーは定期的に更新される (引用: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?form=MA13LH#downloads )

# ステップの作りやすさ

フレームワークが整っている場合、Seleniumで要素の操作は一瞬で書けます。クリックや入力などの一般的な操作を関数やメソッドにし、コードエディタのオートコンプリート機能で行いたい操作がすぐでてきます。セレクターも変数で持っておくことが可能なため、一つの要素に対し複数の操作を簡単に書けます。MagicPodでは最初、行いたい操作をメニューで選択し、セレクターを設定します。同じロケーターに対して複数のステップを作成する際はステップごとにロケーターの設定が必要です。


```python
class Page:
    def __init__(self):
        self.browser = None

    def click(self,locator:str):
        self.browser.click(locator)

class HomePage(Page):
    def __init__(self):
        self.browser = None
        self.open_btn_locator = "//input[id='open']"

    def click_open_btn(self):
        self.click(self.open_btn_locator)
```
（図4）一般操作をメソッドにしたサンプルコード

# まとめ

MagicPodを使用する前はSeleniumの方が使いやすいと思いました。コードを書く分、柔軟性があり、様々な操作を行うことが可能です。その反面、MagicPodは運用のしやすさがあります。プログラミングの知識が不要、メンテナンスコストも低いです。両方にメリットとデメリットがある中、最終的にはどのように運用するかで各ツールの効果が表れると思います。こちらについてはまた別の記事で書きます。

---

# KIYOラーニング株式会社について

当社のビジョンは『世界一「学びやすく、分かりやすく、続けやすい」学習手段を提供する』ことです。革新的な教育サービスを作り成長させていく事で、オンライン教育分野でナンバーワンの存在となり、世界に展開していくことを目指しています。

https://kiyo-learning.com/

## プロダクト

* [スタディング](https://studying.jp/)：「学びやすく・わかりやすく・続けやすい」オンライン資格対策講座
* [スタディングキャリア](https://career.studying.jp/)：資格取得者の仕事探しやキャリア形成を支援する転職サービス
* [AirCourse](https://aircourse.com/)：受け放題の動画研修がついたeラーニングシステム（LMS）

### KIYOラーニング株式会社では一緒に働く仲間を募集しています

https://www.wantedly.com/companies/kiyo-learning/projects
https://herp.careers/v1/kiyolearning
英単語クイズソフトウェアの作成

# 動機
僕の弟が英検3級に受かりそうにないため、英検5級から英検3級までの範囲の英単語を4択形式で解いていくソフトウェアをJavaのSwingで作成しました。
## 実際の動き
https://youtu.be/oOs1QpErC4A
## プロジェクト
下のEnglishWord.jarで動かせます。

https://github.com/Aufest/EnglishWord_software
## プロジェクトのディレクトリ構成
```
English_word/
├── bin/
├── lib
├── resource/
│   ├── img/
│   │   └── english.png
│   └── Englishwords.csv
└── src/
    └── english_word/
        ├── Action.java
        ├── English_database.java
        ├── Set_class.java
        ├── Swingcalc.java
        └── VoiceAI.java

```

## 全体の流れ
スタート画面、プレイ画面、アンサー画面の3つが用意されている。

スタート画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948746/a9709f02-b11f-41ab-802b-0d60278aaf5b.png" width=35%)>

プレイ画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948746/0862e3f3-fcef-4377-97d0-41b73cf531da.png" width=35%)>

アンサー画面(答えがあっていた場合)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948746/daad44a1-ce7a-46e3-ac35-3874dbcc60c4.png" width=35%)>

アンサー画面(答えが間違っていた場合)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948746/16b03eea-c08d-4854-b8a9-4d7dc653b05c.png" width=35%)>

スタート画面にあるSTARTボタンを押すと問題が生成されてプレイ画面に移動する。プレイ画面には、AからDまでの答えを選ぶボタンがあり、それらのボタンを押すとアンサー画面に移動する。上のディスプレイに表示されている英単語の意味とボタンの日本語訳が一致した場合は"正解"と表示され、そうでない場合は"不正解"と表示される。アンサー画面のHOMEボタンとNEXTボタンがある。HOMEボタンを押すとスタート画面に移動し、NEXTボタンを押すと問題が更新されてからプレイ画面に移動する。

## 細かい仕様
* 出題する英単語の指定
スタート画面にあるコンボボックスとラジオボタンで出題する英単語の範囲を決める。例えば、コンボボックスで英検4級を選び、ラジオボタンを選択すると英検4級の英単語のみ出題される。ラジオボタンを選択しなかった場合は、英検5級と英検4級の英単語が出題される。また、プレイ画面に表示される英単語はランダムで表示される。
* 英単語の管理
英検5級から英検3級までの英単語を網羅しないといけないため、計2161個の英単語が必要になった。そのため、リソースフォルダ内にあるEnglishwords.csvから一時データベースを作成して、英単語のデータを管理した。DBMSは、SQLite3を使用した。
* 合成音声
プレイ画面のVOICEボタンを押すことで上のディスプレイに表示されている英単語を読み上げてくれる。英単語の読み上げには、FreeTTSというAPIを活用した。
* 閉じるボタンを押した時の動作
閉じるボタンを押した時に一時データベースある場合は、一時データベースを閉じてから削除する。

## 展望
英語訳の問題を追加したり、英検準2級以降の級にも対応できるようにしたり、ランキング機能の導入などもしたいなと考えています。

## 使用した英単語のデータ
https://www.eigo-duke.com/teach/tango.html

ここの英検5級から英検3級までの英単語のデータを加工してEnglishwords.csvを作成しました。ありがとうございました。
yukicoder No.2937 Sigma Plus Problem の O(log N) 解法

# 謝罪
元の解説文の一部に、作問者に失礼だと思われるような記述があるとのご指摘を受けましたので、該当する部分を全て削除いたしました。
誠に申し訳ございませんでした。
# 問題概要
[問題文](https://yukicoder.me/problems/no/2937)
> ある正整数 $N$ が与えられます。
> $\sum_{i=1}^Ni$ を求めてください。
> ただし、 $N$ は $N\le 5\times10^9$ を満たす正整数とします。
# 解法
## 前提
まず、 $f(n)$ を以下のように定めます。$$f(n)=\sum_{i=1}^ni=1+2+\cdots+n$$この関数には、以下のような重要な性質があります。
* $f(n)$ の値がわかったら、 $f(n+1)$ の値を $O(1)$ で計算できる

$f(n+1)=f(n)+n+1$ で計算できます。
* $f(n)$ の値がわかったら、 $f(2n)$ の値も $O(1)$ で計算できる

これは、以下のように計算できます。

```math
\begin{align}
f(2n)&=1+2+\cdots+n+(n+1)+(n+2)+\cdots+2n\\
&=2(1+2+\cdots+n)+n+n+\cdots+n\\
&=2f(n)+n^2
\end{align}
```
## 計算
$f(n)$ を求めるとき、以下のように再帰計算していくことを考えます。
* $n=1$ なら、答えは $1$ である。
* $n$ が奇数なら、 $f(n-1)$ を先に計算する。
* $n$ が偶数なら、 $f(n/2)$ を先に計算する。

この関数をそのまま実装すると、以下のようになります。
```py:Python
def f(a):
    if a == 1:
        return 1
    elif a % 2:
        return f(a - 1) + a
    else:
        return 2 * f(a // 2) + (a // 2) * (a // 2)
```
## 計算量解析
そのままだと分かりづらいので、 $n$ を二進表記して考えます。
* $n$ が奇数なら、 $n$ の一番右の桁である $1$ を $0$ にする。
* $n$ が偶数なら、 $n$ の一番右の桁である $0$ を消す。

これを考慮すると、**どのような $n$ の場合でも、高々 $2$ 回操作すれば桁数が $1$ つ減る**、ということが言えます。
最終的に計算したいのは $f(N)$ であり、 $N$ を二進表記した時の桁数は $O(\log N)$ なので、全体の計算量も $O(\log N)$ です。
# 実装例
```py:Python
def f(a):
    if a == 1:
        return 1
    elif a % 2:
        return f(a - 1) + a
    else:
        return 2 * f(a // 2) + (a // 2) * (a // 2)
N = int(input())
print(f(N))
```
```cpp:C++
#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
ull f(ull a) {
    if (a == 1) {
        return 1;
    } else if (a % 2) {
        return f(a - 1) + a;
    } else {
        return 2 * f(a / 2) + (a / 2) * (a / 2);
    }
}
int main() {
    ull N;
    cin >> N;
    cout << f(N) << '\n';
}
```
おわり。
お手軽！KindクラスタでKubeletパラメータを急ごしらえ変更する方法！

こんにちは！
急に「現在動いているkindクラスタの cadvisor のメトリクス取得間隔を 1 秒にしてみたい！」等、kubeletの設定値を変更したいと思った…なんてことはありませんか？  
そんなときに便利な kubelet の起動パラメータをサクッと直接変更する方法を紹介します！

## 1. kind-control-plane に接続！

まずは対象ノード、ここでは **kind-control-plane** に入ります。
※複数のnodeがある場合は適宜その分繰り返してください

```bash
docker exec -it kind-control-plane bash
```

## 2. vim をインストールする

※デフォルトだとeditorがないので、以下のコマンドで vim をインストールしましょう。

```bash
apt update && apt install vim -y
```

## 3. kubelet の設定ファイルを編集する

今回変更対象のファイルは以下です。
（※このファイルは、kind のベースイメージ内にあるファイルです。）

```ini:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# https://github.com/kubernetes/kubernetes/blob/ba8fcafaf8c502a454acd86b728c857932555315/build/debs/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
```

vim でこのファイルを開き、`ExecStart` の行に `--housekeeping-interval=1s` オプションを追加します。  
以下は編集例です（位置はあくまで一例になります）：

```diff
 ExecStart=
-ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
+ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS --housekeeping-interval=1s $KUBELET_EXTRA_ARGS
```

## 4. 設定を反映させる

ファイルを保存したら、systemd に変更を認識させ、kubelet を再起動します。

```bash
systemctl daemon-reload
systemctl restart kubelet
```

これで kubelet は新しい起動パラメータで稼働し、cadvisor のメトリクス取得間隔が 1 秒に変更されるはずです！

---

## 最後に

今回の方法は、あくまで **検証用で「急に試してみたくなった！」** ときの雑な対応例です。本番環境での恒久的な解決策としては、Kubernetes の設定管理をきちんと行うことをおすすめします。
💡 クリスタル・インテリジェンス vs フルイド・インテリジェンス：AIの未来を徹底比較！🤖🔍

# クリスタル・インテリジェンス vs フルイド・インテリジェンス：違いと活用方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/0b9de93e-d2f7-4a56-831f-d4228b41917f.png)

## 🌟 はじめに
AIの進化とともに、「クリスタル・インテリジェンス（結晶性知能）」と「フルイド・インテリジェンス（流動性知能）」という概念が注目されています。最近、ソフトバンクとOpenAIが企業向けAIサービス「クリスタル・インテリジェンス（Cristal Intelligence）」を発表し、話題になっています。

本記事では、
- クリスタル・インテリジェンスとフルイド・インテリジェンスの違い
- それぞれのメリット・デメリット
- 実際の活用例
- ソフトバンクとOpenAIの取り組み

について解説します。🚀

---

## 💎 クリスタル・インテリジェンスとは？
クリスタル・インテリジェンスとは、過去の経験や知識を活用し、パターン認識やルールに基づいた推論を行う能力を指します。データベースや書籍、文書、業務マニュアルなど、固定化された情報を活用するのが特徴です。

### ✅ メリット
- **大量の情報を記憶し活用できる** 📚
- **ルールや規則に忠実でミスが少ない**
- **業務の効率化に最適**

### ❌ デメリット
- **未知の問題には対応しづらい**
- **柔軟な発想や創造的な問題解決が苦手**

### 🔹 クリスタル・インテリジェンスの活用例
- **法律事務所**：判例データベースを活用し、過去の裁判結果から適切な法的アドバイスを提供。
- **企業の業務最適化**：過去の売上データをもとに需要予測を行う。
- **ヘルプデスクAI**：FAQデータをもとに顧客対応を自動化。

---

## 🌊 フルイド・インテリジェンスとは？
フルイド・インテリジェンスとは、未知の問題や新しい環境に適応し、創造的な解決策を導き出す能力を指します。新しい状況に対する論理的思考や推論が求められる場面で活躍します。

### ✅ メリット
- **新しい問題に柔軟に対応できる** 🔄
- **創造性やイノベーションに強い**
- **パターン認識や予測分析が得意**

### ❌ デメリット
- **過去のデータがないと判断が不安定になる**
- **ルールがない環境では試行錯誤が必要**

### 🔹 フルイド・インテリジェンスの活用例
- **研究開発**：新しい技術や製品の開発で未知の課題に取り組む。
- **金融市場分析**：経済動向を分析し、新しい投資機会を見つける。
- **自動運転AI**：未経験の道路状況でも適切な運転判断を下す。

---

## 🏆 どちらが優れているのか？
用途によってどちらの知能が適しているかが変わります。

| 項目 | クリスタル・インテリジェンス | フルイド・インテリジェンス |
|------|------------------|------------------|
| データの活用 | 過去の情報を利用 | 新しい情報を分析 |
| 柔軟性 | 固定されたルールに基づく | 状況に応じた判断 |
| 応用範囲 | 既存のプロセス最適化 | 未知の問題解決 |
| 主な用途 | 法律、業務効率化、データ処理 | 創造的問題解決、イノベーション |

結論として、
- **ルールに基づいた業務効率化が必要な場面では「クリスタル・インテリジェンス」** が有効。
- **新しい問題や未経験の状況に対応する必要がある場合は「フルイド・インテリジェンス」** が強い。

---

## 🤝 ソフトバンクとOpenAIの「クリスタル・インテリジェンス」

最近、ソフトバンクとOpenAIが共同で開発した **「Cristal Intelligence」** が発表されました。

### 🎯 **Cristal Intelligenceの特徴**
✅ **企業向けAI**：社内データを活用し、業務の最適化や意思決定をサポート。
✅ **システム最適化**：古いプログラムコードを最新の技術に変換。
✅ **会議アシスト**：過去の会議記録をもとに議論を整理し、的確な提案を提供。
✅ **法務・財務サポート**：過去のデータをもとにリスク管理やコンプライアンス対応を強化。

### 🏢 **企業での活用例**
- **大手金融機関**：過去の融資データを分析し、リスク評価の自動化。
- **製造業**：設備メンテナンス履歴を分析し、最適な修理時期を予測。
- **医療分野**：患者の過去の診断データを解析し、適切な治療法を提案。

**🔹 Cristal Intelligenceは、クリスタル・インテリジェンスの強みを最大限に活用したAI** であり、企業の業務効率化に大きく貢献すると期待されています。💡

---

## ✨ まとめ
📌 **クリスタル・インテリジェンス** は過去の知識を活用し、ルールベースの最適化に強い。
📌 **フルイド・インテリジェンス** は未知の問題に対応し、新しいアイデアを生み出すのに優れている。
📌 **ソフトバンクとOpenAIのCristal Intelligence** は企業の業務効率化や意思決定を支援する最先端AI。

🔥 **どちらを使うかは、状況次第！**

🚀 **企業での業務最適化にはCristal Intelligence！**
🎨 **イノベーションや研究開発にはフルイド・インテリジェンス！**

今後、AIの進化とともに、これらの知能を組み合わせた新しいサービスが登場することが期待されます。💡✨
OCI Base Database Service (BaseDB)個人的メモ

# はじめに
BaseDBについての個人的なメモを随時追加していきます。マニュアルに書いてあるよく参照する項目や、マニュアルに記載はないがよく参照する情報を書いていく予定です。



## Oracle Linuxのバージョン
BaseDB作成時に選択できず、Oracle Linux 8.xとなる(2025年6月時点)。
https://docs.oracle.com/en/cloud/paas/base-database/create-dbs-new/index.html

### Oracle Linuxのカーネル
Red Hat Compatible Kernel (RHCK)、Unbreakable Enterprise Kernel(UEK)が付属しており、デフォルトはUEK。
https://docs.oracle.com/cd/F22978_01/relnotes8.10/ol8.10-ShippedKernels.html

## エディション
Standard、Enterprise、High Performance、Extreme Performanceの4種類のエディションから選択する。
Data GuaredはEnterprise以上、マルチテナントやパーティショニングはHigh Performance以上、RACやActive Data GuardはExtreme Performanceが必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/496287ce-93ef-40b6-938f-0a8406be0129.png)


## スケーリング
CPU、メモリのスケーリングは再起動が必要。1OCPUあたりメモリは16GBで固定。10OCPUであれば160GBになる。
ストレージのスケーリングは再起動が不要（オンラインスケーリング）。256GBが最小で512GB、1024GB、2048GBと選択できるストレージサイズは倍々に増える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/9d293169-4190-416c-8f5c-15220f6efa38.png)

OCI CLIでスケーリング可能。
```
oci db system update --db-system-id <DBシステムのOCID> --cpu-core-count <変更後のOCPU数>
```

https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.54.1/oci_cli_docs/cmdref/db/system/update.html

## 管理範囲
ユーザーはroot権限を持ちOS以上を管理する。OS、GI、Databaseなどパッチ適用はユーザーが行う。ハイパーバイザー以下はOracleが管理。

## 作成可能なPDBの数
Standard Edition、Enterprise EditionはPDB3つまで、High Performance以上(Extreme Performanceも含む)ではMultitenantが有効になるのでPDBを4096個作成可能。
https://docs.oracle.com/cd/F19136_01/dblic/Licensing-Information.html#GUID-0F9EB85D-4610-4EDF-89C2-4916A0E7AC87

## インフラ障害発生時の再起動
インフラ障害(CPUやメモリなどの障害)によってVMが停止した場合、自動的に正常なホスト上でVMが起動する。管理者へのメール通知、コンソールのお知らせから再起動したことを確認できる。BaseDBに限らず、Computeについてもインフラ障害が発生した場合は再起動が走り、正常なホスト上でVMが起動する

## プロビジョニングの所要時間
手元の環境では1時間~1時間30分ほど。1時間で終わることもあれば1時間半かかることもある。

## シェイプ変更の所要時間
ストレージはオンラインのまま拡張できるが、CPU数の変更を行う際は再起動が発生する。手元の環境で試したところ再起動の所要時間は10分弱ほど。ExaDB-DはCPU、メモリ、ストレージをオンラインでスケールできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/7782af9a-170a-4fea-9e7f-c8174988151c.png)

## Data Duard有効化の所要時間
Data Guardアソシエーションからコンソール上でData Guardを有効化する。有効化する仮定で同時にStandby DBも作成するので時間がかかる。手元の環境では1時間15分ほどでData Guard構成が有効化。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/4e03a289-f059-4e98-b960-481cad4d7e6d.png)

## フェイルオーバーの所要時間
手元の環境では2~3分で完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766517/b2901d77-5233-48f4-b98e-840b30a23865.png)
フォームでURLを送ったら５０１

# １０年近く平穏だったのに、、、
夜中ユーザーとリアルタイムにやり取りしていて
ユーザーからの情報をフォームでURL登録していたら突然の**５０１**

どうやらPOSTしたURLがXServerのWAFによりURLに含まれていた文字列**ping**で弾かれていたようです。

自分のサービスは卓球にかかわっているのでping-poing、結構使われる機会があるので今後のために対策せねば。

## WAFのコマンド部分をオフにすることで解決！？

調べてみるとWAFのコマンド部分をオフにすることで解決と見かけたのだけれどそうすると
killやrm,lsなどまでWAFにかからなくなってしまうので不採用

## 仕方ないので

501が返ってきたらこのURLは登録に確認必要なので運営に連絡くださいという感じのメッセージを出すだけに

まあ１０年近く運用して初発生レベルなのでお互いさほど負担にはならないと思うので良しとしよう。

### このポストだけWAFスルーする

とか出来ないよね^^;
【2025年最新版】SAML（Security Assertion Markup Language）についてざっくり解説。

## SAML（Security Assertion Markup Language）の概要
異なるドメイン間でユーザー認証情報をやり取りするためのXMLベースの標準規格である。
主にSSOの仕組みを実現するために利用され、企業や組織のクラウドサービス、Webアプリ間の**認証**や**認可**に用いられている。

## 認証（Authentication）と認可（Authorization）の違い
| 項目 | 説明|
|:-:|:-:|
|認証（Authentication）  | ユーザーが「本当に本人なのか？」を確認すること  |
|認可（Authorization）|認証されたユーザーが「何ができるか」「どのリソースにアクセス権限があるのか」を決定すること。所謂、管理者権限の割当やアクセス制御が認可であるといえる。|

→SAMLは主に**認証**を担っている仕組みである。（厳密にいうと認可も一部サポートする。）つまり本人かどうかを確認するということ。

## SAMLのメリット
・SSOによる利便性向上。
・セキュリティ強化。
・アクセス管理の一元化。

## SAMLのデメリット
・設定が複雑。（XMLベースだから）
・モバイル対応が弱い。（SAMLはweb向け！）
・リアルタイムのセッション管理が困難。（SAMLにはトークンを動的に更新する仕組みがないので）


## 具体的な仕組み（SSOの流れ）
### SAMLに出てくる3人の登場人物

| 名前 | 説明 | 例 |
|:-:|:-:|:-:|
|ユーザー|サービスを使いたい人|実世界の私達（学生、社会人など）|
|IdP(アイデンティティプロパイダー)|ユーザーを確認するシステム|Google,Azureなど|
|SP(サービスプロパイダー)|実際に使いたいサービス|Gmail,AWSなど|

###  IdP Initiated SSO(IdPからログインする場合)
これは、ログイン管理システムに入ってから各サービスを使うパターン（Google cloudをイメージしてもらうとわかりやすいと思います。まずはGoogle cloudにログインして任意のAPIを使ったり、クラウドサービス使ったり、、、というようなイメージ。）

1.ユーザーがIdPにログイン
→ （例：Google Cloudにログイン）

2.IdPが「この人はOK！」と判断
→ SAMLアサーション（証明書みたいなもの）を作る！

3.SAMLアサーションをSP（サービス）に渡す
→ （GmailやAWSなどに自動ログイン！）

### SAMLアサーションの中身などを知りたい人向け！

このサイトめっちゃ分かりやすいです！

https://zenn.dev/kobababa/articles/99647784322610

### SP Initiated SSO（SPからログインする場合）
1.ユーザーがSPにログイン
→（例：Gmailのログインページを開く）

2.SPが「この人のIdPに確認しよう！」とIdPへリダイレクト
→（例：Googleが「この人、どこでログイン管理されてるんだ？」と探す）

3.IdPが「OK！」と判断して、SAMLアサーションをSPへ送る
→ (結果、Gmailにログインできる！)
【備忘録】Linuxコマンド【ファイル操作基礎編】

初めまして、ほうじ茶と申します。
職業はよわよわ解析エンジニアです。

備忘録として __「結局、通常業務の範囲内で使うのここらへんよなぁ」と思ったCUI__ を殴り書きします。
プログラマさんだったらgitほにゃららとかも大事だけど、一旦ファイル操作の基礎中の基礎だけ。
自分用の備忘録ですが「ここ違うンゴよ」等あったら教えて頂けると幸いです。

環境はLinux/Ubuntu20.xxです。
※ 便宜上ファイルを[file]、ディレクトリを[dir.]と表記します。

| コマンド | 説明 |
|:-:|:-:|
|  cd [pass] | [pass]に移動（[pass]をカレントディレクトリにする）|
|  cd .. |  カレントディレクトリより一つ前のディレクトリに移動 |
| cd - | 移動前のディレクトリに移動 |
| gedit | （pass指定なし）新規txtファイルを作成 /（pass指定あり）指定したファイルを編集 ※ sudoが必要な場合あり|
| ls  | カレントディレクトリのファイル/ディレクトリを一覧表示 |
| ls -l | 日付や権限情報も追加して表示 |
| ls -a | 隠しファイル含め表示 |
| cat [file] | [file]の内容を表示 |
| less [pass] | [pass]の内容を表示 |
| mv [file(A)] [file(B)] | A(ファイル名)をB(ファイル名)に変更 |
| mv [dir. or file(A)] [dir.(B)] | A(ディレクトリorファイル)をB(ディレクトリ)に移動|
| cp [file(A)] [file(B)] | A(ファイル名)をB(ファイル名)にしてコピー |
| cp [dir. or file(A)] [dir.(B)] | A(ディレクトリorファイル)をB(ディレクトリ)にコピー|
| touch [file] | 新規のファイルを作成 [file]の部分にファイル名を指定|
| mkdir [dir.] | 新規のディレクトリを作成 [dir.]の部分にディレクトリ名を指定|
| cd $_ | mkdirしたディレクトリに移動 |
| rm [file] | ファイルを削除 |
| rmdir [dir.] | ディレクトリを削除（中が空の場合のみ可） |
| rm -r -i [dir.] | ファイルを含んだディレクトリを削除 (-iで実行の最終確認 ※推奨） |
| chmod XXX [file] | 許可範囲の変更（Xは数字三桁、左から所有者・所有者のグループ・他のユーザ。4で読み取り権限、2で書き込み権限、1で実行権限を付与  全権限付与する場合、全ての数値を足した「7」を指定）|

__cd /project_20250212/software_local/work/__ とか入力してそのあと「python3 hoge.py」でPython等のスクリプトを動かしたり、git操作（ここでの説明は割愛します）する流れが一般的と思います。
よく分からなくなったら __「cd」__ とだけ入力し、ホームディレクトリからまたやり直してみてください。

---
あと、ファイル操作ではないけど使用頻度の高いものとして
| コマンド | 説明 |
|:-:|:-:|
| sudo | 管理者権限にて後述したコマンドを実行 |
| sudo su | 管理者権限の取得（exitで解除）|

管理者権限が必要なコマンドの頭に必要です。
最初の表で紹介した __gedit__ も、ファイルの種類によっては頭に __sudo__ が必要です。
例として、 __sudo apt update__ で既存パッケージが更新可能かどうかを確認できます。（インストールやアップグレードは行いません）

:::note warn
このコマンドの入力後にsudo apt upgradeで最新のパッケージにアップデートできますが、 __職場PCで安易に行わないようにしてください！__ 
既存のソフトウェアが動かなくなったりします。
:::

---
あと、（個人的に）よく使うショートカットキーとして

| キー操作 | 説明 |
|:-:|:-:|
| Ctrl+A | 入力カーソルを行頭移動 |
| Ctrl+K | 入力カーソルから行末まで切り取り |
| Ctrl+Y | ペースト |
| Ctrl+U | 入力カーソルより行頭まで削除 |

コマンド打ち間違えた時にバックスペースキーを連打していた昔の自分に早くCtrl+A ⇒ Ctrl+Uを教えてあげたかったです（ググらないのが悪い）
入力途中で「あ、先にこれやらな」と気づいた時はCtrl+A ⇒ Ctrl+Kですね。

---
あと、一応の一応で
| キー操作 | 説明 |
|:-:|:-:|
| Tabキー | コマンドの入力補間（ファイル名なら、一致しているもの） |
| Tabキー(2回連打) | コマンドの入力補間候補の一覧表示 |
| ↑（上矢印） | 入力済みコマンドの再入力 |

一応ね！
なんとなく根性で手打ちしたくなる時もあるけど絶対補間入力しようね！

---
ご覧いただきありがとうございました。
こんな感じで、週1ペースで備忘録やらノウハウをなんでもいいからアウトプットできたらいいなぁって思ってます。

おわり
開発効率UP：json-server（Node.js）を使って、たった3分でモックサーバー（Mock Server）を爆速構築してみた

## はじめに  
モックサーバーは、開発やテストのために本番環境のAPIを模倣するサーバーです。  

:::note info
**実際のAPIが未実装でも、ダミーのレスポンスを返すことでフロントエンド開発を先行できます。**
:::

また、テストや負荷試験の安定化、開発スピード向上に役立ちます。  

## 書こうと思ったきっかけ  
開発中にバックエンドのAPIが未完成でフロントエンド開発が進められないことがありました。  

:::note warn
***その際、モックサーバーを活用することでスムーズに開発できたため、その手順を共有したいと考えました。***
:::

特に `json-server` を使うと手軽にモックAPIを構築できるため、その方法を紹介します。

## モックサーバー（Mock Server）とは？  

モックサーバー（Mock Server）は、開発やテストのために、本番環境のAPIの動作を模倣（モック）するサーバーのことです。  

**参考になった記事**

https://qiita.com/arenahito/items/75e59b921497f5427b69

実際のAPIを用意する前に、ダミーのレスポンスを返すことで、クライアント側の開発やテストを効率的に進めるために使われます。  

## モックサーバーの用途  

**フロントエンドの開発を先行して進める**  
- バックエンドのAPIがまだ実装されていなくても、フロントエンド開発ができる。  
- 例えば、`GET /users` に対して固定のJSONを返すモックを用意すれば、フロントエンド開発が可能になる。  

**テストの自動化**  
- APIの挙動を一定に保つために、モックを使って安定したテストを実行。  
- 外部APIへの実際のリクエストを避けることで、コストや速度を改善。  
**APIの負荷テスト**  
- モックを使って大量のリクエストを処理するシミュレーションができる。  

**開発環境と本番環境の切り替え**  
- ローカル環境ではモックサーバーを使い、本番では実APIを使う。  

## モックサーバーを使うメリット  

- **開発スピードが向上**：バックエンドを待たずにフロントエンド開発が進められる  
- **安定したテスト環境**：APIの仕様が変わっても、テストの挙動を一定に保てる  
- **外部APIのコスト削減**：有料APIや本番環境へのリクエストを減らせる  

## モックサーバーを構築してみた

### json-server（Node.js）を使ったモックAPIの作成
Node.jsを使う場合、`json-server` というライブラリを使うと簡単にモックAPIを作れます。  

**インストールと起動**

以下のコマンドを実行すると、`db.json` をデータソースとしたモックサーバーが起動します。  

```sh
npm install -g json-server
json-server --watch db.json --port 3000
```

**`db.json` のサンプル**

以下のようなデータを用意すると、`/users` エンドポイントでモックデータを取得できます。

```sh
{
  "users": [
    { "id": 1, "name": "Alice" },
    { "id": 2, "name": "Bob" }
  ]
}
```

### **動作確認**

ブラウザで `http://localhost:3000/users` にアクセスすると、上記のデータがJSON形式で返ってきます。

**ブラウザでの表示例**

![Screenshot 2025-02-12 at 16.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a97193b2-678b-4f23-ba9a-94ddec7aef3c.png)

**サーバー側のログ**

![Screenshot 2025-02-12 at 16.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c54f6b77-2bd2-4ee5-9956-c1476660beb6.png)

### `json-server --watch db.json --port 3000` の動作  

このコマンドにより、`db.json` をデータソースとして、ポート `3000` でモックAPIサーバーが起動する。  

- **`--watch` オプションについて**  
  `--watch`（`-w`）は省略可能。バージョン1以降の `json-server` では、デフォルトでファイル変更を監視する。  

- **サーバー起動メッセージの解説**  
  - `JSON Server started on PORT :3000` → サーバーが `http://localhost:3000/` で起動。  
  - `Watching db.json...` → `db.json` の変更がリアルタイムで反映される設定になっている。  
  - `Static files: Serving ./public directory if it exists` → `./public` ディレクトリがあれば、静的ファイル（HTML, CSS, JS など）も配信可能。  
  - `Endpoints: http://localhost:3000/users` → `db.json` 内に `users` というデータがあり、`http://localhost:3000/users` にアクセスすると、そのデータが取得できる。  

## まとめ  
モックサーバーを使うことで、開発スピードの向上やテストの安定化が可能です。  

:::note info
**`json-server` を使えば、簡単にモックAPIを作成でき、開発環境の柔軟性が向上します。**
:::

これを活用することで、APIが未完成でもフロントエンドの開発を円滑に進められます。
[vuejs][svg]承認ルート的なアレ

# 【近況】レオパに手を出した
**あ゛～～～かわいいでちゅね～～～**（ペロペロちてまちゅね～
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/53b59bc5-0845-40ff-887e-5c8cfe502666.jpeg"/>

[過去記事](https://qiita.com/AsilHatake/items/b5b26c17445e00f048ad)にて、カナヘビ（ドラ・チャンさん）のために購入したコオロギが爆増したので消費者を増やそうということを抜かしてましたが、とうとうレオパードゲッコー（ヒョウモントカゲモドキ）をお迎えしました。
品種（モルフ）はスノーブラックナイト（スノー系とブラックナイトの子）で、
まだまだバブみ溢れる可愛らしい女の子です。

トカゲ【もどき】どころか、ワニもどきやドラゴンもどきと呼ばれるぐらいに、
スクスクとブクブクと育てて行こうかと（親バカ

# 拡張性を持たせるために簡単に作った（要約：今回はやる気がないのでちょっと手抜き
ワークフローとかのフロー図だったり、組織図みたいなExcelのオブジェクトみたいなのを、
Webで動的に作りたい的な時の雛形として参考にしてもらえれてばということでこんなソースを作ってみた。

## ソース
```vue:RouteImage.vue
<script setup lang="ts">
import { computed, reactive } from 'vue';

const routeList = reactive([
  { id: 1, x: 50, y: 80, user: "起票者", next: [2, 3] },
  { id: 2, x: 150, y: 60, user: "承認者A", next: [4] },
  { id: 3, x: 200, y: 150, user: "承認者C", next: [5] },
  { id: 4, x: 230, y: 60, user: "承認者B", next: [5] },
  { id: 5, x: 350, y: 60, user: "最終承認者", next: [] },
]
);
const routeLine = computed(() => {
  const lineList = []
  for (let i = 0; i < routeList.length; i++) {
    const route = routeList[i]
    for (let j = 0; j < route.next.length; j++) {
      const next = routeList.find(r => r.id === route.next[j])
      lineList.push({ x1: route.x, y1: route.y, x2: next.x, y2: next.y })
    }
  }
  return lineList
})
</script>

<template>
  <svg width="500" height="500">
    <line v-for="l of routeLine" :x1="l.x1" :y1="l.y1" :x2="l.x2" :y2="l.y2" style="stroke:rgb(0,0,0);stroke-width:2" />
    <template v-for="r of routeList">
      <image href="/ai_character01_smile.png" width="60" height="60"  :x="r.x - 30" :y="r.y -30" />
      <text :x="r.x - 30" :y="r.y + 45" fill="black">{{ r.user }}</text>
    </template>
  </svg>
</template>

<style scoped></style>
```

※`image`タグで表示しているアイコンはいらすとやからダウンロードしてpublicフォルダにぶち込んだものとなります。

## 出力されるものがこちら
![スクリーンショット 2025-02-12 151547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/4f1502a9-f747-4f80-b39d-b04ec479fada.png)

今はコンポーネントに固定値で値を設定していますが、definePropsとかで値を渡したりすれば、
色んなデータパターンでルートを生成することが出来るね。

社員のアバター画像を`routeList`に`imgPath: string;`でもたせてもいいね。
後は現在どこで滞ってるかどうかも`isActive: boolean`とか付けて、CSSで点滅させるとか色々と拡張は出来るね。
※やる気がないのでそこまで作り込まなかったけど。。。

## あまりためにならない、ちょっとだけ解説
ルート情報については、１つ１つのオブジェクト（ここで言う起票者や承認者）を配列で持って、
そのオブジェクトの次にどのオブジェクトが紐づくかは`next: number[]`（idの配列）で持たせることにより、
１つのオブジェクトから複数の線を引くことに対応しました。
※例では起票者（id:1）は`next: [2, 3]`となっており、承認者A/Cへのルートが出来てる感じです

SVGは何も指定しないとタグ順にどんどん上へオブジェクトが積み重ねられるため、
先に`line`タグで画像間の線をひいてから、画像を配置してテキストを配置した感じにしてます。
【備忘録】React Native + expo + Google Mobile Ads

1年以上前ですが、ReactNativeにadmobを実装したコードを備忘録として残します。
`react-native-google-mobile-ads` はネイティブコードを必要とするため、`npx expo start`（Expoの開発サーバー）では動作せず、`EAS Build`（Expo Application Services）を使ってビルド→実行して動作確認を。

```App.tsx
import React, { useEffect, useState } from 'react';
import { View, Text, TouchableOpacity, Platform } from 'react-native';
import { InterstitialAd, AdEventType } from 'react-native-google-mobile-ads';
import Toast from 'react-native-toast-message';

// 広告ユニットIDの設定（開発環境か本番環境かで切り替え）
const adUnitId = __DEV__
  ? 'ca-app-pub-???' // 開発用テスト広告 ID
  : Platform.select({
      ios: 'ca-app-pub-???',
      android: 'ca-app-pub-???',
    }) ?? '';

// インタースティシャル広告の作成
const interstitial = InterstitialAd.createForAdRequest(adUnitId, {
  requestNonPersonalizedAdsOnly: true,
  keywords: ['fashion', 'clothing'],
});

export default function App() {
  // 広告の読み込み状態を管理
  const [loaded, setLoaded] = useState(false);

  // 広告の初期化
  useEffect(() => {
    adInit();
  }, []);

  const adInit = () => {
    interstitial.load(); // 広告の読み込み開始

    // 広告の読み込み完了時のイベントリスナー
    const unsubscribeLoaded = interstitial.addAdEventListener(
      AdEventType.LOADED,
      () => {
        setLoaded(true);
      }
    );

    // 広告が閉じられたときのイベントリスナー
    const unsubscribeClosed = interstitial.addAdEventListener(
      AdEventType.CLOSED,
      () => {
        setLoaded(false);
        interstitial.load(); // 次の広告を準備
        
        Toast.show({
          type: 'success',
          text1: '広告が再生されました',
        });
      }
    );

    // 広告の読み込みエラー時のイベントリスナー
    const unsubscribeError = interstitial.addAdEventListener(
      AdEventType.ERROR,
      (error) => {
        console.error('広告の読み込み中にエラーが発生しました:', error);
      }
    );

    // コンポーネントのアンマウント時にリスナーを解除
    return () => {
      unsubscribeLoaded();
      unsubscribeClosed();
      unsubscribeError();
    };
  };

  // 広告を表示する関数
  const showInterstitialAd = () => {
    if (loaded) {
      interstitial.show();
    }
  };

  return (
    <View>
      <TouchableOpacity onPress={showInterstitialAd}>
        <Text>広告を再生する</Text>
      </TouchableOpacity>
    </View>
  );
}
```
[🔰初心者向け]Linuxを初歩から学びたい方へ🐧 ~ 初級編 全14回 ~

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事は過去に私が投稿したLinuxの記事のまとめ記事になります。Linuxコマンドはエンジニアにとって**必須知識**です。

初学者はぜひ、こちらのページに載っているリンク先記事を一つ一つ学習してみてください。

![1adcfd6b-d030-4128-bba0-d7e38cd72195_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/95a3d857-f26e-33ee-b34f-7f6cc2e7c0ce.png)

## Linuxの学習環境について
Linuxを触れる環境はいくつかあるのですが、ある程度簡単に触れるものを紹介しています。Macの方はターミナル、Windowsの方はWSLを入れると良いと思います。とりあえず触りたい方は『**エンベーダー**』というアプリをおすすめしています。

https://qiita.com/ikemura-ren/items/b5b1fdf5bab71ea23955?2

## cd, ls, pwd編
まずはここから。CUIとGUIの違いについても詳しく書いていますので、何をするにもこちらをまず読了して次に行きましょう。

https://qiita.com/ikemura-ren/items/0925e9fe2e5cd0b47e01?2

https://qiita.com/ikemura-ren/items/c139204eaf66540cd4af?1

:::note alert
特に初めてターミナルを触る方、おそらく何もわからないままコマンドを叩くと思います。上記の記事でCUIについてしっかり理解してから次の記事にいきましょう。
:::

## ホームディレクトリ編
こちらは少し番外編なのですが、初心者ほどターミナル上のホームディレクトリを汚しがちです。注意喚起しておきたいので、こちらの記事を読んでおいてください。

https://qiita.com/ikemura-ren/items/7e0c4fe00236badce9c0


## cat, touch, echo編
次のステップはファイル操作、LinuxにおけるHello World!はどうやるのか？ですね。ファイルの中身を見る、ファイルを作るなど基本的なところを押さえていきましょう。

https://qiita.com/ikemura-ren/items/85fc8bc46d286cca3e01?1

## mkdir, rmdir, rm編
次はディレクトリの作成・削除、ファイルの削除、全てを吹き飛ばすバルスコマンド（笑）とかを解説している記事です。この辺りまで使えるようになったらもうある程度Linuxの操作はできるようになります。

https://qiita.com/ikemura-ren/items/4dc96ea729a4197fd09d?1

## コマンド同士を繋げてみよう編
コマンドを単発で打つことは多いですが、複数繋げたり、一つ目のコマンドの結果を二つ目に渡したり、Linuxコマンドの柔軟性を確認していきましょう。

https://qiita.com/ikemura-ren/items/73f7986764c1b21a9cec?2

## この辺りでシェルの見た目を整えよう
ここは少しMac向けの話ではありますが、シェルの見た目が初期のままの人はこちらの記事の通りに整えてください。Windowsの方でWSLを使っている方も、見た目をいじれるので一読しておきましょう。

https://qiita.com/ikemura-ren/items/bc0d2ca90aedd9af8b4f

👇の記事はやらなくても良いですが、シェルのことを詳しくなりたい方はどうぞ。

https://qiita.com/ikemura-ren/items/2db596f17556ec46b3be

## tmuxを入れよう
tmuxというツールを入れることで、この後のコマンドを理解しやすくします。
tmuxはシェルの画面を分割して、1画面で複数のターミナルを見ることができる便利ツールになります。

https://qiita.com/ikemura-ren/items/a384940ea03f3f26e221

https://qiita.com/ikemura-ren/items/9b558fc99584f1fbc659

## grep編
ここから少しだけ難易度が上がりますが、正規表現と呼ばれる難しい書き方については触りだけ書いてますので、ぜひ果敢にチャレンジして欲しいです！

https://qiita.com/ikemura-ren/items/15e87e844fd5af4b8844?1

## 環境変数編
環境変数を学習することで、Linuxのディレクトリ構成と、コマンドがどう実行されているのかを理解していきましょう。

https://qiita.com/ikemura-ren/items/45b7617581ded0713937

## プロセス編
Linuxを理解する上で、プロセスについて知ることは重要です。サーバーだけの環境では、アプリなどでよくある×ボタンや、Ctrl（command） + Qなどは使えないですからね。

https://qiita.com/ikemura-ren/items/884bb0878e76535ea78d

## おわりに
今回はLinuxを初心者が理解していくためには、どんな順番が良いかを考えて、自分なりにまとめてみました。一旦、初学者はここまで理解できていればOKです。ただこれは初級編であり、Linuxコマンドはまだまだあるので、中級編も書いていきます。


## 余談
有識者、Linuxのディストリビューションでおすすめあったら教えて欲しいです。いつも脳死でUbuntu使っちゃうので。

## 宣伝
ITスクールRareTECHを運営しています！スクール受講生の皆さんがたくさん記事を投稿しているので、よかったらみていってください！
Organizationはこちら👇

https://qiita.com/organizations/raretech
rex0220 ちょっと便利なプラグイン 印刷画面でタイトル欄にレコードタイトルを設定

[rex0220 ちょっと便利なプラグイン](https://qiita.com/rex0220/items/45883f15ccd34a68b8af)で、印刷画面でタイトル欄にレコードタイトルを設定してみます。

# 概要

kintone 標準の印刷機能で PDF 出力すると、「印刷用画面.pdf」となります。
これだとなんのファイルかわかりませんので、いちいち名前を変更するのが面倒です。

ちょっと便利なプラグインで、pdf の名前をレコードタイトルにすることが出来ます。
※F75 印刷画面でタイトル欄にレコードタイトルを設定（Ver.31以降）

今回は、「タイトル」項目をレコードタイトルにします。
「タイトル」には計算式で、「"見積書-"&見積番号」を設定しています。

※[rex0220 計算式プラグイン スペース項目で見積書の印刷](https://qiita.com/rex0220/items/190442050295d5345549)の見積書

![2025-02-12_15h55_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/42d7e435-1fe9-40cd-8de6-d77f9e9dd0aa.png)

# アプリ設定

レコードタイトルにする項目を「レコードのタイトル」に設定します。

![2025-02-12_15h58_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2475d2d0-cc8a-44a0-a3e2-cc09bd313829.png)


# ちょっと便利なプラグイン設定

「F75 印刷画面でタイトル欄にレコードタイトルを設定」をチェックします。

![2025-02-12_15h57_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4a09a823-a29f-4b07-90e9-8283c81c4eed.png)
マトリックス風の背景で流れるメッセージを表示する

# はじめに
皆さんは映画『マトリックス』のような、緑の文字が画面を縦に流れるかっこいい演出を見たことがあるでしょうか。今回、そのマトリックス風の背景をWebブラウザ上で再現してみました。さらに、画面の中央を横に流れるメッセージも加え、複数のディスプレイ間で同期して表示するようにしました。

![IMG_7A7D8F733190-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346908/4f8b1332-6408-445f-9fcd-e7e0c788c917.jpeg)


### 背景に流れるマトリックス文字

まず、黒い画面を用意し、緑色の文字がじわじわと降ってくる演出を実装しました。文字はランダムに並べられ、ゆっくり消えていくような効果を入れることで、あの独特のサイバーな雰囲気が出せます。  
実際にコード上では、何種類かの文字（漢字やアルファベット、数字など）をランダムに選んで表示していますが、皆さんのお好きな文字に入れ替えることもできます。


```js
const matrixChars = "日ﾊﾐﾋｰｳｼﾅﾓﾆｻﾜﾂｵﾘｱﾎﾃﾏｹﾒｴｶｷﾑﾕﾗｾﾈｽﾀﾇﾍ0123456789:・.";
```

### 画面中央のメッセージが流れる

中央には「HAPPY BIRTHDAY」など、お祝いの言葉やイベントタイトルなどを流れるように表示しています。流れる速度や文字の色、フォントの大きさも自由に変更できるため、イベントの雰囲気やお好みに合わせてカスタマイズ可能です。  

```js
const displayText  = "HAPPY BIRTHDAY TO ・・・";
```

### 複数の画面でも同期表示

今回少し凝ったのは、複数のディスプレイでも同じタイミングでメッセージが流れるようにしたことです。  
普通に複数台のパソコンやタブレットで同じページを開いただけでは、どうしても少しずつタイミングがずれて、ピッタリ揃った演出は難しいですよね。そこで、ネットワークを使って、一つの「時刻」をサーバから受け取り、みんながその「時刻」を基準にアニメーションを始めるように設定しました。  
その結果、例えば3台のディスプレイを横に並べると、文字がスムーズに横一列でつながって流れる、ちょっとSFチックな演出ができます。

### おわりに

映画のワンシーンのようなマトリックス風エフェクトとメッセージのスクロールは、意外と少しの工夫とコードで実現できます。そして複数の画面を同期させることで、さらにインパクトのある演出になるのが今回のポイント。  
難しいプログラミングの知識がなくても、Web上のサンプルをダウンロードして少し変更するだけで、自分の好きな文字や色、速度にカスタマイズできます。ぜひ気軽に試してみてください。  

---

もし「自分もやってみたい！」という方は、GitHubのリポジトリにも公開していますので、気になる方は覗いてみてください！

https://github.com/keigo1110/Characters_Flowing_Matrix
Amazon Linux2023のOS更新戦略

# 背景
プロジェクトでAWSを利用しており、これまでAmazon Linux 2を用いたEC2サーバを用いていたのですが、EOLに伴い、Amazon Linux 2023へ移行をしました。
本プロジェクトでは四半期に一度パッチ適用をしており、折々でOSの最新化をしていましたが、パッケージ管理ツールがyum → dnfに変化したことで、OS更新の方法を見直す必要がありました。

# これまで(Amazon Linux 2)
すべてのパッケージを更新することはせず、セキュリティ関連のアップデートのみ更新をしていた。
↓実際の実行コマンド
```
yum update --serucity -y
```

# Amazon Linux 2023への移行後
AWS公式のドキュメントですべての更新を適用することを推奨している。
<https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/managing-repos-os-updates.html>

> 新しい AL2023 リリースで利用可能なすべての更新を適用することをお勧めします

↓実行コマンド(例)
```
dnf upgrade --releasever=2023.6.20250203 -y
```

# 終わりに
プロジェクトではOSの更新後に検証環境で一連の動作確認を実施するので、一旦すべての更新を適用してしまい、その上で検証して何か問題があれば都度対応する形がAWSのベスプラに従いつつ、なるべく楽に運用する方法なのかなと思います。
また、Amazon Linux 2の時はreleaseverにあたるものがなく、どうしても検証環境と本番環境でOS更新のタイミングがずれてしまうことが気持ち悪かったのですが、この問題も解消されたので非常に安心して運用することができるなと思いました。
Stablediffusion女の子生成

参考
https://qiita.com/ma7ma7pipipi/items/73fcb45d8026ff697e3e


infopngで読み込まなくても、以下のプロンプトでいける。
また、facedetailerのセットも忘れずに。

![00100-4177107356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/9c8ee0ab-4a37-49f8-9b6f-c7901106f982.png)


# おすすめモデル

```
・chikmix
・chilloutmix
・brav7
・cityedgemix
```

# ポジ
```
(dynamic angle),((18 years old over)),(Best quality, 8k, 32k),{shirt/t-shirt|short-sleeved shirt|dress shirt|sweater|blouse|tank top|camisole|bra top|jogging bra|fleece|turtleneck|polo shirt|denim shirt|cold shoulder top|tunic blouse|tunic sweater|tube tops|chiffon blouse|lace tops|sweat shirt|off-the-shoulder top|one-shoulder top|crop top|cropped knit|mock neck top|sleeveless top|v-neck sweater|bandeau top|smock blouse|button-up shirt|corset top|pullover|bell sleeve|henley shirt|Peter Pan collar|notched collar},{Pixie cut|Long layers|Beach waves|Blunt cut|Side-swept bangs|Messy bun|French braid|Top knot|Shaggy layers|Lob (Long bob)|Updo|Chignon|Braided crown|High ponytail|Waterfall braid|Messy fishtail braid|Sock bun|Half-up, half-down|Feathered layers|Mermaid waves|Dutch braid|High bun|Layered bob|Messy pixie cut|Slicked back|Side part|French twist|Crown braid|Sleek straight},1girl,looking down,upper body,(Best quality, 8k, 32k, Masterpiece, UHD:1.2),Japanese
```

# ネガ

```
hat,walter mark,nsfw ng_deepnegative_v1_75t, ((badhandv4)), (worst quality:2), (low quality:2), (normal quality:2), lowres, bad anatomy, bad hands, normal quality, ((monochrome)), ((grayscale)) watermark,nsfw,worst quality,low quality,bad anatomy
```
新しい Laravel アプリを始めるなら `Model::shouldBeStrict()` を宣言しよう！

⚠️: 海外の記事をchatGPTで要約しただけのもの、主に自分用

---

# 新しい Laravel アプリを始めるなら `Model::shouldBeStrict()` を使おう！


新しいアプリを作ろうと決めたら、まず何から手を付ける？僕の場合、Laravel のセットアップが完了したらすぐに **App Service Provider** の `boot` メソッド内で `Model::shouldBeStrict()` を呼び出すんだ。この一手間で、後々のトラブルを未然に防げるので、とっても助かる！

```php
public function boot(): void
{
    Model::shouldBeStrict();
}
```

この設定をオンにすると、内部で以下の3つの効果が働くよ:

1. **不要な遅延ロードを防ぐ**
2. **属性が勝手に無視されるのを防ぐ**
3. **存在しない属性にアクセスするミスを防ぐ**

---

## 1. 不要な遅延ロードを防ぐ

例えば、記事一覧と、それに関連するユーザー情報を表示するコードを考えてみよう。

```php
$articles = \App\Models\Article::get();

foreach ($articles as $article) {
    echo "<li>" . $article->user->name . "</li>\n";
}
```

普通だと、各記事ごとに `user` リレーションが遅延ロードされるため、ループのたびにデータベースへクエリが発行されちゃう。  
でも、`Model::shouldBeStrict()` を有効にしておけば、もし遅延ロードが発生しようとすると即座にエラーで知らせてくれるので、無駄なクエリを実行する前に問題に気づけるんだ！

---

## 2. 属性が勝手に無視されるのを防ぐ

たとえば、モデルに設定されていない属性を更新しようとする場合…

```php
$user->fill(["remember_token" => "bar"]);
```

通常は、何もエラーが出ずにその属性が無視されてしまうこともある。  
でもこの設定を入れておけば、「この属性は fillable に設定されていませんよ！」というエラーがすぐに出るので、うっかりした設定ミスを早期にキャッチできるのが嬉しい！

---

## 3. 存在しない属性にアクセスするミスを防ぐ

例えば、User モデルに存在しないプロパティを表示しようとすると…

```blade
{{ $user->nonexistant }}
```

通常、Laravel は何も表示しないだけだけど、Strict モードがオンになっていると「存在しない属性にアクセスしようとしていますよ！」とエラーが返ってくれる。  
これなら、タイプミスなどで意図しない属性アクセスをしてしまう前に、すぐに問題に気づけるね！

---

## まとめ

`Model::shouldBeStrict()` を有効にするだけで、些細なミスもすぐに教えてくれるので、後で大きなバグに悩まされるリスクがぐっと減る。  
新しい Laravel アプリを始めるなら、まずこの設定を追加して、安心で快適な開発ライフをスタートしよう！


## 元記事

https://laravel-news.com/shouldbestrict
NextflowはSingularityではなくApptainerで動かせばよい

Nextflowは汎用のワークフロー言語である。ワークフロー言語とは、クラウドやHPC上で、効率よくデータを処理するためのツールである。

ワークフロー言語というと、再現性が議論になるが、個人的な印象としては、確かに再現性は高くなるかもしれないけれども、環境をDockerなどに封じ込めなければならないので、別にメンテナンス性は高くならない。

むしろワークフロー言語とは、シェルスクリプトを拡張して、ローカルなコンピューター外の並列実行（クラウド環境やHPCなど）に対応してくれるツールだと認識している。

## Dockerが使えない場合

事実上Dockerが標準のコンテナ技術になっているが、Dockerを使えない場合もあると思う。特にDockerは管理者権限が必要であるケースが少なくない。

そして、Dockerが使えない場合は、Singularityコンテナを使うと説明されることが多い。

しかし、実はSingularityは Sylabs Inc. という民間企業が管理していて、実はそれほど使いやすいものではない。かわりに、Apptainerの利用が推奨される。

https://github.com/apptainer/apptainer

micromamba/conda を利用して conda-forge から singularity をインストールしようとすると、古いバージョンしかない。その点、Apptainerなら新しいバージョンのものをインストールできる。

この記事は以上です。

---

この記事が役に立った場合は、あなたがお持ちの Tips を Qiita やそのほかのブログに公開してください。熾烈な競争環境下では、情報公開に消極的になるのが常ですが、日本語の情報源は少なく、ググラビリティを改善するコントリビューションは常に求められています。