OmniAICreator/Qiita-1.07M huggingface dataset:
Databricks Container Serviceを用いたクラスターへのSSH接続

こちらの続編です。

https://qiita.com/taka_yayoi/items/1cc43ffdd41935491519

そして、こちらの知見も活用しています。

https://qiita.com/taka_yayoi/items/639700b77459ff5c491c

こちらでDatabricksクラスターのランタイムとして使用できるDockerイメージが公開されていますが、`standard`などとなっているものは、デフォルトではsshdが動いていません。

https://hub.docker.com/r/databricksruntime/standard

SSH対応版のDockerファイルが公開されていますが、若干修正が必要でした。

https://github.com/databricks/containers/blob/master/ubuntu/ssh/Dockerfile

以下のDockerfileでDockerイメージを作成します。[こちら](https://stackoverflow.com/questions/22886470/start-sshd-automatically-with-docker-container)を参考に`ENTRYPOINT`を使ってsshdを起動しています。

```dockerfile
FROM databricksruntime/standard:13.3-LTS
RUN apt-get update \
  && apt-get install --yes openssh-server \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENTRYPOINT service ssh restart && bash
```

```sh
docker build -t  takaregistry.azurecr.io/ssh_custome_image:13.3 .
```
```sh
docker push takaregistry.azurecr.io/ssh_custome_image:13.3
```

クラスター作成時にレジストリのイメージを指定します。
![Screenshot 2024-08-26 at 9.11.56.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/91993cf3-a5a0-9bf4-42b9-f07f408ebb49.jpeg)

SSHの設定をします。
![Screenshot 2024-08-26 at 9.11.01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/771b8180-db24-7ce4-4676-04e92e170670.jpeg)

クラスターが起動したら、クラスターにノートブックをアタッチしてsshdの動作を確認します。

```sh
%sh
ps aux | grep ssh
```
```
root           1  0.0  0.0   2892   988 pts/0    Ss   00:03   0:00 /bin/sh -c service ssh restart && bash /bin/bash
root          26  0.0  0.0  15432  1824 ?        Ss   00:03   0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
root         930  0.0  0.0   3852  1968 ?        S    00:04   0:00 grep ssh
```

sshdが動いてます。

ローカルマシンのターミナルからSSHで接続します。

```sh
ssh ubuntu@48.218.5.173 -p 2200 -i /Users/yayoi/.ssh/id_rsa
```
繋がりました！
![Screenshot 2024-08-26 at 9.13.55.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c673cf5d-a8f3-c672-80bd-ed279cc72dda.jpeg)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Scratch ライブラリ（スコア表示）

# Scratch ライブラリ（スコア表示）

さて、Scratch ライブラリ化計画第 2 弾は、「**スコア表示**」です。利用価値が高そうなので。

Scratch では変数の値を表示できますが、オシャレな感じで表示したいときはスプライトのコスチュームとして用意しないといけません。それをやってくれるものです。

というか、普通に応用可能で、変数を入れ替えるだけでスコアに限らず数値表示のライブラリとして使えます。

# スコア表示

## プロジェクト

ここにあります。
https://scratch.mit.edu/projects/1048315967/

> 海外の方から英語版が欲しいと言われたので作りました！
> https://scratch.mit.edu/projects/1054091419/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/6bab3af3-2582-2796-ad9b-abf8848023e6.png)

## ライブラリ概要

スコア表示機能のライブラリ化です。

* 「スコア」という名のグローバル変数に応じた値に数値を更新します。

## 使い方

### 基本

* 「スコア」というグローバル変数の値を変更するだけで自動的に反映されます。

### その他

1. ダークモードの色などは適宜以下のイベント受領時の設定を変更する
  * 「ダークモード・オン」
  * 「ダークモード・オフ」

## 各種情報

### 変数・リスト
> In: 他スプライト管理の値を参照／Out: 本スプライトで設定

| 変数名 | In/Out |        概要        |
| ------ | :----: | ------------------ |
| スコア |   In   | 表示するスコア数値 |

### イベント

#### 「ダークモード・オン」

ダークモードでの表示に変更します。具体的に言うと、グレーアウトされている「0」の数字が背景に合わせて暗いグレーにされています。

#### 「ダークモード・オフ」

ライトモードでの表示に変更します。具体的に言うと、グレーアウトされている「0」の数字が背景に合わせて明るいグレーにされています。

### コスチューム

用意されているフォントは以下の 3 種類です。

| 表示フォント種別 |         イメージ         |             概要             |
| :--------------: | :----------------------: | ---------------------------- |
|       数字       |  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/c16c656a-4982-6092-ab0c-ff9df7217439.png)  | 通常の数字フォント           |
|    デジタル1     | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/3374747b-bce9-94d9-4dcc-f7d2e02d1355.png) | デジタル表示フォント         |
|    デジタル2     | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/541844c5-10bb-fe30-dd61-bc95a23820bf.png) | デジタル表示フォント（斜体） |

## 拡張ポイント

### SCORE 文字列

必要に応じてコスチュームを変更します。「数字・デジタル1・デジタル2」の 3 種類でそれぞれ 6 種類あるので、6 箇所変更します。それぞれごとに異なるコスチュームを用意できますが、すべて共通でも構いません。ダークモードとライトモードで共通に使うには **赤（色番号 0）を基調とした色** にしておくと、色変更の際に数字の色と合わせることが可能です。また、コスチュームを変更する際はその右端が中心に合うように揃え、高さは適宜数値に合わせて修正してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/ca91892b-bbdb-e2fb-058b-a9d125fcd9cf.png)

> コスチュームを変えます。

### 初期設定値の変更

初期設定値を書く場所は「初期化」ブロックに集約してあります。初期値を変えたい場合はここの値を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/e54e88c3-bdd5-7b5a-a1bc-aa6f25d79be7.png)

> 左が日本語版、右が英語版。

### 色の変更

初期値ではライトモードで 0、ダークモードで 33 (元が赤基調の場合、黄色) です。それぞれの色を変更したい場合は、以下のイベントを受け取ったときの色を変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/6fcf1e77-ff43-260d-d29f-16f09b602f7f.png)

---


---

> [Scratch ライブラリと Scratch Tips 目次へ戻る](https://qiita.com/Kray-G/items/e1900d5b6c6dcfbe5321/)
RXマイコンのスタック

RX210ではデフォルトで以下のようなリンカースクリプトが作られます。

```
        .ustack 0x200: AT(0x200)
        {
                _ustack = .;
        } > RAM
        .istack 0x100: AT(0x100)
        {
                _istack = .;
        } > RAM
        .data 0x204: AT(_mdata)
        {
```

ustackはユーザーモードのスタックでistackは例外および特権（スーパーバイザー）モードでのスタックです。

dataには初期化された変数とされてない変数(BSS)が含まれます。初期化された変数はROMからコピーされます。

スタックは物理メモリの最後ではなく先頭に設定されます。なのでサイズが重要です。こうすることでメモリサイズが変わったターゲットでも同じ設定でリンクできます。

実際のメモリ配置は以下のようになります。

![RX-STACK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4d6eb8cb-50d0-064e-3ece-a009cc11cdf2.png)

常に特権モードでユーザーモードに入らない場合は、ustackは使われないものと思われます。

GR-CIRTUSは物理メモリの最後にスタックを設定していました。
(QA) IBM i Db2 for i のRCACを設定するとODBCでどのように見えますか？（行、列をユーザーID他でマスキング）

首記のご質問をいただき簡単にテストしてみました。

## RCAC + WINDOWS11 ODBCのテスト概要

下記の環境でテストしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/131514a2-6124-56d0-a193-8021c1a29900.png)


RCAC：行列レベルアクセス制御：Row and Column Access Control の略です。

### 手順①　マスクしていない売掛残データ TKUZAN　の確認

下記の左から3つ目のカラムがサンプルデータです。
QEOLに含まれるTOKMSPをコピー、リネームしたものです。

**売掛残 TKUZAN カラムを列マスクでマスキングしてみます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a2f0be6d-2ab9-4cb8-ce5c-9e5d35c1fc6c.png)

### 手順②　RCACで列マスク

**RCACの設定は全てSQLから実行します。**

下記のサンプルSQLをACのスクリプト実行画面から流しました。（インフォセンター記載のサンプルを改修・簡略化したものです。）

**黄色部がユーザーID毎のアクセス制御（列マスク）をかけている行です。

***CREATE MASK SQL文を実行するユーザーはSECOFRクラスであっても追加で以下例のようにQIBM_DB_SECADM機能の使用権限の付与が必要です。***

```
CHGFCNUSG FCNID(QIBM_DB_SECADM) USER(GOMA) USAGE(*ALLOWED)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f6a2f0e0-b71a-76c0-47b0-4b7266f67684.png)

コピペはコチラから。
```
CREATE MASK GOMALIB.MASK_TKUZAN ON GOMALIB.TOKMSPRCAC
   FOR COLUMN TKUZAN RETURN
      CASE
         WHEN (VERIFY_GROUP_FOR_USER(SESSION_USER,'GOMA') = 1)
            THEN TKUZAN
         WHEN (VERIFY_GROUP_FOR_USER(SESSION_USER,'GOMA2') = 1)
            THEN  999999999
         ELSE 88888888
      END
   ENABLE;

COMMIT;

ALTER TABLE GOMALIB.TOKMSPRCAC
   ACTIVATE COLUMN ACCESS CONTROL;

