OmniAICreator/Qiita-1.07M huggingface dataset:
Dataverse - 承認で使っているテーブルもろもろ（メモ）

* **Approval** (`msdyn_flow_approval`)
  承認のヘッダー情報を格納するテーブル。承認の名前、リクエスター、詳細、状態などが含まれる。
  Web API リファレンス（プロパティ一覧） ([Microsoft Learn][1])

* **Flow Approval** (`msdyn_flow_flowapproval`)
  Power Automate 固有のメタデータを格納。フロー通知 URI やフロー実行シーケンス ID など、フロー実行に関連する情報が含まれる。
  テーブル／エンティティ参照 ([Microsoft Learn][2])

* **Approval Request** (`msdyn_flow_approvalrequest`)
  各承認タスク（リクエスタが指定した承認者への割り当て単位）を表す。期日、再割り当て可否、ステージ情報などが含まれる。
  テーブル／エンティティ参照 ([Microsoft Learn][3])

* **Approval Response** (`msdyn_flow_approvalresponse`)
  承認タスクに対するレスポンス（承認／拒否やコメント）を格納。応答日時やステージ結果などが含まれる。
  テーブル／エンティティ参照 ([Microsoft Learn][4])

* **Approval Process** (`approvalprocess`)
  マルチステージ承認（多段階承認）ワークフローの定義を保持するテーブル。各ステージの入力やファイル化されたステージ構成を管理。
  テーブル／エンティティ参照 ([Microsoft Learn][5])

* **Approval Stage Approval** (`approvalstageapproval`)
  マルチステージ承認（多段階承認）の各ステージごとの承認割り当て・結果を管理。ステージ内での再割り当て可否や通知設定などが含まれる。
  テーブル／エンティティ参照 ([Microsoft Learn][6])

[1]: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/reference/msdyn_flow_approval?view=dataverse-latest&utm_source=chatgpt.com "msdyn_flow_approval EntityType (Microsoft.Dynamics.CRM)"
[2]: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/reference/entities/msdyn_flow_flowapproval "Flow Approval (msdyn_flow_flowapproval) table/entity reference (Microsoft Dataverse) - Power Apps | Microsoft Learn"
[3]: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/reference/entities/msdyn_flow_approvalrequest "Approval Request (msdyn_flow_approvalrequest) table/entity reference (Microsoft Dataverse) - Power Apps | Microsoft Learn"
[4]: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/reference/entities/msdyn_flow_approvalresponse "Approval Response (msdyn_flow_approvalresponse) table/entity reference (Microsoft Dataverse) - Power Apps | Microsoft Learn"
[5]: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/reference/entities/approvalprocess "Approval Process (approvalprocess) table/entity reference (Microsoft Dataverse) - Power Apps | Microsoft Learn"
[6]: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/reference/entities/approvalstageapproval "Approval Stage Approval (approvalstageapproval) table/entity reference (Microsoft Dataverse) - Power Apps | Microsoft Learn"
たまに見る日本語のドメイン。Punycode（ピュニコード）ってなに？

# たまに見る日本語のドメイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/96a95fe5-a695-4da1-bc2c-10452a21ecb3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/9a3ba55e-031b-4278-b2fd-87fbefc5a0eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/d8df4182-d2ee-4855-98a6-04bb48233966.png)

[https://日本語.jp/](https://xn--wgv71a119e.jp/case/accessible/company.html)
[https://あなたの知らないドメインの.世界/](https://xn--l8je4fxbbxc7s3i7myivhl858f.xn--rhqv96g/)


なにこれ。ドメインは『google.com』など英字しか使用できないはずでは……？
これは**Punycode（ピュニコード）** と呼ばれる変換方法で実現されています。

# イラストにしてみました。

本来は英字と数字、-しか利用できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/f9e72874-50df-467f-83c5-0b93c0c28d72.png)

しかしここで諦めずに考えました。
ブラウザ上では日本語などで表示し、サーバに名前解決する際に英字だけに変換するようなデコード方式を開発すれば見かけ上は実現可能なのではないか？と…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/423d09f9-0392-4e2b-9a5f-b50331cba476.png)

そして遂に完成しました。
ドメインの入力は日本語で行います。
そしてエンターを押して『熟年.jp』にアクセスしようとした瞬間、ブラウザは『熟年』という文字列をドメインで認識できる文字列だけで構成された英字『xn--hwtp04b.jp』に変換して名前解決の送信します。
**xn--** 以降が変換された文字です。『あ→a』のような対応表がある訳ではなく、この英字に意味はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/28e0c075-63a9-4e8b-9e47-1aea023bb3c9.png)

サーバは命名ルールに則ったドメインへのアクセスリクエストのため、対応せざるを得ません。
ブラウザがページの情報を受け取ると、このドメイン名をピュニコードの変換ルールに則り『熟年.jp』に表示を戻して表示します。
お爺さんには、ずっと『熟年.jp』でアクセスしているように見える訳です。
そんなドメイン存在しないのに。本当の姿は『xn--hwtp04b.jp』なのに……
『熟年.jp』はお爺さんだけがブラウザに見せられている幻のドメインなのに……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/572ac3f5-a66f-442f-ad7c-da72ad9c7b1a.png)



因みに『熟年.jp』は存在します。動作が気になる人は確認してみてね。（責任は負いかねます）
URLをコピーし、どこかに張り付けて見てください。
確かに『熟年.jp』という文字をコピーしたはずなのに、『hxxps://xn--hwtp04b[.]jp/』になっているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/05f6b4f3-5f34-4c9a-8e6d-23dabcccda76.png)

# 余談
ここで記号や特殊文字をASCIIコードの英字のみに変換することができます。
この変換こそがピュニコードであり、ブラウザはこの変換を内部で行いアクセスしているのですね。
https://www.punycoder.com/

そしてなんとピュニコードを利用すれば絵文字でもドメイン取得可能らしい
https://qiita.com/tappie/items/89ba75e2613c49720348
限られたメンバー向けのLINE Botを作るときはLINEグループを利用するといいのでは？

# はじめに
LINE Botを開発する際、特定のメンバーのみにサービスを提供したい場合があります。
そのような場合、LINEグループを活用することで、アクセス制限を簡単に実装することができます。
この記事では、Google Apps Scriptを使用して、特定のLINEグループからのメッセージにのみ反応するBotの実装方法を紹介します。

# 実装の概要

仕組みとしては単純で、Webhookで呼び出された時に特定のLINEグループのみに反応するようにするだけです。
グループIDが必要なのでまずグループID確認用の実装を行い、その後で取得したグループIDを利用してbotを実装します。

## 1. グループIDを取得するBot
まず、グループIDを取得するためのBotを実装します。以下のコードは、グループ内で「グループID」というメッセージを受け取ったときに、そのグループのIDを返信する実装です：

```js
// LINE Messaging APIの設定
const CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN';
function doPost(e) {
  const events = JSON.parse(e.postData.contents).events;
  
  events.forEach(event => {
    if (event.type === 'message' && event.message.type === 'text') {
      if (event.message.text === 'グループID') {
        const groupId = event.source.groupId;
        replyMessage(event.replyToken, `このグループのIDは: ${groupId} です。\nこのIDを使用して、このグループからのメッセージにのみ反応するように設定します。`);
      }
    }
  });
  
  return ContentService.createTextOutput(JSON.stringify({ 'status': 'success' }))
    .setMimeType(ContentService.MimeType.JSON);
}
```

このスクリプトをGASにデプロイしたうえでWebhookに設定し、公式アカウントを含むグループで"グループID"と発話するとグループIDを返信してくれます。

## 2. グループからのメッセージにのみ反応するBot
取得したグループIDを使用して、特定のグループからのメッセージにのみ反応するBotを実装します。
以下のコードは、指定されたグループからのメッセージをそのグループへ鸚鵡返しする実装例です

```js
// LINE Messaging APIの設定
const CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN';
// 許可されたグループID
const ALLOWED_GROUP_ID = 'YOUR_GROUP_ID';
function doPost(e) {
  const events = JSON.parse(e.postData.contents).events;
  
  events.forEach(event => {
    if (event.type === 'message' && event.message.type === 'text') {
      // グループからのメッセージかチェック
      if (event.source.type === 'group' && event.source.groupId === ALLOWED_GROUP_ID) {
        // メッセージを鸚鵡返し
        const messageText = event.message.text;
        replyMessage(event.replyToken, messageText);
      }
    }
  });
  
  return ContentService.createTextOutput(JSON.stringify({ 'status': 'success' }))
    .setMimeType(ContentService.MimeType.JSON);
}
```

## 設定手順
LINE Developersコンソールで以下の設定を行います：
チャネルアクセストークンを取得
公式アカウントがグループに参加するのを許可しておく
Webhook URLを設定（Google Apps ScriptのデプロイURL）
Google Apps Scriptで以下の設定を行います：
スクリプトをデプロイし、Webアプリケーションとして公開
アクセス権限を「全員（匿名を含む）」に設定

## 使用方法
LINEグループにBotを招待
グループ内で「グループID」とメッセージを送信してIDを取得
取得したIDをALLOWED_GROUP_IDに設定

## メリット
アクセス制限が簡単: グループIDによる制限で、特定のグループのメンバーのみがBotを利用できます。
管理が容易: グループのメンバー管理はLINEの機能を使用できるため、独自のユーザー管理システムを実装する必要がありません。

## 注意点
グループID等は公開しないように注意してください。
グループのメンバーがBotの利用を希望する場合は、Botをグループに招待する必要があります。

