OmniAICreator/Qiita-1.07M huggingface dataset:
畳み込みニューラルネットの実装を学習して感じたこと

# イメージが大事
先日畳み込みニューラルネットの実装を学んだ際、そのモデルのイメージが無いとコードの長さや複雑さに圧倒されてしまうなと感じました。

そこで今回は畳み込みニューラルについて、私なりのイメージを共有したいと思います。皆さんの学習の一助になれば嬉しいです。

# 畳み込みニューラルネットは2段構成
畳み込みニューラルネットを考えるとき私はざっくりと**畳み込み層**と**プーリング層**と**フィルター**を思い浮かべます。この２つの層でフィルターがどのように使われるかを把握できると実際のコードを見たとき理解しやすいです。

### 畳み込み層
この層ではフィルターが１つ出てきます。このフィルターは入力データより小さいサイズで、少しづつずらしながら重ねることで入力データの特徴量を抽出します。
![イラスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957867/86948ffa-a7b1-6db9-b97b-0a55365d6622.png)

フィルターを通す様子から私は「畳み込み」を「データに含まれる情報を集約すること」と変換して考えています。

### プーリング層
この層では入力データのチャンネル（入力データの次元とも考えられます）の数だけフィルターが登場します。例えば色付き画像データならRGBの３つの色の次元があるので、チャンネルは３になります。
このチャンネル毎に様々なフィルターを使って、畳み込み層と同じように特徴量を抽出します。

![イラスト2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957867/d8279f8d-d775-007b-9344-6e200f915e29.png)


抽出した特徴量を活性化関数に入力してなにかしらのクラスに判別されます。

実際のコードではプーリング層の後に行列データをベクトルデータに変換する工程もありますが大事な部分はこれまでに説明した感じになります。

# おわり
私なりの説明をしてみました。
「こう考えるといいよ」というアイデアをお持ちの方はコメントをくださると私も勉強になり助かります！
【ChatGPT】提案上手は知っている『OATHの法則』。

   
　どうも、カーブミラーです。

　今回は、提案上手は知っている『OATHの法則』をご紹介します。Promptも用意しました。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、ニュースです。


　下記の地域で
　　ChatGPTのモバイルアプリの
　　　AdvancedVoiceで
　　　　ビデオとスクリーン共有が
　　　　　できるようになりました。

　EU、ノルウェー、
　　アイスランド、リヒテンシュタイン、
　　　スイス。

　[OpenAI公式ポスト](https://x.com/OpenAI/status/1885044993741475858?t=TzH3ry6sC6A_jCYJL0K5yA&s=19)
***
　同じ地域で、
　　ChatGPTのWeb版、
　　　デスクトップWindowsアプリに、
　　　　新しいカスタム指示が
　　　　　展開されました。

　[OpenAI公式ポスト](https://x.com/OpenAI/status/1885053677783965998?t=Jpw5epHCeddk1bhZs2_3RQ&s=19)
***
　OpenAIが
　　アメリカ国立研究所と
　　　契約締結した、とのこと。

　Microsoftとの協力で、
　　材料科学、再生可能エネルギー、
　　　天体物理学などの研究を
　　　　サポートする。

　[OpenAI公式ポスト](https://x.com/OpenAINewsroom/status/1885072007605150137?t=PzBTPlypehOcHBs4PEsxqw&s=19)
***
　次はニュースではありません。

　中国のAI企業DeepSeekが
　　DeepSeek-R1をリリースしたのは、
　　　2025年1月20日のこと。

　それ以来、
　　AI界隈では、
　　　活発な賛否両論の状態です。

　共産主義の中国系なので
　　民主主義の人間である私は
　　　正直、タッチしたくありません。

　中国の検閲が入ったり
　　知識が中国寄りだったりだと
　　　報告があがってきています。

　また、大手生成AIから
　　データを取得したとか、
　　　セキュリティが甘く、
　　　　ユーザー情報も取り放題とか。

　送信データは
　　中国にそのまま送られているとか。

　もちろん、
　　注視していくつもりではありますが
　　　積極的にタッチすることは
　　　　現時点ではありません。
　　　　　あしからず。
***
　ではさっそく、【本題】です。

　今回は、
　　提案上手は知っている
　　　『OATHの法則』のご紹介。
　　　　それをもとにしたPromptです。

　こちらの記事を参照しました。
　　[なぜあの人の提案は通るのか？提案上手は知っている『OATHの法則』の効果とは](https://studyhacker.net/oathhousoku)

　ここでは
　　OATH法則と
　　　フット・イン・ザ・ドアという
　　　　テクニックを紹介しています。
***
　“OATH法則”とは
　　相手の問題認識度合いを
　　　4段階で分類する
　　　　フレームワークです。

　　これにより、
　　　提案や説得の際に
　　　　相手の関心レベルに応じた
　　　　　アプローチが可能となる。

　　4段階は次のとおり。

　　1. Oblivious（無知）：
　　　問題の存在を知らない状態。

　　2. Apathetic（無関心）：
　　　問題を知ってはいるが、
　　　　自分には関係ないと
　　　　感じている状態。

　　3. Thinking（考慮中）：
　　　問題の重要性を認識し、
　　　　解決策を検討し始めている状態｡

　　4. Hurting（困っている）：
　　　問題が深刻で、
　　　　早急な解決策を
　　　　　求めている状態。

　“フット・イン・ザ・ドア”とは
　　最初に小さな要求を
　　　承諾させることで、
　　　　次により大きな要求
　　　　　を受け入れやすくする
　　　　　　心理的テクニックのこと。

　　これは、
　　　一貫性の原理に
　　　　基づいています。

　　人は一度決めたことを
　　　一貫して行動しよう
　　　　とする心理状態ですね。

　余談ですが、この反対に
　　大きな要求を断らせ、
　　　小さな要求を通すテクニックを
　　　　“ドア・イン・ザ・フェイス”と
　　　　　言うそうです。
***
　このふたつを組み合わせることで、
　　相手の関心レベルに応じた
　　　効果的な提案や説得が
　　　　可能となります。

　具体的には
　　どうすればいいのでしょうか。

　そこで
　　Promptを用意しました。

　＊＊＊に解決したい問題を書き入れ、
　　送信してください。
```Text:OATHの法則による問題解決ステップPrompt
あなたは、相手の関心レベルに応じて適切なアプローチを取る専門家です。
以下のOATHの法則に基づき、対象者の関心度を判断し、それに応じた適切なアプローチを提案してください。

### 問題
{＊＊＊}

### OATHの法則
1. **Oblivious（無知）**: 問題の存在を知らない
2. **Apathetic（無関心）**: 問題を知っているが関心がない
3. **Thinking（考慮中）**: 問題の重要性を認識し、解決策を考え始めている
4. **Hurting（困っている）**: 問題が深刻で、早急な解決策を求めている

### フット・イン・ザ・ドアテクニック
相手の関心度が低い場合、小さな依頼を先に受け入れてもらうことで、徐々に大きな提案へと誘導してください。

### 指示
対象者のOATHの法則における位置を判定し、それぞれに適したアプローチを設計してください。
また、フット・イン・ザ・ドアテクニックを活用し、段階的に問題解決へと導くプロセスを提案してください。

### 出力例
- **相手の関心レベル**: OATHのどの段階にいるか
- **適切なアプローチ**: 相手の関心レベルに応じた説得戦略
- **フット・イン・ザ・ドア戦略**: 小さな依頼から大きな提案へとつなげるプロセス
```

　やってみましたが、
　　納得できる提案を
　　　もらえたと思います。

　ここから
　　深堀りすることも
　　　いいでしょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
firebaseの公開設定が表示されない時の対応方法

## 📝 この記事について
[Firebase Console](https://console.firebase.google.com/)のAuthenticationで認証メールのテンプレートの`%APP_NAME%`にプロジェクト名ではなく、任意の名前をつけたい際に公開設定の公開名を設定すると変えることができます。
しかし、なぜか作成時に公開設定が表示されない問題に遭遇したため、その時に行った解決手順をまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999130/0979f137-5b6a-e506-4c0d-b9f715f1b81a.png)


## 💡 解決手順
1. Authenticationのログイン方法タブを開き、新しいプロバイダを追加を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999130/b4517d28-428f-56e1-8c5a-c85850608749.png)

2. Googleを選択し、プロジェクトの公開名に、`%APP_NAME%`に表示したい名前を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999130/380da1de-f0c9-19af-8fd4-604b79a5e2b3.png)

3. 一旦保存ボタンを押し、構成を編集を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999130/3dbac7bf-58c0-ae8a-2f76-7ff19e6e9d4b.png)

4. 無効にして保存、もしくはプロバイダを削除を押して保存または削除をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999130/edd82172-fbfe-47eb-a97b-b0f6381278b7.png)

## ⚠️ 注意点
この対応で設定した場合、公開設定から公開名変更できない場合があります。
（私の場合、自分は変更できず、社内の別ユーザーは変更できました。）
 その場合は再度Google認証を有効にして修正することで対処しました。