COMMIT;

SELECT *  FROM GOMALIB.TOKMSPRCAC;
```

### 手順③　テスト結果

**一般ユーザー：GOMAでODBC接続した際は、2つ上の画像のようにTKUZANカラムの値がそのまま表示されます。

**制限ユーザー：GOMA2でODBC接続した場合、下記のようにTKUZANカラムが99999999 と表示されます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/313e34ef-f6b8-7eae-5dc8-d624685b1b1d.png)


**制限ユーザー：GOMA3でODBC接続した場合、下記のようにTKUZANカラムが88888888 と表示されます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8a80dab9-6a93-1214-5b3c-1f423522c426.png)

## テスト結果から考察
・列MASKはそのカラム（フィールド）の属性に合わせて設定する必要があります。
　- 今回、TKUZANは数値フィールドのため、Null , 文字列は指定できませんでした。

今回のサンプルではTKUZANという数値フィールドをSQL文で操作していますが、別なSQL文の指定(CASE式の別な書き方）で列MASKを設定すれば、結果的に数値フィールドもNULL値で表示できます。
[続きの記事はこちらです](https://qiita.com/gomAnomalocaris/items/abc5952e7213a1dd5af9)

## 参考URL

インフォセンターIBM i 7.5 : IBM i SQL CREATE MASK ステートメント
https://www.ibm.com/docs/ja/i/7.5?topic=statements-create-mask
sessionId のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)



+ [Salesforceの内部からREST APIをコールする場合の検討](https://qiita.com/Keiji_otsubo/items/e43887e903c1300e6ab9)
+ [Aura Enabledリクエストでは、セッションIDがAPI呼び出しを行うことができない](https://qiita.com/Keiji_otsubo/items/11a32bff558e49ec91bd)
+ [Apex Method is throwing error when called it from Js and it's working fine when called it from anonymous window.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007T45IISAZ)
+ [開発者コンソールの「Open Execute Anonymous Window」で実行した時に値は取得できるのですが、LWCでボタンを作成して実行すると値が取得できません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007er1lO)

:::note
そういえば、AuraコンポーネントでMeta Data APIを操作した時に同じようにSessionId でエラーになりましたね。AuraではSessionId を扱えなかったので、LWCでも同じかもしれません。

その時は、以下の回答を参考にして回避できました。
https://salesforce.stackexchange.com/questions/110515/getting-session-id-in-lightning
:::

+ [DocuSignとCongaの統合](https://qiita.com/Keiji_otsubo/items/1ea1e472df7759932ccf)
+ [Apex Wrapper SalesforceメタデータAPI（apex-mdapi）で指定ログイン情報の使用](https://qiita.com/Keiji_otsubo/items/43f633ae40495cf1e984)
IBM Power S1014 で AIX - RHEL 間のsftp でのファイル送受信時間の確認

#### はじめに


AIX <-> RHEL 間で sftp で 10GB ファイルを get/put した際の時間・速度を確認する機会があり、結果を記載します。



----
#### 環境


HW: IBM Power S1014

OS: 
　AIX 7.3 TL1 SP1
　RHEL 9.0 (ppc64le) 

VIOS 環境
SAN boot

<br>

* 構成イメージ図

![スクリーンショット 2024-08-26 15.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/a8bfd1ec-a886-e12e-0238-45f3f612ee41.png)



・AIXおよびRHELは、同一筐体上のVirtual I/O Clientです。
・検証時はほかのVIOCが何も動作を行っていない、影響を受ける可能性が少ないタイミングで実施しています。
・CPU/メモリ・リソースは同じ。(CPU 0.2, Memory 2GB) 
・AIX、RHEL ともにOSチューニングはデフォルトのまま

----

#### 準備

##### AIX で 10GB ファイルを dd コマンドで作成

```
# time dd if=/dev/zero of=10GB_file bs=1M count=10240
10240+0 records in
10240+0 records out

real    0m28.49s
user    0m0.01s
sys     0m8.12s

```

AIX の 10GB ファイルの作成は 29秒程度でした。


##### RHEL で 10GB ファイルを dd コマンドで作成

```
# time dd if=/dev/zero of=10GB_file bs=1M count=10240
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 7.48414 s, 1.4 GB/s

real	0m7.486s
user	0m0.847s
sys	0m0.000s

```

RHEL の 10GB ファイルの作成は 7.5 秒程度でした。


---


### RHEL から操作の場合

#### RHEL から sftp で AIX の 10GB ファイルを get する


```
sftp> get 10GB_file
Fetching /work/10GB_file to 10GB_file
10GB_file                                      100%   10GB  65.4MB/s   02:36
sftp>
```


#### RHEL から sftp で AIX に 10GB ファイルを put  する


```
sftp> put 10GB_file
Uploading 10GB_file to /work/10GB_file
10GB_file                                      100%   10GB  67.5MB/s   02:31
sftp>

```


RHEL 側からの sftp 処理は、get/put ともに2分35秒程度でした。

---

### AIX から操作の場合

#### AIX から sftp で RHEL の 10GB ファイルを get する

```
sftp> get 10GB_file
Fetching /work/10GB_file to 10GB_file
/work/10GB_file                                100%   10GB  79.6MB/s   02:08
sftp>
```



#### AIX から sftp で RHEL に 10GB ファイルを put する

```
sftp> put 10GB_file
Uploading 10GB_file to /work/10GB_file
10GB_file                                     100%   10GB  81.1MB/s   02:06
sftp>
```


AIX 側 からの sftp 処理は、get/put ともに2分10秒弱でした。


---


#### 結果と考察

・Local Disk (SAN boot の OS領域) に10GB ファイルを作成する際は、RHEL の方が比較的、作成時間が速かった。
　=> I/O 処理は RHEL の方が速い？
 
・RHEL 側で sftp を実行するより、AIX 側で実行した方が get/put ともに速かった。
　=>別のタスクによるネットワーク影響はないはずなので、OS のネットワーク処理速度の違い？


 OS のカーネル・パラメーターをチューニングすれば変わってくる可能性はありますが、今回はここまでにします。

<br>

以上です。
【Next.js】Husky と lint-staged でコミット前に ESLint と Prettier を実行する

# はじめに
この記事では、Next.js 環境において Husky と lint-staged を利用してコミット前に ESLint と Prettier を実行する手順を記載します。

## Husky とは

https://typicode.github.io/husky/

- Git hooks を簡単に管理するためのツール
- コード品質を担保するために利用される
- Git hooks とは、Git ワークフロー（コミット前後、プッシュ前など）で実行されるスクリプト

## lint-staged とは

https://github.com/lint-staged/lint-staged

- Git でステージ上の（変更された）ファイルに対してスクリプトを実行するためのツール

# 開発環境
開発環境は以下の通りです。

- Windows 11
- Next.js 14.2.4
- React 18.3.1
- TypeScript 5.5.2
- Husky 9.1.5
- lint-staged 15.2.9
- ESLint 8.57.0
- Prettier 3.3.3

# Husky と lint-staged のインストール
まずは Husky と lint-staged のインストールします。

```powershell
npm install --save-dev husky lint-staged
```

# Husky の初期化
Husky の初期化コマンドを実行します。

```powershell
npx husky init
```

実行後、以下2点が追加されます。

- `"prepare": "husky"` スクリプトの追加
- `.husky` フォルダの追加

## `"prepare": "husky"` スクリプトの追加
`package.json` の `scripts` に `"prepare": "husky"` が追加されます。

```package.json
{
  ...,
  "scripts": {
    ...,
    "prepare": "husky"
  },
  ...
}
```

`prepare` は `npm install` 前に自動で実行されます。

https://docs.npmjs.com/cli/v9/using-npm/scripts#life-cycle-scripts

## `.husky` フォルダの追加
`.husky` フォルダ内には `pre-commit` ファイルと `_` フォルダが含まれています。`pre-commit` の中身は以下の通りです。

```pre-commit
npm
```

`pre-commit` で lint-staged を実行するために中身を書き換えます。

```pre-commit
npx lint-staged
```

# lint-staged の設定
`package.json` に `"lint-staged"` を追加して、ESLint と Prettier を実行するスクリプトを記載します。

```package.json
{
  ...,
  "lint-staged": {
    "src/**/*.{ts,tsx,json,css,scss}": [
      "prettier --write",
      "next lint --fix --dir src"
    ]
  }
}
```

以上で設定完了です。

# 参考
- [ESLint](https://nextjs.org/docs/app/building-your-application/configuring/eslint)
- [Get started](https://typicode.github.io/husky/get-started.html)
- [Life Cycle Scripts](https://docs.npmjs.com/cli/v9/using-npm/scripts)
- [lint-staged](https://github.com/lint-staged/lint-staged)
【React】下層にあるpackage.jsonに書いてあるコマンドを実行したい場合

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回は、下層にあるpackage.jsonに書いてあるコマンドを実行したい場合があったので、その方法について調べたことをまとめてみます。

# ディレクトリ構成

```
app
├ src
│   └package.json
└package.json
```
`app`の直下にある`package.json`のコマンドを実行させることで、`app/src`にある`package.json`のコマンドを実行させたかったです。

# 実装方法

```json:app/package.json
  "scripts": {
    "lint": "npm --prefix ./src run lint"
  }