## まとめ
たまたま便利そうなLINE Botの話題を目にしたのですが、「これっておそらく自分だけとか仲間内だけで使うBotなんだろうけど、公式アカウントに知らない人が登録されちゃったらその人にも使えてしまうのではないか？」と不安になったのでどうすればいいか考えてみました。
javascriptのthisに今更ハマったので、thisとbindとclassの歴史に思いを馳せる

# はじめに
さっき久しぶりにthisを失う事故に遭いました。
そもそもメンバ関数を直接他所に渡す、という事をあまりする機会がないので、そこでthisが失われる経験を定期的にやりつつも、しばらく経つとすぐに原因を忘れています。

しかしいい加減、なんでそれがダメなのかを覚えないと同じミスをするなと思い、最近のぼくの話相手であるChatGPTに色々と聞いてみました。
なので今回の記事はほぼノーソース（ChatGPTに聞いただけ）という事を前置きしておきます。

# thisを失うとは
javascriptはその言語仕様上、[『基本的に』thisはその関数がドット演算子で結ばれた呼び出し元のオブジェクトを指します。](https://qiita.com/takkyun/items/c6e2f2cf25327299cf03)
なので、ドット演算子を失った（つまり関数だけが別の場所に委譲された）場合、thisはundefined（strictモードでなければグローバルスコープ）になり、委譲された関数がthisを参照しようとすると参照先がない、となります。

# なぜこんな仕様なのか
そもそも歴史的にclassやbindという概念がjavascript登場時になく、しかしthisは当初から存在していた事が原因、といえば原因です。
実際にこの仕様を策定した背景まで調べられていませんが「その関数を特に作り替えることなく、文脈を切り替えて関数を使いまわせたら便利だな」という思いは想像しやすいです。きっと当時もそういう思いでthisという機能は実装されたのだと思います。（thisの抱えている意味合いがほとんどparentだろ、というツッコミは置いておきつつ）
なので「何故こんな仕様にしたのか」に対しては「当時の仕様がここから始まったから」という煙に巻いたような回答が正しいと思います。

# 仕様の変遷
いまにして思えばどうしてこうなったという仕様に感じますが、当時はこの仕様で特に問題はなかったはずです。何故なら、仕様の適用条件は『基本的に』ではなく、『必ず』だったからです。
この『基本的に』という前置きが必要になるのは、bind（ECMAScript 5 2009年）やアロー関数（ECMAScript 6 2015年）が登場したからです。
補足しておくと、bindはnewFunc = bind(func, obj)と書くと、newFuncを呼ぶ限り、func内のthisが必ずobjになるというもので、アロー関数はfunction() {return () => {}}と書くと内側のアロー関数は『必ず』functionのthisを保持し続ける（thisの更新が行われない）というものです。
では何故、これらが生まれる事になったのか？
詳細な歴史は調べていませんが、class実装前にはbindで疑似的なclass実装の記事が流行っていた事や、アロー関数と同時にclassが実装された事を踏まえると、長い間class機能が求められていたのだろうというのは当時の雰囲気から感じます。
趣味でコーディングしてるだけの自分ですら昔はjsってclass機能ないのかよって思ってました。

# 後付けの機能の方が重宝される不幸
自分はたぶん2015年頃くらいに初めてjavascriptを触ったのですが、当時はclassが（ギリギリなかったか、実装直後で資料を見つけられ）なかったので、thisを触る機会がほぼありませんでした。
bindでclassっぽいものが作れる、という記事はいくつか見たのですが、初学者に「昔ながらのthis仕様」と「例外が加わったthis仕様」を理解するのは難しく、またbindという考え方自体C++でクラスを初めてさわったぼくにとっては理解しがたいものでした。（そもそも当時javascriptを触っていたのは、単にhtmlのちょっとした加工が目的だったので、そこまで深くjsの仕様に立ち入る必要がなかった）

時は流れ、久しぶりにjavascriptを触ってみたらclassが追加されていびっくりしつつ、thisが普通のclassと同じ感じに使えることに感動しました。
classを使えるようになってからはjavascriptをローカルで走らせることも多くなりました。
そしてbindという昔ながらの（疑似）classの作り方があったことも忘れ、なぜそんな技術が必要だったのか、という事を考える機会もないまま今日をむかえました。

この思考停止なclass使用が結果として冒頭の不幸を招くこととなりました。

# classに先立ってbindが実装された理由
これは思うにclassより安価に実装（大筋は既にあるcallやapplyをwrapするような関数をつくれば）できて、bindを使うことでclassらしい振る舞いを（ちょっと手間をかければ）できる事が理由だと思います。
bindで作られた疑似classの情報を基に正規版classとして求められる要件を洗い出しつつ・・みたいな流れがあったのかなと勝手に想像しています。
bind時点ではあくまでcallやapplyの延長のため、この時点で疑似classを扱っていた人たちにとってこの思想を読み解くことはそこまで難しくなかったと思います。


# おわりに
とりとめのない記事になりましたが、こうして書いてみると今の不愉快な仕様に対して寛容になれる気持ちと、クソがという相反する気持ちがそこそこでてきます。
javascriptは関数が第一市民の言語で、登場当初はオブジェクト指向的なクラス構文は存在しませんでした。
関数を柔軟に扱えることを重視した仕様だったため、同じ関数を別のコンテキストで再利用するためのthis設計には、ある種の“緩さ”があったとも言えます。
それが「クラス」や「スコープ」が求められる時代に突入し、必要な継ぎ足しとして bind や class が導入された。
求めに応じて継ぎ足し継ぎ足しした故に、不整合・不条理が残る形になったという背景を正しく知ることで、今のエラーと向き合えるようにしたいと思いました。


# 補足
thisがスコープを失う理由は先に書いた通りなので、例えばアロー関数を使えばthisを失わないメンバ関数を定義できます。
```己を失わない.js
class A {
  get methodA() {
    return () => {
      // ここに書かれたthisは必ず、Aインスタンス
      // ただしこの書き方だと毎度関数インスタンスを生成することになる
    };
  }
  // インスタンスの再生成が気に食わなければキャッシュを使えばOK
  #methodB;
  get methodB() {
    if(this.#methodB === undefined) {
      this.#methodB = () => {
      };
    }
    return this.#methodB;
  }
}
```
stringの書式(フォーマット)を設定する


# はじめに
みなさんこんにちは、成田です。
本記事では```string```の書式について解説していきます。

```ToString```や埋め込み式などの書式を紹介するので、良かったら見ていってください。

# 埋め込み文字列(文字列補間)

### 基本の使い方

文字列の先頭に```$```を付けることによって、文字列の中に変数を埋め込むことができます。
```cs
int a = 20;
string s1 = "s1敵の体力" + a;
string s2 = $"s2敵の体力{a}";
Console.WriteLine(s1);
Console.WriteLine(s2);
```
実行すると
```cs
s1敵の体力20
s2敵の体力20
```
このように```string s1```のように、文字列連結(足し算)しなくとも、```string s2```のように```""```の前に```$```を付けることによって文字列と```{}```で囲った変数を連結することができます。
これをマイクロソフトでは **文字列補間** とよばれるようです。
わたしは、**埋め込み式文字列** とよんでいます。伝われば何でもいいと思っています。(正式名称を知っておくことは大事ですが、、、)

### 書式の設定
```7月1日```を```07/01```のように表示したいときは

```css
int month = 7;
int day = 1;

Console.WriteLine($"誕生日は {month:00}/{day:00}");
```
上記のように```{ 変数 : 書式(フォーマット) }```のように書くことで書式が指定できます。
実行すると
```css
誕生日は 07/01
```
のように0埋めができます。
```ToString```を使わなくていいのは楽ですね。
# ToString()
次に紹介するのは```ToString```メソッドです。
```int``` や ```float``` などを ```string``` に変換するときによく使うと思います。
### 基本の使い方
```cs
string s = (10.000).ToString();
Console.WriteLine("s => " + s);
```
実行すると
```cs
s => 10
```
```string``` と ```int``` は + はできませんが、```ToString``` で ```string``` に変換することで可能となります。
これは基本的な使い方ですね。
### 書式の設定

```ToString``` には書式を設定することもできます。

```cs
string s1 = (10.000).ToString("F1");
string s2 = (10.000).ToString("000.00");
Console.WriteLine("s1 => " + s1);
Console.WriteLine("s2 => " + s2);
```
実行すると
```cs
s1 => 10.0
s2 => 010.00
```
のように、 ```ToString``` の引数にこのように書くことで書式が設定できます。
```F0``` は整数部分のみ、```Fn``` 小数点第n位まで表示する、ってことですね。
```000.00```は```0```を入力しているところを0で埋める、ということができます。

このように ```ToString``` で書式を設定できます。

```ToString```にはほかにも様々な書式が存在するので調べてみると面白いと思います。

この方の記事に```Tostring```の書式が紹介されているのでリンクを貼っておきます。

https://qiita.com/No2DGameNoLife/items/ec26cf9f90c3b63332f2

# string.Format()
```string```のメソッドの中に書式を設定するメソッドがあります。

今回紹介する書式設定の中では多分あまり使うことはないと思います。
少なくとも周りで使っている人は見ないです。

例えば、割合表示や時間表示などの、2個以上の変数の値を扱う時に使います。

HPの表示を ```HP = 現在のHP / 最大HP```のようにしたいとき
```cs
int maxHP = 100;
int hp = 20;
string hpFormat = string.Format("HP => {0}/{1}", hp, maxHP);
Console.WriteLine(hpFormat);
```
実行結果
```css
HP => 20/100
```
のようにできます。

今回は第一引数に書式、第二、第三引数は値です。
値の要素番号を指定することで書式に埋め込むことができます。

第二引数が```要素番号0```、第三引数が```要素番号1```となり
```HP => {0}/{1}```なので```HP => {hp}/{maxHP}```のようになります。

```string.Format```は他にもオーバーロードがありますが、基本は同じような使い方でできるはずです。

# さいごに

書式はUnityでゲームを作る際にUIでよく使うことになると思います。
下の画像は実際に使っている例です。
赤枠で囲っている部分ですね。
![Qiitause.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4098591/28c0c317-6c55-434d-9a75-c111493c2fe0.png)

最初はよくわからないと思うのでこの記事などを参考にしてもらえると嬉しいです。

今回紹介した書式の方法以外にも書式の設定はできるかもしれません。
抜けがある場合は教えてもらえると嬉しいです。
Claudeで爆速！AWS構成図を自動生成する「AWS Diagram MCP Server」の使い方

![スクリーンショット 2025-05-28 0.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433961/f59c9807-aa69-487d-9f4f-f292ce4874dc.png)


AWSのMCPが出たそうなので利用してみたいと思います。

様々な種類のMCPがあるそうなのですが、今回はAWS関連のダイアグラムを生成する`AWS Diagram MCP Server`を利用してみたいと思います。

# 環境
- Claude For Mac：0.9.3

# AWS Diagram MCP Server
https://github.com/awslabs/mcp/blob/main/src/aws-diagram-mcp-server/README.md

> This MCP server that seamlessly creates diagrams using the Python diagrams package DSL. This server allows you to generate AWS diagrams, sequence diagrams, flow diagrams, and class diagrams using Python code.

日本語訳してもらうと、「このMCPサーバーは、Python の diagrams パッケージの DSL（ドメイン固有言語）を使用して、シームレスに図を作成します。このサーバーを利用することで、AWS 図、シーケンス図、フローチャート、クラス図を Python コードで生成することができます。」

つまり、生成AIが出力した結果をもとに綺麗なAWSの図を作成してくれる機能を持ちます。

# 手順

## 事前準備
`Prerequisites`に実行に必要なものが3つ記載されていたので、あらかじめインストールします。

### 1. Install uv from Astral or the GitHub README
様々なインストール方法が記載されていますが、homebrewでインストールしました。

uvについては公式を参照してください。
https://docs.astral.sh/uv/
```zsh:terminal
brew install uv
```
### 2. Install Python using uv python install 3.10
これは記載されたまま、uvを利用してpythonをインストールします。
```zsh:terminal
uv python install 3.10
```

### 3. Install GraphViz https://www.graphviz.org/
こちらもbrew経由でinstallしました。
```zsh:terminal
brew install graphviz
```

## ClaudeにMCPを設定
`claude_desktop_config.json`に以下の設定を追加します。
```json:claude_desktop_config.json
{
  "mcpServers": {
    "awslabs.aws-diagram-mcp-server": {
      "command": "uvx",
      "args": ["awslabs.aws-diagram-mcp-server"],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "autoApprove": [],
      "disabled": false
    }
  }
}
```

保存が完了したら、Claudeを再起動します。
メニューが追加されていたら設定完了です。

![スクリーンショット 2025-05-27 23.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433961/586d62ef-6d1d-4e40-8dcf-ee0c308a1f29.png)


## ダイアログを生成してみる

Claudeにこんなプロンプトを投げてみました。
MCPを使ったときと使わなかったときで比較してみたいと思います。
```
AWSのECSにAPIを載せている。ユーザーへの連絡を、メール・アプリ・チャットで同時に送信したい。いいアーキテクチャ図を書いて。
```

### MCPを使わなかったとき

思ったより綺麗な図がSVG形式で出力されましたが、AWS公式のアイコンはなく、それぞれ何を指すのかパッと見では分かりづらい状態となっています。

![スクリーンショット 2025-05-27 23.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433961/db6c645c-ac96-498f-bdc9-e88261a01001.png)


### MCPを使ったとき

生成すると「このパスに生成したよ」と教えてくれるので、ファイルを探しに行きます。
![スクリーンショット 2025-05-27 23.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433961/43515908-a80e-438b-a3cb-904aa81586d0.png)

図を見るとこの通りです。

![スクリーンショット 2025-05-27 23.59.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2433961/c9e988a1-89bf-44ea-87df-dce19930bf17.png)


（生成AIの結果によって図に載るサービスが異なるのは前提として、）アイコンを生成してから図を生成してくれます。検討段階の図では十分ではないでしょうか。

# さいごに

今回はAWSのアーキテクチャ図の生成のMCPを利用しました。十分便利ですが、生成AIを使う想定としてはアイディア出しにも利用したいです。[AWS CDK MCP Server](https://github.com/awslabs/mcp/blob/main/src/cdk-mcp-server/README.md)などの他のMCPを使えば、よりサービスについて専門的な答えを返してくれそうです。今までの当たり障りのない回答ではなく、ベストプラクティスに基づいて回答くれるのではないかと期待できます。
Claude Code + wslでAPIがタイムアウトになるのを治す

# ![スクリーンショット 2025-05-28 000134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58150/035a6b8d-10ce-4b76-8e41-8163b19a745a.png)

# 解決策

1. ipv6を無効にする

sysctlで無効化
/etc/sysctl.conf の末尾に以下を追記

net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1

2. 設定を反映

sudo sysctl -p

3. ipv6無効化を確かめる

ip a

出力結果に「inet6」の行（IPv6アドレス）が表示されていなければ、IPv6は無効化されています
【初心者】gitコマンド

# gitコマンドの基本まとめ

::: note info
作業前に別のブランチに切り替える！
:::

ブランチの一覧表示と現在のブランチの確認
```py
git branch
```


ブランチを新規作成（コードを書きかえる前に）
```py
git branch <ブランチ名>
```

指定したブランチを削除
```py
git branch -d <ブランチ名>
```

現在チェックアウトしているブランチ名を<新しいブランチ名>に変更する。
```py
git branch -m <新しいブランチ名>
```

ブランチの切り替え
```py
git checkout <ブランチ名>
```

新しいブランチを作ってそのブランチへ切り替え
```py
git checkout -b <新しいブランチ名>
```

現在の変更をステージングする
```py
git add .
```

コミット
```py
git commit -m “first commit”
```

リモートにプッシュする
```py
git push -u origin <作業ブランチ名>
```


<details><summary>GitHubでプルリクエスト作成、マージする</summary>

- "Compare & pull request" 押下
![スクリーンショット 2025-05-24 18.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/291362a0-2d03-4d63-ab8a-8b115af43731.png)

- リクエストの説明を記入して"Create pull request" 押下
![スクリーンショット 2025-05-24 18.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/df55c456-8ad8-4288-aefc-a3ad43e8baf3.png)

- ここで内容を書き込んでもよい。LGTM！などマージ承認のコメントが返ってきたら、マージする。"Marge pull request" 押下。マージする人＝プルリクエストした人
![スクリーンショット 2025-05-24 18.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/b4675c42-dc84-46ce-9049-03c283f162f2.png)

- "Confirm Marge" （マージを確認）押下
![スクリーンショット 2025-05-24 18.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/00fe75ad-ca3f-4bc5-a215-e07bb575804c.png)

- "Delete branch"でGitHub上のブランチを削除
![スクリーンショット 2025-05-24 18.28.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/34882dd0-125b-4490-9c56-c4020c6223f5.png)

- mainに戻っている
![スクリーンショット 2025-05-24 18.28.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/9f4eb735-2438-45e2-8b1e-08031731385d.png)

- プルリクエストの記録を確認できる
![スクリーンショット 2025-05-24 18.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/ebec5793-43dc-44d2-80a7-7ba0cf96afb6.png)

- プルリクエストをクローズしても記録は残る
![スクリーンショット 2025-05-24 18.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/ffc17558-885f-446d-987a-098ce1aa463a.png)

</details>


ローカルでmainブランチに切り替える
```py
git checkout main
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/9b3c3cb7-b501-46c6-aa24-ace0c4e1dd97.png)


GitHubの変更分をプルする
```py
git pull origin main
```


# 作業ブランチを最新状態にして再度利用する
例：再度fix_designを使う

```py
# ブランチの切り替え
git checkout <作業ブランチ名>

# （ローカルのmainブランチが最新でない場合）プルして最新状態にする
git pull origin main

# ローカルで作業ブランチにmainブランチをマージする
git merge main
```

# pushしたら、プルリクが作成されなかった
たまに起こるようです。
GitHub画面で Branches > pushしたブランチ名の行にある「…」メニュー > New Pull Request 
こちらでプルリクエストを作成できました。（手探りで解決したので適切でない部分があるかもしれません。）
【合格体験記】私立文系卒SEが2年目の4月で応用情報技術者試験に1発合格した話

はじめまして、ずっとQiita書きたいと思っていたんですが時間取れたので書きます。

# 対策前筆者の状況
私立文系大学出身。
専攻は歴史文化のド文系だが、就活のため大学3年で基本情報技術者は取得済。
WEBエンジニアのためプログラミング、データベース、システム設計は得意。
半面、業務で使用しないネットワーク、ストラテジ、マネジメント系、監査は苦手。
ちなみにセキュリティ分野も苦手（致命傷！）

# 午前対策
だいたい3か月前くらいから勉強開始。
基本情報を受けたときと同じように、キタミ式の参考書を購入。

###### キタミ式イラストIT塾 応用情報技術者
 
https://gihyo.jp/book/2022/978-4-297-13188-3

イラストとマンガで説明してくれるので頭に入ってきやすい。
ただ、基本情報版とそこまで内容に違いはないので、
基本情報版を持っている人はわざわざ買うほどではないかも…？

あとは基本情報を受けたときと同じように午前問題をひたすら解いていく。
みんな大好き過去問道場。

https://www.ap-siken.com/apkakomon.php

過去問道場を解くときに大事なのは、解いた問題を3つに分類すること。

1. 問われていることが理解できるし、自信をもって解ける
2. 問われていることは何となく理解でき、答えも推測できるけど、完全には理解できてない
3. 問われていることが理解できない。そもそも問題文が意味不明

問題を回す過程で時間をかけるべきなのは2。
間違えたらしっかり解説を読んで、**人に説明できるレベルまでインプット・アウトプットを反復**する。
脳内のその情報に触れる頻度を増やすのが大事（エビングハウスの忘却曲線）

https://smbiz.asahi.com/article/14828411

過去問道場の強みは**回転率**だと思っているので、3でいちいち解説を読み込むのは時間がもったいない。
全く知らない知識を勉強するのは脳味噌に負荷がかかるので、3はブクマするなり解説をスクショするなりで飛ばす。（モチベがあったら参考書なりネットで基礎知識を調べる）

**「分からない」を「聞いたことがある」にするのではなく、「分かりそう」を「分かった」にする方が大事。**

（※とはいえ6割正答しないといけないので、3の"よく分からん領域"が4割以上あるのはアウトです。基礎学習も必要）


# 午後対策
午前問題を回すのに夢中になって中々手を付けられないのが午後問題。
実は筆者も1か月前に慌てて参考書を購入。

![91cEWh2FJnL._UF1000,1000_QL80_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4095720/e25c6325-25f3-4b68-8fd0-fbf487d3f7dd.jpeg)


https://www.itec.co.jp/store/products/detail.php?product_id=3873&srsltid=AfmBOopT0mejA3hFvuoOyWalyugA8d-6YIKyaeR2NrGIIBo8vD7RSWMb

解いていく中で絶望したのがセキュリティ。（必須選択）
セキュリティ分野はネットワークの知識も絡んでいるが、筆者はどちらも苦手なので3割も取れず危機感を覚える。

とりあえず会社の昼休みや業後を利用し、参考書の問題は解答＆解説を読み込む。
試験対策の定石として、**過去問を解くときは必ずといっていいほど時間を計る**のが重要だが、
まとまった時間が取りずらかったので、**隙間時間に大問の設問をちょこちょこと解いていくスタイル**を選択。背に腹は代えられない。

業務に近いアルゴリズムやアーキテクチャが好きなので、選択する大問はセキュリティ・プログラミング・データベース・組込システム・システム設計で決め打ち。
全然文系っぽくないので、技術分野苦手な方はストラテジ、マネジメント系、監査を選ぶといいと思います。。

セキュリティの問題を解いていく中で知識がついていき、**午前のセキュリティ・ネットワークの問題も正答率が上がっていったので、もっと早く午後の対策を始めればよかった**。

あとは家だとモチベーションが湧かないので、自分が強制的に机に向かう環境を整えるのが一番大事。
カフェとか、図書館とか、大学・会社とか、コワーキングスペースとか…
（コストはかかるけど、資格取得によるメリットを考えて投資に回したい）

# 試験準備
試験の予約
当日周辺のスケジュールのブロック（一週間前は勉強に当てたい）
郵送された受験票・会場の確認
証明写真
鉛筆・消しゴム・鉛筆削りの用意（シャーペンだとマークシート塗りずらい）
ラムネの用意（脳味噌が疲弊するのですぐに当分補給できるブドウ糖）

などなど意外とやること多い…


# 結果

![スクリーンショット 2025-05-27 232541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4095720/74fb2fc0-3975-41c0-9681-64b2611f2e41.png)

![スクリーンショット 2025-05-27 234538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4095720/c13b5899-72ac-4d9d-8794-6ca21aa62d12.png)


合格。

過去問道場を戦略的・効率的に回しまくったので午前はまあまあ高め。
午後のセキュリティが最後まで克服できなかったのと、**プログラミングで最初の方間違えて以降の問題すべてバツだった**のがギリギリの原因。
（プログラミングは時間食うしリスキーなので仮に次受けるとしても選ばないと思う）


時間足りなかったせいで見直しできなかったのも痛かった。
やっぱり**過去問を時間計って解く訓練**はした方がよさそう。


# 余談
ちなみにこの半年後にデータベーススペシャリストも合格したのでそちらの記事も書きます。
IPAの試験は難しいけど、業務のためになることが多いので頑張ってください！みなさんの合格を願ってます。
それではまた。
X→Z←Y における独立性の性質を数式で証明する

因果推論の合流経路の基本性質の証明をします。

合流経路[^1]とは次のような状態を示します：

```math
X \rightarrow Z \leftarrow Y
```

このとき、次の内容[^1]が成立します:

```math
\begin{align}
X \perp Y \\
X \not\perp Y | Z \\
\end{align}
```

[^1]に記載はないですが、本記事では合流経路の同時確率は $P(X, Y, Z) = P(Z|X, Y) P(X) P(Y)$ で与えられると仮定します。

# 1) XとYが独立であることの証明

独立性の定義より、$P(X)P(Y) = P(X,Y)$ が成立することを示します。

まず、$P(X, Y)$ を計算します。
```math
\begin{align}
P(X, Y) &= \sum_Z P(X, Y, Z) \\
\end{align}
```
合流経路の仮定から、$P(X, Y, Z) = P(Z|X, Y) P(X) P(Y)$ なので、これを代入します。
```math
\begin{align}
P(X, Y) &= \sum_Z P(Z|X, Y) P(X) P(Y) \\
&= P(X) P(Y) \sum_Z P(Z|X, Y) \\
\end{align}
```
ここで、特定の $X, Y$ が与えられたときの $Z$ の全確率が1であるため、$\sum_Z P(Z|X, Y) = 1$ が成立します 。
したがって、
```math
\begin{align}
P(X, Y) &= P(X) P(Y) \\
\end{align}
```
これは $X$ と $Y$ が独立であることの定義そのものです。

よって $X \perp Y$。

# 2) XとYはZが与えられた時の条件付き独立でないことの証明

条件付き独立の定義より、$P(X,Y|Z) \neq P(X|Z)P(Y|Z)$ が一般的に成立することを示します。

まず、$P(X,Y|Z)$ を計算します。
```math
\begin{align}
P(X,Y|Z) &= \frac{P(X,Y,Z)}{P(Z)} \\
\end{align}
```
合流経路の仮定から、$P(X,Y,Z) = P(Z|X, Y) P(X) P(Y)$ なので、これを代入します。
```math
\begin{align}
P(X,Y|Z) &= \frac{P(Z|X, Y) P(X) P(Y)}{P(Z)} \\
\end{align}
```

次に、$P(X|Z)$ と $P(Y|Z)$ をそれぞれ計算します。
$P(X|Z) = \frac{P(X, Z)}{P(Z)} = \frac{\sum_Y P(X, Y, Z)}{P(Z)} = \frac{\sum_Y P(Z|X, Y) P(X) P(Y)}{P(Z)}$
$P(Y|Z) = \frac{P(Y, Z)}{P(Z)} = \frac{\sum_X P(X, Y, Z)}{P(Z)} = \frac{\sum_X P(Z|X, Y) P(X) P(Y)}{P(Z)}$

$X$ と $Y$ が $Z$ を条件として条件付き独立であるためには、$P(X,Y|Z) = P(X|Z)P(Y|Z)$ が成り立つ必要があります。
すなわち、以下の等式が一般的に成立しないことを示します。
$$\frac{P(Z|X, Y) P(X) P(Y)}{P(Z)} = \left( \frac{\sum_Y P(Z|X, Y) P(X) P(Y)}{P(Z)} \right) \left( \frac{\sum_X P(Z|X, Y) P(X) P(Y)}{P(Z)} \right)$$

この等式が一般には成立しないことを示すために、具体的な反例を挙げます。

**反例:**
$Z$ が $X$ と $Y$ の和である場合（$Z=X+Y$）を考えます。
$X \in \{0, 1\}, Y \in \{0, 1\}$ で独立。
* $P(X=0)=0.5, P(X=1)=0.5$
* $P(Y=0)=0.5, P(Y=1)=0.5$

このとき、$Z \in \{0, 1, 2\}$ となります。
* $Z=0$ の場合: $X=0, Y=0$ のみ。$P(Z=0) = P(X=0)P(Y=0) = 0.5 \times 0.5 = 0.25$
* $Z=1$ の場合: $(X=0, Y=1)$ または $(X=1, Y=0)$。$P(Z=1) = P(X=0)P(Y=1) + P(X=1)P(Y=0) = 0.25 + 0.25 = 0.5$
* $Z=2$ の場合: $X=1, Y=1$ のみ。$P(Z=2) = P(X=1)P(Y=1) = 0.5 \times 0.5 = 0.25$

**$Z=1$ の場合に $X$ と $Y$ が条件付き独立でないことを示す：**
$P(X=1, Y=1|Z=1)$ を計算します。
$X=1$ かつ $Y=1$ で $Z=1$ となる組み合わせは存在しないため、$P(X=1, Y=1|Z=1) = 0$。

$P(X=1|Z=1)$ を計算します。
$P(X=1|Z=1) = \frac{P(X=1, Z=1)}{P(Z=1)}$
$P(X=1, Z=1) = P(X=1, Y=0) = P(X=1)P(Y=0)$
$= 0.5 \times 0.5 = 0.25$
したがって、$P(X=1|Z=1) = \frac{0.25}{0.5} = 0.5$。

$P(Y=1|Z=1)$ を計算します。
$P(Y=1|Z=1) = \frac{P(Y=1, Z=1)}{P(Z=1)}$
$P(Y=1, Z=1) = P(X=0, Y=1) = P(X=0)P(Y=1)$ （なぜなら $X=0, Y=1$ のとき $Z=1$ となるため）
$= 0.5 \times 0.5 = 0.25$
したがって、$P(Y=1|Z=1) = \frac{0.25}{0.5} = 0.5$。

$P(X=1|Z=1)P(Y=1|Z=1) = (0.5)(0.5) = 0.25$

$P(X=1, Y=1|Z=1) = 0$ であり、$P(X=1|Z=1)P(Y=1|Z=1) = 0.25$ です。
$0 \neq 0.25$ であるため、$P(X, Y|Z=1) \neq P(X|Z=1)P(Y|Z=1)$ です。

よって $X \not\perp Y|Z$。

# 最後に

本記事があなたの役に立てば幸いです。

[^1]: 因果推論　基礎から機械学習・時系列解析・因果探索を用いた意思決定のアプローチ　金本拓 pp.43
Kling AIでオリジナル絵文字にアニメーションをつけてみた

## 4o Image Generationで作成した絵文字を動かしたい
https://qiita.com/0suzuki/items/61f02fa98075ceb729ef

↑で、4o Image Generationを使用して、オリジナルの絵文字を作成しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/2c9b64b1-2754-486e-a94d-0fc47caa35c9.png" width="25%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/2e1b55e1-e041-4045-9897-5d2f885add0d.png" width="25%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/c0ae24ca-7875-4963-9745-bc97ac51468d.png" width="25%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/25a7f207-a063-4b73-b066-e800a66a2e4d.png" width="25%">

今回はこの絵文字にアニメーションを付与し、オリジナルの動く絵文字を作成してみます。

## Kling AIとは？
https://app.klingai.com/global/

Kling AI（クリングAI）は、中国の大手IT企業「快手（Kuaishou）」が開発した、テキストや画像から高品質な動画を自動生成できる最先端のAI動画生成ツールです
無料プランでも、一日数回の動画生成が可能なため、無料プランで実験していきます。

## 画像をもとに動画を生成する
`Video Generation>Image to Video`から元の絵文字を`End`に設定し、下にPromptを入力します。（Kling AIは英語推奨のため、英語でのプロンプト入力）
```markdown
- Lion strikes a good pose
- Letters come down from above and bounce.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/ef57981d-96b8-43e3-b0d2-2acf52741eee.png)

Generateを押下すると、動画の生成が開始します。
![ライオン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/9ad6746b-b8ce-490e-8709-b7a90c942097.gif)
10分ほどで動画が完成しました。
ChatGPTで作成したオリジナルのキャラクターが動きました！

## 同様に各絵文字を動かしてみる
```markdown
- Rabbit makes a piece
- Letters fall one by one.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/17241483-b7fa-4434-a1da-641ad34cce26.png)
![ウサギ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/299448f5-1b0e-4d94-9b48-37a57c76c81d.gif)
プロンプトが悪かったのか、無の時間が長いです（笑）
次は、上の文字は固定で表示し、キャラクターだけ動いといてもらいましょう。
```markdown
- The cat is happy in a banzai pose.
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/280baa91-2182-40dd-aecb-7ccdb8d95595.png)
![ネコ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/05b8add1-1f5b-4e8c-8001-17819d4a41ac.gif)
```markdown
Panda's tears won't stop.
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/dec1d487-b54a-473d-b56f-f0f7a6da8347.png)
![パンダ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4079931/2bd64aea-0483-4cf6-a3c7-6c81f5d4a974.gif)

## mp4からgifへの変換に使用したサービス
https://www.adobe.com/jp/express/feature/video/convert/mp4-to-gif

↑簡単にgif形式に変換でき、動画の切り抜きもできます！

## まとめ
無料プランでも簡単にそれなりの動画が生成できました。
画像をもとに動画を生成できるので、いろいろ遊べそうです。
X86 アセンブラを使わず、16進数だけで書いたブートローダを実機で動かす

## 目的
NASM等のアセンブラを使わず直接機械語でプログラムを書き、動かすことで機械語を深く理解することが目的です。
WINDOWSやLinuxのプログラムだとバイナリにした時に、機械語以外の情報も書き込まれ、煩雑になるため避けました。

## 方法

そうは行っても直接16進数で書くのは流石に難しいため、一旦アセンブラで簡単なブートローダのプログラムを書き、命令対応表を見ながら機械語へ変換(手作業でコンパイル)していきます。

プログラムは以下の通りです。

```
org 0x7C00