## 🔄 更新履歴
- 2025/01/31: 記事作成

---
この記事が解決の助けになれば幸いです。
もし他の解決方法をご存知の方がいらっしゃいましたら、コメントでお知らせください。
KCNA-JPに合格した話＆Udemy教材の学習方法を紹介

# はじめに
先日、 認定Kubernetesクラウドネイティブアソシエイト (KCNA-JP)に合格したので、合格までの流れやUdemy教材の学習方法などを書きたいと思います。


# KCNA-JPとは？
 認定Kubernetesクラウドネイティブアソシエイト (KCNA-JP)とはLinux Foundationという組織が認定しているKubernetesの資格になります。Kubernetesの初級分類の資格です。

> Kubernetes and Cloud Native Associate (KCNA) 試験は、Kubernetes とより広範なクラウド ネイティブ エコシステムに関するユーザーの基礎知識とスキルを証明します。

https://training.linuxfoundation.org/ja/certification/kubernetes-and-cloud-native-associate-kcna-jp/

# 受験準備

まず、受験をするために調べることから始めたのですが、特に苦労した点をあげます。

- 身分証問題

まず、受験準備は身分証明書をどうするか問題は大変でした。
試験で使用する身分証明書を免許証かパスポートのどっちにしようと迷いました。英語圏の試験というのもあり合格証に漢字は格好悪いよな！と思い、パスポート発行のために市役所で戸籍謄本を発行を試みるものの、まさかの戸籍書換え（身内理由）のため、すぐに発行できないと判明し断念しました......

他のサイトを参考にVerify Name（下記写真参照）を漢字で登録、身分証は免許証で行なうことに決めました。だから、合格証もほぼ英語で書かれているけれど、名前は漢字です(笑)
![Qiita_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951985/8fa110cd-0f32-f8d3-c507-85728de3e4f1.png)


- 部屋の掃除

なぜ、部屋の掃除なのか？オンライン試験かつ、PCのカメラで試験中ずっと見られている試験だからです。
また、部屋自体をPCを持って歩いて回り、部屋の隅々まで見せる必要があります。（あまり物を置かない規定あり）レンタルスペースを借りる案もありましたが、予約の手間を考え自宅の部屋で行なうことにしました。軽く模様替えでしたね！


# 当日の受験の流れ
![Qiita_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951985/a1d7ea28-ec90-ab23-4c36-1875e47bcac9.png)


部屋に余計なものを置かないようにします。基本的に机、椅子、PCしかない状態です。他にもラベル無しのペットボトルもありだっだようですが、自分はやめました。

予約時間の30分からログインでき、15分前くらいに上の画像の「Take Exam」をクリック。

ログイン後は「PSIセキュアブラウザ」という試験用のクライアントツールをインストールします。
インストール後に「PSIセキュアブラウザ」にログイン。
本人認証し終わった後は、、、、、そこからは試験官と英語でチャットでした（笑)

大体は以下の感じです。（PCのインカメラを使って見せます。）
・部屋をくまなく見せてほしい。⇒歩いて見せる。
・机を見せてほしい。
・マウスパットを持ち上げて見せてほしい。
・手を見せてほしい。
・腕を見せてほしい。
・耳を見せてほしい。

途中何度か、英語で会話することが必要になりましたが、
だいたいは、「yes, thank you ,I want 動詞 to ～」で乗り切りましたが、英語でのチャットのやり取りは疲れますね。。。
試験は事前確認30分と１時間半の２時間ほどでした。
合格点は100点中79点です。（合格ラインは75点）


# 学習方法の紹介
学習教材はUdemy教材だけです。
↓
これだけでOK！【KCNA-JP】認定Kubernetesクラウドネイティブアソシエイト模擬試験問題集（5回分300問）
https://www.udemy.com/course/kcna-jp_kubenetes/?couponCode=KEEPLEARNING

この教材を繰り返し解きました。
わからないところは解説を読んだり、ChatGPTで確認したり、答えにしっくりこなかったググっての繰り返しです。

最初はわからなかったものの繰り返している内に解ける割合が増えてきて、試験前には8割後半～9割後半くらいまでやりこみました。単語やKubernetesの考え方などを問題を通して学んだ感じです。

- 学べる内容
    - Kubernetes基礎
    - コンテナ オーケストレーション
    - クラウド ネイティブ アーキテクチャ
    - クラウド ネイティブの可観測性
    - クラウド ネイティブ アプリケーションの配信

# 参考書籍
[Kubernetes完全ガイド 第2版 (Top Gear)](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E7%AC%AC2%E7%89%88-Top-Gear-%E9%9D%92%E5%B1%B1/dp/4295009792)
発行は古いですが、サービスや考え方は同じものが多いのでおすすめです。
分からないサービス等は確認しており、実務でも重宝しています。

# 所感
Udemy教材だけでも受かりましたが少しギリギリだったので、もう少し内容の深堀りをするべきだったなと思いました。
3～4割が同じような問題で、初見の問題も多く大変でしたね。今思えば、実装するサービスのソースコードレベルでの項目等も、もう少し確認していればよかったなと思っています。

また、試験学習をしたおかげで、実務でもKubernetesの知っているサービスが前より増えて役に立っていることを実感しますね。次はKCSAあたりを受験をしようと考えています。
Cognitoを使用したOIDCログインとユーザー情報の取得

# はじめに

[前回の記事](https://qiita.com/generoKoki/items/98d38bb6262ea1437796)では、AWS Cognitoを用いたOIDC（OpenID Connect）に関する設定方法について解説しました。前回はCognitoのマネージドログイン（ホスト型UI）を使用しましたが、今回はその仕組みを外し、直接OIDCのログインを行う方法を説明します。



# 注意点

### IDトークンの署名検証

- 取得したIDトークンは、そのまま使用せず、必ず署名検証を行ってください。


### ユーザー情報の適切な管理

- 取得したユーザー情報はセキュリティを考慮し、適切に扱う必要があります。

- 不要なデータの保存や漏洩を防ぐため、ログへの出力などには特に注意してください。

# リダイレクトURLの変更

今回の実装ではCognitoのマネージドログインを使用せず、oidc-client-ts を利用してログイン処理を行います。

そのため、CognitoのリダイレクトURLを適切に設定する必要があります。

:::note warn
CognitoのリダイレクトURLは適切に設定しないと認証フローが正常に動作しません。
OIDCプロバイダー（Google, LINE, Facebookなど）を使用する場合でも、認証後にCognitoがリダイレクトするため、AWS Cognitoのアプリクライアント設定で正しいURLを登録する必要があります。
:::

設定例
```
本番環境: https://example.com/callback
ローカル環境: http://localhost:3000/callback
```


# TypeScriptによる実装

以下のTypeScriptコードでは、Cognitoを利用したOIDC認証を行い、ユーザー情報を取得する方法を実装しています

### 必要なライブラリ

oidc-client-ts を使用します。

```typescript
import type { UserManagerSettings, User } from "oidc-client-ts";
import { UserManager } from "oidc-client-ts";

// `UserManager` の設定

const cognitoAuthConfig: UserManagerSettings = {
  authority: `https://cognito-idp.${AWS_REGION}.amazonaws.com/${COGNITO_USER_POOL_ID}`,
  client_id: COGNITO_CLIENT_ID,
  redirect_uri: REDIRECT_URI,
  response_type: "code",
  scope: "openid", //設定したスコープを指定
};


const userManager = new UserManager(cognitoAuthConfig);

/**
 * ユーザー情報を取得
 */
const getUser = async () => {
  try {
    const user = await userManager.getUser();
    return user;
  } catch (error) {
    console.error("ユーザー情報の取得に失敗しました:", error);
    return null;
  }
};
/**
 * ログイン処理 (リダイレクト方式)
 * @param identity_provider - ログインするIDプロバイダー(Cognitoで設定したプロバイダー名)
 */
const login = async (identity_provider: string) => {
  await userManager.signinRedirect({
    extraQueryParams: {
      identity_provider,
    },
  });
};

/**
 * ログイン状態を確認
 */
const checkLoginStatus = async () => {
  const user = await userManager.getUser();
  if (user && user.id_token) {
    return
  } else {
    await userManager.signinRedirectCallback();
  }
};


/**
 * ログアウト処理
 */
const logout = async () => {
  await userManager.signoutRedirect();
};

export function useUserManager() {
  return {
    getUser,
    login,
    logout,
    checkLoginStatus,
  };
}

