OmniAICreator/Qiita-1.07M huggingface dataset:
初心者向けPyTorch篇：3.PyTorchにおけるTensorの基本操作と型変換

# PyTorchにおけるTensorの基本操作と型変換

PyTorchは、機械学習やディープラーニングの研究に広く使用されているライブラリです。この記事では、PyTorchでのTensorの基本的な操作と型変換について説明します。

## 基本的なTensorの作成と型の確認

まずは、PyTorchのTensorを作成し、そのデータ型を確認する方法から始めましょう。

```python
import torch
import numpy as np

# 整数のTensorを作成し、データ型を確認
t = torch.tensor([1, 2, 3])
print(t.dtype)  # 出力: torch.int64
```

### 浮動小数点数のTensorへの変換

次に、整数のTensorを浮動小数点数のTensorに変換します。

```python
# 浮動小数点数のTensorを作成し、データ型を確認
t = torch.FloatTensor([1, 2, 3])
print(t.dtype)  # 出力: torch.float32
```

### Long型Tensorの作成

Long型のTensorを作成しますが、もし浮動小数点数が含まれている場合、それらは切り捨てられます。

```python
# Long型のTensorを作成し、データ型を確認
t = torch.LongTensor([1.0, 2.0, 3.3])
print(t.dtype)  # 出力: torch.int64
```

## 様々な初期化方法

Tensorを特定の形状で初期化する方法はいくつかあります。

```python
# ランダムな値、ゼロ、ワンでの初期化
print(torch.rand(2, 3))  # 0-1のランダムな値
print(torch.randn(2, 3))  # 標準正規分布に従うランダムな値
print(torch.zeros(2, 3))  # ゼロで初期化
print(torch.ones(2, 3))   # ワンで初期化
```
### 既存のTensorを模して初期化

既存のTensorと同じ形状で初期化する方法も便利です。

```python
# 既存のTensorと同じ形状でランダム値やゼロ、ワンで初期化
print(torch.zeros_like(t))  # tと同じ形状のゼロTensor
print(torch.ones_like(t))   # tと同じ形状のワンTensor
print(torch.rand_like(t))   # tと同じ形状のランダム値Tensor
```

## Tensorの属性とデバイス間の移動

Tensorの形状やデバイスを確認し、GPUが利用可能な場合はデバイス間でTensorを移動させる方法を見てみましょう。

```python
# 形状とデバイスの確認
print(t.shape)  # Tensorの形状を出力
print(t.device)  # Tensorが存在するデバイスを出力

# GPUが利用可能な場合、TensorをGPUに移動
if torch.cuda.is_available():
    t = t.to("cuda")

# TensorをCPUに戻す
t = t.to("cpu")
```
異なるdeviceのTensorを混ぜて計算できません。

### 型変換とNumpy互換性

Tensorのデータ型を変換し、Numpy配列との相互変換も行います。

```python
# データ型の変換
t.long()  # Long型に変換
t.float()  # Float型に変換

# Numpy配列との相互変換
t = torch.from_numpy(np.random.randn(3, 4))  # Numpy配列からTensorへ
t_arr = t.numpy()  # TensorからNumpy配列へ
```

## Tensorの操作と変形

Tensorに対する基本的な算術操作や、形状の変更について説明します。

```python
# Tensorの加算とインプレース操作
t = t + 3  # 全ての要素に3を加算
t = t.add(torch.ones(2, 3))  # t = t + 3と同じ
t.add_(torch.ones(2, 3))  # t自体を更新（「t =」が不要）

# Tensorの転置
t = t.T  # Tensorの転置

# Tensorの形状変更
t = torch.randn(12, 3, 4, 4)
t = t.view(12, 48)  # 新しい形状に変更
print(t.shape)  # 出力: torch.Size([12, 48])

# さらに形状を変更
t = t.view(1, 12, 48, 1)
t = torch.squeeze(t)  # 不要な次元を削除
print(t.shape)  # 出力: torch.Size([12, 48])
```

以上で、PyTorchにおけるTensorの基本的な操作と型変換についての解説を終えます。これらの基本操作をマスターすることで、より複雑なディープラーニングモデルの構築に役立てることができます。
【DAY36】チーム開発におけるGit

## はじめに
私は個人開発ではGit、Githubを使っていますが、チーム開発ではGit、Githubを使ったことがほとんどなく、コンフリクトに遭遇したこともありません。Gitの知識はチーム開発をする上では必須の知識であるため、もっと学びたいと考え、サポーターズ主催の勉強会「チーム開発でコンフリクトしないためのGit・GitHubの使い方」に参加させていただきました。そこでの学びをここに記します。

## Gitとは
バージョン管理システムの一つです。
分散型のシステムで、個人のPCで完結し、他の人に影響を及ぼさずに変更ができます。

## Gitのブランチ
ブランチとは、プロジェクト内で並行して作業を進めるための分岐点であり、他の作業に影響を与えず作業することができます。
「メインブランチ」と「作業ブランチ」があり、メインブランチにはmasterやmainというブランチ名が使われます。
作業ブランチには好きな名前をつけられますが、同じ名前のブランチは同時に一つしかつくれません。
作業ブランチで作業したものはメインブランチにマージされるように開発をするのが一般的です。

## GitのHEAD
HEADとは、現在の作業場所を指すポインタであり、「今自分がどこで作業しているか」を表します。
HEADがmainブランチを指しているなら、全てのコミットはmainブランチに対して行われます。

HEADが指す場所は「ブランチ」と「コミット」の2種類あります。
HEADが「ブランチ」を指しているとき、最新のコミットがHEADになります。
HEADが「コミット」を指しているとき、デタッチHEAD状態と呼びます。HEADは直接コミットを指しているため、どのブランチにも属していない状態となります。

## Gitのコンフリクト
コンフリクトとは、2つのブランチをマージしたとき変更が衝突することです。
Gitは衝突したどちらの変更を残すべきか自動的に判定できないため、人間が手動でコンフリクトを解消させる必要があります。

コンフリクトしないためには、「リモートリポジトリ」と「ローカルリポジトリ」の「HEAD」を意識して開発する必要があります。
開発中にHEADがどのブランチを指しているかを常に確認することが重要です。
誤ったブランチで作業をすると、後で意図しないコミットが他のブランチに含まれてしまいます。
また、他の人の作業をローカルリポジトリに取り組むことも重要です。最新のリモートブランチとローカルブランチのHEADを合わせないまま開発をすると、変更履歴がずれてしまいます。

Gitでコンフリクトした時に困らないためには、コミットを小さく保つことが重要です。
そうすることで、もしコンフリクトしても解決が簡単になります。
また、マージもなるべく小さな単位でするといいです。

## Githubのプルリクエスト
プルリクエストの概要欄には、概要や変更内容、テスト内容などを記入します。
リクエストを受けたチームメンバーはコードレビューをします。コメントをするとその内容が表示されます。コメントに対しては返信もできます。
問題がなければプルリクエストをマージします。
プルリクエストを使うとどんな変更があったかを記録に残せます。また、コードレビューしてからマージできます。
Gitにファイルをコミットする手順[超初心者用]

# はじめに
この記事は、Gitにファイルをコミットするための手順について説明しています。

# 1.コミット(commit)とは
コミットとは、一言でいうと「**追加や変更を行ったファイルをGitのリポジトリに保存するためのコマンド**」です。
コミットを利用すると、自分の作業履歴を記録して保持することができます。

次の章で、具体的なコミットの手順について説明していきます。
# 2.コミットの手順

ここから具体的なコミットの手順について説明していきます。

### 2-1.ローカルの作業ディレクトリに移動する
ターミナルを開き、以下のコマンドを入力する。
```
$ cd [作業ディレクトリパス]
```
例 `$ cd ~/~/sample_app`

### 2-2.新しい Git リポジトリを作成するためのコマンドを入力する
このコマンドを実行すると、そのプロジェクトディレクトリが Git によって管理され、コードの変更履歴を追跡したり、以前の状態に戻したりすることができるようになります。

```
$ git init
```
このコマンドは、新しいプロジェクトを始めるときや、既存のプロジェクトをGitで管理したいときに使います。

### 2-3.変更を反映させたいリモートリポジトリを指定する
```
$ git remote add origin [リモートリポジトリのURL]
```
例 `$ git remote add origin https://github.com/user/sample_app`

[リモートリポジトリのURL]は、GitHubのリポジトリページにある「<> Code」の部分を押して、LocalのHTTPSから確認できます。

### 2-4.追加、変更したファイルをステージングする
ステージングとは、一言でいうと「**コミット候補に挙げる**」ということです。
コミットしたくないファイルがある場合は、そのファイルをステージングから外すことができます。

```
$ git add [ステージングしたいファイル/ディレクトリ]
```
カレントディレクトリをステージングすることもできます。
※カレントディレクトリとは、現在作業しているディレクトリのことです。
```
$ git add .
```

### 2-5.Gitにコミットする
```
$ git commit -m "[commitメッセージ]"
```
例 `$ git commit -m "sample message"`

これでGitにコミットすることができました！

# 応用編
### 1.開発ブランチの状態を確認する
```
$ git status
```
追加や変更したファイルの確認ができる。

### 2.プッシュする
プッシュとは、「**ローカルリポジトリの変更をリモートリポジトリへ反映させる**」ことです。
```
$ git push origin [ブランチ名]
```
例 `$ git push origin sample-pages`
ブランチを作成していない場合は`main`を指定すれば問題ありません。

# まとめ
以上でコミットの手順について説明することができました！
 * コミットとは何か
 * コミットの手順
 * プッシュの手順(応用編)

