OmniAICreator/Qiita-1.07M huggingface dataset:
AI画像生成APIとは？ – 最新技術で画像を自動生成


## はじめに
AI画像生成APIは、ユーザーが入力したテキストやプロンプトをもとに、自動で画像を生成するためのインターフェースを提供するサービスです。

これらのAPIを使用することで、開発者やクリエイターはプログラムから直接AIを活用し、画像やアートを生成できます。

本記事では、AI画像生成APIの基本的な仕組みと、その利用方法、人気のAPIサービスを紹介します。

無料版の画像生成AIを使用したい方は、下記のサイトを参考にしてください。

[無料ツール](https://ai.tencho-ex.com/)


## AI画像生成の仕組み
AI画像生成には、主に「生成的敵対的ネットワーク（GAN）」や「変分オートエンコーダ（VAE）」といった技術が使用されます。これらは、AIが「学習」したデータセットを基に、新しい画像を生成する方法です。

## 使用される技術
GAN（Generative Adversarial Networks）：生成と識別を行う2つのニューラルネットワークを使って、リアルな画像を生成する技術。
VAE（Variational Autoencoder）：データの潜在空間を学習し、新しいデータ（画像）を生成するための技術。
これらの技術は、数百万の画像データを学習し、新しい画像を「創造」する能力を持っています。生成された画像は、プロンプト（テキスト）に基づいて、例えば「青い空に浮かぶ雲」といった具体的なイメージに合わせて出力されます。

## 人気のAI画像生成APIの紹介
現在、多くのAI画像生成APIが提供されています。以下は代表的なものです。

### 1. OpenAIのDALL·E 3 API
OpenAIのDALL·E 3は、テキストからリアルで高品質な画像を生成できるAIです。ユーザーが入力した文章を元に、芸術的かつ創造的な画像を生成します。このAPIは、APIキーを使用して簡単にアクセスでき、開発者は自分のアプリケーションに画像生成機能を組み込むことができます。

### 2. DeepAIの画像生成API
DeepAIはシンプルで使いやすいAI画像生成APIを提供しています。テキストを入力すると、それに基づいた画像が生成され、さまざまな用途に応用可能です。特に、低コストで手軽に使える点が魅力です。

### 3. RunwayMLの画像生成API
RunwayMLは、アーティストやクリエイター向けに設計されたツールで、AIを活用した画像生成や編集が可能です。APIを使えば、動画編集やアート制作に活用することができます。

### 4. Stable Diffusion
Stable Diffusionは、オープンソースのAI画像生成モデルです。無料で使えるバージョンもあり、コミュニティベースでのカスタマイズが可能です。高品質な画像生成を行うため、特に技術者向けに人気です。

### AI画像生成APIの使い方
AI画像生成APIを利用するためには、まずAPIキーを取得し、リクエストを送信します。以下は、Pythonを使った基本的な使い方の例です。

ステップ1: APIキーを取得
まず、選んだサービス（例えば、DALL·E 3やDeepAI）にサインインし、APIキーを取得します。このキーは、リクエストを送る際に必要となります。

ステップ2: リクエストを送る
APIへのリクエストは、通常、POSTメソッドを使って送信します。以下はPythonの例です。

~~~python
复制
import requests

# APIキー
api_key = 'YOUR_API_KEY'

# 画像生成のプロンプト
data = {
    'prompt': 'A futuristic city at sunset',
    'n': 1,  # 生成する画像の枚数
    'size': '1024x1024'  # 画像の解像度
}

# APIのエンドポイントURL
url = 'https://api.openai.com/v1/images/generations'

# リクエストヘッダー
headers = {
    'Authorization': f'Bearer {api_key}'
}

# リクエスト送信
response = requests.post(url, headers=headers, json=data)

# 生成された画像のURLを取得
image_url = response.json()['data'][0]['url']
print(f"Generated image URL: {image_url}")
~~~
ステップ3: レスポンスを利用
上記のコードを実行すると、指定したプロンプトに基づいて生成された画像のURLが返されます。これをブラウザで表示することができます。

## AI画像生成APIの活用例
AI画像生成APIを活用することで、以下のような多様な応用が可能です。

1. アートやイラストの生成
アーティストが新しいアイデアを試す際や、デザインのインスピレーションを得るために利用することができます。

2. 商品画像の作成
ECサイトやマーケティングにおいて、商品画像を生成したり、カスタマイズしたりするためにも活用できます。

3. ゲームやVR/ARコンテンツ
ゲーム開発者は、背景やキャラクター、アイテムなどのゲームコンテンツをAIを使って迅速に生成できます。

## 注意点と制限
AI画像生成APIにはいくつかの注意点があります。

使用制限: 多くのAPIは無料で一定のリクエスト回数を提供しますが、大量に利用する場合は有料プランに移行する必要があります。
著作権: 生成された画像の著作権については、使用するAPIのライセンス契約を確認する必要があります。
プライバシー: ユーザーから送信されるデータにプライバシーリスクがないか確認することが重要です。
高度なカスタマイズと最適化
AI画像生成APIでは、単に画像を生成するだけでなく、細かいカスタマイズを行うことができます。例えば、プロンプトエンジニアリングを使って、より詳細で意図的な画像を生成することができます。

また、モデルのカスタマイズやファインチューニングを行うことで、特定のスタイルやテーマに特化した画像を生成することも可能です。

## まとめ
AI画像生成APIは、テキストから画像を生成する強力なツールです。これを活用すれば、アートやデザインの制作、ゲーム開発、マーケティングなど様々な分野で新たな可能性を切り開くことができます。選択肢が豊富なため、自分の目的に合ったAPIを選び、効果的に活用していきましょう。

参考リンク・リソース
[OpenAI API Documentation](https://platform.openai.com/docs/api-reference/introduction)
[DeepAI Image Generation API](https://deepai.org/machine-learning-model/text2img)
RunwayML
Stable Diffusion GitHub Repository
unity6初心者 具体的に変わったの　めも

unity6 6000.40f1

・Audio
Audio Random Containerが使える　
（unity内で音程のランダム化な色々できるやつ）

・Rigidbodyのvelocity
RigidbodyのvelocityはlinearVelocityに変更？

・ビルド関連
WebGL　今までとおんなじだった
追加予定


Audio Random Container
https://www.youtube.com/watch?v=wM0kMg6OkKo&t=16s


色々あるらし
https://www.youtube.com/watch?v=9sBQd74HVtg

https://developers.cyberagent.co.jp/blog/archives/54579/
てすと、(ぶなしめじ)

### ①新しいExcelを開く
### ②Alt+F11を押す
### ③「挿入」→「標準モジュール」
### ④ここに下記を貼り付ける



```vb
Sub FindCombinations()
    Dim nums As Variant
    Dim n As Integer, i As Integer, j As Integer
    Dim lastRow As Integer
    Dim rng As Range
    Dim ws As Worksheet
    
    ' アクティブなシートを設定
    Set ws = ActiveSheet
    
    ' A1:A5のデータを配列に格納
    ' ----------------------------------------↓ここを変える！！！
    nums = ws.Range("A1:A10").Value
    n = UBound(nums, 1) ' データの個数
    
    ' 結果の出力先（G列を使用）

    lastRow = 6 ' 6行目列の出力開始行

    ' すべての組み合わせを試す（ビットマスクを使用）
    For i = 1 To (2 ^ n) - 1
        Dim sum As Integer: sum = 0
        Dim comb As String: comb = ""
        
        ' 各数値をチェック
        For j = 0 To n - 1
            If (i And (2 ^ j)) <> 0 Then
                sum = sum + nums(j + 1, 1) ' 選択した数値の合計
                comb = comb & nums(j + 1, 1) & ", " ' 組み合わせを文字列化
            End If
        Next j
        
        ' 合計が10ならB6列に出力
        If sum = 10 Then
            ws.Cells(lastRow, 2).Value = Left(comb, Len(comb) - 2) ' 最後のカンマを削除
            lastRow = lastRow + 1
        End If
    Next i
    
    MsgBox "完了しました！", vbInformation
End Sub
```

### ⑤この部分の("A1:A10")に数字が入ってる範囲を書く

```ruby:qiita.rb
----------------------------------------↓ここを変える！！！
```

### ⑥F5を押して実行
### ⑦B6より下にけっかがでｒ
日本の企業では ISO 9001 内部監査をどのくらいの頻度で実施すべきでしょうか?

日本企業では、ISO 9001 内部監査の頻度は、コンプライアンスを維持し、継続的な改善を確実にする上で重要な要素です。ISO 9001 規格によると、内部監査は計画された間隔で実施する必要がありますが、正確な頻度は組織の規模、複雑さ、リスク環境によって異なります。日本のような成熟した経験豊富な市場のほとんどでは、少なくとも年に 1 回は ISO 9001 内部監査を実施するのが一般的です。ただし、リスクの高い業界や大規模な組織では、堅牢な品質管理システムを確保するために、四半期ごとまたは半年ごとのより頻繁な監査が必要になる場合があります。

日本で LRQA と協力した結果、監査スケジュールを当社の特定のニーズに合わせて調整する上で、彼らの専門知識が非常に貴重であることがわかりました。現地の規制と国際基準に対する彼らの深い理解により、当社の ISO 9001 内部監査プロセスをコンプライアンス要件とビジネス目標の両方に合わせることができました。LRQA のアプローチにより、ISO 9001 要件を満たすだけでなく、リスク管理と運用効率も向上しました。同社の技術アドバイザリ サービスとリアルタイムの保証ツールは実用的な洞察を提供し、監査プロセスをシームレスかつ効果的にしました。

日本企業にとって、LRQA のような世界的に認められた保証プロバイダーと提携することは大きな違いを生む可能性があります。正確性と文化的配慮を備えた ISO 9001 内部監査サービスを提供できる同社の能力により、企業はコンプライアンスを維持し、競争力を維持し、将来に備えることができます。製造業、テクノロジー、サービス業を問わず、LRQA の革新的なソリューションは、持続可能な成長を促進しながら ISO 9001 の複雑さを乗り越えるのに役立ちます。
学校配布のWindowsパソコンにUbuntuをインストールした話

　　やあやあ。wsn0672だよ。
  今回は学校配布のWindowsパソコンにUbuntuをインストールしたときの話をするよ。
学校PCじゃなくてもデュアルブート構築しようとしてる人は是非ご参考に。
GIGAスクール構想で配布された非常に低スペックなPC。規制ソフトi-Filter。

僕の学校で配られているPCはMicrosoft Surface GO 4。うん。塵。
簡単なスペック表を載せておく。
| 機種 | Surface GO 4 |
|:-----------|------------:|
| CPU       | Intel N200        |
| GPU     | Intel QUDグラフィック|
| メモリ     | 8GB |
| ストレージ | 128GB | 
| OS |Windows 11|
| 部類 |タブレットPC |

こんな低スペPCにはWindows 11は重すぎるよいうことで（実際CPU使用率は常に100%）、Ubuntuをぶっ込んでやりゃあ動作サクサク&規制回避でサイコー！
　　　(っ'ヮ'c)<うぉぉぉぉぉぉ

んでもって、[Ubuntu](URL "https://www.ubuntulinux.jp/")をまずダウンロードせにゃあ。

## デュアルブート構築
今回、自分のMacでまずUbuntuをダウンロードして、UbuntuのブートUSBを作成した。

### セキュアブートとBitLocker
さあここで邪魔をしてくるのがSecureBoot。デバイスでWindows以外のOSを起動できないという設定。「セキュアブートオフればええんちゃうの？」と思った皆さん、これは学校配布のPCよ。
というのも、セキュアブートをオフるとなにが起こる〜？
そう、BitLockerが起動する〜！！

ふざけんな。
そしてセキュアブート設定をいじった僕はBitLockerかれられましたとさ。めでたしめでたし。
「BitLocker回復キーなんてアカウント画面から見れるだろ」思った皆さん、これは学校配布のPCよ。BitLockerキーは学校が管理してる。はいオワタ。

で学校のICT支援室みたいなとこ行って「Windowsアップデートしたらこれ出たんですけど」とか適当に言ってたら解除してくれた。チョロ。

### んでそっから？

あとは簡単よ、USBをSurfaceにぶっ刺し、そこからUbuntuを起動させるだけ。
ここで、SurfaceにはSDカードスロットがあるから、UbuntuをSDにインストールしようとしたら、なんと**SuefaceはSDカードからブートできない**という謎仕様。だからUSBをもう一つブッ刺してそこにUbuntuをインストールするという計画を進めた。

そんでまぁごちゃごちゃとやってたらUbuntuがインストールできたというわけですわ。

## なぜSurfaceのディスクじゃなくてUSBにインストールしたのか
ここでもまたBitLocker。これってディスクを暗号化することで盗難からデータを守る〜とかって謳ってるやつなんだけど、此奴がまたまた邪魔をする。
ってのもUbuntuをこのディスクにしようとしてもBitLockerのせいでこのディスクにはどう足掻いてもWindows以外入れれないんよ。
だから今回はUSBに入れた。

そもそも学校配布のPCにBitLockerが必要なのかっていう疑問もあるけど、それは置いとこう。

## 成果物
Ubuntuを起動している時のCPU使用率は13%、素晴らしい。

## おわりに
この記事の有益な情報はSurfaceがSDカードからブートできないってことくらいかな。
これからもこんな無意味な読みにくい記事を書いてくんでよろしく。
では。
エターナルブルーの深淵（後編）～「CVE-2017-0145」歴史的脆弱性について徹底解説～

hello！日夜ダークサイドの住人との戦いに励むセキュリティ戦士の諸君

中の人( ~~32歳独身男~~ )の環境が整ったから約束のハッキング実演といこう！

今回使うマシンはこれだ

https://github.com/rapid7/metasploitable3

今までLinux環境のみだったMetasploitableにWindows環境が登場したんだ！
最高にクールな仕事をしてくれたぜ！
仮想環境のインストールの方法もリンク先を参考にしてくれよな！
インストールの際はしっかりwin2k8を選ぶこと

:::note warn
仮想環境作成後の起動時にプロダクトキーの入力が求められますがaskmelaterを選んでおけば問題ないです。
:::

:::note alert
もちろんこれも他人に対して行うと犯罪になります。絶対に他人の環境には行わないでください遊びでも脆弱性調査のつもりでも絶対にだめです。脆弱性の怖さを知ると共に対策の必要性を知るために実演をしています。
:::

試用版を使って仮想環境を構築している都合上時間制限があるんだ。
だから、今日はツールを使ってサクッとハッキングしちゃうけど
ハッキングが簡単なことに対して喜びを感じるのではなくて
脆弱性に攻撃が刺さったら誰でも簡単にハッキングできてしまう恐ろしさを知って欲しいぜ！


それではスタート！


# 偵察
今回の攻撃用マシンもKaliにお願いするぜ！
IPは前回と同じ192.168.56.103

Metasploitable3のIP
192.168.56.113


今回使用するツールはこの二つ
nmap...ポートスキャンツールだ！これでどのポートが空いているか調べて攻撃の足掛かりにするぜ！
MetasploitFramework…攻撃を自動で実行してくれるツールだ。疑似ハッキングテストにもよく使われている便利な道具だ！

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013464/b960ce87-0775-42a7-af0f-078f37c754a1.png)


ポートもたくさん開いていて脆弱性をたくさん抱えているマシンだ
つまり、、、

:::note alert
本実習は必ず外部環境から隔離された状態で行うこと！ダークサイドの住人はいつ攻撃してくるかわからない！事故が起きてからでは遅い！
:::



445ポートが開いていることが分かったので次はMetasploitframeworkを使って
smbv1の脆弱性があるかどうか確認していくぜ！！
kaliにはプリインストールされているのでターミナルに”msfconsole”と入力することでコンソールが起動するぜ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013464/f07f2db9-c5cc-409b-92ac-fb067e95c56a.png)


無事起動したら
search ms17
と入力して今回の脆弱性にかかるモジュールを探そう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013464/c336a22f-0c45-4a2c-b1f0-eda3de3a33d5.png)


