OmniAICreator/Qiita-1.07M huggingface dataset:
デジタル署名と証明書


# デジタル署名とは

デジタル署名は、異なる鍵ペアを用いる公開鍵暗号と同様の仕組みを使って、改ざんの検知や否認の防止を行います。イメージとして下記の図のようなイメージです。

![デジタル署名.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/3f17f27d-8c01-446f-a23b-a2de6b0de916.png)


上記の通りデジタル署名を行う際には、**プライベート鍵で暗号化し、公開鍵で復号化**します。
簡単にまとめてしまえば、

- 「プライベート鍵で暗号化」＝「署名をする」
- 「公開鍵で復号化」＝「署名が正しいものかを確認する」

という事になります。

また、デジタル署名には下記のパターンがあります。メッセージのハッシュ値に署名する(暗号化する)パターンがよく使われます。

- メッセージに直接署名する
- メッセージのハッシュ値に署名する

使用する暗号方式は、RSA、ElGamal方式、DSA、ECDSA(楕円曲線暗号)等を使用することが多いです。
また、デジタル署名は署名されていることは確認できても、その署名の内容が信頼できるものかどうかはわかりません。
信頼できるものかどうかの判断をするために、デジタル署名は証明書(デジタル証明書)と一緒に使用されることが多いです。

# 証明書(デジタル証明書)とは

信頼できる第三者によって、公開鍵が承認されていること(偽装されていないこと)を示すためのもの(証明書)です。
正式には公開鍵証明書と呼ばれており、X.509という規格に則ったものがよく使われています。証明書を発行する信頼できる第三者の事は、認証局と呼ばれています。

## 認証局

認証局は、下記の役割を担います。

- 鍵ペアの作成
- 証明書の登録
- 公開鍵登録時の本人確認
- 証明書破棄リスト(CRL)の作成

また、認証局自身が認証局である事を示すために、別の認証局が証明書を発行する必要があります。
そのため、認証局は下記の図のように階層化されています。認証局は上位層の認証局に対して自身が信頼できる認証局であることを示す証明書の発行を依頼します。

![認証局と証明書.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/2688379f-6f89-4a0a-a32d-1607439b3dac.png)

ちなみに、最上位層となるルートCAと呼ばれる認証局は、ルートCA自身が認証局であることを示す証明書(自分で自分を認証する証明書)を発行することで対応します。

### 証明書の発行＋デジタル署名の流れ

下記が、公開鍵の認証局への登録(証明書の発行)から、データ送信時に証明書を使用するまでの流れになります。

![証明書発行.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/80cd19f8-04a4-413d-a9d6-7bbcc5d4946d.png)

1. データ受信者(A)は鍵ペアを作成  
2. Aは認証局にAの公開鍵を登録  
3. 認証局はAの公開鍵に、認証局のプライベート鍵でデジタル署名して証明書を作成  
4. 送信者(B)は証明書を入手  
5. Bは認証局の公開鍵で、証明書が正しい事を確認(Aの公開鍵を入手)    
6. BはAの公開鍵で暗号化し、データを送信  

### 証明書失効リスト（CRL）

認証局がこれを作成する、デジタル証明書の失効リストです。詳しくはRFC5280にて示されています。
なぜ証明書失効リストが必要かというと、誤って証明書が流出してしまった場合に証明書を無効にしたり、期限切れの証明書を無効にする必要があるからです。


## 公開鍵基盤(PKI)

RFC5280にて示されている、公開鍵を効果的に運用するための規格と仕様のことになります。
デジタル署名や証明書を扱う際にはこの規格・仕様に沿って行われます。

# 参考資料

https://learn.microsoft.com/ja-jp/windows/win32/seccrypto/hierarchy-of-trust

https://tex2e.github.io/rfc-translater/html/rfc5280.html

https://www.ibm.com/docs/ja/ibm-mq/9.2?topic=concepts-digital-certificates
Ethernet FCSをWiresharkで確認