start:
    mov ah, 0x0E   ; 1文字出力
    mov al, 'A'    ; 画面に出力する文字のASCIIコードをALレジスタへ格納 
    int 0x10     ; BIOS呼び出しでalレジスタの文字を画面に表示

    jmp $           ;無限に現在のアドレスに飛びCPUを止める

times 510-($-$$) db 0; 512バイトにするため0埋め
dw 0xAA55          ; ブートローダの印
```

## 逐次訳
NASM等のアセンブラがやっていることをここでは手作業で行っていきます。

| 行番号 | アセンブリ言語 | 機械語（16進数） | 説明 |
| --- | ------- | --------- | --- |
| 1 | `org 0x7C00` | - | 疑似命令。コードを`0x7C00`番地に配置することを明示（機械語生成なし）。 |
| 2 | `mov ah, 0x0E` | `B4 0E` | `AH`レジスタに即値`0x0E`を代入（`B4`=MOV AH, 即値8bit）。 |
| 3 | `mov al, 'A'` | `B0 41` | `AL`レジスタに文字'A'のASCIIコード`0x41`を代入（`B0`=MOV AL, 即値8bit）。 |
| 4 | `int 0x10` | `CD 10` | BIOSビデオ割り込み`0x10`を呼び出し（`CD`=INT 即値8bit）。 |
| 5 | `jmp $` | `EB FE` | 無限ループ（`$`=現在アドレス）。 |
| 6 | `times 510-($-$$) db 0` | `00...`（ゼロ埋め） | 合計512バイトになるまで残りを`0x00`で埋める（510バイト目まで）。 |
| 7 | `dw 0xAA55` | `55 AA` | `0xAA55`を書き込む）。 |

※ORGが機械語を生成しないことは以下の記事で検証しています。
[X86 ORG命令の本質](https://qiita.com/earthen94/items/d92ee49b761be246c6f0)

## バイナリで書き込み
hexeditを導入する。
touchでファイルを生成し、hexeditを用いて編集する。
地道に入力していきます。
```
touch newfile.bin
hexedit newfile.bin
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/37d955c8-3bde-4915-9117-cfa36729110c.png)