これらについての理解も進んだと思います！
何か不明点や質問等ありましたら、お気軽にコメントしていただけますと幸いです！
異なるVPCに配置されたRDSとの通信 

## はじめに

AWS上でRDSとやり取りをするリソースがRDSとは異なるVPCに配置されている場合、通信を行うためにはいくつかの設定が必要になります。
本記事ではそれらの設定手順とエラーポイントについてまとめていきます。

※RDSの通信相手はEC2を利用しています。

## 前提条件

・コンソール操作で各種リソースを作成
・データベースの作成における、エンジンのタイプなど一部の設定値に関しては要件に応じて読み替えてください。

## RDSの作成

①VPCの作成
・作成するリソースで「**VPCなど**」を選択
・VPCエンドポイントで「**なし**」を選択
・その他の設定はデフォルト

②DBサブネットグループの作成
・①で作成したVPCを選択
・①で作成したVPCのサブネットが存在するAZを2つとも選択
・①で作成したVPCのプライベートサブネットを2つとも選択

③データベースの作成

・作成方法で「**標準作成**」を選択
・エンジンのタイプは「**MySQL**」を選択
・テンプレートは「**無料利用枠**」を選択
・認証情報管理は「**セルフマネージド**」を選択
・①で作成したVPCを選択
・②で作成したDBサブネットグループを選択
・その他の設定はデフォルト

**※セキュリティグループは一旦、「default」のまま**

## EC2の作成

①VPCの作成
・作成するリソースで「**VPCなど**」を選択
・VPCエンドポイントで「**なし**」を選択
・IPv4 CIDR ブロックで①のVPCと重複しないようCIDRを設定
・その他の設定はデフォルト

②EC2の作成
・AMIは「**Amazon Linux 2023**」を選択
・インスタンスタイプは「**t2.micro**」を選択
・キーペア (ログイン)は「**キーペアなしで続行 (推奨されません)**」を選択
・①で作成したVPCを選択
・サブネットはプライベートサブネットを選択
・ファイアウォール (セキュリティグループ)は「**セキュリティグループを作成**」を選択
・既存のインバウンドルール（任意のSSH接続の許可）を削除
・その他の設定はデフォルト

※以下は「**EC2 Instance Connect Endpoint**」によるEC2接続を行う設定のため、必要な場合のみ実施

③セキュリティグループの作成
・①で作成したVPCを選択
・アウトバウンドルールに②で作成したセキュリティグループへのSSH接続を許可するルールを設定

④セキュリティグループの修正
・②で作成したセキュリティグループの修正
・インバウンドルールに③で作成したセキュリティグループからのSSH接続を許可するルールを設定

⑤EC2 Instance Connect Endpointの作成
・サービスカテゴリで「**EC2 インスタンス接続エンドポイント**」を選択
・①で作成したVPCを選択
・③で作成したセキュリティグループを選択
・①でEC2インスタンスを作成したサブネットを選択

※VPC > Endpointsから作成する

⑥EC2インスタンスへの接続
・EC2 Instance Connectタブを選択
・接続タイプで「**EC2 Instance Connect エンドポイントを使用して接続する**」を選択
・⑤で作成したエンドポイントを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637963/39b61733-32ba-964b-bae2-b09be9c689d9.png)

## VPC間接続のための設定
①ピアリング接続の作成
・EC2およびRDSが配置されているVPCをそれぞれ選択
・ステータスが「**承諾の保留中**」になるため、アクションからリクエストを承諾

<font color="RED">※対象のVPCのCIDRが重複している場合、以下のメッセージが表示されピアリング接続の作成できない</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637963/f7abd41f-c5a8-973b-96bb-584ccdee21d1.png)

②ルートテーブルの修正
・EC2およびRDSが配置されているサブネットに紐づくルートテーブルへルートを追加
・通信先には通信先のVPCのCIDRを指定
・ターゲットで「**ピアリング接続**」を選択し、①で作成したピアリング接続を選択

③セキュリティグループの作成
・RDS用のセキュリティグループを作成
・RDSが配置されているVPCを選択
・インバウンドルールにEC2で使用しているセキュリティグループからのポート3306のTCP接続（タイプで「**MYSQL/Aurora**」を選択）を許可するルールを設定

**※EC2へアタッチしているセキュリティグループは送信先入力時の一覧からは確認できないため、セキュリティグループIDを別途メモしておく必要がある。**

・RDSで使用しているセキュリティグループを変更