これが結果だ

今回は一番上の物を使うことにする
なぜか？時短のためだ
exploitって書いてあればいっぺんに攻略できるものなんだなぐらいで最初はいいと思う

もしも命名規則や操作方法についてより深く知りたい人がいれば
下記開発元の公式ドキュメントを確認するといいだろう（原文:英語）

https://www.offsec.com/metasploit-unleashed/

# 攻撃実行まで
使うモジュールが決まったらモジュールに攻撃対象とリバースシェルを待ち受けるサーバを設定する

その際の構文は下記
```
set rhosts <targetip>
set Lhosts <YourMachine IP>
```
設定が完了したらrun又はexploitコマンドでモジュールを実行する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013464/70adfeb4-72cf-4f46-b39d-f1bab1e6a5de.png)

するとこのように脆弱性対象かどうかのスキャンから攻撃の実行
→シェルの取得まで自動的に行ってもらえる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013464/9f871e96-c47f-4a22-8de5-94b0332e778e.png)

シェルを取得したらあとはこのようにしてランサムウェアを設置するもよし今回はシステムユーザーですんごく強い権限持っているアカウントだったので権限昇格の必要性がなかったが権限昇格を試すのもよいだろう。

今回はダミーファイルのアップロードが可能なことを確かめて終了とする!

# まとめ

今回の脆弱性がなぜ通ったのかについて分析していこうと思う。

原因
・セキュリティパッチが未適用
Microsoftは本脆弱性が報告されてからすぐに対策パッチを公開した。が適用されていなかった。

・ポートが開いていた
いらないポートは閉じる。これは基本中の基本
ポートを閉じることによって物理的にダークサイドの住人が入ってくる入り口（アタックサーフェス）を減らせるからだ。

・セキュリティソフトやFWがなかった
 前編で解説した通り、もしあればブロックできていたかもしれない
 
:::note
こうして入り口を減らす取り組みはASM（Attack Surface Management）と呼ばれて注目を集めている。
今組織が抱えているリスクをしっかりと把握してそれに合った対応をしっかりとしていくことが自分たちの会社を守ることにつながる。
:::

今回の脆弱性はランサムウェアの増殖と非常に相性が良かったんだ！
そのため当時は世界的なニュースにもなったぐらいで世界レベルでセキュリティ意識が高まるきっかけになった事件なんだ。

日本のセキュリティはまだまだ甘いといわれているけどこれで少しでも興味が出てくれたらうれしい
まだまだ俺たちとダークサイドの戦いは終わらないぜ！！！
【Rails】422 unprocessable_entity

# はじめに

