OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoで画像ファイルをアップロードできない場合のエラー解消法

## 発生していた問題・エラー
jpgファイルがアップロードできない。

![Django画像アップロードエラー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677649/1900674f-9f8b-a584-237d-71bac5ff61ac.gif)


## エラーの原因・解決方法
- ファイルを扱う場合、request.POSTだけでなく、request.FILESもフォームに渡す必要がある
- ファイルアップロードには、フォームにenctype="multipart/form-data"を設定することで、ファイルデータが正しく送信される

```python:views.py
def book_create(request):
    if request.method == 'POST':
        form = BookForm(request.POST)# request.FILESを追加して、ファイルも処理できるようにする
        if form.is_valid():
            form.save()
            return redirect('book_list')
    else:
        form = BookForm()
    return render(request, 'book/book_create.html', {'form': form})

def book_edit(request, id):
    book = get_object_or_404(Book, id=id)
    if request.method == 'POST':
        form = BookForm(request.POST, instance=book)# request.FILESを追加して、ファイルも処理できるようにする
        if form.is_valid():
            form.save()
            return redirect('book_list')
    else:
        form = BookForm(instance=book)
    return render(request, 'book/book_form.html', {'form': form})
```

```html:book_form.html
<h2>{% if form.instance.id %}本のタイトルと著者を編集する{% else %}新しい本を追加する{% endif %}</h2>

<!-- ファイルアップロードがある場合には、必ずenctype="multipart/form-data"を指定 -->
<form method="POST">  <!-- ここにenctype="multipart/form-data"を追加 -->
    {% csrf_token %}
    <p>
        <label for="id_title">Title:</label>
        {{ form.title }}  
    </p>
    <p>
        <label for="id_author">Author:</label>
        {{ form.author }}  
    </p>
    <p>
        <label for="id_amazon_url">Amazon URL:</label>
        {{ form.amazon_url }} 
    </p>
    <p>
        <label for="id_image">Image:</label>
        {{ form.image }}  
    </p>

    <button type="submit">保存</button>  
</form>
```

無事、jpgファイルがアップロードできるようになりました。

![Django画像アップロードエラー2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677649/65ad6aa6-9a11-8735-bfe2-2793989e7d20.gif)
[Security] WAF, TLSアクセラレーター

# 一覧
|||
|:--|:--|
|WAF|Webブラウザからの通信内容を監視し、不正と見做されたアクセス(SQLインジェクション等)を遮断する|