## 接続確認
```
mysql -h [RDSエンドポイント名] -P 3306 -u [ユーザ名] -p
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637963/90c6599d-d2bf-d34c-d600-3b2c214f6d21.png)

## エラーポイント
```text:実行コマンド
mysql -h [RDSエンドポイント名] -P 3306 -u [ユーザ名] -p
```

①RDSのセキュリティグループ不備
・設定済みのインバウンドルールを削除

```text:実行結果
ERROR 2003 (HY000): Can't connect to MySQL server on '[RDSエンドポイント名]:3306' (110)
```

②EC2側のルートテーブル不備
・RDS側のCIDRへのルート削除

```text:実行結果
ERROR 2003 (HY000): Can't connect to MySQL server on '[RDSエンドポイント名]:3306' (110)
```

③RDS側のルートテーブル不備
・EC2側のCIDRへのルートを削除

```text:実行結果
ERROR 2003 (HY000): Can't connect to MySQL server on '[RDSエンドポイント名]:3306' (110)
```

④EC2側のVPCでDNS解決の設定不備
・DNS解決の有効化を解除

```text:実行結果
ERROR 2005 (HY000): Unknown MySQL server host '[RDSエンドポイント名]' (-2)
```

※RDS側のVPCでのDNS設定は影響しない

## まとめ
異なるVPC間でRDS↔EC2の通信を確立する方法を実施してみました。
EC2以外のリソースを用いて通信をする場合でも、本記事で紹介した設定内容と変わるものではないかと思いますので参考になればと思います。
MySQLのJSON型で数値の小数点を削除する方法

20.0のようになってしまうのを防ぐ方法

roundやfloorなどではダメで、castを使う必要がある

``` sql
update table_name
set json_column = JSON_REPLACE(
json_column, 
"$.field_name", cast(json_column -> '$.field_name' + 1234567 as signed))
```
Tips #014 ギャラリーの検索結果をリスト追加項目として扱いたい話

https://qiita.com/Novskiiiiiiiiii/items/90145dae3648bfe24a5d

前回のTipsでテキストフィールドに入力した結果を曖昧検索でギャラリーに表示する事に成功したわけだが、
そこで終わりではもちろんなくて、結果を使って後続処理を行いたいのである。

例えば経費精算申請をフォームで入力してリストに追加したい場合、フォーム上で計上部門を
計上部門コードで検索してその結果を申請時の計上部門および計上部門名称として登録したい
場面というのはあるあるな要件かと思う。

その際のやり方をCopilot先生に確認しながら進めてみた。

流れとしては次のような感じだ。

１．ギャラリーのItemsにFilter関数で値をセットする
２．ギャラリーのOnSelectプロパティで変数に検索結果がセットされるようにする
３．変数をPatch関数の引数として利用する

１．はすでに実装されているので割愛。

続いてOnSelectプロパティに次のようにセットする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/9d33107b-e897-adc5-3a40-a9c6b32e2ae6.png)

入力の途中だが、Setでグローバル変数を設定できるよーとサジェストしてくれる。
でも初学者にはわかりにくいな。
プログラミング経験がない人はこの変数のくだりでお手上げかもしれん。

    Set(SelectedBumonCode,ThisItem.部門コード)

で、上記のような感じで変数SelectedBumonCodeに検索結果の部門コードをセットしたが、
同様に部門名称も変数に格納したい。

Copilot先生に質問したら以下のように返ってきた。

    Power Appsでは、一度に複数の変数をセットするための直接的な方法はありませんが、
    複数の Set 関数を連続して使用することで実現できます。
    これを一つのアクションにまとめるために、セミコロン（;）を使用して複数の Set 関数を連結します。

なるほど、セミコロンで連結ね。
というわけで以下のようにOnSelectプロパティにセット。

    Set(SelectedBumonCode,ThisItem.部門コード);Set(SelectedBumonName,ThisItem.タイトル)

そしてフォーム設置したボタンに設定しているPatch関数にそれぞれ追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/9b43c63f-3828-d8e2-af95-33d1d3bd0802.png)

が、あれまたエラーになった。
ギャラリーから取得した値はRecord型なんだな。

なので以下のように修正。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/8092214e-ad5b-3ce7-531b-a8d1aeba9932.png)

今度は

    列がありません。式には、型 'Number' の列 ' Id' が含まれていません。

とのこと。

となるとギャラリーからIdも取ってこないといけなさそう。

    Set(SelectedBumonCode,ThisItem.部門コード);
    Set(SelectedBumonName,ThisItem.タイトル);
    Set(SelectedId,ThisItem.ID)

ということで変数にIDもセット。

Patch関数の内容は以下の通り

    Patch(
        test_concur_request,
        Defaults(test_concur_request),
        {
            タイトル:DataCardValue1.Text,
            計上日:DataCardValue2.SelectedDate,
            支払方法: {
                Value: DataCardValue5.Selected.Value
            },
            計上部門コード: {
                Id:SelectedId,
                Value:SelectedBumonCode
            }
        })

リストにはこれで正常に登録された。
なお、部門名称はリスト側で参照項目として部門コードと連動しているので、
部門コードだけ追加すればあとでリスト側で参照項目として部門名称を
ひっぱってきてくれる模様。

新規アイテム登録なのになぜIdが必要なのかは疑問。
整合性の維持らしいが、いじらしいね。

だいぶ進歩したけどまだまだ課題が山積みだなぁ。

以上

https://qiita.com/Novskiiiiiiiiii/items/f84cb51da2c4cc91dddd
Xubuntu 24.04 で Super + Right ( Win + Right ) のショートカットが効かない場合の対処方法

XFCE4 で、Super + Right でウィンドウを「画面右にタイル表示」するショートカットが効かない場合、`$HOME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml`に`tile_right_key`というエントリーが2個存在している可能性があります。

```xml
<property name="<Super>Right" type="string" value="tile_right_key"/>
```

```xml
<property name="<Super>KP_Right" type="string" value="tile_right_key"/>
```

`xfce4-keyboard-shortcuts.xml`を直接編集して、`tile_right_key`というエントリーの片方を`name="<Super>KP_Right"`側を削除して再起動すると解消します。
SPF, DKIM, DMARCメモ

# はじめに
SPF, DKIM, DMARCについてのメモです。自分用。厳密な確認は行っていません。無保証でお願いします。

# どれもDNSを使う
* SPF, DKIM, DMARC全てDNSを使う

# SPF
* SPFは、ざっくり、クライアントのドメイン名とIPアドレスが正しいかの検証を行うものだが、ドメイン名の情報として、どこの情報を用いるかを明確にしたい
* 当初は、メール本文の発信アドレスにあるドメイン名を用いるのかと思ったが、spf=passのメールで、平気で全く異なるメールアドレスが記載されているものが、普通にあることに気づく
* そこで、SMTPに立ち戻って考え直してみたが、SMTPで最初に交換するドメイン名を使うだろうと推測。このドメイン名とIPアドレスの組み合わせが、DNSのSPFの情報と一致すれば、passになるだろうと推測(厳密には未確認)
* 意味的には、名乗ってきたSMTPサーバが正しいか(なりすましではない)ことを検査することか
* 以下のエンティティ図に当てはめると、smtp.example-b.comが、smtp.example-a.comを認証する。なお、メールクライアントが、smtp.example-a.comに、メールを送信する際もSMTPを使うが、こちらは、ユーザのパスワード認証等が使える
* メール本文には関与しないので、メール本文のFromのメールアドレスが自ドメインと全く異なっても、SPF的にはエラーしない
* [RFC7208: Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1](https://datatracker.ietf.org/doc/html/rfc7208)

# DKIM
* 送信側が署名して、受信側で検証
* DNSには、公開鍵を登録
* メール本文の改ざん検出が対象と推測(未確認)
* メール本文のFromのメールアドレスが自ドメインと全く異なっても、署名後改竄されない限り、エラーにならない

# DMARC
* SPFとDKIMの検証がエラーした際の、メールの扱い方のポリシーを伝える
* ポリシーには、廃棄、隔離、受信がある
* メール本文のFromのメールアドレスが自ドメインと全く異なっても、SPFやDKIMでもエラーにならない
* spf=pass, dkim=passで、mail bodyのFrom addressが異なるドメインなら、スパム対応なメールサーバから送信されていることを意味しそう
* spf=pass, dkim!=passで、mail bodyのFrom addressが異なるドメインなら、途中でFrom addressが改竄されている可能性があるが、スパム対応なメールサーバから送信されている可能性もありそう

# SMTPのおさらい
* クライアント - サーバ型、テキストベース
* クライアントがサーバに接続すると、サーバがドメイン名を名乗る
* クライアントが自身のドメイン名を知らせる
* クライアントが、発信メールアドレス、宛先メールアドレスをサーバに知らせる
* メール本文をクライアントに送信する。その際、メール本文に、発信メールアドレス、宛先メールアドレスを含む
* ドットでメール本文送信完了
* サーバは、Receivedヘッダフィールドを追加する。このフィールドには、上記のやりとりで通知されたドメイン名とIPアドレス、そして、メッセージIDを含む
* 上記のやり取りの中で、ドメイン名は、3箇所出てくる。最初はドメイン名を名乗る際、次は発信メールアドレスを知らせる際、最後は、メール本文内の発信メールアドレス ~~(メール本文内にアドレスがあるか要確認)~~

# エンティティ

                example-a.com           :          :           example-b.com
     +--------+              +--------+ :          : +--------+              +--------+
     | client +--------------+  Mail  +--------------+  Mail  +--------------+ client |
     |        |   --SMTP->   | server |   --SMTP-->  | server | --POP/IMAP-> |        |
     +--------+              +--------+ :          : +--------+              +--------+
                    smtp.exampie-a.com  :          : smtp.example-b.com

# スパムの可能性
* 交換するドメイン名、通知するメールアドレス、メール本文に記載されているメールアドレスが同じであれば問題ない
* ドメイン名、メールアドレス、メール本文に記載のメールアドレスが異なることがありうる

# 昔の記憶より
* 昔々、telnet smtp.example-a.com smtpみたいなことをして、メールを出してみたことを思い出した。また、VRFYコマンドも思い出す

# 略語
SPF: Sender Policy Framework
DKIN: DomainKeys Identified Mail
DMARC: Domain-based Message Authentication, Reporting and Conformance

# 参考資料
* https://ent.iij.ad.jp/articles/172/
* https://jprs.jp/glossary/index.php?ID=0125
* https://ja.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
* https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/
レイヤーとは

### 「より共通的な機能」を下におき、「より個別の機能」を上に置いて、上の機能が下の機能を利用する形で、階層的に取り決める

> 「コンソメスープの作り方」という具体的な調理法の手順は上に置く、という形で、階層化します。そして、コンソメスープを作るにあたり`必要な野菜の刻み方や肉の切り方は下に置いてある手順を参照する`、といった決まりにするのです。こうすることで、「コンソメスープの作り方」を階層的に定めることができます。

>通信に必要な一連の複雑な手順を、関連があるものごとにまとめ、共通的なものや単純なものを`下に個別の機能`や`複雑な機能を上`に置いて、階層的に全体のルールを定めています。この時の各階層のことを「レイヤー」あるいは「層」と呼びます。

### 階層の境界が設けられることにより、プロトコルの位置づけが明確になり、組み替えがしやすくなる
>先の例のように調理法レイヤーと素材加工法レイヤーが分かれているときに、今度は寄せ鍋を作れるようにしたいとします。この場合、「魚の下ろし方」の手順を素材加工レイヤーに加えて、「寄せ鍋の作り方」を調理法レイヤに加えます。それら以外の「野菜刻み方」と「肉切り方」は、`コンソメスープで使ったものと同じものを使うことができます`。

似た作業を同じレイヤーに集める
上位レイヤーのものが変わっても下位レイヤーまで共通のものを使って簡単に作ることができる。

https://www.sbcr.jp/product/4797386677/

# 感想
下の階層が共通的な機能、単純な機能ルールを上位に提供し、個別な機能、複雑な機能を実現するルールに下位を利用する
したが下ごしらえしてそれぞれの料理をするということか。
macの通知センターの通知を一括削除する

## 手順
![スクリーンショット 2024-10-22 17.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50917/057cdba5-3bc8-0ab4-0ac6-e9148bd0c39d.png)

1. 右上から通知センターを開く
2. 右下の全て削除を押す

以上です。

(今まで、一個ずつ消してたのがアホらしくなりました。)
Powershellプログラミングの文法の基礎(No.1)

## はじめに
今回は、Powershellスクリプトで使用する基本的な文法について複数の記事で説明いたします。

## 変数とデータ型

変数とは、値を入れておく箱のようなもの
(Powershellの変数は頭文字として、「$」を先頭につける決まりがある。
 ただし、New-Variableコマンドレットを使用した場合、宣言時にはつけなくてよい)

```
$tax=0.08　
```

## 文字列の定義
Powershellで文字列を扱う場合、値をダブルクォーテンションで囲む。
その際、指定した変数が文字列にある場合は、その変数の値が反映される。

```
$k="かきくけこ"
Write-Host "あいうえお $k さしすせそ"
```

```
出力結果：あいうえお かきくけこ　さしすせそ
```

## 変数の宣言を強制する
「set-psdebug -strict」というコマンドを付け加える
```
Set-PSDebug -strict
$I="Hello World!"
Write-Host $I
```

## 変数のデータ型を確認する
variable.GetType()を付け加える
variable=変数名
```
$A="Hello World"

Write-Host "変数 $Aのデータ型は「"$A.GetType()"」です。"
"変数 $Aのデータ型は「System.String」です。"

$B=100

Write-Host "変数 $Bのデータ型は「"$B.GetType()"」です。"
"変数 $Bのデータ型は「System.Int32」です。"

```

## データ型一覧
Powershellで使用できる.Net Frameworkの主要データ型一覧は次の通りです。

|共通言語ランタイムの型構造 |値の範囲  |
|--------------------------|---|
|Boolean  |True または False(符号なし)| 
|Byte  |0～225(符号なし)|
|Char  |0～65535(符号なし)|
|DateTime   |日付(xxxx年xx月xx日)
|Int32      |整数(-2147483648～2147483647)
|String     |0個～約20億個ものUnicode文字

## 型変換について
変数名 -as 変数後のデータ型

例：String型のデータをDateTime型のデータに変換する
```
#日付を代入します
$date="2015-01-01"

#変数「$date」のデータ型を日付型に変換します
$date=$date -as [System.DateTime]

#変数「$date」のデータ型を確認します
$date.GetType().FullName
```

```
出力結果：System.Datetime
```
ACDLを提唱します。その15

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
アプリ作ったので、plunkerに上げてみた。

# 機能
CSVから円グラフを生成します。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1ed760fc-53f2-855e-22ee-55fea4212f4b.png)


# サンプルコード

```
var src = document.getElementById('src');

