OmniAICreator/Qiita-1.07M huggingface dataset:
Spring Boot でマッピングされているURLの一覧を確認したい

対象環境：
- JAVA 11.0.24 (corretto-11)
- Spring Boot v2.3.12.RELEASE

https://qiita.com/otsu-Miya/items/eac37b2720b67a58690b
を参考に、対象環境にてマッピングをlogに表示してみた。

```
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import java.util.Map;

@Controller
@RequestMapping("/")
@Slf4j
public class HogeController {

    private final RequestMappingHandlerMapping handlerMapping;

    public HogeController(RequestMappingHandlerMapping handlerMapping) {
        this.handlerMapping = handlerMapping;
    }

    @GetMapping("test")
    public ResponseEntity<String> test() throws ClassNotFoundException {
        log.info("======= url mapping");
        Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = this.handlerMapping.getHandlerMethods();
        for( Map.Entry<RequestMappingInfo, HandlerMethod> mapItem : handlerMethodMap.entrySet() ) {
            RequestMappingInfo key = mapItem.getKey();
            HandlerMethod value = mapItem.getValue();
            log.info("======= " + key.getMethodsCondition() + " " + key.getPatternsCondition() + " :: " + value);
        }

        return ResponseEntity.ok().body("OK");
    }

}
```

実行して /test にリクエストすれば log の設定場所に表示されるはず。json とかで返しても良かったかなと思ったけどjavaでjson返すの面倒だったことを思い出した。

面倒だな、java/spring...

spring framework の標準機能で route list 出させろよってなってる
ブラウザ「なんで毎日別のクエリ文字が付いてんねや？」

キャッシュバスティングについて、@Yametaro さんリスペクトで関西型言語の会話形式で書いてみました！

# ある日

<font color="tomato">ユーザー「サイトにアクセスするやで！」</font>

<font color="skyblue">ブラウザ「アクセスがあったな」
ブラウザ「サイトを表示するで」
ブラウザ「必要なファイルは・・・よし、キャッシュしてるのがあるから、これを使うで」
ブラウザ「あ、`style.css?date=20240808`か・・・。そんなファイルはキャッシュしてへんな」
ブラウザ「`style.css?date=20240807`なら、昨日サーバーはんからもろたんやけどなぁ」
ブラウザ「ほなサーバーはんに`style.css?date=20240808`をリクエストせんとあかんな」
ブラウザ「サーバーはん、`style.css?date=20240808`をくれや」</font>

<font color="palegreen">サーバー「なんや、新しいリクエストかいな」
サーバー「`style.css?date=20240808`か。せやかてそんなファイル持ってへんで」
サーバー「あ、よく見たらクエリ文字（`?date=20240808`）が付いとるやんけ」
サーバー「クエリ文字はただの識別子やから、実際のファイル名には影響せえへんねん」
サーバー「クエリ文字を無視した`style.css`なら持っとるで」
サーバー「せやから、クエリ文字を無視した`style.css`を返したろ」
サーバー「ブラウザはん、リクエストされたファイルやで」</font>

<font color="skyblue">ブラウザ「サーバーはん、おおきにやで～」
ブラウザ「お待たせやで、サイトを表示や！」</font>

<font color="tomato">ユーザー「おっ、なんかサイトのデザイン変わっとるな」</font>

<font color="skyblue">ブラウザ「サーバーはんから貰ったこれは、`style.css?date=20240808`としてキャッシュしとくやで」
ブラウザ「せやから、また`style.css?date=20240808`が必要になったら」
ブラウザ「サーバーはんから貰うんじゃなくて、今あるのを使うやで」
ブラウザ「これで読み込みの時間を短縮できるんや」
</font>

# ～翌日～

<font color="tomato">ユーザー「今日もサイトにアクセスするやで！」</font>

<font color="skyblue">ブラウザ「なになに、今日は`style.css?date=20240809`か・・・」
ブラウザ「これもキャッシュしてへんわ」
ブラウザ「またサーバーはんに貰わなあかんな」
ブラウザ「・・・それにしても、なんでこう毎日毎日別のクエリ文字を付けはるんやろか」</font>

開発者「それはな」
開発者「**キャッシュバスティング**っちゅーねんけど」
開発者「`style.css`のバージョンが変わった時に」
開発者「新しいバージョンの`style.css`を取りに行ってほしいからやねん」
開発者「毎日違うクエリ文字が付いてたら、少なくとも日を跨いだら新しいファイルをサーバーはんに貰うやろ？」

<font color="skyblue">ブラウザ「せや」
ブラウザ「キャッシュしてへんファイルやから、サーバーはんに貰いますわ」</font>

開発者「せやろ」
開発者「つまり、`style.css`が変更されても、この場合は翌日には反映されるっちゅー訳や」
開発者「もちろん、もっと早く適用させるために、たとえば時分を入れてもええで」
開発者「クエリ文字も別に何でもええんや」
開発者「ただ、あんまり頻繁にサーバーはんにリクエストするのも気の毒やから」
開発者「どのくらいの頻度がいいかはよく考えんとあかんけどな」

<font color="skyblue">ブラウザ「ほえ～」</font>

### まとめ
- **キャッシュバスティング**とは、静的ファイルをキャッシュからではなくサーバーから取得させるための仕組み
- ファイル名に可変のクエリパラメータを付けることで、**キャッシュからではなくサーバーから最新のファイルを取得**させる
- 画像ソースの差し替えやデザインの変更などに便利
- ただし、頻繁すぎるとキャッシュの意味がないので、頻度は慎重に調整する必要がある
新社会人向け所得控除まとめ

## ふるさと納税
https://www.soumu.go.jp/main_sosiki/jichi_zeisei/czaisei/czaisei_seido/furusato/mechanism/procedure.html
- 自分の意思で応援したい自治体を選ぶことができる制度（還元率上限30％の返礼品がもらえる）
- 全額（2,000円を除く）控除される
- ふるさと納税額（年間上限）の目安はサイトでシミュレーション可能
- 確定申告が必要（ワンストップ特例制度利用時不要）
    - ワンストップ特例制度：確定申告の不要な給与所得者等で、ふるさと納税を行う自治体の数が5団体以内である場合に限る
- 何を買えばいいのかなかなか決められない人に
    - 電子マネーも用意されている
        - ハチペイ：渋谷区の電子マネー
        - 地域共通商品券：北区、中野区とか

## iDeCo
https://www.ideco-koushiki.jp/
- 自分が拠出した掛金を、自分で運用し、資産を形成する年金制度
- 掛金全額が所得控除の対象となる
- 会社によって加入しているタイプが違う：企業型確定拠出年金（企業型DC）か確定給付企業年金（DB）
    - 現職：確定給付企業年金（DB）
    - 限度額：毎月1.2万円
    - 証券会社によるが、投資商品多く用意されている
- 落とし穴：
    - 手数料がとられる：
        - 収納手数料と事務手数料は、一律で合計2052円（年間）
        - 金融機関によっては年0円〜6000円程度の口座管理手数料が必要となる
    - 原則60歳まで引き出せない
    - 受け取る時に課税される
        - 一時金で受け取る場合は「退職所得」扱い
        - 年金で受け取る場合は「雑所得」扱い（「公的年金等控除」を差し引いた金額が課税対象）

## 医療費控除 or セルフメディケーション税制（併用不可）
### 医療費控除
https://www.nta.go.jp/taxes/shiraberu/shinkoku/tokushu//keisubetsu/iryou-koujo.htm
- 1年間に自己負担額が10万円（または年間所得の5%の少ないほう）を超える時に利用できる
### セルフメディケーション税制
https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000124853.html
- スイッチＯＴＣ医薬品を購入した際に、その購入費用について所得控除を受けることができるも制度
- 条件：
    - 世帯での年間購入額が１万２０００円以上
    - 予防接種や健康診断の受診など健康のための一定の取組を行い、その領収書又は結果通知表を保存している（例：会社の定期健康診断を受診した、インフルエンザの予防接種を受けた）

## 株取引を行っている方で損をした場合の控除
- 確定申告必要（「特定口座（源泉徴収あり）」を利用時不要）
- 損益通算してマイナスの場合は3年間繰り越せる「繰越控除」
- NISA口座は損益通算しない（損しても控除できない）

## 災害や盗難などの被害に遭った際の控除(雑損控除)
https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1110.htm
- 次の(1)と(2)のうちいずれか多い方の金額です。
    （1)　（損害金額+災害等関連支出の金額-保険金等の額）-（[総所得金額等](https://www.nta.go.jp/taxes/shiraberu/taxanswer/yogo/senmon.htm#word1)）×10％
    （2)　（災害関連支出の金額-保険金等の額）-5万円
- 損害原因は次のいずれかの場合に限られる
    （1）震災、風水害、冷害、雪害、落雷など自然現象の異変による災害
    （2）火災、火薬類の爆発など人為による異常な災害
    （3）害虫などの生物による異常な災害
    （4）盗難
    （5）横領
    *詐欺や恐喝の場合には、雑損控除は受けられない

## 生命保険料控除
https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1140.htm

## 地震保険料控除
https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1145.htm

## 扶養控除
https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/1180.htm