こんにちは。アメリカで独学でエンジニアを目指している者です。
現在Railsチュートリアルを用いて勉強していますが、本日はそこで出てきたHTTPステータスコード 422 Unprocessable Entity について記事にしたいと思います

### 422 Unprocessable Entity の概要

HTTPステータスコード 422 の大まかな意味は以下のとおりです。

- **正しい形式**
  クライアントから送信されたリクエストは、HTTP のプロトコルや文法的には正しい。
- **意味的な誤り**
  しかし、送信されたデータがサーバーの期待する内容と合致しておらず、処理を完了できない。

たとえば、ユーザー登録フォームで必須項目が未入力だったり、数値の範囲が不適切だったりする場合など、リクエスト自体は解釈できても内容が妥当ではないケースに 422 を返すことで、「構文は正しいがデータの意味に問題がある」ことをクライアントに伝えられます。

---

### 422 が用いられる背景

HTTPステータスコードの 4xx 台は主にクライアントに原因があるエラーを示すものですが、その中で 422 はとくに「入力内容の意味的な問題」を表すために設けられています。

#### なぜ 422 なのか？

- **400 Bad Request との違い**
  400 Bad Request はリクエストの構文自体が誤っている場合に使われるのが一般的です。一方 422 Unprocessable Entity は、リクエスト形式（ヘッダーやメソッド、JSON/XML の構造など）は正しくても、内容がサーバーのバリデーション要件などに合致しないために処理不可能な場合に使われます。

つまり 422 は「リクエストそのものは解釈できるが、入力データがサーバーの要求を満たしておらず、処理を完了できない」ことをクライアントに伝えるコードと言えます。

---

### Ruby on Rails における 422 の利用例

Rails では、認証失敗やモデルのバリデーションエラーなど、入力内容が正しくない場合に 422 を返すことが多いです。以下に、よくある２つのケースを示します。

#### ユーザー認証エラー時の例

ログインフォームでメールアドレスまたはパスワードが誤っている場合、セッションの作成に失敗するため 422 を返すことで「入力内容が不正で処理不能である」ことを示します。

```ruby
class SessionsController < ApplicationController
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user&.authenticate(params[:session][:password])
      reset_session    # セッション固定攻撃対策
      log_in user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new', status: :unprocessable_entity
    end
  end

  def destroy
    log_out
    redirect_to root_url, status: :see_other
  end
end
```

上記の `render 'new', status: :unprocessable_entity` によって、クライアントは「認証用リクエストの形式は合っているが、実際の認証情報に誤りがある」状態と認識できます。

#### バリデーションエラー時の例

ユーザー登録やリソース作成時にモデルのバリデーションが失敗した場合も、422 が最適です。

```ruby
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user, notice: "User created successfully"
    else
      render 'new', status: :unprocessable_entity
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end
```

モデルのバリデーションに失敗すると `@user.errors` にエラー内容が詰め込まれますが、その際に 422 を返すことで、クライアント側（フロントエンドや他システム）は入力項目を再度確認・修正するよう誘導できます。

---

### 422 を返す意義とクライアント側の対応

422 Unprocessable Entity を適切に返すことで、以下のメリットがあります。

1. **明確なエラー判別**
   400 Bad Request などの汎用的なステータスコードでは区別しづらい「入力値が妥当でない」ケースを明示できます。
2. **ユーザーへの適切なフィードバック**
   エラーの詳細（バリデーションメッセージなど）をレスポンスに含めることで、ユーザーはどの入力が問題だったかをすぐに把握できます。
3. **API連携における再送制御**
   外部サービス連携などで、リトライが必要か否かを判断しやすくなります。422 は入力データ修正が必要であることを示すため、ただちに再送してもエラーが繰り返される可能性が高いことをクライアント側が理解できます。

クライアント実装では、422 を受け取った場合はフォーム入力の再チェックやユーザーへの修正指示を行うなど、再送の前にデータの修正を要求するといった流れが推奨されます。

---

### まとめ

HTTPステータスコード 422 Unprocessable Entity は、リクエストが文法的には正しいものの、データ内容の不備やバリデーションエラーにより処理を継続できない場合に返すコードです。特に Ruby on Rails では認証エラーやバリデーションエラー時にこのステータスを返す実装が一般的で、クライアントに正しくエラー状況を伝えるうえで非常に有用といえます。
CSVファイルからVCFファイルに変換する方法


CSVファイルからVCFファイルに変換したかったのですが、サイトでの変換は何か問題がありそうでパス。Windows11になってからwindowsの連絡先を使った変換はできなかったですね。

カレンダーにアカウント追加したら、ここまでは表示できるようになったけど... またアカウントを要求されて先に進めない。何だろう？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e9f2299b-3d9d-42c2-9c79-3262dd12351c.png)


ということで、有償のソフトを買うのもなぁって思っていたらGoogleでできました。

# Outlookの連絡先からCSVファイルを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0185d25b-5cf6-4732-8269-2a5f1227f71d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2eeff878-36ef-4ac9-8744-814d744bde06.png)



# GoogleのContactsを使う


Gmailを起動して、以下のところでContactsを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8b058500-caf3-47f7-a6dd-a52f79ec987c.png)


Importをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4d832b18-97fb-4643-9b11-4b10f3e2c0ce.png)

CSVファイルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6578e681-aab5-4598-b406-91a131fd44ba.png)

Importをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4219f794-4d5e-4ad2-b49e-4e1f801fac3f.png)

VCFファイルに変換する連絡先を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1ee69927-6a9a-4af8-88e7-23bac31ad492.png)

右側のアイコンをクリックして、Exportを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/346050bf-2ce3-4cc0-98f8-96229e6ceed3.png)

vCard for Android or iOSを選択してExportをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4420190a-883f-423d-959a-d5f95eea7972.png)
Cursor 0.4.6の新機能：特定のGitコミットの解説

Cursor 0.46 では、特定のGitコミットで何が起こったかを解説したりレビューさせることができるようになりました。これにより、コードの変更点を素早く把握したり、チームメンバーの修正意図を理解しやすくなります。

### 利用手順

1. チャットから `@Git`を開く。
2. 特定のコミットを選択。
3. AIに対して指示を出す（例：「解説して」「レビューして」）。
4. AIがコミットの変更内容を解析し、説明を提供。

### 主な利用シーン

- **コードレビューの効率化**
    - 他の開発者が行った変更を素早く理解し、レビュー時の負担を軽減。
    - 「この変更の目的は？」などの質問をAIに投げることで、開発者の意図を推測しやすくなる。
- **履歴の振り返り**
    - 過去のコミットを遡り、特定の変更がなぜ行われたのかを再確認。
    - ドキュメント化されていない変更も、コミットメッセージやコードの差分をもとに説明可能。
- **バグ修正の解析**
    - あるバグの原因となった変更を特定し、その背景を理解する。
    - 「この変更がバグに影響を与えた可能性は？」といった問いかけも可能。
- **キャッチアップ**
    - 過去のコミットを参照しながら、プロジェクトの変更履歴を学習。
    - 「このリファクタリングの目的は？」などの質問を通じて、設計の意図を理解。

### まとめ

Cursor 0.46 の新機能により、Gitコミットの解説が簡単に行えるようになりました。コードレビューの効率化や、履歴の振り返り、キャッチアップなど、多くの場面で活用できます。AIを活用して変更の背景を素早く理解し、開発の生産性を向上させましょう！
【React×TypeScript×Supabase】supabaseでテーブルを紐づけた際にデータ挿入で迷った話

# はじめに
supabaseで、リレーションしているテーブルにIDを紐づける時、
少し手法に迷ったので記事にします

# テーブルの状況
現在のテーブル状況はこちら
userテーブル
| カラム名     | 型     |
|--------------|--------|
| id           | string |
| email        | string |
| name         | string |
| created_at   | string |
| user_id      | string |
| reviews_id   | string |
| record_id    | string |
| goals_id     | string |

goalsテーブル

| カラム名             | 型     |
|----------------------|--------|
| id                   | string |
| target_records       | string |
| current_records      | string |
| target_sales_hours   | string |
| current_sales_hours  | string |
| week_start_date      | string |

idとgoals_idを紐づけています


# 問題
SQLを使う？とか考えていたりして、とにかくやり方に迷いました。

一旦、作業をバラバラにして考えてみたところ、大雑把に三つのやり方に分けられるのかなと。

1.goalsテーブルに挿入する
2.goalsテーブルのidを取得する
3.それを現在ログインしているuserのテーブルに挿入する

こんな感じで考えました。（もっといい手法があったらすみません）

# 解決方法
まずは2つのapiを作成します
```typescript
// insertをしてデータを挿入
export const InsertGoal = async (goal: GoalTargetData) => {
  const { data, error } = await supabase.from("goals").insert(goal).select("id").single();
  if (error) {
    throw error;
  }
  return data.id;
};

//user_idに挿入するためのAPI
export const UpdateUserGoalId = async (userId: string, goalId: string) => {
  const { error } = await supabase.from("users").update({ goals_id: goalId }).eq("id", userId);
  if (error) {
    throw error;
  }
};

```
onClickとかでデータを送るときのコードを準備
```typescript
const [user] = useAtom(userAtom);
  const [learning, setLearning] = useState<number>(0);
  const [sales, setSales] = useState<number>(0);
  const [works, setWorks] = useState<number>(0);
  const [error, setError] = useState<string>("");
  const [isLoading, setIsLoading] = useState<boolean>(false);
  const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    try {
      setIsLoading(true);
      // NOTE: データの整形をここで行う
      const goal = {
        target_records_hours: learning,
        target_sales_hours: sales,
        target_works_hours: works,
      };
      const goalId = await InsertGoal(goal);
      if (user?.id) {
        await UpdateUserGoalId(user.id, goalId);
      }
    } catch (error) {
      if (error instanceof Error) {
        console.log(error);
        setError(error.message);
      } else {
        setError("エラーが発生しました");
      }
    } finally {
      setIsLoading(false);
    }
  };
```