var spec2 = {
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "description": "A simple pie chart with embedded data.",
  "data": {
    "values": [
      {"category": 1, "value": 4},
      {"category": 2, "value": 6},
      {"category": 3, "value": 10},
      {"category": 4, "value": 3},
      {"category": 5, "value": 7},
      {"category": 6, "value": 8}
    ]
  },
  "mark": "arc",
  "encoding": {
    "theta": {"field": "value", "type": "quantitative"},
    "color": {"field": "category", "type": "nominal"}
  }
};

vegaEmbed('#vis', spec2).then(function(result) {
}).catch(console.error);

function run() {
  var line = src.value.split('\n');
  var items = [];
  for (var i = 0; i < line.length; i++)
  {
    var item = line[i].split(',');
    if (item[0] != "")
      items.push({"category": item[0], "value": item[1]});
  };
  var spec = {
    "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
    "description": "A simple pie chart with embedded data.",
    "data": {
      "values": items
    },
    "mark": "arc",
    "encoding": {
      "theta": {"field": "value", "type": "quantitative"},
      "color": {"field": "category", "type": "nominal"}
    }
  };
  vegaEmbed('#vis', spec).then(function(result) {
  }).catch(console.error);
}




```

# 成果物

https://plnkr.co/edit/KJeOYxrKJxBiAoNg


以上
Tips #013 キャンバスアプリでフォームと部門マスタを紐づけてみようという話２

https://qiita.com/Novskiiiiiiiiii/items/447295452c9bc8910447

前回のTipsで部門マスタとプルダウンを紐づけたものの、
使い勝手が悪いので、テキストボックスに部門コードを入力したら
ギャラリーにサジェストされるようにしたい。

    Filter(test_mst_bumon,部門コード in TextInput2.Text)

ギャラリーのItemsに上記のようにセットしたら、
完全一致した時だけ検索結果がヒットした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/9a5f627a-13ac-133e-27f2-735a9f802cfd.png)

惜しい。曖昧な検索がしたいんだな。

色々調べた結果、逆にすればいけた。

    Filter(test_mst_bumon,TextInput2.Text in 部門コード)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/58e2e761-091d-3599-2132-e006e4c4d010.png)

やったぜ！

で、問題はここからである。

表示された値でリストに追加したいのだ。

続きは次のTipsにて。

https://qiita.com/Novskiiiiiiiiii/items/4aa3025968a926e13ee0
[JavaScript]パズルアプリを作成しました

## 概要

javascriptのアウトプットとして、簡単なパズルゲームを作成しました！

## 作成物
https://nono004.github.io/puzzle_js/

![Puzzle_js.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580185/7c5a5fa7-a2a0-bc64-74c9-11c80040ae03.jpeg)

## 使用言語

html,css,javascript

## GitHub リポジトリ
https://github.com/nono004/puzzle_js

## 苦戦したところ

正解判定をどのように実装すれば良いのかわからず苦戦しました。
`document.getElementById('dropTarget-1').setAttribute('data-correct', 'piece-7');`
このように、今回はsetAttributeを使用しました。
data属性についてあまり理解していなかったので、勉強になりました。

また、GitHub Pagesでの公開が初めてだったため、メインのhtmlをindex.htmlにしないと
いけないことに公開後に気が付き慌ててファイル名を変更しました。
今後は気をつけようと思います。

## 総括
javascriptの基本の理解がまだまだ不足していると感じたので、またインプットメインの
学習に戻ろうと思います。
ただ、以前よりは見たことのある構文が増えてきたので、学習の成果は感じました。
ChatGPT プロンプト具体例 詰め合わせパック

# 概要
本記事は私が実際に使ったプロンプトを一般化して列挙したものです。
プロンプトの参考にしてもらえれば幸いです。
# 例
```
現在[デバイス名]で以下のコマンドを打ち込んでコードを実行しています。
[デバイス名]の起動時にこのコマンドを自動で起動して対象のファイルを動かしたいですが、
そのようなことは可能でしょうか？

[打ち込んだコマンドの記述]
```

```
以下のインポートモジュールを整理してください

import argparse
from tkinter.ttk import Style
import numpy as np
import pickle
from tqdm import tqdm
import matplotlib.pyplot as plt
import time
import torch
import sys
import datetime
import ctypes
import cv2
```

```
# 命令文
[商品名]を弊社で売り出したいので、以下の商品情報を参考に
新しくキャッチコピーと商品紹介文(200文字程度)を考えてください。
また、キャッチコピーに関してはいくつか生成してください。

# 商品情報
[その商品の情報をコピペ]
```

```
# 命令文
以下の文章を条件をもとに修正してください。

# 条件
- 文章の内容は書き換えないでください。
- "●"の前で改行してください。
- タイトルと思わしきものは<b></b><br>でくくってください。
- "●"を"・"に書き換えてください。
- 一文で改行を入れて、後ろには<br>をつけてください。

# 文章
<つめかえの注意点>●つめかえる容器内が濡れていないか確認する。●中身を使い切ってからつめかえる。●つめかえた後は、容器の表記をよく読んでから使用すること。※つめかえは換気のよい場所でおこない、粉を吸い込まないように注意する。※中身があふれないように注意する。※容器が倒れないように注意する。<使用上の注意>●本来の用途以外に使用しない。●粉末を溶かす際は、熱湯を使用したり、沸騰させたりしない。●洗濯する繊維素材によっては変色するおそれがあるため、変色しやすい素材には使用しない。●容器が膨張し破裂することがあるため、密閉した容器で混ぜたり、放置しない。
```

```
Pythonでファイル内に入っている画像の名前を連番として変換するコードを書いてください。
```

```
添付の論文を読んで，以下の問いに日本語で答えてください。
- どんな研究ですか
- 先行研究と比べてどこがすごいか具体的な研究名も添えて教えてください
- 技術や手法の大事な点はどこですか。また，手法の概要なども教えてください
- どうやって有効だと検証していますか
- 議論・改良の余地はありますか
```

```
あなたにはこのzipファイルを展開して、コードの説明を行ってほしいです。
まず最初にzipファイルを展開してどのようなファイル構造になっているか図示してください。
次に、pythonファイルの[解説してほしいファイル名]についてどのような挙動をしているのか
具体的にコードを表示しながら解説してください。
```

```
[苦手な科目]の知識を向上させたいので、[苦手な分野]に関するクイズを出題してください。
まずは、[苦手な分野]を私に質問してください。
正しく答えられるように最善を尽くします。
```

```
[知りたい分野]を勉強したいんですけど、[よく聞く用語]のようによくニュースなどで出てくる代表的なものについて教えてください。
```

```
`rm -rf ~/.vscode`このコマンドを打ち込む前に、
どのファイルが削除されるか確認する方法はありますか？
```

```
以下のテーブルをマークダウンで書いてください

<div>
    <table>
        <tbody>
            <tr>
                <th>素材</th>
                <td>ポリエステル</td>
            </tr>
            <tr>
                <th>原産国</th>
                <td>中国</td>
            </tr>
        </tbody>
    </table>
 
    <table>
        <tbody>
            <tr>
                <th>サイズ</th>
                <th>着丈</th>
                <th>肩幅</th>
                <th>裾回り</th>
            </tr>
            <tr>
                <td>Free</td>
                <td>105</td>
                <td>53</td>
                <td>121</td>
            </tr>
        </tbody>
    </table>
</div>
```

ChatGPTにゲームを作らせました(有料会員が使えるモデルを利用しました)。

https://chatgpt.com/share/6721d777-4404-800c-8e86-3c66096a0420

```
[231,531,642,236,743,752,234,643]このリストの平均、標準偏差、分散を計算してください
```

```
# 命令
添付資料は[企業名]という企業のIR資料です。
添付の資料を読んで、以下の質問に日本語で答えてください。

# 質問
- 売上高はいくらですか？
- SWOT分析をしてください
- 好調または不調の要因はなんですか？外的・内的要因をそれぞれ分けて記載してください
- 来期以降の経営戦略を教えてください
- CEOのメッセージがあれば教えてください

# 条件
- 資料に書かれていなければあなたが考えてください。しかし、あなたが考えた場合"♦"のマークを付けてください
```
CakePHPでTemplateを使わない

# 概要
題名通り、ControllerだけでHTMLを出力する。
何かに使えるかと思っているか、今のところ使い道はない。

# コード
とあるControllerの、アクションindexで、どうしてもTemplateファイルを作成したくない場合、以下のコードをController内に書けばHTMLを返してくれる。

```php
public function index() {
    $response = $this->response
                ->withType('text/html')
                ->withStringBody($this->sampleHtml());
    return $response;
}

private function sampleHtml() {
    return '<!DOCTYPE html>
                <html>
                    <head>
                        <meta charset="utf-8">
                        <title>インデックス</title>
                    <body>
                        <h1>Welcome this page!</h1>
                    <script>window.addEventListener("load", () => {alert("ようこそ！")})</script>
                </html>
';
}
```

# 補足
Templateを使えば、データのバインディングはできるし、PHPを埋め込んで処理もできるし、こんなことする意味がわからない。が、できたから記念に残しておく。

以上
【Next.js×Supabase】SSRでSupabaseにデータをInsertする手順

# はじめに
先日下記の記事にて、「**Supabaseの環境変数の冒頭にNEXT_PUBLIC_を付ける必要がある。**」と記述をしました。

https://qiita.com/AK_React/items/f4e0580698f72b0051c8

**NEXT_PUBLIC_をつけるとクライアント側での参照が可能になる反面、情報漏洩・悪用といったセキュリティ上のリスク**もあります。

**そこで今回は、NEXT_PUBLIC_を使用せずにサーバー側でのみ使用**していきます。
今回はデータ挿入（Insert）の処理を例に説明していきます。

Supabaseのインストール＆初期設定は完了している前提とします。

https://supabase.com/docs/reference/javascript/introduction
# １．Supabaseの設定ファイル作成
`src/utils/supabase.ts`を作成します。

Supabaseクライアントの設定を外部で管理することで、他のAPI Routeやサーバーサイドロジックでも再利用できます。

`supabaseUrl`と`supabaseKey`の値は`.env.local`で管理しています。
※`.env.local`はGit等にあげないように注意

```ts:supabase.ts
import { createClient } from "@supabase/supabase-js";

const supabaseUrl = process.env.SUPABASE_URL as string;
const supabaseKey = process.env.SUPABASE_KEY as string;

export const supabase = createClient(supabaseUrl, supabaseKey);
```

# ２．APIルート作成
**Next.jsでは、`pages/api`配下にAPIルートのファイルを作成する**必要があります。

https://nextjs.org/docs/pages/building-your-application/routing/api-routes


クライアントからのPOSTリクエストを受け取り、Supabaseにデータを挿入します。
クライアント側の処理は後続の手順で作成します。

```ts:supabaseFunctions.ts
import { supabase } from "../../src/utils/supabase";
import type { NextApiRequest, NextApiResponse } from "next";

// API Routeとしてエクスポートされる関数
export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method === "POST") {
    const { value } = req.body;

    // supabaseを使用してデータを挿入
    try {
      const { data, error } = await supabase
        .from("motivation_bodymake")
        .insert([{ value }]);

      if (error) {
        return res.status(500).json({ error: error.message });
      }

      // 挿入したデータを返す
      return res.status(200).json({ data: data ? data[0] : null });
      
    } catch (err) {
      // エラーハンドリング
      return res.status(500).json({ error: "Something went wrong." });
    }
  }
}

```


# ３．クライアントサイドのコード作成

`fetch`を使って、先ほど作成したAPI RouteにPOSTリクエストを送ります。

https://nextjs.org/docs/app/building-your-application/data-fetching/fetching

`fetch`についての説明は下記を参照してください。
**`fetch`はGETリクエストが規定ですが、今回はPOSTリクエストを行うので`method`にPOSTを指定します。そして、`body`に送りたいデータを指定します。**（今回は`value`というデータを送ります。）

https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch
```index.tsx
//データ挿入処理
export const addData = async (value: string) => {
  // fetch関数を使用して手順2で作成したAPIエンドポイントにリクエストを送信
  const res = await fetch("/api/supabaseFunctions", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ value }),
  });

  const data = await res.json();
  return data;
};

```
# おわりに
一番最初に感じたことは「やること多いな。。難しそうだな」でしたが、しっかりと処理を追っていくとシンプルな流れかと思います。
学習頑張りましょう！
5 loại nước ép tại nhà đơn giản

Bạn đang tìm kiếm những loại nước ép thơm ngon, bổ dưỡng mà lại dễ dàng thực hiện ngay tại nhà? "5 loại nước ép tại nhà đơn giản" sẽ giới thiệu đến bạn những công thức pha chế nước ép cực kỳ đơn giản, nhanh chóng từ những nguyên liệu quen thuộc, dễ tìm. Chỉ với vài bước cơ bản, bạn đã có thể tự tay chuẩn bị cho mình và gia đình những ly nước ép tươi mát, giàu vitamin và khoáng chất, giúp tăng cường sức khỏe và giải nhiệt hiệu quả. Từ nước ép cam kinh điển đến những sự kết hợp sáng tạo hơn, bài viết này chắc chắn sẽ mang đến cho bạn những lựa chọn thú vị và bổ ích. Để tìm hiểu thêm, xem thông tin chi tiết tại:
https://traicaymoingay.com/blogs/goc-song-khoe/nuoc-ep
[マークダウン] うろ覚え初心者のための復習シート（頻出まとめ）

# はじめに
駆け出しエンジニアの私が、最初に覚えたマークダウン記法を見やすくまとめてみました。
ここで紹介するマークダウン記法は、多くの環境で共通して使えるものです。
それでは参りましょう。
<br>
<br>



# 1. 見出し
`#` + `半角スペース` から始まる行は見出しになります。
`#` の数が増えるにしたがって見出しは小さくなります。

```:マークダウン記入例（下に出力結果）
# 特大サイズの見出し
## 大きな見出し
### 中ぐらいの見出し
#### 小さめの見出し
```
# 特大サイズの見出し
## 大きな見出し
### 中ぐらいの見出し
#### 小さめの見出し


<br>


# 2.引用
`>` から始まる行は引用になります。
`>` の数が増えるにしたがってネスト(入れ子)なります。
```:マークダウン記入例（下に出力結果）
> 引用マーク１つ
>> 引用マーク２つ

>>> 引用マーク３つ
>>>> 引用マーク４つ
```
>引用マーク１つ
>>引用マーク２つ

>>> 引用マーク３つ
>>>> 引用マーク４つ


<br>



# 3.コードブロック
[```] で該当部分を囲むことでコードブロックとして見なされます。
```:マークダウン記入例（下に出力結果）
```              　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　（このカッコは省く）
ここにコードを書く
```              　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　（このカッコは省く）
```
```              　　　　　　　　　　　　　　　　　　　　　　
ここにコードを書く
```  

<br>



# 4.インラインコード
[`] で該当部分を囲むことでインラインコードとして見なされます。
```:マークダウン記入例（下に出力結果）
文章の中に`インラインコード`を入れる。
```
文章の中に`インラインコード`を入れる。

<br>




# 5. 水平線
`-` を３つ続けて書くと、水平線を引くことができます。
```:マークダウン記入例（下に出力結果）
水平線を書くならハイフン３つが便利（文章をすぐ上に書くと文字は大きくなる）
---
---
```

水平線を書くならハイフン３つが便利（文章をすぐ上に書くと文字は大きくなる）
---
---

<br>

# 6.リスト
`-` + `半角スペース` でリストの要素になります。
```:マークダウン記入例（下に出力結果）
- バナナ
- じゃがいも
- とうもろこし
```


- バナナ
- じゃがいも
- とうもろこし

<br>