## 住宅ローン控除
https://www.mlit.go.jp/jutakukentiku/house/jutakukentiku_house_tk2_000017.html
https://www.mlit.go.jp/report/press/content/001714809.pdf
【Git】git stashコマンドでバージョン管理されているファイルを退避させたい

## アジェンダ
- バージョン管理されているが、リモートに反映させたくない特定のファイルを、一時的に追跡させないようにしたい
- `git stash`コマンドを使う
## 手順
1. 退避させたいファイルをスタッシュする
    ```.shell:zsh
    git stash push -m "一時退避" -- src/config/IpList.php

    // 複数の対象があれば指定する
    git stash push -m "一時退避" -- src/config/IpList.php src/config/AdminList.php
    ```
1. 本来、リモートにプッシュしたいファイルをcommit等する
    ```.shell:zsh
    git add src/components/common/button.tsx
    git commit -m "fix ボタンをホバーした際の挙動を修正"
    git push origin Feature/Task_03
    ```
1. 退避させているファイルを復帰させる
    ```.shell:zsh
    git stash pop
    ```
以上。
WKWebViewで新しいウィンドウを開くリンクを外部ブラウザで処理する方法

## 概要
`WKWebView` を使用する際に、新しいウィンドウを開く必要があるリンクをクリックしたときに、そのリンクを外部ブラウザで開く方法を紹介します。このテクニックを使うことで、アプリ内で複雑なウィンドウ管理を避け、ユーザーにシームレスなブラウジング体験を提供できます。

## はじめに
iOS アプリで `WKWebView` を使ってウェブコンテンツを表示することはよくありますが、リンクが新しいウィンドウやタブで開かれるように設計されている場合、デフォルトではその動作を処理する必要があります。特に、そのようなリンクを外部ブラウザで開きたい場合、このテクニックが有効です。

## コードの解説

以下のコードは、新しいウィンドウを開くためのリンクがクリックされた場合、そのリンクを外部ブラウザで開く処理を行います。

```swift
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    if navigationAction.targetFrame == nil,
       let url = navigationAction.request.url {
        UIApplication.shared.open(url)
    }
    return nil
}
```

## 実際のアプリケーションでの使用例

このメソッドは、特にアプリ内で複数のウィンドウを管理したくない場合や、特定のリンク（例えば外部サイトへのリンク）を外部ブラウザで開きたいときに非常に有効です。

例えば、Webアプリケーションのユーザーが外部サイトへのリンクをクリックしたとき、そのリンクをアプリ内で処理せずに、Safariで開くようにしたい場合に、この方法を適用できます。

## まとめ

`WKWebView` で新しいウィンドウを開くリンクを外部ブラウザで処理するこの方法は、アプリ内でのウィンドウ管理をシンプルに保ちつつ、ユーザーに適切な体験を提供するために役立ちます。
Puppy LInuxを初めて試したメモ

この記事は、ドシロウトが初めてPuppy Linuxを試したメモです。


・シノバー(shinobar)さんの以下の動画を見てPuppy linuxに興味をもった

　Puppy Linux をUSBにインストール・Rufus編
　https://www.youtube.com/watch?v=-CKzpC8ys8E

　動画の元のブログ記事

　RufusでパピーをUSBインストール
　https://shinobar.net/linux/blog/?viewDetailed=00009

　シノバー（Shinobar）さんは、日本のLinuxコミュニティで知られている開発者・貢献者の一人で特にPuppy Linuxに関連する活動で有名な方らしい

・動画の通り、USBメモリーで試すと以下の結果になった

　mouseのWindowsタブレット、WN1004v2ではPuppy linuxのGrub画面が崩れてしまいおかしくなったので試すのをやめた。

　ドスパラのノートパソコン、Altair F-13KR（CPU:i5-8250u RAM:8GB)だと、Grub画面が正しく表示され、動画の通りPuppy linuxをUSBメモリにインストールできた。