```
こんな感じで`--prefix`を使用することで実現することができました。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考
https://docs.npmjs.com/cli/v7/commands/npm-prefix
GNUアセンブラ(x64)のサンプル

# 環境
- WSL / Ubuntu

# hello, world

```fig1.s
# Assembly (as, x64, Linux)
# as -al -o fig1.o fig1.s
# ld -o fig1 fig1.o

.intel_syntax noprefix

.equ	sys_write, 1
.equ	sys_exit, 60

.section .rodata
msg:	.ascii	"hello, world\n"
.equ	len, $ - msg

.text
.global _start
_start:
	mov	edx, len
	lea	rsi, msg
	mov	edi, 1	# stdout
	mov	eax, sys_write
	syscall

	xor	edi, edi
	mov	eax, sys_exit
	syscall
```

https://tio.run/##XY9BT8MwDIXPya@wVg4gpRWV0A67cecnIFVe641IaTJil6W/vni0MIlLLL/3PusFmWk8hrlGXpYKXrcVHpEdlP2Lgzcfp/JkK0CGGgPUCU7@3DbbYHXC8KtulrWNj0Kh4zkKFojpkunki@r0ORmeubtmL@SgvStUvDjYP2uIqRefIjQ5DShoRz4fTIPce292HxRCcnBNOQzvcbceCBQdPEANGtUDQkVscw7pqI07Fsxi13GwZkxfhobiQCGrJJrM3v2Qm6dbaypgGdIkm4gK/BW3t8Y9hmCtKSmviD7/srcv3aPL8g0

`fig1b.s`

https://tio.run/##TZDBasMwDIbP9lOI5rKBE1YYPRR22H2PUChKYmcGxR6W2jovP89b0m0XCX36fgRCZjv3tLTIpTTwuo3wgGwgH54NvPlwyY@6AWRokaCN4Py077t757qj8Zfft1p3PoilMy9BMEOIH8k6nysXm0XPPB1Vhzx4r3bvligauMVE4ynsNNkAL9BBC1WriYliX2@fWTCJXttRqzlelR2zgeqvU2JvIDrHVn6im1LhXqkGWMZ4kY1i3ugtebFa8cIDEmmtckxrqJZ/8uHp27bZy59cyufgCCcu9Tlf

Cコンパイラで-Sオプションを付けてアセンブリリスト（.s）を出力すると参考になる。

```fig2.c
// cc -S -fno-asynchronous-unwind-tables -masm=intel -O2 fig2.c
// cc -o fig2 fig2.c

const char msg[6] = "hello\n";

void main(void)
{
	write(1, msg, 6);
}
```

# アセンブリからCライブラリ関数を呼ぶ

```fig3.s
# as -al -o fig3.o fig3.s
# cc -o fig3 fig3.o

.intel_syntax noprefix

.section .rodata
msg:	.asciz	"hello, %d\n"

.text
.global main
main:
	sub	rsp, 8

	mov	esi, 42
	lea	rdi, msg[rip]
	xor	eax, eax
	call	printf

	xor	eax, eax
	add	rsp, 8
	ret
```

# Cからアセンブリ関数を呼ぶ

```fig4.c
// cc -o fig4 fig4.c fig4a.s
#include <stdio.h>

int hoge(int);

int main(void)
{
	printf("%d\n", hoge(42));
}
```

```fig4a.s
.intel_syntax noprefix

.text
.global hoge
hoge:
	mov	eax, edi
	add	eax, eax
	ret
```

# インライン・アセンブラ

```fig5.c
// C (gcc) -masm=intel
// cc -masm=intel -o fig5 fig5.c
#include <stdio.h>

// 戻り値：rax
// 引数：rdi rsi rdx rcx r8 r9
// 退避：rbx rbp rsp r12-r15
int hoge(int a, int *b, int *c, int *d)
{
	__asm__("\
	push	rbx		;\
	mov	r8, rcx		;\
	mov	r9, rdx		;\
	mov	eax, edi	;\
	cpuid			;\
	mov	[rsi], ebx	;\
	mov	[r9], ecx	;\
	mov	[r8], edx	;\
	pop	rbx		;\
	");
}

int main(void)
{
	for (int i = 0x80000002; i <= 0x80000004; i++) {
		int b, c, d;
		int a = hoge(i, &b, &c, &d);
		printf("[%.4s%.4s%.4s%.4s]\n",
			(char *)&a, (char *)&b, (char *)&c, (char *)&d);
	}
}
```

https://tio.run/##TZLNasJAEIDPu08xpFQSTayKQiTaSx9DReJujAvmh41KoAi2p9K7l577AL1X6MMUBU99g6azUZoNTGbmm5@dWZY5IWNFcXcHD2CiaYET@Vk0FPEqWFLEjOkEnATmIuyVvyajNyJmyzUPYJCtuEiai3uqik4vn9/Pr8fd@8/hTfq5QsfD/rT/UD4XIDMUnoNkKC7Ivso473bnpy@VMUM6SzELpd1xZLtH8XRYJGFgKsO3Qan67KrZVXOLPlIyneK406lpjClJ19mCYD9CPPSiZEOka6tjNdC31SwVCPzchoCLErB0LTipgiMcfYJhbFmhviJMJ64i/ELSJK1GMCyPbmm5TuSL2Nwk4jL1PJFQLidgCK3cbZVfx0N/oIEugkbDAqwgKhuvALfn3tX1sfhyTTbUMFbDYI1bKpxKTJibxui22c10mYxjw8YEYrKFL6Fu1fB@/@2ZZjPNLptucZei@GXzpR9mhfZO/gA
高位合成言語 PipelineC その2

# 概要
高位合成言語 PipelineCを見つけたので、やってみた。
blink.cのテストベンチ、書いてみた。


# サンプルコード

```

module test;
	reg clk;
	wire out;
	top u(.clk_33p33(clk), .blink_return_output(out));
	initial
	begin
		clk = 0;
	#10000
		$finish;
	end
	always
	#1
		clk = ~clk;
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, u);
	end
endmodule

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2dae85de-aaef-69a4-78cb-11fb7770f9d0.png)


以上。
お菓子の詰め合わせ (paizaランク A 相当)：Python3解答例