今回は状況切り分けのために、`try`を使って`console`上でエラーハンドリングをしましたが、ここはちゃんとしたコードを書いた方がいいと思います

まず、さっきのやり方で考えると、
```typescript
    const goalId = await InsertGoal(goal);
      if (user?.id) {
        await UpdateUserGoalId(user.id, goalId);
      }
```
`InsertGoal`は`return`で`data.id`を返しているので、
それを一旦、変数で格納します
その後、`UpdateUserGoalId()`を使用します
api側で決めた引数としては、
第一引数が、userIdで、第二引数が、goalIdです

そして、今回はjotaiで管理していた`user`つまり、今回ログインしているユーザーの情報を、atomで引っ張ってきます
```typescript
const [user] = useAtom(userAtom);
```
そこで`user.id`を設定してあげると、今ログインしているユーザーのIDにあるカラムの`goals_id`に入るってわけですね。

# おわりに
手法に迷うことはありますが、迷ったり詰まったら一度作業をバラバラにして考えてみる。これを徹底していこうと思います。
セミナーメモ（DeNA QA Night　2025/03/05）

# このページは何？
2025年3月5日に行われたDeNA QA Nightについて書いたメモです。
トピックや内容、それを受けての所感などを徒然なるままに書いていきます。

#  Session1:リアルタイム品質モニタリング導入
- DeNA QAの変遷:
    -  事実を把握する → 統計的な予想を立てる → 品質の判定をする（いまここ）
-  品質を判定する上での課題:
    -  データ（根拠）がないため判定しづらい
    -  判定には経験が必要だが、シニアなQAがいない状況もある
-  解決策:
    -  全プロダクト共通の品質指数の定義とリアルタイムモニタリングを導入
            -  各verのリリース前に品質指数を算出しリスクを判定
            -  リリース前に、品質的なリスクが高いか低いかを可視化する
    -  指数と本番障害の実績データを比較して根拠を裏付ける
        -  高リスク（＝品質指数が低い）→本番障害が起きやすい など
-  良かった点:
    -  リソースの最適化ができる
        -  指標が悪ければ追加テストの実施、良ければ一部のテストを省略
        -  リスクが高い場合はリリース時に障害対応リソースを厚くする など
    -  他プロダクトと比べられるのが（プロダクト責任者など上位レイヤーから）好意的に受け取られた
-  筆者感想など:
    -  まずはデータの取り方を各部署で統一することが重要だなぁ
    -  あとで登壇者さんに話を聞いたこと
        -  共通の指標を各プロダクトに導入～データ蓄積するまで2年程かかったそうな...。
        -  AIにオールインする（[参考](https://fullswing.dena.com/archives/100153/)）ので、今まで貯めたデータが不要になるかも、と震えていらっしゃいましたｗ  
#   Session2: ガチャのパトロールの話

- プレサートチームについて
    - QAチームとは別に、ガチャに関するリスクを管理する専門チーム
    - 主にCESAやDeNA独自のガチャガイドラインへの準拠確認が業務内容
- 具体的な活動:
    - 実際の本番アカウントを使用してのパトロール
    - 実態（データ）と訴求（仕様書や想定）の比較チェック
    - AIを用いた、過去の不具合レポート全体のサマリーおよび、それによるテスト観点設計
-  筆者感想:
    -  自社独自のガチャガイドラインがあるのが新しい発見
    -  職種を超えたリスク管理チームも有効かもしれない
    -  過去の不具合データをAIに食わせて分析させ、プロダクトの弱点を探るのはやってみたいかも
    -  昨今はネットで炎上したときの火力が上がっており、以前より厳しいリスク管理が必要であることに強く共感した
    
# Session3:   ニコニコじゃない方の品質保証の話（From:ドワンゴさん）
- ニコニコじゃない方...とは？
    - 教育事業のQA組織に関する話でした ~~（品質保証の闇 的な側面の話かとてっきりｗ）~~
- 教育事業（N校など）のサービス開発における課題:
    - 各サービスの影響範囲が把握できない
        - 「様々なサービスから成り立っている」かつ「サービス間を連携するマイクロサービスが多い」ため
        - サービスAに入れた機能改修が思わぬサービスに影響を与えていることが
    - 情報共有の問題（関心の薄さ、認識の相違）
        - 各担当者が他サービスへの関心が薄いため、情報連携がなされていない
- 課題への解決策:
    - サービス間横断の情報共有ミーティング開催
        - 連携の大切さを実感した社員が多かったことは成果といえる
VSCodeのターミナルで補完が効くように！（Visual Studio Code 1.98）

# はじめに
3/6にリリースされたVSCodeのバージョン1.98で、ターミナルでの補完機能がありました！

この記事ではターミナルの補完機能を使用例とともにざっくりお伝えできればと思いますー

# 導入
- VSCodeを最新バージョンにアップデート
- 設定から `terminal.integrated.suggest.enabled` を有効にする

# 使用例
## コマンドの補完
例）lを入力すると、lから始まるコマンドの候補が表示されます

![](https://storage.googleapis.com/zenn-user-upload/02b1451e84d9-20250307.png)

## ディレクトリ、ファイルの補完
例）lsの後に.や/を入力するとディレクトリ、ファイルの候補が表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/46ec0596-cb1d-4fca-89af-9bf9711652dd.png)

## オプションの補完
例）lsの後に-を入力すると、オプションの候補が表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/7eb251a0-f5ff-4ada-9d4b-57b68c0c1e49.png)


## gitのブランチの補完
例）gitコマンドでブランチの候補が表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697143/e45c1ae7-dd02-484b-ae8f-b13b7f48e106.png)

# その他
今回はターミナルの補完機能を取り上げましたが、GitHub Copilotの方でも色々アップデートされていました！

Copilot Chatではエラーやフォルダーもチャットに添付できるようになったり、#codebaseの検索機能が強化されたのも便利そうに感じました。

Agentモードはまだ使えてないので使っていきたいです！


# 終わりに
VSCodeのターミナルよく使うよって人は、ぜひVisual Studio Code 1.98 をダウンロードして、試してみてください〜

少しでも参考になったら嬉しいです！
Active Directory入門：ドメインコントローラーを支えるDNSの役割、SRVレコード、動的更新、フォレスト管理を解説

## はじめに
アクティブディレクトリ（AD）は、企業のネットワーク管理に欠かせない技術です。

:::note info
**特にDNSとの連携が重要であり、適切な設定が求められます。**
:::

本記事では、ADとDNSの関係について基本的な仕組みを解説します。

## 書こうと思ったきっかけ
ADを運用する上で、DNSの設定ミスによるトラブルが多いと感じました。

***正しい知識を整理し、スムーズなネットワーク管理を実現するために書くことにしました。***

初心者にもわかりやすく、実践的な情報を伝えることを目指します。

## 1. アクティブディレクトリとは？
アクティブディレクトリ（Active Directory、AD）は、Microsoftが提供するディレクトリサービスであり、組織内のネットワークリソース（ユーザー、コンピューター、プリンター、ファイル共有など）を一元管理するための仕組みです。

ADはドメインコントローラー（DC）によって管理され、ユーザー認証やアクセス制御の重要な役割を担っています。

## 2. DNS（ドメインネームシステム）とは？
DNS（Domain Name System）は、ドメイン名とIPアドレスを対応付けるためのシステムです。

インターネットや企業ネットワークではホスト名を使用して通信を行いますが、実際の通信にはIPアドレスが必要になります。

DNSはこの変換を行い、スムーズなネットワーク通信を実現します。

## 3. ADとDNSの関係
ADとDNSは密接に関連しており、DNSはADの適切な運用に不可欠です。主な関係は以下のとおりです。

### 3.1 ADにおける名前解決
AD環境では、クライアントやサーバーがドメインコントローラーを特定し、認証サービスを利用するためにDNSを使用します。

例えば、ユーザーがドメインにログインする際、クライアントはDNSを介してDCのIPアドレスを取得し、認証プロセスを進めます。

### 3.2 SRVレコードの利用
ADはDNSのSRV（Service Locator）レコードを活用し、特定のサービス（例：LDAPやKerberos認証）を提供するサーバーの位置を示します。

例えば、`_ldap._tcp.<ドメイン名>` のSRVレコードにより、LDAPサービスを提供するDCの情報がDNSに登録され、クライアントが適切なDCに接続できるようになります。

### 3.3 動的更新
AD環境では、クライアントやサーバーのIPアドレスが変更されることがあります。

これに対応するため、AD統合DNSでは動的更新機能を使用してDNSレコードを自動的に更新できます。これにより、最新の名前解決情報が維持されます。

### 3.4 フォレストとドメインの管理
ADはフォレストやドメインといった論理的な階層構造を持ちます。それぞれのドメインには専用のDNSゾーンが必要です。

