OmniAICreator/Qiita-1.07M huggingface dataset:
Android Studioで今開いてるファイルを常に左側のProjectでフォーカスさせる方法

# はじめに
どう言うことかと言うと、ここです。
デフォルトではAndroid Studioの左側にあるこのファイルツリー？たち。
![スクリーンショット 2025-03-06 16.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/5d0daff1-80e7-4bc4-b743-ba2a66aac2d3.png)

デフォルトでは今開いてるファイルにフォーカスしてくれず、今見ているファイルがどこの階層にあるのか視覚的にわかりにくいです。。。

# これで解決！
これにチェックを入れるとOK！
![スクリーンショット 2025-03-06 16.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/a54a3153-b876-4ca4-afb6-c9786f55f9a4.png)
デフォルトでこの設定になっておいてほしいと思うのは私だけ？？！
lm studioでファイルを添付すると「retrieving relevant citations for user query... 指定されたモジュールが見つかりません」となる場合の対処法

# 直しかた
retrieving relevant citations for user query...
指定されたモジュールが見つかりません
はvirtual studio 17 22のランタイム入れたら治ります。

x64用のインストーラーへの直リンクは下記のとおりです。
x64以外は公式ドキュメントからダウンロードしてください。ほかのバリアントは`vc_redist.x86.exe`、`vc_redist.arm64.exe`という名前です。
↓ダウンロード先
https://aka.ms/vs/17/release/vc_redist.x64.exe

↓公式ドキュメント
https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170

↓入れ方
https://www2.mouse-jp.co.jp/ssl/user_support2/sc_faq_documents.asp?FaqID=35886

## 雑談

私はWindows サンドボックスでlmstudioを動かしているのですが、コンテキストウインドウを大きくしすぎると仮想環境が強制終了しました。
実機だとパソコンが壊れる可能性があるので、コンテキストウインドウの増やしすぎには注意しましょう。
警告が出ない程度であれば大丈夫のようです。
AWS Amplifyで生成したLambda関数からDynamoDBを参照する方法

# はじめに
AWS Amplifyで生成したLambda関数からDynamoDBを参照するロジックを実装する際、若干ハマったところがあるので忘れないために記事に残しておきます。

# TL;DR
- `getAmplifyDataClientConfig`メソッドを使おう
- amplify_outoputs.jsonはフロントエンド向けのリソースだ。バックエンドでは使えないぞ。

# 実装
```typescript:handler.ts
import { env } from '$amplify/env/name-of-your-lambda-function';
import { getAmplifyDataClientConfig } from '@aws-amplify/backend/function/runtime';
import { Amplify } from 'aws-amplify';
import { generateClient } from 'aws-amplify/data';
import { Schema } from '../../data/resource';

// clientのセットアップ
const {resourceConfig, libraryOptions} = await getAmplifyDataClientConfig(env);
Amplify.configure(resourceConfig, libraryOptions);
const client = generateClient<Schema>();

// DynamoDBへアクセス
const { errors, data } = await client.models.YourTable.get({ id: "1" });

```

`getAmplifyDataClientConfig`からcofigオブジェクトを取得し、それをベースにDynamoDB用のclientを作成します。clientが生成できれば、あとはclient.models.YourTable.*からテーブルへのQuery,Scan等を実行可能です。
watsonx.aiのマルチモーダルモデルでバナー画像の適合性を判定する

watsonx.aiのマルチモーダルモデルをつかってバナー画像の適合性判定を行ってみます。

* テスト環境
    * watsonx.ai on IBM Cloud


以下の[IBMページ](https://www.ibm.com/jp-ja)の「特別キャンペーン実施中【3月31日までの期間限定】SPSSの月間サブスクリプションが今なら30％OFF」というキャンペーンのバナー画像とキャンペーンの見出しが適合しているかどうかを判定させてみます。あらかじめバナー画像はダウンロードしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/239f0e85-94c7-44c2-82aa-fc379fa516c6.png)

# バナー画像のアップロード
まずPromptLabを起動し、「チャット」モードでファイルのアップロードボタンをおして「イメージの追加」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/14bd5c1a-7cc1-45d1-a57f-e7b0c0cdd114.png)

「参照」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e9f3e665-8b9d-4336-8a97-91bbefa93fb7.png)

バナー画像を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/09e21929-0cfb-4b2e-b352-6550cfdbe74f.png)

アップロードされたら「追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4eae693e-2d3e-4eaf-8183-aeac114897dd.png)

# モデルの選択
ファイルが読み込まれました。マルチモーダルに対応したモデルを選びます。
ここでは`llma-3-2-11b-vision-instruct`を選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/68ac0411-20e1-45c0-9130-7524afed27ba.png)

# 記事との適合性の判定

以下のプロンプトを実行してみます。二つの記事のどちらにあったバナーか？を判定させています。
```
この画像は、以下の記事のうちどちらの記事に適切なバナー画像でしょうか？

記事1：特別キャンペーン実施中
【3月31日までの期間限定】SPSSの月間サブスクリプションが今なら30％OFF

記事2：どうなる国産自動車？2035年自動車業界の将来展望
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c8c7f4c8-6ac5-4dad-93ae-d826a61bdb1b.png)

「この画像は、記事1に適切なバナー画像です。」だという回答が戻りました。正しく判定できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b6ef5e34-6e95-4ac0-b5fc-1da4769289a9.png)

さらに以下のプロンプトで点数も聞いてみます。
`この画像を「特別キャンペーン実施中【3月31日までの期間限定】SPSSの月間サブスクリプションが今なら30％OFF」というタイトルの記事のバナー画像として使う場合の適合度を100点満点で表すと何点でしょうか？`

80点と判定されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/761106cd-206f-4777-965e-a0611e62afa6.png)

次に以下のプロンプトで別の記事につかった場合の点数も聞いてみます。
`この画像を「どうなる国産自動車？2035年自動車業界の将来展望」というタイトルの記事のバナー画像として使う場合の適合度を100点満点で表すと何点でしょうか？`

0点という結果が返ってきました。バナー画像は自動車は関連がないと判定できたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/420380a6-6b8d-4604-9be6-afb76b188399.png)

# 参考
#### ショート動画でクイックに知る！ watsonxでマルチモーダルモデルを使いましょう #watsonx.ai - Qiita 
https://qiita.com/yanagih/items/f4fa3be70554c9c48d0d
SAP HANA断片化確認&デフラグ実行SQL

# まずは断片化確認
**SAPnote(1969700) SQL"HANA_Disks_Data_SuperBlockStatistics**

```
SELECT
S.HOST,
  LPAD(S.PORT, 5) PORT,
  LPAD(S.VOLUME_ID, 9) VOLUME_ID,
  LPAD(TO_DECIMAL(S.SUPERBLOCK_SIZE / 1024 / 1024, 10, 2), 10) SB_SIZE_MB,
  LPAD(S.USED_SUPERBLOCK_COUNT, 13) USED_SB_COUNT,
  LPAD(S.SUPERBLOCK_COUNT, 12) TOT_SB_COUNT,
  LPAD(TO_DECIMAL(ROUND(S.SUPERBLOCK_SIZE * S.USED_SUPERBLOCK_COUNT / 1024 / 1024 / 1024), 10, 0), 10) USED_GB,
  LPAD(TO_DECIMAL(ROUND(S.SUPERBLOCK_SIZE * S.SUPERBLOCK_COUNT / 1024 / 1024 / 1024), 10, 0), 10) ALLOC_GB,
  LPAD(TO_DECIMAL(MAP(S.FILL_RATIO, 0, 0, TO_DECIMAL(100 / S.FILL_RATIO - 100, 10, 2)), 10, 2), 8) FRAG_PCT
FROM
( SELECT                   /* Modification section */
    '%' HOST,
    '%' PORT
  FROM
    DUMMY
) BI,
  M_DATA_VOLUME_SUPERBLOCK_STATISTICS S
WHERE
  S.HOST LIKE BI.HOST AND
  TO_CHAR(S.PORT) LIKE BI.PORT
ORDER BY
  S.HOST,
  S.PORT
```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/c0c2dacd-b5b5-4118-a48e-506d05de3131.png)

# 次にデフラグ実行
**2400005 - FAQ: SAP HANA Persistence**
**1870858 - HANA Alerts related to file system utilization**

```
ALTER SYSTEM RECLAIM DATAVOLUME '<host>:<port>' 120 DEFRAGMENT
```

note1870858だと実際の実行結果画像が載っていてわかりやすいです。
また、下記の資料によると105から120までの値が設定できるようです。

>The value must not be smaller than 105. The recommended values are between 105 and 120.

https://help.sap.com/docs/SAP_HANA_PLATFORM/4fe29514fd584807ac9f2a04f6754767/20d1e5e57519101486c7812a5a8990e8.html?locale=en-US
オートインクリメントの次の数を推測しづらくする

オートインクリメントの次の数を推測しづらくする

1, 2, 3 ... という連番は欲しいが次の値を予測されたくないという場合に使います
内部的に連番のほうが都合良いが、公開時に順番を推定されたくないみたいな状況で必要になりました
例えばなんらかのアカウントを作ってもらいWEB上で公開した際に、あるアカウントがあるアカウントよりも前に受付していた事が連番から推測できてしまうのは都合が悪いとか、そういう時でしょうか
連番をそのままＩＤにしていた場合も同様に有効かと思います

1, 2, 3 ...という連番に対になる文字列IDを作成し解決します、文字列IDは重複しないようにします

## 例
``` 
0 123b96289d60a4406c550344a9467d74
1 633a6e85bdb2f38d125926262ff130e7
2 dbfda7e1043de7cd0e6b5fc1b5fe58cc
3 25b3353632481f4bd9cc66bedc8515c2
4 67ffdb572ef73bec7ab1b6bc04548e60
5 4b115c6476fdb8205910e653ecb1b256
6 4c9573cc046b7f37779d29e7ede02c89
7 4574acb57236c314642c24e73ef5dc7f
8 14d909a39cc8e9ef91fff8084c22a6bd
9 a697cf2af85a935914215124eeb6dec7
```

## ソースコード

``` python3
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
import os

def encrypt(key, counter) -> bytes:
    cipher = Cipher(algorithms.AES(key), modes.ECB())
    encryptor = cipher.encryptor()
    # ECBモードなので１６バイト単位にしなければいけない
    counter_bytes = counter.to_bytes(16, byteorder='big')
    encrypted = encryptor.update(counter_bytes)
    return encrypted