[ お菓子の詰め合わせ (paizaランク A 相当)](https://paiza.jp/works/mondai/a_rank_skillcheck_archive/school_hiking)

https://paiza.jp/works/mondai/a_rank_skillcheck_archive/school_hiking

## 背景
A 君は学校の遠足に持っていくお菓子を買わなければなりません。しかし、学校のルールにより、お菓子の総額は指定範囲内に収めなければなりません。
そこで、指定金額ギリギリまで使って、なるべく色々な種類のお菓子を食べたいと思った A 君は買うお菓子を決めるために、学校のルールと自分の要望を踏まえて以下の基準を満たす買い方をすることにしました。

:::note info
・お菓子の総額を指定範囲内

・種類の数を最大にする

・同じお菓子は複数買わない

・お釣りを最小

・お釣りを最小にすることよりも種類の数を最大にすることを優先する
:::

お菓子の値段が書いてあるリストが与えられるので、A 君の代わりに、上記ルールを満たすお菓子の組み合わせを指定範囲内の最大の金額で買ったときのお釣りを求めてください。ただし、少なくとも一種類は指定範囲の値段で買えるものとします。

入力例 1 の場合は、以下のように、指定範囲の金額で最大 2 個買えます。そして、そのうち最小になるお釣りの金額は 20 円になります。
![スクリーンショット 2024-08-25 13.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/de6298ad-5362-234b-a938-151be64971e2.png)


## コードの説明

### **`combinations` 関数の定義**
   - `combinations` 関数は、Python標準ライブラリの `itertools.combinations` と同じ機能を提供します。
   - これは、与えられた `iterable` から `r` 個の要素のすべての組み合わせを生成します。
   - 例えば、`combinations('ABCD', 2)` は `('A', 'B')`, `('A', 'C')`, `('A', 'D')`, `('B', 'C')`, `('B', 'D')`, `('C', 'D')` を生成します。

```python
def combinations(iterable, r):
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)
```

### **入力の読み込み**
   - 最初に、選択できるお菓子の種類 `N` と指定制限金額 `money` を読み込みます。
   - 続けて、`N` 個のお菓子の値段をリスト `All` に格納します。

```python
N, money = map(int, input().split())
All = []
for n in range(N):
    All.append(int(input()))
All.sort()
```

### **最大の種類数を決定する**
   - `All` リストを昇順にソートし、できるだけ多くの種類のお菓子を購入できるようにします。
   - `temp` にお菓子の合計金額を加算し、`money` を超えるかどうかをチェックします。超えた場合はループを終了します。
   - `count` は購入可能な最大の種類数を表します。

```python
temp = 0
count = 0
for i in All:
    temp += i 
    if temp > money:
        break
    count += 1
```

### **お釣りの計算**
   - お菓子のリスト `All` から `count` 種類の組み合わせを生成し、それぞれの合計金額 `s` を計算します。
   - `s` が `money` 以下であれば、`money - s`（お釣り）をリスト `temp` に追加します。

```python
temp = []
for i in combinations(All, count):
    s = sum(i)
    if s <= money:
        temp.append(money-s)
```

### **最小のお釣りを出力**
   - 最後に、リスト `temp` の中から最小の値（最小のお釣り）を出力します。

```python
print(min(temp))
```

### 例

入力例:
```
5 100
20
30
50
70
90
```

この場合、最適な結果として `20` が出力されます。これは、30円と50円のお菓子を選んだ場合の合計が80円で、100円からの差額（お釣り）が20円であるためです。
2024/8/26主にITとかセキュリティの記事

クリプトクライム（暗号資産犯罪）2023 ：パート2(8/23)
https://www.trendmicro.com/ja_jp/research/24/h/crypto-crime-2024-report-part-ii.html

ニデック、子会社で顧客情報など40万件が漏えい　ランサムウエアに感染(8/24)
https://www.netdenjd.com/articles/-/306132

ランサムウェア攻撃が急増！2024年に企業が強化すべきセキュリティ対策
https://cybersecurity-park.com/2738/

Amazonと中国越境ECの競争激化…なぜ消費者はTemuよりも悪徳業者が多いAmazonを信頼するのか＝牧野武文(8/24)
https://www.mag2.com/p/money/1491003

中国、ホワイトハッカーをサイバー攻撃に動員か(8/24)
https://www.nikkei.com/article/DGXZQOUE046UC0U4A700C2000000/

偽AI画像ツールを餌に認証情報を窃取するソーシャルメディア・マルバタイジングの手口(8/23)
https://www.trendmicro.com/ja_jp/research/24/h/malvertising-campaign-fake-ai-editor-website-credential-theft.html

米国大学は外国勢力によるスパイ活動とプロパガンダの温床になっている(8/24)
https://courrier.jp/columns/374059/

空港や鉄道などインフラ、サイバー防御で専門組織 国交省(8/24)
https://www.nikkei.com/article/DGKKZO82994530T20C24A8EA4000/

数百のオンラインストアを狙うサイバー攻撃が進行中(8/24)
https://news.mynavi.jp/techplus/article/20240824-3010845/
https://news.infoseek.co.jp/article/mynavi_2805103/?tpgnr=it

PHPの緊急脆弱性が狙われる、大学に未知のバックドア(8/24)
https://news.mynavi.jp/techplus/article/20240824-3009527/

サイバーセキュリティの欠陥は、知名度の高い自転車レースを頓挫させる可能性がある(Cybersecurity Flaws Could Derail High-profile Cycling Races)(8/24)
https://tiisys.com/blog/2024/08/24/post-142497/

【第58回】ビッグウェーブに乗るために、Ryzen AIのドライバをビルドしてみた(8/24)
https://pc.watch.impress.co.jp/docs/column/ubuntu/1618141.html

Androidユーザーのキャッシュカードを悪用し現金を盗む手口が明らかに(8/24)
https://news.mynavi.jp/techplus/article/20240824-3010861/

LiteSpeed Cacheプラグインに緊急の脆弱性、500万超のWebサイトに影響(8/24)
https://news.mynavi.jp/techplus/article/20240824-3010149/

Googleレンズがブラウザでも使えるように　AIを活用した新機能追加、Google Chrome(8/24)
https://atmarkit.itmedia.co.jp/ait/articles/2408/24/news043.html

Google、Google Playアプリの脆弱性報奨金プログラムを終了(8/24)
https://news.mynavi.jp/techplus/article/20240824-3010720/

太陽光発電で防災無線に障害の恐れ、東京都のパネル設置義務化を前に総務省が警鐘(8/23)
https://xtech.nikkei.com/atcl/nxt/column/18/00989/081500157/
Laravel11で管理画面を作るのにFilamentをインストールしてみる

管理画面の作成に、以前は`Laravel-Admin`を使ったことがあるのですが、更新が止まっているようなので新たに`Filament`を使ってみようと思います！
まずはFlamentの導入するための備忘録になります

# 環境
- PHP8.2
- Laravel11
- Laravel Sailで環境構築、Dockerで起動中

環境構築に関しては、こちらを参考にしてください！

https://qiita.com/curacao/items/892109e579c377b9b4b8

# Filamentとは？
簡単にまとめると
- 無料のLaravelの管理パネルツール
- ドキュメントが充実していて、コミュニティも活発
- シンプルなので手軽に導入をできる
- Tailwind cssベース
- 頻繁にアップデートが行われている

という優れもの！
公式のDemoもあるので、是非見てみてください！
[Filament公式DEMO](https://demo.filamentphp.com/)
[Filament公式](https://filamentphp.com/)

# Filamentのインストール
早速追加していく。
Filamentを利用する要件として
```
PHP 8.1+
Laravel v10.0+
Livewire v3.0+
```
となっている。
バージョンが低い人はこちらを参考に

https://qiita.com/curacao/items/b4d4e645489294fb1f57



まずはLaravel Sailで作成したプロジェクトのルートで以下のコマンドを実行する
```
sail composer require filament/filament:"^3.1" -W
```
完了したら次にインストール、管理画面を生成します
```
sail artisan filament:install --panels
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/81c33e60-6f31-4313-31a5-dcbf8c2d0585.png)
このようにIDを求められるので、管理画面で使用したいURLと同じものを設定してください！
今回は`admin`で進めるので、そのままEnterを押します

これにより、Laravelのサービスプロバイダーが生成されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/6edeb641-7950-ffb2-18f2-3ecfbb64baab.png)

完了すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/b159ee3b-7e32-7aa3-7713-c4ae00252576.png)
このようになり、Filamentを気に入った場合にはGithubでスターを押してとなるので任意で選択をしてください！

# 管理ユーザーの追加
次のコマンドでユーザーを追加します
※この操作の前には`sail artisan migrate`をしてDBの作成をしておいてください！
```
sail artisan make:filament-user
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/11d00cbc-27b9-9a92-b91b-28dfae44a444.png)
- ユーザー名
- メールアドレス
- パスワード
を求められるので入力してください！

# ログインしてみる
ここまで完了したら
```
localhost/admin/login/
```
を開くとログイン画面が開くと思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/9c87ad97-cb92-eed6-33f9-753bfc023fb3.png)

この時に、
`localhost`のあとの`admin`は、管理画面生成時に生成したIDになります！
また、Laravel側の設定でポート番号を指定している人はポート番号もあわせてください
```
localhost:ポート番号/管理画面生成で設定したid/login/
```
で開くことができます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/534e49c6-f200-cf32-345c-d8d5c7c8bcb8.png)

無事ログインができたら完了です！

# 終わりに
一旦インストールは完了したので、次は色々試してみてまた記事書こうと思います！
お疲れ様でした！
AIとChatGPT-4oを使って簡単に可愛いキャラクターを生成する方法

こんにちは、高校3年生の[ここ]です。今回は、私が取り組んだ研究活動「ゆるふわキャラの画像生成チャットボット」の開発についてご紹介したいと思います。

私は、アニメやゲームのキャラクターが大好きです。ふと思ったのは、『もしAIで自分だけの「ゆるふわ」キャラを作れたら面白いだろうな』ということ。そんな思いから、ChatGPT-4oとDALL・Eを使って、誰でも簡単にキャラクターを生成できるチャットボットを作ることに挑戦しました。

試行錯誤の末、家族や友人に驚かれるほど可愛いキャラクターを作れるようになりました！この記事では、その開発のプロセスとポイントを紹介します。ぜひご覧ください！

#### プロジェクトの背景
私のプロジェクトは、女子高生をターゲットに、彼女たちが好む「ゆるふわ」なアニメキャラクターを自動生成することを目指しました。
具体的には、以下の2つの技術を組み合わせて使用しました：
1. **ChatGPT-4o**: ユーザーインターフェースとして使用し、ユーザーからの入力を受け取り、それに応じた画像生成の指示を行う。
2. **DALL・E画像生成機能**: ChatGPT-4oからの指示をもとに、実際のキャラクター画像を生成。

#### 開発のポイントと工夫
開発にあたり、いくつかのポイントに特に注力しました：
- **ChatGPTの設定とプロンプト設計**: ChatGPTを「優秀なイラストレーター」として機能させるため、日本語でカジュアルな敬語を使用する設定にしました。また、ユーザーが細かい指示（例：「明るい背景で、キャラクターが笑顔を見せている」など）を与えられるよう、プロンプトの設計に工夫を凝らしました。
- **画像生成のテーマ設定**: 「ゆるふわ」「アニメキャラ」「カラフル」をテーマに、ユーザーの好みに合わせた画像を生成することを重視しました。特に、私自身が飼っているカニーヘンダックスフンドの特徴を反映させたキャラクター画像も生成することができました。

#### チャットボットのテストと評価
完成したチャットボットを使って、家族や友人に実際に画像を生成してもらいました。その結果、次のような高評価を得ることができました：
- 「とても可愛い画像が生成できた」
- 「カニーヘンダックスフンドの特徴をよく捉えている」
- 「アニメ好きにはたまらない『ゆるふわ』キャラクターが生成できて嬉しい」

#### 学びと今後の展望
このプロジェクトを通じて、以下の学びを得ることができました：
- **プロンプト設計の重要性**: ユーザーの指示に応じた適切な画像を生成するためには、的確なプロンプト設計が欠かせないことを学びました。
- **ユーザー中心の開発**: ユーザーのニーズに応じた機能を提供することの重要性を実感しました。

また、AI技術を活用してクリエイティブな活動を実現する楽しさも再確認できました。今後は、ユーザーからのフィードバックを基にさらに改良を重ね、より多くの人々に喜ばれるツールを作ることを目指しています。

#### まとめ
今回の研究活動は、私にとって大きな成功体験となり、今後もAI技術を活用した新たな挑戦に取り組むための強い動機付けとなりました。
ですが、画像形式をjpgにできなかったり、たまに16:9のサイズを無視したり、思ったような画像にならない事もあります。
より良く結果が出せるよう皆さんからも、ぜひフィードバックやご意見をいただければ嬉しいです。
よろしくお願い致します。

