OmniAICreator/Qiita-1.07M huggingface dataset:
YOLOv10の論文をChatGPTと読んでみた。

2024/5/23にarxivにてYOLOv10爆誕。

https://arxiv.org/abs/2405.14458

YOLOv10について先にまとめてくださっている方はいますが、自分でも読んでいきたいと思います。(Architectureが知りたいので、3. Methodologyまで)

https://qiita.com/Maki-HamarukiLab/items/c63d2fc65876ab0a5244

せっかくなのでChatGPTにpdfを読ませて各章を要約して教えてもらう作戦を取ろうと思います。

## Abstract
過去数年間、リアルタイム物体検出分野でYOLOは、計算コストと検出性能の効果的なバランスにより、主流のパラダイムとして登場しました。

しかし、ポストプロセッシングにおける非最大抑制（NMS）への依存がエンドツーエンドの展開を妨げ、推論遅延に悪影響を与えています。

この研究では、YOLOの性能と効率の境界を推し進めるため、NMS不要の訓練と効率と精度を重視したモデル設計戦略を導入しました。

その結果、YOLOv10はさまざまなモデルスケールで最先端の性能と効率を実現しています。

---
これまでのYOLOはNMSに依存している。
そのせいでEnd-to-Endにもできないし、推論遅延も発生する。

どうやら、
NMSによる後処理を不要にした → End-to-End
と言っているようですね。


## 1. Introduction
「序論」の章では、リアルタイム物体検出の重要性と、その分野におけるCNNベースの物体検出器の進化に焦点を当てています。

特にYOLOシリーズがその効率と性能のバランスにより人気を博している点が強調されています。

しかし、非最大抑制（NMS）に依存する現行のプロセスには問題があり、エンドツーエンドでの展開や推論速度の最適化が困難であることが指摘されています。

さらに、モデルアーキテクチャの設計にも改善の余地があると述べられています。

これに対処するため、新たなNMS不要のトレーニング手法と効率と精度を重視したモデル設計戦略が提案されています。

---
リアルタイムでのObject Detectionは常に議題に上がるもので様々なシーンで使用されている。

YOLOは性能と効率のバランスが良い。

YOLOはモデルの推論＋NMSで構成されるが、これまでのものはどちらも改善の余地がある。

他のモデルについての言及もあるが、2. Related Workで見る。


## 2. Related Work
「関連研究」の章では、リアルタイム物体検出器とエンドツーエンド物体検出器について議論しています。

リアルタイム物体検出器では、検出速度と精度のバランスが重要であり、YOLOシリーズの各進化がどのようにこれを改善してきたかが示されています。

エンドツーエンド物体検出器では、モデルが直接的に入力から検出結果を出力するまでのプロセスを最適化し、中間ステップを減らすことが強調されています。

これらのアプローチが全体的な効率と性能向上にどう貢献しているかが概説されています。

---
重要なところは何も教えてくれなかった気がしますが、YOLOの発展と他のEnd-to-Endモデルについて言及されているようですね。


## 3. Methodology


### 3.1 Consistent Dual Assignments for NLM-free Training
「NMS-free TrainingのためのConsistent Dual Assignments」のセクションでは、YOLOv10の訓練において非最大抑制（NMS）を必要としない新しい手法が紹介されています。

この手法は、デュアルラベル割り当てと一貫性のあるマッチング指標を使用し、訓練中に豊富な教師情報をモデルに提供することで、推論時にNMSを排除します。

これにより、高い効率と競争力のあるパフォーマンスが同時に実現されます。

---

![fig2](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*zolmgF6QKY9cdwDePiT9pA.png)

Dualということで2つのヘッドを用意します。
1. **One-to-many Head**：1つの物体に対して複数の候補を出力させ、学習時に複数の教師を与える
1. **One-to-one Head**：1つの物体に対し最適な1つの候補を出力するヘッドで、推論高速化に寄与

学習時は2つのヘッドを使う。
推論時はOne-to-one Headのみを使う。
推論時は最適な候補が1つ返ってくるので、NMSの必要性がなくなり不要になる。

また、Consistent Matching Metricと呼ばれるものを導入し、2つのヘッドの整合性を取っている。

### 3.2 Holistic Efficiency-Accuracy Driven Model Design
「Holistic Efficiency-Accuracy Driven Model Design」のセクションでは、YOLOv10のモデル設計戦略が紹介されています。

この戦略は、効率と精度のバランスを最適化することを目指しています。

具体的には、軽量な分類ヘッド、空間的・チャネル的に分離したダウンサンプリング、ランクガイド付きブロック設計など、計算効率の高いアーキテクチャを提案しています。

さらに、大きなカーネルを持つ畳み込みと部分的自己注意モジュールを導入することで、モデルの能力を高め、性能を向上させています。

これにより、低コストで高性能なリアルタイムエンドツーエンド物体検出器を実現しています。

---

この項目は思っていたよりもChatGPT先生が教えてくれました。
詳細は理解していないですが、やっていることはなんとなくわかったので良しとします。

![fig 1](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*ycQewXnIe3B4R_u1JEN-Qw.png)
COCOデータセットでの評価実験で良い感じです。

## まとめ
今回はYOLOv10の論文をChatGPT先生の力を借りながらArchitectureを知るところまで読んでみました。

YOLOv10では2つのヘッドを使用し(推論時は1つ)、NMSの削除に成功している。

また、各構成要素の見直しもして、精度と速度の観点から最適化を行っている(モデルを小さくできている)。

そのおかげでEnd-to-EndかつReal timeでの推論を実現した！
といった感じでしょうか。

## 参考

https://qiita.com/Maki-HamarukiLab/items/c63d2fc65876ab0a5244

https://medium.com/@batuhansenerr/yolov10-custom-object-detection-bd7298ddbfd3

https://note.com/nodejs/n/ndc9906767dc5
YOLOv8

## YOLOv8って？
YOLOv8は、YOLOv5の公開元であるUltralytics社が公開しているモデルです。

Object Detection以外にもSegmentation, Classification等のタスクで利用可能。

YOLOv8の論文は未公開と思われる。(出ていないですよね？)

## YOLOv8 Architecture
以下の記事を参考に記載する。

https://blog.roboflow.com/whats-new-in-yolov8/#yolov8-architecture-a-deep-dive