# EthernetのFCSをWiresharkで確認
小ネタではあるが興味あ理、タイトルのままである。偶然、下記サイトを見つけてトライした記録。ほぼそのまま。
- [How do you send an Ethernet frame with a corrupt FCS?](https://stackoverflow.com/questions/723635/how-do-you-send-an-ethernet-frame-with-a-corrupt-fcs)

ethtoolを使う。ただし、一部のOSでしか実現できず（とは言ってもそれほど多くのLinuxで試したわけではない）。WindowsもMac OSでもダメ。ただし、後述するが条件次第かもしれない。

## antiXでOK
antiXは、Debian系の比較的軽量Linux。FCSを確認することができた。小生の環境は下記のとおり。

```shell
$ cat /etc/issue 
Welcome to antiX. Powered by Debian.
$
$ cat /etc/lsb-release 
PRETTY_NAME="antiX-23.1 Arditi del Popolo"
DISTRIB_ID=antiX
DISTRIB_RELEASE=23.1
DISTRIB_CODENAME=bookworm
DISTRIB_DESCRIPTION="antiX"
$
$ uname -a
Linux antix1 5.10.224-antix.1-amd64-smp #1 SMP Tue Aug 20 20:39:20 EEST 2024 x86_64 GNU/Linux
```

ただし、Virtualbox上のVM環境である。まずは、コマンド実行前の状況。

```shell
$ sudo ethertool -k eth0

Features for eth0:
...

rx-fcs: off
rx-all: off
```

次に、上記したURLにしたがって、ethtoolを実行し、FCS受信を有効化。

```shell
$ sudo ethtool -K eth0 rx-fcs on
$ sudo ethtool -K eth0 rx-all on
```

コマンド実行後の状況は下記。

```shell
$ sudo ethertool -k eth0

Features for eth0:
...

rx-fcs: on
rx-all: on
```

### Wiresharkで確認
何かしら通信させる。設定前の状況は下記。

![noFCSのコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6bf96ba4-7e56-403f-9d04-35646647160d.png)

FCSは見えていない。設定が必要。

![Wireshark設定のコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/344b62c0-f744-5262-98d3-034754fb26ae.png)

Ethernetにて、”Validate the Ethernet checksum if possible”を有効化する。

![correctFCSのコピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ab367a81-b70c-4c0e-8f51-2d2bc846fa9c.png)

データ解析（Correct FCS）および生データにてFCSが見える。

## UbuntuではNGであった（ただし実機利用）
ほとんどのことがUbuntuでできるであるが、今回はNG。参考までに、小生の環境は下記。

```shell
$ uname -a
Linux LLLLL 6.8.0-51-generic #52-Ubuntu SMP PREEMPT_DYNAMIC Thu Dec  5 13:09:44 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$
$ cat /etc/issue
Ubuntu 24.04.1 LTS \n \l
$ 
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.1 LTS"
```

ethtoolを実施した結果は下記。

```shell
$ sudo ethtool -K enp3s0f0 rx-fcs on
Actual changes:
rx-fcs: off [requested on]
Could not change any device features
$
$ sudo ethtool -K enp3s0f0 rx-all on
Actual changes:
rx-all: off [requested on]
Could not change any device features
$ 
```

上述の結果のとおりNGとなった。設定状況も確認。

```shell
$ sudo ethtool -k enp3s0f0
Features for enp3s0f0:
...

rx-fcs: off [fixed]
rx-all: off [fixed]
```

”off [fixed]”となっており、変更不可のようだ。ただし、これは実機上の話。前述のように、VM上で実施すれば、異なる結果が得られるのかもしれない、、、（未調査）。

## 最後に
正しくないFCSを送付して、Incorrect FCS表示を見たいのだが苦闘中。参考情報は下記。
- [How do you send an Ethernet frame with a corrupt FCS?](https://stackoverflow.com/questions/723635/how-do-you-send-an-ethernet-frame-with-a-corrupt-fcs)

こちらを参考にトライしているが、まだ実現できておらず。実現できたら紹介したい。
新卒2年目エンジニアの学習記録：学習13カ月目

# はじめに
新卒2年目エンジニアのA.Kと申します。
先月に引き続き、今月に個人学習でやっていたことを記録していきます。

先月の記事です↓

https://qiita.com/AK_React/items/378c32b180d4b9567187

# 学習13か月目にやったこと

### <font color="Red">フルスタック個人開発 実装＆テスト完了</font>

先月に引き続きSNSアプリの作成を行っています。
**今月はフロントエンドメインの実装＆テスト**を行いました。
開発環境では一通りアプリが使える状態なので、Railsのキャッチアップを兼ねて認証機能・画像保存機能作成に入っていきます。

**～✅現在の進捗～**

- [x] Rails API実装
- [x] Rspec
- [x] フロントエンド機能実装
- [x] フロントエンドテスト
- [ ] Rails APIを使って認証機能・画像保存機能作成
- [ ] 認証機能・画像保存機能テスト作成
- [ ] AWS・Docker環境構築
- [ ] Dockerを使ってAWS EC2+RDSにデプロイ
- [ ] ECSにデプロイ
- [ ] CI/CD
- [ ] Terraformでインフラコード化
***

### <font color="Red">チュートリアル実施</font>

下記の2本のチュートリアルを行いました。
手を動かしながら新しい技術を学ぶスタンスは変わっていません。

**1本目のチュートリアルでは、かの有名な状態管理ライブラリRecoilの代替として登場したJotaiを使ってみました**。
実務のPJでも「そういえばRecoilが使えなくなってる」みたいな話が出てたので、自分がJotaiを使ってみてメンバーに情報共有したりしてました。
**自分が学んだことは常にメンバーに還元していきたい**と思っています。

https://qiita.com/Sicut_study/items/ee41f1bb59fcda45a50b

2本目のチュートリアルでは、**Next.jsに代わる存在として注目されているreact-serverも触ってみました**。
まだまだNext.jsの機能を使いこなせているとはお世辞にも言えない状態なので、このようにシンプルなフレームワークが登場してくれたのはありがたいなと思っています。
**どちらかというとフロント寄りの人間なので、新しい技術には臆せず手を出していきたい**です。

https://qiita.com/Sicut_study/items/1d5c4f2ddac621565ce2

***

### <font color="Red">OSS活動</font>

**ついに自分史上初・念願のOSS活動デビューを果たしました🎊**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/d16cee2d-6ef3-413d-834d-30eefb9bebac.png)

活動内容としては、**react-server公式ドキュメントの和訳**を行っています。
大学時代は英語に力を入れていたこともあって、非常に楽しく活動させてもらっています。
**自分がこれまでに学んできたことを生かして誰かの役に立てていることが、本当に本当に嬉しい**です。

https://github.com/lazarv/react-server

# おわりに
私にとって**学習は日常の一部ではありますが、乗り気ではなかったり成長を実感できない時期もあります**。（とはいえ日常なので学習を止めることはありませんが）
今月も「まだまだ頑張れたんじゃないのか・追い込みが足りないんじゃないのか」と追い詰めてしまっていましたが、**こうして学習記録を残すことで自分の頑張りを再評価**することができました。
（いつもの個人開発に加えてOSS活動とチュートリアル2本はまあまあな量やったな）
**習慣こそ記録していかないと、ちょっとした変化や成長を見逃しかねないな**と実感しています。
エンジニアの自走力と予測可能性とエンジニアの素養についての考察

僕たちはなぜアニメやドラマ、音楽を楽しむのだろうか。あるいは、技術書を楽しんで読める層と、苦労して読む層と、全く読めない層があるのだろうか。
カギは「予測可能性」にあると思う。
例えば、アニメやドラマは、ある程度展開が予測できるが、予測できないところもある。音楽もそうである。あまりにも予想外のことは起こりにくいかもしれない。
つまり、コンテンツを楽しんで（自走力を持って）読むためには、ある程度、展開や先の予想がつく必要がある。で、多少は予想外のことが起きても良い。僕たちが同じ映画を何回も見れないのは、予測可能性が高すぎるからだ。
ある程度予測が可能なら、心の中でこういうゲームができる。ある程度展開を予測して、当たるか外れるかを見るのだ。予測可能性が高すぎても低すぎてもこういうゲームはできない。
では、技術書はどうだろうか。最初はあまり楽しんで読めないと言うか、最初は結構苦労することが多い。単純に、予測不可能な文字が並んでいるのでそうなる。
ある程度慣れたら、自走力を持って読むことができる。ある程度予想がつけられるのである。技術に対する理解が深まったと言っていい。
で、「生まれながらにして技術者」は存在しない。最初はどんなコンテンツも予測不可能なのである。
例えば、働き始めると、ソースコードをひたすら読むことが多いと思うが、それもある程度予測可能と言うか、理解可能だから読み続けることができる。でも、難易度の高い、やる価値のあるものに限って、予測不可能性が低い。
「自走力のない人」を「自走力のあるエンジニア」に変換することは可能である。今エンジニアとして働いている人も、どこかで変換したか、変換されてきたのである。
問題は、企業は基本的に営利追求と価値創造の場所なので、普通の人をエンジニアに変換する作業をやってくれるとは限らない。つまり、問題はコストである。結構なコストがかかって、コストをかけた主体がそのコストを回収できるとは限らない。才能や素養の問題ではない。（才能や素養の問題にしておけば学校も企業も責任逃れができる。だって仕方ないよね？本人の才能がないから、教え方の問題ではない）
なので、企業は基本的には自走力のある「才能ある」エンジニアを求める。


で、解決策は、結局、「理解できるまで読む」しか無いんじゃないかと思う。どうせ、仕事では理解の難しいソースコードを読むのである。
「プログラミングは才能」論には問題がある。なぜなら、ソフトウェアの課題において、やる価値のあるものは、だいたい難しいということだ。「才能」を証明したいなら、簡単で目立つものをたくさんこなせばいい。こうして、世界には難易度の高い課題が手つかずで残る。みんな手を付けることもしない。「才能」が否定されるからだ。「才能がないことはやるべきでない」という思想には問題がある。
理解できないことによる苦痛には、根本には「プログラミングは才能」という思想があるように思う。理解できないことは才能がない証拠になる。才能がないなんて嫌だろう。

結局、「プログラミングは才能ではない」ことを肯定することから始めるべきなんじゃないかと思う。「プログラミングは才能」という論は有害でしかない。

ということで、理工学勉強会でJavaやってます。「才能のない」人を歓迎しています。

https://engineeringskype.connpass.com/
Linux入門：Linuxのファイル所有権管理コマンドのchownとchgrpについて使いながらまとめてみた

## はじめに
Linuxのファイルやディレクトリの所有権を適切に管理することは、システムのセキュリティやアクセス制御を適切に行う上で重要です。

本記事では、`chown` と `chgrp` コマンドの基本的な使い方や実用的なオプションについて解説します。

## 書こうと思ったきっかけ
Linuxを使用していると、ファイルの所有者やグループを変更したい場面がよくあります。

:::note warn
**特に、管理者権限（root）で操作する必要があるケースでは、誤った設定をするとアクセス権の問題が発生することがあります。**
:::

そこで、適切なコマンドの使い方をまとめることで、トラブルを未然に防ぎ、安全なシステム運用をサポートできると考えました。

## `chown` コマンド：ファイルの所有者を変更する

`chown` コマンドは、指定したファイルやディレクトリの所有者（オーナー）を変更するために使用されます。

### 基本的な使い方
```bash
chown root ファイル名
```
例えば、`test.txt` の所有者を `root` に変更するには、次のように入力します。
```bash
chown root test.txt
```

**実際のターミナル画面**

![Screenshot 2025-03-15 at 8.10.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9ab02c2b-9952-4d58-b8ef-3f52a6f90044.png)

### `chown` で所有者とグループを一度に変更する

`chown` コマンドでは、所有者とグループを同時に変更することも可能です。
```bash
chown ユーザー名:グループ名 ファイル名
```
例えば、`test.txt` の所有者を `root`、グループを `wheel` に変更するには、以下のようにします。
```bash
chown root:wheel test.txt
```

**実際のターミナル画面**

![Screenshot 2025-03-15 at 8.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b027241b-0039-4ca3-9adf-ac0e2ad8f887.png)

### `-R` オプションを使って再帰的に変更
`-R` オプションを付けることで、ディレクトリ内のすべてのファイルやサブディレクトリの所有者を変更できます。
```bash
chown -R root:wheel /path/to/directory
```

## `chgrp` コマンド：ファイルのグループを変更する

`chgrp` コマンドは、ファイルやディレクトリのグループを変更するために使用されます。

### 基本的な使い方
```bash
chgrp root ファイル名
```
例えば、`test.txt` のグループを `wheel` に変更するには、次のように入力します。
```bash
chgrp wheel test.txt
```

**実際のターミナル画面**

![Screenshot 2025-03-15 at 8.15.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f768a7af-1bf4-45af-a1d8-bf48590ddbca.png)

### `-R` オプションでディレクトリ内のすべてのファイルのグループを変更
`-R` オプションを付けると、指定したディレクトリ内のすべてのファイルやディレクトリのグループを変更できます。
```bash
chgrp -R wheel /path/to/directory
```

## まとめ
- `chown` コマンドはファイルの所有者を変更する。
- `chgrp` コマンドはファイルのグループを変更する。
- `chown user:group ファイル名` で所有者とグループを同時に変更可能。
- `-R` オプションを使うと、ディレクトリ以下のすべてのファイルやフォルダに適用できる。

ファイルの権限管理はシステムのセキュリティに直結するため、適切に設定し、安全な環境を維持してみてください！
Databricksクラスターログをボリュームに出力できるようになりました

これも地味に嬉しいアップデート。これまではS3とDBFSにしか出力できなかったので、出力されたログの確認が若干面倒でした。

https://docs.databricks.com/aws/ja/release-notes/product/2025/march#compute-logs-can-now-be-delivered-to-volumes-public-preview

**コンピュートログがボリュームにデリバリーされるようになりました(パブリックプレビュー)**

> コンピュートリソースのドライバー、ワーカーおよびイベントのログをボリュームにデリバリーさせることができるようになりました。[コンピュートログのデリバリー](https://docs.databricks.com/aws/ja/compute/configure#cluster-log-delivery)をご覧ください。

クラスターの設定画面の**Advanced**で**ロギング**にアクセスします。**配信先**にボリュームが追加されています。

![Screenshot 2025-03-15 at 7.51.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/051fbc80-6e07-410a-abef-8eab64c2d19b.png)

ボリュームのパスを指定します。

![Screenshot 2025-03-15 at 7.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0b5b5fa4-ff7b-4cc9-b2e6-7b8eea67cf54.png)

クラスターを起動して少し待つと、ボリュームにフォルダが作成されます。クラスターIDのフォルダの下にはドライバーノードやイベントログが格納されています。

![Screenshot 2025-03-15 at 8.11.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5330d4e2-1f55-4f23-9901-86bb066e0ad5.png)

![Screenshot 2025-03-15 at 8.05.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/428614d7-a2d6-48c7-a0c9-a488a57f2763.png)

拡張子が`log`のものであればプレビューも可能です。

![Screenshot 2025-03-15 at 8.06.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a52412b7-a550-44f7-90c9-03e1ef799ece.png)


### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【Rails入門】初学者がActionTextをインストールしてみた！ ～初心者でも簡単にリッチテキストを扱える～

## 📝 ActionText って何？

Rails でリッチテキストを扱うのに便利な **ActionText** という機能を試してみました。
ActionText を使うと、**太字・画像・リンク付きの文章を簡単に入力・保存・表示できる** らしく、学ぶ機会があったため、実際に動かしてみました。
例えば、ブログの記事やコメント機能で「装飾付きのテキストを書きたいなあ」ってときにすごく便利です。
実装できた時は、エクセルやワードを思い出しました。

Rails 標準機能の **Trixエディタ** を自動で組み込んでくれるので、特別な設定は不要なようです。
アウトプットのために、残しておきます。

---

## 🔧 ActionText をインストールする

### **1. ActionText のインストール**
まずは、Rails アプリのルートディレクトリで以下のコマンドを実行します。

```sh
bundle exec rails action_text:install
```

これで、
- `db/migrate/xxxxxx_create_action_text_tables.rb` というマイグレーションファイルが作成される
- `app/javascript` に Trix エディタが追加される
- `app/assets/stylesheets/actiontext.scss` が作成される

…といった準備が自動で進むはず。

### **2. SCSS にスタイルを追加（重要！）**

私は、そのままだとなぜか Trix エディタが正しく動かなかったので、以下のコードを `app/assets/stylesheets/application.scss` に追記。

```scss
@import 'actiontext';
@import 'trix/dist/trix.css';
```

もしエディタがうまく表示されない場合は、これを試してみてください。（参考程度に）

### **3. マイグレーションを実行**
次に、作成されたマイグレーションファイルを適用します。

```sh
bundle exec rails db:migrate
```

これで、リッチテキスト用のデータを保存する `action_text_rich_texts` テーブルが作成される。

---

## 🏗 実際に使ってみる

### **1. モデルに ActionText を追加**
リッチテキストを使いたいモデルに `has_rich_text` を追加します。

```ruby
class Article < ApplicationRecord
  has_rich_text :content
end
```

これで、`content` というリッチテキストのフィールドが使えるようになりました。

（普通はテーブルに `content` カラムを追加するけど、ActionText を使うと `action_text_rich_texts` テーブルに自動で保存されるので、カラム追加は不要！）

### **2. フォームにリッチテキストエディタを追加**
記事を作成するときのフォームにリッチテキストエディタを追加します。

```erb
<%= form_with model: @article, local: true do |f| %>
  <div>
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>

  <div>
    <%= f.label :content %>
    <%= f.rich_text_area :content %>
  </div>

  <%= f.submit "投稿する" %>
<% end %>
```

`rich_text_area` を使うだけで、Trixエディタが使えるようになルはず。

### **3. 記事を表示する**
作成した記事を表示するときは、普通に `@article.content` を出力。

```erb
<h1><%= @article.title %></h1>
<div>
  <%= @article.content %>
</div>
```

これだけでリッチテキストが反映されました。

---

## 🗑 ActionText を削除するには？

「やっぱり普通のテキストに戻したい…」ってときのために、ActionText の削除方法もメモしておきます。

### **1. モデルから削除**
まず、`has_rich_text` の行を削除します。

```ruby
class Article < ApplicationRecord
  # has_rich_text :content （この行を削除！）
end
```

### **2. データベースの変更を元に戻す**
以下のコマンドを実行して、`action_text_rich_texts` テーブルを削除します。

```sh
bundle exec rails db:rollback STEP=1
```

または、マイグレーションファイルを削除した後に、

```sh
bundle exec rails db:migrate
```

を実行してもよい。

### **3. 関連ファイルの削除**
ActionText のインストール時に追加されたファイルを削除します。

```sh
rm -rf app/javascript/trix
rm -rf app/assets/stylesheets/actiontext.scss
```

また、`config/importmap.rb` に `pin "trix"` などの記述がある場合は削除。

---

## 📌 まとめ
✅ **ActionText を使うと** リッチテキスト（画像・装飾つきテキスト）を簡単に扱える。
✅ `has_rich_text :content` を追加するだけで **データベースのカラム追加は不要**。
✅ **Trixエディタ** が自動で使えるので、設定いらず。
✅ **SCSS に `@import` を追加すると、エディタが正常に動作する可能性あり。**
✅ **不要になったら簡単に削除できる**。

---

## 🔗 参考リンク
- [ActionText 公式ドキュメント](https://edgeguides.rubyonrails.org/action_text_overview.html)
- [Railsガイド](https://railsguides.jp/)

以上、超初学者が ActionText をインストールしてみた記録でした。
引き続き、学習を続けます。
【Swift】タプル型について理解する

## はじめに
本記事では、タプル型について理解するために内容をまとめます。

## タプル型とは
複数の型をまとめて1つの型として扱える型を**タプル型**といいます。
異なる型を混ぜて格納できるため、簡単なデータの組み合わせを使いたい時に便利です。

タプル型を定義するには、要素となる型を()内に、` , `区切りで`(型名1,型名2,型名3)`のように列挙します。
タプル型の要素にはどのような型も指定でき、要素数にも制限はありません。

タプル型の値は**タプル**といい、タプルを生成するには、型名と同様に要素となる値を()内に` , `区切りで`(要素1,要素2,要素3)`のように列挙します。

![スクリーンショット 2025-03-15 6.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/82ae9ab0-8409-477c-bd94-942922e2e688.png)

上記の例では、(Int, String)型の変数tupleに、タプル(1, "a")を代入しています。

## 要素へのアクセス
タプルの要素へのアクセス方法には、**インデックスによるアクセス**、**要素名によるアクセス**、**代入によるアクセス**の3つがあります。

### インデックスによるアクセス
変数や定数に` . `をつけて、`変数名.インデックス`という書式でアクセスします。
最初の要素のインデックスは0で、1,2と続いていきます。

![スクリーンショット 2025-03-15 6.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/0846dc62-79b6-4fe5-b506-b012beb58e72.png)

上記の例では、(Int, String)型のタプル(1, "a")の各要素にインデックスでアクセスしています。
`tuple.0`は1つ目の要素1を返し、`tuple.1`は2つ目の要素"a"を返します。

### 要素名によるアクセス
タプルの定義時に各要素に要素名をつけ、その名前を通じて要素にアクセスすることができます。
要素名を定義するには、タプルの要素の前に`要素名:`を追加して、`要素名1: 要素1, 要素名2: 要素2`のように書きます。

![スクリーンショット 2025-03-15 6.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/5176f6a3-7e88-4992-82a1-cf145333bf35.png)

上記の例では、(Int, String)型のタプルの要素にそれぞれint、stringという名前を定義し、`tuple.int`、`tuple.string`で各要素にアクセスしています。

### 代入によるアクセス
タプルは、()内に` , `区切りで列挙された要素数分の変数や定数に代入できます。
タプルの要素には、代入先の変数や定数を通じてアクセスできます。

![スクリーンショット 2025-03-15 6.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/63150cc5-dcb4-4385-930c-da69ee34a86c.png)

上記の例では、Int型の定数intとString型の定数stringを()内に列挙し、タプル(1, "a")を通じて、これらの定数に一度に値を代入しています。

![スクリーンショット 2025-03-15 6.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/8cdcd964-3e12-475a-b015-7b0bf735a21f.png)

また、()内に複数の変数や定数を同時に宣言することもできます。
上記の例では、定数intと定数stringを()内で宣言すると同時に、タプル(1, "a")を用いて初期化しています。

## Void型（空のタプル）
要素の型が0個のタプル型を**Void型**といいます。
Void型は値が存在し得ないことを表す型です。

Void型は、関数の戻り値がないことを表す用途などで使用されます。

![スクリーンショット 2025-03-15 6.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/af394d36-6dff-4596-8061-6f49bc0f393b.png)

上記の例のgreet関数は、print関数を用いて文字を出力するだけで関数の呼び出し元には何も値を返さないため、戻り値としてVoidを指定しています。

![スクリーンショット 2025-03-15 6.53.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004493/78f7c87a-7156-439d-a4f8-f5501bef85d2.png)

また、戻り値が不要な場合、関数宣言での戻り値の型（Void）の定義を省略できます。
上記の例はVoidを省略した形です。

## まとめ
- 複数の型をまとめて1つの型として扱える型を**タプル型**という
- タプルの要素へのアクセス方法には、**インデックスによるアクセス**、**要素名によるアクセス**、**代入によるアクセス**の3つがある
- 要素の型が0個のタプル型を**Void型**といい、値が存在し得ないことを表す
- Void型は関数の戻り値がないことを表す用途で使用され、記述を省略できる
保護者の制限でG++やcコンパイラーが使えないときの対処方法

##### 基本的に、Microsoft C++ Build Toolsは無理だと思う。なので、MinGWを使う。

# MinGWのインストール方法

MinGW（Minimalist GNU for Windows）は、Windows上で動作するGCCコンパイラを含む開発環境です。以下の手順でインストールを行います。

## 1. MinGWのダウンロード
1. [MinGW公式サイト](https://sourceforge.net/projects/mingw/) にアクセスする。
2. 「Download」ボタンをクリックして、インストーラー（`mingw-get-setup.exe`）をダウンロードする。

## 2. インストール
1. ダウンロードした`mingw-get-setup.exe`を実行する。
2. 「Install」ボタンをクリックし、インストールディレクトリを指定する（通常は`C:\MinGW`）。
3. 「Continue」をクリックしてインストールを開始する。もし、そのディレクトリに権限がない場合は自身の使用する権限(C:\Users\ichig など)に変更してください。

## 3. 必要なパッケージのインストール
1. インストーラーが起動したら、「Basic Setup」を選択。
2. 以下のパッケージにチェックを入れる：
   - `mingw-developer-toolkit`
   - `mingw32-base`
   - `mingw32-gcc-g++`
   - `mingw32-gcc-objc`
3. 右クリックして「Mark for Installation」を選択する。
4. 左上の「Installation」→「Apply Changes」をクリック。
5. 確認ダイアログが表示されたら「Apply」をクリックし、インストールを完了する。

## 4. 環境変数の設定
1. 「Windowsキー + S」で「環境変数」と検索し、「環境変数の編集」を開く。
2. 「システム環境変数」の「Path」を選択して「編集」をクリック。
3. 「新規」をクリックし、MinGWの`bin`フォルダを追加する（例：`C:\MinGW\bin`　`インストール先＋「\bin」になる`）。
4. 「OK」をクリックしてウィンドウを閉じる。

## 5. 動作確認
1. コマンドプロンプトを開く（`Win + R` → `cmd` → Enter）。
2. 以下のコマンドを実行する：
   ```bash
   gcc --version
Goでテスト自動化 & CI/CD 構築を構築してみよう

## はじめに

ソフトウェア開発において、テストの自動化とCI/CD（継続的インテグレーション / 継続的デリバリー）は、品質向上と開発効率の向上に不可欠です。  
Goでは、標準の`testing`パッケージを使ったテスト自動化や、GitHubActions、Dockerを活用したCI/CDパイプラインの構築が可能です。

今回は、テストを自動化できる方法を簡単に解説します。

**対象読者**
- Goのテストを自動化したい方
- CI/CDの仕組みを学び、開発効率を向上させたい方
- 実践的なGitHubActionsを使ったCI/CDの設定を知りたい方

**目次**
1. テスト自動化の重要性
   - 手動テスト vs 自動テスト
   - 自動テストのメリット
2. Goでのテスト自動化
   - `go test`を使ったユニットテスト
   - `gotestsum`を使った高度なテストレポート
3. CI/CDの基本と構築方法
   - そもそもCI/CDとは？
   - GitHub Actionsを使ったCI/CD設定
   - Docker & Kubernetesを利用したデプロイの自動化
4. まとめ

---

## 1. テスト自動化の重要性

#### **1.1 手動テスト vs 自動テスト**

| 項目 | 手動テスト | 自動テスト |
|------|---------|---------|
| **実行コスト** | 高い（毎回手作業） | 低い（1 コマンドで実行） |
| **バグ検出** | 人為的ミスが起こりやすい | 一貫した品質保証が可能 |
| **開発スピード** | 遅い | 速い |

#### **1.2 自動テストのメリット**

- バグの早期発見：デプロイ前に問題を検出できる
- コードの品質向上：一貫性のあるコードを維持
- 開発スピードの向上：テストの実行を自動化することで、迅速なデリバリーが可能となる

---

## 2. Goでのテスト自動化

#### **2.1 `go test`を使ったユニットテスト**

Goでは、標準ライブラリの`testing`パッケージを使用して簡単にテストを自動化できます。

**example_test.go**
```go
package example

import (
    "testing"
)

func Add(a, b int) int {
    return a + b
}

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5
    if result != expected {
        t.Errorf("Expected %d but got %d", expected, result)
    }
}
```

**テストの実行**
```sh
go test ./...
```

#### **2.2 `gotestsum`を使った高度なテストレポート**

`gotestsum`を使うと、テスト結果を見やすく表示できます。

**インストール**
```sh
go install gotest.tools/gotestsum@latest
```

**実行**
```sh
gotestsum --format testname
```

---

## 3. CI/CDの基本と構築方法

#### **3.1 そもそもCI/CDとは？**

| 項目 | 説明 |
|------|------|
| **CI（継続的インテグレーション）** | コード変更時に自動でテストを実行し、品質を担保 |
| **CD（継続的デリバリー）** | テストが通過したら、自動でデプロイ |

CI/CDを導入することで、「テスト → ビルド → デプロイ」のプロセスを自動化できます。

#### **3.2 GitHubActionsを使ったCI/CDの設定**

GitHubActionsを使えば、リポジトリの更新時に自動でテストを実行できます。

**`.github/workflows/ci.yml`**
```yaml
name: Go CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - name: リポジトリをチェックアウト
      uses: actions/checkout@v2

    - name: Go をセットアップ
      uses: actions/setup-go@v2
      with:
        go-version: 1.18

    - name: 依存関係を取得
      run: go mod tidy

    - name: テストの実行
      run: go test ./...
```

#### **3.3 Docker & Kubernetesを利用したデプロイの自動化**

GitHubActionsを使ってDockerイメージをビルドし、Kubernetesにデプロイできます。

**`.github/workflows/deploy.yml`**
```yaml
name: Deploy to Kubernetes

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Docker ビルドとプッシュ
      run: |
        docker build -t my-app:latest .
        docker tag my-app:latest myrepo/my-app:latest
        docker push myrepo/my-app:latest

    - name: Kubernetes へのデプロイ
      run: |
        kubectl apply -f k8s/deployment.yaml
```

---

## 4. まとめ

| 項目 | 説明 |
|------|------|
| **Goのテスト自動化** | `testing`パッケージと `go test`を活用 |
| **CI/CD の導入** | GitHubActionsを使ってテストとデプロイを自動化 |
| **Docker & Kubernetes** | 自動デプロイを実現し、本番環境に迅速に反映 |

  
次は補足、ちょっと上級者向けの内容として、テストカバレッジの向上についてや、Terraformを活用したクラウド環境の自動構築を解説します！
毎日勉強！！！
【Rails 6 + Webpacker】M1/M2 Mac で発生したエラーの解決法 

# 【Rails 6 + Webpacker】M1/M2 Mac で発生したエラーの解決法


初めまして。
子育て中の現役看護師で、エンジニア転職を目指してRuby on Railsを勉強しています。
アウトプットのために、Rails6 + Webpackerのセットアップ時に陥ったエラーとその解決方法をまとめました。

現在の学習で使用しているMacBookがM1チップなのですが、M1/M2Macでは、Node.jsのバージョンや、Webpackerの設定でエラーが発生しやすいと色々な記事を参照し、知りました。
（勉強用に安く中古で買えるものが、たまたまM1チップのMacだったのです。）

※初学者のため、間違えていたらすいません。

---

## **発生したエラー**

Rails 6 + Webpacker のセットアップ時に、以下のようなエラーが発生しました。

```sh
error Couldn't find an integrity file
error Found 1 errors.
========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================
```

```sh
error blog_app@0.1.0: The engine "node" is incompatible with this module. Expected version "14.x". Got "18.x"
error Found incompatible module.
```

```sh
zsh:1: command not found: nvm
```

```sh
Downloading and installing node v14.21.3...
curl: (56) The requested URL returned error: 404
```

---

## **解決までの流れ**

✅ nvm の確認 & 設定  
✅ Node.js を 14.x に切り替え  
✅ Yarn の再インストール  
✅ Webpacker のリセット  
✅ Rails サーバーの起動  

---

## **1. nvm がインストールされているか確認**

まず、`nvm` がインストールされているか確認します。

```sh
nvm --version
```

バージョン (`0.40.1` など) が表示されれば OK  
`command not found: nvm` と出た場合は `nvm` をインストール

```sh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.zshrc
```

その後、再度 `nvm --version` で確認

---

## **2. Node.js 14.x をインストール**

M1/M2 Mac では `nvm install 14` だけではエラーになることがあるため、
x86_64 (Intel) バージョンを明示的にインストールします。

```sh
nvm install 14
nvm use 14
```

バージョンを確認:

```sh
node -v
```
 `v14.x.x` が表示されていれば OK

---

## **3. Node.js 14.x をデフォルトに設定**

毎回 `nvm use 14` を実行するのが面倒なので、デフォルトを 14 に設定

```sh
nvm alias default 14
```

---

## **4. Yarn の再インストール**

次に、Yarn のパッケージをリセット

```sh
yarn install --check-files
```

もしエラーが出る場合は、以下を試します。

```sh
rm -rf node_modules
rm -f yarn.lock
yarn install
```

---

## **5. Webpacker のリセット & 再インストール**

Webpacker のキャッシュを削除し、再インストール

```sh
rails webpacker:clobber
rails webpacker:install
```

---

## **6. Rails サーバーの起動**

最後に、Rails サーバーを起動して動作を確認

```sh
rails s
```

✅ [http://localhost:3000](http://localhost:3000) にアクセスできれば成功

---

## **まとめ**

| 項目                     | コマンド |
|--------------------------|----------|
| nvm の確認              | `nvm --version` |
| nvm のインストール       | `curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh` |
| Node.js 14.x のインストール | `nvm install 14 && nvm use 14` |
| Node.js のバージョン確認 | `node -v` |
| Node.js 14.x をデフォルトに設定 | `nvm alias default 14` |
| Yarn のエラー修正       | `yarn install --check-files` |
| Webpacker のリセット    | `rails webpacker:clobber && rails webpacker:install` |
| Rails サーバー起動       | `rails s` |

---

## 学んだこと
M1/M2のMacでは、Node.js のバージョン管理 (`nvm`) や Webpacker の設定に問題が発生しやすいらしいです。
初学者なので、エラーになると、本当に本当に焦ります。
引き続き、学習を続けて行きます。
【Rails入門】MVC解説 🚀


## はじめに

今回、**RailsにおけるMVC（Model-View-Controller）** の仕組みについて学びました。
Railsを使ったアプリケーション開発では、このMVCの概念を理解することが非常に重要です。
本記事では、MVCの基礎から、リクエストの流れ、ルーティング、コントローラー、モデル、ビューの役割についてまとめていきます

---

## 📌 MVCとは？

MVCとは、アプリケーションの構造を **Model（モデル）・View（ビュー）・Controller（コントローラー）** の3つに分ける設計パターンのことです。

| 要素       | 役割 |
|------------|--------------------------------------------------|
| **Model（モデル）** | データを管理し、データベースとのやり取りを担当 |
| **View（ビュー）**  | ユーザーに表示されるインターフェース（HTML, CSS）|
| **Controller（コントローラー）** | リクエストを受け取り、モデルとビューを繋ぐ役割 |


---

## 📌 リクエストとレスポンスの流れ

1. ユーザーが **ブラウザ** からURLを指定してアクセス（リクエスト）
2. リクエストが **Webサーバー** に送信される
3. WebサーバーがリクエストをRailsアプリケーションに渡す
4. Railsアプリ内で **ルーティング → コントローラー → モデル → ビュー** の順で処理
5. ビューで作成されたHTMLをコントローラーがブラウザへ返す（レスポンス）

この流れを理解しておくと、Railsのコードを実際に書いたときに仕組みが分かりやすくなるのです。

---

## 📌 ルーティングとコントローラー

### 🔹 ルーティング（Routing）とは？

ユーザーからのリクエストは **URL** として届きます。このURLを元に、どの**コントローラー**のどの**アクション**を実行するのかを決めるのが **ルーティング** です。

Railsでは、ルーティングは `config/routes.rb` に記述されます。

```ruby
Rails.application.routes.draw do
  get 'articles', to: 'articles#index'  # 「/articles」へのリクエストはArticlesControllerのindexアクションへ
end
```

### 🔹 コントローラー（Controller）とは？

コントローラーは、**リクエストを受け取って処理し、モデルやビューと連携する** 役割を持ちます。

例えば、`articles_controller.rb` の `index` アクションを見てみます。

```ruby
class ArticlesController < ApplicationController
  def index
    @articles = Article.all  # モデルを使ってデータを取得
  end
end
```

このコードでは、`Article.all` を使って **データベースから記事一覧を取得** し、それを `@articles` に格納しています。

---

## 📌 モデル（Model）

Railsでは、データベースとのやり取りを行うのが**モデル**です。

例えば、記事のデータを管理する `Article` モデルがある場合、次のようにデータを取得できます。

```ruby
class Article < ApplicationRecord
end

# 記事一覧を取得
Article.all
```

モデルを介してデータベースとやり取りを行い、データの取得・保存・更新・削除を管理します。

---

## 📌 ビュー（View）

ビューは、ユーザーに表示される **HTML部分** を担当します。

例えば、`app/views/articles/index.html.erb` というビューを作成し、`index` アクションから取得した `@articles` を表示できます。

```erb
<h1>記事一覧</h1>
<ul>
  <% @articles.each do |article| %>
    <li><%= article.title %></li>
  <% end %>
</ul>
```

ビューに `@articles` を渡すことで、記事一覧をHTMLとして表示できるようになります。

---

## 📌 まとめ

✅ **MVCとは？** → Model（データ）、View（UI）、Controller（処理）で構成される設計パターン  
✅ **リクエストとレスポンスの流れ** → ユーザーのリクエストがルーティングを経由して処理され、ビューでHTMLが生成される  
✅ **ルーティングとコントローラー** → ルーティングでどのコントローラーのアクションを実行するか決定  
✅ **モデルの役割** → データベースとやり取りし、データの取得・保存を管理  
✅ **ビューの役割** → 取得したデータをHTMLとしてユーザーに表示  

---

初学者のため、間違えていたらすいません。
引き続き、学習を続けていきます。
AtCoder Beginner Contest 319 E - Bus Stops の周期の求め方

# 1.問題

https://atcoder.jp/contests/abc319/tasks/abc319_e

# 2.この記事を書こうと思った理由
問題の結論から述べると、開始時刻を $L := \text{lcm}(P_{1}, P_{2}, ..., P_{N-1})$ で割った余りで分類したらよいです。要するに、$0, 1, ..., L-1$  それぞれについて、その値を出発時刻とした場合の、移動の所要時間を求められたらよいです。確かに周期は $\text{lcm}(P_{1}, P_{2}, ..., P_{N-1})$ になりそうだな～という感じはしますが、きちんと説明するとなると個人的に難しく感じましたし、公式解説を読んでみても、分かりやすく説明しているというより正当性の証明という感じで理解が難しかったので、自分の中で咀嚼し、理解した過程を残そうと思い、備忘録としてこの記事を書きました。

# 3. 思考の流れ
時刻とありますが、一旦開始から到着にかかる時間 $T$ だけを考えます。$T = バスまたは徒歩による移動時間 + 待ち時間$ です。前者は一定であるため、後者の待ち時間について考えてみましょう。

バス停 $i$ では（時刻 $t_{i}$ に到着したとして）、待ち時間（厳密には、バス停 $i$ に到着してから次のバスが来るまでの時間）を $W_{i}$ とすると、$W_{i} = (P_{i}-r) \text{%}  P_{i}$（ただし、$r=t_{i}\text{%}P_{i}$）となります。よって、**バス停 $i$ における待ち時間は $r$ のみによって決定する**ことが分かりました。これは全てのバス停について言えることなので、$T$ にも（出発時刻による）周期性があるはず、という予測が立ちます。ここまでは当たり前のことを述べただけで、次からが本題です。
まず、$i=1$ について考えます。出発時刻を $L$ だけ遅らせた場合を考えます（なぜかというと、$L$ だけ遅らせたときの $T$ の値が $L$ だけ遅らせなかった場合のそれと一致した場合、待ち時間は $L$ の周期があると言えるからです。）。到着時刻は $t_{1}'=t_{1}+L$ だから、待ち時間は $W_{1}'
=(P_{1}-t_{1}'\text{%}P_{1})\text{%}P_{1}
=(P_{1}-(t_{1}+L)\text{%}P_{1})\text{%}P_{1}$ となります。$W_{1}=W_{1}'$、つまり $(P_{1}-t_{1}\text{%}P_{1})\text{%}P_{1}=(P_{1}-(t_{1}+L)\text{%}P_{1})\text{%}P_{1}$ が成り立つための必要十分条件は、$L\text{%}P_{1}=0$ ということが分かりました。この条件が満たされているとき、（当たり前ですが）$i=1$ のときの待ち時間は、出発時刻を $L$ 遅らせる前と全く変わりません。よって、$i=2$ における到着時刻は、単に $L$ を足しただけの $t_{2}+L$ になります。$i=1$ の時と全く同様の議論から、$W_{2}=W_{2}'$ となるための必要十分条件は $L\text{%}P_{2}=0$ となります。

これを繰り返していくと、全ての $i$ で待ち時間が変わらないための必要十分条件は $L\text{%}P_{1}=0 \ かつ \ L\text{%}P_{2}=0 \ かつ \ ... かつ \ L\text{%}P_{N-1}=0$、すなわち（$P_{1},P_{2},...,P_{N-1}$ のいずれでも割り切ることができる最小の自然数であるから）$L=\text{lcm}(P_{1},P_{2},...,P_{N-1})$ となります。以上の説明が、周期を導出する流れとなります。

# 4.終わりに
読んでいただきありがとうございました。誤りや説明が足りない部分などがあれば教えていただけると幸いです。
Rails 超初学者がPostgreSQL設定手順を学びました

# Rails 超初学者の PostgreSQL 設定手順

## はじめに

初めまして。
私は、子育て中の現役看護師です。
絶賛エンジニア転職を目指し、Ruby on Rails を勉強しています。
アウトプットのために、PostgreSQLの設定方法を調べながら試してみたので、その手順をまとめました。

---

## 環境

- **PostgreSQL** 14.15 (Homebrew)
- **Ruby** 2.7.7
- **Rails** 6.0.6.1

---

## PostgreSQL のインストール

### Mac (Homebrew) の場合

```sh
brew install postgresql@14
brew services start postgresql@14
```

### インストール確認

```sh
psql -U postgres -l
```

---

## PostgreSQL の初期設定

PostgreSQL の管理ユーザー `postgres` のパスワードを設定します。

```sh
psql -U postgres
```

```sql
ALTER USER postgres WITH PASSWORD 'your_password';
\q  -- 終了
```

---

## Rails アプリの PostgreSQL 設定

### Gemfile の修正

`sqlite3` を `pg` に変更します。

```ruby
gem 'pg'
```

その後、Gem をインストール。

```sh
bundle install
```

### `config/database.yml` の修正

```yaml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: your_username
  password: your_password
  host: your_host

development:
  <<: *default
  database: your_development_db

test:
  <<: *default
  database: your_test_db
```

---

## データベースの作成

```sh
rails db:create
rails db:migrate
```

### データベースが作成されたか確認

```sh
psql -U postgres -l
```

---

## 動作確認

Rails サーバーを起動し、動作を確認します。

```sh
rails s
```

ブラウザで [http://localhost:3000](http://localhost:3000) にアクセスし、
正常に動作すれば完了です。

---

## まとめ

- ✅ PostgreSQL のインストール
- ✅ `postgres` ユーザーの設定
- ✅ `database.yml` の修正
- ✅ データベースの作成 & マイグレーション
- ✅ Rails の起動と動作確認

もし間違いや改善点があればコメントで教えてください。
今後も学習のアウトプットとして投稿を続けていきたいと思います。
どうぞ、よろしくお願いいたします。
FactoryBotで、特定の属性の値が異なる大量のテストデータを作りたい

## はじめに
RSpec などのテストで多数のレコードを作りたいとき、FactoryBot の create_list や build_list を使うとまとめて生成できて便利です。たとえば 100 件のレコードをまとめて作りたい場合は、次のように書きます。

```ruby
create_list(:food, 100)
```

これで Food のレコードが 100 件作成・保存されます。ただし、もし 「レコードごとに別の値をセットしたい」 という場合はどうでしょうか？

たとえば、消費期限 (expiration_date) を 1 日ずつずらした 100 件のレコードを作りたい場合、次のように create_list にブロックを渡してみたくなるかもしれません。

```ruby
create_list(:food, 100) do |food, i|
  food.expiration_date = Date.today + i
end
```
しかし、設定したはずのexpiration_dateを見てみると…

```ruby
Food.pluck(:expiration_date)
# => [nil, nil, nil,,,,,]
```

せっかくブロックで expiration_date を設定したのにも関わらず、（初期値を設定していないこともあり）全てnilになってしまいます。この理由は create_list の挙動にあります。

## create_list の挙動
create_list(:food, 100) の内部処理は、ざっくり以下のような流れです。

1. food オブジェクトを FactoryBot で build（生成）
1. food を save（DB 保存）
1. ブロックが渡されていれば、その 作成済みオブジェクト をブロックに渡す
1. ブロック内でオブジェクトを変更しても、追加の save は実行されない

つまり、「レコードが保存されてからブロックが呼ばれる」 ため、ブロック内で属性を設定しても、その変更はデータベースに反映されません。
これを回避するには、ブロックの中で明示的に save! する必要があります。

```ruby
create_list(:food, 100) do |food, i|
  food.expiration_date = Date.today + i
  food.save!  # ここで再度セーブしないとDBに反映されない
end
```

この方法であれば、それぞれ異なる expiration_date を持つ 100 件のレコードを作れます。ただし、1 つのオブジェクトに対して 2 回 save を行うことになり非効率です。

## build_list + save! で作る場合
先述の問題を解決するには、以下のようにbulid_listを使うと良いです。

```ruby
build_list(:food, 100) do |food, i|
  food.expiration_date = Date.today + i
  food.save!
end
```

この書き方なら「生成 → 保存」の流れが素直になりますが、saveが100回走るため、SQL の発行回数も 100 回になります。テストデータがもっと膨大になると、パフォーマンスに悪影響を及ぼしかねません。

## バルクインサート（insert_all）でまとめて保存する

大量データを扱う場合は、まとめて保存できる バルクインサート を利用する方法があります。
Rails 6 以降なら、insert_all を使ってまとめて挿入できます。

```ruby
foods = build_list(:food, 100) do |food, i|
  food.expiration_date = Date.today + i
end

Food.insert_all(foods.map(&:attributes))
```

これなら、SQL の発行は 1 回 で済むため、大量のテストデータを高速に作成できます。
ただし、insert_all はレコードのコールバックやバリデーションは通らないという点に注意が必要です。厳密にコールバックやバリデーションを通す必要があるなら、この方法は使わずに従来の save をするなどの工夫が要ります。

## まとめ

- create_list にブロックを渡すと、オブジェクトは一度保存された後でブロックが呼ばれる
→ ブロック内で変更した属性がデータベースに反映されない
- 強引にブロック内で再度 save! すれば反映されるが、1 オブジェクトにつき 2 回保存することになる
- そもそも一括で属性を変えて保存したいだけなら build_list + save! の方が直感的
- 大量データや性能重視の場合は build_list でオブジェクトを作ってから、insert_all で一度に保存すると高速

## 参考文献

- [https://github.com/thoughtbot/factory_bot/issues/1444](https://github.com/thoughtbot/factory_bot/issues/1444)
- [https://qiita.com/ham0215/items/dad6f5d3d63bd498d999](https://qiita.com/ham0215/items/dad6f5d3d63bd498d999)
- [https://dev.to/hernamvel/the-optimal-way-to-create-a-set-of-records-with-factorybot-createlist-factorybot-buildlist-1j64](https://dev.to/hernamvel/the-optimal-way-to-create-a-set-of-records-with-factorybot-createlist-factorybot-buildlist-1j64)
情報試験の知識垂れ流し_応用情報午前

# テクノロジ系
ド理系の技術的な分野。

## ビックエンディアン、リトルエンディアン
そのまま記載がビックエンディアン。下位ビットから格納するのがリトルエンディアン。
ガリバー旅行記が由来らしい。
パケットでは、IPアドレスなどのネットワークバイトオーダーが対象？他のデータ部分には適用されない概念らしい。
また、バイナリデータのただの文字列として解釈される箇所にはビックエンディアンやリトルエンディアンは関係ない。IPアドレスなど、ネットワークバイトオーダーと呼ばれるデータにのみ関係する概念らしい。
パケット内にあるexample.comを表す16進数などは文字列として扱われ、ビックエンディアンなど関係なしに、そのまま順番通りに記載されるらしい

## CPI


## 数学問題
手計算を5回ほどすればひらめくパターンが多い。
これは2の10乗が1024とパッと浮かべば、2の-10乗は0.001くらいだなとひらめく。
https://www.ap-siken.com/kakomon/28_aki/q2.html

## AI
過学習：
試験データを過剰に学びすぎて、応用が利かなくなる現象。
過剰適合ともいうが、こちらの方が直感的。
例えば犬と猫の画像をAIに学習させた際、犬の画像は屋外、猫は屋内のパターンが多いと本試験で屋内の犬を猫と誤判定してしまうケースがある。これが過学習。
https://www.ap-siken.com/kakomon/04_aki/q4.html

ディープラーニング
人間の脳のように多層で学習
https://www.ap-siken.com/kakomon/06_haru/q3.html









# マネジメント系
ISMSだのリスク管理だのそういう系

## グラフ系
パレード図
『8(パ)れー2(two)図』
パレートさんが考えた。｢全体の8割の事象は上位2割が占めている｣という考えからできた。
棒グラフと比率の折れ線グラフで成り立つ。
呼称の件数と割合を知るのに有効



















# ストラテジ系（経営戦略とか）
ストラテジとは戦略・方針という意味。

### 損益分岐点
```math
\displaylines{
\dfrac{固定費}{1-\dfrac{変動費}{売上}}  \\\\
売り上げ総利益=売上 - 変動費 - 固定費
}
```
丸暗記は難しい。
まず売り上げは分かりやすい。単純に100円のものが100個売れたら売上は1万円である。
しかし1万円丸々儲けというわけではない。1つ作るのに材料費が60円かかっていたとする。
すると100円のものが1個売れても6割の60円、100個売れても6割の6000円がマイナスとなる。
つまり、まるで消費税率の如く、売上に対し一定の割合（例では6割＝60％ = 0.6）が必ず変動費率として掛かり、マイナスになる。
変動費率は、単純に売上を変動費で割ればいい。
ここから固定費の話。
変動費はものを作る以上、何をどうしても掛かってしまう。
100個売っても6000円は絶対に引かれ、残りの4000円から固定費を払うこととなる。
しかし固定費は変動費と異なり努力で抑えられる。極論、太い実家で家賃も払わず、1人で作れば材料費など以外の費用（固定費）は0円なのだ。
避けられない変動費を引き、その他の固定費が0だった場合、残りの4000円丸々が理論上の利益のMAX値＝限界値となる。
この利益の限界値を限界利益という。

**変動費は消費税のようなもの。必ず売上の何割という計算で引かれる。
残りの40%が丸々利益になるのが理想！これが利益のMAX値＝限界値だから、この40%を限界利益率という。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/b318ee87-a561-4e87-90fb-d9f5317cee89.png)

しかし現実は甘くない。この40％から更に固定費が引かれる。（家賃や人件費などがそれにあたる。）
仮に家賃が4000円かかるボロ部屋で作成していたら、売上の内訳はこうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/4357b750-d31b-4157-8a08-0683f696cf68.png)

限界利益が、丸々固定費になってしまい、利益は0に……でも赤字は避けれた。
あと1円でも売上があれば利益が発生していましたが、逆に1円でも売り上げが下回っていれば、限界利益で固定費を払いきれないので赤字。この時の売上が損をするか利益が発生するかの分かれ道。つまり損益分岐点です。
<font color="red">**限界利益が固定費と同額になると、その時の売上が損も利益も0になる分岐点となる訳です**</font>
この日本語をそのまま式にすると、

```math
\displaylines{
固定費 \quad =\quad  損益分岐点となる売上 × 限界利益率\\\\
損益分岐点となる売上 \quad =\quad \dfrac{固定費}{限界利益率}\\\\
損益分岐点となる売上 \quad =\quad \dfrac{固定費}{1-変動費率}\\\\
損益分岐点となる売上 \quad =\quad \dfrac{固定費}{1-\dfrac{ある時の変動費}{ある時の売上}}\\\\
}
```
という式変形で求められていた訳ですな。
もっとも、損益分岐点となる売上の限界利益率が固定費となるという説明で、
固定費を限界利益率で割れば、大本の損益分岐点となる売上が出るか。という理解でもいいです。
map関数でのエラー

Atcoderでpythonを練習中にでたエラーについてはアウトプットのため、まとめる

[問題はこちら]()

## 修正前コード
```python:修正前コード
# mapオブジェクトをリスト化
num_list = list(map(int, input().split()))

# 1の個数をカウントして出力
print(num_list.count(1))

```

```python:入力
101
```


```python:出力
0
```

## 原因
input().split() は スペース区切りの入力をリストとして処理する。
しかし**111 のように スペースがない場合 は、リストではなく そのまま "111" という文字列 になる。**
したがって map(int, input().split()) は "111" を数値に変換しようとし、num_list = [111] となる。

つまり、111 はリスト [1, 1, 1] にはならず [111] になり、count(1) しても 0 になる。

## 修正後コード
```python:修正後コード
num_list = [int(x) for x in input()]  # 文字列を1桁ずつリスト化

print(num_list.count(1))  # 1の個数をカウント

```

```python:入力
101
```


```python:出力
2
```
xrdp接続時にリモート元のキーボードレイアウトに切り替わらない

## xrdp接続時にUK extended Windows layoutに切替わらない
/etc/Xrdp/配下にUKLayoutの設定を追加
UK layoutのキーマップIDは以下を参照
http://kbdlayout.info/
```
$ xrdp-genkeymap km-00000452.ini
$ mv km-00000452.ini km-00000411.ini
$ cp km-00000411.ini km-e0010411.ini
$ mv /etc/xrdp/km-00000411.ini /etc/xrdp/km-00000411.ini.bak
$ mv /etc/xrdp/km-e0010411.ini /etc/xrdp/km-e0010411.ini.bak
$ mv km-00000411.ini /etc/xrdp/
$ mv km-e0010411.ini /etc/xrdp/
$ sudo chown root:root /etc/xrdp/km-00000411.ini
$ sudo chown root:root /etc/xrdp/km-e0010411.ini
```
モダンJavascriptの学習記録

Typescriptを学習する中で、未学習の記法に出会ったのでJavascriptから学習しなおしました。
モダンJavascriptってやつですね。


## テンプレート文字列
``（バッククォート）の中で${}を使って変数を埋め込むことが出来る記法です。
```
const name = "hakanai";

const message = `私の名前は${name}です。`;
```

## アロー関数
const 変数 = (引数) => {処理} のように記述します。
```
const func2 = (num1, num2) => {
    return num1 + num2;
}

// 処理の記述が1行の場合
const func2 = (num1, num2) => return num1 + num2;

// 引数が1つの場合
const func2 = str => return str;

```

## 分割代入
オブジェクトや配列から値を取り出す際に中身のプロパティに名前をつけて取り出すことが出来ます。

オブジェクトの場合
```
const Profile = {
    name: hakanai,
    age: 24
};

// 従来の記法
const message2 = `私の名前は${Profile.name}です。年齢は${Profile.age}です。`;

// 分割代入
const {name, age} = Profile;
const message2 = `私の名前は${name}です。年齢は${age}です。`;

```
配列の場合
```
const Profile = ["hakanai", 24]

// 従来の記法
const message1 = `私の名前は${Profile[0]}です。年齢は${Profile[1]}です。`;

// 分割代入
const [name, age] = Profile;
const message2 = `私の名前は${name}です。年齢は${age}です。`;

```

## デフォルト値
変数にデフォルト値を設定できます。
```
const greeting = (name = "ゲスト") => console.log(`こんにちは！${name}さん！`);
```

## オブジェクトの省略記法
プロパティ名と値（変数名）が同じ場合に値を省略できます。

```
const name = "hakanai";
const age = 24;

// 従来の記法
const Profile = {
    name: name,
    age: age
};

// 省略記法
const Profile = { name, age };

```

## スプレッド構文（...）
配列の前に...を記述することで下記のようなことが出来ます。

```
// 配列の展開
const arr1 = [1, 2];
console.log(...arr1); // 出力結果：1 2

// まとめる
const arr2 = [1, 2, 3, 4, 5];
const [num1, num2, ...arr3] = arr;

console.log(num1); // 出力結果：1
console.log(num2); // 出力結果：2
console.log(arr2); // 出力結果：3 4 5

// 配列のコピー
const arr4 = [10, 20];
const arr5 = [30, 40];

const arr6 = [...arr4];
console.log(arr6); // 出力結果：[10, 20]

// 配列の結合
const arr7 = [...arr4, ...arr5];
console.log(arr7); // 出力結果：[10, 20, 30, 40]
```
以上
SQLとNoSQLの違い

# はじめに

データベースはアプリケーションやシステムの基盤となる重要な要素です。データベースを選択する際に、SQLとNoSQLという2つの主要なタイプがあります。本記事では、SQLとNoSQLの特徴や違いを詳しく解説し、それぞれの適した用途について考察します。



# SQLとは？

### 特徴
SQL（Structured Query Language）は、リレーショナルデータベースを操作するための言語であり、以下の特徴を持ちます：
- **構造化されたデータ**：データはテーブル形式で保存され、行と列で整理
- **スキーマが固定**：事前にデータ構造（スキーマ）を定義する必要
- **ACIDプロパティ**：原子性、一貫性、独立性、持続性を保証し、高いデータ整合性を提供
- **クエリの柔軟性**：複雑なクエリが可能で、大規模なデータ処理に適性

### 主な技術
- MySQL
- PostgreSQL
- Oracle Database
- Microsoft SQL Server


# NoSQLとは？

### 特徴
NoSQL（Not Only SQL）は、非リレーショナルデータベースであり、以下の特徴を持ちます：
- **非構造化データ**：固定スキーマが不要で、動的にデータ構造を変更
- **柔軟なデータモデル**：ドキュメント指向、キー値ストア、グラフ型など、さまざまな形式でデータを保存可能
- **水平スケーリング**：サーバーを追加することで負荷分散が可能
- **最終的な整合性**：一時的な不整合を許容しながらも、高可用性を重視

### 主な技術
- MongoDB
- Redis
- Cassandra
- Neo4j



# SQLとNoSQLの主な違い

| 特徴                   | SQL                                   | NoSQL                                 |
|------------------------|---------------------------------------|---------------------------------------|
| **データ構造**          | リレーショナル（テーブル形式）         | 非リレーショナル（ドキュメント、キー値など） |
| **スキーマ**            | 固定スキーマ                          | スキーマレス                          |
| **スケーリング**         | 垂直スケーリング（CPUやRAMの増強）     | 水平スケーリング（サーバー追加）       |
| **整合性**              | ACIDプロパティ保証                    | 最終的な整合性（Eventually Consistent）|
| **適した用途**          | トランザクション処理、多様なクエリ     | ビッグデータ、IoT、大量かつ単純なデータ|


# 適した用途

### SQLが適している場面
1. データ整合性が重要な場合（例：銀行システム）
2. 複雑なクエリが必要な場合（例：分析ツール）
3. 既存システムとの互換性が求められる場合

### NoSQLが適している場面
1. 大量かつ急速に変化するデータを扱う場合（例：SNSログ）
2. スケーラビリティが重要な場合（例：IoTプラットフォーム）
3. 非構造化データや柔軟性が求められる場合（例：画像・動画ストレージ）



# まとめ

SQLは高い整合性と複雑なクエリ処理に優れており、従来型のアプリケーションに適しています。一方でNoSQLは柔軟性とスケーラビリティに優れ、大量の非構造化データを扱う現代的なアプリケーションに適しています。プロジェクトの要件や規模に応じて適切なタイプを選択することが成功への鍵となります。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
Microserviceの環境変数にAWS Secrets Managerのシークレット情報を設定する方法

# Microserviceの環境変数にAWS Secrets Managerのシークレット情報を設定する方法

## はじめに
Microserviceアーキテクチャでは、各サービスが独自の環境変数を持つことが一般的です。これらの環境変数には、APIキーやデータベースの認証情報などの機密情報が含まれることがあります。AWS Secrets Managerを使用して、これらの機密情報を安全に管理し、環境変数として設定する方法を解説します。

## 手順

### 1. AWS Secrets Managerでシークレットを作成
まず、AWS Secrets Managerでシークレットを作成します。

1. AWSコンソールにログインし、Secrets Managerに移動します。
2. 「シークレットの作成」をクリックします。
3. 「その他のシークレットタイプ」を選択し、キーと値のペアを追加します。
4. シークレットに分かりやすい名前を付けます（例：`example-secret`）。
5. 「シークレットの作成」をクリックして完了します。

### 2. IAMロールの設定
次に、KubernetesがAWS Secrets ManagerにアクセスできるようにIAMロールを設定します。

1. IAMコンソールに移動し、ポリシーを作成します。
2. 以下のポリシーを使用して、Secrets Managerへのアクセスを許可します：

    ```json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "secretsmanager:GetSecretValue",
          "Resource": "arn:aws:secretsmanager:<region>:<account-id>:secret:example-secret"
        }
      ]
    }
    ```

3. IAMロールを作成し、上記のポリシーをアタッチします。

### 3. KubernetesにExternalSecretを設定
次に、Kubernetesに`ExternalSecret`リソースを設定します。

1. `ExternalSecret`のマニフェストファイルを作成します：

    ```yaml
    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
      name: example-external-secret
      namespace: default
    spec:
      refreshInterval: "15s"
      secretStoreRef:
        name: aws-secretsmanager
        kind: SecretStore
      target:
        name: example-secrets
      data:
        - secretKey: aws_s3_accesskeyid
          remoteRef:
            key: example-secret
            property: AWS_S3_AccessKeyId
    ```

2. このマニフェストを適用して、`ExternalSecret`を作成します。

### 4. Deploymentで環境変数を設定
最後に、Deploymentで環境変数を設定します。

1. `Deployment`のマニフェストファイルを作成します：

    ```yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-deployment
    spec:
      template:
        spec:
          containers:
            - name: example-container
              env:
                - name: FILE_AWSOSS_ACCESSKEYID
                  valueFrom:
                    secretKeyRef:
                      name: example-secrets
                      key: aws_s3_accesskeyid
    ```

2. このマニフェストを適用して、Deploymentを作成します。

### 5. GitLab CI/CDパイプラインの設定
GitLab CI/CDを使用して、デプロイメントを自動化します。

1. `.gitlab-ci.yml`ファイルを作成し、以下の内容を追加します：

    ```yaml
    stages:
      - deploy

    deploy:
      stage: deploy
      script:
        - kubectl apply -f external-secret.yaml
        - kubectl apply -f deployment.yaml
      only:
        - main
    ```

2. `external-secret.yaml`と`deployment.yaml`ファイルをリポジトリに追加し、GitLabにプッシュします。

## ExternalSecretの自動生成機能
`External Secrets Operator`は、外部のシークレット管理システム（例えば、AWS Secrets Manager）から情報を取得し、自動的にKubernetesの`Secret`リソースとして注入する機能を持っています。これにより、`ExternalSecret`が適切に設定されていれば、`SecretStore`や`Secret`リソースを手動で作成する必要はなく、`External Secrets Operator`がこれらのリソースを自動的に管理してくれます。

## まとめ
以上の手順により、AWS Secrets Managerからシークレットを取得し、Microserviceの環境変数として設定することができます。これにより、機密情報を安全に管理し、アプリケーションのセキュリティを向上させることができます。

## 参考
[1](https://external-secrets.io/latest/): [External Secrets Operator Documentation](https://external-secrets.io/latest/)
NLP2025+Workshopの面白かった発表メモ

# はじめに
NLP2025にリモートで参加していました。
記憶の新しいうちに個人的に面白かった発表をメモします。
全体からピックアップしたというよりは、育児の合間に自分が聞けた発表のなかから選んでいる感じです。ご了承ください。

正確な情報は元の予稿をご参照ください。ただ雑メモとはいえ、明らかな間違いや不適切な解釈があれば直したいと思いますので、コメントいただけますと幸いです。

# [A5-4: プロンプトに基づくテキスト埋め込みのタスクによる冗長性の違い](https://www.anlp.jp/proceedings/annual_meeting/2025/pdf_dir/A5-4.pdf)

どんなタスクのときに埋め込みの次元削減ができるか、またそのような埋め込みには等方性の観点でどのような特徴があるかを調べた。分類やクラスタリングでは次元削減が可能で、そのようなタスクの埋め込みは冗長性が高い、つまり、複数の次元で同じような役割になっていることがわかった。

次元削減できるので実用的だし、次元削減できるかどうかがタスクによるという着眼点も面白く、冗長性と絡めた議論もワクワクした。クラスタリングや分類では情報をあまり使わないから冗長性が高く次元削減できるが、検索ではベクトルの次元を目一杯使っており次元削減できない、みたいなイメージを持った。納得感あるし面白い。

# [B6-5 法令文の可読性向上のための定義規定・略称規定における文型定義及びパターンベースの正式名称・略称抽出手法](https://www.anlp.jp/proceedings/annual_meeting/2025/pdf_dir/B6-5.pdf)
法令文に含まれる定義と略称の対応を解析できるルールベースのパーサーを開発した。

例：新型インフルエンザ等対策の推進を図るため、内閣に、新型インフルエンザ等対策推進会議（以下「会議」という。）を置く。

「トイウ形」「トハ形」「ヲイウ形」などいくつかのパターンにわけ、パターンごとにルールを見つけていく感じ。法令文みたいに、プログラム言語ほど厳密ではないが、ある程度決まった形式で書かれている文章に対するコスパの良い解決策はやっぱりルールだと思う。大変な作業だけどちゃんとやっている感じが好き。総務省の方が質問されていて、困ったことあったら協力します的なやりとりがあったのも熱くてよかった。

# [C7-2 音声・音響・音楽を扱うオープン基盤モデルの構築に向けたデータセット策定](https://nlp2025nagasaki.slack.com/archives/C08EJ8U00GH/p1740276741375019)

音声系の基盤モデル構築に使えそうなデータセット情報を収集し、チャネル数やサンプリング周波数、ライセンスなど基本的な情報を整理した。また、収集されたデータの統計値を算出し報告した。

正月返上で作業されたとおっしゃっていて、大変ありがたい。音声系の基盤モデルを作るときに便利そう。

# [P7-9 人間と LLM の "面白さ" の感性は一致するのか？](https://www.anlp.jp/proceedings/annual_meeting/2025/pdf_dir/P7-9.pdf)
大喜利サイトから収集した回答とLLMが生成した回答をLLMと人間にそれぞれ評価させ、相関を分析。LLMが人間のユーモアを評価する能力は高くない。GPTはClaudeより多少マシ。

ユーモアの研究に興味があるので。面白さの研究は丁寧な主観評価が分野全体で蓄積されていくことが大事だと思っているので、ありがたい研究。

# [D8-6 日本語Full-duplex音声対話システムの試作](https://www.anlp.jp/proceedings/annual_meeting/2025/pdf_dir/D8-6.pdf)
デモ公開時にSNSでも話題になっていたJ-Moshiの開発の報告。Moshiのアーキテクチャに基づいて日本語音声で学習。モノラル音声を話者分離でステレオにしたデータで事前学習。自然なターン庭訓を含むステレオ音声でファインチューニング、テキスト対話をTTSで音声対話化したデータで更に学習。主観評価とパープレキシティなどで評価。

Moshiのアーキテクチャも詳しく知らなかったので勉強になった。モノラルを話者分離でステレオにする、TTSでデータ拡張するなど、細かいところのやり方が勉強になった。

# [C9-4 VDocRAG: 視覚的文書に対する検索拡張生成](https://www.anlp.jp/proceedings/annual_meeting/2025/pdf_dir/C9-4.pdf)

画像を直接理解するタイプのRAG用LVLMの開発。検索用（VDocRetriever）と生成用（VDocGenerator）の２つのモデルからなる。両方とも事前学習はOCRテキストと画像で対象学習。VDocRetrieverは質問と画像のペアでファインチューニング。VDocGeneratorは学習済みVDocRetrieverで検索した結果と質問文を入力して、回答を次単語予測。

視覚系のRAGシステムの作り方が勉強になる。

# [ws3 招待講演 日本語の作文および対話性能向上のための合成データ生成と大規模言語モデル「Tanuki」の構築](https://jedworkshop.github.io/JLR2025/materials/b-1.pdf)
Tanukiの開発の試行錯誤に関する報告。論文を信じての実装から始まり、それだと全然うまくいかなくて、とにかくたくさん試行錯誤した内容を共有してくれて、ありがたかった。勉強になった。

# [ws3 C-1 日本語ModernBERTの構築](https://jedworkshop.github.io/JLR2025/materials/c-1.pdf)
ModernBERTの日本語版の開発の報告。ModernBERTのポイントの説明から始まり、どのように学習したか、評価など、面白かった。BERTでもパラメータ数のスケーリングがきくとか分類タスクに関しては両側から情報を使う分、次単語予測よりも効率がいいとかいろいろおもしろかった。

# おわりに
他にもメモを残しておきたい発表や、発表は聞けていないけれど読んで内容理解したい予稿がたくさんあるのですが、今終わらせないと振り返りの時間が数日取れなくて記憶とやる気が薄れそうなので、ここで区切りにします。
Undefined constant 'PHP_EOL'

MacOS Sequoia 15.3.1
VScode version: 1.98.1 (Universal)
PHP 8.4.5

# VScodeでアラートが出ています
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2295479/d0bf46f4-0aab-459d-bcf4-c75c501ee246.jpeg" alt="alert">

とあるphpファイルを触ったら、
Undefined constant 'PHP_EOL'と表示されています。
非常に怒られている感じです。
これは何でしょうか。

###### PHP_EOLとは

PHP_EOL は、PHPにあらかじめ定義されている定数の一つ。
コード内で直接改行コードを記述する代わりに PHP_EOL を使用することで、異なる環境でも正しく改行が行われるようになる。

###### Undefined constant 'PHP_EOL' とは
PHPのコード内で PHP_EOL という定数が定義されていない状態で
使用されていることを意味します。


###### どうして怒られるの
PHPの設定でこの定数が有効になっていない可能性あり。
もしくはコード内で PHP_EOL を誤って記述している。
..身に覚えがない..

# PHP Intelephense は関係ない？

#### PHP Intelephenseとは：
コードの解析や補完、エラー検出などを行うための拡張機能で、先日インストールしたばかり。
インストール後からアラートが出るようになった。
これが悪さしているのではないか。

https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client

#### ユーザー設定を開く
* Windows/Linux: Ctrl + Shift + P
* macOS: Cmd + Shift + P
基本設定: ユーザー設定を開く を選択し、settings.jsonを開く。

検索ボックスに intelephense と入力
下記2箇所でみつかるも、どっちをどう直すのか？

#### １箇所め
```言語:settings.json
"[php]": {
"editor.defaultFormatter": "bmewburn.vscode-intelephense-client"
},
```

これは.php ファイルを開いたときのデフォルトのフォーマッター（コードの整形ツール）を PHP Intelephense に設定するもの。
コードの自動整形に関する設定であり、今回のPHP_EOL アラートとは直接関係ない。

#### ２箇所め

```言語:settings.json
"intelephense.stubs": ["wordpress"]
```
この設定は、PHP Intelephense がコード解析に使用するスタブファイル(PHPの組み込み関数や定数の定義ファイル)を定義するもの。
今回の PHP_EOL アラートは、PHP Intelephense が PHP_EOL を未定義の定数として検出したのか。

>PHP_EOLはPHPの組み込み定数であるため、coreというスタブファイルにも定義されている。

→それを追記すれば良いんですかね。

#### 以下のように書き換えてみる
```言語:settings.json
"intelephense.stubs": ["wordpress", "Core"]
```
>スタブファイル名は大文字小文字を区別する。

調べるとこの上記のように出てきますが、Cは大文字です。

settings.jsonを上書きすると、VScodeの再起動でアラートが消えました。
これにより、PHP Intelephense は WordPress 関連の関数や定数だけでなく、PHPの組込み関数や定数も認識できるようになったようです。

以上です。

参考：
VSCode 拡張機能「PHP Intelephense」の使い方、間違ってました…
https://qiita.com/falya128/items/70e854ae7ca71567820b  
直接関係なかったようですが勉強になりました。