OmniAICreator/Qiita-1.07M huggingface dataset:
Revisiting SQL After Decades: Reviewed This Much with SQLZOO

## Table of Contents
1. [Introduction](#introduction)
2. [SQLZOO Learning Summary](#sqlzoo-learning-summary)
3. [Future Learning Plans](#future-learning-plans)

## Introduction

I am an aspiring data analyst currently studying to transition into the field, with no prior professional experience as a data analyst. In the 1990s, I worked with Microsoft Access and SQL in a hands-on capacity and gained practical experience using databases for data extraction and manipulation. At that time, data analysis was not as common in the workplace, but I learned SQL and Access directly from my seniors, which provided me with a solid understanding of basic SQL syntax and database operations.

Later, I pursued studies abroad, where I had the opportunity to learn the basics of data analysis using Excel in 2017 and 2020. Professionally, I have experience in public relations and marketing communications, where I have come to realize the importance of data analysis in decision-making. Building on this background, I began more focused learning on data analysis in mid-February 2025, with a goal of transitioning into the role of a data analyst. To start, I revisited SQL through SQLZOO, where I reviewed both basic and practical content.

## SQLZOO Learning Summary

Here are some of the key concepts I have learned through SQLZOO:

- **SELECT Clause**: Retrieve specific columns from a database.
- **FROM Clause**: Specify the table from which to fetch the data.
- **WHERE Clause**: Filter data based on specific conditions.
- **LIKE Operator**: Perform partial string matching to retrieve data matching a given pattern.
- **IN Operator**: Fetch data matching any value from a specified list.
- **LENGTH Function**: Calculate the length of a string.
- **COUNT Function**: Count the number of records that meet a specific condition.
- **BETWEEN Operator**: Extract data within a specified range.
- **DISTINCT Operator**: Eliminate duplicate data and retrieve unique results.
- **ORDER BY Clause**: Sort the results in ascending (ASC) or descending (DESC) order.
- **GROUP BY Clause**: Group data for aggregation purposes.
- **HAVING Clause**: Apply conditions to aggregated data.
- **JOIN Syntax**: Combine multiple tables to retrieve related data, including INNER JOIN, RIGHT JOIN, etc.
- **COALESCE Function**: Replace NULL values with alternative values.
- **CASE WHEN**: Return different values based on conditions.

By actively working through SQLZOO, I have deepened my understanding of SQL, especially in areas like table joins, aggregation with conditions (using HAVING), handling NULL values with COALESCE, and other essential features used in real-world applications.

## Future Learning Plans

Moving forward, I plan to continue expanding my SQL knowledge using real-world datasets from platforms like **Supabase** and **Kaggle**, and to explore data analysis using Python in combination with SQL. Through these projects, I aim to improve my skills in data preprocessing, visualization, and modeling.

In addition, I plan to share my learning progress and project results on platforms like **GitHub** and **Qiita**.
【CLI】コマンドの使用例を確認する方法【tldr】

`tldr`コマンドを使用すると使用例付きのマニュアルが表示されます。

https://github.com/tldr-pages/tldr

## インストール

以下のコマンドでHomebrewを使用してインストールします。

```terminal
brew install tlrc
```

## マニュアルを表示する

`ls`のマニュアルを表示するには以下のように実行します。

```terminal
$ tldr ls
  ls

  List directory contents.
  More information: https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.html.

  List files one per line:

    ls -1

  List [a]ll files, including hidden files:

    ls -a

  List files with a trailing symbol to indicate file type (directory/, symbolic_link@, executable*, ...):

    ls -F

  List [a]ll files in [l]ong format (permissions, ownership, size, and modification date):

    ls -la

  List files in [l]ong format with size displayed using [h]uman-readable units (KiB, MiB, GiB):

    ls -lh

  List files in [l]ong format, sorted by [S]ize (descending) [R]ecursively:

    ls -lSR

  List files in [l]ong format, sorted by [t]ime the file was modified and in [r]everse order (oldest first):

    ls -ltr

  Only list [d]irectories:

    ls -d */
```
ワーキングブランチ名生成CIの作り方

正直内容は簡単なのですが、個人的にブランチ名を考えるストレスから解放されて負担が減った気がするのでGitHub ActionsのCIでワーキングブランチ名を生成する方法を紹介します。

# 動き
issueを作成した際に、指定した文字列 + issue番号 の形式でブランチ名をコメントするアクションです。

------
とりあえず使ってみたい方はこちらのリポジトリを参照してください。
https://github.com/SEKI-YUTA/action-comment-working-branch-name

# ワークフローの実装
```
name: 'Comment Working Branch Name'
description: 'Adds a comment with a suggested branch name based on issue number and app name'
author: 'SEKI-YUTA'

inputs:
  app-name:
    description: 'The name of your application, which will be used in the branch name'
    required: true
    default: 'app'

runs:
  using: 'composite'
  steps:
    - name: Process branch name
      id: process-name
      shell: bash
      run: |
        PROCESSED_NAME=$(echo "${{ inputs.app-name }}" | sed "s/'/-/g" | sed "s/ /-/g" | sed "s/[^a-zA-Z0-9-]//g")
        echo "processed_name=$PROCESSED_NAME" >> $GITHUB_OUTPUT

    - name: Add comment
      shell: bash
      run: gh issue comment "$NUMBER" --body "$BODY"
      env:
        GH_TOKEN: ${{ github.token }}
        GH_REPO: ${{ github.repository }}
        NUMBER: ${{ github.event.issue.number }}
        BODY: |
          This issue's work branch is "${{ steps.process-name.outputs.processed_name }}-${{github.event.issue.number}}".
          branch name:
          ```
          ${{ steps.process-name.outputs.processed_name }}-${{github.event.issue.number}}
          ```
          To checkout this branch, run the following command:
          ```
          git checkout -b ${{ steps.process-name.outputs.processed_name }}-${{github.event.issue.number}}
          ```

```

やっていることの流れは以下です。
1. 引数として渡された文字列を整形して変数に格納
2. issueにコメントを追加

1でどのように整形しているかというと、`'` を `-` に変換して、スペースを `-` に変換して、英数字以外の文字を削除しています。これはブランチ名として使える文字列に変換するためです。

# おわりに
課題だと思っているのが、現状だとissue作成した時点でコメントが追加されるので、問題の報告共有として作成したIssueの場合にもコメントが追加されてしまいます。そのため、[Work]などのプレフィックスがタイトルについていた場合にコメントが追加されないようにするなどの改善をすることを考えています。
このアクションを使うことで、ブランチ名を考えるストレスから解放されることができると思います。ぜひ使ってみてください。

https://github.com/SEKI-YUTA/action-comment-working-branch-name
ITエンジニア必見！最新AIモデル「GPT-4.5」の全貌と活用法

## はじめに

2025年2月27日にOpenAIがリリースした最新大規模言語モデル「GPT-4.5」は、知識量の向上、誤情報（ハルシネーション）の大幅低減、そして「EQ（感情知能）」の強化が特徴です。
従来のモデルに比べ、自然で温かみのある対話が可能になっており技術者だけでなくクリエイターやビジネスパーソンにも大きなインパクトを与えています。
本記事では、GPT-4.5の具体的な機能や利用方法、活用事例を詳しく解説しあなたがぜひ使ってみたくなるような内容をご紹介します。

![gpt4-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4006596/b2eb7e64-5061-4aae-b03e-3be04cfdc257.png)

## GPT-4.5の主な特徴

### 1. 豊富な知識と正確性の向上
- **知識量アップ**  
  大量の学習データを元にトレーニングされたGPT-4.5は、幅広い分野の知識を持ち専門的な質問にも的確な回答が可能です。
  たとえばSimpleQAベンチマークでは正答率が大幅に向上し、従来のモデルに比べ誤情報の生成が大幅に減少しました。
  [OpenAIリリース](https://openai.com/ja-JP/index/introducing-gpt-4-5/)

- **ハルシネーションの低減**  
  従来のGPT-4oで発生していた誤情報生成（ハルシネーション）が約60%から37%にまで減少し、ユーザーが安心して利用できる信頼性の高い出力を実現しています。

### 2. 自然で温かみのある会話体験
- **感情知能（EQ）の向上**  
  GPT-4.5はユーザーの意図や微妙なニュアンスをより正確に把握し、まるで本物の対話相手と話しているかのような自然なコミュニケーションを実現します。
  実際、悩み相談やブレインストーミングの場面で寄り添うような回答が得られるのが魅力です。

### 3. 非推論型モデルとしての効率性
- **Chain-of-Thought非依存**  
  GPT-4.5は、思考プロセス（Chain-of-Thought）に頼らず、効率的な情報処理と高速な応答を目指しています。これにより、文章生成やプログラミング支援など、実用性重視のタスクで高品質な出力が期待できます。

## 具体的な利用方法

### 1. ChatGPT UIでの利用
ChatGPT Proプラン（200ドル/月）のユーザーは、モデル選択メニューから「GPT-4.5」を簡単に選ぶことができます。  
※2025年3月5日から、Plusユーザーでも「GPT-4.5」が一部利用可能になりました。
　[OpenAIのXポスト](https://x.com/OpenAI/status/1897346510821711959)
- **機能連携**: 画像生成、ファイルアップロード、ウェブ検索、キャンバス機能などと連携し、より多彩な作業が可能です。

### 2. API経由での利用
開発者向けにはOpenAI Developer PlatformのAPIを通じて従量課金制で利用できます。  
- **Playground利用**: API Playgroundを使えばほぼChatGPTと同じUIでGPT-4.5を試すことができ、実際のプロジェクトへの組み込みも容易です。

### 3. 実用例
- **ライティング支援**: ブログ記事、技術ドキュメント、メールの文章校正や要約がスムーズに行えます。  
- **プログラミングサポート**: コード生成、デバッグの提案、技術的質問への回答でプログラマーの作業効率が向上します。  
- **アイデアブレインストーミング**: 新規プロジェクトのコンセプトやデザイン、マーケティング戦略の立案に、豊富な知識と直感的な回答が役立ちます。

## 利用上の注意点

- **高い計算コスト**: GPT-4.5は非常に大規模なモデルのため、API利用料が従来のモデルに比べて高額です。頻繁に使用する場合はコスト管理が重要になります。
- **応答速度の低下**: 高品質な出力を実現するために、生成に時間がかかる場合があります。大量のリクエストを扱う際はシステムのパフォーマンスにも注意しましょう。

## まとめ

GPT-4.5は知識量の向上、誤情報生成の低減、そして感情を理解する高いEQによって従来のモデルを凌駕する次世代AIとして登場しました。
有料ユーザーや開発者は、この最先端技術を活用してライティング、プログラミング、アイデア出しなどさまざまなタスクの効率を大幅にアップさせることができます。  
ぜひこの記事を参考にGPT-4.5を試し、その魅力と可能性を体感してみてください！

---
※本記事は個人の見解であり、実際の利用環境やコストはOpenAIの公式情報をご確認ください。
【試してみた】AWS User Notificationsを遊んでみた

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

たまたま調べていたら**AWS User Notifications**なるサービスが目に留まったので、ハンズオンがてら簡単に触ってみました。

サクッと読める分量で執筆しておりますので、お気軽に読んでいただけますと幸いです。

## サービスについて

サービスページを見てみると以下の通り示されていました。

https://aws.amazon.com/jp/notifications/

>AWS ユーザー通知を使用すると、AWS Health イベント、Amazon CloudWatch アラーム、EC2 インスタンスの状態変化など、AWS のサービスからの通知を一貫したわかりやすい形式で一元的にセットアップして表示できます。

ざっくり言えば、**AWSで提供している通知サービスをいい感じで表示してくれる機能**と思ってもらえればわかりやすいかと思います。

GA自体は2023年と割と新しい機能と言えます。

https://aws.amazon.com/jp/about-aws/whats-new/2023/05/aws-user-notifications-available/

直近ではCloudFormationでの利用可能に関しても発表されています。

https://aws.amazon.com/jp/about-aws/whats-new/2025/01/aws-user-notifications-ga-cloudformation/

:::note warn
利用料金自体は無料ですが、バックグラウンドで作成されるEventBridgeに関しては料金がかかるため、調子に乗って設定を行いまくると予期せぬ課金につながります。
:::

## 遊んでみた

AWS User Notificationsを選択すると以下画面が表示されます。
今回はAWS Healthの設定を入れてみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/6ef61468-cded-474d-9a22-5126d94d9370.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/8df36649-afba-4549-ade0-d3d2fb82a5ea.png)

通知設定画面が表示されるため以下のように入力しました。
※実際は自分のメールアドレスを入れることをお勧めします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/ed33c62a-f3b2-461b-9c2b-21860aea580e.png)

設定完了後、通知先メールアドレスに有効化処理に関するメールが届くため**Verify Email**ボタンを押しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/cb24045f-ed05-4e42-ac54-c863329657dd.png)

押下後、**Eメールが検証されました**といった画面が表示されたら問題なく通視されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/4c86d891-bf38-404f-8d9c-14e6c8b277f1.png)

通知設定>作成した通知ルールをクリックして**リージョン別のステータス**と**ステータス**がアクティブになっていれば、問題なく設定されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/4146d408-1956-47cb-917a-b0c517e992b9.png)