```

## リダイレクトURL

REDIRECT_URIはCognitoに設定するURLと合わせてください。

## ログイン処理

login(identity_provider: string): 指定したIDプロバイダーでリダイレクト方式のログインを実行します。

identity_provider には、Cognitoに設定したプロバイダー名（例: Google や Facebook など）を指定します。

## ログイン状態の確認

checkLoginStatus(): ユーザーのログイン状態を確認し、未ログインの場合はログイン画面へリダイレクトします。

## ユーザー情報の取得

getUser(): ログイン済みのユーザー情報を取得します。

## ログアウト処理

logout(): Cognitoからのログアウト処理を行います。

# まとめ

本記事では、AWS Cognitoを用いたOIDC認証の設定から、ログイン・ユーザー情報の取得・ログアウトまでの基本的な実装方法を紹介しました。Cognitoの設定でGoogleなどもIDプロバイダーとして追加すれば、複数の認証方法をサポートできます。
マジで使えるクローン作成ソフト（←ガチ！！）

## はじめに
タダで使えるHDD，SSDのクローン作成ソフトの紹介です．
何回インストールして，アンインストールしたことか

## とりあえずこれ使っとけ

AOMEI Backupper

4～5回クローン作りましたが，ライセンス買え買えっていうポップアップは出るものの使えました．

https://www.aomei.jp/backup-software/ab-standard.html


## あのWestern Digitalやぞ

Acronis True Image

Western Digital製のHDDかSSDが刺さっていれば，他社メーカー同士のクローニングにも使えます．クローン元が瀕死のとき（アクセス拒否とか出ているような状態）だと，AOMEI Backupperよりもクローン成功率下がっている感覚です．
ソース元ディスク選択して，ターゲット先選択する場面でぐるぐる読込して動かなかったことが何度かあった．

https://www.westerndigital.com/ja-jp/support/software/acronis


## クローンするとき
どちらのソフトでも言えることですが，マザボのNVMeスロットだとエラーが起きて，ディスクが認識されなかったが，USB経由のストレージなら読み書きできることがありました．クローンのソース元はUSB接続で，ターゲットはNVMeスロットだとクローニング成功しやすかっｔです．
GraphQLの基本概念とREST APIとの比較


## はじめに

GraphQL を初めて学習するにあたり、気になった点や疑問に思ったことを調査し、本記事にまとめました。
本記事の目的は、あくまで自身の疑問を解消し、GraphQL の概要を理解することにあります。
そのため、詳細な内容には触れてませんので、その点ご留意いただければと思います。

## GraphQL とは

従来の REST API では、GET・POST・PUT・DELETE といった**HTTP の動詞を使ってデータを操作** しますが、GraphQL では**1 つのエンドポイントを通じて、必要なデータだけを取得・更新・削除できます**。

## GraphQL はなぜ生まれたの

私の推測も入っているのですが、GraphQL は REST API での課題を解決するために生まれたと考えています。
以下に、REST API の主な課題と、それに対する GraphQL の解決策を示します。

### 課題 1: オーバーフェッチとアンダーフェッチ

REST API では、決められたフォーマットでデータを取得します。

そのため、必要以上のデータを取得してしまう（オーバーフェッチ）ことや、必要なデータが取得できない（アンダーフェッチ）ことが発生する場合があります。

例: ユーザー名と投稿記事のタイトルを取得したい場合

```jsx
GET /users/1
{
  "id": 1,
  "name": "Alice",
  "email": "alice@example.com",
  "phone": "123-456-7890"
}

"name"の情報がほしいだけなのに、"email"や"phone"の情報まで取得される。
"posts"の情報を手にいれるには、他のエンドポイントにリクエストを送る必要がある。
```

### GraphQL の解決策

GraphQL では、必要なデータだけを取得できます。
ユーザー名および投稿記事のタイトルを取得したい場合、以下の 1 回のリクエストで取得できます。

```graphql
query {
  user(id: 1) {
    name
    posts {
      title
    }
  }
}
```

### 課題 2: エンドポイントが多い

REST API では、取得したいデータに応じてエンドポイントを変更する必要があります。
エンドポイントの数が増えるほど、管理や変更の手間がかかります。

例：

```graphql
GET /users/1  → ユーザー情報を取得
GET /users/1/posts → ユーザーの投稿一覧を取得
```

### GraphQL の解決策

GraphQL では、エンドポイントが 1 つに統一されるため、取得するデータに応じてエンドポイントを変更する必要がありません。

```graphql
エンドポイント：/graphql
クエリ：
query {
  user(id: 1) {
    name
    posts {
      title
    }
  }
}
```

## GraphQL のメリット

上記に記載した内容と一部重複しますが、以下が GraphQL のメリットと考えてます。

- エンドポイントが 1 つであること
- 必要なデータを 1 回のクエリで取得することができること
- バージョン管理が不要なこと（スキーマ拡張で対応できるため）
- API のドキュメントを作成する必要がない（スキーマ定義することで自動で生成されるため）

## GraphQL のデメリット

私は以下の面が GraphQL のデメリットであると考えています。

- **学習コストが高い**：スキーマ定義やリゾルバーの実装が必要となり、設計が複雑になる。そのため、学習コストが高い。
- **キャッシュ戦略が難しい**：REST API では、エンドポイントごとにキャッシュを設定できるが、GraphQL ではすべてのデータが単一のエンドポイントから取得されるため、ブラウザや CDN でのキャッシュが難しくなる。
- **パフォーマンス**：GraphQL では過剰・大量なデータを取得される可能性があるため、パフォーマンスが低下する可能性がある。
- **セキュリティ**：GraphQL ではクライアントが自由にクエリを定義できる。REST API のようにエンドポイントごとに権限を設定する方法が使えないため、認可（Authorization）の管理が難しくなる。

## **GraphQL の仕組みを簡単に説明**

スキーマでデータを定義し、リゾルバーを利用してデータ操作を行う。

- **スキーマ**: データの設計図。取得できるデータや指定できるフィールドを定義する。
- **リゾルバー**: 実際にデータを取得・処理する関数。

### **お店に例えると…**

スキーマは **「商品カタログ」**、リゾルバーは **「店員」**。

お客さんが注文（クエリ）すると、店員さん（リゾルバー）がカタログをもとに商品（データ）を提供する、とイメージすると分かりやすいと思います。

## REST と GraphQL どちらを使うか

### GraphQL が適しているケース

GraphQL の特徴を考慮した結果、以下の場合は GraphQL の方が適していると考えています。

- SPA（シングルページアプリケーション）などで通信量を減らしたい場合
  　 → 必要なデータだけを取得できるため、不要なデータのやり取りが発生しにくい。
- 複数のデータを 1 回のリクエストで取得したい場合
  　 → 複数のリソースを 1 つのエンドポイントから取得でき、リクエスト回数を減らせる。
- API の柔軟性が求められる場合
  　 → クライアント側で取得するデータの内容を自由に指定でき、拡張性が高い。

### REST が適しているケース

一方で、以下のようなケースでは REST の方が適している考えてます。

- 小規模なアプリケーションなど、シンプルな API 設計で十分な場合
  　 → REST は設計が直感的で理解しやすく、実装の負担が少ない。
- 画像や静的データの提供など、CDN キャッシュを活用したい場合
  　 → REST は HTTP キャッシュとの相性が良く、CDN を活用しやすいため、負荷を軽減できる。

## 終わりに

本当は、設計についても学習して記載したかったのですが、~~理解に時間がかかりそう~~記事が長くなりそうなので、またの機会にします。

今回の記事がどなたかの参考になれば幸いです。

## 参考

- [GraphQL を徹底解説する記事](**https://zenn.dev/nameless_sn/articles/graphql_tutorial)
- [GraphQL とは？をわかりやすく解説](https://www.redhat.com/ja/topics/api/what-is-graphql)
- [GraphQL と REST API の比較](https://aws.amazon.com/jp/compare/the-difference-between-graphql-and-rest/)
uv add labelimg でエラーが出る

# 環境
* Windows11
* python 3.12.8

# uv add labelimg でエラーが出る

~~~powershell
(my-project) C:\Users\USER\my-project > uv add labelimg
Resolved 6 packages in 382ms
error: Distribution `pyqt5-qt5==5.15.16 @ registry+https://pypi.org/simple` can't be installed because it doesn't have a source distribution or wheel for the current platform

hint: You're on Windows (`win_amd64`), but `pyqt5-qt5` (v5.15.16) only has wheels for the following platforms: `manylinux2014_x86_64`, `macosx_10_13_x86_64`, `macosx_11_0_arm64`
~~~

# 解決策

pyqt5-qt5のバージョンがダメらしいので，先に以下を実行
~~~powershell
uv add pyqt5-qt5==5.15.2
~~~

その後，labelimgをインストール
~~~powershell
uv add labelimg
~~~

無事インストールできました
~~~powershell
Resolved 61 packages in 320ms
Audited 46 packages in 0.04ms
~~~

# 追記

`uv add torch`ができない方は，プロジェクト作成時にpythonのバージョンを指定すると解決します
~~~powershell
uv init my-project -p 3.12
~~~
後輩のためのFigma入門（Step3）

# 後輩のためのFigmaの使い方

後輩のためにFigmaに関して書きました。

Step3は「テキストボックスに触れてみよう」です。
おまけ前面背面のやり方も書きました。


## セットアップ

まず、テキストボックスを作成してみましょう。

**Step1**　下にある「T」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/f09f9eb1-dd95-e0ac-4f6d-195d229f3e43.png)

<br> <!-- 空行を追加 -->

**Step2**　図形と同じ要領でドラッグすると、テキストボックスを出すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/b4a2827c-e5e3-4c4f-b2bd-eec5f9f7d75b.png)