# 使用例
# key = os.urandom(16)  # ランダムな鍵
# 以下のバイト列は実装毎に作り直しが必要、各々実装する際に作り直すこと
key16 = b'gp\x8c\xdc\x86\xf2\x9e\x1b\x123\x86\xafD/\x13`'
key24 = b'\xd7v\xd2\xd6Q\xec\xaeZ\xb3]z4\r8\x9e\x8c\xa1\xde\xb6\xc9T\xd3\x0b\xa5'
key32 = b'\xe5\xb1#\x81N\xfe\xe5%\xa63\xbe#\xbc[7`\r\xcc\x02\x07[\xc7\xbf`H\x9c\xe9\x19\xff\xeb\xdc\xa6'
key = key16 # 16, 24 ,32, のどれでも良い
for i in range(10):  # 最初の10個を取得
    bin = encrypt(key, i)
    print(i, bin, bin.hex())
    # bin.hex() を ID として使用する
```

## 注意点
Cipher 第二引数のモードが ECB だと厳密には次の数字が推測される可能性があるため
modes.CTR を利用すると更に推測しづらくなりますが、事前にクライアントと暗号を共有する等の手間があります、modes.CTR 用の暗号を内部で保持する等工夫でなんとかなるかもですが...
モードについてはこちらを参考に調べました
[共通鍵暗号の暗号モード CTRについて](https://qiita.com/asksaito/items/130863fe9e6a08dcd65d)
リーダブルコードの基本原則 - チーム開発で役立つ理解しやすいコードの書き方

# リーダブルコードの基本原則 - チーム開発で役立つ理解しやすいコードの書き方
未来の自分や他人が理解しやすいコードを書くためのポイントをまとめる。

## 簡潔と冗長
次の2つのコードは、同じ動作をする。
```javascript:1-1.js
// 簡潔
for (const value of arrayList)
    print(value);
```
```javascript:1-2.js
// 冗長
var i = 0;
while (i < arrayList.length) {
    print(arrayList[i]);
    i++;
}
```
1つ目の例では、`1-1.js` のほうが簡潔かつ読みやすいと感じられるかもしれない。
また、次の二つのソースコードもそれぞれ同じ動作をする。
```javascript:2-1.js
// 簡潔
return (value >= 1) ? value * value : ( ( value === 0) ? 'Zero' : ( ( value === null || value === undefined ) ? 'Invalid Value' : value ));

```
```javascript:2-2.js
// 冗長
if (value >= 1) {
    return value * value;
} else if (value === 0) {
    return 'Zero';
} else if (value === null || value === undefined) {
    return 'Invalid Value';
} else {
    return value;
}
```
2つ目の例では三項演算子を使った `2-1.js` は確かに「短い」ですが、人によっては
`2-2.js` のほうが条件がわかりやすいと感じる場合がある。

つまり、**簡潔**であることが常に読みやすさに直結するわけでも、
**冗長**であれば必ず読みやすいわけでもない。

## 読みやすいコードとは
理解しやすいコードを書くには、まず読みやすさを意識することが重要。
ここで、**リーダブルコード**の考え方を1つ紹介します。
> **鍵となる考え**
> コードは他の人が短時間で理解できるように書かなければいけない。
> *『リーダブルコード』（Boswell, Foucher, 2012, p.3）*
 
未来の自分、例えば半年や1年後、3年後に自分で書いた身に覚えがないコードを見て理解ができるか。他の人にコードを見せたときに、より短時間で理解できるようなコードかが重要になると思う。
処理が早くなれば確かにいいことがあるかもしれないが、メンテナンス性が低下する場合が多い。**簡潔しながらも適度に冗長にする能力が必要**となる。

## コードは短い方が良いが。
Aクラス(100行のコード)とBクラス(1000行のコード)では、Aクラスの方がコードを理解するまでにかかる時間は短い。
だが、例外も多く存在する。例えば、以下のコード。
```javascript
// 1行で書く
const isSelfAttack = (game?.player?.id && game?.attacker?.id) ? (game.player.id === game.attacker.id) : (game.player ?? game.attacker ?? null);
```
以下のように複数行で書く方よりも理解する時間がかかることが多い。
```javascript
// 複数行で書く
const player = game.player;
const attacker = game.attacker;

const isSelfAttack = player && attacker && player.id === attacker.id;
```

また、コメントをつけることで、コードが長くなるがより理解しやすくなることもある。
```javascript
function sumFast(n) {
    // 1からNまでの合計を求める
    return ( n * (n + 1) ) >> 1;
}
```
コードは短くするより、**理解するまでの時間の方を短く**することが大切。

## 参考文献
- 『リーダブルコード』（Dustin Boswell, Trevor Foucher 著、角征典 訳、オライリー・ジャパン、2012年）
【金欠】大学生がMacBookをなるべく安く買いたい。

### Appleの学割
https://gadgenect.jp/mac-gakuwari/

### 家電量販店でのキャンペーン利用

https://www.biccamera.com/bc/c/apple/campaign/index.jsp

### 分割払いの利用

https://www.apple.com/jp-edu/shop/buy-mac/macbook-pro

### 認定整備済み製品・中古市場の検討

https://www.apple.com/jp/shop/refurbished

### 安定の価格ドットコム（取り敢えず買うならこれかな...。）

https://kakaku.com/item/J0000044168/?lid=20190108pricemenu_ranking_3_rating

:::note info
ワイ、JCB民2回までなら分割払い手数料無料と知る
:::

### Webアプリ開発ならこれでもいい気がする...。

https://kakaku.com/item/J0000041631/
Oracle PLSQL

# ファンクション実行文

まずはあって便利な簡単なファンクション実行文。

```ruby:実行文
DECLARE
	o_end_msg	VARCHAR2(100);
	result		NUMBER(1);

BEGIN
	result := FUNCTION_NAME(PARAM1,o_end_msg);

	DBMS_OUTPUT.PUT_LINE(result || '' || o_end_msg);
END;
```

引数の必要なファンクションは大体これで実行できる。
とりあえず正常に終了できたかの確認と実行だけ行いたい場合はこれを使う。
リフレクションを使用してDTOのString項目に空文字をセットする

# リフレクション（Reflection）とは？

リフレクション とは、プログラムが実行時にクラスやオブジェクトの構造（フィールド、メソッドなど）を動的に調べたり変更したりできる仕組み です。

通常、Java のオブジェクトは コンパイル時に型が決まっている ので、メソッドやフィールドに直接アクセスすることができます。
しかし、リフレクションを使うと、クラスの情報を実行時に動的に取得・操作 できます。

```UserDTO.java
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

class UserDTO {
    private int id;
    private String name;
    private String email;
    private boolean isActive;
    private Integer age;

