OmniAICreator/Qiita-1.07M huggingface dataset:
SQL 1つのカラムに「カンマ区切り値」を入れる際の問題点と解決策

## はじめに

最近、オライリー・ジャパンの「SQLアンチパターン」という本を読みました。

本書から学んだ知識をベースに、「1つのカラムにカンマ区切りの値を保存する」というアンチパターンについて、私なりの実例を交えながら解説したいと思います。


なお、本記事の実装例やデメリットの説明は、書籍の内容をそのまま転記したものではなく、私が再解釈した内容となっています。

## 参考著書
オライリー・ジャパン「SQLアンチパターン」
https://www.oreilly.co.jp/books/9784873115894/

## 問題のある実装例

以下のような書籍管理テーブルがあるとします。

```sql
CREATE TABLE books (
    id INTEGER PRIMARY KEY,
    title VARCHAR(255),
    tags VARCHAR(255)  -- カンマ区切りでタグを保存
);

INSERT INTO books (title, tags) VALUES
('サバイバルTypeScript', 'TypeScript, 入門');
```

## デメリット

1. **検索が難しい**
   - LIKE演算子を使う必要があり、パフォーマンスが悪い
        ```sql
        -- 'TypeScript'タグを含む書籍を検索
        SELECT * FROM books WHERE tags LIKE '%TypeScript%';
        ```
   - インデックスが効果的に使えない
       - このように検索文字列の前にワイルドカード（%）がある場合、インデックスが効果的に使えません。
       - これは、インデックスは先頭から順に検索を行う仕組みのため、文字列の途中や末尾からの検索では活用できないためです。
       - そのため、タグを検索する度に全文検索が発生し、データ量が増えるほど検索が遅くなります。

2. **データの整合性が保ちづらい**
   - タグ名が不統一になりやすい（「TypeScript」と「typescript」など）

3. **文字列の長さに制限がある**
    - VARCHAR(255)のような固定長のため、格納できるタグの数に制限がある
    - タグが増えていくと、制限に達して新しいタグが追加できなくなる可能性がある

4. 更新が大変
    - 特定のタグだけを削除したい場合、文字列操作が必要になる
    - タグの位置によって更新のロジックが変わる（先頭、中間、末尾）
    - カンマの扱いも考慮が必要（余分なカンマが残ったり、カンマの数が不適切になったり）

## 解決策：交差テーブルの作成

以下のように、多対多の関係を表現する設計に変更します。

```sql
CREATE TABLE books (
    id INTEGER PRIMARY KEY,
    title VARCHAR(255)
);

CREATE TABLE tags (
    id INTEGER PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE book_tags (
    book_id INTEGER,
    tag_id INTEGER,
    PRIMARY KEY (book_id, tag_id),
    FOREIGN KEY (book_id) REFERENCES books(id),
    FOREIGN KEY (tag_id) REFERENCES tags(id)
);
```

この設計により、検索が容易になり、データの整合性も保つことができようになります。

## まとめ
これまで「1つのカラムにカンマ区切りの値を保存するのは良くない」という漠然とした認識は持っていましたが、今回SQLアンチパターンを読んで自分で噛み砕いていく中で、なぜ良くないのかを具体的に理解することができました。

インデックスが効かない理由や、文字列長の制限や更新の大変さによる実用上の問題など、技術的な背景を知ることで、より良いデータベース設計の重要性を実感することができました。
LINE WORKS API 基本カレンダーの予定リストの取得

このドキュメントでは、Python を使用して LINE WORKS のカレンダー予定リストを取得する方法について説明します。Google Colab を使用して、すぐに試すことも可能です。

## 必要な情報
LINE WORKS のカレンダー API を使用するには、以下の情報が必要です。

1. アクセストークン
2. ユーザー ID (もしくは "me")

これらの情報は、LINE WORKS の管理者ポータルで確認または発行することができます。

## Google Colab で試す

このスクリプトは、Google Colab で簡単に試すことができます。

以下のリンクをクリックして、Google Colab でノートブックを開き、実行してください。

[**Google Colab: LW_Calendar_Events_List.ipynb**](https://colab.research.google.com/drive/1oy54-7XMLnSbCBXpYea-Yl6m8euVxvHi?usp=sharing)

## スクリプトの説明

以下のスクリプトは、指定した期間のカレンダー予定を取得します。繰り返し予定も対応しています。

```python
# 必要な変数を Google Colab のパラメータ形式で入力
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"  # @param {type:"string"}
USER_ID = "me"  # @param {type:"string"}
FROM_DATETIME = "2024-12-22T00:00:00+09:00"  # @param {type:"string"} 開始日時
UNTIL_DATETIME = "2024-12-28T23:59:59+09:00"  # @param {type:"string"} 終了日時

import requests

BASE_URL = f"https://www.worksapis.com/v1.0/users/{USER_ID}/calendar/events"

def get_calendar_events():
    headers = {
        "Authorization": f"Bearer {ACCESS_TOKEN}",
        "Content-Type": "application/json"
    }
    params = {
        "fromDateTime": FROM_DATETIME,
        "untilDateTime": UNTIL_DATETIME
    }

    print("⏳ 予定リストを取得中...")
    response = requests.get(BASE_URL, headers=headers, params=params)

    if response.status_code == 200:
        print("✅ 予定リストを取得しました。")
        events = response.json().get("events", [])
        if not events:
            print("❌ 予定が見つかりませんでした。")
        else:
            for event in events:
                for event_component in event.get("eventComponents", []):
                    print("📅 イベント情報")
                    print(f"イベントID: {event_component.get('eventId', 'N/A')}")
                    print(f"タイトル: {event_component.get('summary', 'N/A')}")
                    print(f"開始: {event_component.get('start', {}).get('dateTime', 'N/A')}")
                    print(f"終了: {event_component.get('end', {}).get('dateTime', 'N/A')}")
                    recurrence = event_component.get("recurrence", [])
                    if recurrence:
                        print(f"繰り返し: {', '.join(recurrence)}")
                    else:
                        print("繰り返しなし")
                    print("-" * 30)
    else:
        print(f"❌ 予定リストの取得に失敗しました: {response.status_code}")
        print(response.text)

# 実行
get_calendar_events()

```
## 注意点

- 必要な情報 (アクセストークンなど) を正確に設定してください。

---

## おわりに

LINE WORKS のカレンダー API を活用することで、スケジュールの自動化や情報取得を効率化できます。ぜひ試してみてください！
初代プレステの周辺機器としてのｽﾀｯｸﾁｬﾝ、妄想編


## はじめに
　8ビットCPUやマイクロコントローラに興味があり、インターネット上に公開されている情報の再現や改良を行っています。
　M5Stackは、M5StackFacesが積み基板になる程度に関心があったのですが、ｽﾀｯｸﾁｬﾝの作製例にCore2が多かったので、M5Stack Gray部分は積み基板のままでした。

https://www.switch-science.com/products/3649?srsltid=AfmBOorF1o_oUclwmeQXFA9g61iviwDorbN5kmaV1ihpCdJvAbyAyeke

## Hamamatsu Micro Maker Faire 2024以降、ｽﾀｯｸﾁｬﾝの筐体作製情報を収集
　浜松市立科学館で開催された、Hamamatsu Micro Maker Faire 2024で、段ボールｽﾀｯｸﾁｬﾝに出会い、型紙を入手しました。

https://makezine.jp/event/makerfaire/hmmf2024/

https://note.com/syumme/n/naa6db8b47bbd

　ｽﾀｯｸﾁｬﾝの筐体作製記事をさらに探していると、100均の靴下入りカップを使った、さらにお手軽に筐体を作製できる記事も見つけました。

https://fluorite36.hatenablog.com/entry/2021/12/20/013813

ボタン付きのBasicを利用可能な筐体の情報がそろったので、M5Stackの用途の検討に入りました。
　プログラム作成の経験があまりないので、UIFlowやArduino IDEを使ったプログラム環境で出来ることに限定します。

## 何をつくろか
　M5Stack Grayのボディカラーの灰色が初代プレステのボディカラーとお揃いなので、初代プレステといっしょに使える機能を実現することにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/291a31d6-7c6d-4cf0-4036-1aa264c1b2a9.png)

　M5Stackで作るファイルサーバです。
　初代プレステには、外部からプログラムを流し込んで起動させる機能をもたせることができます。
　プログラムを流し込むインターフェースがシリアルポートなので、M5Stackのシリアルポートをつなぐことが可能で、しかも、どちらも3.3V駆動です。
　プログラムサーバの環境構築は、別記事に紹介していますので、そちらを見てください。
 
 https://qiita.com/kazueda/private/61a71304055c6910dcf4

## それでは妄想開始
　ここからは、モックアップの写真で説明します。
　初代プレステの電源を入れると、シリアルポートから給電されるｽﾀｯｸﾁｬﾝが起動し、初代プレステはファイル転送待ちになります。
![起動_1000px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/8bb80b73-d4d9-b688-5fd4-1e1495a0e6f8.png)
　「起きてやー」のセリフとともに、ｽﾀｯｸﾁｬﾝが初代プレステ用のプログラムを転送します。
![転送_1000px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/3e7fb93a-ebe5-66e6-7fc5-21999f42b798.png)
　プログラム転送終了後にプログラムが起動し、初代プレステのモニタにも顔が表れて「おはよう、じゃまするでー」のセリフを発します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/884a9348-a2e7-a2b9-38b3-af983c6a5719.png)
　ｽﾀｯｸﾁｬﾝは「じゃまするんなら、出てってやー」のセリフを発します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/bfe56a9d-7bb4-9037-873f-ee4dca1e5206.png)
　初代プレステは、「なんでやねん！」と突っ込む
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/4e7a36e9-34bf-ec14-b9c6-fb819e468760.png)

　あとはプログラムを作るだけです。

## おわりに
　もの作りイベントに見学に行くと何か作りたくなりますが、何が作りたいか思いつきません。展示物に刺激を受けた大喜利のようなことができればと、本記事を投稿しました。
　動作するものが完成したら、どこかで展示しようかと思います。
schemaspyでデータベースドキュメントの作成

Schemaspyを使ってデータベースドキュメントを作成します。

## 環境
SchemaSpy 6.1.0
Java 1.8.0_431
PostgreSQL (supabaseを使いました)


## 必須条件
Java バージョン 8 以上
または OpenJDK 1.8 以上 

## 手順


### 1 Schemaspyのjarファイルをダウンロード
[githubリリースページから](https://github.com/schemaspy/schemaspy/releases).jar ファイル (例: schemaspy-[version].jar) をダウンロードします。
今回は6.1.0を使用します。

### 2 デーベースにあったJDBCドライバーをダウンロード
今回はpostgresqlなので　[こちら](https://jdbc.postgresql.org/download/)からダウンロードしました。「[データベース名] JDBC ドライバー」を検索することで適切なドライバーを見つけることができます。

### 3 ファイルで構成を事前定義する
全てコマンドで指定できますが今回は事前定義のファイルを作成します。

```:schemaspy.properties
# type of database. Run with -dbhelp for details
schemaspy.t=pgsq11
# optional path to alternative jdbc drivers.
schemaspy.dp=./jdbc-driver.jar
# database properties: host, port number, name user, password
schemaspy.host=[ホスト名]
schemaspy.port=[ポート番号]
schemaspy.db=[データベース名]
schemaspy.u=[ユーザ名]
schemaspy.p=[パスワード]
# output dir to save generated files
schemaspy.o=path/to/output
# db scheme for which generate diagrams
schemaspy.s=public
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/7ce253c4-b5bc-2cb5-762c-70c01fdb4d6b.png)

supabaseはサイト内に上記記載があるので参照しながらファイルを作成します。



```
[実行ディレクトリ]
├── postgresql-42.7.4.jar 　　　　　　　　　　  JDBCドライバ
├── output                                  出力ディレクトリ
├── schemaspy-6.1.0-SNAPSHOT.jar            SchemaSpy本体
└── schemaspy.properties                    設定ファイル
```

実行ディレクトリに移動してコマンド実行

```
java -jar schemaspy-6.1.0-SNAPSHOT.jar -configFile schemaspy.properties -vizjs 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735736/63bcb7d0-ba4f-5536-1fe3-a2b5a45b2b8d.png)


outputファイルに出力された`index.html`を開くとデータベースドキュメントが確認できます。



## 補足
データベースドキュメントのcommentsが空欄なので追加したいと思います。


```
[実行ディレクトリ]
├── postgresql-42.7.4.jar                   JDBCドライバ
├── output                                  出力ディレクトリ
├── schemaspy-6.1.0-SNAPSHOT.jar            SchemaSpy本体
├── public.meta.xml                         コメントの追加のファイル
└── schemaspy.properties                    設定ファイル
```


コマンド実行
```
java -jar schemaspy-6.1.0-SNAPSHOT.jar -configFile schemaspy.properties -vizjs -meta ファイルへのパス
```



## 参考
https://dev.classmethod.jp/articles/schemaspy-doc/
Entra ID(AzureAD)とActiveDirectoryの違い

# EntraID(AzureID)とオンプレミスActiveDirectoryの違い

## Entra ID（Azure AD）とActive Directory（オンプレミス）の比較表

| 項目               | Entra ID (Azure AD)                                         | Active Directory (オンプレミス)                               |
|--------------------|-----------------------------------------------------------|------------------------------------------------------------|
| **設置場所**       | クラウド                                                  | オンプレミス                                               |
| **認証対象**       | クラウドアプリ（Microsoft 365, SaaSアプリ）、リモートアクセス | 社内ネットワーク、オンプレミスリソース                      |
| **管理対象**       | クラウドユーザー、クラウドリソース                          | 社内デバイス（PC、プリンタ）、ユーザー、グループ             |
| **ネットワーク依存性** | インターネット接続が必須                                    | 社内LAN内で機能                                            |
| **主な機能**       | シングルサインオン（SSO）、多要素認証（MFA）、条件付きアクセス | グループポリシー（GPO）、ドメイン認証                        |
| **統合性**         | SaaSアプリやモバイルデバイス管理に優れる                    | 社内ネットワークの統合管理が中心                            |
| **運用環境**       | リモートワークやハイブリッド環境に最適                     | オンプレミス主体の社内環境に最適                            |
| **スケーラビリティ** | クラウドベースで容易に拡張可能                              | 物理サーバーや社内インフラに依存                            |
| **同期ツール**      | Azure AD Connect                                           | 必要なし                                                   |

## Entra ID
EntraIDはMicrosoftが提供するクラウド型のIDおよびアクセス管理サービス

### 主な用途
- Microsoft365やTeams、SharePointなどのMicrosoftサービスにアクセスするための認証
- SalesforceやSlackなどのSaaSアプリケーションと統合したシグナルサインオン（SSO）
- リモートワーク環境下での安全なアクセス管理

### セキュリティ機能
- 多要素認証（MFA）
ユーザー認証時に追加のセキュリティ層を提供
- 条件付きアクセス
デバイスの状況や地理的な場所に基づいてアクセスを制御
- パスワードレス認証
FIDO2や生体認証を用いた安全なログイン

### モバイル・クラウド環境
- モバイルデバイス管理(Intune)との連携によりデバイスのセキュリティとコンプライアンスを確保
- SaaSアプリケーションの増加に伴い、多様な環境に対応可能

## ActiveDirectory（オンプレミスAD）
ActiveDirectoryはオンプレミスのWindows Server上で動作するディレクトリサービス

### 主な用途
- 社内ネットワークに接続されるデバイスやリソースの一元管理
- ドメインコントローラーを介したユーザー認証
- プリンターやファイルサーバーなどの社内リソースへのアクセス管理

### 管理機能
- グループポリシー（GPO）
社内のデバイス設定を統一化しセキュリティポリシーを適用
- ユーザーとグループ管理
ドメイングループを利用してアクセス権限を一括管理
- ドメイン構造
サブドメインやフォレストを利用して複雑なネットワーク構造をサポート

### 制約
- オンプレミス環境での運用が前提のため物理的なサーバーやネットワーク構成に依存
- リモートワーク環境への対応はVPNや外部ツールを必要とする

## ハイブリット環境の活用
多くの企業ではオンプレミスADとEntraIDを統合してハイブリット環境を構築している

### Azure AD Connect
- オンプレミスADとEntraIDを同期するためのツール
- 同期内容：ユーザー情報、パスワードハッシュ、グループなど
- シグナルサインオン（SSO）とオンプレミスリソースのアクセス管理を統合

### メリット
- 社内リソースとクラウドアプリケーションのシームレスな認証
- リモートワーク対応の向上
- クラウドサービスの利便性を取り入れつつ、オンプレミスのセキュリティを維持

## 選択ポイント

|目的                                   | 推奨サービス                     |
|------------------------------------------|----------------------------------|
| リモートワークやSaaSアプリの利用が多い場合 | Entra ID（Azure AD）             |
| 社内ネットワーク主体の環境の場合           | Active Directory                 |
| ハイブリッド運用を希望する場合             | Entra ID + Active Directory      |

## まとめ
**EntraID**
クラウドアプリやリモートワーク環境での利用に最適
**ActiveDirectory**
オンプレミスの社内ネットワーク管理に優れている
Unityでユニークな結晶の雪を降らせる方法

__Happy holidays !__ 

Unityで簡単に雪を降らせることができるのは知っていた。が、ユニークな結晶の雪を降らせたくなった。（というか、ときどきピクシーダストPxDTロゴの結晶の雪を降らせてほしい、とのリクエストをいただいた。）

まずが、[Unityで雪を降らせる方法](https://nekojara.city/unity-snow-particle)が、ググればすぐに出てくるように、Unityのパーティクルシステムを使う。

各パラメータの設定は、リンクのサイトを参考に設定する。
1. 結構ゆっくりに降らせたいので、Gravity Modifierを0.2
1. 雪の量も少なめに、Rate over Timeは100
1. パーティクルの生存時間は、Particle SystemのStart Lifetimeは25
1. Max Particlesの値を2000
1. 揺らぎを付けて雪らしく、Particle SystemのForce over Lifetimeにチェックを入れて、±0.2
1. 雪は積もらせないで、背景は夜にしたいので単色の黒

とした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594033/68bc1621-0350-f13e-cda5-168aabcc2f4b.png)


普通の雪は結晶無しのものにして、PxDTのテクスチャの結晶の雪をときどき降らせたいので、もう１つパーティクルシステムを作り追加する。
<img width="80" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357139/c3216ca0-f89f-a981-7c8e-a79527ef6ab5.png >
それのパラメータは、量以外は結晶無しのものと同じでよいので、Hieralchyのウインドウでそれをコピーしペーストする。
 ただ、PxDT結晶の雪はゆっくりと時々現れるようにしたいので、Gravity Modifierを0.1に、量は更に少なめにしてRate over Timeは5とした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594033/175c4c95-e1c0-6b6c-6a57-ee3b651dfd9d.png)