# 7. リンク
リンクにしたい文字列を`[]`で囲み、URLを`()`の中に記述することでリンクになります。
```:マークダウン記入例（下に出力結果）
[ここを押すとyahooに飛ぶ](https://www.yahoo.co.jp/)
```
[ここを押すとyahooに飛ぶ](https://www.yahoo.co.jp/)

<br>



# 8. 文字（斜め・太字・打ち消し）
`*`によって囲まれた文字列は斜めになります。
`**`によって囲まれた文字列は太字になります。
`***`によって囲まれた文字列は斜めの太字になります。
`~~`によって囲まれた文字列は打ち消されます。
```:マークダウン記入例（下に出力結果）
一部の文字を「*斜め*」にしたい
一部の文字を「**太く**」したい
一部の文字を「***斜めかつ太く***」したい
右の文章を取り消したい「~~あああああ~~」
```
一部の文字を「*斜め*」にしたい
一部の文字を「**太く**」したい
一部の文字を「***斜めかつ太く***」したい
右の文章を取り消したい「~~あああああ~~」


<br>



# 9. テーブル
`|`は列の区切りに使われます。
`-`は「列のタイトル」と「列の要素」の区切りに使われます。
デフォルトではマスの要素は左寄せですが、`-`の右端に「:」を付けることで右寄せに、両端を「:」で囲むこと中央寄せにすることができます。

```:マークダウン記入例（下に出力結果）
a|bb|ccc|dddd|eeeee
-|-|-|-:|:-:
あ|い|う|え|お
か|き|く|け|こ
```

|a|bb|ccc|dddd|eeeee|
-|-|-|-:|:-:
|あ|い|う|え|お|
|か|き|く|け|こ|

<br>



# 10. チェックボックス
`[` + `半角スペース` + `]`から始まる行はチェックボックスになります。
`[` + `x` + `]`から始まる行はチェック済みのチェックボックスになります。
```:マークダウン記入例（下に出力結果）
- [ ] まだ完了してない（だからといってクリックはできない）
- [x] 完了済み
```

- [ ] まだ完了してない（だからといってクリックはできない）
- [x] 完了済み

<br>


# 11. プログラミング言語を指定したコードブロック
コードブロックを作成する際に、[```プログラミング言語名:ファイル名]とすることで、指定したプログラミング言語のハイライトをコードブロックに適用させることができます。
```                                                     
```typescript:ここにファイル名等                    　　　　　　　　　   (このカッコは省く)
let str: string = "hello";
```              　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　（このカッコは省く）
```


```typescript:ここにファイル名等   
let str: string = "hello";
```
                                                    
<br>

# おわりに
環境によっては独自のルールに基づいた記号や、様々なhtml`<タグ>`を使い分けることで、より豊かな表現をすることが可能になります。
DAOオブジェクトをPythonから呼び出せない時の対処法

# PythonからDAO.Engine.120がDispatchできない。
はじめに本記事は、検証できていない記事であることをご了承して頂いた上で参考にしてみてください。

DAO.Engine.120はDAOオブジェクトのオブジェクト名でVBAなどからデータベースにアクセスする時に使われるオブジェクト名です。
このオブジェクトをただ単にPythonのWin32Clientから呼び出そうとすると、ほぼエラーが発生します。

インターネットでAccessデータベースファイルにアクセスするための方法としてCreateObjectでADODBを呼び出す記事がほとんどですが、ADODBオブジェクトよりDAOオブジェクトのほうが単純に使えるので便利です。

はじめは、私もADODBしか使えなかったのでうがある日突然使えるようになっていたことに気づいたためこの記事を書いています。

# やったことをよーく思い出してみると・・・
ADODBでもコネクションを作ってAccessのデータベースファイル(.accdb)にアクセスしようとするとODBCドライバがないと言われるためにAccessのODBCドライバをインストールしたことを思い出しました。

おそらくこのドライバーを入れた時点で、DAOオブジェクトにアクセスできるようになった可能性が強いです。
なのでAccess用のODBCドライバを入れればアクセスできる！
んじゃないかなと思います。
検証できたらまたご報告します。
おそらくVBScriptでDAOにアクセスできない場合もこれが原因かもしれません。
Pythonを使って日本語翻訳アプリを作成する方法

Here is the translation of the article into Japanese:

---

# Pythonを使って日本語翻訳アプリを作成する方法

言語間のシームレスな翻訳の必要性は、特に日本語のような言語的に複雑な言語を扱う際に、ますます重要になっています。このガイドでは、Pythonを使用して簡単かつ効果的な日本語から英語への翻訳アプリを作成する方法を紹介し、使いやすさと実装の実用性に焦点を当てます。

## 日本語翻訳アプリとは？

日本語翻訳アプリは、日本語で入力されたテキストを処理し、それを英語（またはその逆）に変換するための翻訳アルゴリズムを使用します。このガイドで構築するアプリは、広く利用可能なAPIを使用して翻訳を実行し、言語の壁を効果的に乗り越えることができます。

### なぜ日本語翻訳アプリを作るのか？
日本語翻訳アプリを作成することは、いくつかの理由で価値のあるプロジェクトとなります：
- **実用性:** このようなアプリケーションは、ビジネス、旅行、教育の分野でのリアルタイムの言語翻訳に使用できます。
- **学習の機会:** このアプリを開発することで、自然言語処理（NLP）、API、GUI開発に関する理解を深めることができます。

このガイドでは、推奨されるライブラリを紹介し、翻訳アプリを構築するためのステップバイステップの手順を提供します。

## 推奨ライブラリとツール

この翻訳アプリを構築するには、以下のPythonライブラリを使用します：
- **googletrans:** Google翻訳のPythonラッパーとして機能するライブラリで、複数の言語間のテキスト翻訳を可能にします。
- **tkinter:** グラフィカルユーザーインターフェイス（GUI）を作成するための標準的なPythonライブラリです。

### 前提条件:
1. **Pythonのインストール:** システムにPython 3.7以降がインストールされていることを確認してください。
2. **ライブラリのセットアップ:** 以下のコマンドを使用して必要なライブラリをインストールできます。
   ```bash
   pip install googletrans==4.0.0-rc1
   ```
全文を読む : https://cookab.net/finance/python%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e6%97%a5%e6%9c%ac%e8%aa%9e%e7%bf%bb%e8%a8%b3%e3%82%a2%e3%83%97%e3%83%aa%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/
javaでマスク処理（置き換え）

住所マスク
```
public class AddressMasker {
    public String maskAddress(String address) {
        // 正規表現パターンの定義（全角数字 + （'ー' + 全角数字）の繰り返し）
        String pattern = "[０-９]+(?:ー[０-９]+)+";
        
        if (address.matches(".*" + pattern + ".*")) {
            // マッチする場合、置換を用いてマスキング
            // 全角スペースと全角数字、'ー'以外を'＊'に置換
            String maskedAddress = address.replaceAll("[^　０-９ー]", "＊");
            return maskedAddress;
        } else {
            // マッチしない場合、住所の下5文字以外をマスク
            int unmaskLength = 5;
            if (address.length() <= unmaskLength) {
                return address; // 住所が短い場合はそのまま返す
            } else {
                String maskedPart = address.substring(0, address.length() - unmaskLength).replaceAll(".", "＊");
                String unmaskedPart = address.substring(address.length() - unmaskLength);
                return maskedPart + unmaskedPart;
            }
        }
    }

    // テスト用メインメソッド
    public static void main(String[] args) {
        AddressMasker masker = new AddressMasker();
        String address1 = "東京都新宿区　１ー２ー３";
        String address2 = "大阪府大阪市１丁目２番３号";
        System.out.println("マスク結果１：" + masker.maskAddress(address1));
        System.out.println("マスク結果２：" + masker.maskAddress(address2));
    }
}
```
郵便番号マスク
```
public class ZipCodeMasker {
    public static void main(String[] args) {
        String zipCode = "１２３ー４５６";
        String maskedZipCode = maskZipCode(zipCode);
        System.out.println(maskedZipCode); // 期待値：＊＊＊ー＊＊＊
    }

    public static String maskZipCode(String zipCode) {
        if (zipCode == null || zipCode.isEmpty()) {
            return zipCode;
        }

        return zipCode.replaceAll("[^ー]", "＊");
    }
}
```
PythonでpptxをPDFに変換する

# 背景
- pptxの中身をGPTで要約したいケース
- pptxをまずはPDFに変換して、その後PDFを画像化してgpt4oに要約させたいです
- 今回はpptxをPDFに変換する方法を紹介します
- PDFの画像化は以下記事 
 
https://qiita.com/munaita_/items/2badf3f6a0312a828312

# 実装
- OSSのlibreofficeをheadlessで起動させて、 `--convert-to pdf` を使います

https://help.libreoffice.org/latest/en-US/text/shared/guide/convertfilters.html

```py
import io
import os
import subprocess
import sys


class PPTXReader:
    def pptx_to_pdf(self, file_path: str, output_path: str) -> str:
        subprocess.run(['libreoffice', '--headless', '--convert-to', 'pdf', '--outdir', os.path.dirname(output_path), file_path], check=True)
```

- libreoffice --headlessコマンドを使用して、PowerPointファイルをPDFに変換します。これにより、画像ファイル（スライド）が保持されたままPDFが作成されます。
- libreofficeはLinux環境でも使えるため、Windows環境に依存せずにPowerPointのスライドをPDFに変換できます。
- Dockerで実行可能なので、Cloud Runなどのコンテナベースの環境で簡単にデプロイできます。
Tips #012 キャンバスアプリでフォームと部門マスタを紐づけてみようという話

https://qiita.com/Novskiiiiiiiiii/items/34d70fb094e7f5cc3fe7

リストで作成した「申請リスト」から計上部門をフォームに追加した状態では、
申請リスト上に登録されたアイテムからChoicesされているだけなので、
フォームに配置した部門コードのプルダウンを別途部門マスタと連携する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/5fd168d7-88ba-63d3-6db4-fbbb9cbdda19.png)

    Choices([@test_concur_request].keijo_bumon_code)

なのでItemsのプロパティはいったん削除してしまいます。

Itemsをブランクにした状態でカードをさわると「データソースを指定したまえ」と
促されるので、設定したいマスタをデータソースにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/4c357629-d2ce-a7ea-124a-c9775bf27754.png)

以下のような感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/d9d6abc2-616d-727a-6a84-7cd786047dd6.png)

が、しかしこのままだと何も表示されないので、

    test_mst_bumon.部門コード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/c4ed9dbc-d104-0a3b-2c82-fc2ab74ecfe4.png)

という感じにすると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/79e41983-69ff-fba2-3440-31225cdcb27f.png)

計上部門をマスタから選択できるようになります。

でもこのままだと大量にマスタがある中から探さないといけないので、
テキストボックスに入力した値で曖昧検索して表示させる、というやり方が出来ないかを次のTipsで試してみます。

今回は以上

https://qiita.com/Novskiiiiiiiiii/items/90145dae3648bfe24a5d
UbuntuでSeptentrio WebUIが立ち上がらない

# 状況
GNSS機器（Cohac Ten）の設定をしようと，Septentrio WebUIの192.168.3.1にアクセスしても接続できない．

# 解決策
ネットワーク設定からアドレスを192.168.3.2などにして，登録する．
その後ブラウザで192.168.3.1にアクセスすれば接続できる．
CSSで縁取り文字を表現する方法　2024最新版

テキストの縁取りをCSSで表現しようとすると、軽くググった感じだと
1. text-shadowを重ねまくる
1. text-strokeで縁取りしたあと、before要素で同じテキストを描画する

の２通りの方法が現時点での最適解というような記事がヒットします。

しかし、上記の方法だとReactなどでSPAを実装する際にちょっと面倒だし、
やはりスタイルのためにごちゃごちゃやらなきゃいけない感じが気持ち悪かったですね。

現時点で、もっとスッキリした書き方を見つけました。
それが下記です。

# CSSで縁取り文字を表現する

```css
{
  -webkit-text-stroke: 2px black;
  text-stroke: 2px black;
  paint-order: stroke;
}
```

ポイントは `paint-order` です。
これを利用すると、テキストを描画するときの塗りつぶしと輪郭の順序を変更することができます。
つまり、輪郭線がテキストよりも後ろに描画されてくれるということです。
とってもシンプルで良い解決策だと思います。

# サンプル
上記のスタイルで、ちょっと大げさに描画してみると下記のような感じになります。

![about_blank.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365927/af028e5d-e18b-4f6f-8eaa-6675e556135d.png)


すこし課題があるとすれば、記号や漢字など一部の文字の縁取りがトゲトゲした印象になっているくらいでしょうか。
ただ、text-shadowで表現するにしても影のつき方には一癖あるとおもうので、トゲトゲが気になるならspanで囲んでoverflow: hiddenしてはみ出しすぎたトゲを隠したりするほうがいいかな、と思います。

# ブラウザ対応状況

text-stroke
https://caniuse.com/?search=text-stroke

paint-order
https://caniuse.com/mdn-css_properties_paint-order

どちらもIE以外は最新版対応済みです。気兼ねなく使えますね！
Apple Watch バンドの背後にある職人技: 1 ペニーの価値がある理由

Appleは最近、Apple Watch用のレインボースポーツバンドをリリースしました。価格は54ドルで、Series 3以降のモデルに対応しています。このカラフルなバンドに加え、AppleはwatchOS 9.5およびiOS 16.5にアップグレードしたユーザー向けに、Apple WatchとiPhone用のレインボーセレブレーションの文字盤や壁紙を提供しています。

一方、サードパーティーのApple Watchバンドは市場に多く出回っており、はるかに低価格で購入可能です。そのため、多くの消費者は疑問に思っています。なぜAppleの純正バンドはこれほど高価なのか？例えば、Appleの公式サイトでステンレススチール製のミラネーゼループは110ドルで販売されており、これは他のブランドが販売している類似品の2倍以上の価格です。Appleのバンドは何が違うのでしょうか？

一見すると、価格差の主な理由はAppleのブランド力によるものと思われるかもしれませんが、その背後にはさらに深い理由があります。Appleのウォッチバンドは、優れた職人技、精密なエンジニアリング、そして見た目だけにとどまらない、長持ちする品質を反映しているのです。

Appleのバンドが高価な理由の一つは、細心の注意を払った設計とエンジニアリングプロセスです。各バンドは、Apple Watchと完璧に調和するよう、あらゆる細部にわたって設計されています。たとえば、Appleのバンドには、バンドが時計の溝にスライドするときにしっかりと固定されるように設計された独自のスプリング式ロック機構（X206）が搭載されています。このスムーズで安全な取り付けを実現するためには、高度な技術が必要です。Appleは、スイス製のCNC機械に数百万ドルを投資し、わずか5ミクロンの極めて厳しい公差を維持することで、すべてのバンドが完璧にフィットし、信頼性のある性能を発揮することを保証しています。

このような卓越したエンジニアリングは容易に模倣できるものではなく、Appleのバンドが多くのサードパーティ製品よりも安心感があり、一体感がある理由の一つです。フィット感と機能性へのこだわりは、Appleが高品質な素材を使用していることと相まって、さらに際立っています。例えば、ミラネーゼループは単なるステンレススチールではなく、レーザー密封プロセスを経ており、耐久性と洗練された仕上がりが追加されています。これにより、頑丈でありながら視覚的にも魅力的なバンドが生まれます。同様に、スポーツバンドは高性能フルオロエラストマーで作られており、柔軟で耐久性があり、日常的な使用にも適した快適で強力な選択肢を提供します。

品質に加えて、Appleは美的魅力とユーザー体験にも強いこだわりを持っています。Appleのデザインチーム、特にジョナサン・アイブが率いるチームは、各バンドのデザインと使用感を完璧にするために数ヶ月、時には数年を費やしています。例えば、リンクブレスレットの場合、単に金属のリンクだけではなく、それらがどのように流動的に連結されているかが重要です。この精密なデザインにより、Apple Watchのエレガントさにマッチする洗練された滑らかなデザインが実現しています。このような考慮深いデザインには時間と投資が必要であり、自然とコストがかさみます。

さらに、Appleの価格設定に寄与しているもう一つの要素は、バンドの多様性とカスタマイズの容易さです。Appleは、ユーザーがワークアウト、フォーマルなイベント、カジュアルな外出など、個々のスタイルに合わせてバンドをすばやく簡単に交換できるエコシステムを作り上げました。スリムなレザーリンクから通気性のあるスポーツループまで、Appleの幅広いバンドラインナップは、あらゆる場面や好みに合った完璧な選択肢を提供します。

これに対して、多くのサードパーティ製バンドは、価格が手頃である一方で、素材や精度、全体的なユーザー体験に妥協が見られます。フィット感が十分でなかったり、長時間の使用に耐えられないことがあり、色や形が時間とともに変わってしまうこともあります。Appleのバンドは、日常的な使用にも耐え、長く使い続けても美しさを保つように設計されています。

結局のところ、Apple Watchのバンドを選ぶことは、時間の試練に耐えられる品質とデザインに投資することを意味します。サードパーティの選択肢よりも価格は高くなるかもしれませんが、Appleのバンドは信頼性、快適さ、そしてスタイルのレベルを提供しており、それは他の選択肢ではなかなか実現できません。支払っているのはブランド代だけではなく、すべてのAppleバンドに込められた精密な設計、プレミアムな素材、そして職人技に対するこだわりなのです。

シームレスなフィット感、優れた素材、そしてバンドが長持ちするという安心感を重視する人にとって、Appleのウォッチバンドはその価値が十分にあると言えます。それは単なるアクセサリーではなく、Apple Watchの体験に欠かせない重要な部分であり、形式と機能、スタイルが絶妙に融合しており、安価な代替品では太刀打ちできないのです。
参照元ウェブサイト: https://bandletic.com/
RDSのマルチAZとリードレプリカ：あなたのデータベースを守り、高速化する2つの秘密兵器

## はじめに
データベースサービスのRDS（Relational Database Service）の2つの重要な機能、マルチAZとリードレプリカについて、わかりやすく説明していきます。

## 1. マルチAZ：あなたのデータベースの忠実な双子

マルチAZは、「多地域配置」とも呼ばれる機能です。これを理解するために、次のようなシナリオを想像してみてください：あなたは大切な日記を書いています。その日記が水害や火事で失われてしまうのを防ぐために、同じ内容の日記を別の場所にも置いておくことにしました。これがマルチAZの基本的な考え方です。

RDSのマルチAZでは：
- メインのデータベース（プライマリ）が1つあります。これがあなたの「オリジナルの日記」です
- 別の場所（Availability Zone）に、同じ内容のデータベース（セカンダリ）が作られます。
  これが「コピーの日記」です
- あなたが日記に何か書き込むたびに（データベースに変更を加えるたびに）、自動的にコピーの日記も更新されます

もし何かトラブルが起きてオリジナルの日記が読めなくなっても（プライマリデータベースが利用できなくなっても）、すぐにコピーの日記を使い始めることができます（セカンダリデータベースに切り替わります）。

このように、マルチAZは「データの安全性」と「サービスの継続性」を守ってくれる頼もしい機能なのです。

## 2. リードレプリカ：あなたのデータベースの優秀なアシスタント
次に、リードレプリカについて説明しましょう。これを理解するために、図書館のシナリオを想像してみてください
人気の本がたった1冊しかないと、多くの人が読みたいときに順番待ちが発生してしまいます。
そこで、その本のコピーをいくつか作って別の棚に置いておけば、より多くの人が同時に読でもらうことができますよね。これがリードレプリカの基本的な考え方です。

RDSのリードレプリカでは：
- メインのデータベース（ソース）が1つあります。これが「オリジナルの本」です
- そのコピー（リードレプリカ）を複数作ることができます。これらが「コピーの本」です
- オリジナルの本に新しいページが追加されるたびに（ソースデータベースが更新されるたびに）、自動的にコピーの本も更新されます
- コピーの本を読むことはできますが、書き込むことはできません（リードレプリカは読み取り専用です）

このシステムの利点は：
1. 多くの人（アプリケーション）が同時にデータを読み取ることができる（読み取り性能が向上する）
2. オリジナルの本（ソースデータベース）への負荷が減る

つまり、リードレプリカは「データベースの読み取り性能」を大幅に向上させてくれる優秀なアシスタントなのです。

## 結論：
マルチAZとリードレプリカは、それぞれ異なる目的を持っています：
- マルチAZは、あなたのデータを守り、サービスを止めないようにする「守護者」です
- リードレプリカは、データの読み取りを高速化し、メインのデータベースの負担を減らす「効率化の専門家」です

これらの機能を上手く活用することで、より安全で高性能なデータベース環境を構築することができます。AWSの世界では、こういった便利な機能がたくさん用意されているので、ぜひ探検してみてくださいね！
laravelテスト時のフェイクのファイルを作成する UploadFile::fake

## フェイクファイルの作成

`UploadedFile::fake()->create(name: $name, kilobytes: $sizeKb, mimeType: $mimeType);`のように指定するとファイルを作成する事ができる。

```
    private function makeFakeTestFile(
        string $name = null,
        string $mimeType = 'image/png', 
        int $sizeKb = 1024
    ): UploadedFile {
        $name = $name ?? config('test.test_file.file_name');

        $file = UploadedFile::fake()->create(name: $name, kilobytes: $sizeKb, mimeType: $mimeType);

        return $file;
    }
```

## 参考文献

https://readouble.com/laravel/10.x/ja/http-tests.html#fake-file-customization
Terraformのディレクトリ構成って結局どうすればいい

## はじめに

4月に転職したのですが、転職先でオンプレ→クラウドに移行するプロジェクトへアサインされて、クラウドに詳しいメンバーが少ないということで、PLをやることになりました。
私自身、バックエンドの開発がメインなので、IaCを実施したことがなく、手探り状態から何とか形にした中での知見のアウトプットをしたいなと思い記事書きました。

## environment配下にすべてのリソースを定義する構成

私自身調べている時に、よく目にした構成が以下のような構成。

~~~shell
environment
|_ dev
|    |_ main.tf
|    |_ provider.tf
|    |_ variables.tf
|    |_ backend.tf
|    |_ outputs.tf
|
|_ stg
|
modules
|_ s3
・
・
・
~~~

一度は目にしたことがあるかなと思います。
この構成のメリット・デメリットは以下があるかなと。


| メリット | デメリット |
| --- | --- |
| ・一度のApplyでOK<br> ・依存関係を気にせずApplyできる（自分はdepends_on使用しないと行けない場面に出会わなかった） | ・Plan, Applyが遅い<br> ・ちょっとした変更の影響が大きくなることがある |

## リソース毎に細かくディレクトリ分ける構成

上記のデメリットを解消した構成が以下の構成例

~~~shell
environment
|_ dev
|    |_ network
|    |      |_ main.tf
|    |      |_ provider.tf
|    |      |_ variables.tf
|    |      |_ backend.tf
|    |      |_ outputs.tf
|    |_ ecs
|
|_ stg
|
modules
|_ s3
・
・
・
~~~

上記のように、リソース単位ごとに分けると、tfstateが小さくなるので、plan,applyの実行時間が短くなるし、別れているディレクトリ単位の変更で基本的に済むので、コードを変更する側もレビューする側も楽になるんですよね。

お気づきいただけた方もいらっしゃるかと思いますが、先ほどの構成とメリット・デメリットが反転するんですよね。

TerraformはPlan、Apply実行時にカレントディレクトリ配下の`.tf`ファイルを見にいくので、ディレクトリ分けた分だけApplyしないといけないし、ECSサービスとネットワークなど依存関係あるリソースはApplyする順番に気をつけないとエラーになります。

## まとめ

今回2つのパターンのディレクトリ構成を紹介させてもらいました。
個人的には、コード化するリソースが多い場合は、リソース毎にディレクトリ分ける構成の方がやりやすいかと思います。

上記以外の構成やられている方いらっしゃればぜひ教えてください〜
KruxインストーラーのGPG署名を確認する

# 趣旨
SeedSignerに続き、KruxもFOSSのビットコイン署名機としては優秀だと思うのと、韓国中国では注目され始めているのに、日本では話題になっていないので、実際に触ってみたいと思います。英語が読めない方にも真似できるように日本語で解説しますが、Krux本体の言語はデフォルトの英語設定のままで実行します。

注釈：この記事を書いてる最中に日本語が追加されました。

https://x.com/BitCoisas/status/1848455730422067252

英語が読める方は直接ドキュメントを読んだ方が良いです。

https://selfcustody.github.io/krux/getting-started/installing/from-gui/macos-arm64/

# 実践
僕はMacOSのARMタイプで実践しました。ドキュメントの該当ページに行くとKruxのインストーラーと署名とテキストファイルがダウンロードできるのでダウンロードします。

![Screenshot 2024-10-21 at 21.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/54f2e959-978e-0ac2-c8d6-688144a2c1f0.png)

僕の環境ではsha256sumが使えなかったのでcoreutilsをインストールしました。その手順は以下の通りです。
Homebrewをインストール (まだインストールされていない場合)
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
coreutilsをインストール (sha256sumが内包されているため)
```
brew install coreutils
```

sha256sumでインストールしたテキストファイルを確認します。
```
sha256sum --check ./krux-installer_0.0.20-alpha-3_arm64.dmg.sha256.txt
```
実行結果：OKと表示されれば良いです。
```
krux-installer_0.0.20-alpha-3_arm64.dmg: OK
```
keyserverから鍵を取得します。
```
gpg --keyserver hkps://keys.openpgp.org --recv-keys B4281DDDFBBD207BFA4113138974C90299326322
```
実行結果：qlrddev@gmail.comのキーがインポートされます。
```
gpg: key 8974C90299326322: public key "qlrddev <qlrddev@gmail.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
```
取得した鍵と直接ダウンロードした鍵が一致するか確認します。
```
gpg --verify ./krux-installer_0.0.20-alpha-3_arm64.dmg.sig
```
実行結果：Good signatureと表示が出ればOKです。
```
gpg: assuming signed data in './krux-installer_0.0.20-alpha-3_arm64.dmg'
gpg: Signature made czw 26 wrz 21:49:38 2024 CEST
gpg:                using RSA key B4281DDDFBBD207BFA4113138974C90299326322
gpg: Good signature from "qlrddev <qlrddev@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: B428 1DDD FBBD 207B FA41  1313 8974 C902 9932 6322
```
RSA keyの部分がqlrddev氏のものと一致すれば良いので、qlrddev氏のGithubページやXで確認します。

https://github.com/qlrd

![Screenshot 2024-10-21 at 22.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/d1e047a0-016b-6c89-07b1-f2dc7112ea00.png)

https://x.com/qlrddev

![Screenshot 2024-10-21 at 22.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/ce2d5463-56db-285f-0acf-f73f364ce94c.png)

もし起動できない場合は以下のコマンドでフラグを無効化します。
```
xattr -d com.apple.quarantine -r /Applications/krux-installer.app
```

これ以降GUIでインストーラーを起動できるので、実際にやってみるとこんな感じになります。

![Screenshot 2024-10-22 at 09.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/6b6b376c-6b62-1ab2-49f1-f54ac193891f.png)
【環境構築】Eclipseを使ったJavaの開発環境の構築

## はじめに
はじめまして、@tkmo0807です。Javaの学習を始めたので、学習の記録を残していこうと思います。今回は環境構築について記録します。まずはEclipseのインストールを行います。

## 今回利用する環境
- OS：windows11
- Eclipse：Eclipse IDE for Java Developers (includes Incubating components)
- Version：2022-12 (4.26.0)
- Java：JDK 17

## Eclipseのダウンロード
以下のサイトにアクセスしてEclipseをダウンロードします。今回はJDK 17を利用するので、Eclipse 2022-12を選択します。

https://willbrains.jp/ 

Eclipse 2022-12を選択した後、利用する環境を選べるので以下のように選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3855381/b11c8c83-d0e0-0010-2bd8-58dab77890d9.png)

選択するとインストーラがダウンロードされます。

## Eclipseのインストール
インストーラをダウンロードしたら、実際にインストールを行います。以下のファイルをダブルクリックしてインストーラを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3855381/572eccb3-2578-454a-f9d4-257cba6b3e28.png)


起動すると図のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3855381/6c5ce29c-668a-e1f3-45de-ffa57968eff6.png)

作成先フォルダに任意のフォルダを選択して`解凍`をクリックします。これでインストールは完了しました。次にJavaを動かせるように設定します。
Eclipseをインストールすると、以下のパスに環境変数へJavaを追加するバッチファイルが格納されます。

```
~\pleiades\2022-12\java
```
今回はJDK 17 を利用するのでset-JAVA_HOME-17.cmdを実行します。操作が完了したら、コマンドプロンプトでjava -versionを打ちます。以下のような返答が得られたら環境構築作業は完了です。

```
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment Temurin-17.0.6+10 (build 17.0.6+10)
OpenJDK 64-Bit Server VM Temurin-17.0.6+10 (build 17.0.6+10, mixed mode, sharing)
```
Laravelの基本知識（初心者向けリンク集）

# はじめに
以下のリンクはLaravelの開発に役立つ基本知識のリンク集です

都度更新を予定しています

## 環境構築
### プロジェクトを新規作成する

https://qiita.com/EasyCoder/items/1f7057b090f9428d3c76

## コードを実装する
<h3> ルーティングについて </h3>

https://qiita.com/EasyCoder/items/e4a2136db89704c6a7ce

### CRUD操作について
https://qiita.com/EasyCoder/items/f4dcc2b824288f3996d8

### Laravel11から存在しないapi.phpについて

https://qiita.com/EasyCoder/items/161f7d7049914d964551

### Laravelのコマンド一覧

https://qiita.com/EasyCoder/items/2c5416332d0b09d62633

## データベーステーブル関連

### リレーションの書き方と利用方法について（1対1 , 1対多）

https://qiita.com/EasyCoder/items/b7013b0b73b64a276af7

### リレーションの書き方と利用方法について（多対多）

https://qiita.com/EasyCoder/items/770861cc21852a7ed0b0

### 検索およびフィルタリングの作り方について

https://qiita.com/EasyCoder/items/cecfb657acd676edc590

### 接続されたテーブルから一括でER図を作成する方法

https://qiita.com/EasyCoder/items/bcd830c3867202b11534

### 接続されたテーブルから一括でモデルを作成する方法

https://qiita.com/EasyCoder/items/5241d7dd0322bb5a48d3

### エラー対策：外部キーを明示的に指定する方法

https://qiita.com/EasyCoder/items/dd8d30a992d98dcc3467

## その他
### 三項演算子の使い方について

https://qiita.com/EasyCoder/items/d5782917cd6b64ccefea
Tips #011 リストの選択肢項目がRecord型だったのでPatch関数で苦戦した話

https://qiita.com/Novskiiiiiiiiii/items/29575a556a6cf385fcb1

以下の状態だと問題ないのだが、

    Patch(
    test_concur_request,
    Defaults(test_concur_request),
    {
        タイトル:DataCardValue1.Text,
        計上日:DataCardValue2.SelectedDate
    })

計上日の次に支払方法を以下のように記述したら

    Patch(
        test_concur_request,
        Defaults(test_concur_request),
        {
            タイトル:DataCardValue1.Text,
            計上日:DataCardValue2.SelectedDate,
            支払方法:DataCardValue5.Selected.Value
        })

次のようなエラーになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/70d66071-27ae-7686-49d6-256edceaeb87.png)

    この引数 'payment_methods' の型は 'Record' と一致しません

だと。

Copilotに聞くと、どうやらリスト上の選択肢項目はrecord型らしい。
なんじゃそりゃ。

Copilotと建設的な話し合いにならなかったので試行錯誤した結果、
次のようにしたらうまくいった。

    Patch(
        test_concur_request,
        Defaults(test_concur_request),
        {
            タイトル:DataCardValue1.Text,
            計上日:DataCardValue2.SelectedDate,
            支払方法: {
                Value: DataCardValue5.Selected.Value
            }
        })

一筋縄では行きませんね！

以上

https://qiita.com/Novskiiiiiiiiii/items/447295452c9bc8910447