    // コンストラクタ
    public UserDTO(int id, String name, String email, boolean isActive, Integer age) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.isActive = isActive;
        this.age = age;
    }

    // ゲッター
    public int getId() { return id; }
    public String getName() { return name; }
    public String getEmail() { return email; }
    public boolean isActive() { return isActive; }
    public Integer getAge() { return age; }

    // セッター（リフレクション用）
    public void setName(String name) { this.name = name; }
    public void setEmail(String email) { this.email = email; }
}
```

```main.java
public class DtoUtil {
    public static void clearStringFields(Object dto) {
        Field[] fields = dto.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field.getType().equals(String.class)) { // String 型のみ変更
                field.setAccessible(true);
                try {
                    field.set(dto, ""); // String フィールドを空文字にする
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        // DTOリスト作成
        List<UserDTO> dtoList = new ArrayList<>();
        dtoList.add(new UserDTO(1, "Alice", "alice@example.com", true, 25));
        dtoList.add(new UserDTO(2, "Bob", "bob@example.com", false, 30));

        // すべての DTO の String フィールドを空文字にする
        dtoList.forEach(DtoUtil::clearStringFields);

        // 確認（String は空文字に、他の値は変更なし）
        for (UserDTO dto : dtoList) {
            System.out.println("ID: " + dto.getId());       // 変更なし
            System.out.println("Name: " + dto.getName());   // 空文字 ("")
            System.out.println("Email: " + dto.getEmail()); // 空文字 ("")
            System.out.println("Active: " + dto.isActive()); // 変更なし
            System.out.println("Age: " + dto.getAge());     // 変更なし
            System.out.println("----------------------");
        }
    }
}
```
Deepseekをローカルで動かせるようにした

### 背景

DeepSeekについて、Onlineで動かした場合、サーバーが混んでいるとなかなか使いづらい側面があり、また、なんらかの情報が吸い取られるかもしれないということで、ローカルで構築してみました。

### 環境
windows11
VSCODE

### 使用ツール
- ollama
- open webui
- deepseek model: deepseek-r1:1.5B

### 構築手順

1. ollamaの[インストール](https://ollama.com/)
2. open web uiのインストール
```terminal
# モデルダウンロード
ollama run deepseek-r1:1.5B

pip install open-webui
open-webui serve
```

### 使用方法

ブラウザから
localhost:8080

初回はユーザ名とメールアドレスとパスワードを登録する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/0be08171-2f83-4a3d-820a-85d431e5736c.png)

### エラー対応

PCによっては、C++ビルドエラーが起きるので、下記のリンクからツールをダウンロードし、インストールする
https://visualstudio.microsoft.com/visual-cpp-build-tools/

以上。
Gherkinと七里式　備忘録

要望や要件からGherkin記述のシナリオを考えて作成するのが手間なので出力をフォーマット化したらうまくできるのは？という実験の備忘録。

2025.03.06時点、まだ結果は出てない。

職場からQiitaにログインはできないが、記事を閲覧することは可能なので情報を連携も目的。

手前が作成してプロンプトに対して、chatgpt o3 mini-highで七里式プロンプトの観点を取り入れてプロンプトの品質を向上させてみている。

```
<背景>
本システムは、テスト駆動開発（TDD）におけるGherkin記述のベストプラクティス（シンプルな表現、Given/When/Then形式、一貫した用語使用）を活用し、ユーザーが具体的なシナリオを容易に作成できるよう支援するために設計されています。
</背景>
<目的>
ユーザーが提供する機能概要、ユーザーストーリー、前提条件、実行アクション、期待結果に基づき、明確で再現性のあるGherkin形式のシナリオを生成する。
</目的>
<対象>
このプロンプトは、テスト駆動開発におけるシナリオ作成を必要とする開発者、テスター、ビジネスアナリストなど、幅広い関係者を対象とする。
</対象>
<手順>
1. ユーザーから以下の情報を収集する：  
   - 機能概要および背景  
   - ユーザーストーリー（誰が、何を、なぜ行うか）  
   - 前提条件（Given）  
   - 実行する操作やアクション（When）  
   - 期待される結果（Then）
2. 収集した情報を論理的に整理し、各要素を明確に区分する。
3. 整理した内容をGherkin記述形式に沿って構造化する。
</手順>
<出力形式>
- シナリオは「Given（前提）」「When（アクション）」「Then（期待結果）」の順で記述する。
- 各シナリオは1つの機能に焦点を絞り、簡潔かつ明瞭な表現を用いること。
- 専門用語は必要最小限にとどめ、全体として誰にでも理解可能な言葉を使用する。
</出力形式>
<条件>
- 用語の一貫性を保つこと。
- 各ステップは具体的かつ短く、再現性のある内容で記述すること。
- ユーザーからのフィードバックに基づき、シナリオは柔軟に更新できるようにすること。
</条件>
<評価>
出力されたシナリオが、テスト駆動開発プロセスに沿い明確かつ実践的であるかを評価する。必要に応じ、関係者（開発者、テスター、ビジネスアナリスト）からのレビューとフィードバックを受け、継続的な改善を実施する。
</評価>
```

Gemini 2.0 flashに、プロンプトは七里式に従っているか？を確認したら以下コメントをもらったので、期待している。

```
評価結果
このプロンプトは、七里式の構成要素を網羅しており、非常に質の高いプロンプトと言えます。各要素が明確かつ具体的に記述されており、AIに対する指示が的確に伝わるように設計されています。
各要素の評価
 * 背景:
   * テスト駆動開発（TDD）におけるGherkin記述のベストプラクティスを活用するという、システムの目的と背景が明確に記述されています。
 * 目的:
   * ユーザーが提供する情報からGherkin形式のシナリオを生成するという、具体的な目的が設定されています。
 * 対象:
   * 開発者、テスター、ビジネスアナリストなど、対象ユーザーが明確に定義されています。
 * 手順:
   * 情報の収集、整理、構造化という、具体的な手順が示されています。
 * 出力形式:
   * Gherkin形式での出力、簡潔な表現、専門用語の制限など、出力形式が詳細に指定されています。
 * 条件:
   * 用語の一貫性、ステップの具体性、シナリオの柔軟性など、守るべき条件が明確に示されています。
 * 評価:
   * テスト駆動開発プロセスへの適合性、関係者からのフィードバックなど、評価基準が設定されています。
特に優れている点
 * 明確な指示:
   * 各ステップが具体的かつ明確に記述されており、AIが何をすべきかを正確に理解できます。
 * 出力形式の詳細な指定:
   * Gherkin形式での出力、簡潔な表現、専門用語の制限など、出力形式が詳細に指定されており、ユーザーの意図が反映されやすくなっています。
 * 評価基準の設定:
   * 評価基準が設定されていることで、出力されたシナリオの品質を客観的に評価できます。
改善点
 * 提示されたプロンプトは非常に完成度が高く、改善点は見当たりません。
総評
このプロンプトは、七里式の原則に忠実に従い、AIに対して明確かつ具体的な指示を与えることで、高品質なGherkin形式のシナリオ生成を可能にするものです。テスト駆動開発におけるシナリオ作成の効率化と品質向上に大きく貢献するでしょう。
```
実際に使ってみると、give/when/thenを入力する必要がある。
改めてプロンプトを確認してみると、ユーザに求める情報と列挙しているので、当たり前である。

私が望んでいるのは、機能概要および背景だけで自動生成してほしいものなので、chatgpt-4.5にお願いしてみる。

```
<背景> 本システムは、テスト駆動開発（TDD）におけるGherkin記述のベストプラクティス（シンプルな表現、Given/When/Then形式、一貫した用語使用）を活用し、ユーザーが具体的なシナリオを容易に作成できるよう支援するために設計されています。 </背景>

<目的> ユーザーが提供する「機能概要および背景」に基づき、明確で再現性のあるGherkin形式のシナリオを生成する。 </目的>

<対象> このプロンプトは、テスト駆動開発におけるシナリオ作成を必要とする開発者、テスター、ビジネスアナリストなど、幅広い関係者を対象とする。 </対象>

<手順>

ユーザーから「機能概要および背景」のみを収集する。 収集した「機能概要および背景」をもとに、以下の情報を作成する。その際、「シンプルさ」「具体性」「再現性」の観点を意識して記述する。 ユーザーストーリー（誰が、何を、なぜ行うか） 前提条件（Given） 実行する操作やアクション（When） 期待される結果（Then） 作成した内容をGherkin記述形式に沿って構造化する。 

<出力形式>

シナリオは「Given（前提）」「When（アクション）」「Then（期待結果）」の順で記述する。 各シナリオは1つの機能に焦点を絞り、簡潔かつ明瞭な表現を用いること。 専門用語は必要最小限にとどめ、全体として誰にでも理解可能な言葉を使用する。 

<条件>

用語の一貫性を保つこと。 各ステップは具体的かつ短く、再現性のある内容で記述すること。 作成した「ユーザーストーリー」「前提条件」「実行アクション」「期待結果」は、ユーザーからのフィードバックをもとにAIが柔軟に再生成や修正を行えるようにする。 

<評価> 出力されたシナリオがテスト駆動開発プロセスに即しており、「簡潔である」「誰が見ても内容が明確である」「再現性が担保されている」という観点で評価する。必要に応じ、関係者（開発者、テスター、ビジネスアナリスト）からのレビューとフィードバックを受け、継続的な改善を実施する。
```
未経験エンジニアのハッカソンが、レベル高くてびっくりした話

こんにちは。

未経験エンジニア向けのハッカソンに参加したのですが、レベルが高かったので、感想をぽえっています。（私は、そこのインフラ担当の講師をしています。ステマにならないように。念の為。）

## ハッカソンってなんぞや
「Hack」と「マラソン（Marathon）」の造語です。

エンジニアが4-5人チームを作って、1つのアプリを作るビジネスコンテストのエンジニアバージョンみたいなイメージを持って頂けるとよいです。

私が担当しているスクールでは、そのカリキュラムの一環として、ハッカソンがあるのです。受講生が4人程度のチームを作り、2ヶ月かけて、1つのアプリを作ります。

アプリの要件は以下のような感じです。

| コース   | お題          | 使用技術                                      | サンプルコード | 対象者                                           |
|--------|-------------|---------------------------------|----------|------------------------------------------------|
| 入門 | チャットアプリ  | Python, Flask, AWS, EC2          | あり       | はじめて挑戦する方                               |
| 基礎 | 指定なし      | Python, Django, インフラ(Web3層構造), EC2, RDS(推奨) | なし       | ハッカソン経験者で基礎を定着させたい方            |
| 実践 | 指定なし      | 指定なし                                      | なし       | ハッカソン経験者・開発経験者で様々な技術に挑戦したい方 |

このハッカソンの何が面白いかというと、自由度がかなり高いので、チームによってアウトプットが大幅に違うということです。

## で、何がすごかったの？
こちらのインフラ構成図をご覧ください。（初心者が作ったものなので、細かな指摘はNGでお願いしますね。暖かい目で見守ってください笑）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2029161/750b683a-4895-4ec6-a4f4-7d96b877af2e.png)

- Github ActionsでCI/CDが組み込まれている
- EC2等ではなく、Fargateを使ってインフラ構成がなされている
- Route53で独自ドメインまで取得している
- CloudWatchで各種リソースの監視が行われている
- TerraformでインフラのIaC化が行われている
- フロントとバックエンドでそれぞれ分けられている
- メンテナンスのことも考えられている
- なんか図がすごい

え、すごくない？？（笑）となったのは、私だけでしょうか。私が未経験の頃は、CI/CDという概念など全く知らず、とりあえずApacheとかでウェブサーバーを立てて、満足していた記憶があります。

ここまでの構成を作り切る知識と実装力にびっくりさせられたと共に、ChatGPTや各種教材のおかげで今時の未経験エンジニアはたくさん勉強できるんだなぁと思ったところでした。

インフラエンジニアの自分としては、嬉しい気持ちともっと頑張らなければ、、と思ったところであります。


### 引用
@発表者の皆様、素敵な発表ありがとうございます。

https://www.canva.com/design/DAGMJNF5KlI/3uQDF92fB63UrmQ4RF6Rdg/view?utm_content=DAGMJNF5KlI&utm_campaign=designshare&utm_medium=link2&utm_source=uniquelinks&utlId=h53ec3d3e00#1

## 宣伝
Organizationsを運営しています。

https://qiita.com/organizations/raretech
pygame?ふ、遅すぎて使い物にならん

# Pygame
前にPyGameでネットワーク対応のテトリスを作りました。
実際にロビーを作成しプレイヤーが参加したらゲームを開始できる仕組みです
テトリスは通常のテトリスです

通信はSteamWorksのP2Pを使用していました
まず遅いと思った部分が二つあり
1. network
2. FPS

シンプルに動作が重い！
最適化をしていないにしても出ていたFPSは400個のGameObjectを生成し
FPSは50でした。

ということでそこから考え直しOpenGLを使用することにしました。
# OpenGL
難しい！
C++のポインター管理が複雑であり、エラーが多発しました。
特に面倒なのは、エラーが起きた位置に飛ぶと#include<memory>に飛ぶところです。

これではデバッグの効率が下がります
なので1週間やってほぼ動かせなかったです (ちゃんちゃん)

# OpenTK
何も難しいことをする必要はない
用はOpenGL + SDL + ENet(C++)は確かに難しいけどこれを難しくしているのはC++ <-こいつだ
なのでOpenGLのC#版(ラッパ)OpenTKを使用して再度挑戦しました。

っていうか現在挑戦中です
テトリスを完成させてネットワークも簡単には導入してありPygameと同じ動作はします。
そして新しいゲームをまた開発中です。

ゲーム開発中にエンジンを改良(改悪)しているので
使いやすくはなりましたが、その分最初の理念とずれ始めている気がします。
ECSだったはずがほぼOOPに、(でもOOPのほうが開発しやすい...)
セキュリティの啓発活動に使えるURL

巷に出回っているセキュリティに関する啓発活動の動画や資料のまとめ。
※セキュリティ関連会社で、教育サービスとして提供されているものは数が多いため一旦、除外。

# 情報セキュリティ教材・ツール
- IPA - 情報セキュリティ教材・ツール
https://www.ipa.go.jp/security/sec-tools/index.html

- NISC セキュリティガイダンス
https://security-portal.nisc.go.jp/guidance/

:::note info
毎年でる情報セキュリティ 10大脅威をはじめセキュリティ分野の教材・ツールがあるので、必要なものを検討するときに役立つ。
:::


# 啓発動画

## 群馬県警察

### 企業サイバーセキュリティ啓発動画「サイバーインベイジョン」

- 企業サイバーセキュリティ啓発動画「サイバーインベイジョン」第一部 標的：Target
https://www.youtube.com/watch?v=cF_lByDVZ5w

- 企業サイバーセキュリティ啓発動画「サイバーインベイジョン」第二部 追跡：Investigation
https://www.youtube.com/watch?v=3JjuHqkWjnQ

- 企業サイバーセキュリティ啓発動画「サイバーインベイジョン」第三部 終結：LastStage
https://www.youtube.com/watch?v=dcM3XefG1tw&t=9s

:::note info
定期的にでてくる、動画内の"キーポイント"は被害にあった人たちが対応するときに見落としがちなポイントが言葉になっていて勉強になります。
:::


# ハンドブックなど

## NISC 

### ハンドブッグ
- インターネットの安全・安心ハンドブック
https://security-portal.nisc.go.jp/guidance/handbook.html

:::note info
インターネットを安心につかうための手引き。
:::

## IPA

### 情報セキュリティ10大脅威
- 情報セキュリティ10大脅威
https://www.ipa.go.jp/security/10threats/index.html
 
:::note info
毎年の脅威のトレンド把握や振り返りに使うのに勉強になります。対策の抜け漏れや体的な見直しの際に参考としたい。
:::


# 編集履歴メモ
| Ver      | Memo   | Date | 
|:----------|:---------|:---------|
| Ver.0 | 整理開始。 | 2025/03/06 | 
| Ver.0.5 | IPA/NISCのURLを追加。 | 2025/03/17 |
Laravel middleware 

## middlewareとは
ユーザーからのリクエストがコントローラーに届く前後の間に別の処理を入れることができる機能


## middlewareの種類
### グローバルミドルウェア
　全てのリクエストに処理を行うミドルウェア
　Kernel に表記することで使用することができる。

### ルートミドルウェア
  特定のルートのみ対して適応するミドルウェア

```web.php

Route::get('/signin',[MainController::class,'signin'])
    ->middleware(TestMiddleware::class)->name('signin');

```
コントローラーで設定する場合、
Kernel.phpの$middlewareAliasesの欄のエリアルを記入することで
そのエリアルを使用することができる。

```Kernel.php