最後までお読みいただき、ありがとうございました！

![IMG_0608.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870137/b0f42073-fe15-1956-5967-b301eadd17de.jpeg)
![IMG_0610.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870137/4ed90855-1da8-b171-3162-1d3b88d9d442.jpeg)
Azureのホットポテトルーティングについて調べた話

[Microsoftの公式のドキュメント](https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/routing-preference-overview)によると、
Azure のルーティング優先設定にMicrosoft ネットワーク経由または ISP ネットワーク (パブリック インターネット) 経由のどちらでトラフィックをルーティングするかを選択できます。

前者は「コールドポテトルーティング」後者は「ホットポテトルーティング」と呼ばれます。

ここが少し気になったので調べてみました。

## コールドポテトルーティング

コールドポテトルーティングではMicrosoftグローバルネットワーク経由でトラフィックをルーティングされます。
165 以上のエッジポイントオブプレゼンス (POP) の中から顧客に一番近いPOPが選ばれ、そこから顧客のネットワークへ渡されます。
送信元ネットワークの作業をより多く必要としますが、トラフィックをより長く制御下に置くことができるため、より高いエンドツーエンドのサービス品質をユーザに提供することができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/6ada5136-8409-0bb4-d0bd-7beb5cc1e8a4.png)


## ホットポテトルーティング

ホットポテトルーティングではMicrosoft グローバルネットワーク上の移動が最小限に抑えられ、ISPネットワークを使用してトラフィックがルーティングされます。このコストが最適化されたルーティングオプションでは、他のクラウドプロバイダーと同等のネットワークパフォーマンスが提供されます。
全体のネットワークの負担が低いのはこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/fa8d870e-8de8-379c-7239-3a6982c61e81.png)

## ホットポテトとは

ホットポテトというゲームがあります。
プレイヤーが輪になって、音楽が流れている間に、お手玉や本物のジャガイモのような小さな物体を投げあい、音楽が止まったときにその物体を持っていた人が負けというゲームです。少し椅子取りゲームに似ていますね。

熱々のじゃがいもは手に持てる時間が少ないことから次々とじゃがいもが手渡されていくゲームをこう言うようになりました。

もともとホットポテトルーティングはAzure固有のものではなく、自立システムが外部にどのように通信するのかの戦略でもありました。

ホットポテトゲームのようにどんどんパケットを受け渡していくルーティングをホットポテトルーティングと呼ばれるようになりました。
メモ帳でコーディングしていた話

# はじめに
## ひとこと
アクセスしていただきありがとうございます。
タイトルの通りの、メモ帳でコーディングしていた話です。
タメになるかどうかは分かりません。

## 目的
+ メモ帳でコーディングしていたことで得られた知見を共有すること（）

## 検証済みの環境
+ Windows11 Home x64
+ メモ帳

## ご注意
+ この記事の情報は **2024/08/26現在** のものです

# 1.前書き
筆者は2020年に高校へ入学したと同時に、部活動でプログラミングを始めました。
HTMLとCSSを一通り学習し、一人で簡単なウェブページをつくれるようになりました。
そして自然とウェブページに機能を実装したいと思うようになり、JavaScriptの学習を始めました。
（今もですが）ここまで独学だったこともあり、一度、挫折しながらも百人一首を4択から選んで覚えるウェブアプリをつくり、高校で公開しました。
その後も学習を続け、高校2年生の夏ごろに全体で1000行ほどのウェブアプリを完成させました。

**...そう、メモ帳で。**

# 2.メモ帳でコーディングしていた話
## なぜ、そうしたのか
### 部活のパソコン
当時は自分のパソコンを持っておらず、部活でコーディングしていました。
部活のパソコンはあったのですが、しっかりと動くものはなく、情報の授業で使うパソコンを使っていました。
ですので自由にIDEをインストールすることはできませんでしたが、HTMLとCSSにちょっとしたJavaScriptしか書いていなかったため、メモ帳で書いていました。

### 執行部のパソコン
前書きでは省略しましたが、高校2年生の春に、ICT化を担当して欲しいと誘われ生徒会執行部のような組織に参加しました。
部活と同様に執行部のパソコンがあったのですが、インターネットに接続できないようにされており、またもやメモ帳でコーディングするしかありませんでした。

### 学校全体のパソコン
また某パンデミックの影響で大量のパソコンが配備されましたが、当然ながら学校全体で貸し出して使うため、勝手にアプリをインストールすることは禁止されていました。

**3つの性質の違うパソコンがあったはずなのに、どこでもメモ帳を強いられることなりました。**

## メモ帳でコーディングするとはどういうことか
### こういうことです（サンプル）

```html: sample.html
<input type="button" value="Great" class="button" onclick="Great()">
```

```txt: sample.html
<input type="button" value="Great" class="button" onclick="Great()">
```