　Grub画面（正しく表示された場合）　
　![](https://i.imgur.com/sD3I1G1.png)

　個人的な想像だが、mouseのWindowsタブレットではBIOS画面が縦画面で表示される仕様なのでそのせいかもしれないと思っている。

・USBメモリでの動作確認の感想

　起動はUSBメモリからのロードするせいか、かなり時間がかかる(体感2分くらい）

　シャットダウンもUSBメモリに書き込みするせいか、かなり時間がかかる(体感2分くらい）

　起動してしまえば、Puppy Linux の共通の特徴として、可能な範囲でシステム全体をRAMに読み込んで実行する設計になってるらしいので、サクサク動いた

　デフォルトのブラウザがFirefoxで個人的にほぼ使ったことなく使いづらい

・USBメモリから外付けのポータブルSSDに変更

　起動、シャットダウンが遅いため、外付けのポータブルSSDにPuppy linuxをUSBメモリにインストールして試した

　外付けのポータブルSSDは、USB3.0接続、M.2 SATA 128GBのものを利用

　　外付けのポータブルSSDの画像
　　![](https://i.imgur.com/3ar3YCN.png)　　

　シノバー(shinobar)さんのの動画の通りいけるかと思ったら以下の点が違った

　　RufasでポータブルSSDが最初FATではなくLarge FATで認識、書き込みに失敗した

　　　NTFS、8192バイトで書き込みしたらうまくいった

　　USBメモリから起動時はメイン画面に表示されたSaveボタンが表示されなくなった
　　Puffy イベントマネジャーで保存間隔が無効化されて変更できなかった

　　　個人的な想像だがSSDの場合、自動的に保存されるらしい、シャットダウン→起動してもとくに設定が戻ることはなかった


・外付けのポータブルSSDでの動作確認の感想

　起動は１分以内になり、少し早くなった

　シャットダウンは２０秒程度ですごく早くなった

　Quickpet(Puppy Linux用のソフトウェアを簡単にインストールするためのアプリ)でChromiumをインストールしてみたがインストール自体は成功するものの起動できず

　　よくわからず、一旦あきらめ

　FirefoxでChromeの.deb版をダウンロードしてダブルクリックもインストール自体は成功するものの起動できず

　　以下のPuppy Linux 日本語 フォーラムからsfsファイルをダウンロードしてインストールした

　　　Chrome の sfs - Puppy Linux 日本語 フォーラム
　　　https://sakurapup.com/forum1/viewtopic.php?t=3305

　　　おそらく、フォーラムの記事通りやれば良いと思われるが、Rootでメニューから起動できればよかったので、実際には手抜きして以下をやって使えた

　　　　jwmrcファイル（隠しファイル）探して、メニューでchrome選択時のコマンドを以下に変更した

        google-chrome-stable --no-sandbox

　ChromeでYoutubeをFHDで見てる程度では全く問題なし

　PuppyパッケージマネージャーでVLCはインストールできた

　　VLCでIPTVも見れた

　全体としてさくさく動いており、問題なし
【Docker】dockerのディスクスペースを開放したい！

## はじめに
皆さんは普段の開発においてdockerのディスクスペースを意識していますか？
ディスクスペースとは、簡単に言うと「データを保持できる容量」のことです。

実は、定期的にディスクスペースを開放してあげないと、さまざまな困りごとに直面してしまいます、、、
- 新たなコンテナの起動失敗
- イメージの作成失敗
- パフォーマンスの低下 etc...

今回はディスクスペースを開放する手順を紹介しようと思います。

## どうすればディスクスペースを開放できるの？
### 1. dockerのディスクスペースの現状を把握
まずは自身のdockerがどれくらいのディスクスペースを使用しているかをチェックしましょう。
以下のコマンドを流すと確認できます。
```
$ docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          50        14        26.06GB   21.43GB (82%)
Containers      16        15        3.13MB    0B (0%)
Local Volumes   26        15        966.7MB   231.6MB (23%)
Build Cache     476       17        7.833GB   7.503GB
```
**各項目の意味**

TYPE：ディスクスペースを使用しているリソースの種類

TOTAL：システムに存在する該当リソースの総数

ACTIVE：現在使用中のリソースの数

SIZE：それぞれのリソースが使用しているディスクスペースの合計

RECLAIMABLE：システムが不要と判断したリソースの容量。つまり、この数値分ディスクスペースを開放できる。

以下の例は、「イメージが50個あり、そのうち14個が現在使用中。50個のリソースが26.06GB使用しており、そのうち21.43GBを削減できる。」ということを示しています。

```
TYPE       TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images     50        14        26.06GB   21.43GB (82%)
```

### 2. 不要なリソースを削除する
不要なリソースを削除するためのコマンドは以下のとおりです。
自身の現状に合ったコマンドを実行してください。
*以下のコマンドを実行すると、「未使用のもの」が削除されます。
<br>
- **イメージのみを削除する**
```
$ docker image prune
```
<br>

- **コンテナのみを削除する**
```
$ docker container prune
```
<br>

- **ボリュームのみを削除する**
```
$ docker volune prune
```
<br>

- **ビルドのキャッシュのみを削除する**
```
$ docker builder prune
```
<br>

- **上記全て＋未使用のネットワークを削除（ただしボリュームは削除されない）**
```
$ docker system prune

# --volumes をつけるとボリュームも削除可能
```

## 補足：docker system prune でボリュームが削除されない理由
```
$ docker system prune
```

先ほど、上記コマンドを実行すると、「未使用のイメージ・コンテナ・ビルドのキャッシュ・ネットワーク」が削除されるという説明をしました。
ではなぜボリュームは削除されないのでしょうか？

それは、基本的にボリュームに保存されるデータは長期間維持されることを前提としているからです。
アプリケーションの状態や設定ファイルなどを保存しているため、これを自動的に削除するのはリスクが高いと判断されています。

上記のような理由から、[Docker 17.06.1](https://docs.docker.com/engine/release-notes/17.06/ "リリースノートへ遷移")がリリースされた際にボリュームが削除されないようになりました。
MacからLinuxサーバーにSSH接続する方法と「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED」への対処方法

# ゴール
Macのターミナルを使用して、Linuxサーバー（Raspberry Pi 5, Ubuntu 24.04 LTS）にSSHで安全にログインできるようになることを目指します。具体的には、SSH接続時に発生する可能性のあるホスト鍵の警告メッセージに対応し、正常に接続を確立する方法を習得します。

# 実行環境
 - クライアント端末
     - MacBook Air M3
     - macOS Sonoma 14.6.1
 - Linuxサーバー
     - Raspberry Pi 5
     - Ubuntu 24.04 LTS

# mac のターミナルからsshでログインする
```sh
ssh <ipアドレス> -l <ログインユーザー>
```

# ログイン出来ない：SSH接続先のサーバーのホスト鍵が以前接続したときと異なる場合への対処方法
ログインコマンド実行時、SSH接続先のサーバーのホスト鍵が以前接続したときと異なる場合下記メッセージが出力されます。
```sh
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
[*ホスト鍵*]
Please contact your system administrator.
Add correct host key in /Users/[ローカルユーザー]/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /Users/[ローカルユーザー]/.ssh/known_hosts:10
Host key for <IPアドレス> has changed and you have requested strict checking.
Host key verification failed.
```

[24-08-09:コメント欄での指摘を受けて追記]
**この警告は、なりすましや中間者攻撃（Man-in-the-Middle attack）の可能性があることを示しています。接続先のサーバーが正当なものであることを確認し、ホスト鍵の変更が意図されたものであり、安全であることが確認できた場合にのみ次の対処に進んで下さい。**

## 対処：SSHクライアントの known_hosts ファイルから指定したIPアドレスに対応するホスト鍵を削除する
SSHクライアントはリモートホストのホスト鍵を ~/.ssh/known_hosts ファイルに保存しています。下記コマンドを実行することで中身を確認できます。
```sh
cat /Users/[ローカルユーザー]/.ssh/known_hosts
```
下記コマンドを実行することで、指定されたIPアドレスに対応するエントリ（ホスト鍵）をそのファイルから削除することができます。
```sh
ssh-keygen -R <IPアドレス>
```
成功すること下記のようなメッセージが出力されます
```sh
# Host <IPアドレス> found: line [known_hostsの行番号]
/Users/[ローカルユーザー]/.ssh/known_hosts updated.
Original contents retained as /Users/[ローカルユーザー]/.ssh/known_hosts.old
```

再度、sshでログインしようとすると下記が出力されるので「yes」を入力して下さい。
```
The authenticity of host '<IPアドレス>' can't be established.
ED25519 key fingerprint is [*ホスト鍵*]
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:1: <過去にsshでログインしたことのあるIPアドレス_1>
    ~/.ssh/known_hosts:4: <過去にsshでログインしたことのあるIPアドレス_2>
    ~/.ssh/known_hosts:7: <過去にsshでログインしたことのあるIPアドレス_3>
    ~/.ssh/known_hosts:8: <過去にsshでログインしたことのあるIPアドレス_4>
    ~/.ssh/known_hosts:9: <過去にsshでログインしたことのあるIPアドレス_・・>
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
```
ログインが始まります。
```sh
Warning: Permanently added '<IPアドレス>' (ED25519) to the list of known hosts.
<ipアドレス> @<IPアドレス>'s password: 
```

# おわりに
この記事では、MacのターミナルからRaspberry Pi 5にSSHでログインする手順と、ホスト鍵が変更された場合の対処方法について説明しました。SSHのホスト鍵は、リモートサーバーの真正性を確認するための重要なセキュリティ機能です。鍵が変わった場合の警告メッセージに適切に対応することで、セキュリティを維持しつつ、安全にサーバーにアクセスすることができます。

SSHはリモート接続において非常に便利で強力なツールですが、同時にセキュリティに関する理解が求められます。今後も、SSHを利用する際には、ホスト鍵や接続先の安全性を確認しながら利用していきましょう。
robloxでassistant その166

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
ClickDetectorを使え。

# サンプルコード

```

local part = Instance.new("Part", workspace)
part.Position = Vector3.new(-5, 0, -10)
local clickDetector = Instance.new("ClickDetector")
clickDetector.Parent = part
clickDetector.MouseClick:Connect(function(player)
	part.BrickColor = BrickColor.random()
end)




```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f873237b-c65d-b99a-7179-a6d09bdd5659.png)


以上。
robloxでassistant その165

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
BillboardGuiを使え。

# サンプルコード

```
task.wait(5)
local camera = workspace.CurrentCamera
local part = Instance.new("Part")
local billboard = Instance.new("BillboardGui")
local label = Instance.new("TextLabel")
camera.CameraType = Enum.CameraType.Scriptable
part.CFrame = CFrame.new(0, 10, 0)
part.Anchored = true
billboard.MaxDistance = 10
billboard.Adornee = part
billboard.AlwaysOnTop = true
billboard.Size = UDim2.fromOffset(50, 50)
label.Size = UDim2.fromScale(1, 1)
label.Parent = billboard
billboard.Parent = part
part.Parent = workspace
local cameraPosition0 = part.Position + Vector3.new(0, 0, 10)
local cameraPosition1 = part.Position + Vector3.new(0, 0, 20)
camera.CFrame = CFrame.lookAt(cameraPosition0, part.Position)
task.wait(2)
camera.CFrame = CFrame.lookAt(cameraPosition1, part.Position)


```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/354d775b-089a-d165-173d-e25dad6be5cd.png)


以上。
robloxでassistant その164

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
BallSocketConstraintを使え。

# サンプルコード

```
local part1 = Instance.new("Part", workspace)
part1.Position = Vector3.new(0, 9, 0)
part1.Size = Vector3.new(1, 1, 1)
part1.Anchored = true
local part2 = Instance.new("Part", workspace)
part2.Position = Vector3.new(0, 6.5, 0)
part2.Size = Vector3.new(4, 4, 4)
part2.Shape = Enum.PartType.Ball
local attachment0 = Instance.new("Attachment", part1)
local attachment1 = Instance.new("Attachment", part2)
attachment0.Position = Vector3.new(0, -0.5, 0)
attachment1.Position = Vector3.new(0, 2, 0)
local rigidConstraint = Instance.new("BallSocketConstraint", part1)
rigidConstraint.Attachment0 = attachment0
rigidConstraint.Attachment1 = attachment1
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4172c16a-3c78-8987-5e15-fa27ab6dc008.png)


以上。
S3 Glacier Deep Archiveをまとめてrestoreする



費用をおさえるためとおもって、ファイル資産をS3 Glacier Deep Archiveにクラス変更すると、restoreするのに、バケット毎とか、フォルダ毎ができず、ファイルごとにrestoreリクエストを出さないといけず、コンソール画面からだと、めんどくさすぎたので、shを組んでCLIで一括にリクエストをする。

s3は、バケット毎、フォルダ毎に何かするときに、いちいち手間を感じるので、ある程度は圧縮してファイル数をへらして管理する方が運用工数は減ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83911/fa398db1-64fd-eb19-1cef-289c1d896886.png)

（参考　5万ファイル・リクエストで6ドル）

```
#!/bin/sh

aws s3 ls --profile (profile-name) -recursive  s3://(backet-name)/ | awk '{print $4}' | while read file
do
  echo $file
  aws s3api restore-object --bucket (backetname) --key $file --restore-request '{"Days":14,"GlacierJobParameters":{"Tier":"Standard"}}' --profile  (profile-name)
done
```

restore がcomeleteしたはずなのに、s3 sync や、 s3 cp --recursive でエラーになるため、同じくスクリプトでaws cp

```
reita@antares:/mnt/k/mail$ aws s3 sync s3://(backetname)/ /mnt/k/mail/ --recursive --profile=(profile-name)
(backetname)

warning: Skipping file s3://(backetname)/tsutaya/tsutaya201210.txt. Object is of storage class GLACIER. Unable to perform download operations on GLACIER objects. You must restore the object to be able to perform the operation. See aws s3 download help for additional parameter options to ignore or force these transfers.
Completed 0 file(s) with ~0 file(s) remaining (calculatinfatal error:
```

```
reita@antares:/mnt/k/mail$ aws s3 sync s3://(backetname)/ /mnt/k/mail/  --profile=(profile-name)

warning: Skipping file s3://(backetname)/$$$sharing.$$$. Object is of storage class GLACIER. Unable to perform download operations on GLACIER objects. You must restore the object to be able to perform the operation. See aws s3 download help for additional parameter options to ignore or force these transfers.
```

1ファイルごとに、aws cpする。

```
#!/bin/sh

aws s3 ls --profile (profile-name) --recursive  s3://backetname)/ | awk '{print $4}' | while read file
do
        echo $file
        aws s3 cp s3://backetname)/$file ./$file  --profile tan
```
robloxでassistant その163

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
Beamを使え。

# サンプルコード

```
local att0 = Instance.new("Attachment")
local att1 = Instance.new("Attachment")
att0.Parent = workspace.Terrain
att1.Parent = workspace.Terrain
att0.Position = Vector3.new(0, 10, 0)
att1.Position = Vector3.new(0, 10, 10)
local beam = Instance.new("Beam")
beam.Attachment0 = att0
beam.Attachment1 = att1
beam.Color = ColorSequence.new({
	ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 255, 255)),
	ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 255, 255)),
})
beam.LightEmission = 1
beam.LightInfluence = 0
beam.Texture = "rbxasset://textures/particles/sparkles_main.dds"
beam.TextureMode = Enum.TextureMode.Wrap
beam.TextureLength = 1
beam.TextureSpeed = 1
beam.Transparency = NumberSequence.new({
	NumberSequenceKeypoint.new(0, 0),
	NumberSequenceKeypoint.new(0.8, 0),
	NumberSequenceKeypoint.new(1, 1),
})
beam.ZOffset = 0
beam.CurveSize0 = 2
beam.CurveSize1 = -2
beam.FaceCamera = true
beam.Segments = 10
beam.Width0 = 0.2
beam.Width1 = 2
beam.Enabled = true
beam.Parent = att0
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/15ea8bf5-1f49-1ef0-fe6e-85c420b66b39.png)