例えば、`example.com` というドメインがある場合、`example.com` 用のDNSゾーンが作成され、ADの動作を支えます。

## 4. AD環境におけるDNSのベストプラクティス
AD環境でDNSを適切に管理するためには、以下のポイントに注意する必要があります。

1. **AD統合DNSの使用**: DNSをADと統合することで、セキュリティや管理の効率性が向上します。
2. **動的更新の有効化**: クライアントやサーバーが自動的にDNSレコードを更新できるように設定し、管理の負担を軽減します。
3. **複数のDNSサーバーを配置**: 可用性を確保するため、少なくとも2台のDNSサーバー（通常はDC）を設置することが推奨されます。
4. **適切なフォワーダーの設定**: インターネットの名前解決を円滑にするために、外部のDNSサーバー（例：Google Public DNS 8.8.8.8）をフォワーダーとして設定することができます。
5. **逆引きDNSの設定**: IPアドレスからホスト名を解決できるように逆引きゾーンを設定すると、トラブルシューティングが容易になります。

## まとめ
ADとDNSは相互に依存しており、DNSの問題がADの運用に重大な影響を及ぼす可能性があります。

:::note warn
***名前解決、SRVレコードの利用、動的更新の管理を適切に行うことが、安定したAD環境の構築に不可欠です。***
:::

信頼性の高いAD環境を実現するために、DNSの適切な設定と運用を心掛けましょう。
Modifierを定期的に棚卸し！コードを軽やかにする整理術

Jetpack Composeを使っていると、ついついModifierが重なり複雑になってしまうことがあります。定期的にModifierを棚卸しして、コードを軽やかにしましょう。

## Modifierの重複を整理する

Modifierを重ねると、コードが冗長になり、可読性が低下します。重複したModifierは積極的に整理してまとめましょう。

### 改善前

``` kotlin
Modifier
    .padding(16.dp)
    .padding(8.dp)
    .background(Color.Blue)
    .background(Color.Blue)
```

### 改善後

``` kotlin
Modifier
    .padding(24.dp) // パディングをまとめる
    .background(Color.Blue) // 重複を削除
```

## 親コンポーネントで共通のModifierを設定

同じ余白や配置を持つ子コンポーネントが複数ある場合、親コンポーネント側でまとめて設定するとコードがスッキリします。

### 改善前

``` kotlin
Column {
    Text("Hello", modifier = Modifier.padding(8.dp))
    Text("World", modifier = Modifier.padding(8.dp))
}
```

### 改善後

``` kotlin
Column(
    modifier = Modifier.padding(8.dp)
    verticalArrangement = Arrangement.spacedBy(16.dp) // 親で余白を指定
) {
    Text("Hello")
    Text("World")
}
```

こうすることで、子コンポーネントごとに個別に余白を設定せず、一括で管理できます。

## まとめ

- Modifierの重複を見つけて整理する
- 共通の余白や配置は親コンポーネント側で設定

この整理術を取り入れて、読みやすくメンテナンスしやすいComposeコードを目指しましょう！
NodeJSでtsconfigのbaseUrlを設定する際にハマったこと

# まえがき
別ファイルを `import` する際に、いちいち相対パスで書くのが煩わしいので、絶対パスで書けるようにしたかった。  
React では `baseUrl` を設定することで実現していたため、Node.js でも同様に設定することにした。

# 試したこと
まず、`tsconfig.json` の `baseUrl` へ基準にしたいパスを設定。

```diff_json
{
  "compilerOptions": {
    "target": "es2020",
    "strict": true,
    "module": "commonjs",
    "outDir": "./dist",
+   "baseUrl": "./src"
  },
  "include": ["src/**/*"]
}
```
`import`を書き換える
```diff_typescript
-  import UserController from '../../controller/UserController'
+  import UserController from 'controller/UserController'
```

この状態で`ts-node`を使って実行してみる。
```shell
ts-node src/server/local.ts

Error: Cannot find module 'controller/UserController'
```
パスをちゃんと認識してくれない...

# 落とし穴
Reactでは`react-scripts`が`tsconfig.json`の設定を解析し、Webpackの`resolve.modules`に自動適用するため、特に他の設定は不要。
しかし、Node.jsでは`tsc`でビルドを行うため、`baseUrl`だけでは`import`の解決が機能しない。
これは Node.jsの`require`(ESMなら`import`)の仕様によるもので、Webpackのように`baseUrl`を考慮しないためである。

# 解決方法
1. `tsconfig-paths`というライブラリをインストール
    `ts-node`で実行する場合、`tsconfig-paths`を自動適用させるために以下の設定を追加。
    ```shell
    npm install tsconfig-paths
    ```
2. tsconfig.jsonの修正
    ```diff_json
    {
    +  "ts-node": {
    +    "require": ["tsconfig-paths/register"]
    +  },
      "compilerOptions": {
        "target": "es2020",
        "strict": true,
        "module": "commonjs",
        "outDir": "./dist",
    +   "baseUrl": "./src"
      },
      "include": ["src/**/*"]
    }
    ```
    **※注意**
    `paths`を指定すると`baseUrl`のみでは解決されなくなる。もし`paths`を設定する場合、以下のように`*` で対応させると良い。
    ```json
    {
      "compilerOptions": {
        "baseUrl": "./src",
        "paths": {
          "*": ["*"]
        }
      }
    }
    ```

3. ts-node での実行方法
    `tsconfig.json`に以下のような`ts-node.require`の設定があれば、特にオプションを指定しなくても `tsconfig-paths`が適用される。
    ```json
    {
      "ts-node": {
        "require": ["tsconfig-paths/register"]
      }
    }
    ```
    もしこの設定がない場合は、以下のように`-r tsconfig-paths/register`を指定して実行する。
    ```shell
    ts-node -r tsconfig-paths/register src/server/local.ts
    ```
    `nodemon`を使う場合は、`--exec ts-node`が適用されるため、特に`-r tsconfig-paths/register`を指定しなくても問題なく動作する。
    ```shell
    nodemon --exec ts-node -r dotenv/config app/server/local.ts
    ```


# 補足
- ビルド後に node で実行する場合
    `tsconfig-paths`は`ts-node`実行時に適用されるため、ビルド後の`.js`ファイルを`node`で直接実行する場合は、環境変数`NODE_PATH`を設定する必要がある。
    ```dockerfile
    ENV NODE_PATH ./dist
    ```
　
- 動作環境による違いを明記
    - `tsconfig.json`に`ts-node.require`がある場合、`-r tsconfig-paths/register`を明示的に指定しなくても動く
    - 逆に、この設定がない場合は`-r tsconfig-paths/register`を指定する必要がある
　
- エラー時の対処法
    - 環境によっては`-r tsconfig-paths/register`を書かなくても動作するが、もし`Cannot find module '〇〇'`のようなエラーが発生する場合は`-r tsconfig-paths/register`を試すと良い
Mistral OCR API を使って PDF からテキストを抽出する


## はじめに
Mistral OCR API を利用して、ローカルの PDF からテキストを抽出し、Markdown 形式で保存する方法を紹介します。

Mistral OCR は、レイアウトを保持したままテキストを取得できる高精度な OCR エンジンです。本記事では、ローカルの PDF をアップロードし、OCR 解析を実行し、取得したテキストを保存する Python スクリプトを解説します。

## 必要なライブラリのインストール
まず、Mistral の Python SDK をインストールします。

```sh
pip install mistralai
```

## OCR スクリプト
以下の Python スクリプトを実行することで、PDF を Mistral OCR にアップロードし、OCR 処理を行い、テキストを Markdown 形式で取得できます。

### **スクリプト全体**
```python
import os
from mistralai import Mistral

# APIキーの取得（本当は環境変数から取得するのが推奨）
api_key = ""
if not api_key:
    raise ValueError("MISTRAL_API_KEYが設定されていません")

# Mistral APIクライアントの作成
client = Mistral(api_key=api_key)

# ローカルPDFのパス
pdf_path = ""

# PDFをMistralにアップロード
uploaded_pdf = client.files.upload(
    file={
        "file_name": "",
        "content": open(pdf_path, "rb"),
    },
    purpose="ocr"
)

# アップロードしたPDFのサイン付きURLを取得
signed_url = client.files.get_signed_url(file_id=uploaded_pdf.id)

# OCR処理を実行
ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document={
        "type": "document_url",
        "document_url": signed_url.url,
    }
)

# OCRの結果を取得（最初のページのmarkdown形式テキスト）
ocr_text = ocr_response.pages[0].markdown if ocr_response.pages else ""

# 抽出されたテキストを保存
output_txt_path = ""
with open(output_txt_path, "w", encoding="utf-8") as f:
    f.write(ocr_text)

print(f"OCR結果を {output_txt_path} に保存しました。")
```

## スクリプトの流れ
1. **APIキーを取得**
   - `api_key` に Mistral の API キーを設定します。

2. **PDFをアップロード**
   - `client.files.upload()` を使用して Mistral のサーバーに PDF をアップロードします。

3. **サイン付きURLを取得**
   - `client.files.get_signed_url()` で、アップロードした PDF の URL を取得します。

4. **OCR処理を実行**
   - `client.ocr.process()` で OCR を実行します。
   - `model="mistral-ocr-latest"` を指定して、最新の OCR モデルを利用します。

5. **OCR結果を取得し保存**
   - `ocr_response.pages[0].markdown` から、最初のページのテキストを取得します。
   - `output.txt` に OCR 結果を保存します。