### 不便なポイント
+ 見にくい（色分けがない）
+ すべてタイピング（予測、自動補完がない）
+ スペルミスが多発（予測、自動補完がない）
+ 「()、<>、{}、[]、""、''、``」などを閉じ忘れる（自動で閉じてくれない）
+ 選択してから「shift + (」などを押しても上書きされる（自動で囲ってくれない）
+ 行の末尾で「ctrl + c」を押しても、その行をコピーしてくれない（わざわざ行全体を選択しないといけない）
+ インデントを深さの分をすべて入力（1つ入力したら適切な深さまで自動で入力してくれない）
+ 複数行のインデントの調整は一行ずつ（複数行のインデントをまとめて調整できない）
+ 実行してみるまでミスに気づけない（エラーの赤い波線など表示されない）
+ 自分が知っていることしか書けない（予測がないから、予測を見たときに「知らないメソッドがあるから調べてみるか」みたいな状況が発生しない）

### 得たこと
+ 既定のプロパティ名はもちろん、自分で定義した変数名なども正確に、そしてずっと覚えられること
+ 1つのメソッドくらいならば、ほぼ100%の確率で、一発で想定した通りに動かせること
+ チャットなどでコードが送られてきても、IDEでコードを見るときと変わらない速さで読めること
+ 「()」などの特定の一連のキーの入力が異常に速くなったこと
+ JSのコーディングで、`innerHTML += '<span>Hello world!</span>'`のように文字列としてHTMLを書くときに、ミスなく書けること

## 振り返ると
### 感想
遠回りになっているところもありますが、総じて良かったと思っています。
今は開発するアプリなどの規模も大きくなったためIDEを頼っていますが、得たことは今でも現役で大いに役立っています。
また自ら検索エンジンなどで調べなければ新しい知識が入ってこない環境は、アウトプットを促し、基礎的な知識を技術として定着させるに絶好だと思います。

### JavaScriptでよかった
```js: Sample.js
// フォーマットは色々ありますが、私はJavaScriptはこれで書いています

if (isPlayerExist) {
    // 処理
}

// 3行
```

```cs: Sample.cs
// フォーマットは色々ありますが、（以下略）

if (isPlayerExist)
{
    // 処理   
}

// 4行
```
「インデントを深さの分をすべて入力」があるため、if文やfor文などの、いわゆるすべての「文」の数だけ、1行増えていたと思うとぞっとします。

## 他人に勧めるか
おすすめはしませんが、なしでもないと思います。
経験を積むにつれて「得たこと」の前2つの重みが分かっていただけると思います。

# 3.後書き
今はIDEとしてはVSCodeを、それ以外にはUnityなどを使って開発をしています。
VSCodeは拡張機能をもりもりにしています笑
今でもIDEのありがたみを感じています。

# おわりに
最後までお読みいただきありがとうございます。
何かの参考になれば幸いです。
TypeScript interface/type比較早見表

# 概要
今回はTypeScriptの`interface`と`type`を比較してみました。
どっちの方が優れているといった話ではないのでご容赦ください。

# 違いについて
## 早見表
|特徴|interface|type|
|-|-|--|
|基本目的|オブジェクトの形状を定義|型に名前を付ける（オブジェクト、プリミティブ、ユニオンなど）|
|拡張|`extends`を使って拡張可能|`&`を使って交差型で合成可能|
|再オープン（マージ）	|可能|不可能|
|プリミティブ型|使用不可|使用可能|
|ユニオン型|使用不可|使用可能|
|交差型|使用不可|使用可能|
|柔軟性|オブジェクト型に特化|非常に柔軟（関数型、タプル型、ユニオン型なども定義可能）|

個人的な認識として`interface`はオブジェクトの**定義**で`type`は型に対して名前をつける**行為**だと思っているので、そういった思想でも使い分けができると良いのかなと思っています。

## 拡張
```typescript:interface
interface A {
  name: string;
}

interface B extends A {
  power: number;
}

const test: B = { name: "a", power: 1 };
```
```typescript:type
type A = {
  name: string;
};

type B = A & {
  power: number;
};

const test: B = { name: "a", power: 1 };

```

## 再オープン


```typescript:interface
interface A {
  name: string;
}

interface A {
  power: number;
}

const test: A = { name: "a", power: 1 };

```

```typescript:type
type A = {
  name: string;
};

//　エラー
type A = {
  power: string;
};

const test: A = { name: "a", power: 1 };
```

## プリミティブ型/ユニオン型/交差型
```typescript:type
// プリミティブ型
type A = string;
type B = number;

// ユニオン型;
type C = string | boolean;
type D = B | C;
type E = 100 | "aaa" | true;
```
交差型は[拡張](#拡張)で書いたので省略。
UoPeopleに入学してみた

## 概要
2024年6月からUoPeopleというアメリカのオンライン大学に入学しました。
1学期分が完了したので、その内容の振り返りをしたいと思います。

## UoPeopleとは
正式名称は[「University of the People」]([Qiita](http://qiita.com))と言います。
高等教育の世界普及を目標に掲げて、オンライン上で大学の授業を受けることが出来ます。
授業自体も完全非同期のため、勉強時間はある程度融通を聞かせることが出来ます。

## 入学しようと思った理由
私がこの大学に入学しようと考えた理由は下記三つです。
- コンピュータサイエンスを学ぼうと考えたため
- 英語を勉強しようと考えたため
- 自己研鑽をした事実を外部から証明したかったため

### コンピュータサイエンスを学ぼうと考えたため
私は2024年時点、金融系の(どちらかというと)SIer企業に新卒から勤めて6年目になります。
業務をしていく中でAWSをはじめとしたパブクラ関連の技術に触れる機会には比較的恵まれているのですが、
基礎的な部分の理解が不足していることを業務の節々で感じるようになり、自己研鑽として補いたいと考えるようになりました。
大学に通うことでコンピュータサイエンスの基礎的な知識を体系的に学ぶことが出来ると考えました。

### 英語を勉強しようと考えた
上記の理由で述べた自身の課題に加えて、今後技術を素早くキャッチアップしていくためには英語は必須だと考えました。
英語を習得するためには英語単体で勉強することも大事ですが、習慣的に英語に触れる環境が大事だと考え、英語圏の大学の授業を受けることで英語力向上が見込めると考えました。

### 自己研鑽をした事実を外部から証明したかったため
　自己研鑽は日々行っていますが、何らかの形でその証明を行いたいと考えていました。
その手段としてよくあるのが***資格取得***ですが、資格取得は「資格用の勉強」になりがちになってしまうため、自身の目標に対して適切ではないと思いました。
また、周りの人も資格取得はしており稀少性もそこまでないため、証明したからと言って他の人との差別化が難しいと思っていました。
それに対して大学は、継続的に勉強を行う必要があり、インターネット上の情報が少ないことから、稀少性の高さと継続的な努力を行わないと学位取得が出来ないと考えました。

## 大学のシステムについて
この大学はオンライン上ですべて完結、かつ全世界で利用されることを想定されているため、完全非同期な授業スタイル、すなわち課題を一週間単位で与えられて、それをこなしていくスタイルになっています。
一学期（大学内ではTermと呼ばれています）は9週間、学期は1年間で合計5Termあります。
　課題は授業によってさまざま（だと思うのですが、）学生間で相互コミュニケーションできるような課題もあり、オンライン学習で発生するデメリットを解消しようという工夫が感じられます。
## 今回とった授業の内容  

今回私がとった授業は学科の授業の前に受講するESLプログラムの一環の授業です。
ESLプログラムは英語に慣れていない人に向けたUoPeopleを受講するにあたって最低限必要な英語を学ぶための授業になります。
UoPeopleは入学時に基準以上の英語の実力を証明するための書類（TOEFLやDuolingo English Test、英検）を提出する必要があります。
それを証明できない人はESLプログラムを合格する必要があります。
ESLプログラムにもいくつかレベルがあるようなのですが、今回私が受けたプログラムは一番上のENGL 0008という授業でした。
この授業における、課題の種類は下記のようなものがありました。

- Speaking Practice
    - 単語の発音を行う課題。10程度で完了する
    - RとLの違いをちゃんと意識しないと合格にならなかったので、勉強になった。
- Complete the Sentence
    - 虫食い状態になっている文章に単語を埋めていく課題。20分程度で完了することに加えてあまり出てこなかった。
- Vocabulary Word search
    - クロスワードパズルのような、アルファベットが20文字×20文字くらいで並べられている中で、指定された丹後を探す課題。15分程度で終わる。楽しい。
- Dictation Unit
    - 単語をリスニングして、それを書いていくもの。この単語はSpeaking Practiceで出てきたもの同一。10分あれば終わる。
- Discussion Forum
    - ほぼ毎週存在した。毎週指定された文章を読み、その内容についての要約や自身の考えを投稿する課題。それに加えて他学生の投稿に3投稿以上投稿しなければいけない。1課題あたり、3時間くらいかかりました。
    - ただ、自身の考えを英語でアウトプットするいい機会になったのでとても有意義な課題だったと思います。
- Written Assignment
    - こちらもほぼ毎週存在した。こちらも毎週指定された文章や、課題の内容について英語での文章を書き、それを提出する課題。前週に他学生が提出された課題を相互にレビューする課題合わせて付いてくる。2時間程度かかりました。 
- Learning Journal
    - こちらもほぼ毎週存在し、与えられた課題に対する英文章を提出し、担任の教師に直接レビューしてもらうもの。Discussion Forum, Written Assignmetとの課題はそれぞれ独立しているため、この3つが主な課題になっていた。こちらも2時間はかかっていた。
- Self-Quiz
    - 最後に小テストを受ける。30分程度で終わることに加えて基本的に再提出が可能（＝満点になるまで試すことが出来るらしい。私はその仕様に気が付いておらず、１回でそのまま出してしまっていた。）である。しかし、第３週目と６週目についてはやや評価の重みが重いテストかつ、再提出出来ないテストになっているので注意が必要。
- Final Exam
    - 最終テストとして外部のOxford English Testというテストを受ける。今までどんなに成績が良くてもこのテストで100点満点中50点以下を取ってしまうと即落第となってしまう。

## 今後について
　上記のテストを無事パスすることが出来たので次回タームから通常のSCコースの授業を受けていくことになります。SCコースでもSCコースとは直接関係のない授業については単位移行制度を使用して、日本の大学で受講した単位を移行させることで効率的に授業を受けていこうと考えています。  
 また、各タームの概要、所感について今後上げていこうと思いますので、気になる方いれQiitaや、Xの登録お願いします！！そのほか気になることありましたら、XのDMなどでも待ちしていますのでご連絡ください！！！
【Python3エンジニア認定基礎試験】3. 形式ばらない Python の紹介

コメントの使い方
---
Python では、コメントを # で始めることができます。
コメントは、コードの動作に影響を与えません。

```
# これはコメントです
spam = 1  # これはコードの後ろにあるコメントです
text = "# これはコメントではなく、文字列です"
```

Python を電卓として使う
---
Python インタプリタを起動すると、電卓のように数値計算ができます。
```
>>> 2 + 2
4
>>> 50 - 5 * 6
20
>>> (50 - 5 * 6) / 4
5.0
>>> 8 / 5  # 割り算は常に浮動小数点を返します
1.6
```
整数と浮動小数点の区別も自然です。整数除算 // は、結果の小数点以下を切り捨てます。

```
>>> 17 // 3
5
>>> 17 % 3  # 剰余（あまり）
2
>>> 5 ** 2  # 冪乗 (5 の 2 乗)
25
```

変数への代入
---
変数に値を代入して計算を行うこともできます。
```
>>> width = 20
>>> height = 5 * 9
>>> width * height
900
```

文字列の操作
---
Python では、文字列も簡単に操作できます。
文字列はシングルクォート '' かダブルクォート "" で囲みます。
```
>>> 'spam eggs'
'spam eggs'
>>> "doesn't"
"doesn't"
>>> '"Yes," they said.'
'"Yes," they said.'
```
文字列の中で改行を含めたい場合は、バックスラッシュ \n を使います。
また、生の文字列を作成するには r を前置します。

```
>>> print('First line.\nSecond line.')
First line.
Second line.
>>> print(r'C:\some\name')
C:\some\name
```


リストの操作
---
リストは、複数の値を一つのデータ構造にまとめることができます。
リストの要素には、インデックスを使ってアクセスできます。
```
>>> squares = [1, 4, 9, 16, 25]
>>> squares[0]
1
>>> squares[-1]
25
>>> squares[-3:]
[9, 16, 25]
```
リストは、他のリストと結合したり、要素を変更したりすることもできます。

```
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> cubes = [1, 8, 27, 65, 125]
>>> cubes[3] = 64  # 間違った値を修正
>>> cubes
[1, 8, 27, 64, 125]
```

Fibonacci 数列
---
もう少し複雑な例として、Fibonacci 数列の一部を表示するプログラムを示します。
```
>>> a, b = 0, 1
>>> while a < 10:
...     print(a)
...     a, b = b, a + b
...
0
1
1
2
3
5
8
```
このプログラムは、基本的な変数の代入やループ処理の使い方を示しています。

https://qiita.com/FT_log/items/35cc76047bb5edc97bda
【Python3エンジニア認定基礎試験】2. インタプリタの使用方法

2.1. インタプリタの起動方法
---
Unix/MacOS:
Pythonインタプリタは通常 /usr/local/bin/python3.9 にインストールされます。
Unixシェルの検索パスに /usr/local/bin を追加することで、python3.9 コマンドでインタプリタを起動できます。
インストールディレクトリは選択可能で、他の場所にインストールされる場合もあります。

Windows:
Microsoftストアからインストールした場合、python3.9 コマンドが使用可能です。
また、py.exe ランチャをインストールしている場合は py コマンドも利用できます。

インタプリタの終了方法:
Unixでは Control-D、Windowsでは Control-Z を使用して終了できます。
また、quit() コマンドを入力して終了することもできます。

コマンドライン編集機能:
インタプリタがGNU Readlineライブラリをサポートしているシステムでは、対話的行編集、ヒストリ置換、コード補完が利用できます。
サポートされているかどうかは、Pythonプロンプトで Control-P を入力して確認できます。

スクリプトの実行:
python3.9 <filename> の形式でスクリプトを実行できます。
python -c command でコマンドを実行したり、python -m module でモジュールを実行することも可能です。

2.1.1.引数の受け渡し
---
sys.argvの使用:
スクリプト名と引数は sys.argv にリスト形式で格納されます。
import sys で sys.argv にアクセスできます。
sys.argv[0] にはスクリプト名が格納され、引数がなければ空の文字列になります。

2.1.2. 対話モード
---
対話モードの起動:
インタプリタが端末からコマンドを読み取る場合、対話モードで動作します。
一次プロンプト >>> が表示され、ユーザがコマンドを入力できます。
複数行の構文を入力する場合、二次プロンプト ... が表示されます。

2.2. インタプリタとその環境
---
2.2.1. ソースコードの文字コード
---
デフォルトの文字コード:
PythonのソースコードはデフォルトでUTF-8として扱われます。
UTF-8では、ほとんどの言語の文字を同時に扱えます。

特別なエンコーディングの使用:
デフォルト以外のエンコーディングを使用する場合、ファイルの先頭に # -*- coding: encoding -*- というコメントを追加します。
UNIXの "shebang" 行で始まる場合、エンコーディングの宣言は2行目に追加します。

まとめ
---
Pythonインタプリタはさまざまな環境で動作し、対話モードやスクリプトの実行、コマンドライン引数の受け渡しが可能です。UTF-8エンコーディングをデフォルトとしていますが、他のエンコーディングもサポートされています。

https://qiita.com/FT_log/items/94d46365d0e5b4fc952f
基本情報技術者(アルゴリズム)で出てくる用語メモ

# はじめに
絶賛基本情報技術者のアルゴリズムを学習中です！
用語がわからないと問題文すら理解できないので困りました💦
当たり前だなってことも復習として、どんどんアウトプットします！

徐々に増やしていけたらと思います。
誤り等ございましたら、教えていただけますと幸いです🙇

# 用語

#### 再帰
関数定義の一部にその関数自身を使うもの
このような関数を再帰関数という

## 数学関係
#### 商
5 ÷ 2 の商という感じで出てきました
普通に計算すると、2.5ですが、答えは2です

商とは割り算の答えの整数部分のみを指すので、
小数点以下の部分は考慮しません

#### mod
(3 mod 5) + 1 という出てき方をしました
modとはある数を別の数で割った時の「あまり」を求める演算です

今回だと (3 % 5) + 1 = 4 です

あまりの確認方法
3 = 5 * 0 + 3で求められます

#### 素数
1とその数でしか割り切れない自然数のこと
(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47…)

4は2で割り切れてしまうので素数じゃない
５は1と5でしか割り切れないので素数

#### 自然数
正の整数のこと(1, 2, 3…)0を入れる時もあるそうです

#### 非負の整数と正の整数の違い
- 非負の整数とは0以上の整数を指します
例) 0, 1, 2, 3, 4, ... などが含まれます
- 正の整数とは1以上の整数を指します
例) 1, 2, 3, 4, 5, ... などが含まれます

#### 平方根
平方根とは、ある数 n を2乗（自乗）すると元の数 n になる数のことを指します
記号で表すと、数 n の平方根は √n で表されます

例)
√4 = 2 （なぜなら 2 × 2 = 4）
√9 = 3 （なぜなら 3 × 3 = 9）

#### 0.5乗 または 1/2乗
0.5乗と1/2乗が同じことはわかるんですが、
例えば4の2/1乗は√4ということらしいです

調べてみましたが、理屈がイマイチ理解できていません…

https://kou.benesse.co.jp/nigate/math/a14m1206.html

#### 階乗
階乗とは、1からある自然数 n までのすべての正の整数を掛け合わせた積で、数学では通常 __n!__ という記号で表されます

例)
0!=1 （特別な定義として、0 の階乗は 1 と定義されます）
1!=1
2!=2×1=2
3!=3×2×1=6
4!=4×3×2×1=24