![architecture](https://cdn-ak.f.st-hatena.com/images/fotolife/y/yasaka_uta/20230327/20230327171002.jpg)

### Anchor Free Detection
YOLOv8 はアンカーフリーモデルです。
すなわち、既知のアンカーボックスからのオフセットではなく、オブジェクトの中心を直接予測します。
![anchor free](https://blog.roboflow.com/content/images/2024/04/image-1806.webp)
↑YOLOのアンカーボックス

アンカー ボックスは、ターゲット ベンチマークのボックスの分布を表すことはあっても、カスタム データセットの分布を表すことはできないため、以前の YOLO モデルでは非常に扱いにくい部分でした。
![yolov5 head](https://blog.roboflow.com/content/images/size/w1000/2024/04/image-1812.webp)
↑YOLOv5の検出ヘッド

アンカーフリー検出によりボックス予測の数が削減され、推論後に候補検出をふるいにかける複雑な後処理ステップである非最大抑制(NMS) が高速化されます。
![yolov8 head](https://blog.roboflow.com/content/images/2024/04/image-1816.webp)
↑YOLOv8の検出ヘッド

### New Convolutions
最初の6x6 conv は 3x3 に置き換えられ、メインの構成要素が変更され、C3がC2fに置き換えられました。モジュールは下の図にまとめられています。ここで、「f」は特徴の数、「e」は拡張率、 CBS はConv + BatchNorm + SiLUで構成されるブロックです。

C2f では、 Bottleneck（残差接続を持つ 2 つの 3x3 conv の別名）からのすべての出力が連結されます。
一方、C3 では最後の Bottleneck の出力のみが使用されました。

![new c2f](https://blog.roboflow.com/content/images/2024/04/image-1822.webp)
↑新しいYOLOv8C2fモジュール

Bottleneck は YOLOv5と同じですが、最初のconvのカーネルサイズが 1x1 から 3x3 に変更されました。
この情報から、YOLOv8は2015年に定義されたResNet blockに戻り始めていることがわかります。

ネックでは、特徴が直接連結に同じチャネル次元を強制されません。
これにより、パラメータ数とテンソルの全体的なサイズが削減されます。

### Closing the Mosaic Augmentation

### YOLOv5からYOLOv8への変更点
大きな変更は以下の2つと思われる：
* C2f Layerの導入
* Decoupled head導入とobjectness branchの削除

## Ultralytics YOLOv8 Tasks
![tasks](https://raw.githubusercontent.com/ultralytics/assets/main/im/banner-tasks.png)
YOLOv8は以下のタスクを実行可能。

* Classification
* Object Detection
* Segmentation
* Tracking
* Pose Estimation

Object Detection以外のタスクも行えるが、いったいどんな構成にして可能にしているのか？
※調べる気力がなかったので今回はここで終わり

## 参考

https://github.com/ultralytics/ultralytics/blob/main/docs/en/tasks/index.md

https://tech.revcomm.co.jp/yolov8-introduction

https://blog.roboflow.com/whats-new-in-yolov8/
【Mac】目指せ爆速コーディング。キーボードショートカットを覚える＆キー配列をカスタマイズする

私はこれまでキーボードでの操作を積極的にしてきませんでした…。
それはそんなことをしても何も変わらないと思っていたからです。

:::note
ただ、キーボードのショートカットとキー配列のカスタマイズすることでキーボードのホームポジションから指を動かすことなく作業ができるので効率が良いことに気がつきました！
:::

本記事ではキーボードショートカットとキー配列のカスタマイズについて紹介します！

## キーボードショートカット
紹介するショートカットはカーソルの移動や文字の削除に関するショートカットです！

:::note warn
ショートカットはMacでの操作になるのでご留意ください…。
:::

### ショートカット一覧
ショートカットは移動型と削除型合わせて9つ紹介します！

#### カーソル移動
| ショートカット | |
|--|--|
|`control + F`|1つ右に移動|
|`control + B`|1つ左に移動|
|`control + P`|1つ上に移動|
|`control + N`|1つ下に移動|
|`control + A`|分頭に移動|
|`control + E`|分末に移動|

#### 文字削除
| ショートカット ||
|--|--|
|`control + H`|1つ左の文字を削除|
|`control + D`|1つ右の文字を削除|
|`control + K`|カーソルから右側を削除|

:::note
ちなみに日本語入力確定前に`control + K`を入力すると文字が全てカタカナに変換されるので覚えておくと便利です！
:::

## キーボードの配列をカスタマイズする
キーボード配列をカスタマイズするソフトウェアを使ってキーボードの配列をカスタマイズします！

:::note
個人的には一気にキー配列を変えると混乱するので1つか2つほど変えて慣れたら次、もしくは調整する。という段取りでやるのがいいのではと考えています！
:::

### キー配列のカスタマイズにはKarabinerを利用する

https://karabiner-elements.pqrs.org/

キー配列は「Karabiner」というソフトを利用します。
MacBookのキーボードはもちろん、外付けのキーボードの設定も可能です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/75965588-687b-2d51-8cbd-010a73703d67.png)

設定したいキーボードを選択すると後は「Add item」からキーの対応を選択するだけです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/0c190d1b-0014-9266-7220-6fb82a4a61af.png)

### 現在のカスタマイズを紹介
私は現在2つ設定しています。
`caps lock`を`control`にすることでホームポジションを崩すことなく文字の削除、カーソルの移動ができるようになるのでこの設定にしています！

左下の「fn」は何にしようか迷っているのですが、今のところマークダウンのコード記述やJavaScriptのテンプレートリテラル構文を記述するために「`（バッククォート）」を設定しています！

## まとめ
正直賛否あるとは思います。
まだまだ、慣れていないので打ち間違いや思わず右上の「delete」のキーを押してしまう状態です…。

:::note
ただ、ホームポジションから手が離れないことによって作業効率が上がることを実感しつつあります！
:::

マウスや矢印キーを使えば良くない？という反論もあるかと思います…。

:::note
小さくてもその積み重ねが1分や1時間という時間を生み出すことにつながると思います！
:::

もっとスムーズにキーボードで操作できるように引き続き精進します！
そんなの生ぬるい！これが最高峰！っていう神設定があれば是非コメントください！
新入社員研修を1日担当した話

## はじめに

2024/6/11、弊社オーイーシーの新入社員研修講師を務めました

昨年度は半日だったのですが、今年は1日に拡大してもらいました

## 研修内容

私は「DX 推進部」という、社内でも新しめのことをやっている部署に所属しています

新入社員がこれからどこに配属されるかはまだ決まっていない状態でしたが、どこに行くにしても、ある程度トレンドを押さえておくに越したことはありません

そんなわけで、 Stack Overflow の Developer Survey を軸として、流行りの技術を見ていく構成にしました

https://survey.stackoverflow.co/2023/

2023年の調査なので必ずしも最新ではありませんが

![スクリーンショット 2024-06-24 18.45.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d126123f-3e15-b7c5-83c0-3301d71eb576.png)

ゴール設定はこんな感じ

![スクリーンショット 2024-06-24 18.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/52b69787-90b7-4017-efef-062ebbb8d702.png)

アイスブレイクとしてフェルミ推定をやってもらいました

![スクリーンショット 2024-06-24 19.07.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/bf7c59aa-673e-c876-12e0-f81ea835099b.png)

Markdown の練習兼アウトプットの練習のため、 Qiita に記事投稿

![スクリーンショット 2024-06-24 18.53.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/37f754f6-e842-d8da-963e-5ae45b616d4c.png)

タイトル背景や下画像の猫アイコンなど、画像は DALL-E 3 に作ってもらいました

![スクリーンショット 2024-06-24 18.55.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7dc36532-59ef-e3ec-ebee-7e4b01310892.png)

クイズやハンズオンを随所に挟み、できるだけ眠くならないように

![スクリーンショット 2024-06-24 18.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/46695879-c287-5510-d0c2-532b5deb5d45.png)

![スクリーンショット 2024-06-24 18.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c5af46f9-94e6-4f8e-171f-2f5de2a3316f.png)

![スクリーンショット 2024-06-24 18.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/59af49b4-4954-4956-6eff-f681abbad06f.png)

各セクションの前後にアンケートを実施し、「できなかったことができるようになった」を明確化

![スクリーンショット 2024-06-24 19.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f7645586-419f-aa3c-1035-fd75b6a1768a.png)

コミュニティの紹介も

![スクリーンショット 2024-06-25 8.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e52c75a5-24aa-a2e2-bd1a-bca9a3065582.png)

![スクリーンショット 2024-06-25 8.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/71f4c4b8-f785-652c-5342-39e9cba60e7c.png)

![スクリーンショット 2024-06-25 8.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6896332e-cd54-6bfa-1b12-ec0fab7a9266.png)

## アウトプット

最後に課題として Qiita 記事を投稿してもらいました

![スクリーンショット 2024-06-24 19.05.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d1f6f38a-4a98-faab-43e5-32b4c0ec26ae.png)

実際に投稿された記事はこちらから確認できます

https://qiita.com/organizations/oec/items

## 感想

Stack Overflow の Developer Survey は単純に眺めているだけでも面白いので、題材としては良かったと思います

Google Colab や ChatGPT など、ハンズオンの時間では各自が Playful に色々試してくれていて、講師としても面白い1日でした

これから配属はそれぞれ分かれますが、この日の研修が何かの役に立つことを祈っています
SASでフォルダ作成

## 背景
SASでデータセットを作成して実験を繰り返しながら機械学習モデルを開発する際に、バージョンごとに毎回フォルダをエクスプローラーでポチポチ作成するのが面倒なので、マクロで自動作成したい。
このとき、ver指定を更新し忘れた場合に、既存のフォルダが新規で作成され上書きされるのを回避したい。

## 作成したいフォルダ
```
dev
 ├─ input 　　　・・・ 元データを格納、ここはバージョンによらず共通
 └─ ver   　　　・・・ 開発用のバージョン
     ├─ log 　　・・・ ログファイルの格納用
     ├─ process ・・・ 中間データセットの格納用
     └─ output　・・・ 機械学習モデルに読み込ませるCSVの格納用
```
作成したいのは上記のようなイメージで、verとその配下のフォルダを作成するマクロを組みたい。

## 作成したマクロ
```sas
/*--- バージョン設定 ---*/
%let ver = v01;
/*------------------*/

libname dev "開発の起点となるフォルダのパス";

/* フォルダ作成のマクロ */
%macro create_folders(ver);
	%let check_folder_path = %sysfunc(pathname(dev))\&ver.;
	%if	%sysfunc(fileexist(&check_folder_path.)) %then %do;
		%put フォルダはすでに存在します;
	%end;
	%else %do;
		%let d1 = %sysfunc(dcreate(&ver., %sysfunc(pathname(dev))));
		%let d2 = %sysfunc(dcreate(log, %sysfunc(pathname(dev))\&ver.));
		%let d3 = %sysfunc(dcreate(process, %sysfunc(pathname(dev))\&ver.));
		%let d4 = %sysfunc(dcreate(output, %sysfunc(pathname(dev))\&ver.));
		%put フォルダが作成されました;
	%end;
%mend create_folders;

/* 実行 */
%create_folders(&ver.);
```
Apacheを使ってサーバーを構築した時に使ったコマンド集(備忘録)

自分が習ったコマンドを整理できておらず、毎回調べて時間をロスしているという課題を解決すべく、ジャンル毎にコマンドをまとめるようにしてみました。
記念すべき第一回目のコマンド集は、Apacheを使ってサーバーを構築した時に使ったコマンドです。
どんどん追加予定！

## 動作環境
ConoHa VPS、Ubuntu 20.04.6

## Apacheのコマンド
### サイト毎の設定ファイルを有効化
```console
sudo a2ensite hoge.conf
```
### サイト毎の設定ファイルを無効化
```console
sudo a2ensite hoge.conf
```
### 設定を変更した後に反映
```console
systemctl reload apache2
```

## ファイヤーウォール系
### 今のファイアウォールの状態を確認
```console
sudo ufw status
```

###　ファイヤーウォールにポートを許可
```console
sudo ufw allow https
```
### ファイヤーウォール変更後に設定を反映
```console
sudo ufw reload 
```
## ssh系
### sshdの再起動
```console
sudo systemctl restart sshd
```

## IPアドレス系
### 自身のIPアドレスを確認
```console
ip a
```
AWS Certified Machine Learning - Specialtyの有効期限を更新した話

# はじめに

AWS認定は、有効期限が３年までとなっています。

https://aws.amazon.com/jp/certification/recertification/

有効期限を延長するためには、現行の本試験を再度受験して合格せねばなりません。

AWS Certified Machine Learning - Specialty
は、試験バージョンのバージョンアップがあり、
+ MLS-C01 
のバージョンでした。

差分で感じたこと、出来事、など、メモ書きしておきます。

# スコア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/78198e51-699f-5410-1ba5-9a8d80eefa2e.png)


+ 確信をもって回答できる問題回答していく。（３分以上悩みそう＆２～３回設問を読み返しそうはフラグをつけて飛ばすんですが、基本、１週目は、悩みつつも全回答つけれました。）・・・１時間弱
+ サーっと見直しながらジックリ読もう、危ういと思ったものをチェックをつける・・・３０分
+ 見直し・・・１０～２０分

位の時間感覚で、ギリギリのギリまで見直してたり、あれこれ悩んだりといった事はしませんでした。

:::note warn
 **初回受験は注意**
プロフェッショナル＆スペシャリティは、設問の文章が飛躍的に長くなります。
一定の受験慣れができるまでは、見直し時間を確保するのも難しいかもしれません。
:::

# 受験対策

## 公式模擬試験

https://explore.skillbuilder.aws/learn/course/12525/play/111562/aws-certified-machine-learning-specialty-official-practice-question-set-mls-c01-japanese-v2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/2e0e263f-39aa-7f68-03bd-bbcec4f0bf83.png)

前回受験から、今回受験の差分という所で、以前はAWS公式模擬試験が有料だったの **無料** になってます。
しかも有料なのに点数しか分からず、正答がなんだったのか分からず仕舞いだったのですが、無料な上に正答と解説もついてるので、受験前の腕試しに受験しておくと良いと思います。

今回は受験直前に模試を受けて、何個かミスしたので満点取れるように復習し直しました。

## AWS Web問題集で学習しよう

https://techstock.jp/

の問題集が、私の感想としては有用でした。
他の認定を受ける際には、

https://www.whizlabs.com/

や

https://www.udemy.com/ja/

も活用しています。

## 抑えておいた方が良いサービス（と一言ポイントメモ）

+ AWS Elastic Inference
GPUの性能を最大限に引き出す。とかコストメリットの恩恵がある。の類の出題があったと思います。

+ 学習モデルのあれこれ
どのモデルが何に向いてる？は確実に選択できるようになっておきましょう。

+ 過学習（オーバーフィッティング）のときの対処
「正規化する」「特徴を減らす」など、過学習（オーバーフィッティング）を無くすのに、どうしたら良いか？を確実に抑えること（また、その逆は？）

# まとめ
AWSというよりは、数学の問題のようなのが混じるので、他の認定試験とは一線を画す認定だと思います。
文系／理系で、取りやすさや感覚的な難しさが変わりそう。

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
フリーランスエンジニアとなって経済的自由を得る方法（2.現状把握と生活防衛費）

こんにちは！毎日お仕事お疲れ様です。
今回は経済的自由を得る方法の各論「2．現状把握と生活防衛費」について説明します。

# そんなことより早く単価増やす方法を知りたいって？

適切な収支の管理ができてないと、<b>売上が増えても出ていくお金ばかり増えて</b>経済的自由は近づいてきません。さらに投資で必要となる<b>「握力」</b>をつけるためにも収支管理はとても大事です。

むしろ売上を増やす前に徹底した収支管理を行うことが資産形成で一番大事になります。なのでこの項目は最重要！心して取り組みましょう。

# 目次
　　　[1.支出の把握](#1支出の把握)
　　　[2.適正な支出を把握する](#2適正な支出を把握する)
　　　[3.生活防衛費（緊急予備資金）を意地でも貯める](#3生活防衛費を意地でも貯める)



# 1.支出の把握
 資産形成の最初のステップは、「<b>家計簿をつける</b>」です。
 
自分が今、何にどれだけ使っているかを把握することが大事です。家計簿をつけておくことで次のステップの適切な支出額が見えてきます。適切な支出額が見えることで自分の資産形成の道筋が見えてくるという流れになります。

収支管理を行うに当たっては、有名なYoutubeチャンネルのリベラルアーツ大学のこの記事が特に参考になると思います。

https://liberaluni.com/household-account-book

(上記では家計管理と呼んでいます。ここでは収支管理と同じ意味と捉えて貰ってOKです)

　現状把握のポイントとしては、
　　・電子マネーと連携できる家計簿ソフト（MoneyFoward MEなど）を導入する
　　・支出が把握しやすいように、支払いをソフトが対応している電子マネーに統一する（クレカやIDなど）
  　・資産が把握できるように必要最低限の証券・銀行口座・クレジットカード以外は解約する
   という流れになります
大部分の支払いを自動的に家計簿につけることにより、手間をかけずに確実に家計簿をつけることができます。まずは１～２か月掛けてMoneyFowardで家計簿をつけることが最初のステップです。
※無料版だと連携数に問題があるので、どうしても無料で管理したい方はMoneryTreeというソフトがあります。こちらはより多くの口座連携が可能ですが、使いこなそうとすると有料版が必要となります。(私はMoneyFowardで管理しています。)

家計管理の効果は凄まじいので月500円程度の支出は十分元が取れます。慣れたらどこかで有料版に切り替えて家計管理を完成させることを特にオススメします。というより資産形成に必須です。

# 2.適正な支出を把握する

現状把握ができたら、次は適切な支出を把握します。
前述のリベラルアーツ大学では手取りの80％といっていますが、経済的自由を目指すには70％以下を目標としたいです。

70%以下でやりくりしてそこから節税・節約・単価アップの実現で生活費の60%程度で生活できるようになると、貯金0からでも10年やそこらで経済的自由の見通しが見えてくることが可能です。

具体例としては、単価70万経費10万/月≒所得720万/年≒実質手取り570万程度の60％で生活なら230万円/年の貯金が可能です。年利6%運用なら10年で3,000万円も溜まります。15年なら5300万円となります。これはサイドFIREが現実的になる金額です。

月30万円弱で生活が無理だ！って人はその分長い年数を働くか、単価80万以上を目指す必要があります。(単価80万/月超えると1人 or DINKSならFIREは十分目指せます)

資産形成の速度を確かめたい方は下記サイトで実際にどれぐらいの資産形成が出来るか計算できます。

https://keisan.casio.jp/exec/system/1428890934

ただ、無理な節約は頑張っても不可能なので、仕組みで節約をする必要を考えないといけません。ダイエットと同じで「頑張る」だけだとうまく行かないことが多いです。
これは次の記事で記述します。

また、支出は年間レベルで考える必要があります。急な出費や将来予定される支出（家の更新費用や大型家電の購入など）は毎月分割して残った金額で毎月の予算を組む必要があります。家計管理については上記リベラルアーツ大学の記事がかなり丁寧に解説されているので、そちらを参考にするのが良いです。

# 3.生活防衛費（緊急予備資金）を意地でも貯める
# 3.生活防衛費（緊急予備資金）を意地でも貯める
# 3.生活防衛費を意地でも貯める

手取りの70％までは無理としても、収支を把握して黒字にできるようにはなるかと思います。(そうでないと生活できてない)

そうしたら、1年分の生活費を意地でも貯めます。1年分と言っても最低限の生活が維持できる分でOKです。月20万なら240万円、月30万円なら360万円を<b>現金</b>で貯蓄します。
(もしカーローンやキャッシングなど借金がある方は最優先で返済してください。毎月の返済は想像以上に精神的な影響が大きいです)

これは入院時や大不況による長期失業時など、緊急時に使用するためのお金です。生活防衛費や緊急予備資金と呼びます。

投資に回したい欲を全力で我慢して貯めることが大事です。
生活防衛費の役割は非常に多岐にわたります。
1. 就労不能保険・失業保険・労災保険の代わりとなる
2. 投資で必要な握力の源泉となる
3. 単価交渉力の源泉となる

生活防衛費が溜まっていない状態で投資をしても含み損に耐え切れずすぐに損切りしたり、失業の不安から適正より安い単価で契約したり、その後の単価交渉で弱気になってしまうリスクがあります。

一見遠回りに見えますが、生活防衛資金は資産形成の土台として非常に大事な資産となります。

---

お疲れさまでした。
ここまで出来れば筋肉質な収支管理が可能となっており、投資や単価交渉の準備が整ったことになります。

収支の把握や予算管理は非常に手間ですが、頑張ってやるだけの価値はあります。
次の記事は節約に関する内容ですが、並行して投資や単価に関する記事に進んでもOKです。

また1～2週間程度で次の記事をアップします。

次は収支に直結する節約や節税に関する内容になります。
Rustのeditionについて


今年は2024年。そう、3年に一度のRustのeditionが新しく設定される年である。
このeditionとは何かについて解説する。

# edtionとは？

Rustには、ほかの言語と同じようにバージョンがある。
一般的にバージョンは、コンパイラだったり、標準ライブラリだったり、パッケージマネージャが発展するにつれて上がっていくものである。
だが、ほかの言語でこんな覚えはないだろうか？
言語のバージョンが上がった時に後方互換性が切れて移行作業が大変だったりとか。
一部のライブラリは新しいバージョンでコンパイルできるが、一部はできなかったりとか。
この機能は欲しいが、この互換性がきれるとこまるとか。

Rustは、少なくとも公式のツールにおいては、後方互換性を非常に大事にしている。
だがしかし、言語とライブラリの発展のなかで後方互換性のせいで、発展が止まってしまうことがある。
これを解消するために、editionというものが導入されている。

Rustのバージョンは、6週間に一回、マイナーバージョンが上がっていくようになっている。
このバージョンでは破壊的変更を(ほとんど)含まない変更で、コンパイラとライブラリに新しい機能が追加されていく。
では破壊的変更いれたいときにどうするかというとeditonを分けるのである。

コンパイラの挙動や、標準ライブラリなどの変更を新しいedition側だけにいれ、古いeditionで動くコードはそのままの状態になる。これによって破壊的変更を防いでいる。
edition側に破壊的変更がふくまれているので、バージョンを上げてもコンパイルエラーになにくい。
また、crateごとにeditionが指定されているので、依存先のcrateが新しいeditionに対応しないからといって、
自分のeditionがあげられないということは起きない。

またeditionの移行時にはツールが提供される。`cargo fix`を用いることで機械的に移行対応の修正をすることができるようになっている。

# どう設定するか

Cargo.tomlにあるeditionの値が反映される

```toml
[package]
name = "sample-crate"
version = "0.1.0"
edition = "2021" # ここがeditionの値
```
【未経験】英単語を英語で学ぶサービスを制作しました【ポートフォリオ】

# はじめに
英単語を英語で学ぶサービスを制作しました。
制作期間は約1ヶ月です。

## サービス概要
英単語とその意味を音声を聞きながら学ぶことができるサービスです。
サービス名は「P.E.Dictionary」です。P.EはPassive Englishの略です。
![スクリーンショット 2024-06-24 17.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822878/ce118fdc-bf27-ba08-7662-fbff858fe217.png)

**ゲストログイン**ができます。
暗記カードのように英単語を**登録することができます**。
- URL:https://pedictionary.com/
- GitHubリポジトリ:https://github.com/tastukitamagawa/portfolio.git

## 制作のきっかけ
英会話の学習法を模索しているときに、イマージョン・ラーニングという学習法に出会い、それが理に適っている方法だと感じたので英語で英語を学ぶサービスを開発してみたいと思ったからです。
（イマージョン・ラーニングとは、英語でラジオを聞いてみたり英語字幕で英語音声のドラマ・映画を見てみたりなど英語だけの環境で学ぶことを言います。）

# サービスの使い方
## ログイン
ユーザー登録してログイン、もしくはゲストとしてログインします。
![スクリーンショット 2024-06-24 18.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822878/97cfbbbd-a912-c41e-3856-f4f75968b1e1.png)

## 英単語を登録する
登録するのは英単語だけで大丈夫！
意味は自動で登録されます。（※確実に意味が登録できる保証はありません。）
![スクリーンショット 2024-06-24 18.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822878/5369150a-9840-b9aa-1cbe-085db3bffd8c.png)

## 登録内容の修正
登録内容を変えることも可能です。
![スクリーンショット 2024-06-24 18.19.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822878/be631891-2e4f-b1a0-69af-360afa132869.png)

## 自動読み上げ機能を使用する
再生ボタンを押すと登録した英単語とその意味の音声が流れます。
![スクリーンショット 2024-06-24 18.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822878/e74f0dac-2f7d-e716-e12e-5d480a887d52.png)

# 使用技術
- Laravel 11.9.2
- HTML
- CSS
- JavaScript
- Docker
- nginx 1.22.1
- AWS（VPC・EC2・RDS・Route53・Certificate Manager）
- Words API（英単語から意味を取得）
- Text-to-Speeh API（テキスト読み上げ）

# ER図
dbdiagram.ioを使用して作成しました。
![er.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822878/8f5c6a12-a4b5-b3c8-9213-1e1d00fb8835.png)

# おわりに
初めてLaravelを使った制作だったので予想以上に制作に時間がかかってしまいました。ただ、LaravelだけでなくDockerの環境構築やAWSのデプロイも行えたので有益な経験になりました。

Words APIを使用したことで単語を登録するだけで英単語を自動的に登録できるので時短かつネイティブな表現で学べる仕様にしました。Text-to-Speech APIの導入が一番苦労しましたが、音声でも学べられるようにしました。ただ、ブラウザのポリシーにより音声の自動再生ができず、一度ユーザーがクリックイベントを行わないと音声が流れない仕様になってしまったのは非常に残念です。

今回は英単語に特化したサービスを制作をしましたが、リスニングやスピーキングの学習ができるサービスも制作してみたいです。
オブジェクトが持つ任意のキーに対する値を配列に入れ込みたい

# はじめに

よくあるやつだと思いますが、備忘録としてまとめておきたいと思います。


# やりたいこと

下記のようなオブジェクトをフロントで受け取った際、
```view_data = ['12345678', '87654321']```のようにdata_idsを配列に入れ込みたい。

```jsx
 allowed_data = [
    {
        "id": "1",
        "data_ids": [
            "12345678"
        ]
    },
    {
        "id": "2",
        "data_ids": [
            "12345678",
            "87654321"
        ]
    },
    {
        "id": "3"
    },
    {
        "id": "4",
        "data_ids": [
            "12345678"
        ]
    }
]
```

# 手順① .map

.mapを使ってオブジェクトが持つ各要素(id)毎にdata_idsを取得します。

```jsx
allowed_data.map((d) => d.data_ids)
```

```jsx
[
    [
        "12345678"
    ],
    [
        "12345678",
        "87654321"
    ],
    undefined,
    [
        "12345678"
    ]
]
```

配列の各要素を見てみると、更に配列になっている要素がありますね。
重複している要素も排除したいです。


# 手順② ...new Setと.flat

...new Setで重複を排除し、.flatで一次元配列に変換しましょう。

```jsx
[...new Set(allowed_data.map((d) => d.data_ids).flat())]
```

するとこのようになります。

```jsx
["12345678","87654321", undefined]
```

# 手順③ .filter
undefinedを排除しましょう。

```jsx
[...new Set(allowed_data.map((d) => d.data_ids).flat())].filter(v => v !== undefined) 
```

できました！

```jsx
["12345678","87654321"]
```

# おわりに
複数の言語を触っていると忘れがちになります。
awkで合計時間を計算する

~~流行りのAWKで小ネタ。~~ 探せばありそうな気もしますが...

```:時間の一覧（ラップ等）
00:02:30
00:50:00
00:15:20
01:20:40
```

```bash:合計時間を計算
$ cat time.txt | awk -F: 'BEGIN {h=0; m=0; s=0} {h+=$1; m+=$2; s+=$3} END {h+=int(m/60+s/3600); m=m%60+int(s/60); s%=60; print h":"m":"s}'
2:28:30
```

# コード

3つの部分に分かれています。

まず、`BEGIN` で変数 `h`(時), `m`(分), `s`(秒) を初期化します。このパターンはプログラム起動時に1度だけ実行されます。

```awk
BEGIN {
  h = 0;
  m = 0;
  s = 0;
}
```

次に、各行で読み込んだ時間を `h`, `m`, `s` に加算します。このタイミングではまだ何も表示しません。

```awk
{
  h += $1;
  m += $2;
  s += $3;
}
```

最後に、全行の集計が終わった段階で `END` で合計時間を表示します。`m` と `s` の繰り上がりを補正してから表示しています。

```awk
END {
  h += int(m / 60 + s / 3600);
  m = m % 60 + int(s / 60);
  s %= 60;
  print h":"m":"s;
}
```
WSUSでいらない更新を消す

## WSUSでいらない更新を消す

WSUSのアップデートファイルは「未承認」にした上で
クリーンアップウィザードを動かすと消えてくれる。
ファイルが貯まってくるとなかなかのサイズになるので
自動で不要なアップデートを未承認状態にしたい。

## いらない更新とは？

様々な条件があるかもしれないけど
『置き換える更新があり、かつ、その置き換える更新が承認済みである。』
とすると以下のスクリプトで設定できる。

```powershell
function chkSupersededUpdatesApproval($update){
    if($update.IsSuperseded -eq $true){
        $supersedUpdates = $update.GetRelatedUpdates([Microsoft.UpdateServices.Administration.UpdateRelationship]::UpdatesThatSupersedeThisUpdate)
        foreach($superUpdate in $supersedUpdates){
            if($superUpdate.IsApproved -eq $true){
                #置き換え更新が承認済み
                Write-Host ('┗「'+$superUpdate.Title+'」が承認済みです')
                return $true
            }else{
                if($superUpdate.IsSuperseded -eq $true){
                    #さらに置き換える更新をチェック
                    $upperSupersedUpdates = chkSupersededUpdatesApproval($superUpdate)
                    if($upperSupersedUpdates -eq $true){
                        return $true
                    }
                }
            }
        }    
    }
    return $false
}
$WSUS = Get-WsusServer
$updates = $WSUS.GetUpdates()
$declineCnt=0
$notApprovalCnt=0
foreach($update in $updates.Where({$_.IsDeclined -ne $true -and $_.IsSuperseded -eq $true})){
    Write-Host ('「'+$update.Title+'」は置き換える更新があります。')
    #拒否されてなくて置き換える更新プログラムがある
    $chk = chkSupersededUpdatesApproval($update)
    if($chk -eq $true){
        #$update.Decline()
        Write-Host ('＠「'+$update.Title+'」を拒否しました。')
        $declineCnt++
    }else{
        Write-Host '！置き換える更新が未承認です'
        $notApprovalCnt++
    }
}
Write-Host ($declineCnt.ToString()+'個の更新を拒否しました')
Write-Host ($notApprovalCnt.ToString()+'個の更新は置き換える更新が承認されていません')
```

## 例
WSUSのクリーンアップウィザードのチェックを全て入れて実行。
そのあとすぐに実行しても、もちろん何も変わらない

![スクリーンショット 2024-06-21 161556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/7153dfd6-6eed-a16e-2c12-8eb399206b13.png)

そのあとこのクリプトを実行

![スクリーンショット 2024-06-21 162139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/9335c7d6-181d-f12e-0c87-f85894cf67f5.png)

823個の更新を未承認状態出来た。

そしてまた、クリーンアップウィザードを実行すると。

![スクリーンショット 2024-06-21 162305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/01fba792-884e-0125-3130-3b7485ff2afd.png)

152689MB(149GB)減った。

使用容量の変化はこんなん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667610/88074887-2c29-a3f2-02ef-54335df1f076.png)
圧縮の拡張子まとめ

# はじめに

データの圧縮は、ファイルのサイズを小さくし、ディスクスペースの節約やデータ転送の効率化を図るために非常に重要です。ここでは、一般的な圧縮形式とその拡張子についてまとめ、それぞれの使い分けについても解説します。

## 圧縮形式一覧

### ZIP (.zip)

- **特徴**: 最も一般的な圧縮形式で、多くのオペレーティングシステムで標準サポートされています。
- **用途**: 複数のファイルやフォルダを一つにまとめる際に便利です。
- **圧縮率**: 中程度。
- **使い分け**: Windows や macOS 環境で簡単に共有したい場合に最適です。特に、ユーザーが特定の解凍ソフトを持っていない可能性がある場合に有用です。

### RAR (.rar)

- **特徴**: RAR 形式は ZIP 形式よりも高い圧縮率を提供しますが、専用の解凍ソフトが必要です。
- **用途**: 大容量ファイルの圧縮に適しています。
- **圧縮率**: 高い。
- **使い分け**: ファイルサイズをできるだけ小さくしたい場合や、パスワード保護やエラリカバリ機能が必要な場合に適しています。

### TAR (.tar)

- **特徴**: 主に UNIX 系システムで使用される形式で、圧縮自体は行わず、複数のファイルを一つにまとめるために使用されます。
- **用途**: バックアップやアーカイブに使われます。
- **圧縮率**: 圧縮なし。
- **使い分け**: ファイル構造を保ったままアーカイブを作成したい場合に使用されます。圧縮を行う場合は GZIP や BZIP2 と組み合わせます。

### GZIP (.gz)

- **特徴**: 圧縮率が高く、主に TAR と組み合わせて使用されます。
- **用途**: UNIX 系システムでのファイル圧縮。
- **圧縮率**: 高い。
- **使い分け**: TAR ファイルと組み合わせて使用し、ファイルの圧縮とアーカイブを同時に行いたい場合に適しています。

### BZIP2 (.bz2)

- **特徴**: GZIP よりもさらに高い圧縮率を提供しますが、圧縮速度が遅いです。
- **用途**: 高い圧縮率が求められる場合に使用されます。
- **圧縮率**: 非常に高い。
- **使い分け**: 圧縮率を優先する場合に適していますが、速度が犠牲になることに留意が必要です。大規模なデータのアーカイブに適しています。

### 7Z (.7z)

- **特徴**: 7-Zip というオープンソースの圧縮ソフトウェアによって作成される形式で、高い圧縮率を提供します。
- **用途**: 大容量ファイルの圧縮やアーカイブ。
- **圧縮率**: 非常に高い。
- **使い分け**: 高い圧縮率が必要な場合や、特定の解凍ソフト（7-Zip）が利用可能な環境での使用に適しています。

### LZMA (.lzma)

- **特徴**: 高圧縮率と高速な解凍速度を特徴とする圧縮形式です。
- **用途**: ソフトウェアの配布や大規模なデータセットの圧縮に使用されます。
- **圧縮率**: 非常に高い。
- **使い分け**: 高い圧縮率と解凍速度が必要な場合に最適です。ソフトウェアの配布パッケージなどに適しています。

### XZ (.xz)

- **特徴**: LZMA 形式の改良版で、さらに高い圧縮率と効率を提供します。
- **用途**: UNIX 系システムでの高圧縮率が必要な場合。
- **圧縮率**: 非常に高い。
- **使い分け**: UNIX 系システムで、高圧縮率を必要とする場合に適しています。特に大規模なログファイルやバックアップデータの圧縮に有効です。

## まとめ

さまざまな圧縮形式とその特徴を理解することで、目的に応じた最適な圧縮方法を選択することができます。一般的な使用では ZIP が多く利用されますが、特定の用途では RAR や 7Z など他の形式が適している場合もあります。圧縮形式の選択は、圧縮率、速度、互換性などを考慮して行うことが重要です。
手順書の手順書（with Markdown AI)

# 手順書の手順書（with markdownAI)

- うそよ！　こんなの、手順書になかった！　こんなことが起きるなんて！　←9割これ
- 手順書通りにしたら最後まで動きました　←めったにない

さいきん、リモートワークが浸透してきて、手順書を書く機会も使う機会も増えてきました。

作業するにつれ、自分の中で、「うれしい手順書」という理想がだんだんと育ってきたので、個人的なメモです。

- 想定レベル：
作業者は新人のアホであり、これからする作業をぜんぜんやったことはないが、**「手順書があるから大丈夫」** と言われた。
ググることはできるが基本的に及び腰であり、「手順書があるから大丈夫」という言葉を先ほどから3回繰り返している。.gitignoreを編集するだけの社内作業であり、おそらくは間違ってもさほど大きなミスにはならない（手順書を作成した人は会議中で、すぐには返事ができない）。

## まず、全体で「これから何をするのか」を説明する

```
作業の目的
●gitリポジトリの更新作業
●関係者への連絡
```

これがない場合、よくわかっていない作業者の視野は、びっくりするほど何をしているかわからない作業になります。

自分がやっている手順にフォーカスし、それが成功するか、失敗するかしか見えなくなります。

自分がいま何をしていて、どんな作業をやっているかどうかわからないといざというときに自分でリカバリーするのが難しくなるほか、助力を頼めません。

## 小さな項目ごとに、「これから何をするのか」を説明する

△ 硬直時間が発生する
```
nano .gitignore
```

〇より良い
```
# .gitignoreの編集
 nano .gitignore
```

もっと親切に言うと、「.gitignoreを編集して、無視リストに追記して不要なファイルがgitに登録されないようにします」ではありますが、そこまで親切にしなくても、とにかく「.gitignoreを編集」というワードだけでもあると助かります。

慣れている人ならnanoがエディタであることは火を見るよりも明らかですが、nanoを触ったことがない新人はおそらく炎上しています。
nanoの使い方をググりたい。そんなときでも「.gitignoreを編集するために、nanoを使う」というヒントがあればどこへ向かおうとしているのかわかります。

## 一度っきりしかやらない作業は初回と書いておく

とくにconfigの設定など、一度っきりで済むものには（初回のみ）と書いておきます。
何をしているかわからない側では判断がつかないので、ありがたいです。

## 何を使って実行するのか、環境を書く

△硬直時間が発生する
```
nano .gitignore
```

〇あると嬉しい
```
Jupyter Notebookで以下のコマンドを実行する。

# .gitignoreの編集
nano .gitignore
```

それはコマンドプロンプトでやっているのか、SSHで接続したコンソール上でやっているのか、書いている側は「わざわざ書かなくても……」というところですが、使う側からするととても大切です。

## こういう習慣をつけると、うれしい

- 試行錯誤をしている中でメモを取る

後から思い出そうとしてもダメなので、メモをする習慣をとっておくといいです。
参考のURLも添えるとより素晴らしいです。

とはいえ、夢中になってると「AがだめでBがだめでCがだめでDがうまくいった」「AかBかCのどれかが良い感じに効いた」みたいなことがでてきます。

- できれば誰かにやってもらって、フィードバックをもらう

自分以外が使用していないドキュメントというのは、校正されていない文章とおんなじです。
できる人はできるんですが、稀で、普通の人は当たり前だと思っているところでつまづきます。

たとえば、最近だとハードウェアの環境をインストールする手順書を展開したら後輩が詰まっていたのですが、そもそもPythonがインストールされていなくて、インストールする必要がありました。
（私の環境にはすでにPythonが存在していたため、意識せずスキップしていた）。

- なにか失敗したときの失敗しやすいポイントを付け加えていくと便利

アホなのでこれだけは自信があります。

- 集合知を募る

さいきんはSlackで手順をブツブツつぶやいていると、詳しい人から飛んできていい感じです。

Qiitaでも、ぽんと書いておくと訂正してもらえたりしてありがたいです。

## 終わりに

たとえ、ドキュメントを完璧に作り切ったとしても、それは永遠ではなく、UIが変わったり、手順が変わったり、メンテナンスをする必要があります。

手を入れるべきところに手を入れて、手を抜くべきところに手を抜けるといいのですが、抜いてはいけないところで手を抜くとたいへんなことになります。

こういったメモを書いておくには、マークダウン形式が便利です。
マークダウンの良いところは画像を付けられるところで、言葉にすると説明しづらいところが一発でメモできたりします。

# おまけ

これは、せっかくなのでと思って、キャンペーン中の、markdownAIのエディタを使用して書いた記事です。
そちらの使用感については後程、別の記事にまとめたいと思います。

https://mdown.ai/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/9c42535e-87d1-19ef-2050-bf36d186032a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/74410001-be7f-e2e1-94f6-2f90356355d1.png)
Union-Findでmerge(a,b)をしたときleaderになるのはaとbでどっちになるか？

# 結論
__mergeを行う前でサイズの大きい方がリーダーになります__

# 疑問に思ったこと
この記事に書かれているa,bはそれぞれの連結成分でのleaderの頂点番号とします。

https://atcoder.jp/contests/abc183/tasks/abc183_f
この問題はマージテクがメインの問題なのですが、一番最新の値を集計しているmapのデータがleaderのところに来るように実装したいです。しかしmerge(a,b)と投げると、a,bでどっちがリーダーになるのかわからないので、どこの頂点にその合成したmapのデータを保存したらいいのか？と疑問に思いました。なので調べてみました。

# コードを見てみる
ACLのコードを見てみます。https://github.com/atcoder/ac-library/blob/master/atcoder/dsu.hpp

ACLだと正直読みにくいのでおそらく似た実装をしていると思われるsnukeさんのライブラリ集のdsuを見てみます。https://github.com/atcoder/live_library/blob/master/uf.cpp

```:コードのコピペです 許可は取ってません許してくれると信じてます()
struct UnionFind {
  vector<int> d;
  UnionFind(int n=0): d(n,-1) {}
  int find(int x) {
    if (d[x] < 0) return x;
    return d[x] = find(d[x]);
  }
  bool unite(int x, int y) {
    x = find(x); y = find(y);
    if (x == y) return false;
    if (d[x] > d[y]) swap(x,y);
    d[x] += d[y];
    d[y] = x;
    return true;
  }
  bool same(int x, int y) { return find(x) == find(y);}
  int size(int x) { return -d[find(x)];}
};
```
mergeするときに何をしているか？を見てみます(ユニオンファインドの仕組みから考えた方が早いような気はしますが一応コードを載せました)。結論としては、「サイズが小さい方から辺を生やしてサイズが大きい方に繋げる」ということをしていて、つまり「サイズの小さい方が大きいやつの子孫になる」という感じです。

なので例えばmerge(a,b)とmerge(b,a)のように、引数の順番を入れ替えてもleaderになる頂点番号が変わることはなく、その連結成分のサイズによってleaderが決まるということでした。

重要なこととして、「leader同士をmergeしたときは、必ずどちらかがleaderとなる」ということがわかります。なのでもしマージテクなどでリーダーに情報を集めたいとなったときは、mergeした後のleaderが、aとbでどちらと同じか？という場合分けをするのが良いのではないかと思います。なおACLそのものユニオンファインドを使わずに、自分でライブラリとしてユニオンファインドをもっておけばmergeのコードを書き換えることでめんどくさい場合分けを防げます。mergeを書き換える系のコードは下のリンク先のコードのようになります。(snukeさんありがとう)
https://atcoder.jp/contests/abc183/submissions/18147402
G-coordinatorで3Dプリント（造形入門）

# 単純な四角形パス
平面に単純な四角形を作ってみましょう．
![](https://gcoordinator.readthedocs.io/ja/latest/_images/rectangle_path.png)

G-coordinatorでは，基本的にあらゆる造形を座標を用いて行います．
ここでは最も単純に，座標を直接手入力してみましょう．
ノズルが移動する座標は順番に以下のようになります．

```
(x, y, z) = (0,  0,  0.2),
            (10, 0,  0.2),
            (10, 10, 0.2),
            (0,  10, 0.2),
            (0,  0,  0.2)
```

ノズルが移動する座表のx座標列，y座標列，z座標列が必要なので，以下のようなコードを書きます．

```python
import gcoordinator as gc

full_object=[]

x = [0, 10, 10,  0, 0]
y = [0,  0, 10, 10, 0]
z = [0.2, 0.2, 0.2, 0.2, 0.2]
layer = gc.Path(x, y, z)

full_object.append(layer)
gc.gui_export(full_object)
```
x, y, z座標列を用いて，gc.Path()というクラスのインスタンスを作成します．
作成したlayerというインスタンスをfull_objectというリストに追加します．
これは，一般に印刷するパスは複数存在するので，それらを格納するリストです．（詳細は次章で述べます）
印刷するパスを格納したリストをGUIに渡すことで．プレビューに表示されます．


# 四角形壁の造形
ご存知の通り，3Dプリンタでは，積層をするため，パス一つでは，造形物にはなりません．先ほど作ったパスを縦に積み重ねる必要があります．
![](https://gcoordinator.readthedocs.io/ja/latest/_images/rectangle_wall.png)

for文を用いて，それぞれのパスのz座標列をパスごとに高くすればいいです．

```python
import gcoordinator as gc
full_object = []

for height in range(100):
    x = [0, 10.0, 10.0, 0, 0]
    y = [0, 0, 10.0, 10.0, 0]
    z = [(height+1)*0.2] * 5
    path = gc.Path(x, y, z)
    full_object.append(path)
gc.gui_export(full_object)
```

forループをする中でheightという変数がループごとに値が1ずつ増えていきます．
それをもちいて，z座標列では，ｘ座標列と同じ項数で値が(height+1)*0.2となる座標列を作成しています．

heightに1を足しているのは，forループで，heightの値が0からスタートしても，z座標は，0.2から始まって欲しいからです．また，0.2は，一般的なレイヤー厚さとして例に挙げています．


# 円形パスの作成
次に，円を作成してみましょう．これは，先ほどの，四角の頂点を十分大きいものにすれば実現できます．頂点の数が非常に多いので，numpyを用いて，座標列を作成します．


![circle_path.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/ea85483b-e28b-580f-7c66-6b40c685972f.png)

まずは，1レイヤーだけの円形パスの造形コードを以下に示します．

```python
import numpy as np
import gcoordinator as gc

full_object=[]

arg = np.linspace(0, 2*np.pi, 100)
x = 10 * np.cos(arg)
y = 10 * np.sin(arg)
z = np.full_like(arg, 0.2)
wall = gc.Path(x, y, z)
full_object.append(wall)

gc.gui_export(full_object)
```

argという変数で，0から2π(単位はrad)までの項数100の角度に関する等差数列を作成しています．
この角度列のcos()がx座標列，sin()がy座標列になっています．z座標列は，argと項数が同じで，値が全て0.2で初期化しています．
これらのx, y, z座標列からPathを作成し，guiにexportしています．

このコードは正確には，円を出力するコードというより，正99角形を出力するコードです．
G-codeには，G3のように弧を印刷するコマンドも存在しますが，現在のG-coordinatorではそれらに対応していないので，このように実装します．

この分割を多くすると，より円に近づき，精密な表現になりますが，その分，G-codeのデータが重たくなります．半径10mm程度の円柱であれば，100分割ほどで十分です．

# 円柱壁
前節で，作成した円を縦に積み重ねることで，円柱を作成可能です．
![](https://gcoordinator.readthedocs.io/ja/latest/_images/cylinder_wall.png)

四角柱と同様に，for分でループしながらループごとにzの値を大きくしていきます．

```python
import numpy as np
import gcoordinator as gc

full_object=[]
for height in range(100):
    arg = np.linspace(0, 2*np.pi, 100)
    x = 10 * np.cos(arg)
    y = 10 * np.sin(arg)
    z = np.full_like(arg, (height+1) * 0.2)
    wall = gc.Path(x, y, z)
    full_object.append(wall)

gc.gui_export(full_object)
```
G-coordinator で3Dプリント (入門編)

# G-coordinatorとは？

G-coordinator/gcoordiantor は，3Dプリンタ用G-code生成ソフトウェアです．

:::note info
本記事はG-coordinattor ver3系列に関するものです．過去の記事のG-coordinator ver1やver2とは互換性がありません．ご注意ください．
:::

pythonを用いて，造形や印刷条件の細かな指定が可能です．G-codeを生成するためのpythonライブラリgcoordinatorと，それをより簡単に使用するためのGUIアプリのG-coordinatorがあります．
![G-coordinator GUIアプリ](https://gcoordinator.readthedocs.io/ja/latest/_images/G-coordinator_1.png)

    gcoordinator: G-code生成のためのPythonライブラリ

    G-coordinator: G-code生成のためのGUIアプリ


GUIアプリをインストールすれば，python環境が整っていなくても，pythonコードを書いてG-codeを生成することが可能です．造形やプレビュー，G-codeの書き出しなどは，gcoordinatorのライブラリ単体でも可能です．ニーズに合わせて，ライブラリとGUIを選択してください．

ライブラリのインストールに関しては，
``pip install gcoordinator``
で可能です．

![](https://gcoordinator.readthedocs.io/ja/latest/_images/gcoordinator.png)

G-coordinator, gcoordinatorの公式ドキュメントも良いしておりますので，そちらもご覧ください．

https://gcoordinator.readthedocs.io/ja/latest/


# インストール
## G-coordinator: GUI app
以下のページからインストールが可能です．

https://github.com/tomohiron907/G-coordinator/releases/tag/v3.0.0

G-coordinatorのGUIアプリは，Mac版(.app)とWindows版(.exe)を用意しています．それぞれの圧縮ファイル(.dmg, .zip)を以下からダウンロードしてください．アプリをダウンロードすれば，python環境を整えたり，ライブラリをインストールする必要はありません．
### Mac版
Macの方は，ダウンロードしたdmgを展開して，.appにしたものをアプリケーションフォルダに移動させてください．ダウンロードしたアプリを開くと，セキュリティのブロックが出る可能性があります．
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/fd3a0d78-f741-18fc-5cb3-38bf5fdf5e12.png">

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/db62cd56-a7f7-aacf-0096-b0f96a095f46.png">


設定の中のプライバシーとセキュリティからG-coordinatorの実行を許可してください．
### Windows版
Windowsの方は，ダウンロードしたzipを展開し，その中のexeを実行してください．
Windowsもセキュリティブロックがかかる可能性があります．

<img width="500"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126722/73ab0e97-cbad-4754-f9a7-f6666f723991.jpeg">

ブロックされた画面の"詳細情報"から実行を選択してください．

### Python版
__GUIアプリをダウンロードした方は読み飛ばして問題ありません．__
GitHubからリポジトリをクローンしてください．
実行に必要なライブラリのインストールは，
`pip install -r requirements.txt`
を実行してください．
ターミナルで，
`cd src`
srcディレクトリに移動して，main.pyを実行すると，UIが起動します．

### Python ライブラリ gcoordinatorのインストール
__GUIアプリをダウンロードした方は読み飛ばして問題ありません．__

`pip install gcoordinator`をターミナルで実行して下さい．

# ソフトウェアの使用の前に
## G-codeとは
G-coordinator/gcoordinatorを使う前に，G-codeとは何かを振り返りましょう．以下の画像は，repetier でG-codeを開いたものです．

![](https://gcoordinator.readthedocs.io/ja/latest/_images/reptier.png)


基本的には， 
`G1 F800 X114.97987 Y105.63424 Z2.00000 E0.00589` 
こういった行が大量に繰り返されています． これは，現在の位置からX114.97987 Y105.63424 Z2.00000の位置まで，分速800ｍｍで移動しながら，フィラメントを0.00589mm押し出すという命令です．

基本的にはG-codeで制御すべき要素は，座標(x, y, z)の三要素とスピード，押し出し量の計５つです．

さらに，スピードと，押し出しはG-coordinator から自動で決定できる（もちろん細かく個別に指定することも可能）なので，考えるべきは，どの位置にノズルが動くかという座標のみで良いです．

## G-coordinatorでの用語
上の写真の画像のように，一つの造形物は円が縦に積層されており，その円も小さな線分の集合から成り立っています．
G-coordinatorでは，その最小単位の線分をセグメントと呼び，そのセグメントが集まった樹脂のひと繋がりをパスと呼びます．すなわち，セグメントが集まってパスになり，パスが集まって造形物になります．

## 注意点
G-coordinatorを用いるにあたり，注意点があります．G-coordinatorは，3Dプリンタの挙動を細かく制御できる利点がある一方，マシンにとって無茶な指令を与えることも可能になります．（プリントベッドの外部に移動させようとする指令など）
その点を理解した上でご使用いただくよう，お願いいたします．
Pythonで作ったExeファイルの起動時に、起動中、と表示したい

## 結論
Windows環境であれば、pyinstallerのsplashを利用することで実現できます。

（この記事を書いている2024/06/24時点で）
※公式にexperimentalの記載がありますので、試験的な機能であることをご承知おきください。
※macOSは非対応とのことです。

## 背景
Pythonで作ったExeファイルの起動時に、起動中と表示したい、と思ったものの、なかなか見つけることができなかったので、記事にしてみました。

### もう少し細かい背景
業務上、Pythonで作ったスクリプトをPyinstallerを利用してexe化して配布することが頻繁にあります。
作成したexeの起動に数秒を要し、ユーザー側で起動しているかわかりにくい状況に陥ることがありました。

## 環境
Windows 10
Python 3.11
Pyinstaller 6.4.0

## サンプルコード
以下のように、exeの時にimport pyi_splashで読み込むように指定します。
そして、起動後にpyi_splash.close()で閉じます。

```
# sample.py
import sys
import tkinter as tk

if getattr(sys, 'frozen', False):
    import pyi_splash

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.messege_label = tk.Label(self, text='hello world')
        self.messege_label.pack()

if __name__ == '__main__':
    app = App()
    if getattr(sys, 'frozen', False):
        pyi_splash.close()
    app.mainloop()
```
上記のコードを保存したら、コマンドプロンプトから以下のように入力して、exeファイルを作成します。
※splash-sample.pngはテスト用につけたファイル名です。任意のファイル名を付けてください。
```
pyinstaller sample.py --onefile --splash splash-sample.png
```

公式の情報については、以下のリンクから公式のドキュメントをご参照ください。
[Pyinstaller](https://pyinstaller.org/en/stable/index.html)
pnpmとcorepackを使ってpnpmのバージョンとNode.jsのバージョンを管理する

# はじめに
チーム開発で普段からpnpmを使っていますが、チーム内でpnpmとNode.jsのバージョンを統一して作業を進めたいと思い、できるだけ外部ツールを使わずに管理する方法を試してみました。こちらがとても便利だったので、共有いたします。

# 動作確認環境
- Node.js 20.14.0
- pnpm 9.4.0
- macOS Sonoma 14.5

# pnpmとは
pnpmは、Node.jsエコシステムのパッケージマネージャーの一つです。npmやyarnと同様に、プロジェクトの依存関係を管理するためのツールですが、pnpmはいくつかの点で独自の特徴を持っています。

1. **ディスクスペース効率**: pnpmはハードリンク機能を使用して依存関係を共有するため、ディスクスペースの使用量が大幅に減少します。同じ依存関係を持つプロジェクトが複数あった場合でも、依存パッケージは一つの場所に置かれ、ハードリンクとして各プロジェクトに参照されます。

2. **高速なインストール**: その効率的な依存関係管理とキャッシングメカニズムにより、pnpmは非常に高速にパッケージをインストールすることができます。

3. **一貫性のあるロックファイル**: pnpmは、プロジェクトの依存関係を一貫して再現可能な形で管理するためのロックファイルを生成します。これにより、チーム全員が同じ環境で開発を行うことが可能となります。

# corepackとは
Corepackは、Node.jsに組み込まれているパッケージマネージャーマネージャーです。Corepackを使用することで、npm、yarn、pnpmなどのパッケージマネージャーを簡単にインストール、ローカルに特定バージョンに固定することができます。Corepackの利点をいくつか挙げると:

1. **バージョン管理**: Corepackを使用することで、プロジェクトごとに特定のバージョンのパッケージマネージャーを指定・固定することができます。これにより、チーム全体で同じバージョンのツールを使用することが保証され、互換性の問題を避けることができます。

2. **簡単なセットアップ**: Corepackを使用すると、パッケージマネージャーのインストールやバージョン管理がシンプルになります。

3. **Node.jsとの統合**: CorepackはNode.jsにネイティブに統合されているため、追加のインストールが不要で、そのまま使用することができます。

# 設定方法
## corepackを搭載したNode.jsのインストール
corepackはNode.js v16.9.0以上で標準バンドルされているのでv16.9.0以上のNode.jsをインストールしてください。
もし、`pnpm env`コマンドを使用してNode.jsをインストールした方は別途インストールしないといけないので`brew install corepack`等でインストールしてください。

## pnpmのバージョン指定
`package.json`に`packageManager`フィールドを追加して揃えたいバージョンを指定してください。
```json:package.json
  "packageManager": "pnpm@9.4.0"
```
## corepackの有効化
corepackは最初に使う場合は、コマンドを実行して有効化する必要があります。
**※権限のエラーが出て実行できない場合は`sudo corepack enable pnpm`を実行してください。**
```bash
corepack enable pnpm
```

## pnpmのインストール
pnpmのバージョンを確認すると、以下のような表示が出るのでYまたはEnterを押すことでインストールすることができます。
```bash
pnpm -v

! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-9.4.0.tgz
? Do you want to continue? [Y/n]
```

## Node.jsのバージョン指定
Node.jsのバージョンはpnpmの`use-node-version`の設定を`.npmrc`に書くことで指定できます。

```text:.npmrc
use-node-version=20.14.0
```

# 最後に
この設定を行うことで、チーム全員が同じバージョンのpnpmとNode.jsを使用して開発を行うことができます。これにより、依存関係のインストールの際のトラブルや環境の不一致による問題を起きづらくできるはずです！
pnpmを使って開発している方はぜひ参考にしてみてください！
Terraform 環境構築

#### 環境
```
% sw_vers                                                               
ProductName:		macOS
ProductVersion:		14.5
BuildVersion:		23F79
```
<br>

#### AWS-CLIのインストール
```
% brew install awscli
% aws --version
aws-cli/2.16.9 Python/3.11.8 Darwin/23.5.0 exe/x86_64
```
<br>

#### IAMユーザー作成
AWS-CLI用ユーザー（既存ユーザーと同じであれば再利用する）
Terraform用ユーザー
<br>

#### AWS-CLI初期設定
AWS-CLI用のユーザーでアクセスキーを作成して値をメモする。
```
% aws configure
AWS Access Key ID [None]: アクセスキー ID
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
<br>

#### 認証情報にTerraformユーザー情報を追加
```
% aws configure --profile terraform
AWS Access Key ID [None]: アクセスキー ID
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
<br>

#### credentialファイル確認
```
% cat ~/user/aws/credentials
CLI用とTerraform用で２つの設定が入っていること
```
<br>

#### Terraformインストール
```
% cd ~
% git clone https://github.com/tfutils/tfenv.git .tfenv

% export PATH=$PATH:~/.packer/bin

% tfenv list-remote
% tfenv install [version]
% tfenv use[version]
% terraform version
Terraform v1.8.5
on darwin_arm64
```
<br>

#### エイリアス設定　※入れなくてもOK
```
% cd ~

% vi .zshrc
alias tf='terraform'
alias tfmt='terraform fmt -recursive'

% cat .zshrc
alias tf='terraform'
alias tfmt='terraform fmt'

読み込み
% source ~/.zshrc

動作確認
% tf version
% cd [Terraformのソースコードがある場所]
% tfmt ./ 
```
<br>
docker v26 にしたら haproxy の https化が死んだ！ - ipv6絡みでした

# httpアプリのhttps化は、haproxyが超絶便利

docker compose使ってると、複数コンテナの組み合わせだけで簡単に機能を構成出来ますよね。
http -> https のターミネーションには、 haproxy がめちゃ便利です。

以下はサンプルコードです。(https化そのものはこの記事のスコープ外としますのでまだの方、ぜひ使い方を調べてみてください。)


```docker-compose.yaml
version: '3'

services:
  haproxy:
    image: haproxy:latest
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
      - ./certs/haproxy.pem:/etc/ssl/private/haproxy.pem
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - webapp

  webapp:
    image: your_webapp_image
    ports:
      - "8080:80"
```

```haproxy.cfg
global
    log stdout format raw local0

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http-in
    bind *:80
    bind *:443 ssl crt /etc/ssl/private/haproxy.pem
    redirect scheme https code 301 if !{ ssl_fc }

    default_backend servers

backend servers
    server webapp1 webapp:80 check

```


# docker engine v26 以上に上げると動作しない？

![Screenshot 2024-06-24 at 17.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255842/5c15ed40-9378-4200-1b8f-5f0ccd46a59f.png)

無慈悲な画像ェ...

こっからそれはもうドツボにハマったのですが、まず解決策から

# tl:dr; コンテナ内のデフォルトネットワーキングが IPV6になった！
散々迷路に入りながら色々調べたのですが、haproxy コンテナ内から各コンテナへの ping が通ることを確認して、ふと localhost に ping を打ったら...

```bash
docker exec -it mai-haproxy-1 bash

root@6272410af66d:/var/lib/haproxy# ping localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.038 ms
```

えっ `(::1)` ？？？
そうです、docker engine v26の何かの変更で、haproxyコンテナ内部のネットワーキングのデフォルトが ipv6 になったようで。

僕の環境では次のように、`http` -> `https`のリダイレクトを実装していたのですが、
この `localhost:8080` の部分の通信が闇に吸われて行ってしました。

```🆖❌ haproxy.cfg
# http / https で二つのバックエンドを持つ
# 振り分けのために「このコンテナ内でのみ有効なポート」を使うループバックを二つ立ち上げる
backend http_back
mode tcp
server loopback-for-http localhost:8080

backend https_back
mode tcp
server loopback-for-https localhost:8443
```

こちらを、`localhost` -> `127.0.0.1` に置き換えると、
最新の docker v26でも動作するようになりました！

```🆗🙆‍♀ haproxy.cfg
# http / https で二つのバックエンドを持つ
# 振り分けのために「このコンテナ内でのみ有効なポート」を使うループバックを二つ立ち上げる
backend http_back
mode tcp
server loopback-for-http 127.0.0.1:8080

backend https_back
mode tcp
server loopback-for-https 127.0.0.1:8443
```


しばらく古いバージョンの docker に `apt-mark hold` して対応していたのですが、
最新環境でも動くように修正できて良かったです！

この件、気づくまでマジでどツボりましたのでどなたかの役に立てば...
🔤ChatGPTを使って英語力を向上させる方法

皆さんは最近、ChatGPTの意外な使い方を考えたことはありますか？

ChatGPT、万能すぎて使い方が無数にありますよね。私もChatGPTは長い間使っているのですが、一番役に立ちそうな使い方は見つけられていませんでした。

そんな中、私が試行錯誤して得たChatGPTの意外な使い方があります。
それは

「英語学習に役立てる」

という使い方です。

今回の記事では、私が半年ほど手を変え品を変え試してきた「ChatGPTを英語学習に役立てる」方法をまとめました。

ぜひ最後まで読んで皆さんの英語力をChatGPTと一緒にアップしてください。

:::note info
この記事の内容はChatGPT3.5と4どちらでも実践できます
:::

## ChatGPTを使って英語の語彙力UP！ (英語力アップ方法1)

ChatGPTが皆さんの英語学習の役に立てる最初の方法が英語彙力UPを手助けすることです。

具体的には、ChatGPTを使用することで自分が学びたい分野の単語帳を簡単に作成することができます。

下に表示されているプロンプト例にとってみます。　プロンプトは「英語の物理学で出てくる英単語を50厳選して例文や類義語、言い換え、そして日本語訳も含めて教えて」です。

こちらのプロンプトを実際にChatGPTに送ってみると、以下の画像のようにChatGPTが例文や類義語を含めて単語帳を作成してくれているのが分かると思います。

![スクリーンショット 2024-06-24 9.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/68d706b8-b47f-05c2-f749-e24798dbef10.png)
*ChatGPTを使用して英語で物理を学ぶための単語帳を作成してもらった*


### プロンプトカスタマイズの例
こちらは私が使用したプロンプトです。
```md
英語の物理学で出てくる英単語を50厳選して例文や類義語、言い換え、そして日本語訳も含めて教えて
```

このプロンプトだと使いにくいので、以下のプロンプトをコピーして使用すると、ChatGPTが単語帳を作成してくれます。

```markdown
〇〇で出てくる英単語を♢♢厳選して例文や類義語、言い換え、そして日本語訳も含めて教えて
```

## ChatGPTを使って英作文を添削、英語筆記能力を向上させる
次に紹介するChatGPTの活用方法は英作文の添削です。ChatGPTはかなり英語力に長けているので、英作文を添削できるような人が周りにいない場合特に役に立ちます。

:::note warn
ChatGPTが出力してくれたものは全て手書きで一文字一文字書いてください。じゃないといくら使い方を工夫しても英語力UPにはつながりません。
:::

以下のプロンプトを入れると簡単にChatGPTが添削してくれます。

`この英作文を添削してください。クライテリア一つひとつに１００点満点で点数をつけて。また変更した部分を太字にして、最後になぜその部分を変更したかも教えてください。
作文↓`

![スクリーンショット 2024-06-24 17.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/021c336d-62ac-5ccf-5cbf-c2acdcc24eaa.png)

このプロンプトを使用することでこのようにChatGPTが自分の作文を添削し、点数を付け、なぜ一部変更したのかまで教えてくれます。
実際に私はこの方法を使い、ChatGPTに添削してもらったものを一文字一文字自分でタイピングして少し英語力がつきました。と言うのも、ChatGPTは英語力がかなりあるので、自分では想像もつかない流暢な言い回しや言い換えを提案してくれたからです。

![スクリーンショット 2024-06-24 17.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/5d6cfbfa-d702-f30c-49a2-e851018c1937.png)


この手法はかなり使い勝手が良く、さらにしっかり自分で一文字一文字タイピングすれば英語のライティング能力が上昇するのでおすすめです。


## 最後に
今回は短めでしたが、僕が半年間試行錯誤してきた中で最も効果があったChatGPTを英語力向上に役立てる二つの方法を紹介しました。
この方法が役立ったらSNSでのシェアをしていただくと助かります。また、記事の要望や感想などをコメント欄でシェアしていただけると嬉しいです。
最後まで読んでいただきありがとうございました。
kotlin fest 2024 スライド一覧

# はじめに
kotlin fest2024お疲れ様でした。
自分は、現地に参加させていただいていたのですが２ホール開催だったため気になってたけど見れなかった、
再度見直して触りながら自分も造詣を深めたいと思うことが多かったのでで登壇者の方々が作成してくださったスライドをまとめてみました

### 一覧

[サーバーサイドプログラミング実践開発](https://speakerdeck.com/n_takehata/kotlin-server-side-programming-practice-2024)

こちらは現地で聴かせていただきましたが、もともと自分はサーバーサイドKotlinに興味があり一昔前に上澄だけ触って終わってしまっていたのですが、そんな自分でもすっと内容が理解できてKotlinだけでなくサーバーに興味がある方にもとても有益に感じました

---

[もっとKotlinを好きになる！K2時代のKotlin Compiler Plugin開発](https://speakerdeck.com/kitakkun/kotlin-fest-2024-motutokotlinwohao-kininaru-k2shi-dai-nokotlin-compiler-pluginkai-fa)
こちらも現地で聴かせていただきましたが、知見が全くない自分でもすっと内容が入ってくるほどの完成度で驚きました
また、[GitのPR](https://github.com/kitakkun/greeting-plugin)も公開されており内容もさることながら驚かされることばかりでした

---

[Kotlin sealed classを用いた、ユーザーターゲティングDSL（専用言語）と実環境で秒間1,000万評価を行う処理系の事例紹介
](https://speakerdeck.com/kazukima/number-kotlinfest-2024-kotlin-sealed-classwoyong-ita-yuzatageteingudsl-zhuan-yong-yan-yu-toshi-huan-jing-demiao-jian-1000mo-ping-jia-woxing-uchu-li-xi-noshi-li-shao-jie)

こちらは現地では聞けなかったので、スライドをみてみようと思います！

---

[Kotlin Coroutinesで共有リソースに正しくアクセスする](https://speakerdeck.com/moriatsushi/kotlin-coroutinesdegong-you-risosunizheng-sikuakusesusuru)

こちらは、現地で聴かせていただきました。
普段スレッドは気にすることはあれど、mutexというものには触れたことがなかったのでとても新鮮でした。

---

[withContextってスレッド切り替え以外にも使えるって知ってた？
](https://speakerdeck.com/t45k/withcontexttutesuretudoqie-riti-eyi-wai-nimoshi-erututezhi-tuteta)

こちらも、現地で聴かせていただきました。
発表者の方はサーバーサイドの方らしく、普段Android実装をしている自分とは別の切り口からのwithContextへの関心があって面白かったです

---

[Kotlin Collection関数をマスター](https://speakerdeck.com/masayukisuda/kotlin-collectionguan-shu-womasuta)

こちらは現地では聞けなかったので、スライドをみてみようと思います！
また、タイムテーブルにあるように初級者向けとのことなのでKotlinに興味がある方は見やすいのかなと思います！

---

[例外設計について考えて Kotlin（Spring Boot&Arrow）で実践する/thinking exception design and implementation by kotlin](https://speakerdeck.com/msksgm/thinking-exception-design-and-implementation-by-kotlin)

こちらは現地では聞けなかったので、スライドをみてみようと思います！

---

[あらゆるアプリをCompose Multiplatformで書きたい！ -ネイティブアプリの「あの機能」を私たちはどう作るか-
](https://speakerdeck.com/subroh0508/arayuruapuriwocompose-multiplatformdeshu-kitai-neiteibuapurino-anoji-neng-wosi-tatihadouzuo-ruka)

こちらは現地で聴かせていただきました
タイムテーブルの最初でCompose Multiplatformの始め方を聞いていたので内容がすっと入ってきましたし、何より聞いてるうちにできることの多さにびっくりしました

---

以上が現在公開されているスライドになります

### 最後に
他にもスライドを見つけることができたら随時更新していこうと思います！
皆さんもぜひこちらをストックやいいねをして何度も見返すのに活用してください！
【JavaScript】え？forって使わんの？

とある記事ではJavaScriptの`for`句を巡って議論が交わされていたので少し興味をもちました。私はこれらの議論に参加できるほどの専門力はありませんが感想程度に。
間違い等あればコメントいただけますと幸いです。


https://qiita.com/ukiuni@github/items/abad07524856c65a20ea#comment-f2d7f3bb190f9395bf38

https://qiita.com/miyabisun/items/8e52b7ba6ef38028f1c4

https://qiita.com/miyabisun/items/4cc9114c1a998cd9bfd7

# 読み取れたこと
### メリット
* 行数が減る
* ネストが深くなりづらい
* 可読性...?

```javascript:🤔.js
const a = [];
for (let i=0; i<=99; i++){
  a.push(i);
}

const a = Array(100).fill().map((_, i)=>i)
```

* 一度`for`なしを見てしまったが最後、「ひとつひとつ取り出して〜する」みたいな思想はなんだか原始的に感じる?
* なんか`let`ォ?!的な印象
* `push()`は破壊的メソッドなのでなんか印象が悪い
* 副作用が少ないなど

### デメリット
* **遅い** ← 泣いた😭

これは正直意外でした。誰がどう見ても早く見える。省略記法=高速処理という観念を根っこから削ぎ落とす現実がそこにはあった。

※ 🤔.jsの比較結果、 「code block 1」が`for`を使った方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092163/6149d90d-c3a1-7414-254c-a3df9b2fd23c.png)

Pythonだと内包表記なるものの方が速かったりするのですが...
まあこれはどちらも`for`を使ってるので例が悪いですね。良い例があればコメントお願いします
```python:🐍.py
a = []
for i in range(100):
    a.append(i)

a = [i for i in range(100)] # faster!
```

# なんかステキやん
* 結論から言うと、処理の複雑さによって使い分けが重要だなと感じだところです
* ただ、メソッドチェーン表記は一種のロマンというか、クソ難しい処理を一発でかけた時の達成感がヤバい
* だから私はメソッドチェーン