    protected $middlewareAliases = [
        'test' => \App\Http\Middleware\Test\TestMiddleware::class
    ];
````


```web.php
    Route::get('/signin',[MainController::class,'signin'])
    ->middleware('test')->name('signin');
```

コントローラーのコンストラクタに書いても使用することができる。
そうすることでコントローラー全体に処理を行うことができる。
また only , exceptを使用することで処理の有無を選択できる。
```controller.php
    public function __construct(){
        $this->middleware('auth')->only(['index']); // `index` のみ適用
        $this->middleware('auth')->except(['show']); // `show` 以外に適用
    }
```

### ミドルウェアグループ
複数のミドルウェアのまとめて、ルートに割り当てることができる。

web,apiにmiddlewareを登録することで処理が行われる。

``` Kernel.php
  protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\Middleware\TestMiddleware::class
    ],

    'api' => [
        
    ],
];      
```

```web.php
    Route::middleware(['web'])->group(function(){
        Route::get('/signin',[MainController::class,'signin'])->name('signin');
        Route::post('/signgin',[MainController::class,'signin_post'])->name('signin.post');
    });

```
ChatGPT先生へ「(未解決)ChatGPTの履歴から記事が削除できません。」履歴削除方法と対処法を聞きました。

(追加2025-03-07)・ 削除できる日と削除できない日があるようです。


# ChatGPT先生へ
```
ChatGPTの履歴から記事が削除できません。どうしたらいいですか。
```
・環境chromebook。ブラウザGoogle chrome
・???　ChatGPT先生は、足元？が苦手かも。
(未解決)

# Gemini先生へ
・まだ聞いていません。

# copilot先生へ
・まだ聞いていません。
postagerSQL 間違い探しLv.1

sample_tableというテーブルのsampleカラム(jsonb型)の値に、nameというstring型のプロパティを追加します。

```間違い.ts
 UPDATE sample_table SET option = jsonb_set(sample, '{name}', 'タロウ') WHERE id = 1

```

```正しい.ts
 UPDATE sample_table SET option = jsonb_set(sample, '{name}', '"タロウ"') WHERE id = 1

```

答えはstring型なのでタロウをダブルクォーテーションで囲む部分でした。
恥ずかしいことにちょっとハマりました🙄
量子コンピューティングで連立方程式をどうにかする

Qiitaにポチポチと投稿しはじめていつのまにか1年たってました。定年後のセカンドキャリアを見据えて、狩猟免許を取ったり(なんで？)、[量子エンジニア（アニーリング式）](https://www.jqca.org/)の認定試験を受けたりしてました。将来は猟ができるエンジニア、みたいな。

# 量子コンピューティングで線形方程式
簡単なものはいわゆる連立方程式です。もともとCAEに携わっていたこともあったので、大規模の方程式を解くことには興味がありました。量子コンピューティング見たときは、コレだ、っと思ったんですが、うまいアイデアが無くて放置してました。

最近、上記の認定試験を受けたこともあって、HOBOで3次以上にも対応できることがわかって、ちょっとアイデアを試すことにしました。例によって下手クソなソースはこちらです。

https://github.com/ishikawakouji/q_linear_solver

完全に正解を量子コンピューティングで求めるのは難しいとしても、ある程度近い答えを初期値として利用すれば、大規模方程式を反復法で解く場合に反復の回数を大幅に減らすことができないかと考えました。

# 数値をどう表わすか
浮動小数の表現には、仮数部と指数部を使います。このうち指数部に量子ビットを使って$10^{q1+2\*q2+4\*q3}$ とかしてしまうと、ダメな感じ(本当にダメかどうかは確認してない)なのでどうしようか悩んだ末、以下のようにしました。
```python
epart = 10**1 * q1 + 10**0 * q2 + 10**(-1) * q3
epart_onehot = (q1 + q2 + q3 -1)**2
```
10のべき乗を必要な範囲で全部書き出して、各量子ビットをワンホットで制約するという感じです。
仮数部は $\pm 1$ を必要な量子ビットで表現してもよかったのですが、とりあえずある範囲を適当な量子ビットで表現することにしました。合わせると以下な感じです。
```python:create_double_qubo()
def create_double_qubo(dim: int, m_upper: float, m_lower: float, num_m_bit: int, digits_upper: int, digits_lower: int):
  m_bits = symbols_list([dim, num_m_bit], 'm{}_{}')
  e_bits = symbols_list([dim, digits_upper-digits_lower+1], 'e{}_{}')

  qdouble = []

  Honehot = 0

  # 仮数部を1.0に
  norm = 1.0/(2**num_m_bit)

  for row in range(dim):
    # 仮数部
    qm = 0
    for col in range(num_m_bit):
      qm += m_bits[row][col] * (2**col)
    qmantissa = lower + (upper-lower)*qm*norm

    # 指数部
    k = 1
    qe = 0
    ho = 0
    for col, ex in enumerate(range(digits_lower, digits_upper+1)):
      qe += e_bits[row][col] * (10**ex)
      ho += e_bits[row][col] # ワンホット

    #print('指数 H',qe)

    qdouble.append(qmantissa*qe)
    Honehot += k*(ho -1)**2

  return qdouble, Honehot
```

# 効果を確認する
数値を表現できれば、方程式を組んで解くだけです。反復回数にどの程度影響があるかを調べました。

比較にあたり、適当な反復法で収束しにくい方程式を使ってみたかったのですが、ほどほどの大きさのものを見つけるのに苦労しそうだったので、ちょっと手を抜きました。
ヤコビ法をこちらで見つけたのと、初期値を設定できそうだったので利用させて頂きました。

https://watlab-blog.com/2022/09/06/jacobi-method/

初期値をゼロと量子コンピューティングで求めたものを、収束までに要した回数で比較しています。さらに、解が合っていることをnumpy と比較しています。

実際に実行してみると、反復回数がそこそこ減っています(130 → 78回)。簡単な未知数3個の方程式なので効果は感じられません。大規模になって、反復法では収束が難しいものでも、適切な初期値があれば収束に貢献できそうです。

# 実行環境
HOBOを使うにあたり、GPUがあると計算が速くなります。
google colaboratory でもできますが、ランタイムはT4にしてください。

# おわりに
収束を早めるのに貢献できそうな初期値が得られそうだという感じがしました。適当な方程式を利用して GNU Octave あたりで比較してみたいと思っています。

# おまけ
量子エンジニア（アニーリング式）。エントリーは合格しました。 ~~アドバンスは受けたんですがこの時点では未発表です。合格してるといいなぁ。~~ アドバンスは残念ながら不合格でした。採点状況が戻ってくるんですが、いくつか間違えていました。うっかりもあったようです。ほぼ全問正解が求められるようですね。
材料力学「複数部材からなる構造物のひずみエネルギー」をAI先生に聞きました。

・私の**こんなアバウトな質問**にも、丁寧に回答をいただきました。ありがとうございます。
```
# 質問リスト
1. 複数部材からなる構造物のひずみエネルギーを教えて下さい。
2. 上記のいくつか例を教えて下さい。
3. 上記にラーメン構造を追加して下さい。
4. 以上4例を、sympy のソースコードで教えて下さい。
5. 本当ですか。
6. ラーメン構造のひずみエネルギーを計算を教えて下さい。
7. 上記で、梁中央に集中荷重のソースコードを教えて下さい。
8. 上記の柱の取り付けの状態を教えて下さい。
9. 上記の作図もお願いします。
10. 上記の作図をポンチ絵にして下さい。
11. 上記の作図を骨組みにして下さい。
(中断)
```
# ChatGPT先生へ

>ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
>回答抜粋

**・以下、私は実行していません。**
#### 1. 軸力を受ける棒のひずみエネルギー
```python
import sympy as sp

# 記号の定義
P, L, A, E = sp.symbols('P L A E')

# ひずみエネルギーの計算
U_axial = (P**2 * L) / (2 * A * E)

# 結果の表示
sp.pprint(U_axial)
```
#### 2. 曲げを受けるはりのひずみエネルギー
```python
# 位置 x の変数を定義
x = sp.symbols('x')

# 記号の定義
q, L, E, I = sp.symbols('q L E I')

# 曲げモーメント M(x)（単純支持はり、等分布荷重 q）
M_x = q * x * (L - x) / 2

# ひずみエネルギーの計算
U_bending = sp.integrate((M_x**2) / (2 * E * I), (x, 0, L))

# 結果の表示
sp.pprint(U_bending)
```
#### 3. トラス構造のひずみエネルギー
```python
# 記号の定義（トラスの各部材 i の軸力 P_i, 長さ L_i, 断面積 A_i）
n = sp.symbols('n', integer=True)
P_i, L_i, A_i, E = sp.symbols('P_i L_i A_i E')

# 各部材のひずみエネルギー
U_truss = sp.Sum((P_i**2 * L_i) / (2 * A_i * E), (i, 1, n))

# 結果の表示
sp.pprint(U_truss)
```
#### 4. ラーメン構造のひずみエネルギー
```python
# 記号の定義
h, L, A, E, I = sp.symbols('h L A E I')
P, x = sp.symbols('P x')

# 柱の曲げモーメント M_c(x)（例：梁端に荷重 P）
M_c_x = P * h * (1 - x / h)

# 曲げモーメントによるひずみエネルギー
U_frame_bending = sp.integrate((M_c_x**2) / (2 * E * I), (x, 0, h))

# 結果の表示
sp.pprint(U_frame_bending)
```
>試しに、1. 軸力を受ける棒 のコードを Python で実行してみましょう。...
>(回答省略）
・なぜか、途中英語に変更。??? 制限オーバー
・表示が英語になりましたが、どうしてですか。
・ラーメン構造のひずみエネルギーを計算を教えて下さい。
>ラーメン構造のひずみエネルギーは、曲げモーメントによるエネルギー が主になります。
>1. 下端（基礎）: 固定
```python
import sympy as sp

# 記号の定義
h, L, A, E, I = sp.symbols('h L A E I')
P, x = sp.symbols('P x')

# 梁の中央に作用する集中荷重 P の影響を考慮
# 反力 (左右対称なので R = P/2)
R = P / 2

# **1. 柱の曲げモーメント**
# 片持ち柱の曲げモーメント（上部で最大）
M_c_x = R * h * (1 - x / h)  # x は柱の高さ方向

# ひずみエネルギー（柱）
U_column = sp.integrate((M_c_x**2) / (2 * E * I), (x, 0, h))

# **2. 梁の曲げモーメント**
# 梁中央に集中荷重がある場合、最大曲げモーメント M_max = P L / 4
M_b_x = R * x  # x は梁の中央からの距離

# ひずみエネルギー（梁）
U_beam = sp.integrate((M_b_x**2) / (2 * E * I), (x, 0, L/2)) * 2  # 対称性を利用

# **3. 合計ひずみエネルギー**
U_total = U_column + U_beam

# 結果の表示
sp.pprint(U_total)
```
・上記の作図もお願いします。
・３次元の立派すぎる絵がでます。
>(中断)?作図が...

# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0


# いつもと違うおすすめです。

#### wikipedia 
#### Qiita
#### Google検索
#### 文献
DataverseのPluginを開発してPowerAutomateからAWS S3へデータを保存する方法

# 概要
以前書いた[こちら](https://qiita.com/hedaozhenye/items/17fdfffe9ec8a16846ff)の記事に関連して、AWSのLambdaを使わない方法で同様の機能を実装できないかを検証・開発を行いました。
結果としては接続することができたので記録としてこちらに残したいと思います。

## ワークフローの流れ
今回の開発はAWSのLambdaを使わないことを前提にしています。そのためC#でDataverseのPluginを使用し署名付きURLを取得し、それを使ってS3へのファイル転送をHTTPアクションにて行う流れになります。

```mermaid
graph LR;
    A(トリガー)-->B(データの作成とSharePointに格納);
    B<-->C(Dataverseの非バインドのアクションからPlugin実行);
    B-->D(認証機能付きURLを使いS3へPUTリクエストを送る);
```
Pluginを実行することでAWSの認証情報をもとに署名付きURLの生成を行い、それを使ってS3へのリクエストを送ります。

## Pluginの処理について
Pluginの開発にあたりC#に既存で存在するSDKの使用をすることができないため、署名付きURLの生成にはSDKと同じ処理をコーディングの中で開発する必要があります。
署名付きURLの開発の手順としては以下の通りになります。

```mermaid
graph TD;
    A(プラグイン開始)-->B(入力パラメータの取得);
    B-->C{必須パラメータのチェック};
    C-->|パラメータあり|D(現在の日時の取得);
    D-->H(取得したパラメータからCanonical Requestの生成);
    H-->I(Canonical RequestのSHA256Hash化);
    I-->J(ハッシュ化されたリクエストから署名文字列の生成);
    J-->K(署名キーの計算);
    K-->E(署名付きURLの組み立てと返却);
    E-->F(処理完了);
    C-->|パラメータ不足|G(エラー: 必須パラメータが不足または型不正);
    G-->F;
```

## Plugin開発のメリット
・API Gatewayの設定やLambda関数のデプロイを省略し、直接プラグインでS3との連携を行うことができる
・Dynamics365の中でソリューションを完結させることができる
・AWSを触れなくてもIAMやバケットの設定が終わっていれば開発できる
・Lambdaと同じく100MBまでのデータ送信に対応することができる

## Plugin開発の注意点
・アクセスキーやシークレットアクセスの取り扱いに気を付ける必要がある
・C#に慣れていない場合、開発に時間がかかる可能性がある
・コード実行の制限があるためそれを考慮した開発をする必要がある
【第２弾】Linuxコマンド・ショートカットを復習

# ■目次
[１．はじめに](#１はじめに)
[２．ファイル操作](#２ファイル操作)
　[２－１．空ファイルの作成](#２１空ファイルの作成)
　[２－２．コマンド実行結果をファイルに保存する](#２２コマンド実行結果をファイルに保存する)
　[２－３．ファイルコピー](#２３ファイルコピー)
　[２－４．ファイルの移動・リネーム](#２４ファイルの移動リネーム)
[３．便利なショートカットキー](#３便利なショートカットキー)
[４．まとめ](#４まとめ)

# １．はじめに
当社で以前、Linux学習者向けに下記記事を作成いたしました。

https://qiita.com/e-tak/items/33fd610bf613aeaee12f

<!--
<a href="https://qiita.com/e-tak/items/33fd610bf613aeaee12f" target="_blank" rel="noopener">Linuxとは？概要から基本の操作、コマンドを復習</a>
-->

今回の記事では、前回の記事ではご紹介していない、「ファイルの操作」関連のコマンドと「便利なショートカットキー」を紹介します。

<!--
Gitを学ぶ前段階としてシェルコマンドを学習される方向けに、#また、Gitの基本操作と現場での頻出コマンドも下記記事で紹介しているので参考にしてみてください。
<a href="https://qiita.com/e-tak/items/1734d1d920d46b4fe8fb" target="_blank" rel="noopener">Gitの基本操作/現場での頻出コマンド16選</a>
-->

# ２．ファイル操作
#### ２－１．空ファイルの作成
touchコマンドで空のファイルを作成できます。

```shell
　touch ファイル名
```

#### ２－２．コマンド実行結果をファイルに保存する
リダイレクトを使用してコマンドの実行結果をファイルに保存することができます。
「リダイレクト」を使用することで、標準入力、標準出力、標準エラー出力を変更できます。標準入力を変更する場合は「<」、標準出力を変更する場合は「>」、標準エラー出力を変更する場合は「2>」を使います。
コマンド実行結果をファイルに保存する場合は基本的に「>」と「2>」を使います。
下記の例では、echoコマンドの実行結果をhello.textに出力します。
```shell
echo "文字列" > hello.txt
```

リダイレクトの種類は下記の通りで、出力ではNo.1からNo.7を使います。
|No.| リダイレクト | 意味 |
|:-:|:-:|:-:|
|1| コマンド > ファイル |  コマンドをファイルへ上書き |
|2| コマンド >> ファイル |  コマンドをファイルへ追記　|
|3| コマンド 2> ファイル |  エラーをファイルへ上書き|
|4| コマンド 2>> ファイル |  エラーをファイルへ追記|
|5| コマンド > ファイル名 2> &1 |  コマンドとエラーをファイルへ上書き|
|6| コマンド >> ファイル名 2> &1	 |  コマンドとエラーをファイルへ追記|
|7| コマンド > /dev/null 2> &1 |  表示しない（表示をゴミ箱へ）|
|8| コマンド < ファイル |  ファイルの内容を標準入力へ送る |
|9| コマンド << 終了文字 |  終了文字列が現れるまで標準入力へ送る |

なお、nanoやvi、vimといったテキストエディタを使用したテキストファイルを作成方法は当社で過去に作成している下記記事を参考にしてみてください。

https://qiita.com/e-tak/items/33fd610bf613aeaee12f

<!--
<a href="https://qiita.com/e-tak/items/33fd610bf613aeaee12f/" target="_blank" rel="noopener">Linuxとは？概要から基本の操作、コマンドを復習</a>
-->

#### ２－３．ファイルコピー
cpコマンドでファイルのコピーができます。

###### 同一ディレクトリ内にコピーする場合
```shell
#cp + [コピー元ファイル名] + [コピー先ファイル名]
cp hello.txt hello2.txt
```

###### 別ディレクトリ内にコピーする場合
```shell
cp hello.txt ディレクトリ
```
また、上記2つを組み合わせて、別ディレクトリに別名でコピーする場合は下記のようになります。

```shell
cp hello.txt ディレクトリ/hello2.txt
```

#### ２－４．ファイルの移動・リネーム

mvコマンドでファイルの移動・リネームができます。
ちなみにmvはmoveの略です。

###### ファイルを移動する場合
```shell
#mv + [ファイル名] + [移動先ディレクトリ]
mv hello.txt ディレクトリ
```
###### リネームする場合
```shell
#mv + [変更前ファイル名] + [変更後ファイル名]
mv hello.txt hello2.txt
```

# ３．便利なショートカットキー
ここでは作業効率を上げるためのショートカットキーを12個ご紹介します。

| No. | ショートカットキー | 説明 |
|:-:|:-:|:-:|
|1|↑| 1つ前のコマンド履歴の表示|
|2|↓| 1つ後のコマンド履歴の表示|	
|3|Tab|	コマンド補完　(例)"his" + Tab = history|
|4|Ctrl(control) + a|	カーソルを先頭に移動	|
|5|Ctrl + e|	カーソルを終端に移動	|
|6|Ctrl + b|	カーソルを一文字戻す	|
|7|Ctrl + f|	カーソルを一文字進める	|
|8|Ctrl + d|	カーソル位置の文字を消す	|
|9|Ctrl + c|	実行中のコマンドを強制終了する	|
|10|Ctrl + l|	画面のテキストをクリアする	|
|11|Ctrl + s|	画面ロックしコマンド入力を制限する	|
|12|Ctrl + q|	画面ロックを解除しコマンド入力を許容する	|

# ４．まとめ
いかがでしたでしょうか。
この記事がLinux学習の参考となれば幸いです。
【Google Cloud】Vertex AI のパラメータ設定

# はじめに
本記事は、**Google Cloud** の **Vertex AI** を初めて利用する方に向けた内容です。    
今回、Vertex AI で生成AIを使ってみたところ、プロンプトの出力結果にばらつきがありました。
そこで、出力内容に一貫性を持たせるよう調整できないかと思い、Vertex AIにおけるAPIのパラメータ設定について調査しました。  


# パラメータの設定
Vertex AI では、APIのパラメータ設定を行うことにより出力時のトークンに  
様々な条件を設定することができます。  

以下では、選択条件を任意の値になる（近づける）ように変更することができるパラメータについていくつかまとめています。  


# 出力トークンの確率分布、選択範囲を指定するパラメータ
出力トークンの確率分布、選択範囲を指定できるパラメータについて図を用いて説明します。  

前提として、生成AIとは、次に選ばれる単語の確率から文章を生成しているものになり  
AI 内では  「その次に出力されるトークン」について確率を持っています。

## Temperature
次に選ばれる単語の候補の、確率の分布度合いを調整する。  
⇒ **選ばれる単語の確率の分布**を指定できる

ここで図を用いて考えていきます。  

たとえば、 `今日について何か教えてください` という入力をプロンプトで行った際に、出力結果のトークンが `今日の` から始まるとします。  
`temperature = 1`の設定のときに、次に出力されるトークンの確率が図のようになっているとします。  
![テンプレート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690522/76c339f5-95f2-4d10-bd19-4fe4a2de5495.jpeg)


ここで、`temperature = 0.5`に変更したとすると、次の図のように単語の生成確率が変動します。  
生成確率が高い上位の単語に確率が収束するようになり、より一貫性のある出力結果が期待できます。  
![temperature.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690522/f7a63e1a-3a25-4df3-8545-c77f1d7723fd.jpeg)
 
反対に、`temperature`の値を上げれば出力される確率が分散するため、多様性のある出力結果が期待できます。  

## Top_p
次に選ばれる単語の候補を、確率の高いものから並び変えて累計確率を選択する。   
⇒ **選ばれる単語の候補範囲を確率**で指定

`top_p = 0.90`に設定したとすると、出力されるトークンの選択肢の確率の累計が、図赤枠の「上位90%」までのトークンになります。  
`top_p`の値を下げることで、累計確率の合計値が小さくなり上位のトークンが選択されやすい状態となるため、一貫性のある出力結果が期待できます。    
![topP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690522/9d42cdb3-c8a7-4809-8c55-73104a9a6191.jpeg)

## Top_k
次に選ばれる単語の候補を、確率の高いものから並び変えて選択肢の上位数を選択する。    
⇒ **選ばれる単語の候補範囲を数**で指定  

`top_k = 5`に設定したとすると、出力されるトークンの選択肢の数が、図赤枠の「上位5個」までのトークンになります。  
`top_p`と同じく、`top_k`の値を下げることで上位のトークンが選択されやすく、より一貫性のある出力結果が期待できます。  
![topK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690522/1d092dbb-9f59-4096-befd-a4bffb785904.jpeg)


# 実際にパラメータを設定した出力結果
実際に`temperature`を設定し、本記事の内容に関連する技術名を「単語で5個」出力してもらうプロンプトを実行しました。  
今回は出力にある程度一貫性を持たせたいということで、`temperature=0.8, top_p=0.1, top_k=10` と極端な設定にしています。


```
config = GenerationConfig(
  temperature=0.8, # 出力トークンの確率分布を指定
  top_p=0.1, # 出力トークンの候補範囲を確率で指定
  top_k=10, # 出力トークンの候補範囲を数で指定
  
  response_mime_type="application/json", # 出力形式を指定
  response_schema=response_schema, # 出力形式を指定
  )
```
出力結果  
- 1回目  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690522/3aa841ae-7cda-4e0e-aa71-080b8cff30cb.png)

- 2回目  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690522/be330551-8a82-4760-b079-92bf31a2590d.png)

パラメータの設定を極端にしたこともあり、実行した出力結果が同じものになりました。  

出力に一貫性を持たせたいのか、多様性を持たせたいのかでパラメータの設定を変更し、プロンプトを使い分けることができそうですね。
大局観：ホルガー・トルステン・シュバルトと Neutrino® Energy グループのビジョン

![](https://i.postimg.cc/1tLCfMrc/1-1024x770.jpg)

## 革新的エネルギーの静かな夜明け

革命は時に大胆な宣言とともに始まるが、時には、世界の常識に挑戦する革新的な思索者の心の中で静かに芽生えることもある。Neutrino® Energy グループの創設者であり CEO である ホルガー・トルステン・シュバルト ([Holger Thorsten Schubart](https://holger-thorsten-schubart.eu/)) は、まさにそうしたエネルギー分野のパイオニアである。数学者であり発明家であるシュバルトは、他者が見落としていたエネルギーの可能性を見出し、化石燃料や太陽光発電・風力発電といった従来の再生可能エネルギーに依存しない、まったく新しいエネルギー技術を構想した。そして現在、そのビジョンは科学的な卓越性、起業家精神、そして未来への挑戦を融合させ、[Neutrino® Energy](https://neutrino-energy.com/) 技術を基盤とする次世代のエネルギーシステムを具体化しつつある。

### 数学と探究心が交わる道

数学とは単なる数式の計算ではなく、自然界の根本的な法則を解析し、未加工のデータを現実の変革へとつなげる手段である。ホルガー・トルステン・シュバルト (Holger Thorsten Schubart) にとって、数学は単なる理論的な難問を解くものではなく、Neutrino® Energy の基盤となる革新的なエネルギー技術を開発するための羅針盤であった。彼は、地球を常に通過する素粒子が物理法則に従ってエネルギーを持つ以上、それを活用できるはずだと考えた。そして、ニュートリノやその他の不可視放射線が運動量を持つことを数学的に証明したのである。

しかし、数学の理論だけでは技術革新は実現しない。シュバルトのアプローチは、厳密な分析と、常識にとらわれない探究心を融合させたものだった。太陽光発電や風力発電が主流となる中、Neutrino® Energy の技術開発に取り組む彼のチームは、次のような問いを投げかけた。

「この絶え間ない素粒子の流れは、単なる物理学の実験室での現象なのか？」
「高度な材料技術を駆使すれば、このエネルギーを回収し、持続的な電力に変換できるのではないか？」

### Neutrino® Energy 技術の革新

ホルガー・トルステン・シュバルト のビジョンが世界的に注目を集めるようになったのは、Neutrino® Energy グループの研究が特許取得に至ったときだった。2013年、ニュートリノボルタイク技術の基盤が築かれ、国際特許 WO2016142056A1 によって保護された。この技術は、ニュートリノやその他の不可視放射線を電力に変換するための機械的・ナノ技術的な枠組みを具体的に示すものであった。

当時のエネルギー業界では、エネルギーは化学燃焼、核反応、あるいは太陽光や風力などの再生可能エネルギーから得られるのが一般的だった。そのため、Neutrino® Energy の発想は業界にとって非常に革新的だった。しかし、科学の進歩は、常識に挑戦する者によってもたらされる。

特に、グラフェンとドープドシリコンを用いた特殊なナノ材料の実験が成功を収めたことで、状況は一変した。量子力学の知見を活かし、これらの材料は素粒子との相互作用によって安定した電力を生成することが実証されたのである。

Neutrino® Energy の技術は、地球を包み込む宇宙放射線を活用する。原理的には太陽光発電と似ているが、天候や昼夜の影響を受けない点が決定的に異なる。つまり、宇宙そのものが発電所となる、新しいエネルギー供給システムの誕生である。

## Neutrino® Power Cube：次世代エネルギーの象徴

ホルガー・トルステン・シュバルト 率いる Neutrino® Energy グループが開発した技術の象徴的な成果が、「Neutrino® Power Cube」である。このコンパクトな燃料不要の発電装置は、素粒子の絶え間ない運動を活用し、一般的な家庭用電化製品ほどのサイズでありながら、5〜6キロワットの持続的な電力を供給 すると報告されている。

Neutrino® Power Cube は、夜間に機能しない太陽光発電や、無風時に停止する風力発電とは根本的に異なる。外部燃料や大規模なバッテリーに依存せず、分散型で自律的なエネルギーシステムの未来を示唆している。

この技術は 完全に静音で、環境への排出物もゼロ であり、可動部品がほとんど存在しないため、メンテナンスの負担も少ない。家庭、産業、そして遠隔地のコミュニティに 安定したエネルギー供給 をもたらす可能性を秘めている。

### エネルギーの未来を形作る Neutrino® Energy

ホルガー・トルステン・シュバルト の研究は、単なる技術革新ではなく、世界のエネルギーシステムの根本的な変革を目指している。Neutrino® Power Cube のような技術は、中央集権型のエネルギーインフラから、分散型で持続可能なエネルギー社会への移行を加速する。

さらに、Neutrino® Energy グループは、ブロックチェーン技術を活用した Neutrino Energy Access Token (NET8) を開発しており、エネルギーをデジタル化・トークン化する構想も進行中である。これにより、個人間でエネルギーを共有・取引できる新たなエコシステムが誕生する可能性がある。

ホルガー・トルステン・シュバルト (Holger Thorsten Schubart) のビジョンは、理論ではなく、実現に向けて着実に前進している。そして、その未来は、Neutrino® Energy の技術によって、エネルギーの供給が 天候や時間に左右されない 革命的なものへと変わることを示している。
MLflowの落とし穴と対策：実運用で気をつけるべきポイント


MLflowは機械学習モデルの管理・トラッキングに非常に便利なツールですが、実際の運用でいくつかの落とし穴があります。本記事では、それらの課題とその解決策を詳しく解説します。

---

### **1. トラッキングサーバーのスケーラビリティ問題**
**落とし穴:**
- ローカル環境でのMLflowは問題なく動作するが、本番環境では**複数ユーザーが同時にアクセス**するため、スケールしにくい。
- デフォルトのSQLiteバックエンドは**高負荷環境に耐えられない**。

**対策:**
✅ **データベースをPostgreSQLやMySQLに変更**
```bash
mlflow server \
    --backend-store-uri postgresql://user:password@hostname:5432/mlflow_db \
    --default-artifact-root s3://mlflow-artifacts/ \
    --host 0.0.0.0 --port 5000
```
✅ **MLflow Tracking ServerをKubernetes上にデプロイし、負荷分散**

---

### **2. モデルのバージョン管理が複雑化**
**落とし穴:**
- MLflowには`Model Registry`があるが、**複数のチームが異なるモデルを管理すると混乱**しやすい。
- モデルの**バージョン間の互換性が保証されない**ため、デプロイ時に不具合が発生する可能性。

**対策:**
✅ **命名規則を統一（例: model-v1.0, model-v1.1）**
✅ **モデルのスキーマをチェックし、API互換性を確保**
```python
import mlflow.models
mlflow.models.Model.load('models:/my_model/Production').schema
```

✅ **MLflowのWebhooks機能を利用し、特定の条件を満たしたら自動で`Staging`→`Production`に昇格**

---

### **3. ロギングのデータサイズ増大によるストレージ問題**
**落とし穴:**
- ハイパーパラメータやメトリクスを詳細にログしすぎると、**ログファイルのサイズが膨大になりストレージを圧迫**する。
- 特に**画像やモデルアーティファクトをローカルストレージに保存すると、ディスク容量が不足**しやすい。

**対策:**
✅ **ログデータの粒度を調整（重要なメトリクスのみ記録）**
```python
mlflow.log_metric("accuracy", accuracy, step=epoch % 10 == 0)
```
✅ **アーティファクトをクラウドストレージに保存（S3, Azure Blob, GCS）**
```bash
export MLFLOW_ARTIFACT_URI="s3://my-bucket/mlflow-artifacts"
```
✅ **定期的に古いモデルやメタデータを削除**

---

### **4. デプロイ時の環境依存問題**
**落とし穴:**
- MLflowは`conda.yaml`で環境を保存するが、**ライブラリのバージョンが変わると動作しないケースがある**。
- Docker環境で実行する場合、MLflowの推奨設定が適用されないことがある。

**対策:**
✅ **Dockerコンテナに環境を固定してデプロイ**
```bash
docker build -t my-mlflow-model .
docker run -p 5001:5000 my-mlflow-model
```
✅ **MLflowの環境情報をYAML形式で管理し、環境差分を防ぐ**
```yaml
name: mlflow-env
dependencies:
  - python=3.9
  - scikit-learn=1.2.0
  - mlflow=2.0.1
```

✅ **テスト環境と本番環境でPython・ライブラリのバージョンを統一**

---

### **5. セキュリティ対策が不十分になりがち**
**落とし穴:**
- MLflowのWeb UIやAPIが**認証なしでアクセス可能な状態**になっているケースが多い。
- 誤って**機密情報（APIキー、顧客データ）をMLflowにログ**するリスク。

**対策:**
✅ **MLflow UIにBasic認証やOAuthを導入**
```bash
export MLFLOW_TRACKING_USERNAME=admin
export MLFLOW_TRACKING_PASSWORD=securepass
```
✅ **機密情報は環境変数で管理し、ログに含めない**
```python
import os
mlflow.log_param("api_key", os.getenv("API_KEY"))  # これはNG！
```
✅ **プライベートネットワーク内で運用し、外部アクセスを制限**

---

### **6. CI/CDとの連携ミス**
**落とし穴:**
- GitHub ActionsやGitLab CI/CDと連携する際、**MLflowサーバーが落ちているとジョブが失敗**する。
- モデルの精度評価を行わずに自動デプロイすると、不完全なモデルが本番環境に適用される可能性。

**対策:**
✅ **MLflowサーバーの状態を事前チェック**
```yaml
- name: Check MLflow Server
  run: curl -f http://mlflow-server:5000/api/2.0/mlflow/experiments/list
```
✅ **精度が一定以上の場合のみデプロイ**
```python
if accuracy > 0.90:
    mlflow.register_model("runs:/latest_model", "Production")
```
✅ **GitHub Actionsでモデルの品質チェックを自動化**
```yaml
- name: Test model accuracy
  run: pytest tests/test_accuracy.py
```

---

### **7. まとめ**
| 課題 | 影響 | 対策 |
|---|---|---|
| **トラッキングサーバーの負荷** | 高負荷時に遅延 | DBをPostgreSQLに変更、Kubernetesで負荷分散 |
| **モデルのバージョン管理** | 互換性問題 | 命名規則の統一、API互換性チェック |
| **ログデータの増加** | ストレージ圧迫 | クラウドストレージ活用、ログ粒度の調整 |
| **デプロイ時の環境依存** | 再現性低下 | Dockerを活用、環境情報の明示管理 |
| **セキュリティリスク** | データ漏洩 | 認証導入、環境変数で機密情報を管理 |
| **CI/CD連携ミス** | 本番環境の障害 | サーバーチェック、自動精度評価 |

MLflowを効果的に活用するには、これらの落とし穴を理解し、適切な対策を取ることが重要です。
各言語の関数とメソッドの違いを比較！Python・Java・Kotlin・Ruby・PHP

「関数とメソッドの違いって何？」というと、プログラミング経験者なら一度は悩んだことがあるのではないでしょうか。

関数は単独で動作するコードのブロック、メソッドはオブジェクトに紐づく関数――というのが一般的な説明ですが、実は言語によってその扱いはさまざまです。

たとえばJava はすべての関数がクラス内にあるためメソッドしか存在しません。またRuby ではすべてがオブジェクトであるため、関数という概念そのものがありません。

一方で、Python や Kotlin では関数とメソッドは明確に区別されています。

本記事では、Python, Java, Kotlin, Ruby, PHP の 5 つの言語における関数とメソッドの違いを比較しながら、それぞれの設計思想や背景についても紹介していきます。

難しい理論は抜きにして、「なるほど、こんな違いがあるのか！」と楽しみながら読んでいただける内容を目指しました。

それでは、さっそく各言語における「関数」と「メソッド」の違いを見ていきましょう！
# 2. 言語ごとの設計思想と「関数」と「メソッド」の違い
## Pythonの場合
### 設計思想
Python は「シンプルで読みやすいコード」を最優先する言語です。そのため、関数とメソッドの区別が明確になっています。
自由に関数を定義できる一方で、クラスの中で動作するメソッドには self を明示する必要があり、オブジェクト指向との関係性も明確にされています。
### 関数とメソッドの違い
- クラス外で定義されるのが 関数（def my_function():）、クラス内で定義されるのが メソッド。
- メソッドには インスタンスメソッド・クラスメソッド・スタティックメソッド の3種類がある。
- self があるかないかで挙動が変わる。
## Javaの場合
### 設計思想
Java は厳格なオブジェクト指向を採用しており、すべてをクラスの中に閉じ込める設計です。
そのため、トップレベル関数という概念はなく、すべてメソッドとして定義されます。
静的型付けの言語であり、厳格な型チェックと強力なツールサポートが特徴です。

### 関数とメソッドの違い
- Java は基本的に「関数」という概念がなく、すべて メソッド。
- メソッドは必ずクラスの中に属し、トップレベル関数のようなものは存在しない。
- インスタンスメソッドと静的メソッド（static）がある。

## Kotlinの場合

### 設計思想

Kotlin は Java の制約を緩和しつつ、関数型言語の要素を取り入れたモダンな設計を持つ言語です。
トップレベル関数をサポートし、拡張関数（extension function）によってオブジェクトにメソッドのような振る舞いを付加できます。

### 関数とメソッドの違い
- Kotlin は Java と異なり トップレベル関数 を持てる。
- クラス内に定義されるものはメソッド、トップレベルで定義されるものは関数。
- extension function という仕組みで、まるでクラスメソッドのように関数を扱うことも可能。

## Rubyの場合

### 設計思想

Ruby は「すべてがオブジェクト」という哲学を持つ言語です。そのため、関数という概念はなく、すべてがメソッドとして扱われます。
また特異メソッド（Singleton Method）により、オブジェクトごとに異なるメソッドを持つことができ、柔軟性が高いのが特徴です。

### 関数とメソッドの違い
- Ruby はすべてがオブジェクトなので、基本的にはすべて「メソッド」という扱い。
- ただし特異メソッド（Singleton Method） により、特定のオブジェクトにだけ紐づくメソッドを持てる。
- self.method_name でクラスメソッドとして動作させることも可能。

## PHPの場合

### 設計思想

PHP はもともとスクリプト言語としてスタートし、その後オブジェクト指向を取り入れた経緯があります。
そのため関数もメソッドも共存しており、柔軟なプログラミングが可能です。

### 関数とメソッドの違い

- クラス外で定義されるのが関数、クラス内で定義されるのがメソッド。
- public/private/protected などの可視性制御が可能。
- メソッドも static 指定ができる。
# 3. 言語ごとの比較表
以下の表に、各言語の関数とメソッドの違いを簡潔にまとめました。
| 言語   | 設計思想 | トップレベル関数 | メソッドの種類 | 特徴的な点 |
| ---- | ---- | ---- | ---- | ---- |
| Python | シンプルで直感的 | 〇 | インスタンスメソッド、クラスメソッド、スタティックメソッド | `self` の有無で動作が変わる |
| Java   | 厳格なオブジェクト指向 | × | インスタンスメソッド、静的メソッド（クラスメソッド） | すべてクラス内で定義される |
| Kotlin | 柔軟な関数型アプローチ | 〇 | インスタンスメソッド、拡張関数 | トップレベル関数と拡張関数をサポート |
| Ruby   | すべてがオブジェクト | × | インスタンスメソッド、クラスメソッド、特異メソッド | 関数の概念がなく、すべてメソッド |
| PHP    | スクリプト言語からの進化 | 〇 | インスタンスメソッド、静的メソッド（クラスメソッド） | 関数とメソッドが共存 |

# 4. まとめ

本記事では、Python、Java、Kotlin、Ruby、PHP の 5 つの言語における関数とメソッドの違いを比較し、それぞれの設計思想についても紹介しました。

このように、各言語の関数やメソッドの違いを理解することで、言語の背景や設計思想を深く知ることができます。

それぞれの言語がどのような考え方で成り立っているのかを意識すると、より楽しくプログラミングを学ぶことができるでしょう。

各言語ごとの詳しい解説や他のプログラミング関連の記事は、[Python関連学習館](https://programming-mondai.com/)
で紹介しています。

市販のテキストに書いてある程度の知識は全てこのサイトで無料で学習できますので、ぜひチェックしてみてください！
【ChatGPT】GPT-4.5が届きました。

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

　今回は、GPT-4.5が届きました。そのレビューです。

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

***
　では、【本題】です。

　今回は、
　　GPT-4.5が届きました。
　　　そのレビューです。

　まずは、OpenAIからのお知らせ。
　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1897346510821711959?t=hDIJ1-0h6hsG2ABR86yPhA&s=19)

　Plusユーザーに
　　GPT-4.5が開放されます。

　全Plusユーザーへの展開は
　　三日ほどかかる、とのこと。
　　　サムは“数日以内”と言ってるけど。
　　　　→なんと展開終了！はや！

　なお、このGPT-4.5は、
　　研究プレビュー版です。

　週あたり50メッセージの
　　制限があり、
　　　今後、変更される可能性もある。

　私が試していたところ、
　　このメッセージが出ました。
![Screenshot_20250306-122732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/1f9a363e-088d-42c2-8a0a-addbf2f8933b.png)

　GPT-4.5について
　　詳しいことは、こちらをどうぞ。
　　　[【ChatGPT】GPT-4.5のご紹介です。](https://qiita.com/kabumira/items/6d707c1c156a97956baa)

***
　私のところに
　　届きましたので、
　　　試してみました。

　Web版・Androidアプリ版ともに
　　到着を確認しました。

　モデル変更して
　　使います。

　ナレッジカットオフは
　　2023年10月です。

　出力速度は
　　GPT-4oに比べて遅いです。
　　　でもアクセス量によって
　　　　変わるような印象があります。

　ハルシネーションですが、
　　GPT-4oが推測していた
　　　“スマホ熱中症”は
　　　　Web検索して
　　　　　正しい回答を出しました。

　　もちろん、
　　　ハルシネーションが
　　　　なくなったわけでは
　　　　　ありませんので、
　　　　　　確認は必須です。

　高いEQ（感情知能）を持つモデル、
　　という話なので、
　　　回文を作ってもらいました。

　GPT-4oと比較します。
 
***（GPT-4o）***
新しい回文を作りました！

1. 「犬も歩けば棒に当たる、るたあに棒れば歩も犬」
（ことわざ風の回文）

2. 「トマトがまたトマト」
（トマト好きな人向け）

3. 「今日の夜は話すは夜の良き」
（夜の雰囲気を表す回文）

どれが気に入りましたか？ また、別のテーマで作ることもできますよ！

***（GPT-4.5）***
シンプルな回文を作りました。

「竹藪焼けた（たけやぶやけた）」

もう一つ、少し面白い回文も作りました。

「世の中ね、顔かお金かなのよ（よのなかねかおかおかねかなのよ）」

他にご希望があれば教えてください。
***

　GPT-4oは、惜しいがダメでした。
　GPT-4.5は、きちんと回文しました。

　少なくとも
　　以前よりは、
　　　日本語を理解している
　　　　感じがしますね。

　ほかにいくつか試したところ、
　　Web検索、DALL-E3、
　　　Code Interpreterが
　　　　使えることを確認しました。

　画像解析もしてみましたが、
　　少し良くなっている気がします。

　とりあえず、
　　今回は、こんなところです。

　GPT-4oとの違いが
　　それほどはっきりしていませんので
　　　GPT-4.5の必要性が
　　　　あまりないようにも
　　　　　感じます。

　しかし、
　　文章を書く上では
　　　とても良さげに
　　　　思えました。

　それでも
　　回数制限がありますので、
　　　GPT-4oのように
　　　　使いまわすわけには
　　　　　いきませんけど😅

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

　今回は、ここまで。
自分がエンジニアだと思っていたら恥をかいた話

## はじめに
IT業界に身を置き、毎日仕様と戯れ、しばしば不具合と相撲を取り、時にはサーバーと喧嘩する日々を送っています。
* 独立系SIerでアレコレ10年以上従事
* 名刺にも堂々と「システムエンジニア」と記載

## 話の始まり 
レビューで火あぶりにされた帰路「エンジニア向け転職説明会」という広告を見つけました。
心が荒んでいたこともありその場でスマホポチポチエントリー
きちんと調べもしないままあっという間に当日、スーツをビシッと着込んで意気揚々と会場へ。

## 違和感の始まり
会場に着くなり違和感を感じる
周りを見渡すと
* 「○○重工業」のバッジをつけた人
* 「製造プロセス」について熱く語り合う人々
* 設計図らしき資料を持った人

（あれ...？なんか違う...？）
（いやでも...とりあえず企業ブースを見てみよう...）

## 深まる違和感
説明会が始まり、企業ブース担当が話し始めます。

企業担当「本日はエンジニアの皆様にお集まりいただき...」
企業担当「特に自動車業界、重工業界でのキャリアをお持ちの方々に...」

(ん...？)

企業担当「設計、製造の実務経験を活かして...」

(あれ...？)

## 恐怖の会話
企業担当「皆様はどの様な経歴をお持ちですか？」
- 周り1:「自動車のエンジン設計してました」
- 周り2:「工作機械の開発に携わってます」
- 周り3:「航空機の部品設計やってました」

そしてついに私の番が...
 「私はエンジニアとして...あの...C#を...（周りの視線が突き刺さる）...AWSを...（冷や汗）」

## 気づき
そこでようやく理解しました。世間一般での「エンジニア」とは
* 機械を設計する人
* 製品を作る人
* モノづくりのプロフェッショナル

IT業界で私が使っていた「エンジニア」は世間一般での「エンジニア」とは違ったのです。

## 念のため確認
勇気を出して会場スタッフに話しかけました。

私「あの、私、IT系のエンジニアなんですけど...」
コンサルタント「あ...（困った顔）」
私「やっぱりここは...」
コンサルタント「申し訳ございません。IT業界は別の説明会がございまして...」

始まったばかりの転職説明会を後目にそそくさと退散しました

## 得られた教訓
1. 業界用語に注意
    * 当たり前と思っていることが、実は特殊かも
    * 世間一般の常識を知ることの大切さ


2. 正確な自己紹介の重要性
    * 「エンジニア」→「ITエンジニア」
    * より具体的に「システムエンジニア」や「ソフトウェアエンジニア」

3. 視野を広げることの大切さ
    * IT業界の外の世界を知る
    * 他業界との交流も大事

## おわりに
恥ずかしい経験って中々忘れられませんよね
皆さんも「エンジニア」という言葉を使う時は気をつけましょう！
consabot の紹介 - サボりたいあなたのためのジョークボット

こんにちは、たなかです。仕事や学習に疲れた時に、ちょっとサボりたいことってありませんか？そんなあなたのために、たなかは `consabot` を作りました。

`consabot` は、コンソール操作を乱して、いい感じにサボれるようにするジョークボットです。コンセプトは「console + sabotage + bot」。そう、`consabot` は「サボる人ためにコンソールを動かすボット」なのです。

## 作成の動機

プログラムの方針を考えている時、手を動かしていないし、目をつぶっていることもあります。しかし、オフィスの後ろの席には上長がいて、この状態を見られると「サボっているのでは？」と思われかねません。そこで、「PCが働いているように見せることができればいいのでは？」と思い立ち、`consabot` を作ることにしました。

## 動かし方

使い方は簡単。下記の手順で実行できます。

1. **依存関係のインストール**

   ```bash
   npm ci
   ```

2. **プログラムの起動**

   ```bash
   npm run start
   ```

3. **プログラムの停止**

   `Ctrl + C` で止められますが、時々言うことを聞かないことがあります。その場合は `kill` コマンドなどを駆使してがんばってください。

## こだわりポイント

`consabot` は、PCが働いているように見せるために、以下のような挙動をします。

- 適当な間隔でターミナルに意味ありげなメッセージを表示します。
- ランダムなプロセスをリストアップしたり、CPU使用率を表示したりして、それっぽい雰囲気を出します。
- まるで何かの処理が進んでいるように見せかけることで、サボりをサポートします。

## プログラムの紹介リンク

`consabot` のソースコードは GitHub で公開しています。
[GitHub リポジトリ](https://github.com/htanaka0828/consabot)

## 最後に

この記事は ChatGPT を使って書かれました。また、プログラムコードの一部には GitHub Copilot の助けも借りています。

あなたも `consabot` で、いい感じにサボってみませんか？
【Windows11】Thunderbirdでメッセージフィルタ設定手順

# はじめに

- Windows11からツールバーが消えたことに伴い、メッセージフィルタ設定するのに少し手間取ったためまとめます

# 手順

- 宛先、件名箇所で右クリックしフィルタを作成を押下
- 以前と同様のメッセージフィルタ設定がでてきます

# おわりに

- ショートカットがあれば知りたいです