## 選択処理

#### if文
条件式によって処理が分岐
```
if (条件式1)
  処理1
elseif(条件式2)
  処理2
else
  処理3
endif
```

#### while文（前判定繰返し処理)
条件がtrueの間繰り返し実行されるコード
※条件式によっては、繰り返し処理が一度も実行されない場合がある
```
while (条件式)
  処理
endwihle
```

#### do while文（後判定繰返し処理)
条件がtrueの間繰り返し実行されるコード
※条件式に関わらず、繰り返し処理が一度は必ず実行される
```
do
  処理
while (条件式)
```

#### for文（繰返し処理)
制御記述の内容に基づいて繰り返しが実行されるコード
例) iを1から5まで1ずつ増やす
```
for (制御記述)
  処理
endfor
```

## 大域変数(グローバル変数),ローカル変数

#### 大域変数(グローバル変数)
プログラム中のどこからでも呼び出せる変数のこと
下記例の変数totalのこと↓

#### ローカル変数
一つの関数内でしか使用できない変数のこと
下記例の変数aのこと↓

``` 例.
大域：整数型：total

⚪︎整数型：関数a()
　　　整数型：a.kin
　　　total ← total + a.kin
```


# さいごに
データ構造については長くなったので、こちらの記事にまとめ直しました！

https://qiita.com/3rarara/items/add8a353ea4edc92a847
WeakMapを使用しキャッシュを作成する

# WeakMapとは？

WeakMapは使用するキーと値のペアを保持するコレクション。
WeakMapのキーはオブジェクトである必要があり、プリミティブ値（文字列、数値など）は使用できません。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/WeakMap

# WeakMapのメリット

- メモリリークの防止
オブジェクトが他に参照されなくなったときに自動的にガベージコレクションされるので、不要なデータがメモリに残り続けることを防く事ができる。
<details><summary>Mapを使ったオブジェクトとWeakMapの違い</summary>

- Mapを使ったオブジェクト
Mapのキーとしてobjが使われるため、objはガベージコレクションされません。

```js
let obj = { name: 'Alice' };
let map = new Map();
map.set(obj, 'Developer');

obj = null;  // objはnullに設定されても、Mapが参照を保持し続けます
console.log(map); // 出力例Map(1) {{…} => 'Developer'}　Mapはまだ値を保持しています
```

- WeakMapを使ったオブジェクト
WeakMap のキーとして格納されたobjが他に参照されなくなった場合、自動的にそのobjはガベージコレクションされます。

```js
let obj = { name: 'Alice' };
let weakMap = new WeakMap();
weakMap.set(obj, 'Developer');

obj = null; // ガベージコレクションの対象にする
```

</details>


# WeakMapを使ってみる

## 1. WeakMapの作成

`WeakMap`のインスタンスを作成します。

```js
const weakMap = new WeakMap();
```

## 2. オブジェクトをキーとしてデータを格納

`obj` をキーとして値 "データ1" を格納しています。

```js
const obj = {};
weakMap.set(obj, "データ1");
```
## 3. キーの存在確認

has メソッドで、指定したキーが WeakMap に存在するかどうかを確認します。

```js
console.log(weakMap.has(obj)); // 出力例：true
```


## 4. データの取得

格納したデータは、get メソッドで取得できます。
さきほど格納したデータを取得します。

```js
console.log(weakMap.get(obj)); // 出力例：データ1
```


## 5.データの削除

delete メソッドを使って、キーに対応するデータを削除できます。

```js
weakMap.delete(obj);
console.log(weakMap.has(obj)); // 出力例：false
console.log(weakMap.get(obj)); // 出力例：undefined
```

# WeakMapでキャッシュを作成する

```js
// WeakMapを使ったシンプルなキャッシュ
const cache = new WeakMap();

function sampleComputation(obj) {
    if (cache.has(obj)) {
        console.log('キャッシュあり');
        return cache.get(obj);
    } else {
        console.log('キャッシュなし');
        const result = 'aaaaa';
        cache.set(obj, result);
        return result;
    }
}

let obj1 = { key1: 'value111' };

console.log(sampleComputation(obj1)); //  出力例：キャッシュなし、aaaaa
console.log(sampleComputation(obj1)); //  出力例：キャッシュあり、aaaaa

// 値の参照を解除しガベージコレクションの対象にする
obj1 = null;
```

# 参考
https://ja.javascript.info/weakmap-weakset

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/WeakMap

https://zenn.dev/oreo2990/articles/d290ea0f08a3e0
【Python3エンジニア認定基礎試験】1. やる気を高めよう

1.Pythonの概要
---
多目的プログラミング言語: Pythonは、さまざまなタスクを効率的にこなせる多目的プログラミング言語です。ファイル操作、GUIアプリケーション、ゲーム開発など、多岐にわたる分野で利用できます。
クロスプラットフォーム: PythonはWindows、macOS、Unixなど、主要なオペレーティングシステムで動作します。