通知に関してはこれから来るようですが、設定を見る限り5分ごとに集約した情報が届くのかなぁといった印象を持ちました。

:::note info
通知設定一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/197e4575-fec8-4455-b768-f86bbc136991.png)
:::

ちなみに余談ですが、Event Bridgeでも以下のように設定がされていることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/c655658c-bab1-49bf-ae2d-c102ab05b73c.png)

## 個人的な所感（ビジネス視点）

個人的に触ってみて**アラート管理、ヘルスチェック通知管理**に関してイチから設計⇒実装⇒運用していくのは工数がかかるので、本サービスを利用すればいい感じで通知管理ができるようになるのではないかなぁと思いました。

個人的にお手軽に通知機構を実装できるので、試してみてもいいのではないかと思います。
（CloufFormationにも対応しているので、IaC運用にもフォローできているので）

## 参考ブログ

https://dev.classmethod.jp/articles/aws-user-notifications-release/

https://dev.classmethod.jp/articles/user-notifications-ga-cloudformation/

ざっとした記事ですが、最後までお読みいただきありがとうございました。
your account is not active, please check your billing details on our website.

# OpenAI APIを久しぶりに使おうとしたができない？
タイトルと同じエラーが発生した😅

>your account is not active, please check your billing details on our website.

こちらのサイトに解決策が書いてあるようだが人によってケースが違うみたいだ？

- クレジットカード情報を登録してない？
- api keyを新しく発行する

私の場合だと、Billingのところで、$5だろうかお支払いしたら使えるようになった😅
しかし２回請求が来た？

海外のサイトを見て参考に解決できた。

https://community.openai.com/t/your-account-is-not-active-please-check-your-billing-details-on-our-website/29662

![スクリーンショット 2025-03-17 23.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/86c88291-71d2-48e4-abc3-a539756db7f1.png)

登録したあとですが、JCBのデビッドカードを登録しました。
![スクリーンショット 2025-03-17 23.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/1673a329-abdc-44ff-b929-fd292eda6fcf.png)

Pythonで動作確認したソースコードです。ご自分のapi keyを使用して試してみください。
```python
from openai import OpenAI

# APIクライアントを初期化
client = OpenAI(
    api_key="my-api-key"  # あなたのAPIキーを入力
)

# チャット完了リクエストを送信
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "今日の天気を教えてください"}
    ]
)

# レスポンスを表示
print(response.choices[0].message.content)
```

**API KEYを隠した状態で撮影**
![スクリーンショット 2025-03-17 23.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/5c641aa5-dfbc-4fac-9511-21815d82b9d7.png)

## 最後に
はじめての方、久しぶりに登録した方でOpenAIが使用できないことがあったらチャージする画面でクレジットカードの入力をしていない可能性があります。

それと新規プロジェクト作ったので、APIの使用制限していなかったので、Limitsというタブで設定しましょう。デフォルトだと$120だったような😅
危ないので慎重に使いましょう🚨

![スクリーンショット 2025-03-17 23.51.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/7a8db260-ecbe-42bc-baad-5239f9db8ea8.png)
FTPSサーバーを触ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/4561fca7-7000-40dd-8155-af3d5b05ae56.png)
こんにちは！ 
以前、FTPを導入しましたが、かなりセキュリティがガバガバです。
そこで、暗号化を備えたFTPS（FTP over SSL/TLS）を構築し、動作を確認した内容をまとめます。
# FTPの問題点とFTPSの必要性

### FTPの問題点
1. **通信が暗号化されない**: FTPは平文通信のため、ネットワーク上でパスワードやデータが漏洩するリスクがあります。
2. **ファイアウォールの問題**: FTPのパッシブモードでは複数のポートを開放する必要があり、管理が煩雑になります。
3. **MITM攻撃のリスク**: 中間者攻撃（Man-in-the-Middle Attack）により、データの改ざんや盗聴が発生する可能性があります。

### FTPSのメリット
FTPSは、FTPにSSL/TLSを組み合わせてセキュリティを強化したプロトコルです。
- **通信の暗号化**: ユーザー認証情報やファイルが暗号化され、盗聴や改ざんを防ぎます。
- **認証の強化**: SSL/TLS証明書を利用することで、サーバーの正当性を保証できます。
- **FTPの利便性を維持**: 既存のFTPクライアントを利用できるため、導入が比較的容易です。


# 実際にLinuxに試してみる
では、FTPSを実際にローカル環境で試していきたいと思います。

### **前提条件**

- Ubuntuサーバーが動作している
- `192.168.～.～` をUbuntuサーバーのIPとする
- FTPは導入されている

## 1. 自己証明書を発行する