<br> <!-- 空行を追加 -->

**Step3**　他の場所を選択する前に、文字を入力します（null状態で他を選択すると消えます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/34b47c50-8df5-a4d7-86bc-71e42345c265.png)

<br> <!-- 空行を追加 -->

**Step4**　この場所でフォントサイズを変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/1b96b50d-9fdf-5eeb-1bcf-75b1cb493b98.png)

## 前面背面の入れ替え（おまけ）
テキストボックスや図形は前面背面を入れ替えることができます。
**上の「Bring ro front」で前面に**（ [ キーでも可　）
**下の「Send to back」で背面に** （ ] キーでも可　）
することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950744/3aabbfbd-e972-394f-c43e-d67b48c4c362.png)


## 続き
今回は、軽くテキストボックスの扱い方を解説しました。
細かい機能が多く、次回から解説しようと思います。

https://qiita.com/ko-tarou/items/1c434e21f9f078832083
Autonomous Database：自然言語プロンプトからSQLを生成するPL/SQLファンクションを作成してRESTで公開してみた

# はじめに
Autonomous Databaseでは、表やビュー、PL/SQLプロシージャ/ファンクションなどを簡単にRESTで公開できます。

今回は自然言語プロンプトからSQLを生成するPL/SQLファンクションを作成してRESTで公開してみました。

※こちらの記事の内容はあくまで個人の実験メモ的な内容のため、こちらの内容を利用した場合のトラブルには一切責任を負いません。
また、こちらの記事の内容を元にしたOracleサポートへの問い合わせはご遠慮ください。

# 1. PL/SQLファンクションの作成

SQLの生成に使用するAIプロファイルと自然言語プロンプト（質問文）をパラメータとして渡して実行すると、戻り値として生成されたSQLを返すファンクションgenerate_sql_statementを作成します。

処理の内容は非常に単純で、DBMS_CLOUD_AI.GENERATEファンクションに使用するAIプロファイル名とプロンプトを渡してSQLを生成し、戻り値として生成されたSQLを返します。
```
SQL> CREATE OR REPLACE FUNCTION generate_sql_statement(ai_profile IN VARCHAR2, nlprompt IN VARCHAR2) RETURN VARCHAR2
  2  IS
  3      generated_sql VARCHAR2(4000);
  4  BEGIN
  5  	SELECT TO_CHAR(DBMS_CLOUD_AI.GENERATE(prompt => nlprompt, profile_name => ai_profile, action => 'showsql')) INTO generated_sql;
  6  	RETURN generated_sql;
  7  END;
  8  /

ファンクションが作成されました。

SQL>
```

# 2. 作成したPL/SQLファンクションの動作確認

作成したPL/SQLファンクションgenerate_sql_statementの動作を確認してみます。
ここでは使用するAIプロファイルとしてOCI_GENAIを指定し、プロンプトとして「従業員は何人いますか」という質問文を指定しています。
```
SQL> SELECT generate_sql_statement('OCI_GENAI','従業員は何人いますか');

GENERATE_SQL_STATEMENT('OCI_GENAI','従業員は何人いますか')
--------------------------------------------------------------------------------
SELECT COUNT("e"."EMPNO") AS "従業員数" FROM "ADMIN"."EMP" "e"

SQL>
```
正しくSQLが生成できていることが確認できました。

# 3. PL/SQLファンクションをRESTで公開する

Database ActionsのSQLにアクセスし、ナビゲータに作成したファンクションGENERATE_SQL_STATEMENTを表示ます。
![スクリーンショット 2025-01-31 10.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/178523a1-d2e5-9c33-3b69-7cbb6e123c2f.png)

作成したファンクションGENERATE_SQL_STATEMENTの名前を右クリックし、「REST」→「有効化」とクリックします。
![スクリーンショット 2025-01-31 10.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/7778888f-6065-8e2a-49ff-05a52fcf2363.png)

オブジェクトのRESTの有効化の画面が表示されますので、プレビューURLをコピーしておき、「有効化」をクリックします。
![スクリーンショット 2025-01-31 10.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/79bee7a7-0030-c54a-a25e-5961977b5691.png)

これで、PL/SQLファンクションがRESTで公開されました。

今回は検証目的のため認証を有効化しませんでしたが、「認証が必要」のトグルをオンにすることで、RESTアクセス時の認証を有効化することができます。

# 4. 公開したRESTの動作確認

作成したファンクションGENERATE_SQL_STATEMENTの名前を右クリックし、「REST」→「cURLコマンド」とクリックします。
![スクリーンショット 2025-01-31 10.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/55749e0b-dcbd-7382-46e6-668fc2e8d315.png)

「ファンクションxxxxxのcURL」の画面が表示されます。

ここで、ai_profileの値として使用するAIプロファイル名「OCI_GENAI」を、nlpromptの値として質問文「従業員は何人いますか」を入力します。
値を入力すると、画面下部にそのパラメータを使用する場合のcurlコマンドが表示されますので、このコマンドをコピーします。
![スクリーンショット 2025-01-31 10.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/eb2e38fe-6fe9-2a2b-bdc5-dec9058e2125.png)

コピーしたcurlコマンドを実行してみます。
```
[opc@test html]$ curl --location --request POST \
> 'https://sya6vphk3pzlkhq-atp23ai.adb.ap-tokyo-1.oraclecloudapps.com/ords/admin/generate_sql_statement/' \
> --header 'Content-Type: application/json' \
> --data-binary '{
>   "ai_profile": "OCI_GENAI",
>   "nlprompt": "従業員は何人いますか"
> }'
{"~ret":"SELECT COUNT(\"e\".\"EMPNO\") AS \"従業員数\" FROM \"ADMIN\".\"EMP\" \"e\""}
[opc@test html]$
```
ダブルクウォートが \（バックスラッシュ）でエスケープされていますが、生成されたSQLがレスポンスとして返されていることが確認できました。
PytestのCIをGithub Actionsで書いていた時にハマった話

## はじめに
テストを自動化する際、GitHub Actions（GHA）でPytestを走らせるケースが多いと思います。今回は、Pydantic の BaseSettings を利用して環境変数を読み込む際に「GHA上でうまく読み込めずエラーになる」問題に直面したので、ハマりどころと解決策をまとめます。

## 想定読者・参考になる読者
- Python + Pydantic で環境変数管理を行っている方
- GHA を使ってCI/CDを構築している、またはこれから導入したいエンジニア
- ローカルでは動くのに、GHA上でパスの扱いに困っている方


結論、パスの指定方法が問題だったということなので、先にディレクトリ構造のサンプルを描きます。
settings.py は app/ ディレクトリ内に置き、.env.xxxはすべて app/config/ 配下で管理します。
```text
my_project/
├── .github/
│   └── workflows/
│       └── ci-test.yml        # GHAのワークフロー定義ファイル
├── app/
│   ├── config/
│   │   ├── .env.test         # テスト用環境変数ファイル
│   │   ├── .env.development  # 開発用環境変数ファイル
│   │   └── ...               # 他の環境ごとの.envファイル
│   └── settings.py           # PydanticのSettingsクラス
├── tests/
│   └── test_sample.py        # テストファイル
├── requirements.txt          # 必要に応じて依存関係リスト
└── README.md                 # プロジェクト概要

```

## ハマった経緯
- [PydanticのBaseSettings](https://docs.pydantic.dev/latest/concepts/pydantic_settings/)を継承したSettingsクラスで、class Configのenv_fileを使って.envファイルを読み込んでいた。
- もともとローカルで動かす際はenv_file = f"config/.env.{env}"のように相対パスで指定していて問題なく動作していた。
- しかし、GHAでテストを動かしたところ「Pydanticに環境変数が読み込めない」というエラーが発生。（このときは.envファイルが読み込めないみたいなエラーメッセージがでないのがハマらせたポイント）

```python settings.py
import os
from pydantic import BaseSettings

class Settings(BaseSettings):
    # 例: 環境変数として読み込む項目
    SAMPLE_ENV: str

    # .envファイル用の設定。環境変数によって.envファイルを動的に読み込む
    class Config:
        # GitHub Actions から渡される SAMPLE_ENV が無ければ "development" にする
        env = os.getenv("SAMPLE_ENV", "development")
        env_file = f"config/.env.{env}" # ←ここがGHAから実行したときにenvファイルが読み込めなかった
        case_sensitive = True
```



## 結論
- env_file = f"app/config/.env.{env}"のように絶対パスに変更したら問題なく読み込めるようになり、エラーが解消した。
- env_fileの読み込みは相対パス、絶対パスの両方をサポートしている

> https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support
> In either case, the value of the passed argument can be any valid path or filename, either absolute or relative to the current working directory. From there, pydantic will handle everything for you by loading in your variables and validating them.

```diff_python
import os
from pydantic import BaseSettings

class Settings(BaseSettings):
    # 例: 環境変数として読み込む項目
    SAMPLE_ENV: str

    # .envファイル用の設定。環境変数によって.envファイルを動的に読み込む
    class Config:
        # GitHub Actions から渡される SAMPLE_ENV が無ければ "development" にする
        env = os.getenv("SAMPLE_ENV", "development")
-       env_file = f"config/.env.{env}"
+       env_file = f"app/config/.env.{env}" # ←絶対Path指定
        case_sensitive = True
```


## 解決策

### 1. ファイル構成を確認する
- GHA上でチェックアウトされるディレクトリの構造を把握する。
- env_fileに指定するパスは、GHAのプロジェクトルートで実行されることを考慮する。
### 2. 絶対パス（またはルート相対パス）を使う
- env_fileにapp/config/.env.{env}のようにディレクトリ名を含めて指定する。
- これにより、GHAで動かしても指定したディレクトリを参照できる。


## まとめ
- ローカル開発とCI/CD環境（特にGitHub Actions）の実行パスの違いにより、Pydanticのenv_fileの読み込みが上手くいかないことがある。
- ハマりを回避するために絶対パスを指定することで問題が解決する場合が多い。
- パスの読み込み方法を変えたら、大丈夫だと思うが一応実際にアプリケーションをテストして想定通り動くかテストすると安心。
- 一度うまく動いていたとしても、ディレクトリ構成やワークフローが変わると再びハマる可能性があるため、定期的な確認や他環境でのテストを行うのがおすすめです。

以上が、PytestのCIをGithub Actionsで動かす際にPydanticのenvファイル読み込みでハマった話でした。同様の問題が起きた場合には参考にしてみてください。
Mac - Kalabiner Elements で右CommandキーにBackSpaceを割り当てる設定 

# 右CommandをBackSpaceに割り当てる

入力に right_command を選び

![Image](https://github.com/user-attachments/assets/d6d3aaed-0884-48ec-b684-382cbcf2ef0b)

出力に delete_or_backspace を選ぶ

![Image](https://github.com/user-attachments/assets/7ab464fd-86d6-48a9-9f0a-82744b38ced7)

これだけ

# CapsLock を Command に割り当てる場合

![Image](https://github.com/user-attachments/assets/3f1c8b1b-60cb-482b-8ff8-e9d88c8aa7ce)


# うまく動かない？

OSでの各種許可ができているかを確認しよう

<img width="701" alt="Image" src="https://github.com/user-attachments/assets/fefbd91a-b845-45a8-9193-17ba4947552b" />

![Image](https://github.com/user-attachments/assets/358a5f1f-065d-430c-a0bf-70f41b9dd958)


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
[SOLVED] Minimal Setup of Linux Mint Xia Cinnamon 22.1 Under Japanese Language Environment

[1] Making the installer of Xia:
    1.Downloading ISO image
    2.Making the installer using rufus with the DD mode
    
[2] Registering and removing apps from the favorites:
    Right chick of app icon in the menu
    
[3] Setting firewall:
    1. Click Firewall icon in System 
    2. Setting as follows:
        status: on
        incoming: deny; outgoing: allow
        
[4] Downloading all wallpapers from previous versions: 
$ sudo apt install -y mint-backgrounds-* ubuntu-wallpapers-* ubuntustudio-wallpapers xubuntu-community-wallpapers-* 

[5] Additional apps to be installed: 
    1.fcitx-mozc
    2.fonts-migmix
    3.fonts-ipamj-mincho
    4.ttf-mscorefonts-installer
    5.moji '文字'
    　an app for inputting symbols, special characters, etc.
    6.New Version of OfficeLibre 
      If the version of the OffieLibre is old after the system is installed, delete it then install the new version form the software manager.
    7.Pinta
    8.Kdenlive
    9.Galculator
    Installing from 
    　https://community.linuxmint.com/software/view/galculator
    10.Bleachbit
    11.SublimeText4　
    Setting in accordance with the contents in the following url: 
    　https://designerbrg.com/sublimetext_howto/ 
    12.Python3 
    13.Acivating WiFi
    Setting as follows: 
    　https://qiita.com/elicit777/items/5df432e7a2a6411f5740

Others: 
1.Keyboard Shortcuts 
    Shutdown, Restart, or Suspend: Cntl+Alt+End 
    Logging out: Cntl+Alt+Del 
    The other shortcuts 'can be or are' assinged to the "keyboard" menu in the system.
2.Starting the terminal: Cntl+Alt+T
    Copy:Cntl+Shift+C
    Paste:Cntl+Shift+V
WPF独自コントロール　ItemsSourceのバインドについて～備忘録

## はじめに
WPFの独自コントロール作成の際にリスト(コレクション)をBindingするための方法につまずいていたが、解決方法が見つかったので備忘録として記録する。

### この記事でわかる・できること

- WPFで独自コントロールを作成しデータをBindingする方法






### 動作環境・使用するツールや言語


- C＃　WPF
- net8.0






### コード一覧
独自コントロール側
ListBoxを配置し、ItemsSourceをBindingしています。
```:CustomControl.xaml
<UserControl x:~~~~~
             xmlns:~~~~~
             x:Name="root">
             <ListBox
                 DataContext="{Binding ElementName=root}"
                 ItemsSource="{Binding ItemsSource}"/>
</UserControl>
```
DependencyPropertyを使用します。
IEnumerableを使用します。
```:CustomControl.xaml.cs
public partial class CustomControl:UserControl
{
    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }
    public static readonly DependencyProperty ItemsSourceProperty = 
        DependencyProperty.Register("ItemsSource",typeof(IEnumerable),
            typeof(AutoSuggestBox),new PropertyMetadata(null));
}
```
使用する側
CustomControlを配置しItemsSourceにItemsをBindingしています。
```:MainWindow.xaml
<Window xmlns;local="~~~~~~">
    <Window.DataContext>
        <local:MainWindow_ViewModel/>
    </Window.DataContext>
    
    <local:CustomContorl ItemsSource="{Binding Items}"/>
</Window>
```
今回、ViewModelのコンストラクタでリストの中身を宣言しています。
```:MainWindouw_ViewModel.cs
public class MainWindow_ViewModel
{
    public List<string> Items { get; set; }
    public MainWindow_ViewModel()
    {
        Items = new List<string>(){"AAA","BBB","CCC"};
    }
}
```
これで外部からのデータをBindingできるようになります。
## 参考資料
[UserControl のカスタム ItemsSource プロパティ](https://stackoverflow.com/questions/9460034/custom-itemssource-property-for-a-usercontrol)


## おわりに・まとめ
独自コントロールを使用する場合ですので使用する頻度は少ないと思いますが備忘録ですのでご容赦ください。
また、今回のリスト(コレクション)を使用した部分一致検索の方法を別記事で記載できれｂと思います。
PACのshExpMatchでハマった話

プロキシー自動設定ファイル（Proxy Auto-Configuration, PAC）におけるshExpMatch関数でurl引数のパス部分をチェックし、一致したらプロキシを経由するように返すFindProxyForURL関数を作成したが、どうにも思い通りに動かない事態にハマった。

```proxy.pacの例
function FindProxyForURL(url, host)
{
  if (shExpMatch(url, '*/check-path/*')) {
    return 'PROXY proxyhost:3128'
  }
  return 'DIRECT'
}
```

Chrome（バージョン: 132）でプロキシを経由しないとアクセス不可なURL（例：`https://host/check-path/subpath/`） にアクセスすると、直接（DIRECT）アクセスしているようで、ブラウザにはForbiddenと表示されてしまう。

## 原因

前述の問題の原因は、以下に記載されている通り、ブラウザのバージョンにより、スキームが`https://`のurl引数からパスとクエリーの部分をブラウザが削除するからだった。

https://developer.mozilla.org/ja/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file#url

## 回避策

ブラウザのバージョンにより、回避しようがないので諦めるしかない。
[GAS] カレンダーを登録する。（色分け、説明なども）

## やりたいこと
GASでGoogleカレンダーに予定を登録したい
その際に、色分けや説明も追加したい
## 完成コード
~~~JavaScript
function testCalendar(){
  var cal = CalendarApp.getDefaultCalendar(); // デフォルトアカウントのGoogleカレンダーを取得
  var title = "テストタイトル"; //タイトル
  var startTime = new Date("2024/07/10 12:00"); // 開始日時
  var endTime = new Date("2024/07/10 15:00"); // 終了日時
  cal.createEvent(title, startTime, endTime)
    .setColor(6)  // 色を指定する
    .setDescription('説明テスト'); // カレンダーに登録する。
}
~~~
## setColor()
値 色
1 パールブルー
2 パールグリーン
3 Mauve
4 パールレッド
5 イエロー
6 オレンジ
7 シアン
8 グレイ
9 ブルー
10 グリーン
11 レッド

## 躓いたこと
~~~javascript
var calendar = CalendarApp.getDefaultCalendar();
calendar.createEvent('New Event',
                        new Date('2024-07-10T10:00:00Z'),
                        new Date('2024-07-10T11:00:00Z'));
~~~
とあるサイトで説明のあった上のコードを実行したが、登録されたカレンダーは9時間後だった
上の場合、カレンダーには19:00から20:00の予定となってしまう
概ねタイムゾーンの問題だとは思う

https://zenn.dev/gas/articles/474b100a72cf84

こちらのサイトで紹介のある確認方法で確認したが、正しく日本時間になっていた為、別の方法を模索して上の完成コードができた

## 参考にしたサイト
Google Apps Script(GAS)からGoogleカレンダーイベントを登録・削除する方法
https://qiita.com/park3taro/items/e33d3bd5381e8ebc6225

Google Apps 公式リファレンス
https://developers.google.com/apps-script/reference/calendar?hl=ja
PrivateLink経由でTokyo RegionからUSのDatadogを利用

# はじめに
2023年より前、SaaS型監視ツールDatadogのdata centerはUS及びEUにのみ存在していました。
そのため、Tokyo RegionのresourceからPrivateLink経由でDatadogを利用するには、cross-region関連の設定が必要でした。

https://www.datadoghq.com/architecture/connect-to-datadog-over-aws-privatelink-using-aws-vpc-peering/


2023/4から、日本でもdata centerが開設されたため、Datadogの利用が便利になりました。

https://investors.datadoghq.com/news-releases/news-release-details/datadog-launches-new-data-center-japan

しかし、
USのDatadogをそのまま利用している日本のクライアントも多いですため、Tokyo Regionで構築した新しいシステムでもUSのDatadogを利用している状況です。PrivateLinkを利用する場合、cross-region関連の設定は避けられないです。
そうしたクライアントに朗報が届いたのは、2024/11/26でした。

https://aws.amazon.com/about-aws/whats-new/2024/11/aws-privatelink-across-region-connectivity/

要するに、Tokyo RegionでInterface Endpointを作成した際に、US regionにあるDatadogのendpointを指定できるようになりました。

# Cross-Region-Endpointの作成に関する検証
PrivateLink経由で、USにあるDatadog(Saas)からTokyo RegionのFargate ECSのメトリックを収集できるようにするため、以下の２点のやり方を確認した
- VPC Endpiont作成（Datadog）
- Datadog agent install

:::note warn
メトリックの設定などDatadog(Saas)の関連設定も必要ですが、ここではNo Touch
:::

## Datadogのservice名称、Endpoint一覧(US)
>Logs (Agent HTTP intake)
>Logs (User HTTP intake)
>API
>Metrics
>Containers
>Process
>Profiling
>Traces
>Database Monitoring
>Remote Configuration

https://docs.datadoghq.com/agent/guide/private-link/?tab=connectfromsameregion

## Tokyo RegionからUSのDatadog serviceを利用
### VPC Endpoint作成
#### Cross Region endpoint利用しない
:::note alert
当然service利用不可
:::

>Region: Tokyo
>Enable Cross Region endpoint: Check Off

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/a05defe1-d2f2-6381-4e61-92b0efd8a8cb.png)

#### Cross Region endpoint利用
:::note 
嬉しいことになった
:::


>Region: Tokyo
>Enable Cross Region endpoint: Check On

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/e4d5afc8-56ab-60c2-4c9b-724c6bff5346.png)

#### Endpoint作成結果
必要なDatadog service(API, Metrics, etc.) へのendpoint作成結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/79dfc08a-0383-1211-7fc4-807494ec46ff.png)

### ECS taskにDatadog agent install
今回はFargate ECSで稼働するContainerを監視対象とするため、同じtask内にDatadog agentをinstallしました。
#### Datadog agent image
「public.ecr.aws/datadog/agent:latest」を利用しますが、対象のECSがprivate network内に稼働するため、一度public ecr ⇒ private ecrへimageをcopyしました。

    aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456.dkr.ecr.ap-northeast-1.amazonaws.com
    docker pull public.ecr.aws/datadog/agent:latest
    docker tag public.ecr.aws/datadog/agent:latest 123456.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
    docker push 123456.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest

#### Datadog agent container環境変数設定
:::note info
環境変数 DD_SITEは US側のURL：datadoghq.comを指定
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/6e6bc233-e23b-4394-b386-3dcf5980c5c9.png)

### Other: 監視対象containerのDocker labels追記
:::note warn 
こちらの設定は深く考えせず、マニュアル通りに実施しただけ
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/ee27c2d1-08ca-2a7c-769b-b8d77b75a498.png)

## 補足
関連メトリックの設定を実施すると、
datadoghq.comから監視対象のCPU、Memory使用率などを確認できる
ZennとQiitaの記事の同時管理

## はじめに
私は最近ZennとQiitaの記事を投稿し始めました。
どちらも素晴らしいプラットフォームですが、記事を両方に投稿する際はコピペして少し修正しないといけないので管理が大変になります。
そこで、ZennとQiitaの記事を1つのGitHubリポジトリで管理する方法を見つけましたので共有したいと思います。

## 方法
C-Naokiさんが制作されている[zenn-qiita-sync](https://github.com/C-Naoki/zenn-qiita-sync
)を使用してZennとQiitaの記事を1つのGitHubリポジトリで管理します。

https://github.com/C-Naoki/zenn-qiita-sync

[zenn-qiita-sync](https://github.com/C-Naoki/zenn-qiita-sync
)の使い方はC-Naokiさんご本人が書かれた「[Zenn vs Qiitaを終わらせに来た
](https://zenn.dev/naoki0103/articles/zenn-qiita-sync-workflow)」の記事で使い方等の手順が分かるので参考にしてみてください。

https://zenn.dev/naoki0103/articles/zenn-qiita-sync-workflow

## 最後に
このツールを試す際に、同じ投稿を複数投稿してしまうなどしてしまいました。
同じ投稿が表示されてしまった方など荒らしてしまい申し訳ございません。
Cause: unable to find valid certification path to requested target


# 概要

　まだ初心者だったころ、ふっるいAndroidStudioプロジェクトに携わっていた際に余計な事をしたら起こった事を簡潔にまとめます。

　こんなんでも初投稿です。

# 環境

| | Version |
|:-:|:-:|
| Android Studio |  3.2 |
| TARGETSDK_VERSION  | 19  |
|buildToolsVersion| 26.0.3|

# やったこと

<br>
 　わたし「このプロジェクト、バージョンをフォルダ名にしてるのきっしょいンゴねえどうにかならんかなあ」
  
 　なんか記事「imlいじったり消したりしたらいけるで」

　わたし「ほへーサンガス」ｶﾀｶﾀ


# 問題発生

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099978/2b1b7200-9c35-a5b1-e741-b52b7c8852c5.png)

# 原因

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1099978/750ad325-3416-7c91-3aa4-d313fa88d670.png)

　imlファイルはモジュールの実体。
 
　そのため、ライブラリの実体が無いのでgradleに記載のところからライブラリもってきたろってしました。

　が、[jcenterは既に閉鎖している](https://qiita.com/koichi-ozaki/items/a31f2305e14e4e30afd3)ので、ライブラリを引いてくることができない。

>
>→ Cause: unable to find valid certification path to requested target
>
>リクエストされたターゲットのええ感じのパスが見当たらんかったで（適当和訳）

# 結論

まだまだAndroid開発に慣れてない時期だったとはいえ、英文をちゃんと読んで調べよう、な？
servicenowでのバッチ

sysauto.list

```ruby:qiita.rb
sysauto.list
```


![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971184/ce860fb3-102d-b3b6-125c-35fb8282399c.png)

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971184/18f30aa9-c4c8-3331-856b-82ab96d996c8.png)
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971184/dadcb728-36c5-092b-97eb-39c5e154acc2.png)
Cline使ってみた

## はじめに
2025年は「AIエージェント元年」になると言われており、早速色々なニュースが世間を騒がせていますね。
私はエンジニアでありながら、なかなかAIを活用した開発ツール（CursorやらWarpやら）を使えていないな〜という自覚があったので、よく耳にするClineというAIエージェント的に使えるツールを使ってみました。

## Clineとは？
[Cline](https://github.com/cline/cline)は**エージェント型の開発支援ツール**です。VSCodeやCursorの拡張機能という形で利用することができます。
Github CopilotやCursorだとあくまでコーディングをする主体は人間ですが、Clineはエージェント型のため、人間は指示を出すだけで**コーディングの主体がCline**になります。
使用するAIモデルは代表的なものは網羅されているイメージで、ClaudeやGPTなどが自由に選択できます。

## 料金体系は？
Clineを使うだけでは料金はかかりませんが、利用するAIモデルのAPIを使った分だけ料金がかかります。
開発にがっつり使うと結構な入出力トークンが必要なため、それなりに値段はかかってきそうですね。

## Clineで使うべきAIモデル
前述したように、トークンの消費量によって料金がかかってくるので有名所のAIモデルはなかなか利用しづらいです。
そこでよくClineとセットで使われているのが**DeepSeek**というAPIです。
DeepSeek-V3の場合、入力トークンの通常価格は100万トークンあたり0.07ドル、出力トークンは0.27ドルになってます。
そしてなんと、2025年2月8日までは100万トークンあたり0.014ドル、出力トークンは0.14ドルと更におやすくなっています！（比較で言うとClaude 3.5 Sonnetの約1/54程度らしい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887131/cac26f7e-0df5-5494-bacb-8d910f02831d.png)

:::note warn
deepseekにはセキュリティ上の問題も指摘されていたりするので、ビジネス利用する際にはお気をつけください（自己責任でお願いします）
:::

## DeepSeekの場合に実際かかった料金（参考）
今回私はLambda上で実行するPythonのコードをほぼ全てClineに書いてもらったのですが、入力トークンが50万・出力トークンが7000トークンくらいで、全部で0.01ドルでした。
想定していたよりもだいぶ激安ですね！

## 使い方
使い方ですが、VSCodeの拡張機能として使えるようになっているのでとても簡単に利用できます。
**1. VSCodeの拡張機能検索で「cline」と検索すると一番上に出てくるのでインストール**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887131/2b3e3f46-f146-c1dd-e03a-080b00fbdc40.png)

**2. 利用するAIモデルのAPI Keyを発行する**
利用したいAIモデルのAPI Keyを発行してください。
私の場合はDeepSeekを利用しました。

**3. Clineの拡張機能設定から使いたいAIモデルと発行したAPI Keyを入力する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887131/c7d13b2e-7bc0-09e9-feee-964e997cf0f0.png)

**4. chatにやって欲しいことを入力する**
これで使える状態にはなっているはずなので、後はchatからやって欲しいことを入力するだけです。
私の場合は、日本語の命令をChatGPT-o1で英語に翻訳してもらって入力をしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887131/82773b75-208f-97bf-3193-06894f286e47.png)

## 使ってみた所感
ターミナルも勝手にガンガン使ってくれたり、リアルタイムでコードが書かれていく様はなかなか面白いものでした。スピードも全くストレスなかったです。
新たにファイルを作成したり・編集をしたい場合は最後にユーザー側に適用するか聞いてくれるので、
意図と違った場合はrejectすることもできます。
アウトプットとしては基本普通に動くものができあがるんですが、今回はLambda環境という外部に依存するコードだったので実際にデプロイしてみると問題があるので自力で解決が必要でした。
コード上に存在しないコンテキストを伝えるのがなかなか大変かもしれません。
すでにある程度出来上がっているアプリケーションの修正や機能追加だとどんな使用体験かも気になるので、また使ってみようと思います！
Onlook使ってみた、良きです。

## 前書き
Xを眺めていたら、Onlookというツールの情報が流れてきました。ちょっと気になったので使ってみました。感想をまとめます。

![0530eb576cc3deb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/c04fd819-20b3-5e28-569b-ab977346429a.jpeg)

Onlook は、Figma と同じように使いやすいインターフェースを使用してフロントエンド コードを設計できるブラウザベースの製品スタジオです。アクセスできる任意の React コードベースへの変更を編集して共有できます。 --公式説明

[公式サイト](https://onlook.com/)

## コスト面
まずは一番大事な料金ですね。公式サイトを見ると、下記のように記載されています。

![4586360B-6A21-4AE0-96CA-6EBF9E0BED8C_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/073b3dc7-ec3a-cbcb-a04b-2163d3666f9c.jpeg)

今、無料らしきことが書かれていますが、無料だからこそ逆に少し恐怖を感じるのは私だけではないと思います。:sweat_smile:

実は完全無料ではないです。
![A0E0361F-2339-471E-9302-E39E20C9141B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/6e66f0dc-6a92-e341-b942-964f664206c8.jpeg)
無料プランの場合、1日10回、月50回の制限があります。有料プランでは月20ドルの支払いが必要ですが、まあ、妥当な値段だと思います。特別高いわけではありません。

## 使用感

`新規プロジェクト`と`既存プロジェクト`の両方に対応しています。
![D5944D18-A782-47C5-971E-AD87825B2571.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/74993202-635f-ce9b-250e-ac4ed978c37d.jpeg)

新規の場合、作りたいプロジェクトの説明プロンプトを入力すると、そのまま作成してくれます。ただし、作成されるOnlookのフォルダは以下の場所になります。今後のアップデートで、好きな場所を選べるようにしてほしいです。

先にNext.jsプロジェクトを初期化してから導入することもできるので、不便を感じることはありません。
![BA869700-D8C0-49FE-ACCD-62529B89BFE0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/1ba1196f-e895-648e-0a3a-bed07b4d584c.jpeg)

プロンプトを使って新しい画面やコンポーネントを作れるのはもちろん、細かいデザインの修正も画面上で直接行えます。さらに、その修正がコードにしっかり反映されるのは非常に便利です。

いちいちコードを修正してから画面で確認する手間が省けるので、作業効率が大幅に向上します。

![0B1C33E3-C3C3-45D6-9AAB-CF0111A701FB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/a5facc1d-d1dd-f6d6-a4fa-a503499dfe84.jpeg)



## セキュリティ

Onlookは、ゼロからフォルダを作成したり、ファイルを削除したりする権限を求めてきました。しかし、そのくらいの権限がないと逆に何もできないため、妥当だと思います。

## 互換性

Onlookはコーディング用のエディターではなく、デザイン寄りのツールです。

むしろ、見た目以外の修正をしっかり行いたいのであれば、既存のエディターやCursorのようなコーディングエージェントを搭載したエディターを利用した方がよいでしょう。
その意味では、うまく棲み分けができていると思います。

## サポート体制
Discordのチャンネルでコミニュケーションを取るか。
![D3B1DD7A-819D-442B-BEAC-67CF25C9E100.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/55a0d3c9-6e74-35b4-0aa8-bd3d313f16b3.jpeg)


直接作者に連絡することもできるらしいですが、空き枠がたくさんあるのを見て、本当に機能するのかちょっと不安になります。

![A24AE260-F1CD-4FF3-879F-47F5BD714EE5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/f25d413e-5911-548a-1eae-5b536106fc8e.jpeg)


https://meetings.hubspot.com/daniel-onlook/onboarding-to-onlook-with-daniel?uuid=7c183e45-a89f-4497-bd53-75bb8a08ab4a

Xのアカウントもあります。投稿内容を見ると、日本市場を意識してるっぽいですね。

https://x.com/onlookdev

## 感想

ローカルで使用できるFigmaであり、変更がコードベースに反映できるため、見た目に関する修正は非常に簡単に行えます。私のようにデザインが苦手な人にとっては、まさに救いの手と言えるでしょう。

ただし、これは一般的なエディターではなく、デザイナーや、デザインもコーディングも行うエンジニア向けのツールです。既存のエディターと組み合わせて使えば、これまで以上のパフォーマンスを発揮できるのは間違いありません。

デザイン機能だけを見ると、まだFigmaの方が優れています。しかし、デザイナー以外のユーザーにとっては、サブスクを乗り換えても十分に選択肢となるツールだと思います。
【python環境構築】venvからpipenv環境に変えてみたら良かった

## 課題
依存関係の管理がほしくなりました。

経緯としては、もともとvenv＋pyenvでpython環境構築していました。

ただ、Githubで管理したいがパッケージがおもすぎてpushできない問題がおこります。
そしてパッケージをgitignoreすると、localにしか依存関係を残すパッケージデータがありません。
つまり、何をインストールしたかの記録がないのです。

そこで依存関係を記録するrequirements.txtなんですが、、

venvだとPythonのパッケージ管理ツールがないので、手動で毎回下記コマンドによって、依存関係を作らないといけないです

```jsx
pip freeze > requirements.txt
```

これ毎回やってたのですが、面倒で忘れそうでした。。


Nodeのpackage.jsonやpackage.lock.jsonのように自動で管理してほしかったのです。

## 対策

pipenvで仮想環境を作り直しました。

pipenvはvevnを内包していて、かつ自動でパッケージ管理してくれます。

- **`pipenv` で作成される仮想環境の特徴**:
    - プロジェクトごとに独立した仮想環境が作成されます。
    - 仮想環境にインストールしたパッケージは、そのプロジェクト専用のものとして管理されます。
- **仮想環境にパッケージをインストールする方法**:
    - `pipenv install パッケージ名` を **プロジェクトディレクトリで実行** すれば、対応する仮想環境にパッケージがインストールされます。
    - 仮想環境を直接アクティブにしなくてもよい。

明らかにvenv環境の強化番だと思い試してみました。

## 試してみる

### brew経由でインストール

```jsx
brew install pipenv
```
システム環境を汚さず、安全に`pipenv`を利用します！

### パッケージのインストール

- **パッケージのインストールや管理**:
    - `pipenv install` でパッケージをインストールし、仮想環境に追加できます
        
        ```bash
        pipenv install demucs
        ```

そうすると、`Pipfile` に直接必要なパッケージが記録され、`Pipfile.lock` で依存関係が固定化されます！


```text
#Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
demucs = "*"

[dev-packages]

[requires]
python_version = "3.9"
python_full_version = "3.9.6"


```
### 再インストール
        
git cloneして、別の端末で環境構築してみました。

`Pipfile` と `Pipfile.lock` をプロジェクトに含めれば、以下のコマンドで同じ環境を再現可能です！
        
```bash
pipenv install
```
        
これだけで、仮想環境とパッケージ管理できるの超便利です！


### 仮想環境内でのPythonスクリプト実行

２種類あります。
私はBが便利なので、Bを採用してます。

- **仮想環境内でスクリプトを実行する方法**:
    - A　仮想環境をアクティブにして実行：
        
        ```bash
        pipenv shell
        python your_script.py
        
        ```
        
        実行後、`deactivate` で仮想環境を終了できる。
        
    - B　仮想環境をアクティブにせず直接実行：
        
        ```bash
        bash
        コピーする編集する
        pipenv run python your_script.py
        
        ```
        
Bのほうがシンプルで効率的でした！

## まとめ・感想

pipenvはパッケージの依存関係と、仮想環境を両方管理することができます。

Dockerfile書くより仮想環境がお手軽で、かつパッケージ管理自動化できるので、しばらくはこの方法で開発しようと思います！
Vercel v0 を試してみた

フロントエンドを書くのが苦手なのですが、Vercel v0 を使うと AI が生成したコードからすぐにフロントエンドの画面を確認できて簡単に UI ができるということらしいので使ってみました。

https://v0.dev

作ってみたのは [ボードゲームの ITO のようなアプリ](https://faozfa3gxx9rlhzx.vercel.app/) です。ずっとアクセスできることは保証しません。

こんな感じの画面でホストがカードを並べ替えたりお代を変更できるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415560/5e6c6e74-5703-b0a1-18f2-137f4cf787f0.png)

使った所感をまとめます。
どんなことができるかはすでにまとまっている記事等あるかと思いますので割愛します。

参考

https://qiita.com/shirochan/items/541126f4c866367b2278


## すごいと思ったこと

### 非フロントエンドエンジニアが自分で書くより圧倒的に早い

データエンジニアとしてはフロントエンドを書く機会がなかなかないので思い出したり情報のキャッチアップから始めないといけないのですが、そういう工程をすっ飛ばして軽く動くものを作れるのはすごいと思いました。

上記のアプリであれば作るのに4,5 時間程度かかりましたが、回答をまったりビルド待ちの時間をうまく別作業に使えれば正味1, 2時間程度の時間しか使っていないと思います。

フロントエンドの本職の方からすると実装のアラが目立つかもしれませんが、フロントエンドエンジニア以外の方が要件定義のために実際に動く画面遷移を作る機会があれば相当便利だと思います。

### 環境変数をインタラクティブに設定できる

最初にこんな感じのプロンプトを書きました。

```md
ボードゲームを作成します。 複数のプレイヤーが同時にプレイします。そのため、サーバーサイドのステートを共有する必要があります。 ステートの共有は WebSocket を使用します。

共有するステートは次のとおりです。 

プレイヤー関係

- プレイヤー名
- プレイヤーの書き込む単語

部屋関係

- 部屋名
- 部屋のパスワード

カード関係

- カードに書かれた数字

お題関係

- お題

まずはこれらのステートを共有できる仕組みを作成してください。
```

するとこんな感じの返事がきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415560/cb65f5a8-5360-db35-88b1-203db242328b.png)