以上。
世界一の企業Appleがやっているハルシネーション対策を試してみる

## はじめに

　時価総額世界一の企業Appleは生成AIでハルシネーションを起こさせないために、あるプロンプトを入れているという記事を読んだので、さっそくChatGPT(gpt-4o)で試してみたいと思います。


## ハルシネーションを起こさせないプロンプト

　ハルシネーションを起こさせないプロンプトとは **「ハルシネーションを起こさないで」** とプロンプトに指示を入れる。（えっ、それだけ…？）

 https://xenospectrum.com/apple-is-prompting-the-ai-to-dont-halucinate/


 ## 試してみる

 　昨日(2024/8/8)に発生した日向灘地震についてChatGPT(gpt-4o)に聞いてみましょう。

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/82687a4f-3509-a09c-953b-696f01eabc48.png)

　ChatGPTによると過去1959年と1968年に発生しているようです。

　過去の日向灘地震を調べてみると、下記の気象庁の情報がありました。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/4a715e72-e2a7-a74a-0105-b71b12e24322.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/494f442c-bd75-656f-8fbc-11bdeec53a91.png)

https://www.bousai.go.jp/jishin/nankai/taio_wg/pdf/h301101shiryou04.pdf


　気象庁の情報を見る限り日向灘地震は1968年には発生しているようですが、1959年は発生していないので、ChatGPTの回答はハルシネーションを起こしています。

　それではApple流ハルシネーション抑制プロンプトを試してみましょう。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/376896dc-81b7-e216-0dce-9168c9b94caa.png)

　今回は過去の地震で1968年と2022年を挙げてきました。1968年は上記の資料にあるのですが上記の資料は2018年までの情報なので、2022年は検索して調べてみたいと思います。

　「2022年 日向灘地震」で検索すると気象庁のページが引っ掛かり内容を確認すると

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/e82697bd-a827-8183-ae75-e994fb12a515.png)

　確かに2022年1月にマグニチュード6.6の地震発生の情報があります。今回のChatGPTの回答はハルシネーションが発生していないので、このプロンプトには効果がありそうです。


## おわりに

　今回の実験では、Appleが採用しているハルシネーション対策を試すことで、有効性を確認することができました。さすがAppleというべきか、こんな簡単にハルシネーション対策ができるんですね。読んでいただきありがとうございました。
MAMP 7 でApacheが起動エラーになるのを解消

## 環境
MacbookPro MacOS Ventura MAMP7.0 Free

## 起きたこと
MAMP7.0 Freeを上書きインストール後
「Apache couldn't be started. Please check your MAMP installation and configuration.」
でApacheが起動エラーになる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857108/dd9c4a0a-bd95-1ebd-03d6-d2ede45aa481.png" alt="Apacheが起動エラー "width=320px">
## 試したこと
Nginx に変更（起動する）
再インストール（改善せず）
httpd.confの確認（特に問題なし）
fcgi-binの確認

## phpのバージョンが違う？
MAMP7.0　に含まれるphp8.3.xは8.3.9
![スクリーンショット 2024-08-09 10.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857108/3c8be30e-5943-1527-7a7f-3cb8bf3fc183.png)
fcgi-binではphp8.3.1.fcgi
![スクリーンショット 2024-08-09 10.08.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857108/4422b3a4-12b5-5220-d888-6e26ad944b09.png)


## php8.3.1.fcgiを修正
ファイルを「php8.3.9.fcgi」にリネーム
内容を修正
```fcgi:php8.3.1.fcgi
#!/bin/sh
export PHP_FCGI_CHILDREN=4
export PHP_FCGI_MAX_REQUESTS=200
exec /Applications/MAMP/bin/php/php8.3.1/bin/php-cgi -c "/Library/Application Support/appsolute/MAMP PRO/conf/php8.3.1.ini"
```
8.3.1を2箇所8.3.9に修正
```fcgi:php8.3.9.fcgi
#!/bin/sh
export PHP_FCGI_CHILDREN=4
export PHP_FCGI_MAX_REQUESTS=200
exec /Applications/MAMP/bin/php/php8.3.9/bin/php-cgi -c "/Library/Application Support/appsolute/MAMP PRO/conf/php8.3.9.ini"
```

## 結果
MAMPを再起動したところ
![スクリーンショット 2024-08-09 9.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857108/4e7c833a-5937-29bb-b642-35a1574c2b57.png)

無事に起動しました

## 追記
2024/8/9
別マシン用に新たにダウンロードしたバージョンで修正されていました。
Microsoft WordでのLateXコマンドを使った数式の入力

# はじめに
LaTeXコマンドを使って数式を入力できることを知って以来、Microsoft Wordで数式を取り扱うのが少し嫌ではなくなりました。
ところが新しい文書で数式を入力しようとしたところ、数式が現れず、LaTeX形式のまま表示されてしまいました。ググってみたところ情報があり簡単に問題が解決しました。忘れないように記載します。

# 数式の入力方法

数式を入力するには先ずInsert>Equationを選択するか^+=（コントロールと=を同時に押す）を実行し、数式のボックスを表示します。

メニューのEquationを選択すると下図のようなツールバーに切り替わります。
ここで左のEquationの横に``/ Unicode``、``{} LaTeX``、``ab Text``というメニューがあります。

![Screenshot 2024-08-09 at 10.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837941/5b75c6aa-67e1-ae70-603f-a728dfe4636c.png)

``{} LaTeX``の場合、数式のボックスでLaTeXコマンドを入力するとコマンドがそのまま表示され、入力終了後に``Enter``を入力することで数式が表示されます。LaTeXのソースの数式をそのままコピー・ペーストすることが可能かもしれません（まだ試していません）。

個人的にはLaTeXコマンドを直接目で見ることができて便利だと思いましたが、しばらく使ってみると通常のLaTeXコマンドがうまく使えなかったり、式を入力した後で``Enter``を入力すると改行されてしまうので（式の途中だと改行されないこともありました）、その度に改行を削除する必要がありかえって手間がかかるように感じました。

また下図のように``/ Unicode``になっている場合、LaTeXコマンドを入力するとコマンドが表示されることなく数式が得られます。

![Screenshot 2024-08-09 at 10.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837941/ae9d3ee6-1f4c-9ed9-8401-431080304fcc.png)

``\ Unicde``の方は従来のWordの数式エディターのインターフェースです。ローマンを使用したい場合は手動で修正する必要がありますが、こちらの方が早く入力できるように思います。

# 参考

MacのPagesやKeynoteの方が数式は扱いやすいのですが、Wordを使う必要がある状況では最初の``LaTeX``のオプションは便利かもしれないと思いました。