## 生成したプログラムをコンパクトフラッシュへ書き込む
```
sudo dd if=newfile.bin of=/dev/sdc bs=512 count=1 conv=notrunc
```
※ddで直接データを書き込む時は対象をよく確認しないと非常に危険です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/46fbd46d-579a-4a3b-868c-1e2ec99e6d64.png)

## 実機にて動作確認
8086の実機にて動作に成功しました！地味ですが感動ものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4054974/abfd120f-83ca-4401-b0a0-561e45e171af.png)

昨日ネットで1980年代のプログラマーが、まず紙にプログラムを書き、それを手で入力して紙テープに穴を開けている動画を見つけました。
それを見て、自分も一度は直接機械語を書いてみたくなりこの記事を書きました。
第3回 tableau データ分析

# 「統計でみる都道府県のすがた」をTableauで読み解く 
総務省統計局が毎年公開する「統計でみる都道府県のすがた」は、人口・産業・教育・家計など 90 以上の指標を横断的に収録した宝の山です！
Tableauで4つのVizをもとに、ダッシュボードを作成し、日本の強みと課題を可視化しました。
それぞれのVizについて、考察していきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872484/3f2ea715-f402-4c6d-8f6e-bd3ebb6d7360.png)


※フィルターには、データの年に加えて、総人口上位TOP10の抽出、医療資源ヒートマップ用の医師、歯科、薬剤師で切り替えられるようにしています。