## 実行方法
PowerShell またはターミナルで以下を実行します。

```sh
python ocr_mistral.py
```

実行後、`output.txt` に OCR 結果が保存されます。


## まとめ
Mistral OCR API を使用すれば、簡単にローカルの PDF を OCR 解析し、Markdown 形式でテキストを取得できます。

**ポイント:**
- Mistral API を使って PDF をアップロード
- OCR 結果を取得し、Markdown 形式で保存
- Python で簡単に実装可能

興味があれば、ぜひ試してみてください！ 🚀


## 参考

https://docs.mistral.ai/capabilities/document/

##  時間があれば

以下で作ってみたいところ。

フロントエンド：React + Tailwind CSS
バックエンド：FastAPI（Python）
OCR処理：Mistral OCR API
ストレージ：ローカル
【忘備録】bashでディレクトリ内のファイルの拡張子を一斉書き換え

forでディレクトリ内のファイルを取得し、mvでファイル名の後ろ４文字（.拡張子）を削除してファイル名変換
```
for file in *
do
mv "$file" "${file::-4}"
done
```
１行で書くとこんな感じ
```
for file in *; do mv "$file" "${file::-4}"; done
```
${file::-4}の後ろに、変換したい拡張子（.mp4とか）を入れれば書き換えできます。
DateTimePickerでの時間選択のスクロールが逆方向に動く

## 事象

DateTimePickerでの時間選択を行う際のスクロールが逆方向に動いてしまう。

## 原因

DateTimePickerのバグだと思われる。

GitHub上にissueがあった。
https://github.com/xdan/datetimepicker/issues/763

## 行なったこと

`jquery.datetimepicker.full.min.js`のファイルがプロジェクト内にあったのバージョンアップを試みたが、プロジェクト内のファイルを他のメンバーが直接書き換えを行なったコミット履歴が存在したので該当箇所を直接書き換えることにした。

今回は709行目からのコードを書きえた。
GitHub上のissueと同じコードが存在しなかったので、バージョンによってコードが変わるのだと思われる。
```diff_javascript
                 i = l[0].clientHeight, s = o[0].offsetHeight, r = (n = i / s) * d[0].offsetHeight, 1 < n ? u.hide() : (u.show(), u.css("height", parseInt(10 < r ? r : 10, 10)), c = d[0].offsetHeight - u[0].offsetHeight, !0 !== a && l.trigger("scroll_element.xdsoft_scroller", [t || f / (s - i)]))
             }), l.on("mousewheel", function (e) {
                 var t, a,
-                    n = (t = e.originalEvent, a = 0, "detail" in t && (a = t.detail), "wheelDelta" in t && (a = -t.wheelDelta / 120), "wheelDeltaY" in t && (a = -t.wheelDeltaY / 120), "axis" in t && t.axis === t.HORIZONTAL_AXIS && (a = 0), a *= 10, "deltaY" in t && (a = t.deltaY), a && t.deltaMode && (1 === t.deltaMode ? a *= 40 : a *= 800), a),
+                    n = (t = e.originalEvent, a = 0, "detail" in t && (a = t.detail), "wheelDelta" in t && (a = -t.wheelDelta / 120), "wheelDeltaY" in t && (a = -t.wheelDeltaY / 120), "axis" in t && t.axis === t.HORIZONTAL_AXIS && (a = 0), a *= 10, "deltaY" in t && (a = t.deltaY),
+                    // スクロール量の正規化
+                    a = a < 0 ? Math.min(a, -1) : Math.max(a, 1), a && t.deltaMode && (a = (1 === t.deltaMode ? a * 40 : a * 800)), a),
+                    // スクロール方向の調整
+                    n = n * -1,
                     r = Math.max(0, f - n);
                 return l.trigger("scroll_element.xdsoft_scroller", [r / (s - i)]), e.stopPropagation(), !1
             }), l.on("touchstart", function (e) {
n * -1,
```

## 学び

1. スクロールの処理が逆方向に動く時は、JavaScriptで処理を行っている可能性が高いと学べた。
2. プラグイン自体にバグがある可能性を疑う

## 今後の対応

プラグインが直接書き換えられている状態だと、アップデートが行えないのでアップデートを行えるようにする。
prismaのschemaファイルが長くなってきたので分割する

本記事は「Multi-file Prisma Schema」の紹介記事です。

https://www.prisma.io/docs/orm/prisma-schema/overview/location#multi-file-prisma-schema

本機能はpreview機能となります。導入の検討は慎重にお願いします。

# 経緯
テーブルが増えてきてschema.prismaが何百行となってしまい、可読性が悪いなぁと感じるようになりました。schema.prismaをある程度のグループで管理できるようにしたいと方法を探していたら、preview機能を見つけました。

# 導入

prismaディレクトリにschemaディレクトリを作成します。
schemaディレクトリ内に、schema.prismaを移動します。
```bash
my-app/
├─ ...
├─ prisma/
│  ├─ schema/
│  │  ├─ schema.prisma
├─ ...
```

`schema.prisma`のclientに以下を追加します。

```diff
generator client {
  provider        = "prisma-client-js"
+  previewFeatures = ["prismaSchemaFolder"]
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
```

あとは、schema.prismaにあったテーブル定義を自由に分割してください。
公式だとこんな感じのファイル構成になっていました。

```bash
my-app/
├─ ...
├─ prisma/
│  ├─ schema/
│  │  ├─ post.prisma
│  │  ├─ schema.prisma
│  │  ├─ user.prisma
├─ ...
```

# TIPS
:::note warn
prismaSchemaFolderを有効にしたら、migrationコマンドを見直しましょう。
:::

prismaSchemaFolderを有効にしたら、schemaオプションに指定するのはschema.prismaではなく、**schemaディレクトリ**になります。

```diff
- npx prisma migrate deploy --schema=./prisma/schema.prisma
+ npx prisma migrate deploy --schema=./prisma/schema
```

:::note info
--schemaオプションをディレクトリに変更するのを忘れないようにしましょう
:::
私はこれをせずに結構悩みました。（ドキュメントをちゃんと読むの大事）
[HoI4 MOD Development] Creating Crisis of the Empire! #0 (English Version)

**[HoI4 MOD Development] Creating Crisis of the Empire! #0 (English Version)**

**"Crisis of the Empire"** is a major mod that transforms the world of HoI4 into the 19th century! 
The starting year is changed to **1820**, allowing players to experience an alternate history in post-Napoleonic Europe, with a particular focus on the Balkans and the Middle East.

- "What if the Ottoman Empire won the Greek War of Independence?"
- "What if the Ottoman Empire defeated Muhammad Ali?"

This mod aims to provide players with the opportunity to explore such "what-if" scenarios and reshape history!

---

### **Current Progress**

The development of this mod has just begun, and we are currently working on **map data creation**, though it has proven to be quite challenging. Our plan is to expand the vanilla map, introducing new nations and states while maintaining balance.

In the future, we aim to include the following features:

- A complete overhaul of the political, technological, and military balance as of **1820**
- New **national events and decisions**
- Additional **19th-century military units** (flintlock riflemen, sailing fleets, etc.)
- A system to **recreate major wars and revolutions** from history

---

### **Looking for Team Members!**

Currently, I am working on this mod alone. 
I am looking for fellow modders to join the development team!

If you are interested in **mod development** or want to try modding HoI4, why not join us?

We are especially looking for people with skills in the following areas:

- **Map editing** (adding states, setting terrain, etc.)
- **Event and decision scripting**
- **Historical research and balancing**
- **GUI (UI design) and 3D modeling**

No prior experience with HoI4 modding is required! 
We encourage **learning and creating together**, so beginners are more than welcome!

If you're interested, **join our Discord server** and let's talk!

Join here → **https://discord.gg/8dBrqPPM**

---

### **Future Articles**

This series will cover mod development progress and share knowledge about HoI4 modding!
If you’re interested in learning how to create a mod, this could be a valuable resource for you.