- [Wordの数式でLaTexを使うのに微妙に苦戦したのでメモ](https://note.com/martins_day/n/ned403c5c2a92)
- [Word で UnicodeMath および LaTeX を使用して行形式の数式を入力する](https://support.microsoft.com/ja-jp/office/word-%e3%81%a7-unicodemath-%e3%81%8a%e3%82%88%e3%81%b3-latex-%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6%e8%a1%8c%e5%bd%a2%e5%bc%8f%e3%81%ae%e6%95%b0%e5%bc%8f%e3%82%92%e5%85%a5%e5%8a%9b%e3%81%99%e3%82%8b-2e00618d-b1fd-49d8-8cb4-8d17f25754f8?ui=ja-jp&rs=ja-jp&ad=jp)
CDK, CDKTF のStackについて適切な粒度を考察する

# 概要

私は掲題の両CDKともいくつかのプログラミング言語でそれなりに使い込んでいますが、一つのStackでどの程度の数のサービスを構築するか、他のスタックと分けるポイントはどこかを解説します。

# 最初に例を示すパターン

たとえば一般的なSPA, API, DBの構成を考えてみましょうか。

Route53でドメイン定義、TLSの証明書もとる。
CloudFrontでS3オリジンを使いCDNやりつつ、VPCや各種subnet ルーティング、NATgw を作成してECSでAPIを構築してS3とかSQSやLambdaも作ります。RDRも作る。キャッシュとしてRedisもほしいですね。
メールもやりたい。

これをStackに落とすときは下記のような感じになります、前ダサいですけどあえてわかりやすくしている例なのでお許しを。

* DomainStack
* FrontStack
* VPCStack
* BackendStack
* DBStack
* MailStack
* IAMStack
* MoniterStack
* Utility (Stackではない共通処理)

依存関係を図にするとこんなかんじ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/045aa29a-caeb-988f-9fce-a5ae1f4f13cd.png)

依存されているものについて解説します。

1. DomainStackの中でRoute53のHosted Zone, RecordSetの作成、証明書の取得などを行っているため、インターネット面に接するサービスはすべてこれに依存します。
1. VPCStackはVPCのページにある基本的なものをだいたい面倒みるのでVPC上にあるものはすべてこのスタックに依存します
    1. ただし、VPNやフローログ、各種エンドポイントなど、機能を実現するために必要そうなものはここでは準備しません。ネットワークまわりなど地面と基礎だけ準備している感じです。

さて、FrontStackとBackendStackの中でS3を作っているのですが、作成する実働処理は最初の方はUtilの方に切り出しておきます。
同じことを何度も書くとduplicated codeとか指摘されてVSCodeやIntelliJさんに怒られるのもあるんですが、共通化できるものは Utilの中にぽいぽいと放り込んでおいて **ゆるく** 共通化しておくかんじです。（このゆるさが後々の保守にとって大切なことになっていくケースがありました）

# 説明
さて、上記のような分け方をした理由について下記のような方針があります。

1. Stackの中で構築するものを集合させるときはAWSサービス単位ではなく、機能単位で考える
    1. 細かくStackを切りすぎてもあまりいいことはなかったです
    1. 逆に大きすぎると一つの変更が変なところに作用するのと、Stackの実行時間がかかるようになるためあまりよくない。
    1. 後から手を加える際のいい塩梅を考えたときデプロイの影響範囲は理論機能の中に収まる傾向がある
1. Stack間を疎結合にする
    1. 後続のStackから見てすでに存在するインスタンス等は名前やARNで参照して使うことになりますが、これを極力前のStackに依存しないように突き詰めて実装します
1. 連続性のあるタスクはREADMEとかでわかるようにする
    1. 依存関係とか書いておくと後から手をいれるときにわかりやすいし、そこに構築順序を降っておくとよいんじゃないでしょうか
1. なるべくconfigは配列で持って複数作成できるようにする
    1. 本番、ステージ、開発環境とかスペックだけ変えて同じもの作りたいよね？
1. 複数の環境を設定で切り替えられるようにconfigを意識する
    1. たとえばCloudFrontを１個だけ作れるようにしたconfigよりも、複数あることを前提としたほうがリソースを増やすときに融通が効くため、１個でも基本的に配列にしてconfigを作っておきます。
    1. このときに絶対やってはいけないのが for などで配列を回しているときに インフラ作成の new時の２番目の引数・・・ nameを雑に名付けてはいけない　間違ってもループの連番とかで名付けすると後々地獄が待っているのでお気をつけあれ・・ちゃんと固有の名前をsuffixとして付与してあげましょう

そろそろ二桁くらい更地からCDK(TF)でインフラ作ってますが、いまのところこんなかんじでいい塩梅です。
robloxでassistant その162

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
AudioSearchParamsを使え。

# サンプルコード

```
local AssetService = game:GetService("AssetService")
local audioSearchParams = Instance.new("AudioSearchParams")
audioSearchParams.SearchKeyword = "happy"
local success, result = pcall(function()
	return AssetService:SearchAudio(audioSearchParams)
end)
if success then
	local currentPage = result:GetCurrentPage()
	for _, audio in currentPage do
		print(audio.Title)
	end
else
	warn("AssetService error: " .. result)
end

```

# 実行結果

```
  09:59:10.487  Hello world!  -  サーバー
  09:59:11.392  Tell It to Yourself (a)  -  サーバー - Script:12
  09:59:11.392  Rock the Beat  -  サーバー - Script:12
  09:59:11.393  Take The Road  -  サーバー - Script:12
  09:59:11.393  Corner Store (A)  -  サーバー - Script:12
  09:59:11.393  In the City (a)  -  サーバー - Script:12
  09:59:11.393  Pedal to the Metal  -  サーバー - Script:12
  09:59:11.393  Massive Metal (a)  -  サーバー - Script:12
  09:59:11.393  The Kitchen Garden  -  サーバー - Script:12
  09:59:11.393  No More  -  サーバー - Script:12
  09:59:11.393  Mud Metal  -  サーバー - Script:12
  09:59:11.393  City Line  -  サーバー - Script:12
  09:59:11.394  Chaos  -  サーバー - Script:12
  09:59:11.394  Fire  -  サーバー - Script:12
  09:59:11.394  Special Sauce  -  サーバー - Script:12
  09:59:11.394  Intense Motivation  -  サーバー - Script:12
  09:59:11.394  Just One Wink A  -  サーバー - Script:12
  09:59:11.394  Metal Flake  -  サーバー - Script:12
  09:59:11.394  The Damage Done (a)  -  サーバー - Script:12
  09:59:11.394  Clouds Finale  -  サーバー - Script:12
  09:59:11.394  So Bad (a)  -  サーバー - Script:12
  09:59:11.395  A Million Drops  -  サーバー - Script:12
  09:59:11.395  Western Spaghetti  -  サーバー - Script:12
  09:59:11.395  Intense Motivation  -  サーバー - Script:12
  09:59:11.395  Town Talk  -  サーバー - Script:12
  09:59:11.395  At Arms Length  -  サーバー - Script:12
  09:59:11.395  Funky Flares  -  サーバー - Script:12
  09:59:11.395  Breathing In  -  サーバー - Script:12
  09:59:11.395  One Of A Kind (A)  -  サーバー - Script:12
  09:59:11.395  Fight Together  -  サーバー - Script:12
  09:59:11.395  Breaking Out (a)  -  サーバー - Script:12
  09:59:11.525  Hello world!  -  クライアント
```

以上。
venv仮想環境作成時にpip/setuptoolsを最新にする方法

# コマンドの概要

Python環境では、pipを使ってモジュール・ライブラリーをインストールすることができるが、そのままpipを実行するとシステム全体に反映されてしまう。そのため、プロジェクト毎や用途毎に独立した環境を用意し、必要なPythonライブラリをそれぞれで管理するためのvenv仮想環境を作成する機能が、Python 3.3から導入された。削除したい時も、仮想環境のフォルダを丸ごと削除するだけで良いので管理が楽である。

```txt:単にvenv仮想環境を作成する。
python3 -m venv [newenvname]
```

しかし、Python3.9からは、--upgrade-depsというオプションが追加されており、このオプションをつけて仮想環境を作成すると、pip/setuptoolsが最新化された状態で仮想環境が作成される。

```txt:venv仮想環境作成時にpip/setuptoolsを最新化する
python3 -m venv --upgrade-deps [newenvname]
```

参考docs
https://docs.python.org/ja/3.9/library/venv.html

# 単にvenv仮想環境を作成した場合

仮想環境を作成してもグローバル環境のpip/setuptoolsと同じバージョンのものが導入されており、最新のpipではないという警告が表示される。setuptoolsも当然最新のものではない。

```txt:グローバル環境のパッケージ・バージョン
syasuda@MacBook ~ % python3 -m pip list
Package    Version
---------- -------
altgraph   0.17.2
future     0.18.2
macholib   1.15.2
pip        21.2.4
setuptools 58.0.4
six        1.15.0
wheel      0.37.0
WARNING: You are using pip version 21.2.4; however, version 24.2 is available.
You should consider upgrading via the '/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip' command.
```

```txt:仮想環境の構築（--upgrade-depsオプションなし）
syasuda@MacBook ~ % python3 -m venv testenv1

syasuda@MacBook ~ % source testenv1/bin/activate
(testenv1) syasuda@MacBook-Pro ~ % pip list
Package    Version
---------- -------
pip        21.2.4
setuptools 58.0.4
WARNING: You are using pip version 21.2.4; however, version 24.2 is available.
You should consider upgrading via the '/Users/syasuda/testenv1/bin/python3 -m pip install --upgrade pip' command.

(testenv1) syasuda@MacBook ~ % deactivate
```

# `--upgrade-deps` オプションを付けて、venv仮想環境を作成した場合

```txt:バージョンが3.9以上であることを確認。
syasuda@MacBook ~ % python3 -V
Python 3.9.6
```

```txt:仮想環境の構築（--upgrade-depsオプションあり）
syasuda@MacBook ~ % python3 -m venv --upgrade-deps testenv2
Requirement already satisfied: pip in ./testenv2/lib/python3.9/site-packages (21.2.4)
Collecting pip
  Using cached pip-24.2-py3-none-any.whl (1.8 MB)
Requirement already satisfied: setuptools in ./testenv2/lib/python3.9/site-packages (58.0.4)
Collecting setuptools
  Using cached setuptools-72.1.0-py3-none-any.whl (2.3 MB)
Installing collected packages: setuptools, pip
  Attempting uninstall: setuptools
    Found existing installation: setuptools 58.0.4
    Uninstalling setuptools-58.0.4:
      Successfully uninstalled setuptools-58.0.4
  Attempting uninstall: pip
    Found existing installation: pip 21.2.4
    Uninstalling pip-21.2.4:
      Successfully uninstalled pip-21.2.4
Successfully installed pip-24.2 setuptools-72.1.0

syasuda@MacBook ~ % source testenv2/bin/activate
(testenv2) syasuda@MacBook-Pro ~ % pip list
Package    Version
---------- -------
pip        24.2
setuptools 72.1.0

(testenv2) syasuda@MacBook ~ % deactivate
```
初めてGo言語をやってみて分かったこと。

# C言語と最近のモダンな言語(Java、C#、Pythonなど)のいいとこ取りをした感じ

* C言語的要素

基本的にGo言語はコンパイラ言語であり、ビルドを実行すると機械語に変換されるのですが、
機械語は直接CPUに命令を出す形式なので、めちゃくちゃ動作スピードが早いです。
コンパイラ言語はGo言語以外に、C言語、C++、Rust等があります。

また、Go言語はクラスという概念は存在しないので（似たようなパッケージという概念はありますが）、
その点も同じと言えます。

* Java的要素

モダンな言語だと、C言語には無かったListのような、要素を自由に追加削除できるるような仕組みがあります。
最近の言語だから、こういった仕組みなども扱えるようになっています。

また、例外処理(try-catch)のような仕組み(panic-recover)も用意されています。

* Python的要素

Pythonのようなスクリプト言語はソースファイルをあれこれ変換しなくてもすぐに実行できるのが特徴ですが、Go言語もいちいちビルドする必要は無く、ソースコードの状態のままで実行できるオプションが用意されています。

```bash
$ go run main.go
```

# パッケージのルールとかパスとか

* プロジェクト作成時にパッケージ名(example.co.jpのような形式)を入力する

これは、Javaでのパッケージ名と同じような物。
外部のモジュールをimportして使用する場合、パッケージ名から指定する必要があります。

```main.go
import (
	"context"
	"encoding/json"
	"net/http"
	"os"

	"example.co.jp/xxx/common"
	"example.co.jp/xxx/logger"
	paapi5 "github.com/goark/pa-api"
	"github.com/goark/pa-api/entity"
	"github.com/goark/pa-api/query"
)
```

* 1フォルダにパッケージは一つのみ

プロジェクトを作成しているときに、「上手くいかないなぁ」って思っていたのですが、これが原因でした。
正直ソースファイルのフォルダ分けがめんどくさいと思いました。
そして、1フォルダの中は同じパッケージであれば複数ソースファイルを設置できます。
（ここがJavaの感覚と違っていて間違えやすい）
importするときは、パスのみを指定すればよいです。

# 関数名、変数名の先頭の大文字小文字

Go言語において、関数名や変数名の先頭の大文字小文字は、パッケージ外からアクセスが可能か、という意味があり、これを間違えると、「パッケージ外からアクセスできねー（サジェストに出てこない）」という事態になりがち。

# 厳密な言語書式

C言語やJavaでは、関数宣言のあとの開始中括弧「{」の位置にコーディングルールやコーダーの好みとかいろいろバラバラなのですが、Go言語では言語仕様で「関数宣言の後の同じ行」と定められています。
これはいちいちコーディングルールを作成する手間を省くためとも言われています。
（あと、結果的にIDE等開発コストも少なくなったとか）

他には、未使用変数や不要なimport宣言も許可しておらず、ビルドエラーとなるのも良いですね。
IDEを使用していると、保存時に自動的に消されてしまいますが、これは実際書いていていろいろフラストレーション溜まるので、賛否両論ありそう。
一応、書式を整えてくれるオプションもあるんですけどね。

```bash
$ go fmt
```

とりあえず、一つ作品を作ってみたのですが、
インターフェースとかゴルーチンとか、触っていない機能もあるので、今後も勉強続けていきます。
【備忘録】Ubuntuでシャットダウン時にフリーズするときの対処（Nvidia Driver の更新）

# はじめに

シャットダウンを行うとき，シャットダウン画面のくるくる回るアイコンが途中で止まり，1分経てど全く電源が切れる様子のないとき，もしかしたら古いバージョンのGPU Driverが原因になっているかもしれない．

Nvidia Driver をインストールしている状況において上記のような減少が起こる場合，もしかすると古いバージョンのドライバが正常なシャットダウンを妨げている可能性がある．
私の環境では，Nvidia Driver を最新版に再インストールすることで解消されたので，その手順をまとめておく．

# 手順

1. 現在インストールされているNvidia Driver のバージョンを確認する
    ```
    nvidia-driver --version
    ```
    これが現在自分のPCに搭載されているGPUの最新バージョンであれば，原因は他にあるため，別の記事に当たって欲しい．
2. 最新バージョンでない場合，以下の手順で新しいバージョンの nvidia driver にアップグレードする（再インストールする）
    ```
    sudo apt remove '^nvidia'
    sudo apt autoremove
    sudo reboot # 再起動
    ```
3. 再起動後，以下のコマンドを実行
    ```
    sudo apt update && sudo apt upgrade -y
    sudo add-apt-repository ppa:graphics-drivers/ppa -y
    sudo apt update
    sudo apt install nvidia-driver-xxx-y # xxx-はバージョン
    sudo reboot # 再起動
    ```

## 参考
https://askubuntu.com/questions/1391245/getting-the-latest-nvidia-graphics-driver-through-software-updates
【Rails6】[ActionDispatch::HostAuthorization::DefaultResponseApp] Blocked hosts:の対処法

## 問題
Rails6で任意のhost名でアクセスしようとした時に、以下のエラーがでます。
```ruby
[ActionDispatch::HostAuthorization::DefaultResponseApp] Blocked hosts: example.com
```

## 解決方法
Rails6で追加された、ActionDispatch::HostAuthorizationによるものです。
https://github.com/rails/rails/pull/33145

対応方法は以下の3つがあります。
### 1. Rails.application.config.hostsにhostを追加する
development環境では、デフォルトで以下のhostが登録されています。
これ以外で接続しようとするとブロックされるため、必要なhost名を追加します。
```ruby
Rails.application.config.hosts = [
  IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
  IPAddr.new("::/0"),      # All IPv6 addresses.
  "localhost"              # The localhost reserved domain.
]
```
以下のようにconfig/environments/development.rbに追加します。
```ruby
Rails.application.configure do
  config.hosts << "example.com"
end
```

### 2. Rails.application.config.hostsの設定をクリアする
config.hostsを空にするとブロックされなくなります。
以下のようにconfig/environments/development.rbに追加します。
```ruby
Rails.application.configure do
  config.hosts.clear
end
```

### 3. ActionDispatch::HostAuthorizationを使わない
config/application.rbに以下のように記述します。
```ruby
module TestApp
  class Application < Rails::Application
    config.middleware.delete ActionDispatch::HostAuthorization
  end
end
```

## 参考

https://weseek.co.jp/tech/680/

https://github.com/rails/rails/pull/33145
Amazon Q Developer無料プランをVSCodeで使う方法

先日JAWS-UG CDK支部にて登壇した内容の一部抜粋です

https://speakerdeck.com/hosomatu/ya-dao-de-sapotoli-amazon-qx-cdk-kai-fa-nosusume


## 1. VSCodeの拡張機能からインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/8495ed9e-4e50-c99f-e604-1f333797f673.png)


## 2. Builder IDと連携
タブが開くのでここから使用しているBuilderIDと連携します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/3bcfc47d-00f7-a961-39de-f6f66dca5069.png)


Builder IDを連携して使用するプランは「永続的な無料利用枠」として書かれているので勝手にサブスクリプションが始まることはなさそうです
https://aws.amazon.com/jp/q/developer/pricing/

## おまけ
デフォルトでは、質問内容がAmazon Q Developerの学習に使われる設定になっているので、それが嫌な場合は変更できます。

下のAmazonQを押すとタブが開くので、そこからSettingsをクリック
![スクリーンショット 2024-08-09 9.22.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/816d2e9d-f42a-a9be-c2d2-1ab86d8d956b.png)

「Share Content With AWS」にデフォルトではチェックが入っているのでそれを外すと、学習に使われなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/fb6bdac8-9a1d-1ce6-136b-26e53f07d52a.png)
display: flex;による基本的な機能