Viz1：高齢者/医療資源ヒートマップ
65歳人口と医療従事者（医師、歯科、薬剤師）をヒートマップにしてみました。
医師、歯科、薬剤師は、フィルターで切り替えられます！

医師密度トップは 徳島県となり、京都、鳥取、長崎、東京 が続きます。
一方、埼玉県に関しては、高齢者の人口が多いのにも関わらず、全国45位となっており、医師絶対数でなく医師の密度を見せることで 埼玉・千葉の慢性的な医師不足 が浮き彫りとなっています。
▼歯科
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872484/2bd363a1-ef4e-4d93-8266-b9f15f35063d.png)
▼薬剤師
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872484/3d3b8619-c998-4cf1-aacc-60a7ff82f9eb.png)
医師、歯科、薬剤師ともに、徳島県が高く、医療従事者の密度が高いことがわかります。

Viz2：人口流出率Map
宮城を除く東北地方が高い傾向となっており、
総人口TOP10に絞ったときも関東+福岡と比較すると、人口流出率が高くなっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872484/8073698f-f9a6-4535-b82f-4d7403d7350e.png)

Viz3：人口流出率Map
傾向として、高齢化の傾向にありますが、総人口TOP10以外にした場合、
マイナスの傾向になっており、特に首都圏で高齢化の傾向になっているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872484/5feade17-0b73-48f9-b13a-afe9ead7884a.png)


Viz4：所得と支出パックバブル
円の大きさ：所得
色相：支出
都道府県の所得と支出を表現した時に首都圏は、両者ともに高い傾向にありますが、
大阪府のみ支出が少ない結果となりました。
総人口TOP10に絞った際も、大阪府の支出が一番低い結果となりました。
大阪ならではの倹約文化または、物価の影響があるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872484/185c301e-9ef2-45f2-b87f-a98ab0cbd37b.png)