作成するアプリケーションの動作モードして、Build Settingsの「Player Settings...」-> Playerで、FullScrenn WindowやWindowedモードに設定、変更できる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594033/8464ad5f-099a-d7eb-bbc4-c71fd9153daa.png)
この雪景色を動画として保存したい場合は、出来上がったアプリを実行し、windows標準のスクリーン動画キャプチャで簡単に撮れ保存できる（windowsキー＋Gで起動）。

これで出来上がった動画は、クリスマス期間企画として弊社エントランスに、クリスマスツリーと弊社の[SoundHug](https://pixiedusttech.com/product/soundhug/)とともに、ディスプレイにその雪景色を映し出しています。
 もしミッドタウン八重洲8Fにいらっしゃる機会がありましたら、どうぞご覧になってみてください。


 このクリスマスシーズン、これを使ってPC画面に雪を降らせて、楽しい時間を演出してみるのはいかがでしょうか？

よいクリスマス！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357139/203d9b0c-d4a3-5535-bd0f-372b1bf6a225.png)
Excelのすべて更新をVBAで自動化する

# きっかけ

ExcelのPowerQueryを利用してデータを処理していると、結果を最新に更新するため「データ」タブの「すべて更新」を実行する必要があります。しかし、その作業を複数のファイルに対して行うのは非常に手間がかかるため、VBAを使用して一括実行をしたいと考えました。

VBAにはRefreshAll関数があり、これを使用することでクエリの更新を一括して実行できると思われました。ただし、この関数は非同期で実行されるため、更新が完了する前に後続処理が開始されてしまう問題がありました。

Wait関数を使って更新が完了するまで待機させる方法も検討しましたが、更新自体が停止するため、この方法は使えませんでした。

# 実現方法とサンプルコード

この問題の解決策として、クエリの BackgroundQuery プロパティを False に設定する方法が有効でした。この設定により、更新が完了するまで待つようにすることが可能になります。サンプルコードを掲載します。

```
Sub Macro1()
    Dim objCon As WorkbookConnection, bBQ As Boolean
    Dim objConType As Object

    ' コネクションごとに処理
    For Each objCon In ThisWorkbook.Connections
        ' タイプによって分岐
        Select Case objCon.Type
            Case xlConnectionTypeODBC
                ' ODBC接続の設定
                Set objConType = objCon.ODBCConnection
            Case xlConnectionTypeOLEDB
                ' OLEDB接続の設定
                Set objConType = objCon.OLEDBConnection
        End Select

        ' BackgroundQueryを更新前にFalseに設定
        With objConType
            bBQ = .BackgroundQuery
            .BackgroundQuery = False
            objCon.Refresh
            ' 更新後に元の設定を復元
            .BackgroundQuery = bBQ
        End With
    Next
End Sub
```

# おわりに

このコードを使用することで、Excelのクエリの更新を自動化することができました。

# 参考文献
VBA RefleshAll作業を待ってから次の作業に移る
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14205174064
Python初心者がイテレータについて理解する


最近、イテレータについて勉強したので書いてみようと思います。

イテレータとは、要素を反復して取り出すことの配列みたいな型です。
は？ですね、はい。

## 反復処理

公式ドキュメントによると、反復処理メソッドをサポートするための型と書いてあります。[^1]
要するに、動的にオブジェクトを生成する変数(配列)みたいなものですかね。

[^1]:https://docs.python.org/2/library/stdtypes.html#iterator-types

### ジェネレーター

このドキュメントにはジェネレーターなるものも書かれています。
この解説を見るに、**ジェネレーターはイテレータの一種**で、**呼び出すごとに何か処理をするイテレータ**なのだとわかります。[^2]

これに関しては後述します。

[^2]:https://docs.python.org/2/reference/expressions.html#yieldexpr

## 配列をイテレーターにしてみる

とりあえず、手を動かしてみました。

```python
season = ['Spring', 'Summer', 'Fall', 'Winter']
iter_season = iter(season) # イテレーターに変換
print(type(iter_season)) # ここでiterと出る。イテレーターになっている。

print(next(iter_season)) # 1番目のイテレータを表示後、次のイテレータに進む
next(iter_season) # 次のイテレータに進む

# イテレータを１つずつ取り出して表示
for i in iter_season:
    print(i)

# イテレータを１つずつ取り出して表示
for i in iter_season:
    print(i)
```

これをすると、

```結果
<class 'list_iterator'>
Spring
Fall
Winter
```

となります。

なんでしょうか...感覚としては一度きりしか呼び出せない配列のような気分です。

### reversed関数

`iter()`ではただイテレーターにするだけでしたが、`reversed()`ではどうでしょう。

```python
season = ['Spring', 'Summer', 'Fall', 'Winter']
iter_season = reversed(season)
print(type(rev_season)) # 型を表示して確認

print(next(iter_season)) # 1番目のイテレータを表示後、次のイテレータに進む
next(iter_season) # 次のイテレータに進む

# イテレータを１つずつ取り出して表示
for i in iter_season:
    print(i)

# イテレータを１つずつ取り出して表示
for i in iter_season:
    print(i)
```

```結果
<class 'list_reverseiterator'>
Winter
Summer
Spring
```

逆になっているのがわかりますね。
reversedを使うと逆向きのイテレータが作ることができるようです。

### 注意点

先ほども書いたように、イテレータオブジェクトは使い捨てなので、一度呼び出し切った場合はもう一度作成し直さなければならないようです。

## 自作のイテレータクラス

ここまでは標準で用意されている型をイテレータに変換してきましたが、今度は自分で作ったクラスをイテレータとして実装してみましょう。

```python
class MyIter:
    def __init__(self, objs):
        self.objs = objs # コンストラクタの引数をオブジェクトとして持つ
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.objs):
            raise StopIteration # 配列の中身がなくなったらStopIteration例外を投げる
        value = self.objs[self.index] # index番めの要素をセット
        index = self.index # indexをセット
        self.index += 2 # indexを増やす。次に　next()されたときは増えた状態になっている。
        return index, value

my_iter = MyIter(['Apple','Orange','Strawberry','Peach','Banana'])
for i in my_iter:
    print(i)
```

こうすると、結果は、

```結果
(0,'Apple')
(2,'Strawberry')
(3,'Banana')
```

となります。

## ジェネレーターとはなんぞや

ジェネレーターとは、さっきのやつの関数バージョンのようなことらしいです。

```python
def MyGen(obj):
    index = 0
    while True:
        if self.index >= len(self.obj):
            raise StopIteration
        value = self.obj[self.index]
        index = self.index
        yield index, value

my_gen = MyGen(['Apple','Orange','Strawberry','Peach','Banana'])
print(my_gen[0])
print(my_gen[1])
```

とすると、結果は、

```結果
(0,'Apple')
(2,'Strawberry')
```

と同じように返ってきます。

先のものとの違いは、`yield`で値を返すことです。

これの何が嬉しいかというと、今回であればいつ呼び出されても同じ処理をしているが、1回目の処理と違う処理をさせることだってできることですね。

## ジェネレータやイテレータの便利なところ

イテレータの便利さは一度読み取ったら、前のものはもう読み出せないことで、二重処理を防ぐことができるのではないかと思いました。
ジェネレーターに関しては、メモリを取らないことのようです。処理をして値を生成するわけだが、呼び出されない限り処理はされないので、メモリに優しいことのようですね。

自分はまだ完璧に使いこなすことはできませんが、これからも勉強していこうと思います。
LINE WORKS API 基本カレンダーの予定の登録


# LINE WORKS API を使って基本カレンダーに予定を登録する

この記事では、LINE WORKS API を利用して基本カレンダーに予定を登録する Python サンプルスクリプトを紹介します。Google Colab を使えば、ブラウザだけで簡単に試すことができます。

## 使用する API