下記で自己証明書を作成します。
```bash
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/keita.server.key \
    -out /etc/ssl/certs/keita.server.crt
```
下記のファイルが生成されます。
証明書ファイルと鍵ファイルです。
```bash
/etc/ssl/certs/keita.server.crt
/etc/ssl/private/keita.server.key
```

## 2. 設定ファイルの編集

FTPSの設定を適応するために、/etc/vsftpd.confを下記のように編集します。 

```ini
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/keita.server.crt
rsa_private_key_file=/etc/ssl/private/keita.server.key
force_local_logins_ssl=YES
force_local_data_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
```

## 3. FTPS接続の確認
WINSCPというアプリを使用して、FTPSに接続してみます。
下記のような設定で接続を試みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/928c9e20-9bfd-4c2a-bb37-88d1f3b3c7d3.png)

これで接続できました！
これが一応暗号化されて転送されているのでセキュリティの対策にはなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/a6086c76-e9dc-4552-b26d-a4d6bd6db43a.png)

画像を送ってみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/993fdc8d-0077-422b-ac7c-4238eb66520d.png)

送れました
目では見れませんが、この通信でファイルが暗号化されていたはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/bdb566f4-4b25-442f-968c-5590015a3891.png)

## まとめ
Ubuntu上でFTPSを構築し、安全なファイル転送環境を作成しました。自己署名証明書を使用しましたが、運用環境では正式な証明書を利用するのがおすすめです。
Typescriptのプロジェクトのディレクトリ構成について

最近業務でTypescriptを使用することが増えたので、ディレクトリ構成方法について自分なりにまとめてみようと思います。

## ディレクトリ構成

### srcディレクトリ
・全てのTypescriptソースファイルをsrcディレクトリに設置する。
・機能やモジュールごとに整理するのがベスト

```shell
src/
├── components/
├── services/
├── hooks/
├── utils/
├── types/
└── main.ts
```

### distディレクトリ
Typescriptはブラウザでそのまま実行することができないので、まずJavascriptにコンパイルする必要がある。
その際にソースコードと区別してコンパイル後のファイルをdistに出力します。
・コンパイル後のJavascriptファイルはdistに出力
・ソースコードとビルドファイルを分離することで管理が簡単になります。
・distは自動で生成されるため、通常はGitで管理しない。これによりリポジトリが不要なファイルで膨らむのを防ぐ。

```shell
dist/
└── main.js
```

### testsディレクトリ
テストファイルはtestsにまとめる

```shell
tests/
├── user.test.ts
```

### configディレクトリ
設定ファイルはこちらに追加
環境ごとの設定もここで管理

### assetsディレクトリ
画像やスタイルシート、フォントなどの静的アセットを格納

```shell
assets/
├── images/
└── styles/
```

### typesディレクトリ
・型定義を共通で管理し、再利用しやすくします。
```shell
types/
├── user.ts
└── product.ts
```

### utilsディレクトリ
・汎用的に使える関数やロジックを格納。
```shell
utils/
├── formatDate.ts
└── calculateTax.ts
```

###  servicesディレクトリ
・外部APIとの通信処理やビジネスロジックを担当。

### componentsディレクトリ
ボタンやカードなどの再利用可能なコンポーネントを管理。
IntelliJのmessage.propertiesに書かれている日本語が?になってしまう場合の対処

## 起こってしまう現象
```java:message.properties
login.wrongInput=ログインIDとパスワードの組み合わせが間違っています。
```
↑これが
↓こう出力されてしまう
**????ID?????????????????????**

## 対処法
１，InteliJの設定からエディター>ファイルエンコーディング
２，「ネイティブコードからASCIIコードへの自動変換を行う」チェック
３，再実行(必須か不明ですが、、、)

message.propertiesの中身が
```
login.wrongInput=????ID?????????????????????
```
になっているため、書き直すし、アプリケーションを再実行すると解決します。

### 原因
はIntellijが自動的にUTF-8からASCIIに文字コードを変換していることが原因らしいです。
Amplify Gen2で発生する循環依存エラーの解決方法

Amplify Gen2での開発中に遭遇した循環依存エラーとその解決策についての備忘録です。

## 発生したエラーの概要
Amplify Gen2では、単純なCRUDだけでなく複雑な処理をカスタム関数として定義できます。この機能を使って、AppSyncを経由してLambda関数から外部APIにアクセスしたり、処理を加えた上でDBアクセスしたりすることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415206/72fda8c7-310b-4d6b-926e-06aba3d84259.png)

カスタム関数を実行するには、amplify/data/resource.tsのDataリソースにカスタムQueryを追加することが推奨されています。

Amplifyでは、DynamoDBのテーブル名は環境ごとに自動生成されます（例: User-ha2gqaugm5a6bddf5s4p46mzfy-NONE）。Lambda関数に環境変数としてこのテーブル名を渡す実装を試みたところ、エラーが発生しました。

## 実装手順と発生したエラー
### 1. カスタム関数の作成
まず、基本的な関数を作成します

```amplify/functions/someFunction/resource.ts
import { defineFunction } from "@aws-amplify/backend";

export const someFunction = defineFunction({
  name: "someFunc",
  entry: "./handler.ts",
});
```

```amplify/functions/someFunction/handler.ts

export const handler: Schema["someFunc"]["functionHandler"] = async (event) => {
//DBテーブルに何らか処理する
const tableName = process.env.USER_TABLE_NAME;
//略
return { result: "success" }
}
```
### 2. バックエンド設定への追加
定義した関数をbackend.tsに追加します

```amplify/backend.ts
const backend = defineBackend({
  auth,
  data,
  someFunction
});

const userTable = backend.data.resources.tables["User"];
backend.someFunction.addEnvironment("USER_TABLE_NAME", userTable.tableName);
...略...
```

### 3. エラーの発生
サンドボックスを起動すると、以下のエラーが表示されました

```terminal
npx ampx sandbox
```

```
failed: ValidationError: Circular dependency between resources: [xxxxx]
```

## エラーの原因
このエラーは、リソース間の循環依存が原因で発生しています。
具体的には次の条件により発生します。

 - Lambda関数（someFunction）がfunctionスタックに配置されている
 - Lambda関数がDynamoDBテーブル（User）の情報を環境変数として参照している
 - データリソース（dataスタック）がLambda関数を参照している（AppSyncのリゾルバーとして）

この状態では、functionスタックとdataスタックが互いに依存し合う循環参照が発生しています。

## 解決方法

この問題は、resourceGroupNameオプションを指定することで解決できます。

```amplify/functions/someFunction/resource.ts
import { defineFunction } from "@aws-amplify/backend";

export const someFunction = defineFunction({
  name: "someFunc",
  entry: "./handler.ts",
  resourceGroupName: "data",//追加
});
```

## 解決の仕組み
resourceGroupName: "data"を指定することで、Lambda関数がfunctionスタックではなくdataスタックに配置されるようになります。これにより次の状態となりエラー発生の原因が解消されます。

- Lambda関数とDynamoDBテーブルが同じスタック内に配置される
- スタック間の循環参照が解消される

## Amplify Gen2のリソースグループ構造
Amplify Gen2では、バックエンドリソースは以下のようなリソースグループ（スタック）に分類されます。

auth: 認証関連リソース
data: データ関連リソース（DynamoDB、AppSync）
function: Lambda関数
storage: ストレージ関連リソース

これらのリソースグループはCloudFormationのネステッドスタックとして実装されており、循環参照があるとCloudFormationがデプロイ順序を決定できなくなります。

## まとめ
resourceGroupName: "data"を指定することで、Lambda関数をdataリソースグループに移動させ、スタック間の循環参照を解消できます。この方法は、Amplify Gen2の公式ドキュメントでも推奨されているトラブルシューティング方法であり、特に関数がデータリソースと密接に関連している場合に効果的です。

https://docs.amplify.aws/vue/build-a-backend/troubleshooting/circular-dependency/

https://docs.amplify.aws/react/build-a-backend/functions/configure-functions/

## さいごに
今回は、Amplify Gen2のバックエンド設定時の循環依存エラー
`failed: ValidationError: Circular dependency between resources:`に対する備忘録を書かせていただきました。

どなたかのお役に立てると幸いです。
railsのDeviceでセッションが切れるときには

config/initializers/device.rbでセッション時間を設定することができるが、セッションがきれるとcurrent_userメソッドなどでエラーが発生する。
そんなときのために、以下のようにApplicationControllerにセッションが切れている場合は、サインイン画面にリダイレクトするように設定する。

```
class ApplicationController < ActionController::Base
  def check_session
    redirect_to new_user_session_path unless user_session
  end
end
```
【まとめ】Astro製Webサイト7選


# Astro Docs
https://docs.astro.build/en/getting-started/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/509de4cd-b21b-47bf-b47c-2cebeb40d6d5.png)
トップページのJavaScriptは約35KB

:::note
GitHubリポジトリ
https://github.com/withastro/docs
:::