最後に、今回使用した「統計でみる都道府県のすがた」には、90 以上の指標があり、まだまだ使え切れていないでし、目指すところはVizの説明なくVizを見ただけで分析結果/分析ができるようなVizを作成したいと思いました。
今回、2023年と2024年のデータを活用しましたが、過去10年間、20年間などコロナ、東京オリンピックの開催など、様々な歴史を含む分析をしてみたいと思いました。

ありがとうございました。
次回は、バイクのデータを活用した分析を行いたいと思います
X←Z→Y における独立性の性質を数式で証明する

因果推論の分岐経路の基本性質の証明をします。

分岐経路[^1]とは次のような状態を示します：

```math
X \leftarrow Z \rightarrow Y
```

このとき、次の内容[^1]が成立します:

```math
\begin{align}
X \not\perp Y \\
X \perp Y | Z \\
\end{align}
```
参考書籍[^1]でこちらの内容の証明はされていなかったため、こちらの内容の証明をしたいと思います。

[^1]に記載はないですが、本記事では分岐経路の同時確率は $P(X, Y, Z) = P(X|Z) P(Y|Z) P(Z)$ で与えられると仮定します。

# 1) XとYが独立でないことの証明

独立性の定義より、$P(X)P(Y)$ と $P(X,Y)$ の関係性を調べます。$P(X, Y) = P(X)P(Y)$ が成立しないことを示します。

まず、$P(X, Y)$ を計算します。
```math
\begin{align}
P(X, Y) &= \sum_Z P(X, Y, Z) \\
\end{align}
```
分岐経路の仮定から、$P(X, Y, Z) = P(X|Z) P(Y|Z) P(Z)$ のため、これを代入します。
```math
\begin{align}
P(X, Y) &= \sum_Z P(X|Z) P(Y|Z) P(Z) \\
\end{align}
```

次に、$P(X)$ と $P(Y)$ をそれぞれ計算します。
$P(X) = \sum_Y P(X, Y, Z) = \sum_Z P(X, Z) = \sum_Z P(X|Z) P(Z)$
$P(Y) = \sum_X P(X, Y, Z) = \sum_Z P(Y, Z) = \sum_Z P(Y|Z) P(Z)$

$X$ と $Y$ が独立であるためには、$P(X, Y) = P(X)P(Y)$ が成り立つ必要があります。
つまり、以下の等式が成立しなければなりません。
$$\sum_Z P(X|Z) P(Y|Z) P(Z) = \left( \sum_Z P(X|Z) P(Z) \right) \left( \sum_Z P(Y|Z) P(Z) \right)$$

この等式が一般には成立しないことを示すために、具体的な反例を挙げます。

**反例:**
$Z$ が二値変数（$Z=0$ または $Z=1$）であるとします。
$X$ と $Y$ も二値変数（$X \in \{0, 1\}$, $Y \in \{0, 1\}$）であるとします。

確率を設定します：
* $P(Z=0) = 0.5$
* $P(Z=1) = 0.5$

$Z$ を原因として $X$ と $Y$ の確率を定義します。
* $P(X=1|Z=0) = 0.1$
* $P(X=0|Z=0) = 0.9$
* $P(X=1|Z=1) = 0.9$
* $P(X=0|Z=1) = 0.1$

* $P(Y=1|Z=0) = 0.1$
* $P(Y=0|Z=0) = 0.9$
* $P(Y=1|Z=1) = 0.9$
* $P(Y=0|Z=1) = 0.1$

このとき、$X$ と $Y$ は $Z$ に強く依存しており、特に $Z=0$ の時は $X=0, Y=0$ となりやすく、$Z=1$ の時は $X=1, Y=1$ となりやすい傾向があります。

**$P(X, Y)$ の計算（例として $P(X=1, Y=1)$ を計算）：**
```math
\begin{align}
P(X=1, Y=1) &= \sum_Z P(X=1|Z) P(Y=1|Z) P(Z) \\
&= P(X=1|Z=0)P(Y=1|Z=0)P(Z=0) \\
& \quad + P(X=1|Z=1)P(Y=1|Z=1)P(Z=1) \\
&= (0.1)(0.1)(0.5) + (0.9)(0.9)(0.5) \\
&= 0.005 + 0.405 \\
&= 0.41 \\
\end{align}
```

**$P(X)P(Y)$ の計算：**
まず $P(X=1)$ と $P(Y=1)$ を計算します。
```math
\begin{align}
P(X=1) &= \sum_Z P(X=1|Z) P(Z) \\
&= P(X=1|Z=0)P(Z=0) + P(X=1|Z=1)P(Z=1) \\
&= (0.1)(0.5) + (0.9)(0.5) \\
&= 0.05 + 0.45 \\
&= 0.5 \\
\end{align}
```
同様に、
```math
\begin{align}
P(Y=1) &= \sum_Z P(Y=1|Z) P(Z) \\
&= P(Y=1|Z=0)P(Z=0) + P(Y=1|Z=1)P(Z=1) \\
&= (0.1)(0.5) + (0.9)(0.5) \\
&= 0.05 + 0.45 \\
&= 0.5 \\
\end{align}
```
したがって、
$P(X=1)P(Y=1) = (0.5)(0.5) = 0.25$

$P(X=1, Y=1) = 0.41$ であり、$P(X=1)P(Y=1) = 0.25$ です。
$0.41 \neq 0.25$ であるため、$P(X, Y) \neq P(X)P(Y)$ です。

よって $X \not\perp Y$。

# 2) XとYはZが与えられた時の条件付き独立であることの証明

$P(X,Y|Z) = P(X|Z)P(Y|Z)$ を示せばよい。

左辺の $P(X,Y|Z)$ から計算をする。
```math
\begin{align}
P(X,Y|Z) &= \frac{P(X,Y,Z)}{P(Z)} \\
\end{align}
```
分岐経路の仮定から、$P(X,Y,Z) = P(X|Z)P(Y|Z)P(Z)$ のため、これを代入します。
```math
\begin{align}
P(X,Y|Z) &= \frac{P(X|Z)P(Y|Z)P(Z)}{P(Z)} \\
&= P(X|Z)P(Y|Z) \\
\end{align}
```

したがって、$X$ と $Y$ は $Z$ を条件として独立である。

# 最後に

本記事があなたの役に立てば幸いです。

[^1]: 因果推論　基礎から機械学習・時系列解析・因果探索を用いた意思決定のアプローチ　金本拓 pp.43
【Mac】caffeinateコマンドの使い方


`caffeinate`コマンドを使用するとスリープしないようにできます。

https://keith.github.io/xcode-man-pages/caffeinate.8.html

## 1時間（3600秒）スリープしないようにする

```terminal
caffeinate -u -t 3600
```

## コマンドが完了するまでスリープしないようにする

```terminal
caffeinate -s "command"
```

##   指定したPIDのプロセスが完了するまでスリープしないようにする

```terminal
caffeinate -w pid
```

##   スリープしないようにする（`Ctrl + c`で終了）

```terminal
caffeinate -i
```

## ディスクがスリープしないようにする（`Ctrl + c`で終了）

```terminal
caffeinate -m
```
X→Z→Y における独立性の性質を数式で証明する

因果推論の連鎖経路の基本性質の証明をします。

連鎖経路[^1] とは次のような状態を示します：

```math
X \rightarrow Z \rightarrow Y
```

このとき、次の内容が成立します[^1]

```math
\begin{align}
X \not\perp Y \\
X \perp Y | Z \\
\end{align}
```

参考書籍[^1]でこちらの内容の証明はされていなかったため、こちらの内容の証明をしたいと思います。

# 1) XとYが独立でないことの証明

独立性の定義より、$P(X)P(Y),P(X,Y)$の関係性を調べる。

```math
\begin{align}
P(X, Y) &= \sum_Z P(X, Y, Z) \\
&= P(X) \sum_Z P(Y|Z) P(Z|X)
\end{align}
```

加えて、$P(Y) = \sum_Z P(Y|Z) P(Z)$を加えると下記が成立する:

```math
\begin{align}
& P(X)P(Y) - P(X,Y) \\
= & P(X) \sum_Z P(Y|Z) 
\left\{ 
P(Z) - P(Z|X) \right\}
\end{align}
```

よって、 $\forall X, P(Z|X) = P(Z)$ であるとき $P(X)P(Y) = P(X,Y)$ となる。このとき、$P(Z|X) = \frac{P(X,Z)}{P(X)}=P(Z)$ であるため、これの成立は $Z \perp X$ であり連鎖経路と矛盾。

よって $X \not\perp Y$。

# 2) XとYはZが与えられた時の条件付き独立であることの証明

つまり $P(X,Y|Z) = P(X|Z)P(Y|Z)$ を示せばよい。

```math
\begin{align}
P(X,Y|Z) 
&= \frac{P(X,Y,Z)}{P(Z)} \\
&= \frac{P(Y|Z)P(Z|X)P(X)}{P(Z)} \\
&= \frac{P(Y|Z)\cdot P(Z|X)P(X)}{P(Z)} \\
&= P(Y|Z) \frac{P(X,Z)}{P(Z)} \\
&= P(Y|Z) P(X|Z)
\end{align}
```

よって、$X \perp Y | Z $である。

# 最後に

本記事があなたの役に立てば幸いです。

