OmniAICreator/Qiita-1.07M huggingface dataset:
本物の詐欺アカウントの写真を使ったGPT フェイクチェッカーのデモ

# GPT フェイクチェッカーのデモ

https://chatgpt.com/g/g-67d0e61ed8b88191a08e8808446749a6-hueikutietuka

## 目的：
フェイスチェッカーの機能を自作自演のフェイク写真ではなく本当に詐欺に使われているものを使って確認する。

## 使用したアカウント
明らかに詐欺であると判る[鈴木ケ裕美子](https://www.facebook.com/profile.php?id=61569643592861) というアカウントの写真を使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/f6279888-7863-4a17-b63e-ade57f149cb7.png)

## 写真以外の観察事項
**プロフィールから、詐欺の可能性あり**
・投稿している写真に『私を追加しないと、特別な機会を逃す可能性があります〜私を追加してください! LINE: (以下LINEのIDとURLは危険なので省略)』と書かれていて、LINEに誘導されると何らかの詐欺的な誘いがあるものと推測できる。
・友達がアフリカ系の男性3人だけ。
・写真をYandexで検索すると、海外の出会い系に似たような写真が見られたが、100%マッチするものはない。
・タイムラインに「いいね」も「コメント」もない。

## 3つの写真をフェイクチェッカーでチェック
![output (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635312/5e52b05d-81eb-4d76-a997-3f8d962d44d8.png)

## GPTの出力結果
>これらの画像がAI生成であるか、または一部がAIによってデフォルメされている可能性を分析します。まず、以下のポイントを確認します。
>
>**1. 顔の特徴と不自然さ**
>滑らかすぎる肌: AI生成画像では、通常の写真よりも肌が不自然に滑らかでシワや毛穴が極端に少ないことが多い。
>目や顔の対称性: AIが生成する顔は完璧すぎるほど左右対称になる傾向がある。
>歯や手の形: AI画像では歯が異常に均一だったり、指が不自然に長かったり本数が合わない場合がある。
>**2. 背景の違和感**
>AI生成画像では、背景が意図せずに歪んでいたり、ぼやけた部分があったりすることがある。
>鏡や反射に映るものが不自然なことがある。
>**3. メタデータの確認**
>画像のEXIFデータ（撮影カメラ情報や編集履歴）が消されている場合、AI生成の可能性が高まる。
>**4. AI生成の兆候（画像解析）**
>ELA（エラー レベル分析）を実施し、不自然な編集があるかチェック。
>画像のエッジや細部のパターンがAI特有の処理を示しているか確認。
>
>これらの分析を行った上で、結果を報告しますので、少々お待ちください。
>
>ELA（エラー レベル分析）を実施し、不自然な編集の痕跡を確認しました。以下のリンクから分析結果の画像を確認できます。
>
>### ELA結果の分析
>画像全体のエッジや細部の変化を強調することで、AI編集や合成の可能性を探ることができます。
>通常、自然な写真では細部の劣化が均一ですが、AI合成画像や編集が加えられた部分では明らかに異なるパターンが現れます。
>結果を詳しく分析し、AI生成やデフォルメの可能性について評価を続けます。 ​​
>ELA（エラー レベル分析）の結果をもとに、以下のポイントについて詳細に評価しました。
>
>### 分析結果
>**全体的な質感の不自然さ**
>3枚の画像ともに、顔の肌が非常に滑らかで、自然な皮膚の質感（シワや毛穴、影のムラなど）がほとんど見られません。
>AI生成画像やフィルター加工が強い画像では、肌の均一性が高くなりすぎる傾向があります。
>
>**ELA（エラー レベル分析）結果**
>画像の特定部分（特に顔や髪の毛周辺）で他の部分とは異なる劣化パターンが確認されました。
>これはAIによる補正や、デフォルメが施された可能性を示唆しています。
>逆に、背景や服の部分は比較的均一な劣化を示しており、顔の部分だけが異常に修正されている可能性があります。
>
>**目と輪郭の対称性**
>目が異常に大きく、左右がほぼ完璧に対称であることが特徴的です。
>人間の顔は通常わずかに非対称ですが、AI生成画像ではこの非対称性が少なくなり、バランスが「完璧すぎる」ことがあります。
>
>**背景の違和感**
>2枚目（腕をついている画像）では、背景の照明や反射の不自然さが見受けられます。
>鏡や窓に映る光源の形状が不明瞭で、AI生成画像の特徴の1つと一致します。
>
>### 結論
>・完全なAI生成画像の可能性: かなり高い
>・AIフィルターやデフォルメ補正が入った可能性: 非常に高い
>・一般的な写真の可能性: 低い（過度な補正やAI編集の兆候が多く見られる）
>・この画像は、完全にAIで生成されたものか、もしくは実際の写真をベースにAIフィルターで大幅に修正されたものである可能性が高いです。特に「鈴木ケ 裕美子」という名前が不自然であることからも、SNS上の架空アカウントや詐欺目的のアカウントで使用されている疑いがあります。
>
>もしこのアカウントが怪しいと感じる場合は、不審な点がないか追加情報を確認し、慎重に対応することをおすすめします。

:::note alert
**免責事項**
精巧なAI画像の判定というのは目視では非常に難しく、明らかに怪しいものは的確に言判定してくれていますが、ChatGPTが間違った判定をすることはあり得ますので、その点はご理解ください。ChatGPTが誤った判断をしてその結果詐欺被害にあったとしても、当方では一切責任を負いません。基本はSNSなどで知らない人にアプローチされたらまず疑ってみることです。
::::
@Outputで子コンポーネントから親へ通知する方法

# はじめに
Angularでアプリケーションを開発する際、コンポーネント間のデータ通信は避けて通れない重要なトピックです。特に子コンポーネントから親コンポーネントにデータを送信する場合、`@Output` デコレータが重要な役割を果たします。

この記事では、`@Output` デコレータの基本的な使い方を解説していきます。

# Outputデコレータとは
`@Output` デコレータは、**子コンポーネントから親コンポーネントへイベントを通知する**ためのAngularの機能です。子コンポーネントで発生したイベントや変更を親コンポーネントに伝えることで、コンポーネント間の連携がスムーズに行えるようになります。

> コンポーネントを扱う際に、他のコンポーネントに何かが起こったことを通知しなければならない場合があります。ボタンがクリックされた、リストに項目が追加/削除された、またはその他の重要な更新が行われたなどです。このようなシナリオでは、コンポーネントは親コンポーネントと通信する必要があります。
> Angularは、@Outputデコレーターを使用してこのタイプの動作を可能にします。

https://angular.jp/tutorials/learn-angular/9-output

# Outputの実装手順

## ディレクトリ構造（親子関係）
この階層関係を理解することで、`@Output`デコレータを使ったイベント通知の流れが明確になります。子コンポーネントで定義されたイベントは、親コンポーネントに伝播し、親コンポーネントでそのイベントをハンドリングすることができます。

```
src/
└── app/
    ├── app.component.ts        // 親コンポーネント
    ├── app.component.html      // 親コンポーネントのテンプレート
    ├── app.module.ts           
    └── child/                  
        ├── child.component.ts  // 子コンポーネント
        └── child.component.html // 子コンポーネントのテンプレート
```

## 子コンポーネントの実装
子コンポーネントでは、`@Output` デコレータを使ってイベントを定義し、親コンポーネントに通知できるようにします。まず必要なモジュールをインポートし、`EventEmitter`を使ってイベントを作成します。このイベントは、ボタンクリックなどのアクションが発生したときに発火させることができます。

```ts:child.component.ts
import { Component, EventEmitter, Output } from '@angular/core';

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css']
})
export class ChildComponent {
  // @Outputデコレータでイベントを定義
  @Output() addItemEvent = new EventEmitter<string>();

  // イベントを発火するメソッド
  addItem() {
    // emit()メソッドで親コンポーネントにデータを送信
    this.addItemEvent.emit('新しいアイテム');
  }
}
```

子コンポーネントのHTMLでは、ボタンをクリックしたときに `addItem()` メソッドを呼び出します。
```html:child.component.html
<div>
  <h2>子コンポーネント</h2>
  <button (click)="addItem()">アイテムを追加</button>
</div>
```

## 親コンポーネントの実装

親コンポーネントのHTMLテンプレートでは、子コンポーネントを配置し、`addItemEvent`イベントを親コンポーネントの`handleAddItem`メソッドにバインドします。これにより、子コンポーネントからのイベント発火を検知できます。
```html:app.component.html
<div>
  <h1>親コンポーネント</h1>
  
  <!-- 子コンポーネントのイベントをバインド -->
  <app-child (addItemEvent)="handleAddItem($event)"></app-child>
  
  <div *ngIf="items.length > 0">
    <h3>追加されたアイテム:</h3>
    <ul>
      <li *ngFor="let item of items">{{ item }}</li>
    </ul>
  </div>
</div>
```

親コンポーネントでは、子コンポーネントが送信したイベントを受け取り、そのデータを処理します。`handleAddItem` メソッドは子コンポーネントから送られてきたデータ（この例では「新しいアイテム」という文字列）を引数として受け取り、それを `items` 配列に追加します。配列に追加されたアイテムはテンプレート内の `*ngFor` ディレクティブで画面上に表示されます。
```ts:app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  items: string[] = [];

  // 子コンポーネントから送信されたデータを処理するメソッド
  handleAddItem(newItem: string) {
    this.items.push(newItem);
    console.log('アイテムが追加されました:', newItem);
  }
}
```

## Outputの動作の流れ

1. **イベントの定義**
   子コンポーネントで `@Output()` デコレータを使用して `EventEmitter` オブジェクトを作成します。
2. **イベントの発火**
   子コンポーネント内で `emit()` メソッドを呼び出してイベントを発火し、データを送信します。
3. **イベントのバイディング**
   親コンポーネントのHTMLで、子コンポーネントのセレクタに`(イベント名)="メソッド($event)"` の形式でイベントをバインドします。
4. **データの受信**
   親コンポーネントのメソッドが呼び出され、子コンポーネントから送信されたデータを受け取ります。

# おわりに
Angularライフ楽しみましょう〜
REST APIのエラー




# { EmailMessageId: message_id, RelationId: lead_or_contact_id, RelationType: 'FromAddress' }  

+ [Unable to create EmailMessages - Invalid Params](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000UV5V)

:::note
Before, I sent the

"toIds" parameter with the "t" in lowercase, but when I changed it to uppercase ( ToIds
), the object creation worked correctly. 

So, if you are having the same problem, please understand the names of the parameters you are sending. 
:::
wslでelixir その161

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookの、kino.jsで、じゃんけんを書け。
喋らせよ。

# サンプルコード

```

defmodule KinoHTML.Janken do
	use Kino.JS
	use Kino.JS.Live
	def new(ans) do
		Kino.JS.Live.new(__MODULE__, ans)
	end
	def init(ans, ctx) do
		{:ok, assign(ctx, ans: ans)}
	end
	def handle_connect(ctx) do
		{:ok, ctx.assigns.ans, ctx}
	end
	def handle_event("gu", _, ctx) do
    ans = Janken.pon("0")
		{:noreply, res(ctx, ans)}
	end
	def handle_event("choki", _, ctx) do
    ans = Janken.pon("1")
		{:noreply, res(ctx, ans)}
	end
	def handle_event("pa", _, ctx) do
    ans = Janken.pon("2")
		{:noreply, res(ctx, ans)}
	end
	defp res(ctx, ans) do
		broadcast_event(ctx, "update", ans)
		ctx
    end
	asset "main.js" do
		"""
		export function init(ctx, ans) {
			ctx.root.innerHTML = `
				<div id="ans"></div>
				<button id="bt0">グー</button>
				<button id="bt1">チョキ</button>
				<button id="bt2">パー</button>
			`;
			const ansEl = document.getElementById("ans");
			const bt0 = document.getElementById("bt0");
			const bt1 = document.getElementById("bt1");
			const bt2 = document.getElementById("bt2");
			ansEl.innerHTML = ans;
            talk(ans);
			ctx.handleEvent("update", (ans) => {
				ansEl.innerHTML = ans;
                talk(ans);
			});
			bt0.addEventListener("click", (event) => {
				ctx.pushEvent("gu");
			});
			bt1.addEventListener("click", (event) => {
				ctx.pushEvent("choki");
			});
			bt2.addEventListener("click", (event) => {
				ctx.pushEvent("pa");
			});
            function talk(src) {
                var msg = new SpeechSynthesisUtterance();
              	msg.text = src;
              	msg.lang = "ja-JP";
              	msg.rate = 1.0;
              	msg.pitch = 0.8;
              	window.speechSynthesis.speak(msg);
            }
		}
		"""
	end
end

KinoHTML.Janken.new("じゃんけん、しよ")


```

以上。
Data Import Wizardmのエラー



+ [コミュニティの皆さん! データ インポート ウィザードを使用してデータをインポートしているときに、ルックアップ フィールドにアクセスできませんでした。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000WG0I)

:::note
こちらの記事をご確認ください。  

https://ideas.salesforce.com/s/idea/a0B8W00000GdgtaUAB/allow-the-import-wizard-to-import-into-a-lookup-field-on-standard-objects
:::



[Data Import Wizard | Error | Do not have sufficient permission to import custom objects](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000EoFeN)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2ae3995b-ed34-43be-24e0-3c00774eacc5.png)

エラーは、以前のモジュールを完了していないか、別のサンドボックス環境でそれらを完了したことが原因でした!

「このプロジェクトを実行する前に、出張承認アプリのデータ モデルの構築、出張承認アプリのユーザー インターフェイスのカスタマイズ、および出張承認アプリへのビジネス ロジックの追加プロジェクトを完了する必要があります。ここで行う作業は、このトレイルのすべてのプロジェクトで、必ず同じ Trailhead Playground を使用してください。"    

+ [Data Import Wizard](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epjynSAA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2b220fa5-3d3b-cc28-9fb2-d512750abbb3.png)

:::note
 I solved it by adding a table column on Google docs and was able to download the file as a CSV file.  
:::

+ [データインポートウィザードを使用した際に、既に存在するレコードであってもリードの所有者の情報が更新されてしまう](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000ldwv)

:::note
マッピングの中で所有者を指定していませんか？

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A90yOSAR

確認したところ、csvの時点で【リード所有者】の列を作成してしまっており、そのファイルをインポートしていたのが原因でした。

【リード所有者】列を空欄にしても所有者が更新されてしまうのですね。
:::

+ [【未解決】Got an unexpected error while processing BULK-API. Contact support with error ID: 1102765582-21637 (-1542308946)](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000NhjU)

+ [【未解決】Data importer is not showing up0](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000O2VZ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/aad7f9b9-8981-7439-6c60-5d951458d722.png)

+ [Can't load data import wizard in trailhead?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000mSEP)
+ [すべてのブラウザーを更新し、さまざまなブラウザー (Google Chrome、Mozilla Firefox、Microsoft Edge) を試してみましたが、セットアップのクイック検索バーからデータ インポート ウィザードを起動しようとするたびに、ランチャーが表示されるはずの場所に空白の領域しか表示されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000mWqS)

:::note
FIXED: Browser update solved the problem
:::

+ [Data Import Wizard won't load in trailhead Playground. Just a blank screen under the tabs.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J9Jd9)

:::note
FIXED: POST CREATOR: I created a new Playground environment and was then able to open the Data Importer. Luckily it was the first module in the course So I didn't have to redo any past modules.

TLDR: Create a new Playground and trash the old one. 
:::

+ [There was a problem uploading the CSV file. Try again or choose another file](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A94yZ)

:::note
I can upload csv file after switching to Classic.
:::
71歳の挑戦... ラズパイ pico2 購入。8bitパラレルTFTモジュールでの動作確認をしてみた

　「Raspberry Pi Pico 2」を購入しました。

【参考】

https://qiita.com/tanutanup/items/e0fa4a1d7be7490d93d5

https://qiita.com/Toshiaki0315/items/2240e6562cc31e88d580

 ヘッダーピンのはんだ付けも不安なので、TFT-LCDモジュールで動作確認しました。内容は以前の投稿

 https://qiita.com/Mobu_Kyoto/items/4970a3486d6798b45ab0

と全く同じでごめんなさい。
 （実は前回の内容が動作しなくなってたので、修正しておきました）
　念のために最低限の情報を示します。

:::note info
 １．3.95" 8bitパラレル接続のTFTディスプレイモジュール ILI9488 480x320
２．Raspberry Pi Pico2
３．TFT_eSPIライブラリ使用
４．ArduinoIDE -> File -> Examples -> TFT_eSPI -> 480x320 -> UTFT_Demo_480x320.ino を実行
:::
Arduino IDE 2.3.4 でのコードは全く同じで動作しました。それで、1ループ動作に要する時間は

|Pico w|Pico 2|
|------|-----|
|560msecs|340msecs|
|133MHz|150MHz|

動作周波数差以上の高速になってます。
　今回は写真も示さない簡単な文章のみの投稿で失礼します。
【Swift】型のキャストについて理解する

## はじめに
本記事では、型のキャストについて理解するために内容をまとめます。

## キャストとは
値の型を確認し、可能であれば別の型として扱う操作のことを**キャスト**といいます。
型のキャストは、Int型とAny型のように、クラスの継承やプロトコルの準拠などによって階層関係にある型同士で行います。

## アップキャスト
階層関係がある型同士において、階層の下位となる具体的な型を上位の抽象的な型として扱う操作を、**アップキャスト**といいます。

アップキャストを行うには、**as演算子**を使います。
左辺に下位の型の値を指定し、右辺には上位の型を指定します。

![スクリーンショット 2025-03-16 5.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/cf6a66a7-cca9-4837-ae59-661191d7f028.png)

上記の例では、String型をAny型にアップキャストし、その結果を定数に代入しています。
Any型はすべての型が暗黙的に準拠しているプロトコルであるため、すべての型はAny型にアップキャスト可能です。

![スクリーンショット 2025-03-16 5.50.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/386ca5b7-857c-4547-b19b-6c5cfaf08bb9.png)

右辺の型が左辺の型の上位互換でない場合、上記のようにコンパイルエラーとなります。

コンパイル可能なアップキャストは常に成功するため、変数や定数への代入時に暗黙的に行うことができます。
このような暗黙的なアップキャストでは、as演算子は必要ありません。

![スクリーンショット 2025-03-16 5.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/9e000229-ceab-4934-8898-c82655965635.png)

上記の例では、String型の値をAny型に代入することで、as演算子を使わず暗黙的にアップキャストを行なっています。

## ダウンキャスト
階層関係のある型同士において、階層の上位となる抽象的な型を下位の具体的な型として扱う操作を、**ダウンキャスト**といいます。
コンパイル可能なアップキャストは常に成功する操作でしたが、**ダウンキャストはコンパイル可能でも失敗する可能性があります**。

ダウンキャストを行うには、**as?演算子**、もしくは**as!演算子**を使用します。
それぞれの演算子の違いは、失敗時の操作にあります。
as?演算子は左辺の値を右辺の型の値にダウンキャストし、失敗した場合はnilを返します。
as?演算子の結果はキャスト先の型の値、もしくはnilとなるため、結果は**Optional型**となります。

※Optional型についてはこちらの記事でまとめています。
https://qiita.com/wano1101/items/6d2332c3755e84d41200

![スクリーンショット 2025-03-16 6.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/1e6855ac-ce8e-4014-be61-27220ba61dab.png)

上記の例では、Any型をString型とInt型にダウンキャストしています。
Any型にアップキャストする前の型はInt型であるため、Int型へのダウンキャストは成功し、その結果はInt?型のOptional(1)となります。
一方、Int型とString型の間に階層関係はないため、String型へのダウンキャストは失敗し、その結果はString?型のnilとなります。

as!演算子によるダウンキャストは**強制キャスト**といいます。
as!演算子は左辺の値を右辺の型にダウンキャストし、失敗した場合は実行時エラーとなります。

![スクリーンショット 2025-03-16 6.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/03d6ff7a-08d8-4820-b8b7-fd9a86dcc74c.png)

上記の例では、Any型の値をString型とInt型の値にダウンキャストしています。
Int型へのダウンキャストは成功し、その結果はInt型の1となります。
一方、String型へのダウンキャストは失敗し、実行時エラーとなります。

## 型の判定
キャストによって別の型として扱う必要はなく、単にある値の型が特定の型であるかどうかを確認したい場合には、**is演算子**を使います。
is演算子は左辺に値、右辺に型を取り、値が対象の型かどうかをBool型の値として返却します。

![スクリーンショット 2025-03-16 6.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/2af95d53-d9f9-4e51-ae26-7b1355522550.png)

## まとめ
- 値の型を確認し、可能であれば別の型として扱う操作のことを**キャスト**という
- 階層の下位となる具体的な型を上位の抽象的な型として扱う操作を**アップキャスト**といい、**as演算子**を用いる
- 階層の上位となる抽象的な型を下位の具体的な型として扱う操作を**ダウンキャスト**といい、**as?演算子**、もしくは**as!演算子**を用いる
- as?演算子はダウンキャスト失敗時にnilを返し、as!演算子は**強制キャスト**を行うため失敗時はコンパイルエラーとなる
- **is演算子**h、値が対象の型かどうかをBool型の値として確認できる
初心者向けおすすめクラウドサービスまとめ🎉

## はじめに
初心者がWebサービスやアプリ開発を始めるとき、クラウドサービス選びって結構迷っちゃいますよね！今回は初心者さんでも楽しく簡単に使えて、ドメインもデータベースもバッチリなクラウドサービスをピックアップしてご紹介します🌟

## 1. AWS（Amazon Web Services）

### 特徴
- 世界中でめちゃくちゃ人気なクラウドサービス！
- 初心者さんにも使いやすいサービスが盛りだくさん✨

### おすすめサービス
- **AWS Amplify**：認証とかAPIがサクッと追加できちゃう！
- **AWS Lightsail**：ポチッとするだけでアプリがスタート！

### ドメインとDB
- **ドメイン**：Route53
- **DB**：RDS、DynamoDB

### こんなWebサービスにおすすめ！
- SNSやコミュニティサイト（ログイン機能付き）
- おしゃれな小さめのネットショップ
- 手軽なAPIサーバー

## 2. Google Cloud Platform（GCP）

### 特徴
- UIが直感的で初心者にもやさしい💕
- Googleのサービスとめっちゃ相性良し！

### おすすめサービス
- **Firebase**：リアルタイムデータベースや認証が簡単🎈
- **Cloud Run**：サーバーレスでサクッとデプロイ！

### ドメインとDB
- **ドメイン**：Google Domains
- **DB**：Firestore、Cloud SQL

### こんなWebサービスにおすすめ！
- チャットやライブで更新されるサービス
- 掲示板やSNS、ニュースフィード
- オシャレなSPA（シングルページアプリ）

## 3. DigitalOcean

### 特徴
- UIがシンプルで迷わない👍
- コスパ最高な環境が魅力！

### おすすめサービス
- **App Platform**：気軽にWebアプリをポンっとデプロイ！
- **Droplets**：自分好みに環境をセットアップ🌱

### ドメインとDB
- **ドメイン**：DigitalOceanのドメイン管理
- **DB**：Managed Databases

### こんなWebサービスにおすすめ！
- ブログやWordPress、CMS（コンテンツ管理システム）
- スタートアップのWebサービスや個人プロジェクト
- 簡単なAPIを作りたいとき

## 4. Render

### 特徴
- とにかく手軽で高速なデプロイができる！
- 無料プランが充実していて初心者に優しい😆

### おすすめサービス
- フルスタックのアプリをサクッと公開

### ドメインとDB
- **ドメイン**：Render管理機能
- **DB**：PostgreSQL（無料プランあり）

### こんなWebサービスにおすすめ！
- 自分だけのポートフォリオサイト
- 小規模アプリやプロトタイプを作りたいとき
- DjangoやRailsで手早く公開したい人

## 4. Supabase

### 特徴
- Firebaseのオープンソース版で自由度◎
- SQLをガッツリ使えるから本格的な開発もOK！

### おすすめサービス
- SQLベースでバックエンドを楽々構築！

### ドメインとDB
- **ドメイン**：Supabaseのドメイン管理
- **DB**：PostgreSQL

### こんなWebサービスにおすすめ！
- データ分析が得意なサービスを作りたい！
- 本格的なデータベース連携が必要なアプリ
- 業務用の管理ツールや本格的なWebアプリ

## まとめ✨初心者に最適な選び方はこれで決まり！

| こんなあなたにピッタリ      | 推奨クラウドサービス          |
| ---------------- | ------------------- |
| AWSを気軽に楽しみたい🎈 | Amplify、Lightsail |
| Googleが大好き💕 | Firebase、Cloud Run |
| コストを抑えて気軽に始めたい💰 | Render、DigitalOcean |
| 本格SQLを楽しみたい✨ | Supabase |

ぜひ、自分の「これだ！」に合ったクラウドサービスを見つけて、ワクワクするWebサービス開発をスタートしちゃいましょう🎉

## 最後に

この記事が役に立ったら、ぜひ「LGTM」してくれると嬉しいです！ 💖
では、また次回の記事でお会いしましょう👋
Laravel + React(Inertia)をDevContainer + Xdebug + PHP Intelephense + ホットリロードで超快適に開発できるようにした。

# 概要
Laravel + React(Inertia)の雛形として作成しました。
DevContainerでローカル環境構築を容易にし、コード品質を担保するためにフォーマッタやリンティングの設定を盛り込んでいます。

# アーキテクチャ
LaravelのよくあるMVC + Service + Repositoryのパターンで作ってあります。
# アピールポイント
VsCode前提なので無料!!!!
DevContainerなので環境構築が容易
フロントのホットリロード
Xdebug導入によりデバッグが容易に！
PHP-CS-FixerとPHP Intelephenseを導入
PrettierとEslintを導入
# ローカル環境構築手順
1. Dockerをインストール
2. VsCodeをインストール
3. VsCodeの拡張機能にDevContainersをインストール
4. プロジェクトルート直下と.devcontainerディレクトリ内に.envを作成
```bash
cp .env.sample .env
cp .devcontainer/.env.sample .env
```
5. ソースをクローン<br>https://github.com/shrimptails-f/laravel_service_repository
6. Ctrl Shift Pでコマンドパレットを開く<br>
7. DevContainer:Reopen in Containerを
押下

# 最後に
後発者の方々の参考になれば幸いです。
オフラインモードが利用できるWebサービスを作成できるクラウドサービスまとめてみた

## はじめに

こんにちは、今回は「オフラインモード」が利用できるWebサービスを作成できるクラウドサービスをご紹介します✨

「オフライン対応」と言っても、どんなサービスに向いているのか気になりますよね。そこで今回は、特徴とともにどんなWebサービスにピッタリなのかを深掘りしてご紹介します！

## 📌1. Firebase（Google）

- **特徴**
  - NoSQL型のデータベース（Firestore、Realtime Database）を利用可能
  - オフラインキャッシュが標準搭載されていて、簡単にオフライン対応ができます
  - モバイルアプリとの相性が非常に良い

**向いているWebサービスの例**
- メッセージアプリやチャットツール
- タスク管理アプリ
- ショッピングリストなどの日常系アプリ

## 📌2. AWS Amplify（Amazon）

- **特徴**
  - SQL型（Amazon RDS）またはGraphQL（AWS AppSync）データベースが利用可能
  - Amplify DataStore機能によりオフライン対応が簡単
  - スケーラブルなバックエンド構築が可能

**向いているWebサービスの例**
- 大規模な業務管理アプリケーション
- オンライン教育プラットフォーム
- リアルタイム更新が必要な業務システム

## 📌3. Supabase

- **特徴**
  - PostgreSQLベースのオープンソースデータベースを採用
  - SQLで柔軟なデータ管理
  - オフライン対応がシンプルに実装可能

**向いているWebサービスの例**
- オフライン対応のECサイト
- データを頻繁に更新・同期するような社内ツール
- オフライン対応のブログやメディア

## 📌4. Appwrite

- **特徴**
  - オープンソースで自由なカスタマイズが可能
  - セルフホスティングで完全に独自運用できる
  - SQL型データベースを採用

**向いているWebサービスの例**
- カスタマイズ性の高いコミュニティサイト
- プライバシーやセキュリティを重視したサービス
- 自由度が必要な社内業務システム

## まとめ

いかがでしたか？
初心者でも安心して始められるこれらのサービスで、あなたの作りたいWebサービスをオフライン対応でさらに便利にしましょう！
目的や用途に合わせて最適なクラウドサービスを選んでみてくださいね🎉

| サービス名         | おすすめ度 |
|-----------------|-----------|
| Firebase        | ⭐⭐⭐⭐⭐     |
| AWS Amplify     | ⭐⭐⭐⭐☆     |
| Supabase        | ⭐⭐⭐⭐☆     |
| Appwrite        | ⭐⭐⭐☆☆     |

## 最後に

この記事が役に立ったら、ぜひ「LGTM」してくれると嬉しいです！ 💖
では、また次回の記事でお会いしましょう👋
JAWS-UG札幌でマルチテナントSaaSのお話してきたよ。

## はじめに

2025/03/14に「第41回 JAWS-UG札幌 勉強会」でマルチテナントSaaSをテーマに登壇してきたことを記事に残しておきます！

https://jawsug-sapporo.connpass.com/event/343883/

現地で聞いてくださった皆様、ご清聴ありがとうございました！

## 登壇資料はこちら。

結果、難しいよね。っていうあまりに為にならない資料です。。

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/K3GNGP/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/moriyama/K3GNGP-2025-03-16-040820">マルチテナントSaaSを正しく作りたい！ by @moriyama</a></div>

余談ですが、

GoogleスライドのPDFエクスポート時に発生するフォント変更やレイアウト崩れに少し困ってたのですが、pptxにエクスポートし、KeynoteアプリでPDF化すると問題ないですね！

あと、QiitaがドクセルのPDF埋め込みに対応してるのも今回知れてよかったです。

## 頂いたフィードバック

登壇後に懇親会等でいくつかフィードバックを頂いた中で、宿題になりそうなところをいくつか備忘録として残しておきます。

### オライリー本良かったですよ！

この本をおすすめしてくれました。（違ってたらごめんなさい。）

https://www.oreilly.co.jp/books/9784814401017/

今回、AWSの公開資料（ブログ、Youtube）のみでしか勉強していないので、読んでみたいなと思いました。

> 実践的なテクニックなど、総合的なノウハウをまとめ、ベストプラクティスとパターンに沿った効率的な開発を提案しています。

魅力的です・・・！
職場に１冊あれば、チーム全体の知識向上に役立ちそうです。

### 意図せぬクロスマルチテナントアクセスの監視をどうするの？

システムのモニタリング・オブザーバビリティ観点でどうやって、クロスマルチテナントアクセスを検知する方法があるか？の質問をいただきました。

意図せぬクロスマルチテナントアクセスでデータが取得できてしまった場合、システムエラーにはならないと思うので、どうやるのか確かに難しい・・・。

誰がどこへアクセスしているか？の監査ログのようなものを出力すれば実現はできそうですが、もっと効率良さそうな方法がありそうな気もします・・・！

### 最後に

懇親会含めて、本当に参加して良かったと思う勉強会でした！

私の登壇内容へのフィードバックを頂いたり、気になる企業様の取組みや他の登壇者様の発表内容も色々とお話しさせて頂いて、とても勉強になることが多く、楽しかったです。

楽しいお話とお酒のセットは最高ですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/23f42271-b66c-4005-b387-0aac3a98bc2d.png)
036 AI屋さんの　マルチモーダル出力　LLMにトークン全文入力　GEMINI2.0公開


036 AI屋さんの　マルチモーダル出力　LLMにトークン全文入力　GEMINI2.0公開


画像生成は、一般公開ですね。
音声合成は、まだかな。

画像の保存は若干ややこしいですが、
しばらくすれば、情報も増えそうです。

　AI studio　では日本語で画像生成できますが
　API経由だと　英語(?)のみです。
　でもAPI経由で　日本語も画像生成できた？
 
　chunk.candidates[0].content.parts[0].inline_data.dataを
　base64からバイナリに変換してpngファイルとして保存

　規制が厳しい(?)ので、風景専門です。
 

まあ、これからですね。
思った通りの画像生成出来るまでには、
手綱捌きが難しそうです。
ハズレが続くと、試行錯誤のコストが心配です。


https://developers.googleblog.com/en/experiment-with-gemini-20-flash-native-image-generation/

---

これで日本語対応と言えるか？


![ENTER_FILE_NAME005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/15093a9c-32dc-43e2-a35d-6b2e0abb7e50.png)


エージェントさんにも聞いてみた。





![Screenshot_20250316-042551.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/cfd6596f-e99a-4e48-89f9-ab224593f6c5.jpeg)







---


![スクリーンショット 2025-03-15 22.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/d9614a20-dece-4451-9723-862cf076ee9f.png)



画像ファイルに無事保存完了です。
細かなコードは、エージェントさんが教えてくれます。
自ら検索キーワードを生成して、
自動で検索した結果から、
複数のサイトを開いて全部読み込んで
その内容も踏まえて、大規模言語モデルが回答してくれます。
勝手にググるエージェントLLMは、本当に便利です。

![スクリーンショット 2025-03-15 22.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/9179525b-be64-4511-b4c3-15ebd3120498.png)



![ENTER_FILE_NAME006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/d1fd4af7-34fe-40a6-beb1-70b8ee2ef386.png)


動物も得意っぽいです
![ENTER_FILE_NAME010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/a70db710-7cc9-4a8f-bafa-f7e0cfd40227.png)

日本語プロンプト
"画像生成、イラスト、水彩風、廃墟,　高層マンション、ニューヨーク、マンハッタン、セントラルパーク、自由の女神、  **背景:** 窓が開け放たれた明るい部屋で、キラキラと舞うホコリ"


![a001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/45db12bb-6f2c-477b-8d03-497c3d9cf5e0.png)


全文入力済み「吾輩は猫である」LLM に
小説の内容にあった雰囲気の
画像生成用のプロンプトを作ってもらって、
小説の装丁・挿絵を画像生成してみます。

![a002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/8b0345be-eff9-4143-be4a-fb11c5366ac1.png)




---


目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7



今回も無事にwebAPI経由で画像を作成できました。

　保存もできました。
　次回は実装編です。

おめでとうございます。








ー続くー
【Rails】超初学者が学んだ　マイグレーションの `up` と `down`

# 【Rails】マイグレーションの `up` と `down` とは？ 〜初心者でも分かる！〜

## 📝 マイグレーションって何？

こんにちは。
子育て中の現役看護師で、エンジニア転職を目指してRuby on Railsを勉強しています。
今回は、Rails の **マイグレーション（Migration）** の `up` と `down` について学びました。
マイグレーションとは、**データベースの構造を変更するための仕組み** です。
例えば、「新しいカラムを追加したい」とか「カラムを削除したい」というときに使います。
その中でも、**`up` と `down` を使うマイグレーション** についてです。

---

## 🎢 `up` と `down` の考え方

マイグレーションは **「積み木」** みたいなもの。

1. **`up` は「積み木を積む」** 
   - 例えば、**新しいカラムを追加** したり、**テーブルを作成** したりします。
   - 「ここに新しい箱を追加する」というもの。
   - 

2. **`down` は「積み木を元に戻す」** 
   - `up` で追加したものを **なかったことにする** ための処理。
   - 「この箱、やっぱりいらないから戻したい」というもの。

---

##  `up` と `down` を使ったマイグレーションの例

例えば、`articles` テーブルから `content` カラムを削除するマイグレーションを作りたい場合、
次のように表す。

```ruby
class RemoveContentFromArticles < ActiveRecord::Migration[6.0]
  def up
    remove_column :articles, :content, :text
  end

  def down
    add_column :articles, :content, :text
  end
end
```

このマイグレーションでは、
- `up` → `content` カラムを **削除** する。
- `down` → `content` カラムを **元に戻す（追加する）**。

という動きとなる。

---

## 🚀`up` と `down` を使うメリット

✅ **すぐ戻せる**
   - `rails db:rollback` を実行すると、`down` の処理が実行される。
   -  **削除したカラムを元に戻せる**

✅ **「新しい変更」と「元に戻す変更」の両方が記載可能となる**
   - どんな変更をしたのか分かりやすくなる。

✅ **手動で戻せない変更にも対応可能となる**
   - `change` では戻せない複雑な変更も `up/down` を使えばいいとのこと。

---

## 🔄 `change` との違い

`up/down` の代わりに `change` という方法がある。

```ruby
class RemoveContentFromArticles < ActiveRecord::Migration[6.0]
  def change
    remove_column :articles, :content, :text
  end
end
```

`change` を使うと、「元に戻す処理（down）」を行ってくれる。
Rails が **自動で戻せない** 変更もあることから、`up/down` を書くほうが安全なときもある。

---

## 簡単に言うと

✅ **`up` は「新しい変更」**
✅ **`down` は「元に戻す」**
✅ **簡単な変更なら `change`**

-----


初学者のため、間違えていたらすいません。
また何か学んだら記事にします。
Node.jsのノンブロッキングとは？非同期処理の力

## はじめに

Node.jsを使っていると、「ノンブロッキング」「非同期」といった言葉をよく目にします。これらの言葉、特に「ノンブロッキング」って何だろう？と思うかもしれません。

結論から言うと、「ノンブロッキング」は、<b>I/O操作（入力/出力操作）を非同期的に処理する仕組み</b>のことで、Node.jsは他の処理を待つことなく並行して動き続けることができる！

今回は、ノンブロッキングについて備忘録として軽く説明載せます。

## 目次

1. [ブロッキングとノンブロッキング](#-ブロッキングとノンブロッキング)
2. [ノンブロッキングのメリット](#-ノンブロッキングのメリット)
3. [イベントループと非同期処理](#-イベントループと非同期処理)
4. [ノンブロッキングのリアルな例](#-ノンブロッキングのリアルな例)
5. [まとめ](#-まとめ)

## 🧷 ブロッキングとノンブロッキング
まずは「ブロッキング」と「ノンブロッキング」の違いを簡単におさらいです。

### ブロッキング
一般的なプログラミング言語では、<b>ブロッキング（同期）処理</b>が基本です。

例えば、ファイルを読み込むとき、プログラムはその読み込みが<b>完了するまで次の処理を進めません。</b>

```js
const fs = require('fs');

const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
console.log('次の処理');
```
✅ このコードは、readFileSyncがファイルを読み込んで完了するまで、プログラムが一時停止します。ファイルが読み込まれるまで、次のconsole.logは実行されません。

✅ これが<b>ブロッキング（同期）処理</b>です。

### ノンブロッキング
一方で、Node.jsは<b>ノンブロッキング（非同期）</b>で動作します。

つまり、I/O操作を行っている間でも、<b>他の処理がブロックされることなく進み続けるわけです☀️</b>
```js
const fs = require('fs');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

console.log('ファイルを読み込んでいます...');
```
✅ このコードでは、readFileは非同期でファイルを読み込みます。
✅ readFileが完了するまで待つのではなく、すぐに次の行`console.log('ファイルを読み込んでいます...')`が実行される。
✅ ファイルの読み込みが完了した時点でコールバック関数が呼ばれ、読み込んだ内容が表示される。

## 🧷 ノンブロッキングのメリット
ノンブロッキング処理の最大の利点は、<b>高いパフォーマンスを実現できる</b>点です。
特に、I/O操作が多いアプリケーション（例：ウェブサーバーやリアルタイムチャットアプリなど）で効果を発揮します。

例えば、従来の同期処理では、サーバーが一つのリクエストを処理している間は他のリクエストを待たせる必要があります。

ですが、ノンブロッキング処理を使うことで、サーバーは<b>リクエストを処理している最中でも他のリクエストを並行して処理できます。</b>

これにより、Node.jsは非常にスケーラブルで、同時に多数のリクエストを処理することが可能になります。

## 🧷 イベントループと非同期処理
Node.jsがノンブロッキングを実現できる理由は、<b>イベントループ</b>という仕組みです。

* イベントループ：<b>Node.jsが内部で非同期処理を行うための中心的なメカニズム</b>

非同期のI/O操作はすべてイベントループに渡され、I/O操作が完了すると、Node.jsはコールバック関数を呼び出して処理を続けます。

イベントループのおかげで、Node.jsはI/O待ちの間に他の処理を並行して実行できるのです。

## 🧷 ノンブロッキングのリアルな例
```js
const http = require('http');

const server = http.createServer((req, res) => {
  if (req.url === '/') {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello, World!\n');
  } else if (req.url === '/slow') {
    setTimeout(() => {
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end('This is a slow response\n');
    }, 5000);  // 5秒後にレスポンス
  }
});

server.listen(3000, () => {
  console.log('Server is running on port 3000');
});
```
✅ このサーバーは、/slowのリクエストを5秒待たせますが、その間にも他のリクエストはすぐに処理されます。

✅ ノンブロッキングの力を活かして、長時間待つことなく、サーバーはどんどんリクエストを処理し続けます。

## 💫 まとめ
* Node.jsの「ノンブロッキング」とは、I/O操作を非同期で行うことで、プログラムが他の処理を待たずに並行して実行できる仕組み
* これにより、Node.jsは高いパフォーマンスとスケーラビリティを持ち、多数のリクエストを効率よく処理できる。

✅ ノンブロッキングの仕組みを活かすことで、特にリアルタイムアプリケーションや大規模なウェブサービスで圧倒的な力を発揮します。

Node.jsを使っているなら、この非同期処理の特徴をしっかり理解して活用するべし🚀
Tableauを使ってみた

はじめまして。
新人システムエンジニアのakindです。

元々はPythonで自然言語処理やデータ分析を学習してデータサイエンティストを目指していましたが、あえなく挫折。今はSIerでネットワーク系のシステムエンジニアとして働いています。
職場の先輩の勧めもあり、最近はTableauの学習に力を入れてます。

そんな中、統計学入門(東京大学出版)を学習している際に出てきた課題を「Tableauでビジュアライズしたら面白いんじゃね？」
と思い立ったので記事にしてみようと思います。
小難しいテクニックは使わずシンプルなVizになりましたので少し紹介をしてみようと思います。
(「使えへんだけやろ？」とか言わないで)

https://www.utp.or.jp/book/b300857.html

↓↓Vizのリンク
https://public.tableau.com/views/5_17403176927230/sheet0_1?:language=ja-JP&:sid=&:redirect=auth&:display_count=n&:origin=viz_share_link

![明治以降の人口動態.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037041/3f5578f3-bb08-4a77-b06f-24fd44d7fb33.png)

「明治以降の人口動態について調べる」という内容の課題だったので統計局のデータを手入力してスプレッドシートに打ち込んでデータセットを作成し、Tableauで加工しました。
(データは5年刻みで作成しています。)

左の図はシンプルに棒グラフを作成し、人数の多い・少ないで色分けをしています。

右の図は出生者数と死亡者数を累計グラフ(エリアチャート)にし、それぞれを二重軸にすることで実現しています。

こうして見てみると近年では出生者数が死亡者数を下回っていることが浮き彫りになって面白いですね。

1945年は第二次世界大戦、原子爆弾の投下が行われた影響なのか昭和時代で唯一死亡者数が出生さ数を上回っています。


また、現在学習している計量経済学や社会系の統計学でもこうしたVizを用いて説明ができると学習もより楽しくなるのではないかと考えているので、さまざまな課題にトライして随時発信してみようかなと思います。

ここまで読んでくださり、ありがとうございました。
生成AIのプロンプトテクニック6選

# 目的
この記事の目的は、学んだテクニックをアウトプットして理解を深めることです。
# 背景
最近仕事で生成AIの案件に入り、プロンプトのテクニックを学んだため、今後の開発業務でも生成AIを使えるように、この機会にプロンプトのテクニックをおさらいします。
# テクニック
### 1. 出力例を提示する
概要：出力例を情報として与える
目的：出力形式を指定して見やすくする、質問に対しての考え方を学習させる
具体例
```
効率良くダイエットするにはどこの筋肉を鍛えたほうが良いか教えてください。 
# 具体例
部位：太もも
理由：筋肉が大きいので基礎代謝量を増やすから
具体的なメニュー：スクワット
```

### 2. 役割を与える
概要：AIに役割を与える
目的：求めている回答を得るため、AIに対して何をしてほしいかを明確にする
具体例
```
私は3ヶ月で10キロ体重減らしたいと思っています。
あなたのタスクは私が3ヶ月で10キロ体重を減らすことができるようなトレーニングメニューを考えることです。
```

### 3. 段階的推論（CoT方式）
概要：回答をステップに分けて出力させる
目的：ステップに分けることで、論理的に回答を生成させる
具体例
```
私は3ヶ月で10キロ体重減らしたいと思っています。
あなたのタスクは私が3ヶ月で10キロ体重を減らすことができるようなトレーニングメニューを考えることです。

1. 一般的に標準的な体型の定義を教えてください。
2. 以下に私の体型の情報を記載するので、`1`で出力した内容と比べてください。
3. 比べた結果、ダイエットした方が良いか教えてください。
```

### 4. マークダウン記法
概要：単なる文章ではなく、マークダウン形式で質問する
目的：AIに理解しやすい記法で書くため
具体例
```
<!--「#」を使用-->
# 私は3ヶ月で10キロ体重減らしたいと思っています。
# あなたのタスクは私が3ヶ月で10キロ体重を減らすことができるようなトレーニングメニューを考えることです。

<!--数字のリストを使用-->
1. 一般的に標準的な体型の定義を教えてください。
2. 以下に私の体型の情報を記載するので、`1`で出力した内容と比べてください。
3. 比べた結果、ダイエットした方が良いか教えてください。
```

### 5. わからないことは逆質問させる
概要：こちらの質問で理解できない部分があれば聞くように記載
目的：曖昧な回答や予測で回答するのを防ぐ
具体例
```
効率良くダイエットするにはどこの筋肉を鍛えたほうが良いか教えてください。
また、私の体型は一般的に標準的な体系を比べてください。
わからないことは聞いてください。
```


### 6. 外部情報を渡す
概要：回答してほしい内容に関する情報として参考サイトのURLを貼る
目的：目的モデルの学習データにないものを答えさせる
具体例
```
https://www.med.or.jp/forest/health/eat/11.html
上記から20代男性の標準体型を教えてください。
```


参考
https://qiita.com/kouz496/items/adcf8c4dfabf192e1d34
プッシュ通知のAndroid側の実装

最近プッシュ通知処理関連のトラブルがありましたので、改めてAndroidで行う通知の実装をまとめる。

- `Firebase`から発行した`google-services.json` を app/ フォルダに内包させる


```gradle
buildscript {
    dependencies {
        classpath 'com.google.gms:google-services' // バージョンは最新のものを使用
    }
    repositories {
        google()
    }
}
```

```gradle
dependencies {
    implementation 'com.google.firebase:firebase-bom'
    implementation 'com.google.firebase:firebase-messaging-ktx'
    // バージョンは最新のものを使用
}
```
プロジェクトレベル、アプリレベルのgradleに上記依存関係を追加します。


```xml
<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<!-- 通知の権限 (Android 13+) -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
```
Manifestにはサービスを登録する。OS13からは通知許可がいるので、権限も追加する。



```kotlin
class MyFirebaseMessagingService : FirebaseMessagingService() {
    
    // 通知を受信したときの処理
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        remoteMessage.notification?.let {
            sendNotification(it.title ?: "通知がきました。", it.body ?: "メッセー")
        }
    }

    // 新しいトークンが生成されたときの処理
    override fun onNewToken(token: String) {
        Log.d("FCM", "新しいトークン: $token")
        // トークンをサーバーに送信する
    }

    // 通知を作成して表示する
    private fun sendNotification(title: String, messageBody: String) {
        val channelId = "default_channel"
        val intent = Intent(this, MainActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
        }
        val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)

        val notificationBuilder = NotificationCompat.Builder(this, channelId)
            .setSmallIcon(R.drawable.ic_notification)
            .setContentTitle(title)
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setContentIntent(pendingIntent)

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(channelId, "Default Channel", NotificationManager.IMPORTANCE_HIGH)
            notificationManager.createNotificationChannel(channel)
        }
        notificationManager.notify(0, notificationBuilder.build())
    }
}
```
`onMessageReceived()`は通知を受け取った時に走る処理です。
`onNewToken()`新しいトークンが発行された時に呼ばれます。トークンは定期的に変わることがあるため、サーバーに最新のトークンを送る処理を入れます。
`sendNotification()`通知を作成、表示させます。上記はサンプルコードで、カスタムすることで任意の通知をユーザーに表示させます。`sendNotification()`を`onMessageReceived()`内で呼び出すと、アプリがフォアグラウンドの時にも通知を表示できます。


#### 参考

https://qiita.com/ryo_mm2d/items/77cf4e6da7add219c75c
シェルスクリプトでechoを使うな

:::note warn
シェルスクリプト弱者クソザコナメクジによる記事です。
優しい目で見てください。
:::

文字列をbase64しようとしただけなのに、無駄にハマってしまった。
結論としては、 `echo` の環境/シェルの違いによるものであった。
人類は、もう二度とこんな時間の失い方をしてはならないと思うので、ここにメモする。

# in a nutshell

`echo` は利用するシェルによって挙動が異なるので、移植性を考慮する必要がある場合、printfを使うべき。

例えば文字列をBase64符号化しようとしたときに以下の通り。

```bash
# だめ（環境、シェルによって違う挙動をするため）
   echo hoge | base64

# よい（比較的ポータビリティに優れるため）
   printf hoge | base64
```

# シェルスクリプトで `echo -n hoge | base64` して謎の挙動に惑わされた話

Basic認証のAPIを叩く野暮用があった。

シェルスクリプトをサクッとmacで書いて、パパっとRaspberry Piに置いておこうと思っていた。Basic認証ヘッダを組み立てるにあたり、ユーザ名及びパスワードをBase64エンコーディングする必要がある。

まず、直接curl が動作することを確認する。

```zsh
# macOS sequoia(15.3.1), zsh
$ USER="hoge"
$ API_KEY="XXX"
$ curl -H "Authorization:Basic \
  $( \
    echo -n ${USER}:${API_KEY} | \
    openssl base64\
  )" \
  "https://example.com/exampleApi"
```

問題なく動作したので、以下のシェルスクリプトを用意した。

```bash:test.sh
#!/bin/bash
USER="hoge"
API_KEY="XXX"
curl -H "Authorization:Basic \
  $( \
    echo -n ${USER}:${API_KEY} | \
    openssl base64\
  )" \
  "https://example.com/exampleApi"
```

しかし、何故か `Invalid Authenticate` を返す。

なぜでしょうか？

## 切り分ける

Base64文字列部分を検証していく。

```bash:test.sh
#!/bin/bash
HOGE="hoge"
echo $(echo -n ${HOGE} | base64)
```

実行結果↓

```zsh:実行結果
# macOS sequoia(15.3.1), zsh
$ sw_vers
ProductName:		macOS
ProductVersion:		15.3.1
BuildVersion:		24D70

# 実行(1)
$ echo -n "hoge" | base64
aG9nZQ==

# 実行(2)
$ sh test.sh
LW4gaG9nZQo=
```

```bash:実行結果
# Raspberry Pi / Debian 12
$ cat /etc/issue.net
Debian GNU/Linux 12

# 実行(3)
$ echo -n "hoge" | base64
aG9nZQ==

# 実行(4)
$ sh test.sh
aG9nZQ==
```

mac で、シェルスクリプト経由のとき(`実行(2)`)のみ結果が異なっている。
ちなみに`LW4gaG9nZQo=` はデコードすると`-n hoge`なので、echoの`-n` オプションの挙動がおかしそうである。

実行するシェルによって動作が異なるのだろうか？
shebang(`#!/bin/bash`のところ)は意味が無いのであろうか？

さらに切り分ける。

```bash:test2.sh
#!/bin/bash

# 実行シェル確認
echo $SHELL

# ためしてみる
HOGE="hoge"
echo -n "echo -n \$HOGE | base64: "
echo $(echo -n ${HOGE} | base64)
```

```zsh:実行結果
# macOS sequoia(15.3.1), zsh

# bashで実行　=> zsh!?　結果はOK
$ bash test2.sh
/bin/zsh
echo -n $HOGE | base64: aG9nZQ==

# zshで実行 => 結果OK
$ zsh test2.sh
/bin/zsh
echo -n $HOGE | base64: aG9nZQ==

# shで実行 => zsh!?　echoの-nが聞いてない!?　結果もグチャグチャおかしい!?
$ sh test2.sh
/bin/zsh
-n echo -n $HOGE | base64:
LW4gaG9nZQo=E | base64:

# 直接実行 => shebangが無視されてzsh!? 結果はOK
$ chmod +x test2.sh
$ ./test2.sh
/bin/zsh
echo -n $HOGE | base64: aG9nZQ==

# sourceで実行＝現在実行中のシェル環境(zsh)で実行された。結果もOK
$ source test2.sh
/bin/zsh
echo -n $HOGE | base64: aG9nZQ==
```

さて、なぜでしょうか？どうすればいいでしょうか？

## `echo`の挙動は環境によって異なり、ポータビリティ(移植性)の問題がある

詳細は以下記事に詳しい。

https://fumiyas.github.io/2013/12/08/echo.sh-advent-calendar.html

https://mattintosh.hatenablog.com/entry/2013/12/11/201503

* OS、`echo`の実装により、エスケープシーケンスの解釈や、`-n`オプションの有無が異なる
* shebang を指定していたとしても、実体が何かは環境による

ということがわかった。

## どうすればいいか？

`printf`が移植性の観点では良い。

```
# macOS sequoia(15.3.1), zsh
$ echo $(printf hoge | base64)
aG9nZQ==

$ cat test.sh
#!/bin/bash
HOGE="hoge"
echo $(printf ${HOGE} | base64)

$ sh test.sh
aG9nZQ==
```

めでたしめでたし。

# 補足

実際には、printf にも稀に移植性の問題があるので注意してください。

また、歴史的経緯などの詳細が知りたい方は、以下の記事がおすすめです。

https://qiita.com/ko1nksm/items/a1dcf6cbb84e50520eee
[poem]話の送り仮名[joke][Python]

「話の送り仮名」
「話」を「話し」と書いてはならない。なぜなら、
話＝話し　だと、
話し＝話しし
話しし＝話ししし
話ししし＝話しししし
・
・
・
となって、無限に長い話となってしまうからである。

##### コード

```hanashi.py
#!/usr/bin/python3
s="話"
cnt=0
while True:
    print(f"{s+"し"*cnt}={s+"し"*(cnt+1)}")
    cnt+=1
```

##### 実行

```
$ head t
話=話し
話し=話しし
話しし=話ししし
話ししし=話しししし
話しししし=話ししししし
話ししししし=話しししししし
話しししししし=話ししししししし
話ししししししし=話しししししししし
話しししししししし=話ししししししししし
話ししししししししし=話しししししししししし
(略)
```
EC2とEBSをセットで一覧表示

# よくあるケース

EC2を中心としたAWS環境を運用管理していると、以下のような質問をされることがあります。

**「このサーバーって、何GBのディスクが何個ついているの？合計何GBなの？」**
**「他のサーバーはどう？全サーバーとも教えてほしいんだけど、Excelでちょうだい。」**
**「この500GBのディスクって、HDD？SSD？」**

オンプレでよくあった質問ですが、クラウドでもよくあったりします。

AWSマネージメントコンソール（マネコン）で、EC2とそれにアタッチされたEBSの情報を取得しようとすると、EC2インスタンスごとには確認できますが、サーバー数が多いと急に困ってしまいます。
また、EC2に複数のEBSがアタッチされている場合、マネコンではその合計容量が表示されることもありません。
さらに、マネコンではExcelでダウンロードできる機能もありません。

# デモページ

この問題を解決するために、EC2とEBSをセットで一覧表示するWebページを作成してみました。

以下がそのデモページです。
このデモでは、各EC2と、それにアタッチされたEBSのサイズやタイプを一覧で表示することができます。
また、一覧データをExcel形式でダウンロードする機能もあります。

https://demo-aws-lambda-describe-api.s3.ap-northeast-1.amazonaws.com/web/demo-ec2-ebs.html

## デモページの動作

以下の流れで動作します。

1. 静的Webサイト（HTMLとJavascript）がWebブラウザに読み込まれます
2. Javasciprtにより右記の2つのAPIが呼び出されます。```EC2:DescribeInstances```, ```EC2:DescribeVolumes```
3. APIの先では、AWS Lambda関数を実行する処理があり、AWS APIの結果がJson形式でWebブラウザに返ります
4. Webブラウザ上（クライアントサイドのプログラム）で、EC2とEBSを結合させたデータを作成します
5. 結果を一覧表示します
6. Execlダウンロードのボタンを押すと、一覧表示された内容がExcelファイルでダウンロードされます

### デモページで表示される列

EBSタイプをグループ化しています。

- 汎用 SSD (gp2, gp3)
- Provisioned IOPS SSD (io1, io2)
- HDD (st1, sc1)

に分けて表示します。

EBSタイプの Volumeの列では、```VolumeID (EBSのNameタグ)``` あるいはNameタグが無い場合は ```VolumeID (デバイス名)``` を表示します。

### デモページでの制限事項

デモのためというのもあり、以下は考慮されていません。
実装次第で対応可能です。

- io2 Block Expressの表示
- インスタンスストアの表示
- マルチアタッチされたボリュームの考慮
- マルチリージョン（デモは単一リージョン）
- マルチアカウント（デモは単一アカウント）

# 構築方法

## 「describe-api」の利用

このデモは、別のの記事で紹介したAWS Lambda関数「describe-api」を活用しています。​
「describe-api」は、URLパラメータを組み合わせることでAWSのAPIを呼び出し、その結果をWebブラウザに返すLambda関数です。
これにより、マネコンにログインせずとも、Webブラウザ上でAWSの情報を取得することが可能となります。

https://qiita.com/hayayu0/items/b71d82e97a78c5b9a9d1

- Lambda関数に必要なIAMロールを作成します。
- Lambda関数 ```describe-api``` をデプロイします。

## S3によるWebサービス

Webページ自体は、AWSのS3バケットを利用してホスティングします。

- S3バケットを作成します。
- S3に対する必要な外部アクセスを設定します。(パブリックアクセスの許可や、必要に応じてCDNの設定）
- S3バケットにWebページのHTML, Javascriptや関連するリソースをアップロードします。

これらの手順により、Webサービスを構築することができます。

# 他のWebサービス

このWebサービスは 別記事 [Qiita - describe-api　AWS Lambda関数によるAWS APIの実行](https://qiita.com/hayayu0/items/b71d82e97a78c5b9a9d1) の具体的な実装例として、
記事を分けてここで紹介しました。

他にも、こういう質問もよくあったりします。

**「全サーバーの一週間の稼働状況（停止・起動の時刻）が知りたい。」**

これは ```describe-api``` だけでは難しくて、他のLambda関数を利用することで実装可能です。
それはまた別の記事で紹介します。
GoogleのPlace API(新版)についてまとめる

## 概要
Google Place API(New)で改善した点
- 以前は大雑把なAPIの種類で課金されていた
- SKU(GogleMapsPlatformの課金単位)単位で課金されることによって、不要な機能やデータを取得しなくて済むようになった
- 上記によって、APIのコスト最適化が図れる

## API(New)の種類と取得できる情報
APIの種類と取得できる情報
### Place Details:
プレイスIDを使用して、場所の詳細情報を取得。
### Place Photo:
プレイスIDを使用して、場所の写真を取得。
###  Nearby Search:
指定された場所の周辺にある場所を検索し、リストと基本的な情報を取得。
### Text Search:
テキスト検索で場所を検索し、リストと基本的な情報を取得。
### Autocomplete:
リクエストに応じて場所の候補とクエリ予測を返す。
## APIの課金方法
- 新版のAPIは`FieldMask`ヘッダーを使用してレスポンスで返すフィルドのリストを指定する
- リクエストに適用される一番高いSKUに基づいて請求される
- `FieldMask`の値によって課金グレードが変わるイメージ

---
### PlaceDetail APIの例
下記のフィールドのいずれか**のみ**のリクエスト時は`IDs
Only`としてみなされる
- SKU:Place Details(IDs Only)
    - `attributions`
    - `id`
    - `name`
    - `photos`
---
下記のフィールドのいずれか**のみ**リクエスト時は`Location Only`としてみなされる
- SKU:Place Details(Location Only)
    - `addressComponents`
    - `adrFormatAddress`
    - `formattedAddress`
    - `location`
    - `plusCode`
    - `shortFormattedAddress`
    - `types`
    - `viewport`
---
下記のフィールドのいずれか**のみ**リクエスト時は`Basic`としてみなされる
- SKU: Place Details (Basic)
    - `accessibilityOptions`
    - `businessStatus`
    - `containingPlaces`
    - `displayName`
    - `googleMapsLinks`
    - `googleMapsUri`
    - `iconBackgroundColor`
    - `iconMaskBaseUri`
    - `primaryType`
    - `primaryTypeDisplayName`
    - `pureServiceAreaBusiness`
    - `subDestinations`
    - `utcOffsetMinutes`
---
下記のフィールドのいずれか**のみ**リクエスト時は`Advanced`としてみなされる
- SKU: Place Details (Advanced)
    - `currentOpeningHours`
    - `currentSecondaryOpeningHours`
    - `internationalPhoneNumber`
    - `nationalPhoneNumber`
    - `priceLevel`
    - `priceRange`
    - `rating`
    - `regularOpeningHours`
    - `regularSecondaryOpeningHours`
    - `userRatingCount`
    - `websiteUri`
---
下記のフィールドのいずれか**のみ**リクエスト時は`Preferred`としてみなされる
- SKU: Place Details (Preferred)
    - `allowsDogs`
    - `curbsidePickup`
    - `delivery`
    - `dineIn`
    - `editorialSummary`
    - `evChargeOptions`
    - `fuelOptions`
    - `goodForChildren`
    - `goodForGroups`
    - `goodForWatchingSports`
    - `liveMusic`
    - `menuForChildren`
    - `parkingOptions`
    - `paymentOptions`
    - `outdoorSeating`
    - `reservable`
    - `restroom`
    - `reviews`
    - `routingSummaries`
    - `servesBeer`
    - `servesBreakfast`
    - `servesBrunch`
    - `servesCocktails`
    - `servesCoffee`
    - `servesDessert`
    - `servesDinner`
    - `servesLunch`
    - `servesVegetarianFood`
    - `servesWine`

とりあえずPlaceDetailsのSKUについてまとめました

他のAPIについては下記の参考からお確かめください

## 参考
https://developers.google.com/maps/documentation/places/web-service/op-overview?hl=ja

https://developers.google.com/maps/documentation/places/web-service/usage-and-billing?hl=ja
初めてQiitaに記事を書いてみる【投稿テスト】

# はじめに

初めまして。普段、Qiitaの投稿記事によくお世話になっています。が、自ら投稿することはありませんでした。そんな私の投稿でもささやかながらお役に立てればと思い、自分で調べていて分かったことなどを共有していきたいと思います。

# 自己紹介

仕事ではC/C++がメインで、時々、シェルスクリプト、C#やPythonを使っています。

# 適当なサンプルコード

```python
import socket

UDP_IP = "127.0.0.1"  # Dst IP addr(ex: localhost）)
UDP_PORT = 514        # Dst Port No.

# Create UDP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Send Message
sock.sendto(b"Hello World!", (UDP_IP, UDP_PORT))

print(f"Sent Message : {"Hello World!"} (Dst: {UDP_IP}:{UDP_PORT})")

# Close Socket
sock.close()
```


# まとめ

以上、記事投稿テストでした。
Webサーバーの仕組み

## はじめに
Webサーバーの仕組みについてまとめてみました。

## 概要
　Webサーバーは利用者側の各Webブラウザをクライアント、Webサーバーをサーバーとして、クライアント-サーバー通信を行う。このとき、ブラウザとWebサーバー間では、HTTPやHTTPSというプロトコルを用いてさまざまなデータのやりとりが行われる。クライアントがWebサイトに必要なデータをサーバーに要求し、その要求に応じてサーバーがデータを返す。
　この際にWebサーバーが扱うデータは多岐にわたるが、次表に代表的な例を記載する。Webサイトのコンテンツ構成を定義するHTMLを中心として、サイト自体のデザインや、そこで実行されるプログラムがサーバー上に存在する。

## Webサーバーが扱う主なデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/cded53a4-646c-47d8-8fd4-b6a95769e127.png)



## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
・図解 Amazon Web Servicesの仕組みとサービスがたった1日でよくわかる 単行本（ソフトカバー） – 2022/2/2
NRIネットコム株式会社 (著), 上野 史瑛 (著), 小林 恭平 (著), 尾澤 公亮 (著), 高梨 友之 (著)
p.53
【Git】間違って git rebase -i したのを元に戻す方法

# はじめに
git rebase -i は、複数のコミットをまとめたり、削除したりできる便利なコマンドですが、操作を間違えて意図しない変更をしてしまうこともあります。
そんなときでも git reflog を使えば、元の状態に戻すことが可能です。  
この記事では、 git rebase -i の操作を取り消す方法を紹介します。

# 1. git reflog
`git reflog` は、自分がgitで行った操作の履歴を確認することができます。
```
% git reflog
fe660f5 (HEAD -> feature, origin/feature) HEAD@{0}: rebase (finish): returning to refs/heads/feature
fe660f5 (HEAD -> feature, origin/feature) HEAD@{1}: rebase (pick): foo
fa475c1 HEAD@{2}: rebase (pick): bar
7165a76 HEAD@{3}: rebase (pick): baz
4a5d436 HEAD@{4}: rebase (pick): qux
fc15899 HEAD@{5}: rebase (pick): quux
da27275 HEAD@{6}: rebase (pick): corge
60154e8 HEAD@{7}: rebase (start): checkout HEAD~7
c84852d HEAD@{8}: checkout: moving from main to feature
```
下に表示されているものほど古い履歴です。
今回の例では、`HEAD@{0}`から`HEAD@{7}`までリベース操作が行われていて、`HEAD@{8}`はmainブランチからfeatureブランチへ切り替えています。

# 2. git reset --hard HEAD@{n}
`git reset --hard HEAD@{n}`は、自分がgitで行った操作を戻します。

`n`には git reflog で確認した戻りたい履歴の番号を指定します。
先ほどの git reflog の例ならば、 git reset --hard HEAD@{8} を実行するとリベース操作前に戻るので、 git rebase -i の操作を無かったことにできます。

# さいごに
私自身、 git rebase -i で「あ、しくった...」という状況に何度か陥ったことがあります。  
そのたびに git reflog で履歴をさかのぼってやり直すことで助かったので、今回その方法を記事にまとめました。
なお、リモートリポジトリに既にpushしている場合は `git push --force` が必要になります。
ただし、強制プッシュは他のメンバーの作業を壊す可能性があるため、慎重に使用してください。
AWSのAmazonLinux2をVMで立ち上げてみた

# イントロダクション

メインで働いているところとは別で年に数回お仕事の依頼をいただくことがあり

そちらの方でVMWareをつかって色々やることがあります。

最近はもっぱらAWSを使うことが多いため、EC2でよく使うAmazon Linux 2をVMWareで立ち上げられないかな

というので調べてみたら合ったのでやってみました。

# 用意するもの

- VMWareがインストールされているPC
- genisoimageが使えるLinuxマシン

# 参考サイト様

[DevelopIO様](https://dev.classmethod.jp/articles/onpre_vmware-esxi_amazon-linux-2_install/)
[rouma_nagare様](https://qiita.com/ryouma_nagare/items/8916f299dbccd27f08a9)

# 実施方法

- 以下よりVM用のイメージをダウンロードしてきます。
    - [vmイメージ](https://cdn.amazonlinux.com/os-images/2017.12.0.20171212.2/vmware/amzn2-vmware_esx-2017.12.0.20171212.2-x86_64.xfs.gpt.ova)
    - 当該のイメージをVMWareに読み込ませて起動ができることを確認します。この際、そのまま起動せず、終了してください

- Linux側で下記のファイルを作ります。(ユーザ名とネットワーク周りの設定)

    - `user-data`の作成
    ```bash
    #cloud-config
    users:
      - default
    chpasswd:
      list: |
        ec2-user:[パスワードを平文で記載]
    ssh_pwauth: True
    ```
    上記は、ログインユーザを作ることになります。
    いつもは鍵認証だから気にしてなかったけどローカルの時は一時的にパスワード認証が必要になるためです。

    - `meta-data`の設定
    ```bash
    local-hostname: local-amazonlinux2

    #network-interfaces: |
    #  iface eth0 inet static
    #  address 192.168.xx.xx
    #  network 192.168.xx.0
    #  netmask 255.255.255.0
    #  broadcast 192.168.xx.255
    #  gateway 192.168.xx.2
    ```
    あらかじめ設定しておくことで、ネットワークも設定が可能です。
    詳しくはこの[サンプル](https://cdn.amazonlinux.com/os-images/2017.12.0.20171212.2/README.cloud-init)を参考に機作すると良いかと思います。
    私はDHCPを利用するため、ネットワーク設定はすべてコメントアウトしたままにしました。

    - 上記2ファイルを1つのISOイメージに入れます。
    下記のコマンドを用いて1枚のイメージにします。
    ```bash
    genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
    ```

- 読み込んだVMに対して作成したISOを読み込むようにする。
    - ここで注意点
    - VMWareの起動順番が初期の段階だと、HDDになっている恐れがあります。VMのBIOSや起動順番でISOを先に読み込むように設定してください！！
        - 私はここで1時間くらい悩みました。

上記でVMを起動すると、EC2が起動できるようになります

# 所感

ふと思ったのですが、これ使えば私のサーバ1台リプレースできるかしら？？？とかと思ってたり

セキュリティ試験の際にちょこちょこ使ってるんですが、それが軒並みAmazonLinuxEC2と同等に使えるので、
色々テストがしやすいのかなーとかIAMAnyWareを再挑戦してみようかなーとか思っています！！！

それではまた
生成AIの現状と今後迎える未来

# はじめに

生成AI（Generative AI）は、2023年のChatGPTの登場以降、急速に発展し、私たちの生活や仕事に大きな影響を与えています。本記事では、2025年現在の生成AIの状況と、今後数年間で予想される展開について解説します。

# 現状：2025年の生成AI

### 1. 企業での本格的な導入

2025年、多くの企業が生成AIを本格的に導入し、実用化しています。BCGの調査によると、C級幹部の75%が生成AIを戦略的優先事項のトップ3に挙げており、IT予算の約4.7%が生成AI関連に充てられています。

### 2. カスタマイズされたAIアプリケーション

汎用的なAIから、業界や組織に特化したカスタマイズされたAIアプリケーションへの移行が進んでいます。例えば、金融機関が自社のデータで訓練したAIを投資アドバイスに活用するなど、より専門的な用途での利用が増えています。

### 3. マルチモーダルAIの台頭

テキストだけでなく、画像、音声、動画など複数のデータタイプを扱えるマルチモーダルAIの利用が拡大しています。これにより、より豊かで多様な出力が可能になっています。

### 4. AIエージェントの普及

自律的にタスクを実行するAIエージェント（エージェンティックAI）の導入が進んでいます。Deloitteの予測によると、2025年には生成AIを使用している企業の25%がAIエージェントを導入すると予想されています。

# 今後迎える未来

### 1. AIエージェントの更なる進化

2027年までに、生成AIを使用する企業の50%がAIエージェントを導入すると予測されています。これらのエージェントは、より複雑なタスクを自律的に実行できるようになり、仮想的な同僚として機能する可能性があります。

### 2. 責任あるAI原則の重要性増大

生成AIの普及に伴い、倫理的で法的に許容される方法でAIを使用することへの関心が高まっています。責任あるAI原則の実装は、ステークホルダーの信頼を獲得する上で重要になっていくでしょう。

### 3. エネルギー消費の課題

生成AIの利用拡大に伴い、データセンターの電力消費量が増加すると予測されています。Deloitteの報告によると、2030年までにグローバルデータセンターの電力消費量が現在の2倍の4%に達する可能性があります。

### 4. 創造性支援ツールとしての進化

音楽作曲、アート制作、リアルタイムアニメーション生成など、創造的な分野での生成AIの活用がさらに進むと予想されます[5]。これにより、アーティストやクリエイターの表現の幅が大きく広がる可能性があります。

# まとめ

生成AIは2025年現在、企業での本格的な導入段階に入っており、今後はより専門的で自律的なAIエージェントの普及が進むと予想されます。同時に、責任あるAI原則の実装やエネルギー消費の課題など、新たな問題にも直面することになるでしょう。生成AIは私たちの生活や仕事を大きく変える可能性を秘めており、その発展を注視し続けることが重要です。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！

# 参考文献


https://www.techtarget.com/searchenterpriseai/feature/The-future-of-generative-AI-Trends-to-follow

https://www2.deloitte.com/bn/en/pages/about-deloitte/articles/tmt-2025-predictions-generative-ai-paves-the-way-for-a-transformative-future-in-the-industry.html

 
https://www.cloud-awards.com/how-gen-ai-will-revolutionize-2025


https://time.com/7204665/ai-predictions-2025/