# Cloudflare Docs
https://developers.cloudflare.com/

2025年1月　HugoからAstroへのリプレイスが完了したと発表される
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">This year, we scaled our developer documentation site to better meet the needs of users by migrating to the Astro ecosystem. Here we discuss the how and the why. <a href="https://t.co/iEUJakmkqK">https://t.co/iEUJakmkqK</a></p>&mdash; Cloudflare (@Cloudflare) <a href="https://twitter.com/Cloudflare/status/1876993525411115378?ref_src=twsrc%5Etfw">January 8, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Astroのドキュメントテーマ「[Starlight](https://starlight.astro.build/ja/)」が採用されている

また [`astro check`](https://docs.astro.build/ja/reference/cli-reference/#astro-check) による型チェックを実施するなどAstroの機能を幅広く活用している

:::note
GitHubリポジトリ
https://github.com/cloudflare/cloudflare-docs
:::


# 『ウマ娘 プリティーダービー』DMM GAMES版公式サイト
https://dmg.umamusume.jp/

2025年2月　リリース4周年を迎えたタイミングでAstroに刷新された

[scoped CSS](https://docs.astro.build/ja/guides/styling/)によるスタイリングや[GSAP](https://gsap.com/)によるアニメーションが実装されている

DMMGAMESではゲームタイトルごとに特設ページが存在するが技術スタックはそれぞれで異なる


# ココナラ スキルマーケット
https://coconala.com/

大部分は[Nuxt.js](https://nuxt.com/)で構成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/a87c99d7-c2dd-451f-bf29-6bb0e0b0d804.png)
その中のヘッダ部分 `<before-login-header />` に[アイランド](https://docs.astro.build/ja/concepts/islands/)が使われている

:::note
ココナラでの共通UIについての取り組み
https://zenn.dev/coconala/articles/6513204b3d9dde
:::


# Font Awesome Docs
https://docs.fontawesome.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/f930c3eb-82a8-4a61-b88b-fe2c2c20e42f.png)
トップページのJavaScriptは約45KB


# NordVPN
https://nordvpn.com/ja/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/176b1262-e3a3-4345-a4c7-fe59915c22d3.png)
接続情報表示ヘッダ および タブ切り替え機構 など複数の[アイランド](https://docs.astro.build/ja/concepts/islands/)が使われている

# Developer Roadmaps
https://roadmap.sh/

[TailwindCSS](https://tailwindcss.com/)によってスタイリングされている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194558/ed4870e4-8702-45ec-998f-3f640795358b.png)
スティッキーヘッダ および ロードマップ部分 に[アイランド](https://docs.astro.build/ja/concepts/islands/)が使われている



# その他
https://cwt.jp/category/619/1

https://www.wappalyzer.com/technologies/javascript-frameworks/astro/
リモートアクセスとネットワークセキュリティ技術のまとめ

## はじめに
応用情報技術者試験午後の令和4年度の秋期のネットワークを解いて出てきた用語をまとめました。

## 1. L2TP/IPSec
・L2TP (Layer 2 Tunneling Protocol) と IPSec (Internet Protocol Security) の組み合わせは、VPN接続におけるセキュリティ技術の一つです。
・L2TP はデータをトンネル化して送信するためのプロトコルで、IPSec はそのトンネル内のデータを暗号化するための技術です。
・動作順序: データリンク層でL2TPによってカプセル化され、その後、ネットワーク層でIPSecによって暗号化されます。

## 2. TLS (Transport Layer Security)
・TLS は、インターネット上でのデータ通信を暗号化するためのプロトコルです。SSL（Secure Sockets Layer）の後継として広く使用されています。
・動作層: TLSは、トランスポート層（OSI参照モデルの第4層）で動作し、アプリケーションとトランスポート層の間で通信の暗号化を行います。
・利用シーン: HTTPS（HTTP over TLS）として、Webサーバとブラウザ間での暗号化通信に使われます。

## 3. IPSec (Internet Protocol Security)
・IPSec は、ネットワーク層で動作するプロトコルで、データの暗号化、認証、整合性を提供します。
・VPNでの利用: 通常、VPNでのトンネル接続（L2TP/IPSec、SSL VPNなど）に使用され、送信されるデータを暗号化し、安全にインターネット越しに送信できるようにします。

## 4. LDAP (Lightweight Directory Access Protocol)
・LDAP は、ディレクトリサービス（ユーザーやネットワークリソースの情報を管理するサービス）にアクセスするためのプロトコルです。
・利用シーン: ユーザーの認証情報（ユーザー名、パスワード）を管理したり、組織内のリソースにアクセスしたりする際に使用されます。
・層: アプリケーション層（OSI参照モデルの第7層）で動作します。

## 5. Kerberos
・Kerberos は、ネットワーク認証プロトコルで、クライアントとサーバ間での安全な通信を実現します。
・特徴: 中間者攻撃（MITM）を防ぎ、チケットベースの認証を使用します。これにより、パスワードをネットワーク上で送信せずに認証を行うことができます。
・層: アプリケーション層（OSI参照モデルの第7層）で動作します。

## 6. SSL (Secure Sockets Layer)
・SSL は、インターネット上の通信を暗号化するために使われるプロトコルで、TLSの前身です。
・利用シーン: HTTPS通信で使われ、クライアントとサーバ間でセキュアな接続を提供します。現在ではTLSが主に使われています。

## 7. VPN (Virtual Private Network)
・VPN は、インターネット上で仮想的な専用線を作成し、暗号化された通信を提供する技術です。
・種類:
　・L2TP/IPSec: レイヤ2でデータをトンネル化し、ネットワーク層で暗号化する。
　・SSL VPN: SSL/TLSを使用して、リモートアクセスを安全に提供します。
　・PPTP: 古いVPN技術で、暗号化の強度が低いため、現在はあまり使用されていません。

## 8. クライアント証明書とサーバ証明書
・クライアント証明書: リモートPCやユーザーを認証するために使用される証明書。特にセキュリティが重視される環境で使用されます。
・サーバ証明書: サーバが正当であることをクライアントに証明するために使用され、通信の暗号化を実現します。

## 9. SSL/TLSハンドシェイク
・SSL/TLSハンドシェイクは、クライアントとサーバ間でセキュアな接続を確立するプロセスです。このプロセスで証明書が交換され、暗号化方法が決定されます。

## 10. サーバ認証とクライアント認証
・サーバ認証: クライアントがサーバの正当性を確認するためにサーバ証明書が使われます。
・クライアント認証: サーバがクライアント（リモートPC）の正当性を確認するためにクライアント証明書が使われます。

## 11. トンネル方式と暗号化技術
・L2TP/IPSec: データリンク層でL2TPがトンネル化し、その後ネットワーク層でIPSecが暗号化します。
・SSL VPN: SSL/TLSプロトコルを使用し、アプリケーション層で暗号化を行います。ブラウザベースで簡単に接続できるため、柔軟性が高いです。

## まとめ
・リモートアクセスにおけるセキュリティ技術やプロトコルは、認証と暗号化を通じて、通信の安全性を確保します。これには、TLSやIPSec、LDAP、Kerberosなどが重要な役割を果たしています。
・L2TP/IPSecやSSL VPNなど、さまざまなトンネル方式が用いられ、リモート接続のセキュリティを高めるために、それぞれ異なるプロトコルが使われます。
・証明書の利用（サーバ証明書、クライアント証明書）によって、認証の信頼性が向上し、セキュアな接続が実現されます。
kotestのbeforeとかafterとかまとめ

色々あってこんがらがることが多いのでまとめておきます。
kotest5.5.5で動作確認

# 結論(describeSpec)

|  | クラス | describe | context | it |
|:--:|:--:|:--:|:--:|:--:|
|Before/After Spec| o | x | x | x |
|Before/After Container| x | o | o | x |
|Before/After Test| x | o | o | o |
|Before/After Any| x | o | o | o |
|Before/After Each| x | x | x | o |

あれ、BeforeTestとBeforeAnyって同じなの・・・？と思いましたが公式見解でも一緒と書いてありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/e63f8157-e215-4e44-ab0f-d938a496bc7a.png)

# 検証用ソースコード

```kotlin
import io.kotest.core.spec.style.DescribeSpec

class Test : DescribeSpec({
    beforeEach { println("beforeEach") }
    afterEach { println("afterEach") }
    beforeTest { println("beforeTest") }
    afterTest { println("afterTest") }
    beforeContainer { println("beforeContainer") }
    afterContainer { println("afterContainer") }
    beforeAny { println("beforeAny") }
    afterAny { println("afterAny") }
    beforeSpec { println("beforeSpec") }
    afterSpec { println("afterSpec") }

    describe("describe1") {
        println("describe1")
        context("context1-1") {
            println("context1-1")
            it("it1-1-1") {
                println("it1-1-1")
            }
            it("it1-1-2") {
                println("it1-1-2")
            }

        }
        context("context1-2") {
            println("context1-2")
            it("it1-2-1") {
                println("it1-2-1")
            }
        }
    }
    describe("describe2") {
        println("describe2")
        context("context2-1") {
            println("context2-1")
            it("it2-1-1") {
                println("it2-1-1")
            }
        }
    }
})
```

出力
```
beforeSpec
beforeContainer
beforeAny
beforeTest
describe1

beforeContainer
beforeAny
beforeTest
context1-1

beforeEach
beforeAny
beforeTest
it1-1-1
afterTest
afterAny
afterEach

beforeEach
beforeAny
beforeTest
it1-1-2
afterTest
afterAny
afterEach

afterTest
afterAny
afterContainer

beforeContainer
beforeAny
beforeTest
context1-2

beforeEach
beforeAny
beforeTest
it1-2-1
afterTest
afterAny
afterEach

afterTest
afterAny
afterContainer

afterTest
afterAny
afterContainer

beforeContainer
beforeAny
beforeTest
describe2

beforeContainer
beforeAny
beforeTest
context2-1

beforeEach
beforeAny
beforeTest
it2-1-1

afterTest
afterAny
afterEach

afterTest
afterAny
afterContainer

afterTest
afterAny
afterContainer
afterSpec
```
【図解】01.「関数」についてわかりやすく

# 0.はじめに
プログラミングや数学でよく聞く**関数**ですが，初心者のうちは使いこなすのが難しく，ついユーザー定義関数を使わず**メインメソッドだけでゴリ押し**してしまうことも多いのではないでしょうか．
本記事では，そんな方々が「関数」について理解を深め，プログラミングでも自在に活用できるようになることを目指して解説します．

# 1.関数の定義
 ・関数とは，ある変数に依存して決まる値，あるいはその対応を表す式である.
(引用:[Wikipedia](https://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0_(%E6%95%B0%E5%AD%A6)))

上記の定義は，一般的に**数学で用いられる関数の定義**ですが，プログラミングにおける関数も**概ね**同じ意味でつかわれる為，この定義を引用しました．
しかし「関数」についてご存じの方ならばすんなり理解できるかもしれませんが，初心者からしてみれば，この説明は抽象的で理解しにくいと思います．
そのため定義を私なりに言い変えてみました．
 ####  ・ 関数とは，入力に対してあるルールに従い出力を決める対応関係を指す．
例えば，下図のような関係があったとします．

![20250317_165555.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4038054/b1dc81b7-b1e8-49d5-8ccb-229782c24005.gif)

これは「**3つ葉**がfという名前の**土管**を通過したら**4つ葉**になった．」という図で，この関係が関数です．

![集合と関数 - PowerPoint 2025_03_17 18_43_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4038054/8b50ed67-0026-47b0-aaf7-df72f348ae36.png)


・「3つ葉」は，上記の定義でいう「入力」で，
・「4つ葉」は，上記の定義でいう「出力」で，
・「土管」は，上記の定義でいう「ルール」を指します．

:::note warn
注意
数学的には**3つの関係をまとめて「関数」という**のであり，ルールそのものは関数ではありません．
ただしプログラミングにおいては**ルールそのもの**を関数と呼ぶようです．
:::
ルールの名前は自由に決めてよいですが，一般に関数の英語表記functionの頭文字を取ってfと名付けることが多いです．ここで「ルールに名前を付ける」とは，例えば「日本国民が生きる上での禁止行為」をまとめたルールを「日本国憲法」と名付けている感覚です．

これらの関係を数式で表すと，みなさんご存じこのような表記になります．

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4038054/7ba07c3d-8d59-41e2-be91-e8fd5d14d096.png)

括弧内の「入力」された値が「ルール f」により「出力」の値になる．という感じですね．
この数式全体が「関数」です．ここで数学においては「入力」の値は自由に変えることができるため**変数**といわれ，その変数により決まる出力のことを**値**と呼ばれます．
また，プログラミングにおいては変数のことを**引数**，値のことを**戻り値**と呼びます．

## 2.関数の制約
関数の定義についてはご理解いただけたでしょうか．この章は若干余談が入ってしまいますが，関数の制約について説明をしていきます．

先ほどの図は
「3つ葉が，あるルールに則って4つ葉になった．」という関数を指していますが，
その「ルール」とは一体なんでしょうか．ぜひ少し考えてみてください．

正解は．．．

**わからない**　です．

「葉っぱの枚数を1枚増やす」というルールを思い浮かべた人も多いと思います．
では例えば「葉っぱの枚数を4/3倍にする」というルールだったらどうでしょう．
あるいは「葉っぱの枚数を5/3倍にしてから1枚減らす」だったら？
結果は同じく**3つ葉はそれらのルールに則っても4つ葉**になりますよね．
すなわちこの例でのルールの特定は，考えられるルールが無限にあるため不可能です．

ではここで「n枚の葉っぱがあるルールに則ってn+1枚になった」という関数を考えます．
この関数における「ルール」はなんでしょう．
実はこの場合は **「葉っぱの枚数を1枚増やす」というルールだと特定することができます．**

前者の例は数式で表すと
```math
f(3) = 4
```
に対して，後者の例は
```math
f(x) = x + 1
```
と表すことができます．
ここで入力と出力が具体的な数である前者は**特殊解**といい，入力と出力が一般化された数である後者を**一般解**と呼ぶことにします．

:::note alert
警告
「一般解」や「特殊解」は微分方程式などで使われる単語で，**実際の正式な意味とは異なります**．当記事では便宜上こう呼ぶことにしています．ご了承ください．
:::

そして基本的に，**特殊解から一般解を求めることは上記の通り不可能**です．実験レポートなどで，測定結果のグラフを書く際に，プロット点とプロット点を線で結ぶのはOKでも，実験範囲外にまでその線を延長することがNGなのは，そういった関係がある為だと思います．（プロット点は特殊解であり，測定範囲内では，結ばれた線に沿うというルールだと仮定できるが，測定範囲外までの延長は一般解を求めることと同義であるため）
## 3.プログラミングで「関数」を書いてみよう．

では例えば「任意の自然数nに1を足す関数add_one」をPythonで記述します．
```python:example_function.py
def add_one(n):
    n = n + 1
    return n

print(add_one(2)) #出力は3
```
add_oneが関数の名前で，括弧内nは入力です．
そしてdefのインデント内が，「入力nがどう変わるかのルール」を定義しており，
それに従いreturn文で出力が定められています.
ここで，このdefにより定義している関数部分は**一般解**になっていることに注目してください．
一方で，print(add_one(2))という部分では**特殊解**を出力しています．

## 4.関数を扱う上で意識してほしいこと
関数の定義部分では**一般解**，出力では**特殊解**を扱う点を意識すると関数が使いやすくなると考えます．
どういうときに関数を使うか悩む場合は，上記の図を参考に，関数を「入力したものを変換し出力するコンバーター（変換器）」のようなものだという意識をもつとよいと思います．具体的には**写像**の考え方に近くなりますが，それはまた次回．

## 5.おわりに
今回説明した「関数」は正式に言うと，入力（変数）が一つしかない**一変数関数**ですが，
ほかにも，入力（変数）が複数ある**多変数関数**があります．それについても次回触れます．
初めての投稿なので拙い記事だったと思いますが，ご精読ありがとうございました．
ではまた．
PulumiとTerraformのコマンド比較


# PulumiとTerraformのコマンド比較

Infrastructure as Code（IaC）ツールとして人気のあるPulumiとTerraformのコマンド比較表を作成しました。
どちらかというと、Pulumiは馴染みのないIaCかと思います。
最近になって、初めて利用する機会があり、有名どころのTerraformと比較してみました。

## コマンド比較表

| 操作 | Pulumi | Terraform | 説明 |
|------|--------|-----------|------|
| 初期化 | `pulumi new [テンプレート]` | `terraform init` | プロジェクトの初期化 |
| プラン確認 | `pulumi preview` | `terraform plan` | 変更内容のプレビュー |
| デプロイ | `pulumi up` | `terraform apply` | リソースのデプロイ/更新 |
| 削除 | `pulumi destroy` | `terraform destroy` | リソースの削除 |
| 状態確認 | `pulumi stack` | `terraform state list` | 管理されているリソースの一覧表示 |
| 出力確認 | `pulumi stack output` | `terraform output` | 出力変数の表示 |

## 言語とシンタックスの違い

Terraformは独自のHCL（HashiCorp Configuration Language）を使用するのに対し、Pulumiは一般的なプログラミング言語（TypeScript、JavaScript、Python、Go、.NET）を使用できます。

**Terraform (HCL)**
```hcl
resource "aws_s3_bucket" "example" {
  bucket = "my-bucket"
  acl    = "private"
  
  tags = {
    Name        = "My bucket"
    Environment = "Dev"
  }
}
```

**Pulumi (TypeScript)**
```typescript
import * as aws from "@pulumi/aws";

const bucket = new aws.s3.Bucket("example", {
    bucket: "my-bucket",
    acl: "private",
    tags: {
        Name: "My bucket",
        Environment: "Dev",
    },
});
```
OpenVPNを使って、フランスからアクセスしてみた

VMware上で動作するKali Linuxを、ホストOSが接続しているWi-Fiを使わずに外部Wi-Fiアダプタを介してインターネットに接続し、VPNを使用してIPアドレスをマスキングし、フランスからの接続と認識されるようにします。

外部Wi-Fiアダプタを介して、インターネットに接続する方法はこちらです。
[ALFA AWUS036NHAをVMware環境のKali Linuxにセットアップする方法](https://qiita.com/shunagas42/items/9f12b9a9cf5dd3cc9382)

## 前提
・VMware等仮想環境を使用
・Kali Linux等Debian系ディストリビューションのLinuxOSを使用

:::note warn
学習のために行いますので、VPNは無料のものを使います。
:::

## OpenVPNインストール

下記コマンドでOpenVPNをインストールします。
```
$ sudo apt update
$ sudo apt install openvpn
```
`openvpn --version`でインストールできたか確認してください。バージョンが出ればOKです。

OpenVPN は、安全なVPN接続を提供するオープンソースのVPNプロトコルおよびソフトウェアです。

AES-256などの強力な暗号化を使用しているため、高いセキュリティ性を持ちます。

## VPN接続
VPN接続するためには.ovpnファイルが必要です。

無料で入手できるサイトの一つが[VPNBook](https://www.vpnbook.com/)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964004/eb262888-9e43-49eb-a0a1-618321752832.png)
OpenVPNタグを選択し、好きなzipファイルをダウンロードします。

アメリカ、フランス、カナダ、デンマーク、イギリス、ポーランドから選べます。
全てのバンドルにTCP443, TCP80, UDP53, UDP25000が入っています。

まずは、ダウンロードしたzipファイルを解凍します。
```
$ sudo unzip <zipfilename.zip>
```
解凍するとフォルダの中に４つの.ovpnファイルがあります。

では、UDP25000のフランスのファイルを繋いでみます。
```
$ sudo openvpn vpnbook-fr200-udp25000.ovpn
```
UsernameとPasswordを求められるので、ブラウザに表示されているものを入れます。
大量の文字が流れて、接続状態になればVPN接続完了です。

VPN接続されたOSのブラウザで『What is my ip』と検索します。
すると、フランス語のGoogle検索画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964004/fb940dc2-622b-4a5b-afa2-41e694370599.png)

一番上の[WhatIsMyIP.com](https://whatismyipaddress.com/)にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964004/ab37bd59-4779-4f2f-b228-1968e5758b38.png)
自分のOSのグローバルIPは「5.196.64.200」になっていることがわかります。

そしてそれは、この場所からアクセスしていると認識されているということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964004/bb77d279-c5b1-45fc-bb98-bc5b11b079e2.png)

今日のところは以上です。
marginを使って中央揃えできなかったときの対処法

[Zenn](https://zenn.dev/mo_ri_regen/articles/css-center-alignment)で記事をよく書いていますので、そちらもよければご覧ください。

## はじめに

CSS で margin を使ったときに中央揃えができなかったときに調べたことを記載しました。

- 修正前のソースコード

```css
div {
  margin: 0 auto;
  background-color: yellow;
}
```

![CSS修正前](https://storage.googleapis.com/zenn-user-upload/cd2d100e46a5-20250317.jpg)

## 原因

margin:0 auto;を使ったときに中央揃えできないときは下記を確認します。

- **ブロックレベル**の要素に対して指定しているか
- width の指定をしているか

margin はブロックレベルの要素に対して指定するが、ブロックレベルだとデフォルトで width は 100%となっているため親要素の幅いっぱいに広がっています。width を指定することで(親要素の幅 - 要素の幅)が左右にできるため auto で左右の余白を均等に分配され、中央に配置されます。

- ソースコード

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="styles.css" />
    <title>Document</title>
  </head>
  <body>
    <div>text1</div>
  </body>
</html>
```

```css
div {
  margin: 0 auto;
  width: fit-content; /*コンテンツのサイズに基づいて適切な幅を指定*/
  background-color: yellow;
}
```

![CSS修正後](https://storage.googleapis.com/zenn-user-upload/510aa58fff46-20250317.jpg)
HTTPとHTTPSの違い

# はじめに

HTTPとHTTPSは、Webブラウザとサーバー間の通信プロトコルですが、セキュリティレベルに大きな違いがあります。この記事では、両者の主な違いを解説し、比較表で分かりやすく示します。

# HTTPとHTTPSの基本的な違い

HTTPは「Hypertext Transfer Protocol」の略で、HTTPSは「Hypertext Transfer Protocol Secure」の略です。主な違いは以下の通りです：

1. **暗号化**: HTTPSはSSL/TLSによる暗号化通信を行いますが、HTTPは平文通信

2. **セキュリティ**: HTTPSは通信内容の盗聴や改ざんを防ぎますが、HTTPにはそのような保護機能がない

3. **ポート番号**: HTTPはポート80、HTTPSはポート443を使用

4. **URLの表示**: HTTPSは「https://」で始まり、多くのブラウザでは鍵アイコンが表示

# HTTPとHTTPSの比較表

以下の表でHTTPとHTTPSの主な違いを比較します：

| 特徴 | HTTP | HTTPS |
|------|------|-------|
| 暗号化 | なし | SSL/TLSによる暗号化 |
| データの完全性 | 保証されない | 保証される |
| なりすまし防止 | できない | SSL/TLS証明書により可能 |
| 通信速度 | 比較的速い | 暗号化処理のため若干遅い |
| SEO評価 | 低い | 高い |
| ポート番号 | 80 | 443 |
| URL表示 | http:// | https:// |
| ブラウザでの表示 | 警告表示の可能性あり | 鍵アイコン表示 |

# HTTPSの利点

1. **セキュリティ向上**: 通信内容が暗号化されるため、個人情報やクレジットカード情報などの機密データを安全に送受信

2. **信頼性の向上**: SSL/TLS証明書によりサイトの信頼性が担保され、ユーザーに安心感

3. **SEO対策**: Googleは検索ランキングでHTTPSサイトを優遇する傾向

4. **最新機能の利用**: 一部の最新Web機能はHTTPSでのみ利用可能

# まとめ

HTTPSはHTTPに比べてセキュリティ、信頼性、ユーザー体験の面で優れており、現代のWebサイトでは標準的な通信方式となっています。特に個人情報や機密データを扱うサイトでは、HTTPSの使用が不可欠です。Webサイト運営者は、ユーザーの安全と信頼を確保するために、HTTPSへの移行を検討することが重要です。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
ServiceNow Upgradeタスク：OOTB差分リストを見よう

# はじめに
さて、そろそろ年1回のアップグレードの季節（春バージョン）ですが、この時期になるとここ1～2年でServiceNowさんから「OOTB差分リスト」というものが展開されているのをご存知でしょうか。

詳しくは以下のコミュニティブログに記載されているので割愛しますが、日本語の翻訳の改善と、アップグレードに伴うOOTBの翻訳の変更をリスト化してくれています。
[ServiceNow 製品に関する日本語の用語改善](https://www.servicenow.com/community/japan-blog/servicenow-%E8%A3%BD%E5%93%81%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E7%94%A8%E8%AA%9E%E6%94%B9%E5%96%84/ba-p/2855470)

※実際のリストの参照方法やリストそのもののダウンロードには、NowSupportのIDが必要なようです。
　アップグレードのタスクをやる方ならおそらく持っているはずなので、皆さん見られると思いますが、一応注釈として記載します。

ServiceNowに限らず、SaaS製品を使っていくうえで、アップグレードがあり、製品に合わせていくという考え方は必要ですが、公式からのこういう情報は有効活用してユーザーの混乱が無いようにしていきたいものです。

# 実際にYokohama版を見てみよう
「バージョン1つ飛ばし」でアップグレードする方が多いのかなと思い、Washington→YokohamaのOOTB差分リストをサンプルで見てみようと思います。
ダウンロードするとわかりますが、リストはサイズも大きくレコード量も膨大なので、私が見てるポイントに絞って記載します。

本記事ではsys_documentationテーブルを例にOOTB差分リストを見てみます。
[comp_sys_documentation.xlsb]
このテーブルに限らず、他のリストを見るときも最初はコアな部分、
例えば「sys_」から始まるものとかを中心にざっと見ます。
その後、同じ前→後の変化をしてるものが複数あると、
「今回はこの言葉がこう変わるんだな」みたいな傾向がつかめるので、
自分やユーザーの業務に近そうな部分を効率よく確認できると思います。

ざっと見ることで今回どういった傾向がありそうかの感覚をつかむと、残りのテーブルも見やすくなってきます。

※リストのヘッダー色はわかりやすいように変えています
*pre*UpgradeInstance：アップグレード前
*post*UpgradeInstance：アップグレード後

**1）「所在地」が「ロケーション」に**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/737491f2-466f-4cd5-8b62-ed0195b3884f.png)

実際のラベル名
Washington
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/6cc6b3ff-9190-4017-b433-f74a5ba6204b.png)


Yokohama
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/3645a645-1d67-4236-85b1-3770c9e61677.png)



**2）「ステータス」が「状況」に**
（preUpgradeInstanceの値が空だったのですがtaskテーブルを眺めてて気づきました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/2c15e73d-c01b-4688-921b-393b2c702674.png)

Washington
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/7451ab81-e500-4c40-a0b3-05da7efe13d9.png)


Yokohama
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989988/93c8e84d-bf94-49b1-b9b6-b12d9236bfc5.png)


といった感じで、普段目にしそうなものも変わってたりします。
ちょっとした変化ですが、作り上げているシステムであればあるほど、その部分を使った説明の手順書や、KB記事があったりするので、地味～に影響があることも。

今回紹介したsys_documentationテーブルのほかに、テーブル単位だとsys_choice、sys_translated、sys_translated_text、sys_ui_messageの情報、あとはフィルターナビゲーターの翻訳情報も展開されています。
（2025/03/17時点）


# OOTB差分リスト活用のすゝめ
実際、私の個人的な経験としては、このリストを見ることで差分を検知し、ユーザーマニュアルに記載の文章とキャプチャを修正する必要があることに気づきました。

ベンダーはある程度開発側が「ああ、ここ変わったのね。はいはい～」のノリとか、実際の開発チーム同士で「アップグレードに伴う変更だろうね。機能影響はないよね、」で全然良いときもあると思うのですが、突然のユーザー側から「ちょっと！ここマニュアル（画面）と違うんだけど！」なんて問い合わせは減らしたいものです。

たかが1文字、されど1文字事前に気づくか気づかないかで、そのあとの問合せ工数やめんどくさい気持ちになる確率は変わってくると思います。

経験上日本の公共系に近いユーザーは、「正しい情報＞情報が無い状態＞間違った情報」の傾向にあるとみてます。インターネット上に間違った情報があるくらいなら、無い方がマシとまで言われたこともあります。
おそらく、情報が無ければ誤った状態で何か行動することはないが、誤った状態で操作されると後続影響が大きかったりするので、「指示通りにいかないのであれば止まれ」が教育されていれば、誤った情報のままの事故は防げるからかなぁと思っています。

翻訳なので、表示名レベルの変更がほとんどでシステムの内部的な動きに影響を与える確率は極めて低いのかなと推察しますが、ユーザーの使いやすさや満足度、製品を扱う者として差分情報を取得し、アンテナを張るという意識は常々したいものです。

実際に私もアップグレードのたびにすべてをくまなくチェックしているわけではないです。今回紹介した通り、ポイントを絞って確認しています。（物量的にたぶん目検は無理、おそらくほとんどの方は、テーブルカラムの比較とかをしてるんじゃないかなぁと。）ただ、こういった情報がオフィシャルに出ているので、使えるものは使っていきましょう！

以上
DifyでOracle Database Error Code HelperのAgentを簡単に作成する方法




## 初めに

Oracleデータベースのエラーコードを即座に検索・解決策を提示するツールを、Difyで作成する方法を解説します。AIとウェブスクレイピングの組み合わせで、技術者向けの効率的なエラーハンドリングを実現します。

---

## 1. Difyとは？
DifyはAIエージェントを直感的に作成できるプラットフォームです。カスタムツールとAIの組み合わせで、特定の業務フローを自動化できます。今回作成する「Oracleエラーコードヘルパー」は、ユーザーがエラーコードを入力すると即座に公式ドキュメントの情報を取得し、解決策を提示するツールです。

---

## 2. 作成手順

### ステップ1: エージェント作成
![Difyエージェント作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/4519ac4e-0d1c-4474-8119-6327d8f9af56.png)
- エージェント名に「Oracle Database Error Code Helper Agent」などと入力

---

### ステップ2: オーケストレーション設定
![オーケストレーション画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/d1ca2497-51fd-4638-9bd7-d56e9d6d5338.png)
1. **手順設定画面**で以下を入力：
```markdown
## 職位説明：Oracle Database Error Code Helper

## ロール
あなたはprocessWebContentツールを使用して、ユーザーのリクエストからエラーコードのウェブページ情報を取得し、Markdown形式のデータを返却します。その後、取得したMarkdown形式のデータに基づいてユーザーの質問に回答します。日本語で綺麗なフォーマットで回答します。

## スキル
- ユーザーの質問からエラーコード（形式:`ORA-数字`）を抽出する
- 取得したエラーコードでこのURLの`ORA-数字`を置き換えます：https://docs.oracle.com/en/error-help/db/ORA-数字/index.html?r=23ai
- processWebContentを使用して置き換え後のURLからエラーコードのウェブページ情報をリクエストし取得する

## 制約
- URLをエンコードディングしないでください
```

2. **カスタムツール**として「processWebContent」を追加：
   - ツール名：processWebContent

**カスタムツール**の構築方法は以下のQiita記事をご参考ください。
- [ローカルでのJina AI Readerデプロイ：Dockerで自前の知能解析エンジンを構築](https://qiita.com/engchina/items/f454bc253108f3049249)
- [DifyでOpenAPI Swagger仕様を定義してJina Reader Toolを構築する方法](https://qiita.com/engchina/items/63948138fb149dd9cfac)


---

### ステップ3: 実行と確認
![ツール実行画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/fb88c105-499e-450d-b97d-7ee8ae367731.png)
1. 「Publish Update」をクリックして設定を保存
2. テストクエリを入力：
   ```
   ORA-04031エラーの解決方法を教えてください
   ```

---

### 結果例
![取得データと回答例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/d15f2bc3-be96-498e-b554-b22bda067609.png)
1. **自動処理フロー**：
   - ユーザー入力から「ORA-04031」を抽出
   - URLを `https://docs.oracle.com/en/error-help/db/ORA-04031/index.html?r=23ai` に変換
   - processWebContentで該当ページを取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/87265962-249a-42d1-9f78-274a858efd95.png)

2. **返却例**：
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/482ffb1c-9f99-4c33-ba10-a1d2df40f97b.png)


---

## 3. 重要なポイント
- **自動化の利点**：
  - 実際に公式ドキュメントを参照した回答を即座に提供
  - エラーコード抽出ロジックが自動で処理
- **拡張可能性**：
  - 全ての`ORA-XXXXX`形式のエラーに対応可能
  - ツールチェーンに他の処理（メール通知/チケット作成）を追加可能

---

## 4. 活用例
- データベース管理者の迅速なトラブルシューティング
- 新人エンジニアのエラーコード学習支援
- サポートチームの回答テンプレート作成

---



## 5. 結論
Difyを活用すれば、専門的な知識を必要とするエラーハンドリングを誰でも簡単に自動化できます。この手法を応用すれば、AWSエラー、SQL Serverエラーなどあらゆるシステムのエラーメッセージを一元管理するツールを作成可能です。
適当なストップウォッチなクラスを作った

時間が測れます。以上。

```ts
type StopWatchLap = {
  type: 'start' | 'lap' | 'stop';
  date: Date;
  message: string;
};

export class StopWatch {
  private _laps: StopWatchLap[] = [];
  start(message: string = '') {
    this._laps.push({
      type: 'start',
      date: new Date(),
      message,
    });
  }
  pushLap(message: string = '') {
    this._laps.push({
      type: 'lap',
      date: new Date(),
      message,
    });
  }
  stop(message: string = '') {
    this._laps.push({
      type: 'stop',
      date: new Date(),
      message,
    });
  }
  reset() {
    this._laps.length = 0;
  }
  valueOf() {
    const startLap = this._laps.find(lap => lap.type === 'start');
    const stopLap = this._laps.find(lap => lap.type === 'stop');
    return startLap ? (stopLap?.date ?? new Date()).valueOf() - startLap.date.valueOf() : 0;
  }
  getLapDetails() {
    const startLap = this._laps.find(lap => lap.type === 'start');
    return this._laps.map((_, idx) => this.getLapInner(idx, startLap));
  }
  getLap(n: number) {
    const startLap = this._laps.find(lap => lap.type === 'start');
    return this.getLapInner(n, startLap);
  }
  private getLapInner(n: number, startLap: StopWatchLap | undefined) {
    const lap = this._laps[n];
    const prevLap = this._laps[n - 1];
    if (startLap) {
      const startTime = startLap.date.valueOf();
      return {
        ...lap,
        time: lap.date.valueOf() - startTime,
        lapTime: lap.date.valueOf() - (prevLap?.date.valueOf() ?? startTime),
      };
    } else {
      return {
        ...lap,
        time: 0,
        lapTime: 0,
      };
    }
  }
  get milliseconds() {
    return this.valueOf();
  }
  get seconds() {
    return this.valueOf() / 1000;
  }
  get isRunning() {
    return this._laps.some(lap => lap.type === 'start') && this._laps.every(lap => lap.type !== 'stop');
  }
}
```

計測中に実行するであろう `start` `pushLap` `stop` の実行コストを少なくすることを目標にしました。
値の取り出しは計測終了後に行うはずなので、コストは気にしていません。
さささーって書いたので正直テストとかしてません。まあでばっぐようだし


# 使い方

```ts
const stopwatch = new StopWatch();
stopwatch.start('計測開始');

await 時間のかかる処理();
stopwatch.pushLap('ラップ1');

await 時間のかかる処理();
stopwatch.pushLap('ラップ2');

await 時間のかかる処理();
stopwatch.pushLap('ラップ3');

stopwatch.stop('計測終了');

console.group(`ストップウォッチ実行ログ (${stopwatch.milliseconds}ms)`);
for (const lap of stopwatch.getLapDetails()) {
  console.log(`${lap.message}: ${lap.date.toISOString()}${lap.lapTime ? ` (${lap.lapTime}ms)` : ''}`)
}
console.groupEnd();
```
PC起動時にデュアルモニターにブラウザ(Edge)を置きたい

## やりたかったこと
- PC起動時にブラウザを立ち上げ、ニュースサイトなどを指定し2枚目のモニターに配置したい

## 結論
- PowerToys Workspaceでショートカットを作り、スタートアップフォルダに置く

### 必要アプリ
- PowerToys v0.89.0

### 📚手順1（ショートカット作成まで）
1. 開きたいブラウザやアプリをお好みのレイアウトで開いておく
1. PowerToys Workspaceを開く
1. ＋ワークスペースの作成をクリック
1. キャプチャをクリック
1. ブラウザの場合次のように設定
📌CLI引数：開きたいURL,--new-window(sがついてるのはミスです)
📌✅デスクトップショートカット作成
📌✅既存のウィンドウの移動（お好みで）
![workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510048/4213b23d-2914-4bd9-ba25-b1c7230745fd.png)
1. ワークスペースの保存
これでデスクトップにショートカットが作成され、起動するとブラウザが配置されます

### 📚手順2（自動で起動させるまで）
1. `Win`+`R`で`shell:startup`と入力（スタートアップのフォルダを開きます）
1. 開いたフォルダに先ほど作ったショートカットを入れる
👉これで起動時にブラウザが開くようになります

### ⚠️問題点
- ウィンドウサイズが安定しない時がある

## ❗失敗したこと
### ブラウザをChromeにしてショートカットや.batを作成
ℹ️chromeはショートカットでウィンドウサイズや位置を指定できる
### ⚠️問題点
- サイズの調整がシビア
- ふちに隙間ができる
- profileを複数用意しないといけなかった
- Edgeを使いたかった

以上の理由から今回の方法に辿り着きました
登録されているリフレッシュグループ・リフレッシュグループに登録されているオブジェクトを確認する

**登録されているリフレッシュ・グループを確認する**には、`xxx_REFRESH`を使用します。

|テーブル|対象|URL|
|:-|:-|:-|
|DBA_REFRESH|すべてのリフレッシュ・グループ|[DBA_REFRESH](https://docs.oracle.com/cd/F19136_01/refrn/DBA_REFRESH.html)|
|ALL_REFRESH|ユーザーがアクセスできるリフレッシュ・グループ|[ALL_REFRESH](https://docs.oracle.com/cd/F19136_01/refrn/ALL_REFRESH.html)|
|USER_REFRESH|ユーザーが所有しているリフレッシュ・グループ|[USER_REFRESH](https://docs.oracle.com/cd/F19136_01/refrn/USER_REFRESH.html)|


次に、**リフレッシュ・グループに登録されているオブジェクトを確認する**場合は、`xxx_REFRESH_CHILDREN`を使用します。

|テーブル|対象|URL|
|:-|:-|:-|
|DBA_REFRESH_CHILDREN|すべてのリフレッシュ・グループ|[DBA_REFRESH_CHILDREN](https://docs.oracle.com/cd/F19136_01/refrn/DBA_REFRESH_CHILDREN.html)|
|ALL_REFRESH_CHILDREN|ユーザーがアクセスできるリフレッシュ・グループ|[ALL_REFRESH_CHILDREN](https://docs.oracle.com/cd/F19136_01/refrn/ALL_REFRESH_CHILDREN.html)|
|USER_REFRESH_CHILDREN|ユーザーが所有しているリフレッシュ・グループ|[USER_REFRESH_CHILDREN](https://docs.oracle.com/cd/F19136_01/refrn/USER_REFRESH_CHILDREN.html)|


**環境情報**

- Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
Qiita始めました！

Qiita初投稿！

これまでQiitaをソースコード探しのツールとして扱っていましたが、これからはエンジニア業界のことやベテランの方々の知見などに触れて行きたい！自分のような初学者の声が聞きたい！と思いサインアップしました！
こんな感じで張り切ってるなーと思われるでしょうが、あくまで軽めのインプット/アウトプットを行うプラットフォームとしてゆる〜く活動していければと思っています。

![DSC03248.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4038395/ce4102ee-90fb-4bbc-b452-77057f5b387e.jpeg)
Radeon + Ollama + ClineでローカルLLMを利用した開発を行う

近頃よくCline（や派生してフォークされている類似ツール）を目にするので、あまりAIやLLMには明るくないのですが「試しに触ってみたいな」という気持ちがありました。
が、API使うとそこそこ料金がかかる→Deepseek使おうかな→オプトアウトできないのか...という形で渋っていたのですが、最近ちょうどメインPCを作り替えたので、「ローカルでLLM動かしてみるか！」と思い立ち検証してみることにしました。

## PC構成
新しくなったメインPCのスペックは下記になります。
- メモリ：32GB
- CPU：Ryzen 9700X
- GPU：Radeon 7800XT(16GB)
- OS：Windows11 Home
(某緑なGPUの方がこの分野では強いという話をよく聞きますが、 ~~私はAMD信者なので~~ メインはゲーム用途なのでコスパ云々でRadeonになっています）

スペック的にも一般的なゲーミングPCということで、大きめのパラメータ数のものを動かすのは厳しそうでしたので、今回は14Bのphi4を利用することにしました。

https://ollama.com/library/phi4

## 導入手順
前提として、手持ちのGPUが下記ページでHIP SDKに対応している必要があります。（非対応GPUは動作しません...)
https://rocm.docs.amd.com/projects/install-on-windows/en/latest/reference/system-requirements.html

### 1. HIP SDKのインストール

某緑なGPUはCUDAが使えますが、AMDのGPUはROCmのみの対応なので、下記ページからHIP SDKをダウンロードしインストールします。
(基本的にはWindows10&11の最新バージョンで問題ないかと思います。）
https://www.amd.com/en/developer/resources/rocm-hub/hip-sdk.html

### 2. Ollamaのインストール

下記からOllamaをダウンロードしインストールします。
https://ollama.com/download

もし必要であれば、Ollamaをローカルネットワークで共有できるようにします。
Windows + Rを押し、「SystemPropertiesAdvanced」と入力→環境変数からユーザー環境変数に下記を設定します。

| キー | 値 |
| -- | -- |
| OLLAMA_HOST | 0.0.0.0 |

### 3.phi4モデルのダウンロード
cmdより、下記コマンドでphi4モデルをダウンロード&実行します
```cmd
$ ollama run phi4
```

### 4. Clineのインストール&設定
私はVSCodeを使用しているため、拡張機能→Clineを検索しインストールします。
その後、歯車ボタンから設定を開き、下記のように設定します
API ProviderはOllamaを選択、BaseURLはhttp://localhost:11434 か、ローカルネットワークにOllamaを共有した場合は、http://{PCのアドレス}:11434を入力します。

正しくOllamaが起動していれば、モデルを選択するチェックボックスが出てくると思うので、そちらからphi4:latestを選択します。

（いろいろ検証したためモデルが増えたりしていますが、参考程度に設定画面)
![スクリーンショット 2025-03-17 210420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351683/a9db2a76-3fa7-454e-a7da-d380662566fd.png)

## 動作検証
これで動作するようになっているはずですので、実際に動作させてみます。
今回は簡単なTo-doアプリを作成してもらいました。
(チャットは英語で行ったほうが体感レスポンスが早かったので、英語で行いました）

Bootstrap,nginx,SQLite3を使用して作成してくださいと、そこそこ雑な命令をしましたが、ほぼ提案された命令をそのまま許可することで1からTo-doアプリを作成してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351683/c11bbc67-c665-4814-b456-a16a6236808e.png)

体感時間としては、この程度の簡単なタスクだからかもしれませんが、ギリギリ待てるかな...位のレスポンス速度かなと思います。(長くても、大体3~5分ほどでレスポンスが返ってくる程度)

7Bなどのパラメータ数にすればもう少々レスポンスが早くなるかもしれませんが、精度の問題もあるのでまた試してみる予定です。

## 参考文献
https://qiita.com/a_ogura/items/b29c22f3009c093d58f4
https://qiita.com/7shi/items/dc037c2d5b0add0da33a