# 参考リンク
- [令和6春41_WAF](https://www.ap-siken.com/kakomon/04_aki/q42.html)
近藤今宮数列問題（2024）

# セイバーメトリクスに詳しい方、勉強したい方のネタになりそう（ならないかも）

# 問題
近藤健介8人、今宮健太1人で打順組んだら普通は9番今宮健太になるでしょ
じゃあ近藤7人今宮2人、近藤6人今宮3人…と変えていった時
近藤が何人の時に2番今宮が出現する？

# 元ネタのまとめ記事
- https://livejupiter2.blog.jp/archives/10692183.html
- https://www.youtube.com/watch?v=x6tWvOSm1Us

## 問題の言い換え（ChatGPT）

**問題：**
ある野球チームで、打順を以下の条件に基づいて決める。

- 近藤健介選手と今宮健太選手のみで打順を組む。
- 近藤健介は複数名いることができ、今宮健太も同様。
- 近藤健介が8人、今宮健太が1人のとき、今宮健太は通常9番に配置される。

さて、近藤健介の人数を7人、6人、…と減らし、代わりに今宮健太を増やしていくとき、  
**今宮健太が2番打者として現れるのは、近藤健介が何人のときか？**

# 2024年の二人の打撃成績（2024シーズン終了時点）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230287/c255c2f6-be9d-b5ff-00fe-01ce544a8b91.png)


| 選手         | 試合 | 打席 | 打数 | 得点 | 安打 | 二塁打 | 三塁打 | 本塁打 | 塁打 | 打点 | 盗塁 | 盗塁刺 | 犠打 | 犠飛 | 四球 | 故意四 | 死球 | 三振 | 併殺打 | 打率  | 長打率  | 出塁率  |
|--------------|------|------|------|------|------|--------|--------|--------|------|------|------|--------|------|------|------|--------|------|------|--------|--------|--------|--------|
| 今宮 健太    | 133  | 538  | 462  | 60   | 121  | 25     | 4      | 6      | 172  | 39   | 1    | 0      | 25   | 2    | 46   | 2      | 3    | 87   | 9      | 0.262  | 0.372  | 0.331  |
| 近藤 健介    | 129  | 535  | 436  | 66   | 137  | 29     | 2      | 19     | 227  | 72   | 11   | 1      | 0    | 1    | 92   | 11     | 6    | 76   | 10     | 0.314  | 0.521  | 0.439  |

引用元
https://npb.jp/bis/2024/stats/idb1_h.html



| 名前        | OPS   | 打率  | 打数 | 安打 | IsoP  | IsoD  | BB/K | K%    | BB%   | P/PA | wOBA  | wRAA  | wRC   | RC    | RC27  | Spd  | wSB  | O-Swing% | Z-Swing% | Swing% | O-Contact% | Z-Contact% | Contact% |
|-------------|-------|-------|------|------|-------|-------|------|-------|-------|------|-------|-------|-------|-------|-------|------|------|----------|----------|--------|------------|------------|----------|
| 今宮 健太   | 0.704 | 0.262 | 462  | 121  | 0.110 | 0.070 | 0.53 | 16.17 | 8.55  | 4.06 | 0.319 | 27.41 | 76.23 | 58.29 | 4.17  | 3.60 | 0.01 | 23.44    | 61.05    | 43.40  | 66.25      | 89.96      | 83.95    |
| 近藤 健介   | 0.960 | 0.314 | 436  | 137  | 0.206 | 0.125 | 1.21 | 14.21 | 17.20 | 4.13 | 0.420 | 71.13 | 119.67| 100.38| 8.71  | 4.06 | 1.29 | 17.53    | 62.09    | 39.55  | 65.82      | 87.91      | 82.95    |

引用元
https://baseball-datapark.skr.jp/sabermetrics/batter/

# 疑問
これって統計的に「解が一意に定まる」ものなの？（セイバーメトリクスを使えば解けるものなの？）
Docker-Composeを学んだので、基本をまとめてみた。

## Docker-Composeについて
### 概要
Docker-Composeは、複数のコンテナを同時に実行する際に非常に便利なツール。
複数のdocker runコマンドを使う代わりに、YAML形式のファイルにコンテナの設定をまとめて記述することで、簡単に管理・実行ができる。

### Docker-Composeのメリット
シンプルな定義: YAML形式で直感的にコンテナ設定が記述できる。
効率的な管理: 複数のコンテナの起動や停止を1つのコマンドで操作できる。
依存関係の管理: コンテナ間の依存関係を簡単に定義できる。

### Docker Composeファイルの記述例（）
```
version: "3"  # docker-composeのバージョン指定
services:
  web:
    image: "nginx:latest"  # 使用するDockerイメージ
    ports:
      - "8080:80"  # ホスト側のポート:コンテナ側のポート
    volumes:
      - "./html:/usr/share/nginx/html"  # ホスト側パス:コンテナ側パス
    environment:
      NGINX_HOST: localhost  # 環境変数設定
  app:
    build: ./app  # Dockerfileのパス指定
    ports:
      - "3000:3000"
    volumes:
      - "./src:/app/src"
    environment:
      NODE_ENV: production
    depends_on:
      - db  # 依存関係を定義（この場合、dbが起動してからappが起動）
  db:
    image: "postgres:13"
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
```
Web、API、DBの箇所はコンテナ名を定義しています。


#### 各項目の説明
- version: docker-compose.ymlのバージョン指定。一般的には"3"または"3.x"を使用。
- services: 複数のコンテナ（サービス）を定義するセクション。
- image: Docker Hubなどのリポジトリから取得するイメージ名を指定。
- build: ローカルにあるDockerfileを使用してイメージをビルドするためのパス指定。
- ports: ホストとコンテナのポートをマッピング（例: "ホスト側ポート:コンテナ側ポート"）。
- volumes: ホストのディレクトリとコンテナのディレクトリを同期。
- environment: コンテナ内で使用する環境変数を定義。
- depends_on: 他のサービス（コンテナ）が起動してからこのサービスが起動するように依存関係を定義。

※volumesの解説は後日個別でまとめたい・・・

#### エディタでの記述（ターミナル）
```
code .
```
viで慣れてない方はvisual studio codeなどでも記述できるので試してみてください。

### Docker-Composeの基本コマンド
Docker Composeを使用する際の基本的なコマンドを以下に羅列。

#### イメージ一覧表示
```
docker-compose images
```
使用しているイメージの一覧を確認

#### イメージ作成
```
docker-compose build
```
Dockerfileをもとにイメージをビルド

#### サービス実行
```
docker-compose up
```
サービスを実行。-dオプションを付けるとバックグラウンドで実行可能。
例: docker-compose up -d

#### サービス停止・削除
```
docker-compose down
```
起動しているコンテナを停止し、ネットワークやボリュームなどのリソースも削除。

#### サービス起動
```
docker-compose start
```
停止しているコンテナを起動。

#### サービス停止
```
docker-compose stop
```
コンテナを停止。

#### サービス再起動
```
docker-compose restart
```
コンテナを再起動します。

### まとめ
とりあえず、まとめたことを羅列してみました。
随時、追記していこうとおもいます。
python いろんなカッコがわからなかった話（自分用）

こんにちは。
絶賛python学習中に非エンジニアです。
当初、理解するのに苦労した３つのカッコについて記述する。

1. ()：タプル
2. []：リスト
3. {}：辞書型（dict）
3. まとめ

1.（）：タプル
-
タプルの特徴:
イミュータブル（変更不可）:

タプルは作成後にその要素を変更することができません。リストは要素の追加、削除、変更ができますが、タプルはそれができません。
カッコで表現:

タプルは通常、丸括弧 () で定義されますが、カンマがあれば括弧なしでもタプルとして認識されます。
複数の型を保持できる:

タプル内には異なるデータ型を持つ要素を含めることができます。例えば、整数、文字列、浮動小数点数などが混在していても問題ありません。

タプルの特徴的な用途:
イミュータブルであるため、データが変更されることを防ぎたい場合に使います。
関数から複数の値を返すときなどにもよく使われます。
```
# タプルの例
tuple = (1, 2, 3, "apple", "banana")
print(tuple)

# 出力 ⇒ (1, 2, 3, 'apple', 'banana')
```
タプルの要素の変更を試みる
```
# タプルの要素を変更してみる（インデックス番号で指定）
tuple = (1, 2, 3, "apple", "banana")
tuple[0] = 4

# エラーメッセージ
Traceback (most recent call last):
TypeError: 'tuple' object does not support item assignment
```
ちゃんとエラーが出て、イミュ―タプル（変更不可）であることがわかる。

2.[ ]:リスト
-
リスト：ミュータブル（変更可能）、[] で表現される
特徴：要素の追加、変更、削除が容易である

```
# リストの例
list = [1,2,3]
print(list)
list[0] = 4

# 出力 ⇒ [1,2,3]
```
リストの要素の変更を試みる
```
# リストの要素を変更してみる（インデックス番号で指定）
list = [1,2,3]
list[0] = 4
print(list)

# 出力 ⇒ [4,2,3]
```
タプルのようにエラーにはならず、要素が変更できていることが確認できる

3.{}：辞書型（dict）
-
キーと値のペア（key-value pair）を保存する、ミュータブル（変更可能）なデータ構造。
キーを使って対応する値にアクセスする（インデックスではなく、キーを使う）。
中括弧 {} で定義され、キーと値の間はコロン : で区切られる。
```
# 辞書型（dict）の例
my_dict = {"name":"佐藤","age":12}
print(my_dict)

# 出力 ⇒ {"name":"佐藤","age":12}
```
辞書型の要素の変更を試みる
```
# 辞書型の要素を変更してみる
my_dict = {"name":"佐藤","age":12}
my_dict["name"] = "鈴木"
print(my_dict)

# 出力 ⇒ {'name': '鈴木', 'age': 12}
```
辞書型についても、エラーにならず指定した要素を変更できていることがわかる。

4.まとめ
-
手を動かして何度も練習してみると、各々の特性や使い方が分かってくるので、挫折しないように頑張ろう！
多様性って・・新人さんであっても、対等に議論出来る場を作るってことでは？

# 背景

会社において、多様性を、

- 人種とか身体的特徴の差を許容すること

みたいに思ってそうな人が一定数存在しそうな感じだったので備忘録

# 思い

実際はもっと単純なところにあって、誰の意見であっても、その視点を大切に議論できる場を用意すること

心理的安全性のある職場では当たり前であるはずのこと

コマンドアンドコントロールが普通な日本社会では、下位を委縮させてるわけで、多様性が形だけになってない？と :sweat: 

<br>

そんななか、最近は大企業でもアジャイルをソフトウェア開発だけではなく、組織全体に適用しようと動いていたりもするので、だんだんと変わっているのでそこに期待したいですね :thinking: 

<br>

とはいえ、個人としては、待っててもしょうがないので、自分が出来ることはなにか？を考え行動していこう :laughing: 

<b>涓滴岩を穿つ</b>
PythonでUSB機器リストを取得して有効・無効化する。

# はじめに
PythonでUSBの機能を有効無効したい場合```PyUSB```を使えばよいのだと思うが、Windowsの場合、```libusb-win32```が必要で、このインストールがなかなかうまくいかなかった。そこで、PoweShellとの組み合わせで実現してみた。

# 使うライブライ
スクリプト|機能
---|---
Python|subprocess
PowerShell|Get-PnpDevice<br>Enable-PnpDevice<br>Disable-PnpDevice

```subprocess```でPythonからPowerShellを実行する。```Get-PnpDevice```でデバイスリストを取得、対象のUSBデバイスを抽出し、```Enable-PnpDevice、Disable-PnpDevice```で有効、無効化する。

事前に調査した記事は下記。

https://qiita.com/tapitapi/items/fbfe6b537b8ff8d47db0

https://qiita.com/tapitapi/items/b81cff80d7de14276a84

# USBをON・OFFする例
USB 大容量記憶装置をフィルタして、それをOFF/ONする例。PowerShellへパラメータを送る際の```""```の処理がうまくいかなくて最初手間取ったが、Windwosの場合、PowerShellをsubprocessで使うと、Pythonでできることの幅が広がる。
```python:
import subprocess

# USB 大容量記憶装置のInstanceIdをリスト化
usb_search = """
$devlist = Get-PnpDevice -PresentOnly | Where-Object { $_.InstanceId -match '^USB' }
foreach ($dev in $devlist) {
	if ($dev.FriendlyName -like "USB 大容量記憶装置") {
		Write-Output $dev.InstanceId
	}
}
"""
ret = subprocess.run(['powershell','-Command', usb_search], capture_output=True, text=True)
usb_list = ret.stdout.split()

# USBをDisable
for udev in usb_list:
	print(f'"{udev}"をusb_disable')
	subprocess.run(['powershell','-Command', f'Disable-PnpDevice -InstanceId "{udev}" -Confirm:$false'], capture_output=True, text=True)
	
# USBをEnable
for udev in usb_list:
	print(f'"{udev}"をusb_enable')
	subprocess.run(['powershell','-Command', f'Enable-PnpDevice -InstanceId "{udev}" -Confirm:$false'], capture_output=True, text=True)
 ```

 以上
[CSS] クライアントサーバーシステム

#

# 参考リンク
- [R5A31](https://www.ap-siken.com/kakomon/05_aki/q31.html)
- [R5S32](https://www.ap-siken.com/kakomon/05_haru/q32.html)
- [R4A15](https://www.ap-siken.com/kakomon/24_haru/q19.html)
- [H17A31](https://www.ap-siken.com/kakomon/17_aki/q31.html)
watsonx.data:ibm-lh-client 使ってみよう - 目次

## はじめに
ibm-lh-clientパッケージには、watsonx.dataへのアクセスや、watsonx.dataと連携するアプリケーションを開発するための便利なユーティリティと事前パッケージ化されたライブラリが含まれています。

例えば、ibm-lh-clientパッケージに含まれるターミナルベースの対話型のツールpresto-cliを使うとwatsonx.data内のデータをクエリすることができます。

今回は、ibm-lh-clientパッケージのインストールと設定、および使い方をまとめました。

## 環境
使用したサーバ環境は以下になります。
・Red Hat OpenShift Container Platform 4.14
・IBM Cloud Pak for Data (CP4D) 5.0.3
・IBM watsonx.data 2.0.3
・Presto (Java) v0.286
使用したクラアント環境は以下になります。
・Red Hat Enterprise Linux release 8.10 (Ootpa)
・Podman version 4.9.4-rhel

## watsonx.data:ibm-lh-client 使ってみよう - 目次
### 1.ibm-lh-clientのインストール
次のQiita記事ではibm-lh-clientパッケージのインストール方法を紹介します。
[ibm-lh-clientのインストール](https://qiita.com/Xu_Mingqin/private/f8d86eea20a08b214588)

### 2.ibm-lh-clientの設定
次のQiita記事ではibm-lh-clientパッケージを使用してwatsonx.dataのPrestoへ接続するためのエンジンの登録方法を紹介します。
[ibm-lh-clientの設定](https://qiita.com/Xu_Mingqin/private/dd129b02168ee7658cc0)

### 3.ibm-lh-clientでSQL実行例
次のQiita記事ではibm-lh-clientパッケージ内のprestro-cli、presto-runを使用したSQLの実行例を紹介します。
[ibm-lh-clientでSQLを実行してみた](https://qiita.com/Xu_Mingqin/private/83d1a63d3b5447f3a31c)
### 4.ibm-lh-clientパッケージを利用してデータをingestする
ibm-lh-clientパッケージには, watsonx.dataへCLI(コマンド・ライン・インターフェイス)でデータをingest(取り込む)ツールも含まれています。ibm-lh-clientを使用したCLIによるデータのingest方法については以下のシリーズのリンクを参照してください。
- [watsonx.data 2.0.1 で Presto を使用した CLI によるバッチモード ingestion を実行してみた](https://qiita.com/hkanba/items/d8e24297883eff8a6d73)
- [watsonx.data 2.0.1 で Spark を使用した CLI によるバッチモード ingestion を実行してみた](https://qiita.com/hkanba/items/115186be946bf1389710)
- [watsonx.data 2.0.1 で Spark REST API を使用した CLI によるバッチモード ingestion を実行してみた](https://qiita.com/hkanba/items/0bb17dea817728ee5ae6)
VSCode(Cursor)でMarkdownファイルを直接貼り付ける方法

以前は、VSCode(Cursor)でMarkdownファイルに画像を直接貼り付けるには拡張機能が必要でした。しかし、現在のVSCode(Cursor)では、この機能が標準で組み込まれており、より簡単に画像の貼り付けと管理ができるようになりました。

以下は、VSCode(Cursor)でMarkdownファイルに画像を直接貼り付け、自動的に適切なディレクトリにコピーされるように設定する手順です：

1. VSCode(Cursor)を開き、設定（Settings）を開きます。
   - Windows/Linuxの場合: `Ctrl + ,`
   - Macの場合: `Cmd + ,`

2. 設定の検索バーに「markdown」と入力します。

3. 「Markdown」セクションを見つけ、「Copy Files: Destination」の設定を探します。

4. 「Copy Files: Destination」の右側にある「Edit in settings.json」をクリックします。

5. `settings.json`ファイルが開いたら、以下のように設定を追加します：

   ```json
   "markdown.copyFiles.destination": {
     "*": "./"
   }
   ```

   この設定により、すべてのファイルタイプ（`*`）がカレントディレクトリ（`./`）にコピーされます。

6. 特定のファイルタイプに対して異なる保存先を指定したい場合は、以下のように設定できます：

   ```json
   "markdown.copyFiles.destination": {
     "*": "./assets",
     "*.png": "./images",
     "*.jpg": "./images"
   }
   ```

   この例では、PNGとJPGファイルは`images`フォルダに、その他のファイルは`assets`フォルダにコピーされます。

7. 設定を保存し、VSCodeを再起動します。

# VSCode(Cursor)でのMarkdown画像貼り付け機能のポイント

1. **拡張機能不要**: 最新のVSCodeでは標準機能として利用可能

2. **自動ファイルコピー**: 画像やファイルを貼り付けると指定ディレクトリに自動コピー

3. **柔軟な設定**: `settings.json`で保存先ディレクトリをカスタマイズ可能

4. **効率的な編集**: Markdown編集の効率が大幅に向上

5. **カレントディレクトリ指定**: 値に`"./"`を使用してカレントディレクトリを指定可能

この機能により、Markdown編集のワークフローが簡素化され、ドキュメント作成の生産性が向上します。
C#の勉強が１週間続いた＾＾

クイズゲームを作ろうとして、何か月かがすぎた。
技術的に漠然としていたので、どういった技術で作れるか、また、簡単かを考えた。
GPTに、フリーソフトのデータベースでオフラインのを聞いてみた。
そしたら、LiteDB　というものがあるようだ。
NoSQLなので、また、学習しないといけない。

でも、その前に C# の入門をやらないといけないので、
今週は C# の入門を最初の変数の宣言とかは、飛ばして途中からやった。

今週やったＣ＃の勉強は

    ４．制御構文
        ４．１　条件分岐
        ４．２　繰り返し処理
        ４．３　ループの制御
        ４．４　制御命令とその他の話題
    ５。　標準ライブラリ
        ５．１　文字列の操作
        ５．２　正規表現
        ５．３　日付・時刻
        ５．４　ファイルの操作
        ５．５　その他の機能
    ６．　コレクション
        ６．１　コレクションＡＰＩの基本
        ６．２　リスト
        ６．３　セット
        ６．４　ディクショナリ
    ７．　オブジェクト指向構文（基本）
        ７．１　クラスの定義
        ７．２　フィールド
        ７．３　メソッド
        ７．４　コンストラクター
        ７．５　クラスメソッド・クラスフィールド
        ７．６　引数・戻り値のさまざまな記法
    ８．　オブジェクト指向基本構文（カプセル化・継承・ポリモーフィズム）
        ８．１　カプセル化
        ８．２　継承
        ８．３　ポリモーフィズム（途中）
になる、あと、９，１０，１１章があるので、来週にはひととおりＣ＃の基本は終わると思う。

そして、クイズゲームのユーザーインターフェイスをＭＡＵＩで作ろうと思う。

まとめると、

    ロジック：Ｃ＃
    データベース：LiteDB
    ユーザーインターフェイス：MAUI
    ＯＳ：Windows 11
    ＩＤＥ：Visual Studio 2022 Express
となる。

勉強することが、いっぱいだ。
TypeScriptのジェネリクス

`<>`はTypeScriptにおけるジェネリクスの型パラメータを定義するための記号です。この記号を使って、関数やクラス、インターフェースが柔軟に異なる型を扱えるようにします。

#### ジェネリクス関数の例

```typescript
function identity<T>(arg: T): T {
  return arg;
}

const result1 = identity<number>(10);  // Tがnumberとして扱われる
const result2 = identity<string>("hello");  // Tがstringとして扱われる
```

- `identity<T>`: `T`は型パラメータで、実際の型が渡されるまでのプレースホルダーです。
- `identity<number>(10)`: 呼び出し時に具体的な型を指定しています。

### ジェネリクスの利点

- **型安全性**: 型を明示することで、コンパイル時に型チェックが行われます。
- **再利用性**: 同じロジックを異なる型に対して適用できます。

`<>`はこのように型を抽象化し、柔軟に扱うための重要な構文です。 



### 文法

ジェネリクスは、関数、クラス、インターフェース、型エイリアスで使用できます。通常、山括弧 `<>` を使って定義します。

#### 関数での使用

```typescript
function identity<T>(arg: T): T {
  return arg;
}

const result1 = identity<number>(10);
const result2 = identity<string>("hello");
```

- `T`は型パラメータで、実際の型が渡されるまで待つプレースホルダーです。
- 関数を呼び出すときに具体的な型を指定します。

#### クラスでの使用

```typescript
class Box<T> {
  contents: T;
  constructor(value: T) {
    this.contents = value;
  }
}

const numberBox = new Box<number>(123);
const stringBox = new Box<string>("test");
```

- クラスのインスタンス化時に型を指定します。

#### インターフェースでの使用

```typescript
interface Pair<T, U> {
  first: T;
  second: U;
}

const pair: Pair<number, string> = { first: 1, second: "apple" };
```

- 型を複数指定することも可能です。

### 典型的な使用例

#### 配列操作

```typescript
function getArray<T>(items: T[]): T[] {
  return new Array<T>().concat(items);
}

const numberArray = getArray<number>([1, 2, 3]);
const stringArray = getArray<string>(["a", "b", "c"]);
```

- 任意の型の配列を操作する関数を作成できます。

#### 制約付きジェネリクス

```typescript
interface Lengthwise {
  length: number;
}

function logLength<T extends Lengthwise>(arg: T): T {
  console.log(arg.length);
  return arg;
}

logLength("hello"); // OK
// logLength(123); // エラー: number型にはlengthプロパティがありません
```

- `T extends Lengthwise`により、`T`は`length`プロパティを持つ型でなければならないという制約を設けています。
Gradleビルド実行後、何が行われるか？

Gradleでビルドを実行した際には、複数のタスクが自動的に処理され、最終的に成果物（アプリケーションやライブラリ）が生成されます。以下では、Gradleビルドの基本的な流れと、それぞれのステップで何が起きるのかを説明します。

### 1. **Gradleビルドの基本ステップ**
Gradleのビルドは、通常、以下の3つのフェーズを経て進行します。

1. **Initialization（初期化）フェーズ**
2. **Configuration（設定）フェーズ**
3. **Execution（実行）フェーズ**

---

### 1. **Initializationフェーズ（初期化フェーズ）**
このフェーズでは、Gradleがプロジェクトの設定を読み込み、どのプロジェクトがビルドに含まれるかを決定します。プロジェクトがシングルプロジェクトなのか、マルチプロジェクトなのかもここで判定されます。

#### 主な処理:
- `settings.gradle` ファイルが読み込まれ、どのプロジェクトが参加するかが判断されます。
- マルチプロジェクト構成の場合は、すべてのプロジェクトが識別されます。

---

### 2. **Configurationフェーズ（設定フェーズ）**
Gradleはビルドスクリプト（`build.gradle`）を評価し、どのタスクが必要か、どの順序で実行するかを決定します。タスクの依存関係が解決され、この時点で実際のビルドプロセスに向けた準備が整います。

#### 主な処理:
- `build.gradle` ファイルを解析し、どのプラグインが使用されているか、どのタスクが定義されているかを決定します。
- 必要な外部依存関係が解析され、Gradleが自動的にライブラリをダウンロードすることがあります（通常は `repositories` ブロックで指定された場所から）。
- タスクの依存関係が設定され、どの順序でタスクが実行されるかが決まります。

---

### 3. **Executionフェーズ（実行フェーズ）**
このフェーズでは、設定されたタスクが実際に実行されます。`build` タスクなど、特定の目標に向けて一連のタスクが順次実行されます。

#### 主な処理:
- 各タスクが依存関係に従って実行されます。例えば、コンパイルタスクの前に、必要に応じてクリーンタスクが実行されることがあります。
- ビルドの実行中には、以下のような一般的なタスクが順番に実行されます：
  - **`clean`**: 以前のビルド成果物（`build/`ディレクトリ内のファイル）を削除します。
  - **`compileJava`**: ソースコード（`src/main/java`）をコンパイルし、クラスファイルを生成します。
  - **`processResources`**: リソースファイル（`src/main/resources`）を処理して、クラスファイルと一緒に出力フォルダにコピーします。
  - **`classes`**: コンパイルされたクラスファイルとリソースを `build/classes/java/main/` に出力します。
  - **`jar`**: クラスファイルやリソースをまとめて、最終的な `JAR` ファイルを生成します（`build/libs/`ディレクトリに配置）。
  - **`test`**: 単体テストがある場合、テストクラスを実行して結果を生成します（`build/reports/tests` にテストレポートが出力されます）。

---

### ビルド後に何が生成されるか

1. **コンパイル結果**:
   - Javaのソースコードがコンパイルされ、`build/classes/java/main/` フォルダに `.class` ファイルとして出力されます。

2. **成果物の生成**:
   - `build/libs/` フォルダに、`JAR` ファイルまたは `WAR` ファイルなどの成果物が生成されます（プロジェクトによる）。

3. **テスト結果**:
   - `build/reports/tests/` フォルダに、テストの結果がレポートとして保存されます。成功したテストや失敗したテストの詳細なレポートが含まれます。

4. **依存関係のダウンロード**:
   - 外部ライブラリがまだローカルにキャッシュされていない場合、Gradleがそれらをリモートリポジトリ（例：Maven Central）からダウンロードし、`~/.gradle/caches/` にキャッシュします。

---

### ビルドが成功すると

ビルドが成功すると、以下のメッセージが表示されます。

```bash
BUILD SUCCESSFUL in 3s
3 actionable tasks: 3 executed
```

- **`BUILD SUCCESSFUL`**: ビルドが成功したことを示します。
- **`3 actionable tasks: 3 executed`**: 実行されたタスク数が表示されます。

---

### まとめ

Gradleでビルドを実行すると、以下のプロセスが進行します:
1. Gradleはプロジェクトの設定を読み込む。
2. `build.gradle` で定義されたタスクや依存関係を解決し、タスクの実行順序を決定。
3. 各タスクが実行され、最終的な成果物（JARファイル、WARファイルなど）が生成され、テストが実行される。

これにより、プロジェクトがビルドされ、成果物としてデプロイ可能なファイルが生成されます。
GoのbigCacheのサンプルコード


## bigCacheのリポジトリ


[https://github.com/allegro/bigcache](https://github.com/allegro/bigcache)


## Example(echo使用)


```go
// キャッシュの設定
config := bigcache.Config{
	// シャードの数（2のべき乗でなければならない）
	Shards: 1024,
	// エントリが削除されるタイムアウトの時間
	LifeWindow: 10 * time.Minute,
	// 期限切れのエントリを削除する間隔
	CleanWindow: 30 * time.Second,
}

// キャッシュの初期化(アプリケーション実行時のみ行うmain.goやroute.goなど)
cache, err := bigcache.NewBigCache(config)
if err != nil {
	e.Logger.Fatal(err)
}

// キャッシュお試しのルート
cacheGroup := publicGroup.Group("/cache")
cacheGroup.GET("/set", func(c echo.Context) error {
	err = cache.Set("hoge", []byte("hogehoge"))
	err = cache.Set("foo", []byte("foofoo"))
	err = cache.Set("buzz", []byte("buzzbuzz"))
	err = cache.Set("fuga", []byte("fugafuga"))

	return c.JSON(http.StatusOK, "set done")
})
cacheGroup.GET("/list", func(c echo.Context) error {
	iterator := cache.Iterator()
	results := make(map[string]string)

	for iterator.SetNext() {
		entry, err := iterator.Value()
		if err != nil {
			return c.JSON(http.StatusInternalServerError, "キャッシュのエントリを取得できませんでした")
		}
		results[entry.Key()] = string(entry.Value())
	}

	return c.JSON(http.StatusOK, results)
})

```
Java Gold SE11対策 ネストしたクラスシリーズ①インナークラスについて

## はじめに

Java Goldの「クラスとインターフェイス」という単元では、
クラス内に定義したクラスを差す「ネストしたクラス」についての問題が出題される。

試験で問われるネストしたクラスには下記の4つがある。

・インナークラス
・staticインナークラス
・ローカルクラス
・匿名クラス

学習していてこれらがどうもごっちゃになり紛らわしい。

そこで、このシリーズではキチンと整理して理解するために、これらについてまとめていく。
現在の自分のようにJava Goldの学習をされる方のお役に立てると嬉しい。

## インナークラスとはクラスの中に定義したクラス

まずは、インナークラスの例をみていただきたい。

```Outer.java
public class Outer {
    class Inner {
        // 何らかの処理
    }
}
```

Outerクラスの中にInnerというクラスが存在する。
このInnerクラスのように、クラスの中に定義したクラスを **「インナークラス」** と呼ぶ。

このインナークラスに対して、「外側」にあたるOuterクラスは **「エンクロージングクラス」** と呼ばれる。


## インナークラスはメンバとして定義するもの
**インナークラスはエンクロージングクラスのメンバ** として定義する。
メンバと聞くと、フィールドやメソッドがまず思い浮かぶが、
インナークラスはこれらのように取り扱われるクラスである。

したがって、**アクセス修飾子を付けること** ができるのだ。
なお、**すべて** のアクセス修飾子が使える。

### 【インナークラスを修飾できるアクセス修飾子】
- public
- protected
- private
- abstract
- final
- static

## インスタンス化するには
インスタンス化するには、インナークラスを囲う **エンクロージングクラスを先にインスタンス化せねばならない** 。
前述の例でいえば、Outerクラスをnewした上で、Innerクラスをnewするのだ。
インナークラスのインスタンス化を行う場合、エンクロージングクラスの参照を用いて、
そのインスタンスへの参照とnew演算子を使ってこれを実施する。

インスタンス化の記述が通常のクラスのインスタンスとは異なっていて、
「外部クラスの型.内部クラスの型 内部クラスの変数 = 外部クラスの変数.new 内部クラスの型()」と記述することでインスタンス化される。

```Main.java
public class Main {
    public static void main(String args){
        Outer outerClass = new outer();
        Outer.Inner innerClass = outerClass.new Inner();
    } 
}
```

これは **「インナークラスはメンバとして定義するもの」** という特徴と関連付けて覚えるといい。メンバとして定義されるフィールド変数やメソッドは、それを定義しているクラスがインスタンス化されていれば利用できない。
インナークラスもメンバとして定義されるものであるためにエンクロージングクラスのインスタンス化が前提となるのだ。

## staticフィールドとstaticメソッド
staticインナークラスでない、ただのインナークラスにstaticなフィールド変数やstaticなメソッドを実装すると **コンパイルエラー** になるので注意。


次回はstaticインナークラスについてまとめる。
Gemini API ― Node.js SDK をKotlin/jsで

# 概要
- [Gemini編 - 総目次](https://qiita.com/search?sort=&q=tag%3AGemini++user%3Ashokkaa)

(日記)KotlinかJavaのSDKがあればよいのだが、無いものはしかたないのでの自前で型定義を。

# 環境
- Ubuntu 24.04
- Kotlin 2.0.20
- Node.js v22.4.1

# Quick Start
```build.gradle.kts
plugins {kotlin("multiplatform") version "2.0.20"}
repositories {mavenCentral()}

kotlin {
    js {
        nodejs()
        binaries.executable()
    }
    sourceSets {
        jsMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
            implementation(npm("@google/generative-ai", "0.19.0"))
        }
    }
}
```
```kotlin:src/commonMain/kotlin/Main.kt - シンプルな一問一答
import google.generativeai.GEMINI_1_5_FLASH
import google.generativeai.GoogleGenerativeAI
import kotlinx.coroutines.await
import kotlin.js.json

suspend fun main() {
    val apiKey = getApiKey()
    val genai = GoogleGenerativeAI(apiKey)
    val model = genai.getGenerativeModel(json("model" to GEMINI_1_5_FLASH))
    val result = model.generateContent("三角、四角、五角形、の次は? 簡潔に").await()
    println(result.response.text())
}
```

```kotlin:src/jsMain/kotlin/GoogleGenerativeAI.kt - 型情報の外部宣言(js依存コード)
@file:JsModule("@google/generative-ai") // NPMモジュール名
@file:JsNonModule

package google.generativeai

import kotlin.js.Json
import kotlin.js.Promise

actual external class GoogleGenerativeAI actual constructor(apiKey: String) {
    actual fun getGenerativeModel(params: Json): GenerativeModel
}

actual external class GenerativeModel {
    actual fun generateContent(request: String): Promise<GenerateContentResult>
}
// 以下略...
```
- 名前空間(複数クラス等)をexportするNPMモジュールを参照する場合、packageに対して@JsModuleを付与する
- suspend関数としてマップしたいが、まずはPropmse.await()
- multiplatformということで対応するexpect定義ファイルも必要(`src/commonMain/kotlin/GoogleGenerativeAI.kt`)

[全コード(TODO)](https://github.com/kyoya-p/samples/tree/master/2024/Gemini/GemCode6_KtJs)
```sh:テスト実行
export GOOGLE_API_KEY=<your-api-key>
export kotest_filter_tests="generateContent" # テスト対象を指定する場合
sh gradlew jsNodeTest
```
テストレポート: `build/reports/tests/jsNodeTest/index.html`

# チャット
以下kotest用のテストコード
```src/commonTest/kotlin/Tests.kt
//..
    test("startChat") {
        val apiKey = getApiKey()
        val genai = GoogleGenerativeAI(apiKey)
        val model = genai.getGenerativeModel(json("model" to GEMINI_1_5_FLASH))
        val chat = model.startChat()
        chat.sendMessage("三角、四角、の次は? 簡潔に").await().response.text().also(::println) shouldContain "五角"
        chat.sendMessage("その次は? 簡潔に").await().response.text().also(::println) shouldContain "六角"
        chat.sendMessage("最後の答えの前は? 簡潔に").await().response.text()
            .also(::println) shouldContain Regex("五角")
    }
//..
```
※AIの答えなので必ずテストが成功するとは限らない...

# [TODO]ファイル
# [TODO]画像認識
# [TODO]関数実行

# 参考
GoでOCR試してみた

ひょんなことからOCRについて気になったので簡易的なものを実装してみた。
オープンソースのtesseractというOCRエンジンがあり、今回はgo向けのラッパーgosseractを利用させてもらいました。
[otiai10/gosseract](https://github.com/otiai10/gosseract "gosseract")

# 構成
* go
* echo
* react
* typescript
* docker
* tesseract
* gosseract

# Go
```go:main.go
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"

	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"
	"github.com/otiai10/gosseract/v2"
)

func main() {
	e := echo.New()
	e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
		AllowOrigins:     []string{"http://localhost:3000"},
		AllowHeaders:     []string{echo.HeaderOrigin, echo.HeaderContentType, echo.HeaderAccept, echo.HeaderAccessControlAllowHeaders, echo.HeaderXCSRFToken},
		AllowMethods:     []string{"GET", "POST", "PUT", "DELETE"},
		AllowCredentials: true,
	}))
	e.POST("/", analysisMedia)
	e.POST("/movie", analysisMovie)
	e.Logger.Fatal(e.Start(":8080"))
}

func analysisMedia(c echo.Context) error {
	file, err := c.FormFile("file")
	if err != nil {
		return nil
	}
	src, err := file.Open()
	if err != nil {
		return nil
	}
	defer src.Close()

	fileModel := strings.Split(file.Filename, ".")
	fileName := fileModel[0]
	extension := fileModel[1]

	f, err := os.Create(fmt.Sprintf("%s_out.%s", fileName, extension))
	if err != nil {
		panic(err)
	}

	if _, err = io.Copy(f, src); err != nil {
		return err
	}
	defer os.Remove(f.Name())

	client := gosseract.NewClient()
	defer client.Close()
	client.SetLanguage("eng", "jpn")
	client.SetImage(f.Name())
	text, _ := client.Text()

	return c.String(http.StatusOK, text)
}
```

# 結果
以下の画像のような結果となった。
![スクリーンショット 2024-06-07 15.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794308/932268e5-eaed-2ebb-a91d-e5dbda44125a.png)

スキャンされたデータはそこそこの精度で解析できた。
スマホで撮影したレシート画像では、お話にならないデータが返却された。


# 感想
結論、実験程度であればかなり良いのではと思った。
出力される結果を使いたいなら整形が必要でchatGPTなどのAIで整形して使うのが一連の流れになりそう。
他のocrエンジンとしては、Google　Cloud Vision APIやAzure Computer Visionなどがあり、調べたところGoogle Cloud Vision APIが一番精度良さそう。

# おまけ
chatGPT-4oで画像アップロードできるようになり、画像を解析してJSONを出力できるようになった。
先ほどの画像と同じものをアップロードしJSONで出力をお願いすると、以下の内容が返っていきた。

```json:chatGPT4o
{
  "store": {
    "name": "FamilyMart",
    "branch": "一の橋店",
    "address": "東京都港区麻布十番1-2-10",
    "phone": "03-3560-3895"
  },
  "receipt": {
    "date": "2016年9月29日",
    "day_of_week": "木",
    "time": "12:45",
    "items": [
      {
        "name": "十六茶",
        "price": 151,
        "discount": -22
      },
      {
        "name": "吊るしベーコン",
        "price": 198,
        "discount": 0
      },
      {
        "name": "茶碗蒸し",
        "price": 133,
        "discount": 0
      }
    ],
    "totals": {
      "subtotal": 460,
      "discount": -22,
      "total": 460,
      "tax": 34
    },
    "payment": {
      "given": 510,
      "change": 50
    }
  },
  "transaction": {
    "register_id": "2-4986",
    "clerk_id": "No. 022"
  }
}

```
完璧ですね。。。

APIでこの実装ができるか試していないが、選択の一つになり得るかもしれない。
AgentNavigationを利用する際のメモ

## UnityECS版のNavMeshAgent

AgentNavigationのパッケージを使えば自分のECSベースのプロジェクトで、GameObjectでいうNavMeshAgentをほぼ再現できますが、マルチコアを意識して、scheduleParalleとJobHandleによる効率化を考えると、Localtransformへのアクセス競合が問題になってきたので、備忘録を残します。

Pathを計算して経路を導出し、移動方向を決める流れは同じですが、最終的にLocaltransformに位置情報を記録するのは、AgentLocomotionJob の中で行われています。


public void Execute(ref LocalTransform transform)
のスクリプトは、refを用いているので、他のJobから
[ReadOnly] public ComponentLookup<LocalTransform> LocalTransformLookup;
のようにLocaltransformにアクセスしても、State.Dependencyにしていれば競合が発生することはありません。
これはUnity内で自動的にタイミングを制御してくれているかららしいですが、言い換えるとマルチコアを十分に生かし切れていない、ということになります。
このような場合、JobHandleを設定してジョブを他のスレッドに投げ、真のマルチコア動作をしたいですが、その方法として、NativeListを作ってLocaltransformの情報を保存しておき、そのNativeListに[ReadOnly]でアクセスすることで、マルチコアを最大限に生かすことが可能です（EntityCommandBuffer.ParallelWriterの併用が必要）


また、Dependencyを用いず、JobHandleを用いて並列でJobに投げるためには、以下のAgentNavigationのパッケージ内のScriptを改造し、既存スクリプトと合体させます（アップデート時にエラーの可能性があるので、要注意）
AgentLocomotionJob
AgentSeekingSystem
NavMeshSteeringSystem

※AgentSeekingSystem は直線的な移動のみ計算し、NavMesh を使わない場合に限定されている。
　NavMeshSteeringSystem は NavMesh を使った高度な経路計算に利用される。
　どちらもbody.forceに対して数値を代入している。
【解決方法】Wayland環境にでFloorpの最小化・最大化ボタンが無い

# Wayland環境にでFloorpの最小化・最大化ボタンが無い
KDE Plasma(Wayland)環境でFloorpを実行した際に、最小化・最大化ボタンが無いという問題が発生したのでメモ

## 解決方法
`xdg-desktop-portal-gtk`をインストールする。
たったこれだけです。

### 手段
1. **Ctrl+Alt+T**でターミナルを開きます。
2. 以下のコマンドを実行します。
   ```bash
   $ sudo pacman -S xdg-desktop-portal-gtk
   ```
3. パスワードを入力し、インストール確認で`y`を入力。
4. インストールが終わったらシステムを再起動してください。

再起動が終わったら、正常に表示されているはずです。
鶴見区民まつりで Media Pipeを 使ったARゲームを出展しました

## 主題

- 社内のレクで、お祭りで出店する形になったのでゲームを作りました

## 作ったもの (多分プレイできます)

https://turumimaturi-priv-5psp17dui-hayashitomoharus-projects.vercel.app/

## コアロジック
- media pipeというGoogleが出しているライブラリを使ってっランドマークを検出
- 円の範囲をランダムに設定
- 手のひらのランドマークを当たり判定として、スコアを加算したりいろいろ

## 感想
- media pipeが思ったより簡単に描画できたので良かったです
- エフェクトなどでリッチにする部分を、自由に良い感じにするのが楽しかったです
- AIをたくさん使って、リファクタ後回しにしたら1週間くらいでできました
- フロント部分は社内の方が作ってくれて、とてもきれいにできて良かったです
- 遊んでくれた方ありがとうございました

## 弊社
よかったら見ていってください

https://skygrid.co.jp/
【WordPress反省】カスタム投稿のカテゴリー設定ミス

## 症状

カスタム投稿`news`専用のカテゴリーアーカイブに、取得したカテゴリー名からリンクさせたかった。テスト投稿をいくつか入れたが投稿なしになっていた。
「お知らせ」で`archive-news.php`のサイドバーにカテゴリー名と月名からそれぞれの一覧に飛ばしたかった。
月別は問題なく一覧表示されたが、カテゴリーはリンク先が`/category/example/`となり、投稿が空だった。

## 原因

カテゴリー名取得に`get_terms()`関数を使い、`'post_type' => 'news',の指定でいけるだろうと思っていた。

```php:archive-news.php
$categories = get_terms(array(
 'taxonomy' => 'category',
 'post_type' => 'news',
//  以下略
 ));
```

そして

```php:archive-news.php
// カテゴリー名とリンクを出力
if (!empty($categories) && !is_wp_error($categories)) {
    echo '<ul>';
    foreach ($categories as $category) {
        // カテゴリーリンクを取得
        $category_link = get_term_link($category);

        // リンクが正しく取得できたかを確認
        if (!is_wp_error($category_link)) {
            echo '<li><a href="' . esc_url($category_link) . '">' . esc_html($category->name) . '</a></li>';
        }
    }
    echo '</ul>';
}
?>
```

## 解決策

1: カスタムタクソノミーでカテゴリーを作り直して/category-news/example/で表示させた。 
`taxonomy-news-category.php`を設置して`functions.php`に以下を記述

```php:functions.php
function create_news_taxonomy() {
 register_taxonomy(
 'news-category', // カスタムタクソノミー名
 'news', // カスタム投稿タイプ名
 array(
 'label' => __('News Categories'),
 'rewrite' => array('slug' => 'news-category'),
 'hierarchical' => true,
 )
 );
}
add_action('init', 'create_news_taxonomy')
```

2: 使わなかったが、`/category/example/`で表示できるように。  

```php:functions.php
function create_custom_post_type() {
 register_post_type('news',
 array(
 'labels' => array(
 'name' => __('News'),
 'singular_name' => __('News')
 ),
 'public' => true,
 'has_archive' => true,
 'rewrite' => array('slug' => 'news'),
 'supports' => array('title', 'editor', 'thumbnail'),
 'taxonomies' => array('category') // ここでデフォルトのカテゴリーを使えるようにする
 )
 );
}
add_action('init', 'create_custom_post_type');
```

なお月別は`<?php wp_get_archives(); ?>`だけで済む。
golang-migrateを使ってみた(アプリケーション編)

### ソースコード
```go
package main

import (
	"database/sql"
    "fmt"
    "log"

	_ "github.com/lib/pq"
    "github.com/golang-migrate/migrate/v4"
    "github.com/golang-migrate/migrate/v4/database/postgres"
    _ "github.com/golang-migrate/migrate/v4/source/file"
)
func main(){

	// PostgreSQL に接続
    db, err := sql.Open("postgres", "postgres://postgres:password@localhost:5432/dbname?sslmode=disable&search_path=test_schema")
    if err != nil {
        log.Fatalf("Failed to connect to the database: %v", err)
    }
    defer db.Close()

    // マイグレーションを準備
    driver, err := postgres.WithInstance(db, &postgres.Config{})
    if err != nil {
        log.Fatalf("Could not create postgres driver: %v", err)
    }

    // マイグレーションのインスタンスを作成
    m, err := migrate.NewWithDatabaseInstance(
        "file://db/migrations",
        "postgres", driver)
    if err != nil {
        log.Fatalf("Failed to create migrate instance: %v", err)
    }

    // マイグレーションの実行
    if err := m.Up(); err != nil && err != migrate.ErrNoChange {
        log.Fatalf("Could not run up migrations: %v", err)
    } else {
        fmt.Println("Migrations applied successfully!")
    }

}
```

### 処理の内容

1. DBと接続  
    接続するDBの情報を指定します。スキーマを指定することが多いかと思うので、「?search_path=」で対象のスキーマを指定してあげます。
    処理が終了した際にか必ずDB接続を閉じるように「defer db.Close()」の宣言をします。
    ```go
        db, err := sql.Open("postgres", "postgres://postgres:password@postgres-db:5432/example?sslmode=disable&search_path=test_schema")
        if err != nil {
            log.Fatalf("Failed to connect to the database: %v", err)
        }
        defer db.Close()
    
    ```
 
2. インスタンスの作成  
    マイグレーションを行うためのインスタンスを作成します。接続情報の不備などがあればここでエラーが発生します。  
    
    ```go
        // マイグレーションを準備
        driver, err := postgres.WithInstance(db, &postgres.Config{})
        if err != nil {
            log.Fatalf("Could not create postgres driver: %v", err)
        }
    
        // マイグレーションのインスタンスを作成
        m, err := migrate.NewWithDatabaseInstance(
            "file://db/migrations",
            "postgres", driver)
        if err != nil {
            log.Fatalf("Failed to create migrate instance: %v", err)
        }
    
    ```
    また「"file://db/migrations"」と記載をしていますが、ファイルシステムではなくAWS S3やGithubにも対応できるようです。
    - ファイルシステム: file://path/to/migrations
    - AWS S3 バケット: s3://bucket-name/path/to/migrations
    - GitHub: github://owner/repo/path/to/migrations


3. マイグレーションの実行  
    実際にUp()を使用して、マイグレーションを実行します。
    ```go
        // マイグレーションの実行
        if err := m.Up(); err != nil && err != migrate.ErrNoChange {
            log.Fatalf("Could not run up migrations: %v", err)
        } else {
            fmt.Println("Migrations applied successfully!")
        }
    ```

### まとめ
今回はgolang-migrateをCLIではなくgoアプリケーションから実行してみました。  
今回はファイルシステムのマイグレーションファイルをもとに実行してみましたが、実際にアプリケーションで使用する際はAWS S3やGitHubから使用するほうが多いのではないかと思いました。
laravel+react+Inertiaのプロジェクトを立ちあげる

## はじめに

laravel11を立ちあげる。
windowsで行うがwindows特有の操作はないのでMacユーザーでも使用できると思う。
laravelドキュメントのスターターキット参考にしている。
https://laravel.com/docs/11.x/starter-kits#laravel-breeze

## 目次
1.laravelを新規で立ちあげる
2.laravel breezeのパッケージをインストールする
3.laravel breezeのインストール

　
## laravelを新規で立ちあげる
```
curl -s "https://laravel.build/プロジェクト名" | bash
```

プロジェクト名のところはディレクトリの名前になるので好きにつけてもらっておっけい。
インストールにかなりの時間を要します。
15分ほど？　
PCのスペックが低いのかなぁ～（i5-1135G7）
プロジェクトが立ち上がったら
```
cd プロジェクト名
./vendor/bin/sail up
```
をコマンドで実行した後[localhost]をブラウザで開き、welcome.phpが表示されているか確認する。
![スクリーンショット 2024-10-05 224506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/907a946a-0cad-a7e8-c76a-e47fdd597770.png)

だいたいlaravelの新規立ち上げ時はエラーになるのでエラーになやんだらこちらを参考に。
https://qiita.com/sota_sota/items/25568470ac3b0f0d3957
　

## laravel breezeをインストールする
```
sail composer require laravel/breeze --dev
```
上記でsailが使えないなどのエラーになる場合は
```
./vendor/bin/sail composer require laravel/breeze --dev
```
を実行する。
breezeは認証機能とかでよく使うが今回は、
これを使ってreactとInertiaもインストールします。
　
## laravel breezeのインストール
```
php artisan breeze:install
```

ドキュメントに書かれているコマンドを実行していく。
もしphpが入っていない場合はここでエラーになるかと思われるのでインストールする。
※エラーでてインストールする際は最後の章を読んでからにしてほしい。

installをすると3回選択肢が出てきてカスタマイズできる。
ここでReact Inertiaという文言を選択。（正確な文言は覚えていないが。。。）

残りのふたつはお好みでいいが、こだわりがなければ
Typescript、Php unitでいいかと思う。
初学者は使わないと思うし、なんでもいいところかと思う。

　
## 最後にプロジェクト立ち上げがうまくいかない方

windowsだとcurlコマンドが使えないので
Ubuntuの環境でプロジェクトを立ち上げる人も多いかと思うが
windowsの環境にphpはあるけど、Ubuntuの環境にphpがない場合などもある。

 　
この確認方法はコマンドプロンプトで
```
php -v
```
を実行したときにバージョンが出ればwindows環境には入っていることになる。
　
Ubuntu環境にphp nodeなどがないけど
windowsにはある場合は2つの改善策がある。

### Ubuntuからwindowsの環境に入って操作する。
これが一番手っ取り早い。
Ubuntuの環境のディレクトリは
mnt/cの中はwindowsのcドライブの環境になっている。

なので
```
cまで移動してから一連の流れを試してみてほしい。
cd mnt/c

curl -s "https://laravel.build/プロジェクト名" | bash
cd プロジェクト名
./vendor/bin/sail up   // ブラウザ確認用コマンド
sail composer require laravel/breeze --dev
php artisan breeze:install
```
累積和 Python

# 累積和
和を累積していく探索法

計算結果を都度、配列に格納して不要な再計算をせずにデータを活用する。

前処理の結果を保存することで結果(クエリ)が速く返ってくる。


```calc.py

arr = [1,2,3,4,5,6]
num = len(arr)
result = [0]*num #結果を格納
for i in range(0,num):
    result[i] = result[i-1] + arr[i]
    
print(result)#[1, 3, 6, 10, 15, 21]

#1~4まで計算した値が欲しい場合
print(result[3]) # 10

```
(SSD1327)M5NanoC6で温度を表示して遊ぶ。





x 過去ログを見よ!!
x Arudinoで「新規タブ」の操作ができる人


https://qiita.com/caa45040/items/44d10fd07dcd82a1033f


結果


![o_coq491.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5c892187-0060-2793-5d44-fb8f5656b91d.jpeg)


プログラム


SSD1306_ADC_TMP1o2_M5NanoC6_1.ino



```c++


//ssd1327_ADC_TMP1o2_M6NanoC6_1


//ヘッダーファイル
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1327.h>
#include "nana_Grvove_Temperature1o2.h"
#include "nana_Grvove_ADC.h"


//定義
#define SCREEN_WIDTH  128    // OLED display width, in pixels
#define SCREEN_HEIGHT 96    // OLED display height, in pixels
#define OLED_RESET     -1   // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1327 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define setCursorAA(AA,BB) setCursor(AA+16,BB)


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(SSD1327_WHITE);
  // テキストの開始位置を設定
  display.setCursorAA(0, 16);

  //電圧を求める
  float Voltage; //電圧
  Voltage = nana_Grvove_ADC();
  //Voltage = 2.5; //debug

  //温度を求める
  float Temperature; //温度
  Temperature = nana_Grvove_Temperature1o2(Voltage);
  //Temperature= 46.0;   //46を設定 debug

  // 温度を表示
  display.println((int)Temperature);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop


```


nana_Grvove_ADC.h



```c++


//インクルド
#include <Arduino.h>
#include <Wire.h>

//I2Cのアドレス
#define Addr 0x50

float nana_Grvove_ADC() {

  //内部アドレスの設定
  Wire.beginTransmission(Addr);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(2);

  //データの読み込み
  Wire.requestFrom(Addr, 2);
  delay(1);
  int h, l;
  if (Wire.available() == 2) {
    h = Wire.read();
    l = Wire.read();
  }//endif
  delay(1);

  //値の変換
  int adc1 = ((h & 0x0F) << 8) + l;
  int vo = (adc1 * 6000) >> 12; // (adc1*(3/4096))*2

  return( ((float)vo) * 0.001 );
  
}


```

nana_Grvove_Temperature1o2.h


```c++


#include <math.h>

const int B = 4275;               // B value of the thermistor
const int R0 = 100000;            // R0 = 100k

float nana_Grvove_Temperature1o2(float Voltage){
    //入力は、電圧　出力は、温度
    //float R = 1023.0/a-1.0;
    //R = R0*R;
    float R,Current,Resistance; 
    Current = Voltage / 100000.0;   //電流を求める
    Resistance = 5.0 / Current;     //全体の抵抗を求める
    R = Resistance - 100000.0;      //全体の抵抗から検出抵抗を引く

    return( 1.0/(log(R/R0)/B+1/298.15)-273.15 ); // convert to temperature via datasheet

}


```
【大まかな手順】【最速】ラズベリーパイの初期セットアップ手順まとめ ～VNCセットアップまで。

10回以上ラズパイのセットアップを行ってきたので、セットアップ手順をメモります。
VNCでリモートできるようになるまでの手順です。
## 環境
ラズベリーパイ3A
ラズベリーパイ3B
ラズベリーパイ3B+
ラズベリーパイ4B
で試しました。
## 用意するもの
ラズパイ	キーボード	マウス	電源アダプタ	microSD
ラズパイ用モニター	ラズパイと接続するHDMI
パソコン

## 開始
### ラズパイにOS入れ
PCにOSイメージをダウンロード
ラズパイに刺すマイクロSDにOSインストール
この時のID（名前）とPW控えとく。Wifiも設定しとく。
### ラズパイ起動
VNC　ON
日本語設定
ラズパイIP確認

### PC側にVNCインストール
VNC起動
VNCからラズパイ接続 new con
ラズパイIPで接続　
ラズパイNameとラズパイPW、OSインストールするときに控えたやつでログイン
こっからVNCで操作可能。

## SDカード破損対策

参考

https://lifehack-dev.net/post-230/


### swap無効化
```
sudo swapoff --all
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile
```
swapが0担っていることの確認
```
free
```



### 完了
【未解決】RFID UHF帯について調べたことまとめ

## やりたいこと
ユニクロのレジに使われているRFIDリーダー。あれを利用して忘れ物防止を図りたい。
### 具体的に
財布・スマホ・社員証・車のキー　など外出する際に持つものにRFIDタグを入れる。
玄関にRFIDタグを読み取るリーダを設置し、玄関を通る際にRFIDタグを読み取る。
→登録されたRFIDタグが検出されない場合は忘れ物アリということでアラームを出す。
## 以下調べたこと

### RFID 導入の失敗談
https://camelrush.hatenablog.com/entry/unmanned_cash_register

### RFID UHF帯のリーダーを買うところ
https://www.kickstarter.com/projects/picobarcodescanner/uhf-rfid-lite-hat-for-raspberry-pi-and-pico?lang=ja

### 買うところ2
UHF RFID Lite HAT
https://shop.sb-components.co.uk/products/uhf-rfid-lite-hat?variant=40520163721299

### 周波数帯域について
周波数帯域について

仕様表:

パラメータ	仕様
周波数範囲	EU/英国: 865.1 ～ 867.9 MHz
米国: 902.25 ～ 927.75 MHz
この製品を日本で使用するには、日本の無線周波数規制に適合している必要があります。日本のRFIDに関する規制では、UHF帯の周波数範囲が 915.7～921.7 MHz に設定されています。

提供された製品仕様によると、EU/英国モデルは 865.1～867.9 MHz、米国モデルは 902.25～927.75 MHz で動作します。この範囲には、日本の規制周波数帯（915.7～921.7 MHz）は含まれていないため、米国モデルが一部の周波数で日本の規制帯をカバーする可能性がありますが、日本での使用には法的な問題が生じる可能性があります。

したがって、この製品を日本で使用することは適切ではない可能性があります。日本での使用を検討する際には、対応する日本の周波数範囲をサポートする製品を選ぶことをお勧めします。

## 感想

ドキュメントが英語すぎておそらく詰むポイント多い


【感想まとめ】
rfid uhfは日本で使いやすいやつがでたら試す。
【別の方法を試す】
忘れ物は一か所にまとめる。
→AIを使った画像認識で物がある状況を監視する。
トークナイザー入門勉強会に参加しました

# 勉強会の基本情報

* 【日　時】2024年10月03日 19:30~20:30
* 【会　場】Zoom Online
* 【参加費】無料
* 【主　催】StudyCo
* 【申し込み】https://studyco.connpass.com/event/330887/

# 概要
* 「トークン」とは何なのか、LLMにおいてどのような役割を果たしているかについて

# 資料
* PPT
    * https://speakerdeck.com/payanotty/tokunaizaru-men
* 動画
    * https://youtu.be/H7XN2UXagro

# 内容
* トークンナイザーとは
* トークンID
* Embedding層
* ボキャブラリー
* トークンナイズ手法
* トークンナイゼーション
    * BPE
    * WordPiece
    * Unigram
    * SenencePiece

# 感想
* LangchainのTextSplitterでテキストを分割する方法がいろいろあるが、TokenTextSplitterで分割することが一番いいはず
    * CharacterTextSplitterでテキスト分割する時に、「こんにちは」を「こん」と「にちは」を分けると、LLMへ送信すると間違い意味の言葉が出てしまう
    * 逆にTokenTextSplitterで分割すると上記の問題がないはず
【Android Studio】ショートカットを覚えて効率化しよう！

# はじめに
みなさんAndroidStudioを使用する際にショートカットはどれだけ使えていますか？
AndroidStudioには効率化の為のショートカットがたくさん存在しますが、初学者の方は特にショートカット覚えるのに一苦労されるのではないでしょうか？
そこでショートカットを覚える際にとても便利なプラグイン、Key Promoter Xをご紹介したいと思います。

# Key Promoter Xとは？
Key Promoter Xはショートカットの習得を促進するために設計されたプラグインです。
開発者が頻繁にマウス操作を行う際、その操作に対応するショートカットを通知してくれるため、効率的に作業を進めるための非常に便利なツールになります。

# 導入方法
導入方法は簡単で、`Settings > plugins` より`Key Promoter X`と検索し、インストールするだけで使用できるようになります。

![スクリーンショット 2024-10-06 20.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/d99cbbe5-500a-9271-b1ab-4f82e0968e94.png)

導入後は表示に則り、IDEを再起動してあげてください。

# 使用してみる
導入後、ショートカットにて実行ができるアクションをおこなった場合、以下のようなポップアップでお知らせが届きます。

![スクリーンショット 2024-10-06 20.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/2c880eaa-f82e-99db-de5e-31f738c08716.png)

また、画面右側にKey Promoter Xというメニューが選択できるようになっており、ショートカットで実行が可能であったアクションに対してここに履歴という形で追加されていきます。

![スクリーンショット 2024-10-06 20.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/7b590f87-dad1-2398-d916-85e7be8460cd.png)

このメニューを定期的に見返していくことで、効率可能なアクションをひと目で把握できるというわけです。
最終的にはここが少なくなるように気を使っていくことで、業務の効率化を図ることが可能です。

ひとつひとつのアクションはとても小さな時間ですが、日常的に繰り返していくことで大きな時間のロスとなりかねないので、こういった効率化にも是非取り組んでいただければと思います。

# さいごに
今週親知らずの抜歯があります、下の歯は抜くとパンパンに腫れるので困ったものですね・・・
python 反復処理（自分用）

1.基本編（forを活用）
-
for構文：<strong>for 代入先 in 代入先へ入れる要素</strong>　というのが基本的な構造である。
```
#  for構文による反復処理
#  iという代入先へ5回順番に代入する

for i in range(1,6):  # range(1,6)　⇒　1～5という範囲という意味（1～6ではない）
    print("Hello World")

#  出力  ⇒　Hello World（5回表示される）
```
2.基本編（whileを活用）
-
VBAにもwhileによる反復処理があり、こちらについては理解しやすい。
ちなみに無限ループに陥りやすい
while構文：<strong>while 比較する対象　比較演算子　比較対象</strong>　という構造である。

```
# while構文による反復処理
#  iが5より小さい間は繰り返すという意味

i=0
while i < 5:
    print("Hello World")
    i + = 1　#  この記述がない場合、無限ループとなるため要注意！
    
#  出力  ⇒　Hello World（5回表示される）
```

3.応用編（リスト内包表記）
-
リスト作成の際、通常の反復処理にて実施するとどうしてコードが長くなりがちである。
そんな時は「リスト内包表記」を使うとスッキリし、可読性も向上する。

<strong>list = ["生成対象" for "生成対象" in 生成したい回数や範囲 ]</strong>という構造である。
```
#  反復処理によるリスト作成

num_list=[]
for i in range(1,6):
    num_list.append(i)
print(f"通常の反復処理結果：",num_list)

#  出力 = 通常の反復処理結果：[1,2,3,4,5]


#  リスト内包表記によるリスト作成

num_list = [i for i in range(1,6)]
print(f"リスト内包表記による処理結果：",num_list)

#  出力 = リスト内包表記による処理結果：[1,2,3,4,5]
```

他にもたくさんありそうではあるが、とりあえず今の私が知ってるのはこんな感じです。
AWS Budgetsについて

## AWS Budgetsとは
AWS Budgetsはコストや使用量に対して予算を設定することができます。設定した金額や使用状況のしきい値に近づいたり超えた場合にアラートを受け取ったりアクションを実行するサービスです。

## サービスの詳細
予算は日、月、四半期、年などの周期で設定できます。特定のサービス、リンクされたアカウント、タグなどで予算を設定できます。アラートは、メールやSNSのほかに、Slack等のチャットアプリでも受け取ることができます。また、閾値を超えた時のアクションとして特定のインスタンス停止設定やIAMポリシーやSCPの付与によるリソースの制御も可能です。
Snowflakeのアンロードの結果が0件だった時をハンドリングしたい

Snowflakeのアンロード（`COPY INTO <location>`)は、テーブルの内容をS3などのロケーションにファイルとして出力します。この処理は、テーブルの件数が0件だった時はアンロード処理を行わないとドキュメントに書かれています。

https://docs.snowflake.com/en/sql-reference/sql/copy-into-location#usage-notes

> If the source table contains 0 rows, then the COPY operation does not unload a data file.

しかし0件の時に何らかの処理（例：空ファイルを作成する、例外を発生させる）を行いたい場合があります。そのためには、`COPY INTO <location>`処理の実行結果を利用します

## COPY INTO \<location\>の結果を確認する

例えば、データが存在する`mytable`テーブルのデータを、`my_ext_unload_stage`外部ステージにアンロードする処理を実行してみます。

```sql
COPY INTO @my_ext_unload_stage/d1 from mytable
```

このSQLをSnowflakeのUIで実行した場合、画面上に以下のような実行結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/6c013a85-430e-1442-ef67-c0130b66ddc8.png)

この実行結果のうち、`rows_unloaded`が実際にアンロードされた件数となります。この実行結果をプログラム的に取得することができれば、0件だった時の処理を書くことができます。

## COPY INTO \<location\>の結果をカーソルで取得する

`COPY INTO <location>`処理の実行結果は、括弧で囲むことでカーソルとして得ることができます。先ほどの実行結果で分かるように、`rows_unloaded`は一列目にあるので、`FETCH`で指定する最初の変数に値が設定されます。なお、変数やIF文などを利用するため、ストアードプロシージャーとして実行する必要があります。ここでは匿名プロシージャーを使って0件だった時に例外を発生させるようにします。

```sql
WITH unload_sample_proc AS PROCEDURE()
    RETURNS VARCHAR
    LANGUAGE SQL
AS
    $$
    DECLARE
        rs RESULTSET;
        rows_unloaded INTEGER DEFAULT 0;
        UNLOAD_EXCEPTION EXCEPTION;
    BEGIN
        -- アンロード処理を行い、結果をrs変数に保存する
        rs := (COPY INTO @my_ext_unload_stage/d1 FROM mytable);

        LET cur CURSOR FOR rs;
        OPEN cur;
        FETCH cur INTO rows_unloaded;
        IF (rows_unloaded = 0) THEN
            -- アンロード件数が0件だった時の処理
            RAISE UNLOAD_EXCEPTION;
        END IF;
        CLOSE cur;
    END;
    $$
CALL unload_sample_proc()
;
```

このプログラムを`mytable`テーブルが0件の時に実行すると、下記のように例外が発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/4874c025-d8b0-02a3-f0be-45481521cac9.png)

これで、アンロードの結果が0件だった時をハンドリングすることができました。
Rails7 + devise_token_authで RuntimeError (Locking a record with unpersisted changes is not supported. Use `save` to persist the changes, or `reload` to discard them explicitly.)が出る

## 概要
Rails7でdevise_token_authを使用してユーザー認証機能を実装しようとしたところ
サインアップはうまく動作するがなぜかログイン時にRuntimeError (Locking a record with unpersisted changes is not supported. Use `save` to persist the changes, or `reload` to discard them explicitly.)というエラーが出る。
devise_token_authのissueでも同様の事例が報告されているが修正されていないため原因を調査。

## 発生箇所の特定
以下のようにエラーとなっている箇所をオーバライドしてpryしどのような問題が起きているか把握する。
```ruby
class Api::V1::User::Auth::SessionsController < DeviseTokenAuth::SessionsController
  def create
    if field = (resource_params.keys.map(&:to_sym) & resource_class.authentication_keys).first
      q_value = get_case_insensitive_field_from_resource_params(field)

      @resource = find_resource(field, q_value)
    end

    binding.pry
    if @resource && valid_params?(field, q_value) && (!@resource.respond_to?(:active_for_authentication?) || @resource.active_for_authentication?)
      valid_password = @resource.valid_password?(resource_params[:password])
      if (@resource.respond_to?(:valid_for_authentication?) && !@resource.valid_for_authentication? { valid_password }) || !valid_password
        return render_create_error_bad_credentials
      end

      create_and_assign_token

      sign_in(@resource, scope: :user, store: false, bypass: false)

      yield @resource if block_given?

      render_create_success
    elsif @resource && !Devise.paranoid && !(!@resource.respond_to?(:active_for_authentication?) || @resource.active_for_authentication?)
      if @resource.respond_to?(:locked_at) && @resource.locked_at
        render_create_error_account_locked
      else
        render_create_error_not_confirmed
      end
    else
      hash_password_in_paranoid_mode
      render_create_error_bad_credentials
    end
  end

  private

  def create_and_assign_token
    if @resource.respond_to?(:with_lock)
      @resource.with_lock do
        @token = @resource.create_token
        @resource.save!
      end
    else
      @token = @resource.create_token
      @resource.save!
    end
  end
end
```
するとcreate_and_assign_tokenメソッドの@resource.with_lockで発生していることがわかった。

## 原因の調査
.with_lockでは対象のインスタンスが変更されているが保存済みでない場合にこのエラーがでるらしいのでpryで実際の変更内容を見てみる
```ruby
@resource.changes
=> {"uuid"=>["3984f665-0550-43d8-9495-4cc3c42c7b1d", "390556e3-fde4-4d65-ab00-6e7a2e7f39e6"]}
```
uuidがなぜか変更されている。
uuidはUserモデルを作成する際にafter_initializeを使用して作成しているが、ログイン時にもなぜか変更されている。
今回はその原因までは調査しないが、ログイン時にすでに存在するuserモデルがinitializeされているため、すでにuuidが存在する場合はuuidを作成しないように修正することで問題が解決した。

```ruby
# frozen_string_literal: true

class User < ActiveRecord::Base
  after_initialize :add_uuid
  # Include default devise modules. Others available are:
  # :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :confirmable

  def add_uuid
    self.uuid = SecureRandom.uuid unless uuid <=ここにunless uuidを追加
  end
end

```