また、私主催ではありますが2025年5月現在、参考書籍[^1]について輪読会をしています。ゆるく開催していますので興味ありましたら、XのDMやメンション等でご連絡ください。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今週の火曜日の21:00-22:00から毎週で因果推論の輪読会をする予定なので興味あれば連絡ください！（すでに諸々声をかけて何人か集まってます）<br><br>条件はオーム社 金本拓さんの因果推論の本を持ってることです.<br>進め方は前準備なく参加できる方式で、その場で読んでいく形の予定です.</p>&mdash; のぞみ (@NozomiMaki2) <a href="https://twitter.com/NozomiMaki2/status/1921150847209144543?ref_src=twsrc%5Etfw">May 10, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[^1]: 因果推論　基礎から機械学習・時系列解析・因果探索を用いた意思決定のアプローチ　金本拓 pp.43
VisualStudioCode Add-on

# はじめに
<!-- 発端や概要を記載 -->
M4 MacBook Proを購入しました。
個人的に新しく設定し直したのでメモを残します。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [言語](#言語)
1. [設計](#設計)
1. [Git](#git)
1. [その他](#その他)
1. [最後に](#最後に)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#言語"></a>
# 言語

- [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
  - python環境です
  - Pythonの他に、pylance、python Debuggerが入ります
 		
- [Jupyter](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter)
  - jupyterにも対応できて便利
  - jupyterの他に、Jupyter Keymap、Jupyter Notebook Renderers、Jupyter Cell Tags、Jupyter Slide Showが入ります
  - [こちら](https://dev.classmethod.jp/articles/mrmo-vscode-jupyter-20200413/)を参考にVScodeでjupyterを動かせるようにしました

- [isort](https://marketplace.visualstudio.com/items?itemName=ms-python.isort)
  - 静的解析してソートしてくれます
  - コードの品質をある程度保ってくれて便利
 
- [C/C++ Extension Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-extension-pack)
  - C/C++環境です
  - C/C++の他に、C/C++ Themes、CMake、CMake Toolが入ります

- [Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)
  - コードの実行環境を拡張できます
  - 使い方は[こちら](https://qiita.com/take_me/items/6a1d2d417889837219d1)がわかりやすいかと思います

- [Extention pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)
  - Java環境です
  - Extention pack for Javaの他に、Language Support for Java、Debugger for Java、Test Runner for Java、Maven for Java、Gradle for Java、Project Manager for Java、Visual Studio IntelliCodeが入ります

 
<a id="#設計"></a>
# 設計

- [Markdown all in one](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)
  - 標準で対応していないMarkdown向け機能をほぼ提供してくれます
  
- [markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint)
  - 文法や記述スタイルをチェックし、違反した書き方を表示してくれます

- [Markdown PDF](https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf)
  - PDF、HTML、PNGなどのエクスポート

- [PlantUML](https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml)
  - UMLを書くツール。使用頻度は高めです。
  - これ以外にもインストール作業が必要なので[こちら参照](https://guinpen98.github.io/VuePress/articles/plant-uml-mac.html#はじめに)


- [Draw.io Integration](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)
  - システム相関図などでお世話になるDraw.ioです。使用頻度かなり高めです。


<a id="#git"></a>
# Git

- [Git Graph](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph)
  - コミット記録の可視化ツール

- [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
  - Git操作のサポートツール

<a id="#その他"></a>
# その他
過去にインストールしたけど、消したものを記載します。

- [Japanese Language Pack for Visual Studio](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
  - VSCodeを日本語対応してくれます
  - 動かないAppが出てくるので消しました

- [Bongo Cat](https://marketplace.visualstudio.com/items?itemName=pixl-garden.BongoCat)
  - 小さな猫がぱたぱたします
  - 楽しいのは最初だけ

- [Bongo Cat Buddy](https://marketplace.visualstudio.com/items?itemName=JohnHarrison.bongocat-buddy)
  - 大きな猫がぱたぱたします
  - これも楽しいのは最初だけ




<a id="#最後に"></a>
# 最後に

その他、追加したらまた編集しようかと思います。


<a id="#参考文献"></a>
# 参考文献
- [Visual Studio CodeでMarkdownを書く環境を整える](https://qiita.com/84zume/items/1e6c720caba9898f5af2)
ls -l に表示される「+」の意味とは...？ACLの基礎を調べてみた

# はじめに
ある時Linux環境を触っていると以下のようなファイルが存在しました。
パーミッションの設定箇所に「**+**」という見たことない記号がある…
今回はこの記号の意味について調べたことをまとめていきたいと思います。
```shell-session
$ ls -l
total 0
-rw-rw-r--+ 1 ec2-user ec2-user 0 May 24 15:53 hoge.txt
```

# 「+」の正体
\+ は ACL（Access Control List） が設定されていることを表しています。
通常、ファイルやディレクトリの権限はユーザー/グループごとに権限を変えて設定するといったことはできません。
しかし、ACLを使用することでこの設定を可能とします。

# 設定方法

続いて、実際にACLを設定する方法について記載します
ACLを使用するには`acl`パッケージがインストールされている必要があるため、入っていない場合はインストールしておきましょう。

### ACLの設定

ACLの設定には`setfacl`コマンドを使用します。
`-m`オプションを使用することで、ファイルやディレクトリのACLを追加・修正できます。

```shell-session:sample
setfacl -m rules files
```
rulesは以下の形式で指定します。
| ルール | 説明 |
| ---- | ---- |
| `u:uid:perms` | ユーザーにACLを設定<br>ユーザー名またはUIDを指定 |
| `g:gid:perms` | グループにACLを設定<br>グループ名またはGIDを指定 |
| `m:perms` | 実効権マスクを設定 |
| `o:perms` | ファイルのグループに属さないユーザーにACLを設定 |

※permsは`r`,`w`,`x`の組み合わせ
既にACLが設定されている状態で`setfacl`コマンドを使用した場合は、既存のACLに追加されるか既存のルールが修正される。

#### 実行例

hoge.txtに対して、ACLでtestuserに書き込みと参照権限を与えます。

```shell-session
$ setfacl -m u:testuser:rw ./hoge.txt
$ ls -l
total 4
-rw-rw-r--+ 1 ec2-user ec2-user 12 May 24 16:42 hoge.txt
```

testuserに切り替えてファイルに書き込みができるか確認します。

```shell-session
$ whoami
testuser
$ echo "Test!" >> ./hoge.txt
$ cat ./hoge.txt
HelloWorld!
Test!
```
このように、パーミッション上、testuserに対して読み取り権限しかないものの、書き込み操作もできています。


設定の確認には`getfacl`コマンドを使用します。
下記の実行結果からtestuserに対して読み取り, 書き込み権限があることを確認できます。
```shell-session:実行例
$ getfacl ./hoge.txt
# file: hoge.txt
# owner: ec2-user
# group: ec2-user
user::rw-
user:testuser:rw-
group::r--
mask::rw-
other::r--
```

権限の削除には `setfacl`コマンドに`-x`オプションを付与します。
```shell-session:sample
setfacl -x rules files
```

testuserからすべての権限を削除するには以下のようになります。
```shell-session:実行例
$ setfacl -x u:testuser ./hoge.txt
$ getfacl ./hoge.txt
# file: hoge.txt
# owner: ec2-user
# group: ec2-user
user::rw-
group::r--
mask::r--
other::r--
```

なお、ACLの設定自体を削除する場合は `-b`オプションを使用します。
```shell-session:実行例
$ setfacl -b ./hoge.txt
$ ls -l
total 4
-rw-r--r--. 1 ec2-user ec2-user 12 May 24 16:20 hoge.txt
```

### デフォルトACLの設定

デフォルトACLを設定するには、d: をルールの前に追加してから、**ディレクトリのpath**を指定します。
デフォルトACLを設定することで、ディレクトリ内にファイルが作成された際に設定が継承されるため、個々の設定が不要となります。

```shell-session:sample
setfacl -m d:o:rx /share
```

### 注意点
setfaclコマンドでACLマスクを超える権限は付与できません。
下記の場合はmaskがr--となっているため、実行権限は制限されています。
```shell-session:sample
$ getfacl /home/ec2-user/huga.txt
getfacl: Removing leading '/' from absolute path names
# file: home/ec2-user/huga.txt
# owner: ec2-user
# group: ec2-user
user::rw-
user:testuser:r-x               #effective:r--
group::---
mask::r--
other::---
```

# まとめ
今回はACLについての概要や使用方法をまとめました。
Windowsに比べてLinuxの権限周りは難しくないと思っていましたが、ACLやSELinux等まだまだ理解度が低いものが多そうです…
PHP：date() と strtotime() の基本的な使い方を整理してみた

## はじめに

この記事では、PHPにおける日付・時刻の扱い方について、特に `date()` 関数と `strtotime()` 関数を使った具体的な例をまとめていきます。

**参考文献**

https://www.php.net/manual/ja/datetime.formats.php

https://www.sejuku.net/blog/21821

**個人のまとめ記事となっておりますが、温かい目で見守っていただければ幸いです。**

## 書こうと思ったきっかけ

個人的にPHPのキャッチアップをしたくて、勉強している初学者による備忘録としてまとめました。特に日付まわりの処理は実務でもよく出てくる場面だと思いますので、基本的なフォーマットの出力や、文字列からの変換について理解を深めたいと思いました。

## 実際に整理してみた

### `date()` 関数の使い方

`date()` 関数は現在の時刻を指定したフォーマットで表示する関数です。たとえば：

```php
<?php
date_default_timezone_set('Asia/Tokyo');
echo date("Y-m-d H:i:s"); // 例: 2025-05-27 22:45:00
?>
```

**コマンド結果**

![Screenshot 2025-05-27 at 22.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cfb64dfe-6f69-4659-8562-8689e910bf45.png)

他にも以下のような書式指定子があります：

* `Y`: 西暦（4桁）
* `m`: 月（ゼロ埋め）
* `d`: 日（ゼロ埋め）
* `H`: 時（24時間）
* `i`: 分
* `s`: 秒

**参考文献**

https://www.php.net/manual/ja/function.date.php

### `strtotime()` 関数の使い方

`strtotime()` 関数は、文字列形式の日付をUNIXタイムスタンプに変換してくれます。

```php
<?php
echo date("Y-m-d", strtotime("+1 week")); // 1週間後の日付を表示
?>
```

**コマンド結果**

![Screenshot 2025-05-27 at 22.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c904b769-e29d-4f05-b9d1-1a1455639af2.png)

使える表現例：

* `now`, `tomorrow`, `yesterday`
* `+1 day`, `-3 days`
* `next Monday`, `last Sunday`
* `first day of this month`, `last day of this month`

**参考文献**

https://www.php.net/manual/ja/function.strtotime.php

### 実行例（CLIで出力）

```php
<?php
date_default_timezone_set('Asia/Tokyo'); // タイムゾーンを日本に設定

echo "現在: " . date("Y-m-d H:i:s") . PHP_EOL;
echo "明日: " . date("Y-m-d", strtotime("tomorrow")) . PHP_EOL;
echo "来週の月曜日: " . date("Y-m-d", strtotime("next Monday")) . PHP_EOL;
```

出力例：

![Screenshot 2025-05-27 at 22.30.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/04686d10-9a12-4a9e-9eb3-068902484739.png)

すべて、想定通りの出力結果となっていました！

## まとめ

ここまで読んでいただき、ありがとうございました！

* `date()` は現在の日時を任意のフォーマットで取得するのに便利
* `strtotime()` は文字列からタイムスタンプを生成でき、柔軟に日時を操作できる
* 両者を組み合わせることで、日付処理がより簡単に行える

今後は `DateTime` クラスなども触っていきたいと思います。

https://www.php.net/manual/ja/class.datetime.php#:~:text=DateTime%20%E3%82%AF%E3%83%A9%E3%82%B9%20%C2%B6&text=%E6%97%A5%E4%BB%98%E3%81%A8%E6%99%82%E5%88%BB%E3%82%92%E8%A1%A8%E7%8F%BE,%E3%81%9F%E6%99%82%E3%82%92%E9%99%A4%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
SeleniumでXPathを使う方法：例付き完全ガイド

[Selenium](https://www.lambdatest.com/selenium?utm_source=qiita&utm_medium=organic&utm_campaign=may_27&utm_term=xpath-in-selenium&utm_content=blog)はWebアプリケーションの自動テストにおいて広く使われているツールですが、その中でもXPathは非常に重要な役割を果たします。XPathを理解し正しく使うことで、複雑なDOM構造の中からターゲットの要素を正確に取得できるようになります。

本記事では、XPathの基本からSeleniumでの実用的な使い方まで、例を交えながら詳しく解説します。

## 目次

1. XPathとは？
2. XPathの基本構文

3. 絶対パスと相対パスの違い

4. XPathの演算子と関数

5. SeleniumでXPathを使う方法

6. よくあるXPathの使い方パターン

7. トラブルシューティング

8. まとめ

## XPathとは?
XPath（XML Path Language）は、XMLやHTMLドキュメント内の要素を検索・選択するための言語です。Seleniumでは、XPathを使って要素を特定し、自動操作を行うことができます。

たとえば、以下のようなHTMLがあったとします：

<div>
  <ul>
    <li class="item">リンゴ</li>
    <li class="item">バナナ</li>
    <li class="item">オレンジ</li>
  </ul>
</div>

この中の「バナナ」要素をXPathで指定するには：


//li[text()="バナナ"]

## XPathの基本構文

XPathには主に以下のような構文があります：

構文	説明
//tagname	指定したタグ名の要素を全体から取得
//div[@id='main']	属性が一致する要素を取得
//input[@type='text']	type属性が"text"のinput要素
//ul/li[2]	2番目のli要素
//a[contains(text(), 'ログイン')]	テキストに「ログイン」を含むa要素

**絶対パスと相対パスの違い**

*絶対パス*：HTMLのルートから特定の要素までの完全なパス


/html/body/div/ul/li[2]
相対パス：//から始まり、どこにあっても一致する要素を対象にできる柔軟な方法


//li[2]
ヒント：自動テストでは相対パスの使用が推奨されます。ページ構造の変更に柔軟に対応できるからです。

## XPathの演算子と関数

XPathはさまざまな演算子や関数をサポートしています：

演算子/関数	例	説明
text()	//p[text()='ようこそ']	テキストが一致する要素
contains()	//a[contains(text(), '詳細')]	テキストに一部一致する
starts-with()	//input[starts-with(@id, 'user')]	IDが"user"で始まるinput
and / or	//input[@type='text' and @name='username']	複数条件の指定

## SeleniumでXPathを使う方法

PythonとSeleniumを使ってXPathを活用する方法を見ていきましょう。
必要なライブラリのインストール  bash

pip install selenium
簡単なスクリプト例

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com")

# XPathを使って要素を取得
element = driver.find_element(By.XPATH, "//h1[text()='Example Domain']")
print(element.text)

driver.quit() このスクリプトでは、XPathでタグの中に"Example Domain"というテキストを持つ要素を取得しています。

# よくあるXPathの使い方パターン
### 1. ボタンをクリックする

driver.find_element(By.XPATH, "//button[@id='submit']").click()
### 2. 入力フィールドに文字を入力

driver.find_element(By.XPATH, "//input[@name='email']").send_keys("test@example.com")
### 3. リストの中の特定の要素を選ぶ

driver.find_element(By.XPATH, "//ul/li[3]").click()
### 4. クラス名に一部一致
class名に"active"が含まれているdiv
driver.find_element(By.XPATH, "//div[contains(@class, 'active')]")

## トラブルシューティング
XPathを使用する際、以下のような問題がよく発生します：

#### 要素が見つからない
#### ページの読み込みが完了していない

#### XPathの指定が間違っている

#### フレーム内に要素がある

#### 対策：
WebDriverWaitを使って要素の表示を待つ

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//div[@id='main']"))
)
## まとめ
XPathはSeleniumで要素を操作する上で非常にパワフルな手段です。単純な要素取得から、複雑な条件付きの検索まで対応できるため、実践的なスクリプト作成には欠かせません。
# GraphQLとREST APIの使い分け：実践的なアプローチ


## はじめに
こんにちは！現在、情報系専門学校でWeb開発を学んでいるルイです。
今回は、自分なりに調べて手を動かして感じた「GraphQL」と「REST API」の違いと使い分けについて書いてみます。 
初心者目線なので、もし「もっとこうだよ！」というご指摘があればコメントいただけるとうれしいです！
初投稿ということもあり、温かい目で見ていただけると幸いです:bow_tone1:

## REST APIの特徴と感じたこと
まずは王道のREST APIから。自分も最初に触れたのはRESTで、
「URLとメソッド（GET/POST/PUT/DELETE）で分かりやすく操作できる」というシンプルさが良いなと思いました。

### RESTの良いところ：
- URL設計が直感的（/users/1 みたいな）
- HTTPの仕組みそのまま使えるので、ドキュメントも多く、学習コストが低い
- サーバー側の実装も分かりやすい

### つまずきポイントや課題：
- たとえばユーザー一覧＋詳細＋サブ情報を一気に取りたい時、**複数APIを順番に呼ぶ必要があって面倒**
- 不要なデータも返ってきて通信量が多くなりやすい

![Rest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093214/9a66408a-b672-4130-9866-725f62572338.png)

## GraphQLの特徴と実際に触ってみた感想
最近話題のGraphQLも実際に使ってみました。
最初は「クエリを自分で書くって難しそう…」と思っていたのですが、慣れるとむしろ自由度が高くて便利でした。

### GraphQLの良いところ：

- **必要なデータだけピンポイントで取得できる**
→ 例えば「ユーザー名とメールだけ欲しい」ときは、その2つだけ指定できる
![Glaphpl.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4093214/a3399eb7-c2e6-410d-8cc1-16eb4e0dcb6c.jpeg)


- 1つのリクエストで複数のデータをまとめて取得できる（N+1問題を防ぎやすい）

- 型システムが強力で、ドキュメント生成もラク

### 戸惑った点・注意したいこと：

- サーバー実装がちょっと大変。リゾルバを書くのに最初は時間がかかりました

- RESTみたいな「標準の認証・認可方法」が決まっていないので、ルール決めが必要

- キャッシュとかエラーハンドリングの仕組みが違って、慣れが必要

## 実際のプロジェクトでどう使い分ける？
自分が学校や自主制作で感じた使い分けのポイントはこんな感じです。

### REST APIが向いている場合
- シンプルなCRUD中心のアプリ（管理画面や小規模アプリなど）

- 既存システムやサードパーティAPIとの連携

- チーム内にRESTの経験者が多いとき

### GraphQLがGraphQLが強い場面
- フロントエンドごとに**必要なデータが細かく違う**場合（SPAやモバイルアプリなど）

- **複数リソースを一気に取得したい**場合（複雑なUIやダッシュボード）

- 将来的にAPIの変更が多くなりそうなプロジェクト

## まとめと自分の反省
どちらも使ってみて、最初は「新しいもの＝難しい」と思いがちでしたが、
**実際に小さなプロジェクトで両方試してみると、それぞれの強みや苦手なところがはっきり見えてきました。**

RESTは直感的で手軽、GraphQLは柔軟でパワフル。
**結局は「何を作りたいか・どう運用したいか」で選ぶのが一番大事だと実感しました。**

まだまだ分からないことも多いですが、これからも実践しながら勉強していきたいです。
他の方の実体験やアドバイスもぜひ聞きたいです！

ここまで読んでいただきありがとうございました！:open_hands: