OmniAICreator/Qiita-1.07M huggingface dataset:
アプリ開発を始めてから３ヶ月が経った

アプリ開発を始めてから３ヶ月が経ったので、今までやってきたことの振り返りも兼ねて作ったアプリや勉強した内容、収益などを記事にしようと思います。少しでも参考になれば幸いです。

## 作ったアプリ
これまでに作ったアプリは３つで、すべてiOSアプリです。
### 鬼勉 - 勉強時間管理アプリ
https://apps.apple.com/jp/app/%E9%AC%BC%E5%8B%89-%E5%8B%89%E5%BC%B7%E6%99%82%E9%96%93%E8%A8%88%E6%B8%AC%E3%82%A2%E3%83%97%E3%83%AA/id6502514820?platform=iphone
### Active Circle - スポーツ愛好家のためのSNS
https://apps.apple.com/jp/app/active-circle/id6503892046?platform=iphone
### Message with AI - 作成したAIキャラクターと会話ができるアプリ
https://apps.apple.com/jp/app/message-with-ai/id6563142519?platform=iphone

開発言語をDart(Flutter)です。Androidでもリリースしようと思ったのですが、テスター２０人の壁にぶつかってしまったので後回しにしています。

## １ヶ月目
アプリ開発１ヶ月目にしたことは、Flutterの基礎知識の勉強と「鬼勉」のリリースです。Flutterの基礎知識の勉強はおもに書籍とUdemyの講義で勉強しました。書籍は本屋で[動かして学ぶ！Flutter開発入門](https://amzn.to/3X2fXcJ)を利用しました。この書籍の良かった点は、初心者がはじめに躓きやすいポイントである環境構築の手順が丁寧に解説されていたことと、開発に必要な基本的な知識が網羅されていることです。また、Udemyの講義は以下のものです。

https://www.udemy.com/course/nzigen-flutter_beginner/?couponCode=KEEPLEARNING

こちらも、一からFlutterを学ぶ方にはとてもおすすめです。インプットに時間をかけすぎるのも良くないと思ったので、勉強は初めの一週間で終わらせました。そのあとは、ひたすら「鬼勉」の開発に取り組みました。「鬼勉」はタイマーを用いて勉強時間を計測し、学習記録をカレンダーに保存します。アプリの機能は比較的すぐに完成したのですが、一番の鬼門はリリース作業でした。何回もエラーが出てそのたびに頭を抱えましたが、メンター(ChatGPT)に協力してもらってなんとかApp Storeにリリースできました。自分で作ったアプリがApp Storeに表示された時は嬉しかったですね。

## ２ヶ月目
もっと多くの人に使ってもらえる様な大規模なアプリケーションを作りたいと思ったので、SNSアプリの開発を始めました。SNSアプリは世の中にたくさんありますが、スポーツに特化したものは聞いたことがなかったということと、私自身スポーツが大好きなので「Active Circle」を作ろうと思いました。バックエンドはFirebaseを利用して、ログイン機能やデータベースの連携、広告の表示などの実装をしました。毎日開発をしていて、気がついたら１ヶ月が過ぎてました。

## 3ヶ月目
その後も引き続き「Active Circle」の開発を進めて7回目の審査で無事承認されてリリースできました。何度かアップデートもして改良を続けています。３つ目に作成したのは、「Message with AI」です。近年のAIブームに乗っかろうと考え開発しました。「Message with AI」はOpenAI APIを用いて自身で作成してAIキャラクターとチャット会話ができるアプリです。こちらもApp Storeにリリースしましたがこちらも「Active Circle」同様アップデートして機能を改善していくつもりです。

## 収益
現在のアプリの収入源はAdModの広告のみです。先月の収益は2171円でした。
![スクリーンショット 2024-08-16 17.28.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693065/4a8c9257-0256-1cde-58da-c79aed63ea55.png)
まだ全然稼ぐことはできていませんが、あまり気にせずこれからも進めていきます。

## 今後の目標
今後の目標としては、月１万円を稼げる様に頑張ります。そのためには、もっと役に立つ機能やアプリのデザインにこだわる必要があると思います。また、マーケティングをして自分のアプリを広める事もする予定です。Xを見ているとアプリのTiktok動画を作成している人が多いので自分のやってみようと思います。収入源も広告だけでなくサブスク機能を搭載したアプリも作成したいです。なんにせよ、これからも継続して頑張ります。
Oracle Data Guard per Pluggable Database (DGPDB)でReal Time Queryを試してみた

# はじめに
本記事は、「Oracle Database 23aiのData Guard per Pluggable Database (DGPDB)を構築してみた」の続編です。

https://qiita.com/tk_miya/items/1aae97147c2c62664dfe

上記記事で作成したDGPDBの環境でReal Time Queryを試していきます。
環境の情報は上記記事をご参考ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/2719ff22-dd39-0295-b816-c46318debedd.png)

# 検証概要
以下、検証概要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511285/88e3f080-b414-64c5-e20b-89bedcffa4ed.png)
TOKYO_SALES (ソースPDB)にInsert文を実行し、OSAKA_SALES (ターゲットPDB)をREAD ONLYで起動し、データが更新されていることを確認します。

# 検証内容
* OSAKA_SALES (ターゲットPDB)をREAD ONLYで起動する

```sql
SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 OSAKA_PUB			  READ WRITE NO
	 4 OSAKA_SALES			  MOUNTED
SQL> alter pluggable database osaka_sales open;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 OSAKA_PUB			  READ WRITE NO
	 4 OSAKA_SALES			  READ ONLY  NO
```
* Data Guard BrokerでOSAKA_SALESのステータスを確認し、Real Time Queryが"ON"になっていることを確認する
```sql
DGMGRL> show pluggable database osaka_sales at osaka_1

Pluggable database - OSAKA_SALES at osaka_1

  Data Guard Role:     Physical Standby
  Con_ID:              4
  Source:              con_id 3 at tokyo_1
  Transport Lag:       0 seconds (computed 2 seconds ago)
  Apply Lag:           0 seconds (computed 2 seconds ago)
  Intended State:      APPLY-ON
  Apply State:         Running
  Apply Instance:      osaka
  Average Apply Rate:  2 KByte/s
  Real Time Query:     ON

Pluggable Database Status:
SUCCESS
```

* データをInsertする表を確認する

TOKYO_SALES:
```sql
SQL> alter session set container = tokyo_sales;

Session altered.

SQL> select * from testuser.employee;

ID  NAME
--- ----------
1   James
```

OSAKA_SALES:
```sql
SQL> alter session set container = osaka_sales;

Session altered.

SQL> select * from testuser.employee;

ID  NAME
--- ----------
1   James
```

* TOKYO_SALES (ソースPDB)のテスト表 (employee表)にデータをInsertする

```sql
SQL> select * from testuser.employee;

ID  NAME
--- ----------
1   James

SQL> INSERT INTO testuser.employee (ID, Name) Values ('2', 'Mike');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from testuser.employee;

ID  NAME
--- ----------
1   James
2   Mike
```

* OSAKA_SALES (ターゲットPDB)で更新を確認する

```sql
SQL> alter session set container = osaka_sales;

Session altered.

SQL> select * from testuser.employee;

ID  NAME
--- ----------
1   James
2   Mike
```

今回の内容は以上です。
【アップデート】Amazon QuickSight にNested Filter (ネストされたフィルター)という新しいフィルタータイプが追加されました

こんにちは。koderaです。
先日、Nested Filter (ネストされたフィルター)という新しいフィルタータイプが追加されました。
https://aws.amazon.com/jp/about-aws/whats-new/2024/08/amazon-quicksight-nested-filters/

## アップデート内容
Amazon QuickSight にNested Filter (ネストされたフィルター)という新しいフィルタータイプが追加されました。
ネストされたフィルターを利用することで、あるフィルタで絞り込んだ結果セットを元に別のフィルタの絞り込みを行うことができるようになりました。ネストされたフィルターは分析レベルでのみ追加できます。
ネストされたフィルターは、SQLの相関サブクエリやマーケット・バスケット分析と同様に機能します。


::: note info
マーケット・バスケット分析は、スーパーマーケットなどの小売業でよく用いられています。顧客の購買履歴から商品間の関連性を分析する手法です。
顧客が同時に購入する商品の組み合わせを分析することで、クロスセルの機会を増やすことができます。
:::


## ユースケース
マーケット・バスケット分析を実行する場合について、ご説明します。
ネストされたフィルターを使用して、特定の製品Aを購入した顧客の製品別の販売数量を検索できます。もちろん特定の製品Aを購入していない顧客の製品別の販売数量でもOKです。
さらに、製品Aを購入しなかった顧客、または特定の製品リストのみを購入した顧客のグループを識別することもできます。

## 確認してみる
(1)ネストされたフィルターは分析フィルターを編集するときに利用できます。とりあえずフィルターを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/b98922b0-7b20-7338-3c59-d75ab83dcffa.png)


(2) フィルターの編集をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/3a2ec44e-e935-a248-efc7-3217baf9a00a.png)

(3) フィルタータイプに「ネストされたフィルター」が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/8cb5a21d-9c97-416c-7861-91ecaf14e45e.png)

(4) ネストされたフィルターから「APAC」を選んでみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/0d097639-a012-9f7a-89d7-bd856f742d0d.png)

(5) さらに、OR条件（または）を追加し「Salesperson」でフィルターをかけてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/46f5d76a-7bb5-9dc7-c3f9-b642b0a21ffd.png)

## さいごに
Amazon QuickSightのネストされたフィルター機能を試してみました。
元のサンプルデータセットでは、うまく記事内で触れている「マーケット・バスケット分析」ができなかったのですが、マーケティングシーンでよく使われそうな機能追加だと思います。
RAIDとは

# はじめに
現在、案件先でRAID構築を行っている。
そもそも、RAIDとは何か、様々な種類のある中でそれぞれの違いについて
知識が曖昧であるため整理しようと思う。


## RAIDとは
RAID(Redundant Array of Inexpensive Disks)とは、複数の汎用HDDを用いて
冗長性を持たせることでシステムとしての可用性を高める技術である。
RAIDには複数の方式がある。今回は使用した方式0,1,5,6,10についてまとめる。

### RAID0(ストライピング)
0は2台以上のHDDを1つのドライブのように扱い、ブロック単位に分割した
データを複数のHDDへ分散して記録する方式。複数のHDDを同時に並行して
アクセスすることで記録速度を高速化する仕組みになっており、
HDDの本数が増えるほど高速化する
![raid0-structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782226/4c0d12b7-ba7d-d3fe-1dec-aa68dc61ab5c.png)


メリット
・データ処理速度が速い
・HDDの容量を最大限に使うことができる

デメリット
・冗長性がなく安全性が低い
・HDDが多いほどデータ損失のリスクが上がる
・リビルドができない


### RAID1(ミラーリング)
1は2つのHDDで同じデータを保持する技術。
どちらか一方のHDDが故障しても、もう一つのHDDが正常であれば、
データの安全が保たれ、システム停止を防ぐことが可能。

![raid1-structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782226/29659946-03a9-3b02-e9ac-cf26c511a67a.png)



メリット
・片方のHDDが故障してもデータ損失せず、動作が可能

デメリット
・2つのHDDを使用しているが、1つ分の容量しか保存できない


### RAID5(分散パリティ)
HDDの最低本数が３台以上で構成され、データを3台以上のHDDに分散して格納し、同時に(誤り訂正符号）データを生成して保存する技術。

![raid5-structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782226/283f266d-4a8b-e4b2-8152-470605c94112.png)

メリット
・HDDを増やせば処理速度と容量を改善可能
・冗長性が確保されている

デメリット
・パリティ保存のための容量が必要
・2台以上のHDDが故障すると復元が難しい


### RAID6
RAID5を進化させたもので安全性をさらに高めた設計が施されている。
5ではデータが万一損失しても再構築可能な「パリティデータ」が1つ含まれているが、
6は2つのパリティデータが存在する。そのため2つのHDDが同時に故障しても稼働し続けることができる。

![raid6-structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782226/8d536a49-70fe-4dff-5195-a65ddb7fe25f.png)


メリット
・HDDが2台同時に故障しても、データを保護できる
・XOR演算を基にした

デメリット
・パリティ工法の計算がかかり、書込みパフォーマンスが低下する。


### RAID10(ミラーリング＋ストライピング)
10は1と0をl組み合わせた構成である。
0と1を組み合わせることで高速化と耐障害性を実現可能としている。

![raid10-structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782226/fb4770c2-55c4-2108-8413-d39256824edd.png)


メリット
・ミラーリング機能により、2台のHDDに重複して記録可能
・ストライピングによりデータを分散し書き込まれ、ピンポイントで高い速度が要求される状況化で読み書きの速度を向上できる

デメリット
・HDDが4台構成が基本であるため導入コストが高い
・HDDが故障した場合、同期に時間がかかり脆弱性が高まる


#　おわりに
今回、RAIDの種類を整理することができた。
次回はどの場面でそれぞれのRAIDが適切なのかをまとめたいと思う。



##　参考文献
https://www.jstage.jst.go.jp/article/ieejjournal1994/122/4/122_4_219/_article/-char/ja/
https://www.netattest.com/raid1-2023_mkt_tst
https://www.a1d.co.jp/knowledge/datarecovery/basic-knowledge-raid0/
https://note.cman.jp/server/raid/raid10/
https://note.cman.jp/server/raid/raid10/
[JS] ボタンクリックでアラートを表示させるコードがうまく動かない


# はじめに
JavaScriptでTODOアプリを作るチュートリアルを行っていた際、躓いたので共有します。

#### 開発環境
vscode


# buttonクリックでアラートを表示させるコードがうまく動かない


```index.html:
<!DOCTYPE html>
<html lang="jp">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="./styles.css" />
    <title>TODO-app</title>
  </head>
  <body>
    <div class="input-area">
      <input placeholder="TODOを入力" />
      <button id="add-button">追加</button>
    </div>
    <div class="incomplete-area">
      <p class="title">未完了のTODO</p>
      <ul>
        <li>
          <div class="list-row">
            <p class="todo-item">TODOです</p>
            <button>完了</button>
            <button>削除</button>
          </div>
        </li>
        <li>
          <div class="list-row">
            <p class="todo-item">TODOです</p>
            <button>完了</button>
            <button>削除</button>
          </div>
        </li>
      </ul>
    </div>
    <div class="complete-area">
      <p class="title">完了のTODO</p>
      <ul>
        <li>
          <div class="list-row">
            <p class="todo-item">TODOでちた</p>
            <button>戻す</button>
          </div>
        </li>
      </ul>
    </div>
    <script src="./index.js"></script>
  </body>
</html>
```
```index.js:
import "./styles.css";

const onClickAdd = () => {
  alert();
};

document.getElementById("add-button").addEventListener("click", onClickAdd);
```
# 出ていたエラー
```
Uncaught SyntaxError: Cannot use import statement outside a module
```
# 解決

```index.html:
// 省略
    </div>
    <script src="./index.js" type="module"></script>
```
htmlのscriptタグ内にtypeとしてmoduleを設定し忘れていました。


# 参考文献

https://www.udemy.com/share/103Fxl3@SoX3dtHjf4bgWIXN6j0bmHneD0BroBhMsMRf5CMAHeIto_fhdLNsUUt4jvJR39veOQ==/
JavaScriptを基礎から学ぼう！おさらいチュートリアル

## はじめに

JavaScriptは、Webフロントエンド開発に欠かせない言語です。フレームワークやライブラリに頼らない「バニラJavaScript」の基本を15のステップで解説します。

## 1. 変数とデータ型

JavaScriptの基本的な変数宣言と主要なデータ型を学びましょう。

```javascript
let name = "田中";
const age = 30;
var isStudent = true;
```

## 2. 条件分岐

if文を使った条件分岐の基本を押さえます。

```javascript
if (age >= 20) {
  console.log("成人です");
} else {
  console.log("未成年です");
}
```

## 3. ループ処理

for文を使った繰り返し処理を学びます。

```javascript
for (let i = 0; i < 5; i++) {
  console.log(`${i + 1}回目のループ`);
}
```

## 4. 関数

関数の定義と呼び出し方を理解しましょう。

```javascript
function greet(name) {
  return `こんにちは、${name}さん！`;
}
console.log(greet("佐藤"));
```

## 5. 配列

配列の基本操作を学びます。

```javascript
let fruits = ["りんご", "バナナ", "オレンジ"];
fruits.push("ぶどう");
console.log(fruits.length);
```

## 6. オブジェクト

オブジェクトの作成と操作方法を理解しましょう。

```javascript
let person = {
  name: "山田",
  age: 25,
  greet: function() {
    console.log(`私は${this.name}です`);
  }
};
person.greet();
```

## 7. DOM操作

HTMLの要素を操作する方法を学びます。

```javascript
let title = document.getElementById("title");
title.innerHTML = "新しいタイトル";
```

## 8. イベント処理

ユーザーの操作に反応する方法を理解しましょう。

```javascript
let button = document.querySelector("button");
button.addEventListener("click", function() {
  alert("クリックされました！");
});
```

## 9. 非同期処理

Promiseを使った非同期処理の基本を学びます。

```javascript
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
delay(2000).then(() => console.log("2秒経過"));
```

## 10. フェッチAPI

外部APIからデータを取得する方法を理解しましょう。

```javascript
fetch("https://api.example.com/data")
  .then(response => response.json())
  .then(data => console.log(data));
```

## 11. ローカルストレージ

ブラウザにデータを保存する方法を学びます。

```javascript
localStorage.setItem("username", "太郎");
let savedName = localStorage.getItem("username");
```

## 12. クラス

オブジェクト指向プログラミングの基本を理解しましょう。

```javascript
class Animal {
  constructor(name) {
    this.name = name;
  }
  speak() {
    console.log(`${this.name}が鳴きました`);
  }
}
let dog = new Animal("ポチ");
dog.speak();
```

## 13. モジュール

コードを分割して管理する方法を学びます。

```javascript
// math.js
export function add(a, b) {
  return a + b;
}

// main.js
import { add } from './math.js';
console.log(add(5, 3));
```

## 14. エラー処理

try-catch文を使ったエラーハンドリングを理解しましょう。

```javascript
try {
  let result = nonExistentFunction();
} catch (error) {
  console.error("エラーが発生しました:", error.message);
}
```

## 15. デバッグ技法

console.logを使ったデバッグ方法を学びます。

```javascript
function debugExample(x, y) {
  console.log("入力値:", x, y);
  let result = x * y;
  console.log("計算結果:", result);
  return result;
}
debugExample(5, 3);
```

以上の15ステップを通じて、バニラJavaScriptの基礎から応用までを学ぶことができます。実際にコードを書いて試してみることで、理解が深まるでしょう。
windows11で再起動が上手くいかない時に試して治った方法

PCのキッティング作業をしている時、ThinkPadでwindows11の再起動をすると、画面が真っ黒だったり、Lenovoのロゴが出てくる画面で止まるということがありました。

電源等の全てのコードを抜いたら、再起動が上手く行きました。
3Dスキャナー市場分析

1. 市場概要
3D スキャナー市場は、技術の進歩と応用分野の拡大の恩恵を受けて急速に成長しています。 3D スキャン技術は、物体の形状や詳細をデジタル化することができ、製造、映画、テレビ、医学、考古学などの分野で広く使用されています。中でも人気の高いRevopoint（https://www.revopoint3d.jp/）
は、コストパフォーマンスと携帯性の高さで中小企業やメーカー、教育分野に適した製品として知られています。その 3D スキャナーは高精度でポータブルなため、予算は限られているが高い精度が必要なユーザーに適しています。
![1b89164c5898fb65e2bbe70258986ea4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/be9c1df7-d5b0-d424-e265-3c74f62e70b4.png)

2. 主な推進要因
技術の進歩: スキャン技術の精度と速度が向上し、コストが低下したため、市場が拡大しました。
多様なアプリケーション: 製品設計やリバース エンジニアリングから医療画像処理や文化遺産保護まで、幅広いアプリケーション シナリオがあります。
デジタル変革: 企業間のデジタル化への需要により市場の成長が促進され、3D スキャナーは品質管理と製品開発において重要な役割を果たしています。
市場の課題
熾烈な競争: 市場には多くのブランドと多様な製品があり、企業は競争力を維持するために革新する必要があります。
技術的な障壁: 技術の進歩にもかかわらず、ユーザーは依然として学習曲線を克服する必要があります。
経済的影響: 経済変動は企業の設備投資に影響を与える可能性があります。
![ecf9d67386e80ca1ab98b99e752c0eed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/9280f170-a5c6-4160-4d77-ef11da2fa135.png)

3. 今後の動向
AI と 3D スキャンの組み合わせ: 人工知能により、スキャン プロセスの効率と精度が向上します。
自動化: 運用プロセスを簡素化するために、より多くの自動化機能が統合されます。
産業用途の拡大: 技術の進歩により、新興産業での 3D スキャンの応用が促進されるでしょう。

3D スキャナー市場には幅広い展望があります。技術の進歩と用途の拡大により、今後も成長が促進されるでしょう。企業は、競争上の優位性を維持するために、市場の動向と技術の進歩に注意を払う必要があります。
Rocky Linux 9 に一般ユーザーとして JIRA::REST モジュールをインストールする方法

この記事では、Rocky Linux 9 に一般ユーザーとして `JIRA::REST` モジュールをインストールする手順を紹介します。CPANまたはCPANM (CPAN Minus) を使ってインストールを進めます。

## 1. 必要なパッケージのインストール

まず、CPANやCPANMを利用するために必要なパッケージをインストールします。これにはPerlやgccなどの開発ツールが含まれます。一般ユーザーとしてパッケージをインストールできない場合は、システム管理者に依頼する必要があります。

```bash
sudo dnf install perl perl-core gcc make
```

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

CPANM（CPAN Minus）を使うと、モジュールのインストールが簡単になります。これを一般ユーザーとしてホームディレクトリにインストールします。

```bash
curl -L https://cpanmin.us | perl - --self-upgrade --local-lib=~/perl5
```

インストールが完了したら、以下のコマンドで環境変数を設定します。

```bash
echo 'export PATH="$HOME/perl5/bin:$PATH"' >> ~/.bashrc
echo 'export PERL5LIB="$HOME/perl5/lib/perl5:$PERL5LIB"' >> ~/.bashrc
echo 'export PERL_LOCAL_LIB_ROOT="$HOME/perl5:$PERL_LOCAL_LIB_ROOT"' >> ~/.bashrc
echo 'export PERL_MB_OPT="--install_base $HOME/perl5"' >> ~/.bashrc
echo 'export PERL_MM_OPT="INSTALL_BASE=$HOME/perl5"' >> ~/.bashrc
source ~/.bashrc
```

## 3. JIRA::REST モジュールのインストール

`cpanm` を使用して `JIRA::REST` モジュールをインストールします。

```bash
cpanm JIRA::REST
```

`JIRA::REST` が依存するモジュールも自動的にインストールされます。

## 4. 動作確認

インストールが正常に完了したか確認するために、以下のようにPerlのワンライナーで確認します。

```bash
perl -MJIRA::REST -e 'print "JIRA::REST is installed\n"'
```

問題なく実行できれば、インストールは成功です。

---

これでRocky Linux 9に一般ユーザーとして`JIRA::REST`をインストールできます。質問があればお気軽にコメントしてください。
Next.js + TypescriptでミニCMSを作る（5. UTCと日本時間の時差調整）

# Prismaのタイムゾーン問題に対応します。

:::note info
[前回](https://qiita.com/AndanteSysDes/items/64857ec76cfc05b528ac)の続きです。
[初回はこちらです。](https://qiita.com/AndanteSysDes/items/85178d222b9c1dfc7105)
:::

PrismaはデフォルトでUTC時間のデータを保存します。それに合わせて、DBを立てているDockerのタイムゾーンもUTCで設定しています。
日本時間は**UTC+9時間**ですので、日本時間でX日0:00になるようにUTCを調整してからDB保存をする方針を取ろうと思います。

例）
日本時間 2024/1/1 のデータを保存したい場合、UTC 2023/12/31 15:00のデータとして保存

※今後、未来日付の記事を投稿することで予約投稿となる機能をつけたいので、日付は数字や文字列ではなくDATE型で持っておきたいという意図があります。


## テストデータの日付設定
具体的にDB保存時にどうやって時間を調節するかは、レビュー投稿機能を作るときに考えるとして、とりあえず今は**投稿されたすべてのレビュー記事は、UTCでは指定日付の前日15:00として登録される**という前提で進めます。
なので、テストデータを調整しましょう。

![レビュー一覧_テストデータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547786/9b2e8c98-c6e0-c95b-1c33-5e38e5cba94a.png)

フロントで表示されてほしい日付は、以下のとおりです。
1. 2024/1/1
1. 2024/7/1
1. 2024/10/31

## フロントエンドでの日付の表示問題
しかし、この状態でNext.jsのフロント画面を見てみると、私のいる環境（中央ヨーロッパ）ではこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547786/753b1c55-a42a-047f-aafe-be21c1c0e024.png)

日付が一日遡っています。どういうことかといいますと・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547786/7abc900d-65b7-bf91-c522-7b699a358ca0.png)
`console.log()`で表示している日付（`review.articleDate`）を確認してみました。
日付がすべて、中央ヨーロッパとなっており、日本との時差は7～8時間になってしまいました。日付が変わるにはUTCとの時差が足りない。
これ、サーバーが日本でブラウザも日本だったら多分気付けないんですけど、**Next.jsのクライアントコンポーネントはブラウザでレンダリングされるので、時間もブラウザに準拠して表示されてしまうわけです。**
（そもそも私のローカル環境ではサーバも中央ヨーロッパロケールになっちゃうんですけど・・・）

そうすると、例えばクライアントが海外出張中にこの管理画面を見ると、日付が全部狂っていて大問題・・・となってしまう可能性があります。

## 表示時間を日本時間に合わせる

UTCで登録した日時はそのままに、どの地域で管理画面を見ても日本時間に合わせて日付が表示されるよう、日付表示を調整します。

```diff_typescript:ReviewCard.tsx
//中略

    {/* DATE */}
    <div>
        {review.articleDate
            ? (
+                <p className="memo">
+                    {review.articleDate.toLocaleDateString(
+                        'ja-JP', {
+                            timeZone: 'Asia/Tokyo',
+                            year: 'numeric',
+                            month: 'long',
+                            day: 'numeric',
+                        }
+                    )}
+                </p>

                        
-                <p className="memo">{review.articleDate
-                    ?.getFullYear()}年 {review.articleDate
-                    ? review.articleDate
-                        ?.getMonth() + 1
-                        : ""}月 {review.articleDate
-                    ?.getDate()}日</p>
            )
            : ""}

    </div>

//中略
```

`Date.toLocaleDateString()`を使うことで、日付の表示形式とタイムゾーンを日本に設定します。
これで複雑な時差計算をしなくとも、日本に合わせて表示されます。年月日の表記もあわせてstring型で返してくれます。便利！

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547786/23afbc42-75f0-53bd-33ed-e0060d12f235.png)

# 次回

レビュー一覧画面の、削除ボタン（ゴミ箱マーク）の機能を実装していきます。
paiza問題ランクA「山折り谷折り」を解いてみた & 解説

paiza×Qiitaコラボキャンペーンから、今回はランクA問題「山折り谷折り」に挑戦してみました。

https://paiza.jp/works/mondai/real_event/origami

## 問題概要
どんなブームなんですかね。
> ひたすら紙を折り続けるということがマイブームとなっているあなたは、今日もひたすら紙を折り続けています。それも、折り紙のような凝った折り方ではなく、紙の右辺が上から左辺に重なるような二つ折りを、ただひたすら繰り返すだけです。

> 折る回数 N が与えられるので、紙を折って広げたあとの山折り谷折りの折り目を計算するプログラムを作成してください。

期待する出力は以下の通りです。
> 山折りの折り目を "1"、谷折りの折り目を "0" として、答えとなる折り目を左から順に "0" と "1" からなる文字列として一行に出力してください。

## 問題を解くポイント
この問題にはきっと規則性があるはずで、それがわかれば簡単に解けそうな気がしますね。
その通りで、規則性があります。

### 規則性を見つける
まずいくらか折ってみましょう。4回折った時の文字列を作ります。
| N回 | 文字列 |
|:-----------|------------:|
| 1 | 0 |
| 2 | 001 |
| 3 | 0010011 |
| 4 | 001001100011011 |

この結果から以下のことがわかります。
```bash
前の文字列結果に対し、逆の文字列かつ反転させた文字列が末尾にくっついていること ex)001->011
前文字列と末尾文字列の間は必ず0がくっついていること
```

例として、3回折った場合をみてみましょう。
1. 前文字列結果は**001**
2. 逆の文字列は**110**
3. 反転させた文字列は**011**
4. 前文字列と連結させると**001011**
5. それぞれの文字列の間には0がくっつくので**0010011**

## 私の解
先ほどの規則性にのっとり、コードを書きました。

```javascript
// 紙を折る回数
const foldPaperCount = lines[0];
// 1回目は必ず0
let foldResultStr = '0';
// 2回目からN回分繰り返す
for (let i = 2; i <= foldPaperCount; i++) {
    // 逆文字列にして反転し連結させる
    const suffixStr = [...foldResultStr]
        .map(str => str === '0' ? '1' : '0')
        .reverse()
        .join('');
    // 0を連結させて結果を格納する
    foldResultStr = `${foldResultStr}0${suffixStr}`;
}
console.log(foldResultStr);
```

## さいごに
いかがでしたか？
規則性がわかれば簡単な問題でしたね。
CordovaのWebページをブラウザからの開けるようにする

Cordovaの開発をする際に、Webページをサーバ上に配備して、アプリの再インストールすることなく、すぐにリロードすることができます。

【参考】
[Cordovaアプリ開発の備忘録](https://qiita.com/poruruba/items/f03b1691fd0f113735b3)
[Cordovaアプリ開発の備忘録(プラグイン編)](https://qiita.com/poruruba/items/a454f1b90c5d8b0cb2f8)

今回はさらに、通常のPCのブラウザからもWebページを開けるようにします。
そうすることで、ネイティブの機能を使わないロジックはPCのブラウザで開発し、ネイティブの機能を使うときだけCordovaのネイティブアプリから開発することができます。

ちなみに、この投稿は、以下の投稿の補足です。
　[散歩ルート計画アプリを作った](https://qiita.com/poruruba/items/90d25395670f1bf5a5fe)

# index.html

通常は、こんな感じでcordova.jsをロードしていたかと思います。

```html:index.html
  <script src="js/index.js"></script>
  <script src="cordova.js"></script>
```

この状態で、PCのブラウザから開くと、ダイアログがたくさん表示されて、まともに動作しないかと思います。
これを以下のようにいったんindex.htmlからcordova.jsを読むのをやめます。

```html:index.html
  <script src="js/index.js"></script>
  <!-- <script src="cordova.js"></script> -->
```

# 動的にcordova.jsをロード

cordova.jsのロードをユーザエージェントの内容を見て判断します。
まずは、UserAgentを解析するためのライブラリを使いました（自身で判断してもよいです）

```html:index.html
  <script src="https://cdn.jsdelivr.net/npm/ua-parser-js@1.0.35/src/ua-parser.min.js"></script>
```

Content Security Policyの設定もご注意を。

そして、index.jsか他のjavascriptで以下を実行します。
'Chrome WebView'か'WebKit'だったら、Cordovaのネイティブアプリからの起動だと判断するようにしました。厳密ではないので、適宜カスタマイズが必要かもしれません。

```js
        const ua = new UAParser();
        console.log(ua.getBrowser(), ua.getDevice(), ua.getEngine(), ua.getOS());
        const browser = ua.getBrowser();
        if (browser && (browser.name == 'Chrome WebView' || browser.name == 'WebKit')) {
            const script = document.createElement("script");
            script.src = "cordova.js";
            document.head.appendChild(script);
        } else {
            this.onDeviceReady(true);
        }
```

Cordovaネイティブアプリからの起動とわかれば、cordova.jsのHTMLエレメントを追加しています。
これで、Cordovaが起動すれば、index.js内のonDeviceReadyが呼び出されるはずです。
逆に、Cordovaネイティブアプリでなければ、onDeviceReadyに引数true付きで呼び出していますので、その中で分岐処理ができるようにしました。

以上
[VSCode] Terminalの表示・非表示・追加

# 一覧表
|コマンド|機能|
|:--|:--|
|command + j|Terminalの表示・非表示の切り替え|
|control + shift + @|Terminalの表示・非表示の切り替え|
|control + shift + 5|Terminalの新しい画面の追加|
スマホの気圧センサーと台風

# はじめに
以前スマホのセンサーをPythonで操作するアプリをPlyerで作ってみたが、気圧センサーが本当に動作しているのか？がわからなかったが、ちょうど、今日台風7号がきていたので試してみた。

# 気圧センサーのデータ取得
[PythonでAndroidスマホの各種センサー情報を取得する。](https://qiita.com/tapitapi/items/51ddefc1dd8e810430c8)

barometer.pressureで取得。
```python:Barometer
from plyer import barometer
#有効
barometer.enable()
#取得
output+=f'Barometer\n{barometer.pressure:0.2f} hPa\n\n'
```

# 結果
台風が近づくとどんどん気圧が下がっていく事がわかる。あらためて数値で見てみると面白い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/221e6237-a824-f980-0fca-d0e257d5068e.png)

以上
シャドウセッション

　RDPで、接続する場合は、後勝ちで同時に1台のパソコンにログインする事しか出ませんが、Windowsには、シャドウセッションの機能があり、2端末が同時に1台のパソコンにログインして、同一画面を操作する事が可能です。
 デフォルトでは、接続毎に許可を毎回取る必要がありますが、設定で無効化する事が出来ます。

■構成
RDP Server
Client1・・・RDP ServerにRDP接続する端末
Client2・・・RDP Serverにシャドウセッションで接続する端末

## 1.ユーザーの許可なしでフル コントロール
■RDP Serverで実施。
gpeedit.mscを起動して、以下の設定を変更します。
管理用テンプレート
-Windowsコンポーネント
-リモートデスクトップサービス
-接続
リモートディスクトップサービスセッションのリモート制御のルール設定する。
⇒ユーザーの許可なしでフル コントロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/b39d7864-4a1a-7c07-5b44-deb69e9c93b1.png)

## 2.firewall設定
■RDP Serverで実施。
ファイルのプリンターの共有(smb受信)⇒有効
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/e4dba4bf-eea9-f067-e56c-cfed24da3815.png)

## 3.接続番号を取得
■Client1が、RDP接続後に、RDP Serverで実施。
RDP Serverで接続番号を確認
C:\Windows\System32\query.exe session | find "Active" 
>rdp-tcp#79        ???                       1  Active

## 4.シャドウセッションで接続
■Client2で実施。

xx.xx.xx.xxは、接続先のIP Address
yyは、query.exeで取得した番号

>mstsc /v:xx.xx.xx.xx /control /shadow:yy /noConsentPrompt
PythonでOpenAI APIを実行する際の備忘録

PythonでOpenAI APIを実行する際の備忘録です
基本的には、[PythonでOpenAI APIを実行する方法](https://qiita.com/yamii/items/914fcae6599a4ac9f9fd)を参照させて頂き実行すればOK
..と思ったが、`openai>=1.0.0`ではパッケージの利用方法に差分があるらしく以下の`warning`メッセージが出力されてしまった。これに伴い、以下のようにプログラムを更新しました。

### `warning`メッセージ

> You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0

```python:
You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.

You can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. 

Alternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`

A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742
```

### プログラムを更新

`openai migrate`を実行したら自動でマージしてくれました

```python:chatgpt-api.py
from openai import OpenAI

client = OpenAI(api_key='xxx')

response = client.chat.completions.create(model="gpt-3.5-turbo",
    messages=[
    {'role': 'user', 'content': 'ハローワールド！！'}],
    temperature=0.0)

print(response.choices[0].message.content)
```

### お試し実行その1

```
$ python chatgpt-api.py
こんにちは！ どのようにお手伝いしましょうか？
```

## モデルの指定

プログラムの以下に該当する部分については、

> model="gpt-3.5-turbo"

以下を参考に変更可能だと思われる

https://platform.openai.com/docs/models/gpt-4o

> gpt-4o, gpt-4o-mini, gpt-4-turbo, gpt-4, and gpt-3.5-turbo

料金は以下

https://openai.com/api/pricing/

おそらく実験をする限りではそこまで高額にはならない。はず。。

## parameterの指定

以下を参照すればOK
https://platform.openai.com/docs/api-reference/audio/createTranscription
例えば、`temperature`は以下の通り

```
temperature

number

Optional
Defaults to 0
The sampling temperature, between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit.
```

> 0.8のような高い値に設定すると出力がよりランダムになり、0.2のような低い値に設定すると出力がより焦点を絞り、決定的になります。0に設定すると、モデルはログ確率を使用して、特定のしきい値に達するまで自動的に温度を上げます。

## お試し実行その2

`ハローワールド`だけでは味気がないので、試しに以下のようなマークダウンにチェックを促すようなリクエストをしてみました

```python
response = client.chat.completions.create(model="gpt-4o",
    messages=[
    {
        'role': 'user', 
        'content': 'こんにちは、あなたはとある地域の住人です。 \
        あなたの住んでいるエリアでは回覧板を通じて情報共有しています。\
        回覧板が渡された際、次の人に渡すまでに該当欄にチェックが必要です。\
        以下のマークダウンで記述される表のうち、住人１の欄にチェックを意味する印をつけて回答して下さい。\
        | 確認者 | チェック | \
        | ---- | ---- | \
        | 住人１ |  | \
        | 住人２ |  | \
        | 住人３ |  | '
     }],
    temperature=0.0)
```

回答
ちゃんと住人１の欄にチェックをつけてくれました

```
こんにちは、以下の表に住人１の欄にチェックをつけました。

markdown
| 確認者 | チェック |
| ---- | ---- |
| 住人１ | ✔️ |
| 住人２ |  |
| 住人３ |  |
```

# 参考

https://qiita.com/yamii/items/914fcae6599a4ac9f9fd

https://prog-8.com/docs/python-env
【Git】任意のコミットID まで reset する

メモとして残します。


# ■やり方
--hardで 指定したコミットIDまで削除します（＝コミットIDがHEADになる）

```zsh
git reset --hard コミットID
```

`git push -f` まですれば、リモートに反映することができます。

注意）--hardでresetしているので指定コミットの次のコミットからHEADまで削除されます。
ブランチ切って、デモをしてみるのもありです👀

以上
【UiPath】アイディアの評価情報を Insights のダッシュボードでみる

# はじめに

- 本記事では、Automation Hub のアイディアの評価データを Insights で見る方法を紹介します。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 2024年7月31日時点のもので構成しています。

# 見込み削減時間とかってどのフィールドでみれるんだ？

↑↑こんなお悩みをお持ちの方向けに簡単ですが、Insights の設定方法を紹介します。

## そもそもアイディアの評価情報とは？

Automation Hub に登録したアイディアの詳細評価セクションの情報です。

（例）
![insightsで評価データをみる8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3f153534-af9a-76a5-4250-0c27a8907ad7.jpeg)
![insightsで評価データをみる9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e0ac026d-06c3-22a9-bb10-498ae72655ca.jpeg)

ここの各質問項目は、導入時にオリジナルのものに設計できるため、後から一覧で表示・出力したいケースがままあるかなと思います。

## 設定方法

1. 任意のダッシュボードを開き、三点リーダー＞ダッシュボードを編集をクリック
1. 「追加」ボタン押下＞ビジュアライゼーションを選択
1. Explorer から Automation Ideas を選択

![insightsで評価データをみる3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/4911b7c8-37ec-4ffe-dbaa-9dd9119ac554.jpeg)

編集画面が起動したら次のフィールドを追加しましょう

![insightsで評価データをみる4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/2c0e07e6-d13d-57da-83a4-a6ec18985cc2.jpeg)

***IDEA Q&As - Numerical Types の Question の Title***

![insightsで評価データをみる5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/eb10d0d1-0029-8587-86a3-67c4a93f892f.jpeg)

***IDEA の Idea Name***

![insightsで評価データをみる6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e3eba1a2-c3ce-1b76-475b-3e30fd12e8cf.jpeg)

***IDEA Q&As - Numerical Types の Sum***

![insightsで評価データをみる7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/40d8f0f7-010c-294e-a23c-5b03725c7256.jpeg)

データセクションに必要なフィールドを追加したら一度「実行」ボタンを押下します。
次に Title 列の右上の歯車ボタンからフィルタを追加します。

![insightsで評価データをみる10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/60107367-4816-1f98-1936-56224f0ffc02.jpeg)
![insightsで評価データをみる11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/f6a9bf97-efb9-33d8-478e-160eb07efe84.jpeg)

フィルタセクションに移動し、任意のキーワードでフィルタ式を組んだら***ほぼ***完了です！

![insightsで評価データをみる12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e2f5e918-bc1a-900f-15a5-c846011121f8.jpeg)
![insightsで評価データをみる13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/5271647f-05d2-c0f7-4321-1c899ef6439a.jpeg)

編集内容を反映させるには、編集画面の「保存」ボタンとダッシュボード自体の「保存」ボタンを2回クリックする必要があるので忘れずに！
あと、編集画面で名前も変えておかないと無題くんになっちゃうのでそちらも忘れずに。

![insightsで評価データをみる14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d8bb0c83-6216-409d-d547-da5a6f055c87.jpeg)
![insightsで評価データをみる15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/62b6468d-b2e1-0405-6f63-aa3416a5aa2a.jpeg)

# さいごに

いかがでしたでしょうか。
簡単そうでちょっとわかりづらい操作なので備忘までに記事にしました。
一度覚えてしまったら楽勝ですので、便利な自動化状況の可視化ツール是非是非触ってみてください。
最後までお読みいただきありがとうございます(・ω・)ノ
D3.isを始めたい人むけチュートリアル

## はじめに

D3.jsに関する12章以上のチャプターとコード例を含む形で構成します。

## D3.jsの基礎と活用ガイド

D3.jsは強力なJavaScriptライブラリで、データを視覚化するための豊富な機能を提供します。この記事では、D3.jsの基本から応用まで、段階的に解説していきます。

## 第1章: D3.jsの概要

D3.jsはData-Driven Documentsの略で、データに基づいてDOMを操作するためのライブラリです。SVGを使用して、インタラクティブなグラフや図を作成できます。

## 第2章: D3.jsのセットアップ

D3.jsを使用するには、以下のようにHTMLファイルにスクリプトを追加します。

```html
<script src="https://d3js.org/d3.v7.min.js"></script>
```

## 第3章: 基本的な選択と操作

D3.jsの基本は要素の選択と操作です。

```javascript
d3.select("body")
  .append("p")
  .text("Hello, D3!");
```

## 第4章: データバインディング

D3.jsの強みはデータバインディングです。

```javascript
const data = [4, 8, 15, 16, 23, 42];
d3.select("body")
  .selectAll("p")
  .data(data)
  .enter()
  .append("p")
  .text(d => d);
```

## 第5章: SVGの基本

D3.jsはSVGを使用して図形を描画します。

```javascript
const svg = d3.select("body")
  .append("svg")
  .attr("width", 200)
  .attr("height", 200);

svg.append("circle")
  .attr("cx", 100)
  .attr("cy", 100)
  .attr("r", 50)
  .attr("fill", "blue");
```

## 第6章: スケールの使用

データを適切に表示するためにスケールを使用します。

```javascript
const scale = d3.scaleLinear()
  .domain([0, 100])
  .range([0, 400]);

console.log(scale(50)); // 200
```

## 第7章: 軸の追加

グラフに軸を追加するには以下のようにします。

```javascript
const xAxis = d3.axisBottom(scale);
svg.append("g")
  .attr("transform", "translate(0, 150)")
  .call(xAxis);
```

## 第8章: トランジションとアニメーション

D3.jsを使用してアニメーションを作成できます。

```javascript
circle.transition()
  .duration(1000)
  .attr("r", 75);
```

## 第9章: イベントハンドリング

インタラクティブな要素を追加します。

```javascript
circle.on("click", function() {
  d3.select(this).attr("fill", "red");
});
```

## 第10章: レイアウト

D3.jsには様々なレイアウトが用意されています。

```javascript
const treeLayout = d3.tree().size([400, 200]);
```

## 第11章: ジオグラフィカルデータの扱い

地図データを扱うための機能もあります。

```javascript
const projection = d3.geoMercator();
const path = d3.geoPath().projection(projection);
```

## 第12章: パフォーマンス最適化

大量のデータを扱う際は、パフォーマンスに注意が必要です。

```javascript
const canvas = d3.select("body")
  .append("canvas")
  .attr("width", 1000)
  .attr("height", 1000);

const context = canvas.node().getContext("2d");
```

D3.jsは非常に強力なライブラリですが、使いこなすには練習が必要です。この記事を参考に、素晴らしいデータビジュアライゼーションを作成してください。
pythonでopenai APIを実行したときに`Incorrect API key provided: sk-proj-`と表示されてしまう際の対策備忘録

pythonでopenai APIを実行したときに`Incorrect API key provided: sk-proj-`と表示されてしまう。
→ API Keyを再発行して利用すればOKである事が多い。
→ API keyが無効になっているか、間違っているか、利用不可になっている（例えばAPI KEYをうっかり公開してしまい自動的に利用不可になったなど）

```
raise self._make_status_error_from_response(err.response) from None
openai.AuthenticationError: Error code: 401 - {'error': {'message': 'Incorrect API key provided: sk-proj-************************************************************************************************************************GDYA. You can find your API key at https://platform.openai.com/account/api-keys.', 'type': 'invalid_request_error', 'param': None, 'code': 'invalid_api_key'}}
```
【2024年08月版】Ubuntu でウイルス対策【clamav】

# はじめに

ノーガードのubuntu卒業したい。。。

cronで定期実行したい。。。

そうだ、`clamav` しよう

# 設定

## インストール

```
sudo apt install clamav clamav-daemon
```

## サービス設定

すでに自動アップデートのサービスはインストールされている（`clamav-freshclam.service`）

スキャンにはスタンドアロンスキャナーを使用する方法と、デーモンを使用する方法がある。

デーモンを使用する場合は、clamavデーモンを登録しておく。

```
sudo systemctl enable --now clamav-daemon.service 
```

## 動作確認

### スタンドアロンスキャナーによるスキャン

```
clamscan
/home/tarou/test.txt: OK

----------- SCAN SUMMARY -----------
Known viruses: 8697172
Engine version: 0.103.11
Scanned directories: 1
Scanned files: 1
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 14.108 sec (0 m 14 s)
Start Date: 2024:08:16 16:08:55
End Date:   2024:08:16 16:09:09
```

### テストのウイルスファイルをスキャン

```
~$ echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > clamav-testfile 
~$ clamscan
/home/tarou/clamav-testfile: Eicar-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 8697172
Engine version: 0.103.11
Scanned directories: 1
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 14.289 sec (0 m 14 s)
Start Date: 2024:08:16 16:06:48
End Date:   2024:08:16 16:07:02
```

## cron 設定

### シェルの作成

スキャン用のスクリプト(`~/.clamav/scan.sh`)、ログディレクトリ(`~/.clamav/log`)を作成しておく。

| オプション |  |
|:-:|:-:|
| -i | Only print infected files |
| -r | Scan subdirectories recursively |
| -l | Save scan report to FILE |
| --exclude=REGEX | Don't scan file names matching REGEX |
| --exclude-dir=REGEX | Don't scan directories matching REGEX |

ホームディレクトリは以下をスキャンする例。ログディレクトリに結果は保存される。

```/home/.clamav/scan.sh
#!/bin/bash
/usr/bin/clamscan -i -r $HOME -l "$HOME/.clamav/log/$(date +%Y%m%d%H%M%S).log" 2>/dev/null
```

### cron 登録

`tarou` ユーザでスクリプトを作っている場合

```
crontab -e
```

```
crontab -l
0 4 * * * bash /home/tarou/scan.sh
```

# さいごに

かんたんでしたね

# 関連リンク

[ClamAV Documentation | 2.3. Unix from source (v0.104+) | Ubuntu / Debian](https://docs.clamav.net/manual/Installing/Installing-from-source-Unix.html#ubuntu--debian)
「MENTOR」の原則でインデックス管理

# 「MENTOR」の原則でインデックス管理

# Measure（測定）

SQLのクエリ実行時間を記録する。→最大のコストがかかっている操作を識別。

スロークエリログ→指定された値より実行時間が長くかかったクエリを記録

PostgreSQL→設定変数「log_min_duration_statement」

# Explain（解析）

最もコストがかかるクエリを特定した後は、クエリの処理が遅くなっている原因を解析する。

クエリ実行計画→QEP

QEPレポート例→key列はどのインデックスを適用しているか。Extra列はクエリが一時テーブルで結果をソートしているか、indexを使用しているか確認可能。

解析後、新しいインデックスを作成するかLIKE述語の代わりに全文検索機能を導入する。

# Nominate（指名）

クエリのQEPを読んで、クエリがインデックスを使わないでテーブルにアクセスしている箇所を探す。

# Test（テスト）

インデックス作成後、再びクエリのプロファイリングを行う。

変更が効果をもたらしたことを確認してから作業を終了する。

「使用頻度の高いテーブルに新たなインデックスを1つ作成すべきだと判断し、重要なクエリ複数でパフォーマンスを38パーセント改善しました」

# Optimize（最適化）

キャッシュメモリの検討。

インデックスをあらかじめキャッシュメモリにロードしておく。

例：LOAD INDEX INTO CACHEステートメント

# Rebuild（再構築）

長期にわたって行の更新や削除を行うことで、インデックスは次第に断片化していく。

定期的にメンテナンス。

例：VACUUMまたはANALYZE（インデックスのメンテナンスコマンド）
lamda関数を新規作成した メモ

lamda関数を新規作成した

前提 : vpc、elastic ipの設定は終わっている
lamda作成ユーザにIAM権限が必要(ロール割当で必要になる)

1. サービスからlamdaを選択
2. 関数の作成
・ 一から作成 (あくまで自分の場合)
を選択
・ 関数名
任意でつける
・ ランタイム
nodejs20を選択
・ アーキテクチャ
x86_64 （特に何も考えず）

・ デフォルトの実行ロールの変更
→ 基本的な Lambda アクセス権限で新しいロールを作成
を選択した。(使いまわしのロールなければこれで良さそう)
→ この時はS3の権限が必要だったので以下を追加

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::{本番用S3名}/*",
                "arn:aws:s3:::{ステージング用S3名}/*"
            ]
        }
    ]
}   
```

(参考) 基本的な Lambda アクセス権限で新しいロールを作成でつくると以下権限が付与された
AWSLambdaBasicExecutionRole-・・・・
AWSLambdaVPCAccessExecutionRole-・・・・

・ VPCを有効化(このときは既存があったので使いまわし)
VPCを有効化
→ VPC,サブネット ,セキュリティグループの割当が必要

自分のIP確認のAPIサービスを使用して固定化されているのを確認した。
https://ipinfo.io/ip

固定IP,S3配置確認用js
```
// ESM構文を使用したモジュールのインポート
import https from 'https';
import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3';

export const handler = async (event, context) => {
  try {
    
    // HTTPSでデータを取得
    const data = await httpRequest('https://ipinfo.io/ip');
    console.log(data);
    
    const client = new S3Client({});
    const command = new PutObjectCommand({
      Bucket: "ftp-server-stg",
      Key: "mng-evl.txt",
      Body: data,
    });
  
    
    const response = await client.send(command);
    console.log(response);
    // // S3にアップロード
    // const s3 = new S3();
    // const params = {
    //   Bucket: 'バケット名',
    //   Key: 'ファイル名',
    //   Body: data
    // };

    // const uploadStatus = await s3.putObject(params).promise();
//    console.log('Upload successful:', uploadStatus);
  } catch (error) {
    console.error('Error:', error);
  }
};
```
フロント初心者がNext.jsの勉強がてらにCSSの手法をまとめてみた

# Global CSS

グローバルCSSは、アプリケーション全体に適用されるスタイルです。

例（globals.css）:
```css
cssCopybody {
  font-family: Arial, sans-serif;
}

.button {
  background-color: blue;
  color: white;
}
```

使用例：
```tsx
tsxCopyimport '../styles/globals.css';

const Button = () => <button className="button">Click me</button>;
```

特徴：
- 簡単に使用できる
- クラス名の衝突リスクがある

# CSS Modules

CSSモジュールは、スコープされたローカルなCSSクラスを提供します。

例（Button.module.css）:
```css
cssCopy.button {
  background-color: blue;
  color: white;
}
```

使用例：
```tsx
tsxCopyimport styles from './Button.module.css';

const Button = () => <button className={styles.button}>Click me</button>;
```

特徴：
- クラス名の衝突を防ぐ
- コンポーネントごとにスタイルを分離できる

# Tailwind CSS

Tailwindは、ユーティリティファーストのCSSフレームワークです。

例：
```tsx
tsxCopyconst Button = () => (
  <button className="bg-blue-500 text-white font-bold py-2 px-4 rounded">
    Click me
  </button>
);
```

特徴：
- 素早くスタイリングができる
- カスタマイズが容易
- クラス名が長くなる可能性がある


# Sass

Sassは、CSSの拡張言語です。

例（Button.scss）:
```scss
scssCopy$primary-color: blue;

.button {
  background-color: $primary-color;
  color: white;
  &:hover {
    background-color: darken($primary-color, 10%);
  }
}
```

使用例：
```tsx
tsxCopyimport './Button.scss';

const Button = () => <button className="button">Click me</button>;
```

特徴：
- 変数、ネスト、ミックスインなどの高度な機能がある
- コードの再利用性が高い

# CSS-in-JS

CSS-in-JSは、JavaScriptでスタイルを定義する方法です。

例（styled-componentsを使用）:

```tsx
tsxCopyimport styled from 'styled-components';

const StyledButton = styled.button`
  background-color: blue;
  color: white;
  padding: 10px 20px;
  border-radius: 5px;
`;

const Button = () => <StyledButton>Click me</StyledButton>;
```

特徴：
- JavaScriptの全機能を使ってスタイルを定義できる
- 動的なスタイリングが容易
- コンポーネントとスタイルを一緒に管理できる
EVE-NG on VMware Workstation Pro 17

VMware Workstation Pro 17上にEVE-NGを導入した時の備忘録となります。

 2023年Broadcom社によってVMware社が買収されました。2024年5月からBroadcom社による VMware Workstation Pro や VMware Fusion Proが個人利用において無料で利用できるようになっています。VMware Workstation Pro 17は、Broadcom Support Portalのアカウントを取得してから、ダウンロードする必要があります。

EVE-NGには、有料版のProfessionalと無料版のCommunity Editionがあります。2024年8月16日時点の最新版Version 6.2.0-4となります。
https://www.eve-ng.net/index.php/download/

念の為、ダウンロードしたファイルに破損が無い事を確認します。
> certutil -hashfile eve-ce-prod-6.2.0-4-full.iso
SHA1 ハッシュ (対象 eve-ce-prod-6.2.0-4-full.iso):
32b189ab6570aed6fa61f202e090c3a4cf962077

## 1.EVE-NGの導入
VMware Workstation Pro 17を起動して、「ファイル」⇒「新しい仮想マシーン」⇒「標準」を選択。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/05511c94-279d-7174-a4a1-b3954897cee8.png)

インストーラディスクイメージとして、ダウンロードしたEVE-NG communtyを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/906e4617-27ff-8cf3-3dbe-32d346e8af25.png)

仮想マシーン名として、EVE-NGを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/91df2650-1bb1-74ea-403a-343fe3590923.png)

ディスクの最大サイズ　32GB
仮想ディスクを単一ファイルとして格納を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/b4e6e3ae-ccb2-0a40-3c95-093cdfb212f9.png)

ハードウェアをカスタマイズを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/8108ed65-3d32-f04f-7fd4-a2a752b5c6a8.png)

メモリ：12GB
プロセッサ：4
Intel VT-X/EPTまたは、AMD-V/RVIを仮想化をチェック
ネットワークアダプター：ブリッジ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/318e33dd-3c86-2cd3-bc9d-df3b00adf8bb.png)

## 2.EVE-NGを起動します。
VMware Workstation Pro17からEVE-NGを起動させます。数分すると、プロンプトが
表示されるので、ログインします。
login:root　passwd:eve
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/352b43d7-0d6a-7ceb-2264-571be55f82f6.png)

ウィザードに従って、パラメータを入力します。
　rootのパスワード:eve
　ホスト名：eve-ng
　dns domain name:sample.com
　IP Address:dhcp
　NTP Address:空
　Proxy Server:Direct connect

　設定が完了すると、自動的に再起動します。IPアドレスが設定されて立ち上がってきます。
 なお、再度ウィザードを起動させたい場合は/opt/ovf/.configuredファイルを削除後に、再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/d864ab70-69a9-d1f4-fdcd-014f62b4e9a4.png)

最新状態にアップグレードします。
```
#apt update
#apt upgrade
#reboot
```

ブラウザを起動して、EVE-NGにログインします。http://192.168.1.56/　
人：admin
鍵：eve
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849360/0be22638-f014-a965-6188-b51d1aed1f4e.png)

## 3.イメージファイルの導入
必要なイメージファイルを/opt/unetlab/addons/の以下の所定のフォルダーに配置します。
ファイル転送後に、EVE-NGに認識させます。
#/opt/unetlab/wrappers/unl_wrapper -a fixpermissions

■IOL
ホスト名に対してのライセンスキーが必要となるので、iourcを生成して導入する。
```
#cat /opt/unetlab/addons/iol/bin/iourc
[license]
eve-ng = 972f30267ef51616;
```

■dynamips
IDLE PC 使用状況を確認して、適切な IDLE PC 値する。

■qemu
Linuxの修正後に、wipeすると修正内容は消えてしまうので、差分合成したイメージを保存
```
#qemu-img commit -f qcow2 diff-filename
```
## 4.Windows Client Side導入
■ターミナルソフト
　ターミナルソフトは、puttyになってしまう為、Teratermを使用する場合は、win10_32bit_teraterm.regを導入します。

■キャプチャー
そのままでは、Wireshake起動時にエラーとなるので、以下のコマンドを一度だけ実施します。
```
C:\Program Files\EVE-NG\plink.exe root@192.168.xx.xx
root
eve
```
ライブラリ管理とは何をするのか

### <u>まえがき</u>
私は現在、ライブラリ管理の担当として業務しています。
ライブラリ管理の業務は存在自体知りませんでした。
そんな私が数か月経過し、理解してきたので整理含めここに書き残していきたいと思います。
ここでのお話は私の現場での内容になります。

**「ライブラリ管理ってこんなことしてるんだ。」**　と少しでも思っていただけますと幸いです。
<br>

## ■ライブラリ管理とは
モジュール管理やIT資産などの管理を行う。
環境整備、環境提供も担う。

:::note info
「モジュール」とは、ソフトウェア開発やシステム設計において、特定の機能や役割を持つ独立した部品のようなもの。
:::
<br>

### ■使用ツール(一例）
<dl>
  <dt>TortoiseSVN,SVN(Subversion)</dt>
  <dd>・バージョン管理システムと呼ばれるもの。<br>
・ファイルの変更履歴を管理できる。<br>
・TortoiseSVNはクライアント側からGUIで操作ができる。<br>
・TortoiseSVNで操作し<font color="Orange">SVNサーバー</font>へ接続し、管理する。<br>
私の業務ではこちらを主に使用してファイル管理、モジュール管理をしています。<br>