2.Pythonの利点
---
簡便性と高速な開発: Pythonはインタプリタ言語であり、コンパイルやリンクが不要なため、開発サイクルが短縮されます。また、C/C++/Javaと比べて短く、読みやすいコードを書くことができます。
高レベルのデータ型: 可変長配列や辞書といった高級データ型を標準でサポートしており、複雑な操作を簡潔に実現できます。
エラーチェック: 実行時に多くのエラーチェックが行われるため、バグの発見が容易です。

3.Pythonの拡張性
---
モジュール化: プログラムをモジュールに分割し、他のプログラムで再利用できます。Pythonの標準モジュールには、ファイルI/O、システムコール、ソケット、GUIツールキット（例: Tk）などがあります。
C言語との統合: 必要に応じてC言語で書かれた関数やモジュールをPythonに追加し、処理の高速化や外部ライブラリの利用が可能です。

4.Pythonの利用分野
---
自動化とスクリプティング: シェルスクリプトやバッチファイルの代替として、より強力で柔軟なスクリプティングを提供します。
データベース、GUI、ゲーム開発: 専用のデータベースやGUIアプリケーション、シンプルなゲームを簡単に作成可能です。

5.Pythonの学習方法
---
実践重視: プログラミング言語を習得する最良の方法は、実際に使ってみることです。インタプリタを使用して、言語の機能を試しながら学ぶことが推奨されます。
公式ドキュメントとチュートリアル: Pythonの公式チュートリアルやドキュメントを活用し、基本的な構文や高度な概念まで段階的に学習できます。

6.Pythonの背景
---
名前の由来: Pythonという名前は、BBCのショー「モンティパイソンの空飛ぶサーカス」に由来しており、爬虫類とは無関係です。公式ドキュメントにはモンティパイソンの寸劇への参照が推奨されています。

https://qiita.com/FT_log/items/45ec82f58bca16bb0209
vercelにデプロイしたAPIにPOSTできない

# 発生した問題

以下のファイルを含んだNext.jsのプロジェクトをvercelにデプロイした。
```ts:./src/app/api/route.ts
import { NextRequest, NextResponse } from "next/server";

export async function POST(request: NextRequest) {
  const body = await request.json();
  console.log(body);
  
  return NextResponse.json(
    { message: "POST test" });
}
```

ここにPOSTしようとすると`405 Method Not Allowed`が返されてしまう。


# 解決方法

## 1. `next.config.mjs`の`output: "export"`を削除する

```mjs:next.config.mjs
const nextConfig = {
    // output: "export",
};
```

## 2. vercelにデプロイする

```console:console
vercel
```
Scavenger Hunt

問題文にあるURLのサイトにフラグがあるらしい、

表示してみると特に入力フォームなどはなく、HOWタブとWHATタブの2つの画面があるのみ

とりあえず開発者ツールを開くと

HTMLのコメントにフラグの断片を発見

CSSにもフラグの断片がコメントアウトされている

JSにはフラグはないがコメントでヒントが書かれてる
`/* How can I keep Google from indexing my website? */` 

GoogleがWebサイトをインデクシングするのを防ぐ方法とは？
robots.txtのこと

与えられたサイトのrobots.txtにアクセスするとフラグ断片と次のヒントが見つかった。

ヒントは
`I think this is an apache server... can you Access the next flag?` 

ということでApatchサーバーで動いてるらしい。

Apatchに全く詳しくないですが、Apatchサーバだと何かブラウザからアクセスできる設定ファイルがあったりして、そこにファイルがあるのかな？

と思い

Perplexityで検索してみると（そういえばPerplexityはrobots.txtを無視してクロールしてるなんて話もありましたね）

- 設定によってはserver-infoやserver-statusなどサーバ情報にアクセスできるらしい

- Apatchでは`.htaccess` というファイルに設定を書くらしい

前者はハズレ、後者のファイルをURLの末尾につけてアクセスしてみるとフラグ断片と以下のヒントが手に入った

`I love making websites on my Mac, I can Store a lot of information there.`

Macで作業してるらしいので何か一時ファイルのようなものが残っているのかも？

と思ってmacOSで自動生成されるファイルを調べると.DS_Storeというものがあるらしい

ということでURLの末尾を.DS_Storeとしてアクセスすると最後のフラグが手に入った


> .DS_Storeとは
macOSで自動的に生成される隠しファイルです。このファイルは、特定のフォルダ内のファイルやフォルダの表示設定やアイコンの位置、ウィンドウのサイズなどのメタデータを保持しています。具体的には、フォルダ内のアイテムの配置や表示方法を記録しており、Finderウィンドウの表示をカスタマイズするために使用されます。一般的にはユーザーが直接操作する必要はありませんが、フォルダ内の表示設定をカスタマイズしたい場合に影響を与えることがあります。
Salesforce自組織URLをLWCのJavaScript内で得る


```javascript
const devPath = location.pathname.startsWith('/dev/') ? '/dev' : '';
const absoluteUrlVF = location.origin + devPath + '/apex/XXX';
const absoluteUrlS = location.origin + devPath + '/s/XXX';
const rootRelativeUrlVF = devPath + '/apex/XXX';
const rootRelativeUrlS = devPath + '/s/XXX';
```

最近は/dev/はもう要らないかも
My Domain有効だとつかないし、最近はMy Domain強制適用なので
ChatGPTに中山の補題を証明させてみたお話

# はじめに
ハトです。最近ChatGPTに課金しまして。
法律系の勉強するときに、法律の文言だけ読んでもよくわからないのですが、GPTに聞くと具体的なシナリオ教えてくれるからめちゃくちゃ便利なんですよね。
今回はそんなGPTさんに可換環論の基礎レベルの命題の証明をしてもらいました。

## 可換環を素イデアルで割ると整域になる

```
素イデアルで割ると整域になることの証明をしてください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561216/8e5d67fb-9449-b355-73d0-f4235670e468.png)

GPTさんの回答を貼ると、/inとか\bar{a}とかをうまく表せないのでやむなく画像添付。
さて証明はというと。。。



**完璧でパーフェクト**

文句なしです。細かいことを言えば、環が非可換である場合に言及してほしいですが。。。（非可換環の場合は[素環](https://ja.wikipedia.org/wiki/%E7%B4%A0%E3%82%A4%E3%83%87%E3%82%A2%E3%83%AB "Qiita Home")になるそうです）
筆者にとって環は可換なのでﾖｼ!
そもそも質問の仕方が悪いですね〜。
**可換環を**素イデアルで割るとも言ってないですし。
GPTさんには、いい感じに行間も読んでもらっているので、流石です。

# 可換環を極大イデアルで割ると体になる

```
極大イデアルで割ると体になることを示してください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561216/d26e7347-2974-51af-efcf-d4d35fd16f3d.png)

**大正解!!**

すごいですね、記述もシンプルですし
あと大学時代こういうふうに見出しをつけた書き方をしたことがなかったですが、これがあるとみやすいですね！！
もっと早く知っておけばよかった
極大イデアルをMと書くセンスは疑いますが…

# 中山の補題

さて来ました、中山の補題。
これまでなんどこの補題を使ってきたことか。
いざ....!!

```
中山の補題を証明してください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561216/6f0e71e8-c1c8-9e26-6003-e4b3eb5a9d07.png)

うーん、雰囲気はあってそうなのですが。
そもそも主張から怪しい。
証明でもdet(I_n-B)=1+aと書けるが正しいですね

ということで追撃
```
なぜdet(I_n-B)=aとかけるのですか
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561216/bd0b457e-87bd-dde9-3552-c942336bbacb.png)

もはや日本語も崩壊しましたね...
4.においてはもはやm_1,m_2,...,m_nのことをベクトルと言っていますし、M=0をなる理由も曖昧です（行列式が単元である場合、M=0となること自体は正しいですが...）


単元でない場合の主張はもはやなぜその記述をしたのか聞きたいくらいです。

とは言えGPTさんの実力は大体わかりました。これ以上追及してもハラスメントになるだけです。

助け舟を出しましょう。

GPTさんの主張の特別な場合ですが、Iが極大イデアルの時の主張をしています。残念ながら1-aは単元になりません(Zの極大イデアル3Zを考えるとわかる)
複数の極大イデアルが存在するということが悪さしているんですね。

とは言え、着眼点としては悪くないです。
こちらの特別な場合について聞けば答えられそうですかね？
それだけだと変な方向に進むかもしれないので、局所環というヒントもつけて証明できるか見てみましょうか

```
特別な場合についてですが主張が不正確です。整数環Zと極大イデアル3Zを考えるとわかります。
環Aに局所環、イデアルIに極大イデアルという条件をつけてあらためて証明してください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561216/532ef7c0-1bba-fcd8-3e6e-a63135f65621.png)

合格ですかね！
ちょっと過保護だったかもしれません...
なお証明に入る前の、指摘に対する応答は、（よく理解できてないけど、ここを深掘りされるとボロが出るので次の話題にいってほしいから）「わかりました！」と言っている学生みたいですね（自分のこと）

# 感想
色々いじってみたんですが、まだ怪しいところはありますね。
中山の補題の主張は軽くググっても主張の仕方が異なるものがたくさんあります（本質的に言わんとすることは同じだが）。
そういうのが一発で証明できたものとの違いの一つかなぁと。
これは人間にも似てそうですね。
勉強していてよくわからなかったので別の参考書を見たら、同じ定理なのに主張のされ方が違うと混乱するとか。

GPTが指摘される度に少しずつ直していく（結局は大きなヒントを与えないと直らない）様子は、学生時代の自分を見ているような気分でした。