`Environment Variables Added` と表示されているところはもともと Pusher と upstash-redis の環境変数を入力できる欄が表示されていました。
それぞれのサービスからクレデンシャルキーなどを取得して入力することで、これらのサービスをフロントエンドに組み込むことができました。


## コツ

### 長大なコードには使わない

今どきの生成 AI あるあるですが、コード量が増えれば増えるほどうまく生成できなくなっていきます。
どこを変更すればよいのか当たりをつけるのが下手になっていく感じです。
人間だとよしなに情報の取捨選択ができることでも、今の AI 的には難しいようです。

### サーバーサイドから作ったほうがうまくいきやすい

日頃フロントエンドを書かない人間からすると指示を出すごとに画面が出来上がっていく様子を見るのは非常に楽しいのですが、最後にサーバーサイドのコードを生成させようと思うと結構失敗しやすいように感じました。

作る順番よりかはコードの生成量が多くなっていることが影響してそうですが、サーバーサイドを先に書かないと全く意味がないケースも出てくるため、優先したほうが良いと思います。

## まとめ

現時点では本格的なアプリを作るには使いにくいと思いますが、簡単なアプリなら十分使えそうです。
個人的には友達とボードゲームをすることが多いので、Web 上でプレイしたいものを自作して身内だけで遊んだりするのに使いそうです。

今後に期待しています。
今まで書いたブログ記事まとめ

# 1. はじめに

Qiita 以外で書いたブログ記事のリンクをまとめます。

# 2. ブログ記事

| 公開日 | タイトル | URL |
| :-- | :-- | :-- |
| 2024-02-01 | 大規模言語モデルのトレンド分析 | https://medium.com/micin-developers/%E5%A4%A7%E8%A6%8F%E6%A8%A1%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%88%E3%83%AC%E3%83%B3%E3%83%89%E5%88%86%E6%9E%90-0ab7ac9d779c |
| 2024-12-15 | BigQuery と Gemini で手軽に画像から情報抽出 | https://zenn.dev/micin/articles/fed57b881ee91f |
expo startの初回実行時に出たエラーの解決法

## 背景
expoの公式ドキュメントに沿って環境構築中に、`npx expo start`を実行すると以下のエラーが発生した。
```bash
Error: EMFILE: too many open files, watch
    at FSEvent.FSWatcher._handle.onchange (node:internal/fs/watchers:207:21)
```

## 解決法
node_modulesを削除。
```
rm -rf node_modules
```

依存関係の再インストールを行う。
```
npm install
```

再度起動。
```
npx expo start
```

上記実行すると無事起動が確認できた！

## 参考文献

https://stackoverflow.com/questions/76129467/expo-giving-an-error-emfile-too-many-open-files-for-my-react-native-and-fi
［ServiceNow］Schedule Entry（cmn_schedule_span）について

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# スケジュールエントリー（Schedule Entry）とは？
- スケジュールに関連付けられた時間枠を管理するためのデータ
- スケジュール（cmn_schedule）の時間枠を管理するテーブル

# Schedule Entryテーブルの物理名
cmn_schedule_span

# Schedule Entry の主な用途
- 営業時間の設定
    - 例: 月曜〜金曜の 9:00～17:00 を「営業時間」として定義
- SLA（サービスレベルアグリーメント）の計算
    - 例: 営業時間内のみSLAのタイマーを進めるように設定
- ワークフローの時間制御
    - 例: 特定の時間帯のみ処理を実行するルールを適用

# 主要なフィールド
| フィールド名      | 説明                                  | 型         | データの例                |
|-----------------|--------------------------------|-----------|------------------------|
| `name`         | スケジュールエントリーの名前            | String    | "Weekday Business Hours" |
| `schedule`     | 関連するスケジュール（cmn_scheduleの参照） | Reference | "9am-5pm Work Hours"     |
| `start_time`   | 開始時刻                              | Time      | "09:00:00"              |
| `end_time`     | 終了時刻                              | Time      | "17:00:00"              |
| `day_of_week`  | 適用される曜日（0=日曜, 1=月曜, ...） | Integer   | "1"（月曜）             |
| `timezone`     | タイムゾーン                          | String    | "America/New_York"      |
| `sys_id`       | 一意な識別子                          | String    | "46d44bc5db0233001c3a6a55db9619b3" |
| `sys_created_on` | 作成日時                            | DateTime  | "2025-01-30 10:15:00"    |
| `sys_updated_on` | 最終更新日時                        | DateTime  | "2025-02-01 15:45:00"    |
| `sys_created_by` | 作成者                              | String    | "admin"                  |
| `sys_updated_by` | 最終更新者                          | String    | "service_user"           |




# Scheduled Job（sysauto）との違い

| 項目            | Scheduled Job（スケジュールドジョブ） | Schedule Entry（スケジュールエントリー） |
|----------------|--------------------------------|--------------------------------|
| **目的**       | 定期的な処理（スクリプト実行）を自動化 | 営業時間やSLAの時間枠を管理 |
| **対象**       | サーバーサイドスクリプト | スケジュール（cmn_schedule）内の時間枠 |
| **テーブル名**  | `sysauto` / `sysauto_script` | `cmn_schedule_span` |
| **主な用途**   | バッチ処理、データ更新、通知送信 | 営業時間、SLA時間、ワークフロー制御 |
| **スクリプト** | 可能（GlideRecordなどを使用） | 不可（時間の定義のみ） |
| **設定方法**   | `sysauto.list` で管理 | `cmn_schedule_span.list` で管理 |
| **実行タイミング** | 指定時刻や間隔ごとに実行 | スケジュール（cmn_schedule）に基づく |
| **例**         | 「毎日2時に古いレコードを削除」 | 「月〜金 9:00〜17:00を営業時間に設定」 |

### 違いのポイント
- Scheduled Job
    - スクリプトを定期実行するためのジョブ
    - Scheduled Job はアクション（処理）
- Schedule Entry
    - スケジュールの一部として特定の時間枠を設定するもの
    - Schedule Entry は時間の枠組み