In the next article (#1), I will study and write about **how to edit map data**!

Be sure to follow and stay updated!

Let’s build **the 19th-century HoI4 mod** together!

---

*Note: I have made sure to comply with Qiita’s guidelines, but if there are any issues, please let me know!*
家計簿アプリのアカウントと関連データの削除方法

## アカウントと関連データの削除リクエストで削除されるデータ
・アカウント
・アカウントに紐づいたメンバー
・アカウントに紐づいた支払い目的
・アカウントに紐づいた支払い履歴
・アカウントに紐づいた家計簿履歴

上記のデータは削除リクエストが実行されてから即時データベースから削除されます。

## アカウントと関連データの削除手順
１．家計簿アプリを立ち上げる
２．ログイン
３．ハンバーガーメニュー（画面左上の三本線）をタップ
４．退会をタップ
５．注意書きを読んで同意した場合、「はい」ボタンをタップ
６．「ユーザーの削除に成功しました」というトーストが表示され、
　　ログイン画面への遷移が確認出来たら削除成功
Agentforce が実際何なのか全く分かりません


少々面白い議論の投稿を見つけたので日本語としてWEB翻訳しておきます。

https://www.reddit.com/r/salesforce/comments/1fkhl9v/i_have_no_idea_what_agentforce_actually_is_can/?rdt=34978


こんにちは、Salesforce SE です。これは正確ではありません。copilot の機能が Ag​​entforce に移行してブランド名が変更されるのは事実ですが、Agentforce 自体は copilot のブランド名変更ではありません。基盤となるアーキテクチャは完全に異なり、Copilot のものより大幅に複雑です。この状態に到達することが常に意図されていたと思いますが、私の意見では、元の copilot は少し精彩に欠けていました。Agentforce は大幅に機能が向上しており、copilot はこの新しいアーキテクチャに移行されているだけです。copilot は現在、Agentforce の約 25% を占めていると思います。

機能的には、Copilot は人間のエージェント/従業員のアシスタントとしてしか機能しません。Agentforce エージェントは顧客/外部とやり取りでき、従業員を支援できることに加えて、ほぼ完全に自律的に動作します。Dreamforce では、顧客のために他のエージェントを構築できる Agentforce エージェントを構築しました。私たち内部でも、まだ表面をかすめた程度です。


Agentforce は、作成する「エージェント」が生成的であるため、以前の Copilot を含むすべての Einstein 製品の集大成です。エージェント ビルダーは、プロンプト エンジニアリングと自然言語に基づく非常に単純な UI です。LLM は自然言語 (トピックと指示へのチャット マッピング) を理解し、LAM (大規模アクション モデル) は、チャットで利用可能なすべてのデータ (および知識、プロンプト、データ クラウドなど、アクセスできるもの) を取得し、質問や問題に最もよく答えるために実行する必要があるアクションを決定する決定論的なエンジンです。エージェントは、必要に応じて作成できます (セールス コーチ、SDR、カスタマー サービスなど)。また、多くの点で強力な L1 サポート モデルになる可能性があり、エージェントに対して完全な Karen を実行し、Karen を処理するマネージャーまたはエスカレーション エージェントを要求する必要がある場合に、オムニ フローに接続して人間に送信することもできます。また、エージェントをさらに強化するために、ナレッジ データまたは非構造化データの検索インデックスをすばやく取り込むことができるベクトル リトリーバーを追加するオプションもあります。ベース ビルダーはすべて自然言語であるため、導入障壁は非常に低くなっています。プロンプトでアクションを実行すると、フロー、Apex、API、データ クラウドを介して強化できるため、より複雑になる可能性があります。ただし、エージェントが実行するアクションを強化するためにプロンプ​​トに必要な情報については、ユーザー次第です。


>自律機能に関する公開リソースや、それを自分で構築する方法はありますか? エージェントはチャット ウィンドウの外側に存在し、途中で論理的な推論を行ってエージェントの方向を変える複雑なワークフローを実行できるようです。これは条件付きのフローだけですか? エージェント ワークフローをフローとしてモデル化することはできますか? ありがとうございます!

実際のところ、公開リソースについてはよくわかりません。基本的なセットアップを含む「エージェントの構築」トレイルヘッドがあり、基本的に私が話している内容の基本をカバーしていますが、これがどのように高度になるかを本当に理解するには、Salesforce プラットフォーム自体がどのように機能するかを理解することが絶対に必要です。データ モデル、自動化、コードに関連しています。これらのものが Agentforce に組み込まれていないと、Agentforce は基本的に単なる低機能の LLM になります。Agentforce が発揮できる非常に複雑なエージェント機能は、Agentforce 自体には備わっていません。Agentforce は基本的に、既存のコードとフロー、プロンプト、リトリーバーなどのインテリジェントなオーケストレーターです。

たとえば、理論的には、「Agentforce さん、連絡先の Jon Smith さんの近所にある最も高価な家の値段を教えていただけますか?」と尋ねることができます。Agentforce は、正しいアクションが割り当てられていれば、John Smith という連絡先を見つけて読み取り、レコードから郵便番号を取得し、HTTP コールアウトを使用して、必要な不動産サイトをスクレイピングするために既に構築されている外部アプリケーションを呼び出すフロー/Apex を呼び出し、「レコードの取得」フローからの入力を外部アプリケーションに渡し、結果を返してエージェントに出力し、エージェントは提供された入力を使用して質問に応答します。

これは単なる一例ですが、よく考えてみると、発生した処理のほとんどをエージェントが実行しているわけではありません。エージェントは、リクエストを解釈し、利用可能なアクションに基づいてプランを生成し、リクエストに応答するために必要なプラットフォーム コンポーネントを実行し、出力を読み上げているだけです。既存の Salesforce プラットフォーム機能は、エージェントが実際にそのすべての情報を取得できるようにする上で最も大きな役割を果たしました。エージェントはプランを作成し、アクションを実行します。すべてを合わせると、結果は非常に複雑になる可能性があります。これは 1 つの例にすぎません。お役に立てば幸いです
家計簿アプリを作る＃９

![スクリーンショット 2025-03-07 094655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/a0ba108e-ac81-4487-8cb6-a0a5e36bc301.png)
そして、AppLayoutをインポートします。

![スクリーンショット 2025-03-07 094836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/5db370e4-9090-424a-ae35-6748046862ee.png)
インポートできました。

![スクリーンショット 2025-03-07 094915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/a7a6efea-4e85-4412-b1b3-bfae259a373c.png)
ベースURLで、AppLayoutが表示されてれば、成功です。
ただ、ReportコンポーネントとHomeコンポーネントが表示されなくなったので、これを修正していきます。

![スクリーンショット 2025-03-07 095154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/cac7abf7-eb39-41ce-a9d0-2a3899c92657.png)
それは、こちらを追記することによって、

![スクリーンショット 2025-03-07 095304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/98c3e466-feb1-468f-8f52-475104e1f215.png)
AppLayoutの中身を表示することができるようになります。

![スクリーンショット 2025-03-07 095415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/c6222e36-dc8b-40a0-9b0a-d3b9cdd260bf.png)
![スクリーンショット 2025-03-07 095449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/c9045dc3-1cc2-4cf5-97c6-6192d2883ba9.png)
![スクリーンショット 2025-03-07 095522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/803cb4c2-5e74-4377-b9af-5a0afc29cf3b.png)
こちらを確認すると、すべて表示されています。
JAWS DAYSに初参加＆初登壇してみた

こんにちは！ポーラ・オルビスホールディングスで内製エンジニアをやっている高田です！

3 月 1 日に池袋サンシャインシティで開催された JAWS DAYS 2025 に初参加してきたので、今回はその様子を紹介いたします！

JAWS DAYS については以前から気になっていたのですが、気付いた時にはチケットは売り切れ、という状況でした。

今回も 2 月の下旬にはチケットは売り切れ（100 人近くのキャンセル待ち）状態だったので、参加希望の方は早めににチケットを購入することをお勧めします！

ちなみに今回私は「XP 時代の PC ゲームが AWS で復活！～ EC2 でクラウドゲーミング～」というタイトルでランチセッションに登壇してきました！

https://jawsdays2025.jaws-ug.jp/sessions/C-3

# 入場～受付まで

池袋のサンシャインシティの展示ホールに向かい、電子チケットの QR コードを見せれば入場完了です。

入場後にやることは主に以下の 3 つでした！

- パンフレットに名前を書いて首から下げておくこと。
- （登壇する人は） T シャツの受け取り。
- セッションを聴講するためのレシーバーを受け取ること。

登壇する方は事前に T シャツ受け取りのためのメールが届くので、そのメールを見せたうえで本人確認を行って受け取ります。

また、近隣のセッションの音声と混ざらないようにレシーバーで聴講する方式なので、レシーバーも忘れずに受け取りましょう！

T シャツやレシーバーを受け取る際は名刺を渡すとスムーズです。

現地での名刺交換の場面もあるので、ちょっと多めに名刺を持っていくと良いと思います！

# ランチセッションに登壇

私はランチセッション枠の一番最初の登壇だったので、
オープニングと午前のセッションを聴きながらスライドの最終チェックなどをしていました！

ランチセッションは 1 枠 20 分のセッションで、12 時～ 13 時にかけて 3 本のセッションです。

通常のセッションは 10 分ほどのインターバルを設けているのですが、
ランチセッションは間髪入れずに次のセッションに移るため時間厳守＆気持ち早めに終わるように調整する必要があります。
また、前のセッションが終わった後にすぐ開始できるように準備しておく必要があります。

私たちも前日にリハーサルを行って 18 分台で終わるように調整はしていたのですが、
本番は少し緊張してしまい、結局 19 分ほどかかってしまいました 💦

2 人で登壇したので、マイクを持っていない間はタイムキーパーをして時間がオーバーしないように努めました！

![登壇.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827848/886c9476-d3de-4dde-b1c8-3e56fe8ab8cb.png)

↑ 登壇の様子です！

ちなみにお昼ご飯はサンドイッチ、中華弁当、和食弁当がありました！
洋風弁当もあったらしいのですが、人気だったらしく私たちのセッションが終わった時にはすでに品切れでした！
（私は和食弁当を食べましたが、ボリュームもあっておいしかったです！）

# その後のセッション聴講

GameDay などの事前予約が必要なセッションを除いてどのセッションも自由に聞けるので、
その場でレシーバーのチャンネルをザッピングして関心の高そうなセッションを途中から聞きに行ったりしていました。

50 分枠の中で 7~8 人の LT を行うセッションもあって、短い時間の中で色んな話が聞けて面白かったです！

# 参加した感想

登壇者としては大勢の人の前での発表ということで身構えていたのですが、賑やかなお祭りムードのおかげであまり硬くなりすぎずに話すことができました！

コスプレをしている方も多かったのと、私のセッションテーマがゲームに関する発表だったので、「自分もコスプレしてくればよかったかな～」なんてことを考えたりしていました(笑)

GameDay などの事前予約制のワークショップも面白そうだったので、次回はワークショップにも積極的に参加していきたいです！
Laravelマイグレーション入門

# はじめに

こんにちは！
エンジニアの matsuura です。

今回は、Laravelにおけるマイグレーションについて、紹介していきます。
特定のテーブルを変更するマイグレーションファイルの作成方法について解説します。

# マイグレーションファイルの作成について

## 実行環境

今回は、以下の環境で実行確認しています。
使用する環境によってはバージョンの違いによる挙動の変化があるため、ご自身の環境と適宜照らし合わせてください。

- PHP: 8.2.23
- Laravel: 11.0.8
- データベース: MySQL 8.0
- Composer: 2.8.5

## マイグレーションファイル作成コマンド

マイグレーションファイルを作成するには、`php artisan make:migration` コマンドを使用します。

```bash
php artisan make:migration <説明> --table=<テーブル名>
```

例えば、`hoge` テーブルに `fuga` カラムを追加するマイグレーションを作成する場合、以下のようにコマンドを実行します。

```bash
php artisan make:migration add_fuga_to_hoge_table --table=hoge
```

このコマンドを実行すると、`database/migrations` ディレクトリ内に新しいマイグレーションファイルが作成されます。

## マイグレーションファイル編集

作成されたマイグレーションファイルを開くと、`up` メソッドと `down` メソッドが含まれています。

### `up` メソッドの編集

`up` メソッドでは、新しいカラムを追加する処理を記述します。

```php
public function up()
{
    Schema::table('hoge', function (Blueprint $table) {
        $table->string('fuga')->nullable()->after('exists_column');
    });
}
```

### `down` メソッドの編集

`down` メソッドでは、`up` メソッドの変更を元に戻す処理を記述します。

```php
public function down()
{
    Schema::table('hoge', function (Blueprint $table) {
        $table->dropColumn('fuga');
    });
}
```

## マイグレーションの実行

マイグレーションを適用するには、以下のコマンドを実行します。

```bash
php artisan migrate
```

逆に、マイグレーションを取り消したい場合は、以下のコマンドを使用します。

```bash
# 最後に実行したマイグレーションを取り消しいたい場合
php artisan migrate:rollback
# 全て取り消したい場合
php artisan migrate:reset
# 全て取り消した後、再度マイグレーション実行したい場合
php artisan migrate:refresh
# 全てのテーブルを削除した後、再度マイグレーション実行したい場合
php artisan migrate:fresh
```

マイグレーションの状態を確認したい場合は、以下のコマンドを使用します。

```bash
php artisan migrate:status
```

# 最後に

今回は、既存のテーブルを変更するマイグレーションファイルの作成方法について説明しました。
Laravelのマイグレーションを利用することで、データベースのスキーマ変更を簡単に管理できます。
ぜひ積極的に開発で利用し、効率的なデータベース管理に役立ててもらえたらと思います。

## エンジニア募集

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

https://gakken-leap.co.jp/recruit/
【Python】毎週勉強するシリーズ ～リストの内包表記～

# 概要
AI が流行ってる昨今 Python は必須級のスキルになってきてます。
時代に取り残されないようにコツコツと Python を勉強しようと思います！
三日坊主にならないように Qita でアウトプットしながら進めます💪

# 今日やること
[とほほのPython入門 - リスト・タプル・辞書](https://www.tohoho-web.com/python/list.html) のリストの内包表記を理解する。

# リストの内包表記
リストの内包表記を用いることで、`map()`, `filter()`, `lambda` を使用しないで簡単なリスト演算を行うことができます。

## 1. 構文
リストの内包表記は `[処理 for 変数名 in イテラブルオブジェクト]` が基本的な構文です。

## 2. 説明
リストの内包表記を用いることで、`map()`, `filter()`, `lambda` を使用しないで簡単なリスト演算を行うことができます。

## 3. map() と比較してみる

```py
a = [1, 2, 3]
print(list(map(int, a)))    #=> [1, 2, 3]
print([x for x in a])       #=> [1, 2, 3]   
```

## 4. filter() と比較してみる

```py
a = [1, 2, 3]
print(list(filter(lambda x: x % 2 == 0, a)))    #=> [2]
print([x for x in a if x % 2 == 0])             #=> [2]   
```

# 感想
今日はリストの内包表記をやってみました！

今回も見ていただきありがとうございました。
また次回お会いしましょう！！

# 次回やること
[とほほのPython入門 - 演算子](https://www.tohoho-web.com/python/operators.html) を理解する。
AIエージェントデザインパターン実践：プロンプト・レスポンス最適化

## AIエージェントのデザインパターンを実装する

AIエージェントをLanggraphで実装する「LangChainとLangGraphによるRAG・AIエージェント［実践］入門」を読んでみて、AIエージェントのデザインパターンを実際のユースケースに当てはめてColaboratory上で実装してみる。

https://gihyo.jp/book/2024/978-4-297-14530-9

今回は「プロンプト・レスポンス最適化」パターンを実装してみる。
プロンプト・レスポンス最適化は、ユーザーが初めに作成したプロンプトをそのままLLMに入力しても、必要な情報が足りないなどで良いレスポンスを得られないことが考えられる。そこで、プロンプト自体の評価を事前にLLMで行い足りない情報をユーザ側に追加で入力させたりwebに問い合わせることで、それら情報を追加したプロンプトを生成し改めてLLMに投げる。

## ユーザーに足りない情報を質問する

プロンプトについて足りない情報がある場合には、ユーザーに足りない情報を聞いてより情報量の多いプロンプトを作り直した後で質問することで、よりほしい答えを期待できる。以下のフローチャートとなるLanggraphをColaboratoryで実装した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517503/015b6734-154c-4671-afdd-202acfa9ab70.png)


https://colab.research.google.com/drive/1b_Ha1Ju9QWo6Lv39j5YpvxtilEJNpgXF?usp=sharing

質問の例として、「日本の旅行先でおすすめを教えてください。」と問い合わせてみた。追加の質問および回答は以下となった。Colaboratory上で質問について１問ずつ回答を記入した。

どの季節に旅行する予定ですか？ : 冬
旅行の期間はどのくらいですか？ : １か月
特に興味のある観光地やアクティビティはありますか？ : 川下り
予算はどの程度を考えていますか？ : ５０万円
旅行の際の移動手段は何を予定していますか？ : 特に指定なし

この質問、回答ペアともとのプロンプトから新しいプロンプトを生成し、改めてLLMに質問をなげて結果を得た。（Colaboratoryの最後の出力参照）

## webから足りない情報を付加する

プロンプトで足りない情報をwebから検索して、それらとともに答えを生成する方法もある。今回の実装では生成した回答が十分かを判定し、不十分であれば再度生成するフローとして実装した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517503/e110154d-11b3-4595-9d02-918355085060.png)

https://colab.research.google.com/drive/1Esq1eSUTT0DS1LOreFG5_vFf6OggVbNJ?usp=sharing

質問の例として、「日本の山でとれる山菜とキノコを教えてください。」と問い合わせてみた。すると、['日本 山菜 キノコ 種類', '山菜 キノコ 旬 時期', '最新 山菜 キノコ 狩り 情報']というキーワードをそれぞれ抽出してweb検索結果をもとに回答を生成した。
GitHub Actions で Azure 認証エラーのメモ(サブスクリプションが見つからない)

# 手順概要
1. Azure の EntraID でアプリを作成
1. GitHub Actions で Azure に認証する
    ```yaml
    - name: az Login
        uses: azure/login@v1
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} 
    ```
1. Actions のワークフローを実行
1. エラーが発生
    ```
    Error: No subscriptions found for ***.
    
    Error: Login failed with Error: The process '/usr/bin/az' failed with exit code 1. Double check if the 'auth-type' is correct. Refer to https://github.com/Azure/login#readme for more information.
    ```

# 原因と対応
- ログインでサブスクリプションを指定しているが、アプリの新規作成直後はサブスクリプションに紐づいていない
- Actions で操作予定の Azure リソースに作成したアプリの権限を割り当てる
- 新規で環境構築時に最小限の構成で試そうとすると遭遇しやすい
GitHub Actions で Azure 認証エラーのメモ(フェデレーション資格情報)

# 手順概要
1. Azure の EntraID でアプリを作成
1. GitHub Actions で Azure に認証する
    ```yaml
    - name: az Login
        uses: azure/login@v1
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} 
    ```
1. Actions のワークフローを実行
1. エラーが発生
    ```
    Error: AADSTS70025: The client '***'(アプリ名) has no configured federated identity credentials. Trace ID: xxxxxx-xxx-xxx Correlation ID: xxxxxx-xxx-xxx Timestamp: 2025-03-06 23:46:45Z
    
    Error: Interactive authentication is needed. Please run:
    az login
    
    Error: Login failed with Error: The process '/usr/bin/az' failed with exit code 1. Double check if the 'auth-type' is correct. Refer to https://github.com/Azure/login#readme for more information.
    ```

# 原因と対応
- アプリのフェデレーション資格情報に不備がある
- アプリの 管理>証明書とシークレット>フェデレーション資格情報 を選択して必要な情報を追加する
  -  GitHub Actions の場合は「Azure リソースをデプロイする GitHub Actions」を選択する