## アジェンダ
基本的なdisplay: flex;でコンテンツにどのような変化をもたらすのかについてまとめます。

## `display: flex;`によって起こる変化
`display: flex;` を設定すると、そのコンテナ内の子要素は`フレックスアイテム（flex items）`となります。
※これだけ!!

## 追加プロパティでフレックスアイテムを操作する
1. **フレックスアイテムの方向指定**:
   `flex-direction` プロパティを使用して、フレックスアイテムの配置方向を指定します。行方向（横並び）や列方向（縦並び）を設定できます。

2. **フレックスアイテムの配置**:
   `justify-content` プロパティを使用して、フレックスアイテムをコンテナ内でどのように配置するかを指定します。中央寄せ、左右寄せ、スペースの均等分配などの配置方法があります。

3. **フレックスアイテムの垂直方向の配置**:
   `align-items` プロパティを使用して、フレックスアイテムを垂直方向にどのように配置するかを指定します。中央寄せ、上寄せ、下寄せなどの配置方法があります。

4. **サイズの自動調整**:
   `flex-grow`、`flex-shrink`、`flex-basis` プロパティを使用して、フレックスアイテムのサイズを自動調整できます。これにより、コンテナのサイズに応じてアイテムの幅や高さが動的に変わります。

5. **順序の変更**:
   `order` プロパティを使用して、フレックスアイテムの表示順序を変更できます。HTMLの順序に関係なく、見た目の順序を制御することができます。
## 具体例
具体例は以下のようになります。

### HTML
```html
<div class="container">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
</div>
```

### CSS
```css
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

.item {
  flex: 1;
  padding: 10px;
  margin: 10px;
  background-color: lightgray;
}
```

上記の例では、`.container` に `display: flex;` を設定しています。これにより、以下のような変化が起きます。

- 子要素（`.item`）がフレックスアイテムとなり、コンテナ内で中央に配置されます。
- フレックスアイテムは均等にスペースを取ります（`flex: 1;` が設定されているため）。
- コンテナ全体の高さは100vh（ビューポートの高さ）で、アイテムは垂直方向にも中央に配置されます。

## まとめ
このように、`display: flex;` を使うと、レイアウトが柔軟に変わり、コンテンツの表示方法が大きく変えることができます。

## 参考
- [CSSの中央寄せはFlexbox万能説 #flexbox - Qiita](https://qiita.com/utf8sjis/items/4b69c864aa0f4f79bc94)
122日目　Terraformを触ってみた社畜S

## :file_cabinet:はじめに
こんにちは、社畜Sです。　
最近新しい案件でTerraformを触る機会がありました。

せっかく新しく触ったものをそのままにしておくのもなんだかもったいないので、今回はTerraformのざっくりとした概要と合わせて、初心者目線からTerraformを触ってみた感想を記事にしていこうと思います。　

完全初心者目線での感想ですのでTerraform仙人の皆様には物足りない記事かもしれませんが、「自分たちにもこんな頃があったなぁ」と生暖かい目で見守ってください。
## :file_cabinet:学習開始時のレベル
・仕事が始まって4か月目
・IaCは1～2か月前にAWS Cloudfourmationで簡単な環境を作った経験のみあり
・Terraformは今回の案件で初めて知ったので完全に知識0
## :file_cabinet:そもそもTerraformって何？ 
HashiCorpによって開発されたIoC（Infrastructure as Code）ツールのことです。

他のIaCツールと同じようにクラウドリソースやインフラストラクチャをコードで管理するためのツールなんですが、CloudfourmationのようにAWS専用点ということはなく、AWS、Azure、Google Cloud、Kubernetesなど、さまざまなプラットフォームに対応しているようです。

使う構成言語は **「HCL」** という直感的かつ読みやすい独自の言語で、読みやすい設定ファイルを書くことができるのでどういう構成になっているのか理解しやすいです。
また **「terraform plan」** という、実行前にどのリソースが作成されるかを一覧で表示してくれる機能もあるので、予期しない変更を防いだり、変更が正確であることを確認することもできます。
## :file_cabinet:実際使ってみた感想
今回はAWSの「Amazon EventBridge」のスケジュール、「AWS Step Functions」のステートマシン、それを実行するためのIAMロールとIAMポリシーをTerraformを作ってみました！
とりあえず結論から言いますと
### めっちゃ書きやすい！（気がする） ###
一度手作業でやったからか、Cloudfourmation触ったことがあるからかはわかりませんがとてもスムーズに書くことができました。

テンプレート機能というポリシーやら設定などの長くなってしまう部分を別ファイルに記述できる機能が特によく、ぱっと見でどういうことをしているのかもわかりやすい、見やすいコードを書くことができました。

今回はAWSで使いましたが、ほかのクラウドサービスにも対応しているらしいので、あえてTerraform からはじめてみるのも様々なクラウドサービスに対応できていいのかもしれません
## :file_cabinet:まとめ
というわけで、今回はTerraformを使ってみての初心者目線での感想を書いてみました。
私もまだ軽くリソースを何個か作っただけなので、深いことは話せていませんが、少し触っただけでもその使いやすさが伝わってくるいいツールでした！

今回紹介した「terraform plan」と「テンプレート機能」以外にもTerraformには様々なコマンドや便利な機能が数えきれないくらいあります。
ぜひ皆さんも使ってみて、Terraformのすごさを体感してみてください！
英会話(練習)の価値最大化のために何ができるか

# 英会話(練習)の価値最大化のために何ができるか
 
ある英会話コミュニティで英会話トピックを選ぶことになりました。これがなかなか難しく、目的に立ち戻るために、そもそも英会話(練習)って何のためにやっているか改めて考えました。
※英会話は英語での会話と同義になってしまうので、英語の発話力を向上させるために集まって英語を話そうとする試みを以下「英会話練習」とします。

## 目次
1. [はじめに](#はじめに)
2. [英会話練習では何をしているか？](#英会話練習では何をしているか)
   1. [要素](#要素)
      - [英語力の異なる複数人](#1-英語力の異なる複数人)
      - [ある話題をベースに](#2-ある話題をベースに)
      - [英語を発話している](#3-英語を発話している)
3. [英会話練習の価値最大化のためにメンバーとして何ができるか（環境にフレーバーを加える）](#英会話練習の価値最大化のためにメンバーとして何ができるか環境にフレーバーを加える)
4. [英会話練習の価値最大化のために運営者として何ができるか（環境づくり）](#英会話練習の価値最大化のために運営者として何ができるか環境づくり)
 
## 〇英会話練習では何をしているか？
英語力の異なる複数人が、ある話題をベースに、英語を発話している。
 
### 要素
| 要素 | 特徴と影響 | 懸念 | 改善など次に取るべき行動 |
|------|------------|------|--------------------------|
| 英語力の異なる複数人 | - 英語力が異なる（インプット量、コネクション強度、アウトプット速度、精度、視点・視野・視座の調整能力など）<br>- 教師生徒の関係が生まれやすい<br>- 学びの量や速度、視点に差異が生まれる | 有限的なリソース | コミュニティ構築の時点で考慮する |
| ある話題をベースに | - 特定の話題に関する言葉のコネクション強度が上がる<br>- 話題中心に言葉のネットワークが広がる | 過学習の可能性 | - 一般的な話題は数回で十分<br>- 特定の文脈に依存する話題を選ぶ<br>- ビジネスやIT等の具体的なトピックを選定 |
| 英語を発話している | - 発話が目的<br>- 具体的なコミュニケーション形態は不明確<br>- 英文作成能力の向上が主目的 | 機械翻訳・AI翻訳の台頭により英文作成能力の価値が低下 | - 言語の特徴、文化の違い、発話の特徴に注目<br>- ロールプレイングや討論形式の導入<br>- 文化の違いに注目した話題選定 |
 
## 〇英会話練習の価値最大化のためにメンバーとして何ができるか（環境にフレーバーを加える）
- トピック選定で、異文化交流やビジネス/ITなどの、一般的な話題から離れた特定の文脈に依存するものを選ぶ。
- 会話の進行で、各人が役割や目的を意識するように、質問の仕方を工夫する。具体的には、If you were XXXX, what would you do?やAssume that you are XXXX. Then xxxx?やGiven that XXXX, then xxxx?など、仮定を加えて質問をする。
 
## 〇英会話練習の価値最大化のために運営者として何ができるか（環境づくり）
- ロールプレイングや討論形式など、発話形式を指定する。
- レベル分けをして発話練度を整え、レベルに合わせた発話形式を選定する。
- トピックを選んだ人が情報の導入を最初に行う（例えばインドの労働スタイルのトピックを選んだ場合、トピックを選んだ人がインドの労働スタイルの要約や日本との違いなど興味深い情報を導入する）ように、会話進行ステップを規定する。
【UE5】BehaviorTree MoveToタスクにSelfActor以外のObjectKeyが指定できない！？

## MoveToタスクのBlackboardKeyパラメータ

MoveToタスクにはVectorもしくはActorが指定できるとのことだが、
Object型で追加したKeyのTargetActorが候補に出てこない。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3856940/0ba32066-7121-8e93-b137-ede9d0566ef1.png)

最初から用意されてるSelfActorはでてくるのにどうして、、


## 実装を見てみる

調べたところどうやら FBlackboardKeySelector でBlackboardKeyの型を制限しているみたい
```BTTask_BlackboardBase.h
class UBTTask_BlackboardBase : public UBTTaskNode
{
	GENERATED_UCLASS_BODY()

	/** initialize any asset related data */
	AIMODULE_API virtual void InitializeFromAsset(UBehaviorTree& Asset) override;

	/** get name of selected blackboard key */
	AIMODULE_API FName GetSelectedBlackboardKey() const;

protected:

	/** blackboard key selector */
	UPROPERTY(EditAnywhere, Category=Blackboard)
	struct FBlackboardKeySelector BlackboardKey;
};
```


MoveToTaskの実装を見てみる
```BTTask_MoveTo.cpp
UBTTask_MoveTo::UBTTask_MoveTo(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
	NodeName = "Move To";
	INIT_TASK_NODE_NOTIFY_FLAGS();

	AcceptableRadius = GET_AI_CONFIG_VAR(AcceptanceRadius);
	bReachTestIncludesGoalRadius = bReachTestIncludesAgentRadius = bStopOnOverlap = GET_AI_CONFIG_VAR(bFinishMoveOnGoalOverlap);
	bAllowStrafe = GET_AI_CONFIG_VAR(bAllowStrafing);
	bAllowPartialPath = GET_AI_CONFIG_VAR(bAcceptPartialPaths);
	bTrackMovingGoal = true;
	bRequireNavigableEndLocation = true;
	bProjectGoalLocation = true;
	bUsePathfinding = true;

	bStopOnOverlapNeedsUpdate = true;

	ObservedBlackboardValueTolerance = AcceptableRadius * 0.95f;

	// accept only actors and vectors
	BlackboardKey.AddObjectFilter(this, GET_MEMBER_NAME_CHECKED(UBTTask_MoveTo, BlackboardKey), AActor::StaticClass());
	BlackboardKey.AddVectorFilter(this, GET_MEMBER_NAME_CHECKED(UBTTask_MoveTo, BlackboardKey));
}
```

なにやらObject型とVector型で制限していそう…！
……ん？　Object型はさらにActorクラスで制限している！
これが原因っぽい

## 改めて自分の実装を確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3856940/c47dc232-ca4c-6f9e-ac2d-472b0c1d891f.png)

追加したキーのKeyTypeを見てみるとObject以外にさらに設定できそうな項目が…！
Actorクラスを設定したところ、無事MoveTaskの候補にでてくるようになりました！


下記ドキュメントにはちゃんとActor型に設定している項目がありました。。
めんどくさがらずにドキュメントはちゃんと読もう😥

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/behavior-tree-in-unreal-engine---quick-start-guide
Gradio 4.41.0 更新 - ImageEditorまだ治ってない

Gradio3を使ってたら、cross-domainでハマったので、最新にしたら解決した。
# 更新情報
https://www.gradio.app/changelog
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/b4f43322-e7db-6661-3e20-4a90e47555bd.png)

# 解決していない問題
Issue見れば、山程問題あるみたいですが
https://github.com/gradio-app/gradio/issues

１番気になってる、ImageEditorのペイントツールがまだ治ってない。
これがないと、Inpaintツールとかで、画像修正できない。（現在単色なら制御可能？）
StableDiffusionの場合、Inapaintなのに、下絵を修正しないといけないが、今のバグ状態だと不可
【Laravel】MAMP 7 にバージョンアップしたら Laravel で作ったサイトで 404 not found エラー

# エラーの内容

MAMP の新しいバージョン案内があったため、バージョンアップを行いました。
新しい MAMP のバージョンは 7.0
使用しているのは MAMP Pro ではない、Free 版。
新しい MAMP version 7.0 をインストールして、スタート。Webブラウザから Laravel で作ったサイトにアクセスしたところ、トップページは出たものの、その後のログインページで `404 Not Found`

![スクリーンショット 2024-08-09 6.51.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407974/efcca3be-9388-1504-7835-32fe78697ff3.png)

# 原因

MAMP ver7 デフォルトの Apache では `mod_rewrite` モジュールが有効になっていませんでした。

# 修正方法 

httpd.conf ファイルの
```
LoadModule rewrite_module modules/mod_rewrite.so
```
がコメントされていたのを、コメントを外して動作OKとなりました。

# 詳細

MAMP のバージョンアップは過去に何度も行っており、おおよそ自動で過去の /Applications/MAMP ディレクトリを /Applications/MAMP_日付フォルダにリネームしてくれた上、過去の htdocs の下のディレクトリは全て新しい MAMP の下に移動してくれていました。

今回の Version 6 → Version 7 でも同様。

Apache の ポート番号を確認。8888 で変更なし。
MySql のポート番号を確認。8889 で変更なし。

MySQL サーバは version 5.7 と 8.0 が選択できるようになっていたので 5.7 を選択。

一旦そのまま MAMP をスタートさせ、Webブラウザでアクセス。
htdocs の下のフォルダがずらずらと表示されました。私はマルチドメインで仕事をしているので、その設定がしていないのねと、 httpd.conf の
```
# Virtual hosts
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```
を有効にし、`/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf` の VirtualHost を編集

```
<VirtualHost *:8888>
    DocumentRoot "/Applications/MAMP/htdocs/プロジェクト/public/"
    ServerName "local.プロジェクト"
    ErrorLog "/Applications/MAMP/logs/プロジェクト_log"
    CustomLog "/Applications/MAMP/logs/プロジェクト-access_log" common
</VirtualHost>
```

hosts は変更していないので、MAMP だけ再起動して、 Web ブラウザでプロジェクトに再アクセス。

トップページにアクセスし成功。良々と思い、ログインボタンを押したら、

```
404 not found
```

当然入れ替えたのは MAMP だけですので、その設定が変わったのだろうと`httpd.conf` の中を確認.

原因に書いたように URLリライトを行う `mod_rewrite` モジュールがコメントになっていたので、`#` を外し、有効化したら、OKとなりました。
docker-compose: command not found, Error: Process completed with exit code 127. GithubActionsでエラー

学習中の課題をPRする際にGithubActionsを通して行う様になっていますが、前回までのPRでは問題なかったのに突如エラーが発生してPRをすることができなくなったので内容を紹介していきます。

# 1, エラーの詳細
![スクリーンショット 2024-08-09 5.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508918/900244d9-4a2c-b169-3c26-d3af83e93425.png)
発生した状況としてはローカルからリモートへデータをPushした時にGithubActionを通している際に発生したエラーです。
原因としてはDocker compose V1がGithub ActionsのWindowsとUbuntuのイメージで使えなくなったことが挙げられます。
Docker compose V1は2024年4月にV2へ移行したので、V1に属するコマンド(docker-compose)が使えなくなり、エラーの原因となっていました。

```docker:docker.yml
name: "【Docker】Ruby on Rails CI"
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
jobs:
  run-htmlbeautifier:
    name: Run htmlbeautifier
    runs-on: ubuntu-latest
    steps:
    - name: checkout pushed commit
      uses: actions/checkout@v2
      with:
        ref: ${{ github.event.pull_request.head.sha }}
    - name: run htmlbeautifier on docker-compose
      run: |
        docker-compose build #問題となったコード
        docker-compose run --rm web bin/setup #問題となったコード
        docker-compose run --rm web bin/htmlbeautifier #問題となったコード
        git diff --exit-code
```

# 2, 解決策
V1コマンド(docker-compose)コマンドが使えなくなっているので、代わりにV2コマンド(docker compose)へ切り替えました。
これによりエラーは解消され、GithubActionsも正常に動きPRまで完了できました。

```docker:docker.yml(修正後)
name: "【Docker】Ruby on Rails CI"
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
jobs:
  run-htmlbeautifier:
    name: Run htmlbeautifier
    runs-on: ubuntu-latest
    steps:
    - name: checkout pushed commit
      uses: actions/checkout@v2
      with:
        ref: ${{ github.event.pull_request.head.sha }}
    - name: run htmlbeautifier on docker-compose
      run: |
        docker compose build #ハイフンを削除
        docker compose run --rm web bin/setup #ハイフンを削除
        docker compose run --rm web bin/htmlbeautifier #ハイフンを削除
        git diff --exit-code

```

# 3, 参考にした資料
[Docker Compose v1 が GitHub Actions で使えなくなった件](https://engineering.nifty.co.jp/blog/26217)
[Error: docker-compose command not found #116610](https://github.com/orgs/community/discussions/116610)
[[Ubuntu, Windows] Docker Compose v1 will be removed from images on April, 1 #9557](https://github.com/actions/runner-images/issues/9557)

# 4, 気になること
今回、docker composeコマンドを修正することでエラーを解決できたけど、本来このエラーは2024年4月に発生していたはずなのではと考えています。
というのもDocker compose V1からV2への移行がこの時期に行われたので、それと同時に発生しているはずだったのではと推測。加えてエラーが発生したGithubActionsは先月、先々月と使用しているので、その時期に発生しなかったのも不思議です。
これについては新しいことが分かったら記事を更新して紹介したいと思います。

最後まで読んで頂き有難うございました。