- [LINE WORKS API ドキュメント](https://developers.worksmobile.com/jp/)
- **POST /users/{userId}/calendar/events**  
  この API を使用して基本カレンダーに予定を登録します。

## 必要な準備

1. **LINE WORKS API の認証情報を取得**  
   - `ACCESS_TOKEN` を用意します（カレンダー API 用のスコープを有効にする必要があります）。
   - `USER_ID` を設定します（`me` または対象ユーザーのログイン ID）。

2. **Google Colab での操作環境**  
   以下のリンクから Google Colab ノートブックを直接開き、編集・実行できます。  
   [LW_Calendar_Event_Create.ipynb](https://colab.research.google.com/drive/1Oe18pTUIQ4OA5RLWDhjHSPj7_XyhSV9d?usp=sharing)

## サンプルスクリプト

以下は Google Colab 用に構成されたスクリプトの内容です。

```python
# 必要な変数を Google Colab のパラメータ形式で入力
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"  # @param {type:"string"}
USER_ID = "me"  # @param {type:"string"}

import requests
import json

# API エンドポイント
BASE_URL = f"https://www.worksapis.com/v1.0/users/{USER_ID}/calendar/events"

# 登録する予定のデータ
EVENT_DATA = {
    "eventComponents": [
        {
            "summary": "LINE WORKS API Meeting",
            "description": "API を使用して作成された予定",
            "start": {
                "dateTime": "2024-12-25T10:00:00",
                "timeZone": "Asia/Tokyo"
            },
            "end": {
                "dateTime": "2024-12-25T11:00:00",
                "timeZone": "Asia/Tokyo"
            },
            "visibility": "PUBLIC"
        }
    ],
    "sendNotification": False
}

# HTTP リクエスト
headers = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json"
}

response = requests.post(BASE_URL, headers=headers, json=EVENT_DATA)

# レスポンスを表示
if response.status_code == 201:
    print("✅ 予定を作成しました:")
    print(json.dumps(response.json(), indent=2, ensure_ascii=False))
else:
    print(f"⛔ エラーが発生しました: {response.status_code}")
    print(response.text)
```

## 実行方法

1. Google Colab のノートブックを開きます：[LW_Calendar_Event_Create.ipynb](https://colab.research.google.com/drive/1Oe18pTUIQ4OA5RLWDhjHSPj7_XyhSV9d?usp=sharing)
2. 必要なパラメータ（`ACCESS_TOKEN`、`USER_ID`）を入力します。
3. セルを順に実行して、カレンダーに予定を登録します。

## まとめ

このノートブックを使用すれば、LINE WORKS API を用いて簡単にカレンダーに予定を登録できます。  
API の活用方法や改善案があれば、ぜひコメントしてください！
米田の補題 #11 圏の定義④　恒等射

# 米田の補題は、圏論でもっとも重要な定理です（繰り返し）
圏論は、数学の基礎理論です。いままで、[万物の理論](https://amzn.to/3ZLmCJH)
といわれていましたが、[数理科学 11月号](https://amzn.to/4iz6NgM)では、なんと　<font color="Red">万物・万事・万人</font>のための数学理論とまでいわれるようになりました
このAdventCalendar は、体験的に圏論の最も重要な定理である米田の補題を体験的に理解してもらうためにかいています

参考にしているのは、[圏論の道案内](https://amzn.to/4iH2Rus)です

# 恒等射 めちゃくちゃ重要
圏の定義だけでも、実はめちゃくちゃ難しいです。自然数のようなお行儀のよい対象の世界から、一歩踏み出して、現実の世界に応用しようとすると、ボロボロになります。その筆頭が、恒等射です。
定義は、対象Aを選んだとき、Aを域、余域にするある特別の射が一意に存在します。その射はAを余域とする任意の射fと合成すると結果はfになり、Aを域とする任意の射gと合成するとgになります。
通常の会話では、何もしない射だと説明されます。
恒等射が存在しないと圏にはなりません。日常の活動に、圏を導入しようとすると恒等射とはなにかが問題になります。企画では、いままで、素朴に射を、きっかけ -> 次　のように扱ってきましたが、恒等射はなんになるでしょうか？　何もしない射として導入してよいのでしょうか？　ちゃぶ台返しになりますが、いままで、対象とか射と表現してきましたが、その表現は的確だったのでしょうか？　自然数では、ゼロがあるので、対象に０を足すことが恒等射になります。余域と域と合成するかの区別がありますが、どちらもがあるので恒等射の定義からは、対象それぞれに恒等射があります。射全体は、パラメータ３つなので、（A,A,恒等射の値）のようになります。自然数では、恒等射の自然数としての値がゼロ固定です。対象によって異なることはないです。これは、恒等射の定義からするとかなりきつい設定です。
では、米田の補題川柳です

**米田の補題川柳 もとままに戻ることはすごいこと**
恒等射はそれだけでは意味がなく、逆射と組になってはじめて効果を発揮します。逆射でなにもしない状態に戻れるわけです。圏の体裁を無視して、話をすすめると、システム開発でもとにもどせることです。グリコのシステム障害でわかるように、もとにすぐに戻せるのは非常に重要です。自然数の圏では残念ながら、逆射はないです。無理に自然数的な圏の応用事例を考えるなら、何もしないでじっとまって機会を伺うということでしょう。
HTTPステータスコードについて

この記事は東京海洋大学NePPの Advent Calendar 2024の23日目です。
# はじめに
こんにちは！
私がRailsのステータスコードとRails特有のシンボルについて学んだことのアウトプットの機会としてこの記事を書きました。

あくまで個人的な見解ですので、あしからずご容赦ください。

# HTTPステータスコードとは
WEBサーバーがWEBブラウザなどのクライアントからのリクエストに対する応答として示す3桁の数字です。これにより、リクエストが成功したか、エラーが発生したか、または追加の操作が必要かをクライアントに通知します。

# なぜHTTPステータスコードのお気持ち
ステータスコードは、人間にリクエストの状況を伝える「お知らせ」のようなものです。
それぞれのステータスコードには、クライアントやサーバーに対する「状態の伝達」と「適切な対応を促すメッセージ」が込められています。
例えば：
403 : アクセス権がない。
404 : リクエストされたリソースが見つからない。
など、これらが返されたら、ユーザーは「アクセス権がないんだな！」や「リクエストしたURLが見つからないんだ」と現在の状況を判断することができます。
そして次のアクションをとることができます。(アクセス権を手に入れてからもう一度リクエストしてみよう！とか)

# 数値とシンボルについて
Railsでは、HTTPステータスコード（例: 200, 404,）を直接数値で書く代わりに、シンボル（例: :ok, :not_found,） で指定することができます。

## シンボル (:ok) と数値 (200) の違い

### :ok
可読性が高い
シンボルを使うと、コードを読むだけで意味が直感的に理解できます。
```
render json: user, status: :ok
```
Railsが内部的にシンボルを対応する数値コード（ここでは200）に変換します。
### 200

標準的なHTTPステータスコード:
HTTPの知識がある人には直接的にわかりやすい。
```
render json: user, status: 200
```

# どちらを使うべきか
### 筆者の見解
個人的な意見としては、シンボルを使うべきだと思います。
理由は、文字を見ればある程度何についてのエラーなのかがわかるのと、Railsのコードスタイルに適しているからです。

しかし、標準的なステータスコードを使いたかったり、プロジェクトによって書き方は異なるので、
その時の状況次第で使い分けができるのがベストだと思います。

# 終わり
最後にシンボルと数値の早見表のリンクを貼ったので参考にしてみてください。


https://qiita.com/takuo_maeda/items/9cff0b03e74f8f600eee

@takuo_maeda
(前田 卓大)さん
HTTPステータスコード一覧

参考文献
https://qiita.com/takuo_maeda/items/9cff0b03e74f8f600eee
https://qiita.com/terufumi1122/items/997e24dde87f807e3944
openWeatherMapAPIの紹介

# はじめに
OpenWeatherMap APIは、気象情報や天気予報を提供するためのサービスで、アプリの開発者やウェブサイト作成者に常用されています。この記事では、OpenWeatherMap APIの基本的な使い方や主な機能について解説します。

# 使用法
OpenWeatherMap APIを使用するには、無料か有料のAPIキーを登録して取得する必要があります。次のステップを参考にして使用を始めましょう。

アカウント登録およびログイン
OpenWeatherMapのウェブサイトでアカウントを作成し、ログインします。

APIキーの取得
ユーザーダッシュボードからAPIキーを取得します。

エンドポイントの定義
エンドポイントを定義し、HTTPリクエストを送信します。

例、当前天気情報を取得するリクエストは下記のようです。

https://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=YOUR_API_KEY

APIの返すデータの判断と処理
APIはJSON形式のデータを返します。これを解析し、必要な情報を取り出します。

# 実用例
今回は簡単にホームページにOpenWeatherMapから取得したデータをホームページに出力してみます。
```
const API_KEY = '';
        const weatherInfoEl = document.getElementById('weather-info');
        const getWeatherBtn = document.getElementById('get-weather-btn');

        async function fetchWeather() {
            const url = `https://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=5d783608e942ed6119709729459521fd&lang=ja&units=metric`;

            weatherInfoEl.textContent = '天気情報を取得中...';

                const response = await fetch(url);
                const data = await response.json();

                if (response.ok) {
                    const weather = data.weather[0].description; 
                    const temp = data.main.temp;
                    weatherInfoEl.textContent = `東京の天気は「${weather}」、気温は${temp}℃です。`;
                } 
        }
```

![スクリーンショット 2024-12-24 16.35.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957639/f20c3d44-200c-9ca9-4120-3935ceb2d18b.png)


# 最後に
記事を参考にして、OpenWeatherMap APIを使用した気象情報アプリを作成しましょう。
【祝】Qiitaアドベントカレンダー2024完走した感想

# Qiitaアドベントカレンダー2024完走の振り返り

Qiitaアドベントカレンダー2024の12/1から12/25までの25記事を完走することができました。以前のQiitaエンジニアフェスタ2024では半分程度の達成に留まり、その経験から得た教訓を活かして今回は最後まで走り切ることができました。

# 良かったこと
## 1. アウトプットの習慣化
インプットした知識や実装経験を他者に伝えられるレベルまで理解し、それを言語化する能力が身についたことは大きな成長につながりました。

## 2. 学習意欲の向上
25個の記事を作成するために必要な題材を考えるうえで、新たな学びへの意欲が自然と湧いてきました。特に15記事目付近で記事のネタがなくなった時に、能動的に新しい知識を求めて学習する機会となりました。

# 反省点
## 1. 記事の内容の一貫性
当初計画していた内容を期限内に執筆できず、既存のストック記事で補完したり、十分な検討なく記事を作成したりした結果、全体的な一貫性に欠ける内容となってしまいました。今後のアドベントカレンダーやエンジニアフェスタでは、執筆計画を綿密に立て、テーマに沿った記事作成を心がけていきます。

## 2. 事前準備の不足
11月1日から準備期間があったにもかかわらず、ハッカソンやその他イベントへの参加により、12月1日時点での記事ストックが4～5本程度しかありませんでした。次回は11月中に半数以上の記事を準備し、より質の高いコンテンツを提供できるよう努めます。

# 最後に
今回のアドベントカレンダー完走は、大きな達成感をもたらしてくれました。毎日の学習とアウトプットを継続した12月は、非常に充実した25日間となりました。この経験を活かし、今後も学習意欲と記事作成のモチベーションを維持しながら、継続的なインプット・アウトプットのサイクルを確立していきたいと考えています。

**次回のエンジニアフェスタでは、記事の質を向上させつつ、完走を目指して挑戦していきます🔥**
CoinGeckoAPIについて

# CoinGecko API入門: 仮想通貨データを簡単に取得しよう！

仮想通貨（暗号通貨）に興味はあるけれど、価格やデータを効率的に取得する方法が分からないという方も多いのではないでしょうか？この記事では、初心者でも簡単に使える「CoinGecko API」について解説します。これを使えば、リアルタイムで仮想通貨のデータを取得し、自分だけの価格トラッキングアプリやウェブサイトを作ることができます。

## CoinGecko APIとは？

CoinGecko APIは、仮想通貨の価格、取引量、市場キャップ（時価総額）などの情報を提供する無料のAPIです。数百種類の仮想通貨に対応しており、開発者や仮想通貨ファンにとって非常に便利なツールです。

### 主な特徴
- **無料で利用可能**（一部の高機能にはプレミアムプランもあり）。
- BitcoinやEthereumなどの主要通貨から、マイナーな通貨まで幅広くカバー。
- シンプルなREST API形式で、初心者にも扱いやすい。
- 豊富なドキュメントが用意されており、学習コストが低い。

## APIの使い方

### 1. アカウント登録は不要！
CoinGecko APIは、事前にアカウントを作成したり、APIキーを取得したりする必要がありません。そのまま使えるので、手軽に始められます。

### 2. APIエンドポイントの基本
CoinGecko APIは以下の形式のURLにアクセスしてデータを取得します：

```
https://api.coingecko.com/api/v3/<エンドポイント>
```

例えば、Bitcoinの現在価格を取得する場合は以下のURLを使います：

```
https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd
```

### 3. 必要なツール
- **ブラウザ**: URLにアクセスするだけでもデータを確認できます。
- **cURL**: コマンドラインでAPIリクエストを試す。
- **コードエディタ**: 実際にアプリやツールを開発する際に使います（例: Visual Studio Code）。
- **プログラミング言語**: PythonやJavaScriptなど、好きな言語を選びましょう。

## 実際にデータを取得してみよう

以下では、Pythonを使ってCoinGecko APIを利用する例を紹介します。

### 必要なライブラリ
まずはPythonのライブラリ`requests`をインストールします。

```bash
pip install requests
```

### サンプルコード
次に、Bitcoinの価格を取得するコードを書いてみましょう。

```python
import requests

url = "https://api.coingecko.com/api/v3/simple/price"

params = {
    "ids": "bitcoin",
    "vs_currencies": "usd"
}

response = requests.get(url, params=params)

data = response.json()

print(f"Bitcoinの価格: ${data['bitcoin']['usd']}")
```

### 実行結果
実行すると、Bitcoinの現在価格が表示されます。

```plaintext
Bitcoinの価格: $27350
```

## その他のエンドポイント
CoinGecko APIは多くのエンドポイントを提供しています。以下はその一部です：

1. **トレンドの仮想通貨**
   - URL: `https://api.coingecko.com/api/v3/search/trending`
   - 人気のある仮想通貨を取得します。

2. **特定の仮想通貨の詳細情報**
   - URL: `https://api.coingecko.com/api/v3/coins/{id}`
   - 例: Bitcoinの詳細情報を取得するには`bitcoin`を指定。

3. **取引所情報**
   - URL: `https://api.coingecko.com/api/v3/exchanges`
   - 仮想通貨の取引所リストを取得します。

## 注意点
- **APIの制限**: 無料プランでは、1分あたり50リクエストの制限があります。
- **データの正確性**: CoinGeckoは信頼できる情報を提供していますが、最終的な判断は自己責任で行ってください。

## まとめ
CoinGecko APIは、仮想通貨に関するデータを簡単に取得できる便利なツールです。無料で使える上に、幅広いエンドポイントが用意されているため、自分のアイデアをすぐに形にすることができます。ぜひこのAPIを活用して、仮想通貨に関連するアプリやサービスを作ってみてください！
Spotify Web APIについて...

はじめに...
--------------------------
今回はSpotify Web APIについて調べてみました。
本記事では、SpotifyのWeb APIの概要についてご紹介します。
こちらのリンク先を参考にさせていただきました。

https://developer.spotify.com/

https://developer.spotify.com/documentation/web-api

Spotify Web APIとは...
--------------------------
Spotifyが提供しているプログラミング用のWeb APIです。
このWeb APIはSpotifyの楽曲データやプレイリスト、アーティスト情報などのデータにアクセスできます。　また自分で書いたプログラムにAPIを活用して音楽再生、楽曲検索などのさまざまな機能を実装することができます。

使用用途...
--------------------------
楽曲に関する情報取得: 楽曲名、アーティスト情報、アルバムジャケット、ジャンルなどのデータを取得可能。

プレイリスト: プレイリストの作成、編集、楽曲の追加/削除。

楽曲再生: Spotifyプレイヤーの操作（再生、停止、スキップなど）。

おすすめ楽曲の表示: ユーザーの履歴やジャンル傾向などに基づいたレコメンド機能。

統計分析: アーティストや曲の再生回数、人気度のデータ分析。

Spotify Web APIの特徴と注意点...
--------------------------
RESTful APIなので、Web技術(html,css等)で開発ができる。

認証にはOAuth 2.0が使われているので、他サービスとの連携がしやすい。

基本料金が無料なので誰でも簡単に利用を始めることができます。
※ただし、レート制限があるので使い過ぎには注意です。

利用規約...
--------------------------
利用規約については以下のリンクをご覧ください。

https://developer.spotify.com/terms

さいごに...
--------------------------
最後までご覧いただきありがとうございました。
今回、Spotify Web APIについて調べてみて、音楽関連のアプリ開発をするにはもってこいなAPIだと感じました。また、活用できるようになるまでの敷居が低く初心者でも簡単に利用できるという利点があると思うので気になる方はぜひ試してみてください。

具体的なSpotify Web APIの利用については、次回の記事で紹介(挑戦)しようと思うのでぜひそちらも見ていただけると嬉しいです。

参考
--------------------------

https://developer.spotify.com/

https://developer.spotify.com/documentation/web-api

https://developer.spotify.com/terms
今年のRustふりかえり

この記事は[Rust Advent Calender 2024](https://qiita.com/advent-calendar/2024/rust)シリーズ2の24日目の記事になります。

# はじめに

- Rustを仕事3:趣味7でやっているゆるふわRustエンジニアです
- クリスマスということで気合を入れて記事を書くつもりでしたが年末進行は許してくれませんでした、つらいね！
- 軽い振り返り記事になります

## 今年Rustでやってきたことを振り返ります



- DiscordBot

ライブラリ：[poise](https://github.com/serenity-rs/poise)
用途：TODO通知、SwitchBot、ゲームサーバーのUP/DOWN

めんどくさい確認ごとや、ちょっとした操作をできるようにしています。
VPSは最安のを契約していますが、Rustで作ったおかげか余裕で動いています。

- fbxビュワー

ライブラリ：[Bevy](https://bevyengine.org/)
用途：FBX確認

Windows標準でもよかったですが、Bevyの練習のため作成

- PMD/PMX Parser

ライブラリ：なし
用途：あまりかんがえてない

手持無沙汰で何かプログラム書きたいなと思ったときに目の前にあったのがPMXファイルでした。

## Rustを使っていてよかったこと

- muslでの静的バイナリがいい

開発環境で持ち運ぶツールにピッタリ

- 開発するにあたって公式ツールが使いやすい

cargoのコマンド群が特にとてもいい
一生ついてく

- メモリは相変わらず気にするけど、ポジティブに考えられる

最悪ミスってても落ちづらい(unsafeを除く)

## さいごに

Rustはいいぞ！
ゲーム動画からユーザー名を黒塗りするアプリを作った話

同じネタで何回投稿するのか？と指摘されてしまうかもしれませんが、私なりに頑張った成果の一つなので許してください。

## ゲームのプレイ動画からユーザー名を黒塗りするWindowsアプリを作りました！
私がずっとプレイしているFinalFantasyXIVのプレイ動画からユーザー名を黒塗りしてくれるWindowsアプリを作りました。
一番下の参考リンク先に処理結果の動画なども掲載しているので、良かったら見てみてください。

## FinalFantasyXIVとは？
スクウェア・エニックスが運営している14番目のファイナルファンタジーでMMORPGです。PS4、PS5、PC、Steam、Mac、XBOXのクロスプラットフォームで展開されており、プラットフォーム問わずに同じサーバーでプレイが可能、プレイヤーのアバターとなるキャラクターには多くの種族、20を超えるの戦闘ジョブ、クラフターやギャザラーなどの生産系ジョブ、ファイナルファンタジーの代名詞ともいえる召喚獣（FF14では蛮神）戦、ファイナルファンタジーらしいボリュームがあり重厚なメインシナリオ、MMOでありながらひとりでもコンテンツを進めることができるサポーターシステム、ゲーム内ゲームが楽しめるゴールドソーサー、様々なコーディネートを楽しめるミラージュプリズムシステム、自分だけの家や部屋を自分好みにカスタマイズできるハウジングシステム、などなど、コアなゲーマーからライトなプレイヤーまで幅広い客層をターゲットとした大人気オンラインゲームです。
通常ゲーム3本分とも言われるメインシナリオ3章分はフリープレイで無料でも遊べます！
1/6まではダウンロード版が30%オフらしいので、自分へのクリスマスプレゼントにも最適かもしれません！
私は青魔道士が好きなので、よかったら一緒に青魔道士しましょう！

https://jp.finalfantasyxiv.com/

## なぜゲームプレイ動画からユーザー名を黒塗りしたいのか？
ゲームプレイをyoutubeなどの動画サイトにアップする時、自分以外のユーザー名を表示していても規約違反などにはならないのですが、動画投稿者の意図とは別の視点、例えばあるプレイヤーの失敗を嘲笑するようなことになると、投稿者にその意図はなくても問題視されてしまいます。
また最近の動画配信文化などから、ゲーム動画を配信する際には他のプレイヤーは匿名状態でなければならない、というような暗黙でありながら鉄の掟のようなものが確かに存在していると感じています。
そのような配信文化を考慮してか、FF14にはユーザー名をイニシャル表示にする、というような機能が備わっていたりしますが、全てそのような設定にしてしまうと他のユーザーをNPCのように扱ってしまうようで、ゲームプレイから一期一会の会話、MMOらしさというものは失われてしまうのではないか、と考えています（個人の感想です）。
そこで、実際のゲームプレイではフルネームを表示しながらも、録画した動画や配信では、ユーザー名を見えなくすることができれば、MMOらしいゲームプレイ感を損ねず、また他のユーザーのプライバシーにも配慮することができるのではないか？と考えました。

## どうやって動画からユーザー名を黒塗りするか？
動画配信の対応（リアルタイム対応）も行いたいところですが、技術的なハードルが高いので、まずは録画したゲーム動画からユーザー名を見つけ、黒塗りする方法を検討しました。
### 動画からユーザー名の検出方法
動画からユーザー名を見つける方法は、OCRやテンプレートマッチングなどいろんな方法を考えましたが、最終的には物体検出を利用しています。当初はMMDetectionとDETRを利用していましたが実際のアプリでの処理速度が遅かったため、現在はUltralytics yolov8を利用しています。
ゲーム画面のユーザー名は実世界には存在しないもので、物体検出できるものかと当初は少し心配でしたが、画面中には確実に存在するためか学習を行うことで物体検出することが可能でした。
検出部分の黒塗りなどの処理はOPENCV-pythonを利用しています。

### 動画の入出力処理
当初はmoviepyを利用していましたが、現在はffmpeg-pythonでffmpegを利用しています。物体検出でGPUを利用して処理速度の向上を図っているのと同様に、動画の入出力にもGPUのハードウェアエンコーダを利用しています。

### ユーザーへの提供方法
動画をアップロードしてもらい、サーバーで処理をして、動画を出力する、というような形も考えてましたが、動画ファイルのファイルサイズや物体検出処理でGPUが必須ということ、また利用頻度があまり高くなさそうなことから、Windowsクライアントでのアプリケーションとしました。
pythonで開発しており、UIはFlet、EXE化にはpyinstallerを利用しています。

## 苦労したことや楽しかったことなど
苦労した点は処理速度の改善です。
開発当初はユーザー名を消すことを優先しすぎていたため、アプリケーションの処理速度が3FPSとかなり遅いものとなってしまっていました。
処理速度改善のために、ultralytics yolov8、ffmpeg-pythonなどライブラリの変更をしたり、ultralyticsのdiscordに教えを請いに伺ったり、できることは何でもしようとトライしました。
現在は20～25FPSで処理できるようにまで改善していますが、そろそろ限界なので、C#かC++での再実装を検討しています。
楽しかったことは、動画からユーザー名を黒塗りするWindowsアプリを作れたことですね。自分が妄想していたことが実現できたというのは良い体験になりました。

## ご参考

https://qiita.com/calcMCalcm/items/178901c752f6cef481f1

https://qiita.com/calcMCalcm/items/926bf944beaa7b730b63

https://blog.calocenrieti.com/blog/wol_names_blacked_out
LINE WORKS API ユーザーの基本カレンダーの取得


# LINE WORKS API を使ってユーザーの基本カレンダー情報を取得する

この記事では、LINE WORKS API を利用してユーザーの基本カレンダー情報を取得する方法について説明します。
Python のサンプルコードを提供し、Google Colab 上で実際に動作させる方法も解説します。

## 特徴

- **APIの利用方法**: カレンダー情報を取得するためのリクエストの作成。
- **Pythonサンプルコード**: リクエストとレスポンスの処理を実装。
- **Google Colabで試す**: 提供される Colab ノートブックで即座に試せます。

## 必要な準備

1. **LINE WORKS API アクセストークン**を取得してください。
   - アクセストークンは API リクエストの認証に必要です。
2. **Google Colab** を利用して実行環境を整えてください。
   - 共有リンクを使って簡単に試せます。

## Google Colab ノートブック

Google Colab ノートブックを使用すると、この記事のコードを直接試すことができます。
以下のリンクからノートブックにアクセスしてください:

[Google Colab ノートブックを開く](https://colab.research.google.com/drive/1Cw0QDu3aRc6MQAWw6LTKng4NwcVOhSrK?usp=sharing)

## サンプルコード

以下の Python コードは、LINE WORKS API を使用してカレンダー情報を取得するサンプルです。

```python
# 必要なライブラリをインストール
!pip install requests

import requests

# 必要な変数を Google Colab のパラメータ形式で入力
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN" # @param {type:"string"}
USER_ID = "me" # @param {type:"string"}

BASE_URL = "https://www.worksapis.com/v1.0/users/{userId}/calendar"

# カレンダー情報を取得する関数
def get_user_calendar(user_id, access_token):
    url = BASE_URL.format(userId=user_id)
    headers = {
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json"
    }

    try:
        # API リクエストを送信
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            data = response.json()
            print("カレンダー情報を取得しました:")
            print(f"カレンダー名: {data['calendarName']}")
            print(f"説明: {data['description']}")
            print(f"カレンダーID: {data['calendarId']}")
            print(f"公開設定: {data['isPublic']}")
            print(f"共有メンバー:")
            for member in data["members"]:
                print(f"  - ID: {member['id']}, タイプ: {member['type']}, 権限: {member['role']}")
        elif response.status_code == 403:
            print("エラー: 権限がありません (403 Forbidden)")
        elif response.status_code == 404:
            print("エラー: カレンダーが見つかりません (404 Not Found)")
        else:
            print(f"エラー: ステータスコード {response.status_code}")
            print(response.text)
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# カレンダー情報を取得
get_user_calendar(USER_ID, ACCESS_TOKEN)
```

## 実行手順

1. Colab ノートブックを開きます。
2. 必要なパラメータ（`ACCESS_TOKEN` など）を設定します。
3. コードを実行して、カレンダー情報を取得します。

## 参考情報

- [LINE WORKS API ドキュメント](https://developers.worksmobile.com/jp/document/100200804?lang=ja)
- [Google Colab](https://colab.research.google.com)

この記事のコードは、LINE WORKS API を活用したシンプルな実装例です。API の活用方法を学ぶ一助となれば幸いです。
kaggle tutorial Reinforcement Learning part 3

今日は

https://www.kaggle.com/code/alexisbcook/n-step-lookahead


https://www.kaggle.com/code/alexisbcook/deep-reinforcement-learning

の確認をおこなっていきます。元となる発想はpart2 で解説した、1手先の全ての盤面を考え、その中で最も良さそうなもの（スコアが高いもの）を選ぶ
の、1手先をN手先にしたらより正確に最後まで予測出来、評価関数の精度が上がるよね。ということです。ただ、なんとなく考えてもわかる通り、手数が1増えるごとに考えられる盤面が指数関数的に増えていきます。
そこで、AIは可能な限り高いスコアを得るために手を打ち、相手はスコアを可能な限り低くするために手を打つことでこれに対抗すると仮定します。これを仮定する事で理論上はありうる盤面の全てを考えなくても良くなります。これがミニマックスアルゴリズムの主な考え方です。

```python
import random
import numpy as np

# エージェントが選択したの次のステップでの盤面を取得する関数
def drop_piece(grid, col, mark, config):
"""
    Args:
        grid (numpy.ndarray): 現在のゲーム盤の状態。
        col (int): ピースを落とす列のインデックス。
        mark (int): プレイヤーの識別子（通常、1または2）。
        config: ゲームの構成情報（行数、列数など）。

    Returns:
        numpy.ndarray: ピースを落とした後の新しいゲーム盤。
    """

# ウィンドウがヒューリスティック条件を満たしているかを確認
def check_window(window, num_discs, piece, config):
    """
    `window` (連続したマスのリスト) が、特定のヒューリスティック条件を満たしているかどうかを確認します。

    Args:
        window (list): チェックするマスのリスト。
        num_discs (int): 目的のプレイヤーのピースの数。
        piece (int): プレイヤーの識別子。
        config: ゲームの構成情報。

    Returns:
        bool: ヒューリスティック条件を満たしていればTrue、そうでなければFalse。
    """
    
# 指定されたヒューリスティック条件を満たすウィンドウの数を数える（仮定を使用しています！！！）
def count_windows(grid, num_discs, piece, config):
    """
    指定されたゲーム盤 `grid` 上で、`num_discs` 個の `piece` と空きマスがあるようなウィンドウの数を数えます。

    Args:
        grid (numpy.ndarray): ゲーム盤の状態。
        num_discs (int): 目的のプレイヤーのピースの数。
        piece (int): プレイヤーの識別子。
        config: ゲームの構成情報。

    Returns:
        int: ヒューリスティック条件を満たすウィンドウの総数。
    """
```
このあと、相手が勝にならないように、或は自分が負けにならないようにその盤面のスコアに非常に大きな仮のスコアをつけています。このすこあもヒューリスティックにつけたものです。

最後に、

https://www.kaggle.com/code/alexisbcook/deep-reinforcement-learning

の解説を少しします。これは今までの部分にNNを付け足したものです。解説が必要な部分がありますが、原文では追加で参考となるURLを載せているのでそれを読む良さそうですね。
きほん的には、今までに人間が当てずっぽうに決めたScoreを適切に変えることは評価関数の精度の上昇につながることがわかりますね。何度も対戦していく中で、そのすこあもNNに適切に決めてもらえば人間の介入を不要としてさらに性能を挙げることができる、という話です。

# 報酬の設定
各手を打った後、エージェントがどれだけうまくやったかを伝える報酬を与えます。
エージェントがその手でゲームに勝った場合、+1 の報酬を与えます。
エージェントが無効な手を打った場合（ゲームが終了します）、-10 の報酬を与えます。
対戦相手が次の手でゲームに勝った場合（つまり、エージェントは対戦相手の勝利を防ぐことができなかった場合）、-1 の報酬を与えます。
それ以外の場合、エージェントは 1/42 の報酬を受け取ります。
累積報酬: 各ゲームの最後に、エージェントは報酬を合計します。報酬の合計をエージェントの累積報酬と呼びます。

こうする事で、AIは負けないように、勝つこと或はゲームがそのまま続く事を目指したScoreを自分で設定することができるようになります。

そのあとの部分は、

https://stable-baselines3.readthedocs.io/en/master/

が解説の中心となります。
実際に作成すると、学習時間は割とかかりますが、モデル自体は軽量なものが出来上がります。
Logstashを利用して、NFS serverに保管されたログを別システムへ転送する

# 概要
NFS serverはログファイルを格納するストレージとして利用されることが多いです。
本記事では、NFS serverに格納されたログファイルの内容を別システムへ転送するための手順を記載します。

# 環境
本手順で取り扱う内容は、次の環境にて確認しています。

* NFS Server
マシン：Amazon EC2
マシンサイズ：1vCPU 2GB
OS：Ubuntu 24.04

* NFS Client & Logstash server
マシン：Amazon EC2
マシンサイズ：1vCPU 2GB
OS：Ubuntu 24.04
Logstash：8.17.0

構成図は次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510470/486e18e9-1246-c3fc-6729-9808583807da.png)


NFS Serverに随時格納されていくログファイルの内容をLogstashによって読み取り、別システムへ転送する仕組みです。
Logstashのインストール場所ですが、NFS serverにインストールできないケースを考慮し、別途マシン(NFS client)を用意し、そちらにインストールします。

# 前提条件
NFS clientからNFS serverの任意のディレクトリをマウントできていること。
まだ未実施の場合は[こちら](https://qiita.com/ktaka1104/items/da8cf6ae3bf0689d66d7)を参照し、環境を用意して下さい。

# 手順
本手順は、NFS clientマシンにて実施下さい。

## Logstashインストール
[Logstashのガイド](https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)に従ってください。
次のコマンドでは、Ubuntu24.04にLogstashをインストールします。
```
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg
$ sudo apt-get install apt-transport-https
$ echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
$ sudo apt-get update && sudo apt-get install logstash
```

## Logstashセットアップ
`/etc/logstash/conf.d/logstash.conf`ファイルを作成して下さい。
```
$ sudo vi /etc/logstash/conf.d/logstash.conf
```
ファイルの中身を書き換えて下さい。
次のlogstash.confはサンプルになります。
各パラメータの詳細が知りたい場合は、ドキュメントを参照して下さい。
[File input plugin](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html)
[Http output plugin](https://www.elastic.co/guide/en/logstash/current/plugins-outputs-http.html)
`<YOUR-FILE-PATH>`の箇所はマウントポイント配下のファイルのパスになるはずです。
※複数のファイルを読み取りたい場合には、ワイルドカード(*)が利用可能です。
※読み取るファイルと、それらが配置される親ディレクトリに対して、"Logstash"ユーザによる実行権限が必要です。
```
input {
 file {
   path => ["<YOUR-FILE-PATH>"]
   sincedb_path => "/dev/null"
   start_position => "end"
  }
}

output {
  http {
    http_method => "post"
    url => "<YOUR-ENDPOINT>"
    headers => { "Authorization" => "Bearer <YOUR-ACCESSTOKEN>" }
    content_type => "application/json"
  }
}
```

編集が完了したら、Logstashを起動して下さい。
```
$ sudo systemctl start logstash
```

# 動作確認
NFS Serverにログファイルをアップロードし、
転送先システムにて、ログが受信できていることを確認して下さい。
もし、受信できていない場合、Logstashログ(/var/log/logstash/logstash-plain.log)を確認することが有効です。

また、LogstashのFile input pluginはtailとしても動作するので、対象のファイルに随時追記されていくログに関しても読み取りが可能です。

# 補足
* Logstashのバージョン確認コマンド
```
$ /usr/share/logstash/bin/logstash --version
```

* Logstash自動起動 有効化設定
※デフォルトでは無効となっています。
```
$ sudo systemctl enable logstash
```

* ログ収集ツールとしては他にも`Fluentd`が有名ですが、Fluentdでログファイルを読み取れるInput pluginはtail pluginのみです。つまり取得対象のファイルに追記されていくログを読み取ることは出来ますが、NFS Serverに新規にアップロードされるファイルの既存ログメッセージは読み取りません。Logstashであれば、新規ファイルの内容も読み取ることが可能です。

# 参考
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html

https://www.elastic.co/guide/en/logstash/current/plugins-outputs-http.html
Markdownでmatch,case文の色が変わらない

# 内容
Markdownのコードブロックを使用すると、Pyhtonの**match,case文が利用できない。**

# 結果
```python
hoge = "hoge"
match hoge:
    case "hoge":
        print("hoge")
    case _:
        print("hoge")
# match,caseの文字色が紫に変わらない
```

# 思ったこと
早く対応して欲しいです！
PCスペックの調べ方

# ThinkPadを使ってます
外に持ち出すことが多いのでNanoを買いました．たまにスペックを調べるときに役立つコマンドを記します．

[Lenovo 公式HP](https://www.lenovo.com/jp/ja/p/laptops/thinkpad/thinkpadx1/thinkpad-x1-nano-gen-3-13-inch-intel/len101t0054)

# スペックの調べ方
windows powershellで以下をたたくと
```powershell
Get-ComputerInfo
```
以下の情報が表示されます

**ホスト名**： PCの名前（ネットワーク上で認識される名前）
**OS 名**： 使用しているオペレーティングシステムの名称
**OS バージョン**： 現在のOSのバージョン番号とビルド番号
**OS 製造元**： OSを作成した会社
**OS 構成**： PCの役割（例: スタンドアロン、サーバーなど）
**OS ビルドの種類**： OSがどのようにコンパイルされたか
**登録されている所有者**： OSに登録されているユーザー名またはアカウント情報
**登録されている組織**： OSに登録された組織名（通常は空欄）
**プロダクト ID**： OSのライセンスID（一部公開）
**最初のインストール日付**： OSが最初にインストールされた日時
**システム起動時間**： 現在のPCが最後に起動された日時
**システム製造元**： PCの製造メーカー
**システム モデル**： PCの具体的なモデル番号
**システムの種類**： OSやPCが32ビットか64ビットかの区分
**プロセッサ**： CPUの名称と基本的な動作周波数
**BIOS バージョン**： BIOSの製造元、バージョン、最終更新日
**Windows ディレクトリ**： OSがインストールされているフォルダのパス
**システム ディレクトリ**： システムファイル（system32）が存在するフォルダのパス
**起動デバイス**： PCの起動元のデバイス（例: ハードディスク）
**システム ロケール**： システムの言語設定（例: 日本語）
**入力ロケール**： キーボード入力の言語設定
**タイム ゾーン**： 現在設定されているタイムゾーン（例: 日本標準時）
**物理メモリの合計**： PCに搭載されているRAMの総容量
**利用できる物理メモリ**： 使用可能なRAMの容量
**仮想メモリ 最大サイズ**： 仮想メモリとして使用可能な最大サイズ
**仮想メモリ 利用可能**： 現在利用可能な仮想メモリの容量
**仮想メモリ 使用中**： 現在使用中の仮想メモリの容量
**ページ ファイルの場所**： 仮想メモリが保存されているファイルの場所
**ドメイン**： PCが属しているネットワークグループ
**ログオン サーバー**： ユーザーがログインする際に使用するサーバー
**ホットフィックス**： インストールされているセキュリティパッチやアップデート
**ネットワーク カード**： PCに搭載されているネットワークデバイス（Wi-FiやBluetoothなど）
**Hyper-V の要件**： Hyper-V（仮想化機能）が使用可能かどうかの要件情報

# CPUの詳細情報
以下のコマンドを Windows PowerShellで実行すると、システム内のCPU（プロセッサ）に関する詳細情報を取得できます
```
Get-CimInstance -ClassName Win32_Processor
```
以下の情報が表示されます

**DeviceID**：　CPUのデバイスID．システムにいくつCPUがインストールされているかを示す
**Name**：　CPUの名前
**Caption**： CPUの詳細．プロセッサのファミリー，モデル番号，リビジョンを表す
**MaxClockSpeed**：　CPUの最大クロック周波数（単位: MHz）
**SocketDesignation**：　CPUが接続されているソケットの名前.物理的なソケット位置を示す
**Manufacturer**：　CPUの製造元
dSPACEでアクチュエータにセーフティをかける

## 1. はじめに
アクチュエータに定格以上のエネルギを印加すると，例えば人工筋肉のような変形するアクチュエータなどは破裂する可能性があり大変危険です．
そのため印加する電圧や空気圧の指令値に上限を設けたいときがあると思います．
ロジックを2つ紹介します．
定格がわかっているものはSimulinkで実装して，柔軟に制限したいときはControlDeskで実装するのがいいと思います．

## 2. ロジック1：Simulinkで制限
信号に上限下限を設定したい場合は`Saturation`ブロックを使用します．
以下のモデルを構築し実行すると，Pulseの振幅1に対して，Saturation下限0.0，上限0.5を通すと信号が0.5に制限されのを確認できます．
- **Pulse**
Amplitude: 1
duty ratio: 50%
delay: 5s
- **Saturation**
Lower limit: 0.0
Upper limit: 0.5
![スクリーンショット 2024-12-24 152036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/a918a756-78a2-d9f5-6b23-7205bf2c3bb8.png)

黄：入力　青：Saturationのout
<img width="50%" alt="スクリーンショット 2024-12-24 153154.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/d835b1e1-4299-5072-0425-b6a3a1013ab2.png">

さらに，ControlDeskで`MultiState Display` Instrumentと組み合わせると上限を超えたら仮想LEDを緑→赤にするなどすると直感的に状態を把握できます．
TODO: 後日記載

## 3. ロジック2：ControlDeskで制限
Simulinkモデルを変えなくてもInstrumentのプロパティを変えるだけで入力制限できます．
`Numeric Input` Instrumentの`Properties > Numeric Input > Range check`
- `Range check mode`をDisabled -> Enabled
- `Use variable range`のチェックを外す
- Range minとRange maxのグレーアウトが外れるのでそこに下限と上限を設定

![スクリーンショット 2024-12-24 160705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/d6f4689f-2a58-9153-9991-0942426bc295.png)
[読書感想文] 数学文章作法 基礎編

# はじめに
上司にオススメしていただいた [数学文章作法 基礎編](https://amzn.asia/d/eqWTOfa) を読みました。
手に収まる大きさで、スラスラと読めるように書かれています。

文章を書くことのノウハウが、この書籍にも実践されています。

読んで、印象に残ったことをアウトプットして、文章を書く練習をしたいと思います。
また実際に読んでほしいので、BOOK☆WALKERで試し読みできる範囲にしています。

# 何が学べるのか？
背表紙に学べることがまとめてあります。
一番大切にしないといけないことは **《読者のことを考える》** です。

![pose_souzou_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/f09d5eda-1978-a755-f06d-156897f7ddb3.png)

読者の何について考えるかを紐解いて教えてくれます。
また文章を書くためのコツ、読みやすくまとめる方法などを順序よく教えてくれます。

## 読者のことを考えるとは？

- 読者は何を知っているか
- 読者はどれだけ読みたがっているか
- 読者は何を求めて読むか

この三点をよく考えるないと、読者に伝わる文章は書けない。

### 読者は何を知っているか

業務における共通認識の度合いみたいな感じでした。
自分が行っている事を逐次確認していただいているなら、前提などを省略しても作業意図が伝わるみたいな感じです。
人によって知っている知識が違うので、説明をおろそかにしてはいけないということだと思いました。

### 読者はどれだけ読みたがっているか

業務だとドキュメントを読む機会がおおいです。
ドキュメントを頭から読んでも、全く理解できないような書き方をしないように、図なども入れて理解が深まるように、工夫をするということでした。

### 読者は何を求めて読むか

業務だとドキュメント読んで仕様を理解して使えるようになりたいから読むと思います。
理解してもらえるように、目次で探しやすいとか、順序立てて説明してくれているとかの工夫をするということでした。

## 基本

- 形式の大切さ
- 文章の構造

### 形式の大切さ

伝わりやすい文章とは、形式をきちんと整えなければならない。

### 文章の構造

細かなテクニックがまとめられています。
数学文章だけではなく、文章を書くときに使えるテクニックがまとめられています。

# さいごに

この文章を読んで、表題の粒度が揃っているか、曖昧な表現は使っていないかなど意識してまとめたつもりです。
また一番大事な  **読者のことを考える** ですが、この書籍を知らない人が読みたいと思える内容が書けているといいなと思います。
InStatus + New Relic でWebサイトの監視を効率化する方法

Webサイトやサービスの稼働状況を把握し、問題が発生した際に迅速に対応するためには、適切な監視ツールが欠かせません。本記事では、稼働状況の可視化に役立つ **InStatus** と、詳細なパフォーマンス監視が可能な **New Relic** を組み合わせて、Webサイトの監視を効率化する方法をご紹介します。

## InStatusとは

**InStatus** は、シンプルかつ直感的なステータスページを簡単に作成できるツールです。ダウンタイムやパフォーマンスの問題をユーザーにリアルタイムで伝えることができ、信頼性を向上させる効果があります。

### 主な機能
- カスタマイズ可能なステータスページの作成
- サービスごとのステータス更新
- 公開またはプライベートなページ設定
- ユーザー通知（メールやWebhookなど）

## New Relicとは

**New Relic** は、アプリケーションパフォーマンス管理（APM）やインフラストラクチャ監視、ログ管理など、包括的な監視ソリューションを提供します。

### 主な機能
- リアルタイムなアプリケーションパフォーマンス監視
- トランザクションやエラーの詳細な分析
- インフラストラクチャやネットワークの状態監視
- アラートと通知設定

## InStatusとNew Relicの組み合わせのメリット

この2つのツールを組み合わせることで、以下のようなメリットがあります。

1. **ダウンタイムの迅速な通知**: New Relicで、検出した問題をInStatusのステータスページで即座に共有。
2. **ユーザーへの透明性の向上**: Instatusで、問題が発生していることをユーザーに明示し、不必要なサポート問い合わせを削減。
3. **監視の効率化**: New Relicの詳細なデータを元に迅速な対応を行い、InStatusで外部コミュニケーションをサポート。
## 前提
- アカウントを持ってること
# やり方
## 1.Instatusの設定
Instatusのintegrationsのタブを開き、NewrelicのWebHookを作成します。
## 2. Newrelicの設定
### App → NewRelic
synthetics monitoringのタブを開き、ご自身のウェブサイトの設定をします。
### NewRelic → InStatus
まず、alertsと言うタブのWorkflowsをと言う項目を開きWebHookを設定しましょう！
次に、synthetics monitoringと言うタブのAlert Conditionsを設定しましょう！そしたら、確認してください
## 3. 確認
ご自身のサイトを実際に落とし、instatusのNotice→incidentsで、サイトが落ちてるか確認してみてください。

# まとめ

InStatusとNew Relicを組み合わせることで、Webサイトの監視がより効率的かつ効果的になります。問題の迅速な発見と解決、そしてユーザーへの適切な情報提供が可能になるため、信頼性の高いサービス運営に大きく貢献します。

ぜひこの組み合わせを導入して、監視体制を強化してみてください！
【chatGPT 対話備忘録】キャッシュ内容の最終状態が変わるFIFUとLRUについて

# 私：
キャッシュ内容最終状態が変わるFIFUとLRUの場合はある？
# ChatGPT:

はい、キャッシュ内容の最終状態がFIFOとLRUで異なる場合があります。これは、各アルゴリズムがページ置き換えの基準として使用するルールが異なるためです。

以下に、そのような例を示します。

条件
参照ページ列: 1, 2, 3, 4, 2, 1, 5, 6
ページフレーム数: 3
#### 1. FIFO シミュレーション
| ページ参照 | キャッシュ内容  | ページフォールト |
|------------|----------------|------------------|
| 1          | 1              | ○（フォールト） |
| 2          | 1, 2           | ○（フォールト） |
| 3          | 1, 2, 3        | ○（フォールト） |
| 4          | 2, 3, 4        | ○（フォールト） |
| 2          | 2, 3, 4        | ×（ヒット）     |
| 1          | 3, 4, 1        | ○（フォールト） |
| 5          | 4, 1, 5        | ○（フォールト） |
| 6          | 1, 5, 6        | ○（フォールト） |

最終状態
キャッシュ内容最終状態: [1, 5, 6]
#### 2. LRU シミュレーション
| ページ参照 | キャッシュ内容  | ページフォールト |
|------------|----------------|------------------|
| 1          | 1              | ○（フォールト） |
| 2          | 1, 2           | ○（フォールト） |
| 3          | 1, 2, 3        | ○（フォールト） |
| 4          | 2, 3, 4        | ○（フォールト） |
| 2          | 2, 3, 4        | ×（ヒット）     |
| 1          | 1, 3, 4        | ○（フォールト） |
| 5          | 1, 4, 5        | ○（フォールト） |
| 6          | 4, 5, 6        | ○（フォールト） |

最終状態
キャッシュ内容最終状態: [4, 5, 6]
## FIFOとLRUで最終状態が異なる理由
### FIFO:

最も古くキャッシュに入ったページを追い出します。
この例では、4 がキャッシュから追い出され、1, 5, 6 が最終的に残りました。
### LRU:

最も最近使用されていないページを追い出します。
この例では、1 がキャッシュから追い出され、4, 5, 6 が最終的に残りました。
### 結論
キャッシュ内容の最終状態が異なる場合は、ページ置き換えアルゴリズムのルール（順序 vs 使用頻度）によるものです。この違いにより、LRUは時間的局所性を考慮し、FIFOは単純な順序に基づく挙動を示します。