:::note info
SVNへ資材を同期(反映)することをコミットと呼んでいます。
:::
</dd>
<br>

  <dt>gitlab</dt>
  <dd>・バージョン管理システムを中心としたアプリケーション開発ツール。<br>
  ・開発側でバージョン管理するために使われる。<br>
  ・納品を行うことができ、納品物の内容確認や変更履歴も確認できる。<br>
  ・マスターとブランチという概念があり、過去に開発していたものに追加・修正ができたり、分岐を作ったりできる。
  </dd>
<br>

  <dt>jenkins</dt>
  <dd>・CI/CD化が可能。<br>
  ・SVNと組み合わせて運用することで業務効率が向上。
  
  :::note info
CI/CDとはテストやリリース、<font color="Blue">デプロイ</font>を自動化することを言います。
デプロイとは実環境へ反映させることです。
:::
  </dd>
</dl>
<br>
他にもVSSやGithubなどバージョン管理システムはございます。
<br>
<br>
<br>
<br>

### ■詳しい業務内容(一例）
現場の環境としては大きく4つの環境に分かれており、
開発環境、開発環境（予備）、検証環境、本番環境（お客様提供）となっています。
そして、基本的には記載の左から順番でそれぞれ進んでいきます。

どのシステムもだと思うのですが、バージョンを上げ開発を進めて提供していくので
当然それぞれのバージョンの資産を管理したり、それぞれの工程に合わせて環境も管理しなければなりません。
それを担当するのがライブラリ管理の主な業務です。
<br>
<br>

### ■苦労すること
私の現場ではまだ管理方法が決まっていないものやCI/CD化されていないものも多く、
それらの管理方法を自ら考え提案し決めていかなければならないことがあります。
そういった事はあまりしてこなかったこともあり苦労しています。しかし、とても成長は感じています。
なので、ライブラリ管理とはいっても資料作成やプレゼンテーションをすることも多々あります。

また最終的にはお客様の環境へデプロイ（提供）することになるので責任もあり、
間違えた管理をすると最悪の場合、お客様へご迷惑をおかけすることになるので正確な管理が必要になります。

<br>
<br>
お読みいただきありがとうございました。
Postman VS Code拡張機能が使えない(真っ白になる)方へ

# はじめに
Windowsでは問題なくPostmanのVS Codeの拡張機能が使用できるのですが、
なぜかMacではサイドバーが真っ白になってしまう現象が発生してしまいましたので、
今後どなたが同じ箇所で躓いてしまわないように記事を記述いたしました。

## [Postman](https://www.postman.com/)とは
- Postman社が提供を行うAPIプラットフォーム
- 実装されているAPIテスト機能を用いてリクエストの内容やトークンを設定し、APIに送信することでレスポンスの確認などが可能

## 環境
- OS: macOS

## 前提条件
- Postman アカウント作成済み(Google アカウント使用)

# 結論
## VS Codeの設定で"Http: Proxy Support"で"override"を選択
[![Image from Gyazo](https://i.gyazo.com/63a11210d147fe16fdb637805453afa4.png)](https://gyazo.com/63a11210d147fe16fdb637805453afa4)
こちらでも直らなければ以下の手順をお試しください。
1. VS Code再起動
2. 拡張機能を無効
3. 拡張機能を再起動
4. 拡張機能を有効

### 他にも同じ現象の方がいらっしゃいましたのでこちらを参考にさせていただきました。
https://github.com/postmanlabs/postman-app-support/issues/12902

### 私はこちらの手順で使用できるようになり一安心です！
[![Image from Gyazo](https://i.gyazo.com/fec7fed1637d7a6017023d50505ff1bb.png)](https://gyazo.com/fec7fed1637d7a6017023d50505ff1bb)

# 余談
- 拡張機能の詳細はこちらの[公式サイト](https://learning.postman.com/docs/getting-started/basics/about-vs-code-extension/)より
- 上記のGitHubのissueを参考にしても解決しませんでしたらDiscordのコミュニティに質問を行うつもりでしたので、ご興味があれば覗いてみてください！
https://discord.com/channels/1227863608063426620/1263367852090589268
Laravel+Breezeの簡易的な管理者機能

Laravelを使ったWebアプリを作成中、管理者機能を作る必要があり、簡易的に機能を作ったので備忘録として残しておきます。筆者は、Laravel初学者なのでかなり強引に作っているかと思います。その点はご了承ください。
（本当は、Laravel Permissionなどを使ったほうがいいと思います）

### 環境
・Laravel 10.48.20
・PHP 8.2.21
・Breeze

### 経緯
特定の機能は管理者のみに表示したいので、管理者機能を作りたい。
初期データで管理者を入れ、ほかの新規登録ユーザーは自動的に一般ユーザーにしたい。

### 具体的なコード
```php:users_table
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            //追加
            $table->boolean('administrator');
            $table->timestamps();
        });
    }
```

```php:User.php
    protected $fillable = [
        'name',
        'email',
        'password',
        //追加
        'administrator',
    ];
```
```php:RegisteredUserController.php

    public function store(Request $request): RedirectResponse
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|lowercase|email|max:255|unique:'.User::class,
            'password' => ['required', 'confirmed', Rules\Password::defaults()],
            //追加
            'administrator' => 'nullable',
        ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            //追加
            'administrator' => 0,
        ]);
```

これで新規登録を行った際にそのユーザーを勝手に一般ユーザー（administrator === 0）として登録してくれます。管理人はシーディングファイルでこの値を1にしています。

Viewで管理人だけに見せたい表示があれば、if文を使えば表示できます。

```blade.php
@if(Auth::check() === true)
    @if(Auth::user()->administrator === 1)
        //この間に処理を記載
    @endif
@endif
```

### その他
管理人だけがアクセスできるページを作るならこちらの記事が参考になるかと思います。
https://qiita.com/3ur0/items/40ba156ae42ceab5a830


### 参考記事
https://kinsta.com/jp/blog/laravel-breeze/
https://tech-tech.blog/php/laravel/laravel-breeze/
Macのセットアップ覚書

参考

https://qiita.com/newt0/items/80164665e7e83ec7a669

ネイティブアプリ

* Google Chrome
* Slack
* VS Code
* iTerm2

環境構築

* homebrew
* fish
* iTerm
    * [Hotkeyの設定](https://qiita.com/okamu_/items/a5086d2d5ba405f35acb)
        * Hotkeyの設定時、[Floating window](https://namileriblog.com/terminal/iterm2_settings/)にチェックを入れる
        * General > Startupタブ内のWindow restoration policy項目にOnly Restore Hotkey Windowを指定する
        * [PCログイン時に起動するように設定しておく](https://support.apple.com/ja-jp/guide/mac-help/mh15189/mac)
* git
    * SSH
    * global設定

https://kaiyou9.com/mac-key-repeat/

```
defaults write -g ApplePressAndHoldEnabled -bool false
```
生成AIプロンプトエンジニア検定に合格しました！：市場価値を飛躍的に向上させるエンジニアの革新

![学科合格証書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/028a7912-960b-33db-3a37-81275bf5f224.png)

## はじめに
2024年に入り、生成AI技術がますます注目を集める中、私は「生成AIプロンプトエンジニア検定」に合格しました。この資格は、生成AIを効果的に活用するためのプロンプト作成能力や、広範なAI知識を評価するものであり、これを取得したことはエンジニアとしての市場価値を飛躍的に向上させる大きな一歩です。

## 生成AIプロンプトエンジニア検定とは
この検定は、生成AIに関する知識を体系的に学び、その理解度を測定するための試験です。試験内容には、基礎的な生成AIの概念、プロンプト設計の方法、モデルの動作と調整、エラー分析、実践的な応用が含まれています。合格ラインは100問中95問正解という高いハードルですが、それだけにこの資格の価値は大きいと感じています。

## 取得までの学習プロセス
検定合格に向けて、公式テキストを中心に学習を進めました。特にプロンプト設計の部分は、実務でもすぐに応用できる内容であり、これまでのAIに対する理解をさらに深めることができました。また、エラー分析やモデルの調整に関する章は、実践的な知識が詰まっており、今後の開発業務でのトラブルシューティングにも役立つと確信しています。

## 市場価値の向上
この資格を取得したことで、生成AIに関するスキルセットが強化されました。生成AIは多くの業界での応用が進んでおり、その中でプロンプト設計のスキルは、AIの活用を効果的に行うために不可欠です。今後、このスキルを活かし、AIプロジェクトの成功に貢献し、市場価値をさらに高めていきたいと思います。

## 最後に
生成AIプロンプトエンジニア検定に合格したことは、私にとって大きな成果です。この資格を活用し、さらに革新的な技術に挑戦していきます。同じ道を目指すエンジニアの皆さんも、ぜひこの資格取得に挑戦してみてください。