OmniAICreator/Qiita-1.07M huggingface dataset:
Apache HttpClient 5のデフォルトリトライ設定

## 発生した問題
HTTP通信処理で、レスポンスステータスが503の場合、意図せずリトライされる。
通信にはRestClient + Apache HttpClient 5を使用しており、リトライ設定は特にしていなかった。
また、リトライはIstioで制御していたため想定外のリトライが発生していた。

## 原因
Apache HttpClient 5の仕様でレスポンスステータスが503、429の場合デフォルトでリトライされるようになっていた

## リトライのデフォルト設定をしている箇所
https://github.com/apache/httpcomponents-client/blob/478b2c9288bb585629b128842227c91929ae4b86/httpclient5/src/main/java/org/apache/hc/client5/http/impl/DefaultHttpRequestRetryStrategy.java#L160

```DefaultHttpRequestRetryStrategy.java
    public DefaultHttpRequestRetryStrategy() {
        this(1, TimeValue.ofSeconds(1L)); // リトライ回数1回を設定
    }

    public DefaultHttpRequestRetryStrategy(
            final int maxRetries,
            final TimeValue defaultRetryInterval) {
        this(maxRetries, defaultRetryInterval,
                Arrays.asList( // リトライ対象外のException
                        InterruptedIOException.class,
                        UnknownHostException.class,
                        ConnectException.class,
                        ConnectionClosedException.class,
                        NoRouteToHostException.class,
                        SSLException.class),
                Arrays.asList( // リトライ対象のHttpStatus
                        HttpStatus.SC_TOO_MANY_REQUESTS,
                        HttpStatus.SC_SERVICE_UNAVAILABLE));
    }    
```


## リトライ判定している箇所
https://github.com/apache/httpcomponents-client/blob/478b2c9288bb585629b128842227c91929ae4b86/httpclient5/src/main/java/org/apache/hc/client5/http/impl/DefaultHttpRequestRetryStrategy.java#L200

```DefaultHttpRequestRetryStrategy.java
    public boolean retryRequest(
            final HttpResponse response,
            final int execCount,
            final HttpContext context) {
        Args.notNull(response, "response");

        // HttpStatusが503, 429で現在の実行回数がリトライ上限を超えていなければリトライ
        return execCount <= this.maxRetries && retriableCodes.contains(response.getCode());
    }
```
## 対応
HttpClientBuilderでbuildする際に、automaticRetriesDisabledを設定することでリトライを無効にできました。
SSL/TLSでサーバ証明書・クライアント証明書のなりすまし防止の仕組み

## はじめに

https://qiita.com/yuta-katayama-23/items/cda5d533a41845a2fa2e

の記事で[Authenticated Origin Pulls (mTLS)](https://developers.cloudflare.com/ssl/origin-configuration/authenticated-origin-pull/)の設定をしていた時にふと以下のようなことを思った。

- クライアント証明書を送ってもらってオリジンサーバで検証するというが、このクライアント証明書を使ってなりすましできるのでは？
- サーバ証明書も同じで、証明書を送ってもらうのだからその証明を別のサーバにおいて、それを送ればなりすましできるのでは？

上記の懸念は全く不要で、証明書だけあっても意味ないことが分かったが、今回はなぜ問題ないのか？について、自身の備忘録の意味で書いていきたいと思う。

:::note warn
TLSハンドシェイクの詳細な流れというよりは、上記の懸念は無用という事がわかるレベルで書いています
:::

## TLSハンドシェイクの流れを理解してなりすましできない理由を理解する

### サーバ証明書だけあっても意味ない理由

ずばり、**共通鍵を作るためのデータ（プレマスターシークレット）を秘密鍵を持っていないと復号できないから**、という事になる。

TLSハンドシェイクの流れを見ていき、どこでサーバ証明書を悪用したなりすましの防止をしているか？を見ていく。まず、TLSハンドシェイクの大まかな流れは以下のようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/cc5aa49f-1f9a-552e-0a32-fcee254e8ab0.png)

SSL/TLSの暗号化は共通鍵方式で、その共通鍵を生成するためにプレマスターシークレットと呼ばれるデータを交換する。このプレマスターシークレットは公開鍵暗号方式で暗号化して安全にやり取りされる。

ここで、サーバ証明書（サーバの公開鍵）を攻撃者が手に入れても、暗号化されたプレマスターシークレットを復号できない。この復号できない、という制限があるからこそ、サーバ証明書があってもなりすましできない理由。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/82774cfc-1417-7e68-d1ea-79bc9eb84a64.png)

### クライアント証明書だけあっても意味ない理由

ずばり、**クライアント証明書の検証のための署名データを作成できないから**、という事になる。

サーバ証明書の部分でみたハンドシェイクの流れの中に、クライアント証明書の検証を書き加えると、以下のような感じになる。サーバ証明書を渡すのと同時に、クライアントあなたの証明書も頂戴というリクエストを送る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/a5762fd2-7795-9c4c-2c34-9f762b82c69c.png)

クライアント証明書を要求されたクライアントは、クライアント証明書と証明書の検証のためのデジタル署名データをサーバに送信する。デジタル署名は秘密鍵で作成し、公開鍵で検証できるもの。

つまり、クライアント証明書（クライアントの公開鍵）を攻撃者が手に入れても、クライアント証明書を検証するための署名データを作成することができない。署名データを作成できない、という制限があることで、クライアント証明書があってもなりすましはできない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/0fe793b6-41a7-167d-2531-360b5036d8d5.png)

- 参考文献
  - [TLS | SSLハンドシェイクの プロセスは？](https://www.cloudflare.com/ja-jp/learning/ssl/what-happens-in-a-tls-handshake/) 
  - [SSL/TLS session negotiation](https://www.infraexpert.com/study/security28.html)

## まとめとして

頭のいい人が考えることはすごいな～と思った。よくできているというのが素直な感想。
まあクレジットカードの情報とかをやり取りできるのもSSL/TLSのおかげなので、その意味を改めて考えれば「はじめに」に書いたような懸念があるはずないか、と思った。
効率的なコードを書くためのガイドライン

### 効率的なコードを書くためのガイドライン

**導入**
-  **変数の利用を減らす**：定数を多く取り入れて、コードの透明性と安全性を高めましょう。
- **純粋関数を多用する**：関数は引数のみを利用し、副作用を避けることで予測可能性を高めます。
- **判定ロジックを関数化する**：コードの可読性と保守性を向上させます。

これらのテクニックは重要ですが、さらに根本的なテーマとして「どのようなコードを目指すべきか」を考えていきます。

## 《パーフェクトなコード》を目指してはいけない理由
- **《パーフェクトなコード》の定義**：コードには《要件》が存在し、最良のコードはその《要件》に依存します。単体で完璧と判断することはできません。
- **《要件》の変化**：市場の変化や計画の変更により、《要件》は頻繁に変わります。そのため、パーフェクトなコードを追求しても無駄になることが多いです。
- **コストの問題**：コストをかけずに完璧なコードを書くことが理想ですが、多くの場合、それはオーバーエンジニアリングとなります。

💡 **重要ポイント**
- 《要件》は頻繁に変わるため、完璧なコードを目指しても無駄になることが多い。
- 完璧なコードにかけたコストは回収不能になることが多い。
- 完璧なコードを目指すのではなく、現実的な範囲で最善を尽くすべき。

## 《必須条件》と《推奨条件》
- **《必須条件》**：必ず達成しなければならない要件です。プログラミング言語や環境の仕様からくる制約も含まれます。実装コストや将来のメンテナンスコストが大きい場合は、修正や取り消しを検討することもあります。
- **《推奨条件》**：達成が望ましいが必須ではない要件です。実装やメンテナンスコストが少ない場合にのみ対応します。

💡 **ポイント**
- 《必須条件》には明確な達成基準が必要です。
- 《推奨条件》は基本的に対応しないが、コストが見合う場合にのみ対応する。

## 目標は《正当性》と《簡潔さ》

**正当性**
- **理論的な正しさ**：コードの理論的な正しさを追求します。例えば、整数を2倍にしたい場合は、ビットシフトを使用するのではなく、適切な方法を選びます。
- **ハックの避け方**：ハックを使う場合は、それによるデメリットを理解し、それが許容される範囲で使用します。

**簡潔さ**
- **過剰な正確性の回避**：必須条件を満たすために過剰な正確性や複雑さを避け、コードの意味的な簡潔さを追求します。
- **コストを掛け過ぎない**：簡潔さを保つためにコストを掛け過ぎないように注意します。

💡 **ポイント**
- **正当性**を保ちながら**簡潔なコード**を目指す。
- 無駄なハックや過剰な正確性を避ける。

## 優先順位
- **《正当性》よりも《簡潔さ》を優先**：正当性を損なわない範囲で簡潔さを重視します。
- **《必須条件》を満たす範囲で《正当性》を追求**：必須条件を満たすために正当性と簡潔さのバランスを取ります。

## 実用的なアプローチ
- **《無駄》や《不完全》を受け入れる**：必要な余裕を持たせ、無駄や不完全さを受け入れることが重要です。
- **後日修正のための余裕を持つ**：情報や理解が揃った時に、必要に応じてコードを修正するための余裕を残します。

💡 **ポイント**
- 無駄を受け入れ、必要な余裕を持たせる。
- 不完全でも丁寧に書いたコードが重要。

## まとめ
結局のところ、「対応する《要件》と《ハック》の使用を必要最小限に控えつつ《丁寧なコード》を書きましょう」というシンプルな結論です。このガイドラインを意識することで、地に足のついたパフォーマンスを発揮できます。

この記事の内容が、あなたのコードを書く上での参考になれば幸いです。
オフライン環境でNuGetパッケージをインストールする

## 1. nuget.org から `.nupkg` ファイルをダウンロードする

オンライン環境で以下のURLにアクセスし、

https://www.nuget.org/

目的のパッケージのページの **Download package** から `.nupkg` ファイルをダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187987/77677285-1643-7ce8-f189-28327ca014f2.png)

依存関係(Dependencies)の `.nupkg` もすべて同様にダウンロードする。

--- ↑ここまでオンライン作業 ---

## 2. nuget.org から `.nupkg` ファイルをダウンロードする

--- ↓ここからオフライン作業 ---

Visual Studio を起動し [ツール]-[NuGetパッケージマネージャー]-[パッケージマネージャー設定] を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187987/2ea973a8-3c17-7ce6-77f3-7bb7279b10c3.png)

パッケージソースにローカルフォルダーを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187987/3bbc0ec6-de2b-ff91-4825-b78b774cde30.png)

※ もしパッケージソースに `https://api.nuget.org/...` などのオフラインで接続できないソースがあるなら、チェックボックスのチェックを外して無効化しておく。

## 3. 最初にダウンロードした `.nupkg` ファイルをパッケージソースに配置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187987/f2fff6c6-9a03-cdf0-fb0c-6a0fb45b645b.png)

## 4. インストールの実行

Visual Studio の [ツール]-[NuGetパッケージマネージャー]-[ソリューションのNuGetパッケージの管理] 画面を開き、[参照] タブを選択。
パッケージソースに [My Package source] を指定すれば、先ほど配置したパッケージの一覧が表示されるのでインストールする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187987/ebad1dae-6984-6eca-0983-9b2c3a62484f.png)
Security Hubのセキュリティ標準にCIS Benchmark v3.0.0が追加されました

## はじめに
私が大好きなSecurity Hubに新たなセキュリティ標準「CIS Benchmark v3.0.0」が追加されました。

## Security Hub セキュリティ標準
セキュリティ標準には、規制のフレームワーク、業界のベストプラクティス、企業ポリシーのコンプライアンスを判断するための一連の要件が含まれています。

Security Hub は、要件をコントロール（検知項目）にマッピングし、各項目のセキュリティチェックを実行して、
セキュリティ標準の要件が満たされているかどうかを評価します。

## CIS Benchmark
CIS(Center for Internet Security)は米国政府機関や企業、学術機関などが運営する非営利団体で、最新のサイバーセキュリティに関するベストプラクティスソリューションを開発・検証しています。

現在、AWSでは以下のCIS Benchmarkがサポートされています。
* v1.2.0
* v1.4.0
* v3.0.0  New!!

## 新規追加項目（v1.4.0との比較）
v1.4.0と比較して、13項目が追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/79703f95-dd92-4c4f-3366-618b2bd980a3.png)

IAM.26「IAM で管理されている期限切れの SSL/TLS 証明書は削除する必要があります。」はバージニア北部リージョンのみでサポートされています。
これは、IAMのコントロールプレーンがバージニア北部にあり、証明書が管理されているためです。

## 削除項目（v1.4.0との比較）
v1.4.0と比較して、15項目が削除されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/b5225e70-dc25-4c59-9fa7-e04bb38bc323.png)

CloudTrail.6「CloudTrail ログの保存に使用される S3 バケットがパブリックにアクセスできないようにしてください。」については、S3.1「S3 ブロックパブリックアクセス設定を有効にする必要があります。」に内包されているので、廃止されたと考えます。

## おわりに
またまたSecurity Hubにアップデートがありました。
皆様もCIS Benchmarkのバージョンアップを検討ください！
Suno AIが知らないうちにV3.5にアップデートされていたというお話し

この記事では、音楽生成AIである「Suno AI」とその最新バージョン3.5について詳しく紹介しています。Suno AIは、ユーザーが歌詞や音楽の雰囲気などの詳細を入力することで、AIが自動的に完全な曲を生成する画期的なツールです。

## Suno AIの特徴と機能

Suno AIは、入力された歌詞と希望する音楽スタイルに基づいて、AIが音楽を生成するシステムです。ユーザーは雰囲気や楽器の選択など、細かい設定をすることができ、自分だけのオリジナル楽曲を簡単に作成できます。

## 最新バージョン3.5の主なアップデート

**1. 曲の長さの拡大**
- 以前のバージョンでは最大2分までしか生成できなかった曲が、最新バージョンでは最大4分まで生成可能になりました。

**2. 各パートの構成品質の向上**
- イントロ、メインパート、エンディングなど、曲の各パートの構成品質が大幅に向上しました。これにより、自然で流れるような楽曲が生成されるようになりました。

**3. 日本語の歌詞対応の向上**
- 日本語の歌詞を読み取り、正確に解釈する能力が向上しました。これにより、日本語の楽曲生成がさらに高品質でやりやすくなっています。

**4. 近々予定されているバージョン4アップデート**
- 近い将来リリース予定のバージョン4では、ユーザーが生成された音楽に自然音を組み込むことができる新機能が追加されます。これにより、より多様な音楽表現が可能になります。

## さいごに
音楽制作に興味のある方や、最新のAI技術に関心がある方にとって、非常に有益な情報に少しでもなれればなと思います。
【VSCode】Code Runnerで実行するときのコマンドを変更させたい

# Code Runnerとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/3897b9fc-2b9f-53a7-5d1e-a6bcedc48330.png)
そもそも`Code Runner`とは、JavascriptやPythonなどを、vscode内のボタンをクリックするだけで実行できるという優れものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/550a5318-4630-0cb6-7a14-198582acec7f.png)
これを押せば実行できます。

しかし、自分の環境にあっていないコマンドで実行しようとしてくる場合があります。
僕の場合は、Python3を使用しているのでPythonを実行するときには
```cmd
$ python3 file.py
```
とする必要があり、`Code Runner`のpythonを実行する標準のコマンドが
```cmd
$ python file.py
```
なので実行できずにエラーが発生するわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/d107a6ba-ecf8-e2c7-bb86-7ab8545da13c.png)

# コマンドの変更方法
このままでは実行できないので設定を変えます。
途中、難しそうに見えるコードが出てきますが別に身構える必要はありません。
|手順|説明|参考|
|---|---|---|
|1|Macの場合は`Command + ,`<br>Windowsの場合は`Ctrl + ,`のショートカットを実行し、設定を開きます。|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/487debaf-c456-e2bc-1b8e-763a020ebbaa.png)|
|2|検索欄で`Code Runner Excutor Map`と検索します。|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/6bffb2d3-04fb-3cbe-2895-f4b09a516c11.png)|
|3|出てきたら、`setting.jsonで編集`をクリックします。|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/1dba830d-b22d-9d6c-f0e5-c87f0db5cc48.png)|
|4|すごい散々なコードらしきものが出てきましたが、やることは簡単です。<br><br>実行のコマンドを変更したい言語またはライブラリ名を見つけて、右側の文字列で実行するときのコマンドを変更することができます。<br><br>僕の場合は、`python`の欄を`python3 -u`に変更しました。|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/d7e06019-bd0a-bc06-1fbb-077eec2ebc0b.png)|
|5|書き換えたら保存して、閉じちゃって大丈夫です。||

これで変更することができました。

# 最後に
`Code Runner`、超便利なのでぜひ使ってみてください！
【雑メモ】Reactの公式ドキュメントを読んでみて

# はじめに

自身の忘備録として投稿しています。
Reactの公式ドキュメントを読んで、覚えておいた方がいいなって感じた点の雑なメモ集です。


# メモ集
・***コンポーネントは純関数に保つ***
純関数とは、同じ入力には毎回同じ出力をして、レンダー前に存在するオブジェクトや変数を変更しないもの

・レンダーは厨房での料理みたいなもの
　表示はDOMへのコミットで、料理を提供するようなこと

・***propsに関数を渡す際、関数が実行されてしまう状態で渡したらいけない
　だから引数が必要なときは、無名関数で包んで関数を渡している***

・イベントは伝播されるから、それを停止するやつもある

・イベントハンドラは純関数である必要がなく、副作用を持っても良い

## State周り

・***コンポーネントは初回と、stateの変更時にレンダーされる***

・***ローカル変数の変更はレンダーをトリガーしない、レンダー間で値を保持しない***

・***stateのセットは、現在のstateを変更するのではなく、レンダーをトリガーするだけ***
stateはその値自体を変えてる訳ではなく、再レンダー中に置き換えられている

・***イベントハンドラ内の全てのコードが実行されるまで、再レンダーは待機される***
　→バッチ処理

・更新用関数
　n => n + 1

・***stateは読み取り専用で利用する***

・***オブジェクトや配列は値を直接変えることもできるけど、それはせず置き換えるべき***
値が直接変えられても、stateセット関数が使われてないから再レンダーされないため、動作が不確かになる


・popやpushなどのミュータブルなメソッドは使うべきじゃない、スプレッド構文とかfilterをつかう

・***スプレッド構文は深さが1しかない、ネストされてる場合はそれごとに書く必要がある***


・***不要なstateの見分け方***
　stateで矛盾が生じないか　
　他のstateから得られる値ではないか
　他のstateの逆の値ではないか

・同時に更新する２つのstateはまとめてしまう、座標のx.yとか

・重複を持つstateは避ける

・***コンポーネントがUIツリーのなかで同じ位置にレンダーされてる間はstateを保持する***

・コンポーネントは常にトップレベルで定義

・***keyによって、位置が同じであっても異なったコンポーネントだと認識させれる***

・stateの穴掘り作業（深いstateの受け渡し）の対策として、コンテクストが使える　

## Ref周り

・***コンポーネントに値を持たせたいけど、レンダーをトリガーしたくない場合はRefが使える***
stateはレンダーをトリガーしてしまう

・ノードにフォーカスしたり、スクロールさせたり、サイズや位置の測定にDOMを直接操作する必要がある
→***Ref***の出番

・情報がイベントハンドラ内のみ必要で、再レンダー不要の時はRefが有効

・以下のようにすると、myRef.currentに対応するDOM(この場合はdiv)を入れることができる
```react
<div ref={myRef}>
```


・基本的にRefは独自コンポーネントには割り当てない

## Effect周り

・***何かを変える時は基本イベントハンドラを使う、useEffectは最終手段***

・useEffectは外部システムとreactを同期させるのに使われることがある
エフェクトはブラウザ API、サードパーティのウィジェット、ネットワークなど外部システムとの同期に使われる

・***エフェクトはコミットの最後、画面の更新後に実行される***

・***アンマウント関数の不足を認識しやすいように、開発環境ではuseEffectがマウント時に2回実行される***

・イベントのリッスンや、何らかへの接続をuseEffect内で行い、クリーンアップ関数がなければそれが積み重なってしまう

・アプリケーションの初期化はコンポーネントの外に置く、これでブラウザがページを読み込んだ時に一度だけ実行される、使いすぎは注意

・***stateやpropsの変更を監視するためにuesEffectを使う必要はない***
→非効率だし、stateが変更された時にレンダーがトリガされるからuseEffectがなくても更新される

・処理が重くて、特定のstateの変更のみにその処理を行いたい場合は***useMemo***を使う

# おわりに
気になった点があれば、まだ書き足していくと思います。

知ったつもりでいても、実際読んでみると理解が深まって楽しいですね。
Redeclaration: PackageInfoPlugin


Flutterアプリ開発中ローカルブランチにリモートブランチをマージした後、ビルドしようと思ったときに起きたエラー

## 🚑エラー内容

```
e: /Users/なまえ/.pub-cache/hosted/pub.dev/package_info_plus-7.0.0/android/src/main/kotlin/dev/fluttercommunity/plus/packageinfo/PackageInfoPlugin.kt: (16, 7): Redeclaration: PackageInfoPlugin
e: /Users/なまえ/.pub-cache/hosted/pub.dev/package_info_plus-8.0.0/android/src/main/kotlin/dev/fluttercommunity/plus/packageinfo/PackageInfoPlugin.kt: (16, 7): Redeclaration: PackageInfoPlugin
```

## 🩹エラー対処

1. `.pub-cache`を削除する
1. `$ flutter pub get`

Finderから`.pub-cache`を削除しました。

🎀**隠しファイルの表示方法**
    Macの場合：　「command」+「shift」+「.」

## ✏️他試したこと

 - `$ flutter clean`
 - 該当ライブラリ(今回の場合`package_info_plus`)を２重で依存関係に追加していないか

→ 全部失敗

## 最後に
過去のキャッシュが残ってたぽい
moonはプロジェクトの言語をどう認識するか

今回は、モノレポ管理ツールであるmoonがプロジェクトの言語をどのように認識するかについて解説します。

## moonとは？

moonはモノレポ管理ツールです。モノレポとは、複数のプロジェクトやパッケージを一つのリポジトリで管理する手法です。moonはこれらのプロジェクトを効率的に管理し、ビルドやテスト、デプロイなどのタスクを統合的に行うためのツールです。プロジェクト間の依存関係を管理し、リポジトリ全体の一貫性を保ちながら開発効率を向上させます。

詳細はこちら: [moon公式サイト](https://moonrepo.dev/)

## 言語情報の管理

moonでは各プロジェクトごとに言語情報を持ち、言語によって実行するタスクを選択します。プロジェクトの言語情報は、`moon.yml`ファイルの`language`フィールドに記述することで設定できます。

例: TypeScriptプロジェクトの場合

```yaml
language: typescript
```

この設定により、タスクファイル`.moon/tasks/typescript.yml`で定義されたタスクがそのプロジェクトに対して実行されます。これは、タスク継承 (Task inheritance) という機能です。詳細は[こちら](https://moonrepo.dev/docs/concepts/task-inheritance)をご覧ください。

## 言語が指定されていない場合

`moon.yml`で言語が指定されていない場合、moonはプロジェクトのファイルを解析し、自動的に言語を特定します。moonの賢い設計により、特定のファイルに基づいてプログラミング言語を決定します。

## 言語検出の仕組み

moonはプロジェクトのルートディレクトリに存在する特定のファイルに基づいて、プロジェクトのプログラミング言語を決定します。以下に各言語の判定方法を示します。

### 1. Goファイルのチェック

以下のファイルが見つかった場合、プロジェクトの言語をGoと判定します。

- `go.mod`
- `go.sum`
- `g.lock`
- `.gvmrc`
- `.go-version`

### 2. PHPファイルのチェック

以下のファイルが見つかった場合、プロジェクトの言語をPHPと判定します。

- `composer.json`
- `composer.lock`
- `.phpenv-version`
- `.phpbrewrc`

### 3. Pythonファイルのチェック

以下のファイルが見つかった場合、プロジェクトの言語をPythonと判定します。

- `requirements.txt`
- `constraints.txt`
- `pyproject.toml`
- `.pylock.toml`
- `.python-version`
- `Pipfile`
- `Pipfile.lock`
- `poetry.toml`
- `poetry.lock`

### 4. Rubyファイルのチェック

以下のファイルが見つかった場合、プロジェクトの言語をRubyと判定します。

- `Gemfile`
- `Gemfile.lock`
- `.bundle`
- `.ruby-version`

### 5. Rustファイルのチェック

以下のファイルが見つかった場合、プロジェクトの言語をRustと判定します。

- `Cargo.toml`
- `Cargo.lock`
- `.cargo`
- `rust-toolchain.toml`
- `rust-toolchain`

### 6. TypeScriptファイルのチェック

以下のファイルが見つかった場合、プロジェクトの言語をTypeScriptと判定します。

- `tsconfig.json`
- `tsconfig.tsbuildinfo`

また、Denoファイルもチェックします。

- `deno.json`
- `deno.jsonc`
- `deno.lock`
- `.dvmrc`

### 7. JavaScriptファイルのチェック

以下のファイルが見つかった場合、プロジェクトの言語をJavaScriptと判定します。

- `package.json`
- `.nvmrc`
- `.node-version`
- `package-lock.json`
- `.npmrc`
- `.pnpmfile.cjs`
- `pnpm-lock.yaml`
- `pnpm-workspace.yaml`
- `yarn.lock`
- `.yarn`
- `.yarnrc`
- `.yarnrc.yml`

また、Bunファイルもチェックします。

- `bunfig.toml`
- `bun.lockb`
- `.bunrc`

### 8. どのファイルも見つからない場合

特定のファイルが見つからない場合、プロジェクトの言語を不明と判定します。

この仕様により、プロジェクト内のファイル構成に基づいてプログラミング言語を判定します。詳細は[こちら](https://github.com/moonrepo/moon/blob/master/crates/platform-detector/src/project_language.rs)で確認できます。

## 明示的に言語を指定する場合

moonにプロジェクトの言語を推定してほしくない場合は、`moon.yml`の`language`フィールドを明示的に指定することをおすすめします。ただし、`language`に`unknown`を指定すると上記の検出機能が動作するため、`unknown`以外を指定することが重要です。

この記事が、moonの言語認識の仕組みについての理解を深める助けとなれば幸いです。
CentOSでMySQLをインストールした際の作業メモ

# はじめに



### 環境などなど
- サーバ
    - OS：CentOS 7.9
    - ホスト名：CentOS


# サーバ側の作業



## rootユーザーの作業



### MySQLのインストール



#### MySQLのインストール確認
```
[root@CentOS ~]# yum list installed | grep mysql
```



#### MySQLのリポジトリを追加
```
[root@CentOS ~]# yum install https://dev.mysql.com/get/mysql84-community-release-el7-1.noarch.rpm
Loaded plugins: langpacks
～略～
Is this ok [y/d/N]: y
～略～
Complete!
[root@CentOS ~]# 
```



#### MySQLのインストール
```
[root@CentOS ~]# yum install mysql-community-server mysql-community-client
Loaded plugins: langpacks
～略～
Is this ok [y/d/N]: y
Downloading packages:
～略～
Is this ok [y/N]: y
Complete!
[root@CentOS ~]# 
```



#### MySQLサービスの起動
```
[root@CentOS ~]# systemctl is-enabled mysqld
enabled
[root@CentOS ~]# systemctl is-active mysqld
inactive
[root@CentOS ~]# systemctl start mysqld
[root@CentOS ~]# systemctl is-active mysqld
active
[root@CentOS ~]# 
```



### MySQLのrootユーザーのパスワード設定



#### 初期パスワードの確認
```
[root@CentOS ~]# grep 'temporary password' /var/log/mysqld.log
2024-05-30T00:41:06.549673Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: **********
[root@CentOS ~]# 
```



#### MySQLへログイン
```
[root@CentOS ~]# mysql -u root -p
Enter password: **********
mysql> 
```



#### パスワードの変更
```
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '**********';
Query OK, 0 rows affected (0.02 sec)
mysql>  
```



### その他



#### 文字コードの確認
```
mysql> show variables like '%char%';
+-------------------------------------------------+--------------------------------+
| Variable_name                                   | Value                          |
+-------------------------------------------------+--------------------------------+
| character_set_client                            | utf8mb4                        |
| character_set_connection                        | utf8mb4                        |
| character_set_database                          | utf8mb4                        |
| character_set_filesystem                        | binary                         |
| character_set_results                           | utf8mb4                        |
| character_set_server                            | utf8mb4                        |
| character_set_system                            | utf8mb3                        |
| character_sets_dir                              | /usr/share/mysql-8.4/charsets/ |
| validate_password.changed_characters_percentage | 0                              |
| validate_password.special_char_count            | 1                              |
+-------------------------------------------------+--------------------------------+
10 rows in set (0.01 sec)
mysql> 
```
ゲーム開発コミュニティに参加することの利点とその見つけ方

ゲーム開発コミュニティに参加することは、クリエイターにとって多くのメリットをもたらします。今回は、コミュニティ参加の利点とコミュニティの見つけ方について詳しく紹介します。

## ゲーム開発コミュニティに参加する利点

**1. 一人ではないことを実感する**  
ゲーム開発は時に孤独な作業になりますが、コミュニティに参加することで「一人ではない」と感じられます。仲間の存在はモチベーションを維持し、困難な時期も乗り越えやすくなります。

**2. 無料のプレイテストとフィードバック**  
コミュニティでは、開発中のゲームをプレイテストしてもらい、無料でフィードバックを受け取ることができます。これにより、ゲームの質を向上させる貴重な意見を得ることができます。

**3. 同じ興味を持つ人々と出会う**  
共通の趣味や目標を持つ仲間と出会えるのも大きな利点です。アイデアの共有やコラボレーションの機会が増え、クリエイティブな刺激を受けることができます。

## ゲーム開発コミュニティを見つける方法

**1. Meetup.com等のゲーム開発コミュニティサイトでグループを検索**  
Meetup.com等のゲーム開発コミュニティサイトは、さまざまなゲーム開発関連のミートアップやグループを見つけるのに最適です。多くのコミュニティサイトには数多くのユーザーグループが存在し、定期的に集まって情報交換や協力活動を行っています。

**2. 地元のオンラインフォーラムやディスカッションに参加**  
地元のゲーム開発コミュニティに関する情報は、オンラインフォーラムやソーシャルメディアのディスカッションで見つけることができます。これらのプラットフォームでは、イベント情報やメンバーの意見交換が活発に行われています。

**3. コミュニティの規模を考慮**  
住んでいる都市の規模も重要です。小さな都市ではミートアップの数が少ないかもしれませんが、自分でコミュニティを始めるのも一つの方法です。小規模なコミュニティでも、積極的に活動することで大きな影響を与えることができます。

## ゲーム開発コミュニティの運営における課題

**1. ミーティングの会場確保の難しさ**  
適切なミーティングの会場を見つけるのは簡単ではありません。会場の確保には時間とコストがかかることが多いです。

**2. イベントへの参加者を継続して呼び戻す難しさ(リピーター確保)**  
初回参加者を次回も参加させるためには、魅力的なコンテンツや活動を提供する必要があります。参加者の関心を引き続けることは、運営者にとっての大きなチャレンジです。

**3. 対面イベントへの参加に対する抵抗感**  
一部の人は対面イベントに参加することに抵抗を感じるかもしれません。特にオンライン活動が増えている現代では、対面イベントの重要性をどのように伝えるかが課題となります。

## まとめ
今回は、コミュニティに参加する利点や、どのようにして適切なコミュニティを見つけるかについて、多くの有益なアドバイスを提供しました。ゲーム開発者としての成長と成功を目指すなら、ぜひコミュニティに参加してみるのも良いかもしれません。
EC2 上で動くECS Task から外界のインターネットに接続できないときにハマったこと

## 概要

タイトルのままです。

ECSクラスターを作成し、そのクラスターの中にEC2を立て、
そのEC2を使ってタスク定義からECSタスクを起動すると、そのECSタスクから外界に接続できないエラーとなり、ハマっていました。


## 症状
EC2は起動テンプレートを利用して作成していました。
また、ECSのネットワークはawsvpc を利用しており、エラーとなっていたのでその後bridgeにしました。

やりたかったことは、ECSタスクからS3にアクセスしてファイルをダウンロードすることでした。
が、エラーとなっていたので、以下のことを試しました。

1. EC2にSSHして、EC２からS3にアクセスできることを確かめる（できた）
2. ECS Task に EC2からDocker exec し、pythonのrequests などを送ってyahoo.co.jp とかにそもそも接続できるかやった（エラーとなった）


## 解決策

EC2を起動テンプレートから作成していたのですが、
その起動テンプレートに紐ついているSubnetをパブリックにすることで解決しました。
また、ECSネットワークはbridge にしました。
その際、タスク定義に書くEC2とのポートマッピングは空欄で大丈夫でした。

以上。
職場で不機嫌な人を見つけたときの対処法

この記事では職場で不機嫌な人に遭遇したときの対処法を紹介しています。皆さんの職場において少しでもこの記事が役立てればなと思います。

## 不機嫌な人への対処法

**1. 冷静に対応する**
相手の不機嫌な態度に惑わされず、冷静に対応することが重要です。感情的にならずに相手の気持ちを理解しようと努めることで、より建設的なコミュニケーションが可能となります。

**2. コミュニケーションを取る**
相手がなぜ不機嫌なのかを聞き出し、共感的に話し合うことで、状況を改善できる可能性があります。相手の気持ちを理解し、一緒に解決策を見つけることが大切です。

**3. 自分の気持ちを伝える**
相手の不機嫌な態度が自分にどのような影響を与えるかを丁寧に伝えることも重要です。相手の行動が自分に及ぼす影響を共有し、お互いに理解し合うことで、より良い関係を築けます。

**4. 上司に相談する**
もし状況が改善されない場合は、上司に相談するのも一つの方法です。上司に状況を説明し、適切な対応を求めることで、組織全体で問題解決に取り組むことができます。

## 不機嫌な人への理解

**ストレスの影響**
不機嫌な人の背景には、仕事や私生活でのストレスが隠れていることがあります。(世間では最近、これを「**隠れ我慢**」と呼ばれています。)ストレスが高まると人は不機嫌になりやすく、その原因を理解することが大切です。

**性格の違い**
人それぞれ性格が異なるため、ある人にとって「不機嫌」に見える態度が、別の人にとっては普通の反応である可能性もあります。相手の性格の違いを理解することが、対処の第一歩です。

**コミュニケーション不足**
職場での人間関係が希薄だと、お互いの気持ちが伝わりにくくなり、不機嫌な態度に繋がることがあります。密なコミュニケーションを取ることで、お互いの理解が深まり、不機嫌な態度も減るかもしれません。

## 職場の雰囲気を良好に保つ

**自分から働きかける**
不機嫌な人に対して、自分から働きかけて良好な関係を築くことが大切です。相手の気持ちに寄り添い、建設的な対話を心がけましょう。

**上司の役割**
<span style="color:red">上司は職場の雰囲気を良好に保つ責任があります。</span>上司が適切に介入し、組織全体で問題解決に取り組むことが重要です。

**組織全体での取り組み**
個人の努力だけでなく、組織全体で不機嫌な人への対応策を検討し、実践することが望ましいでしょう。組織全体での協力が、より良い職場環境を築く鍵となります。

## まとめ
職場での人間関係は複雑ですが、お互いの理解と協力があれば、良好な職場環境を築くことができるでしょう。この情報が皆さんのお役に立てば幸いです。
正規分布（ガウス分布）曲線

# はじめに
　Processingには正規分布に基づいた乱数生成関数randomGaussian()がある。しかし、曲線をパッと作る機能はなかったので、とりあえず用意した。

![Gaussian.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/21c14c72-9b57-b2e5-d89b-62e4b81c1cba.png)

```java:Processing
size(1000, 600);
noFill();
float sig = 1;
float u = 0;
translate(500, 500);
scale(100);
strokeWeight(0.01);

beginShape();
for (float x = -5; x < 5; x+=0.01) {
  float f = 1f/sqrt(2f*PI)/sig*exp(-(x-u)*(x-u)/2f/sig/sig);
  f*=10;
  curveVertex(x, -f);
}
endShape();
```
※この画像のグラフは、横は-5〜5、縦は-0.5〜0.1となっている。つまり、かなり、上下方向に拡大されている。

式を簡略化した場合。
```java:Processing
size(1000, 600);
noFill();
translate(500, 500);
scale(100);
strokeWeight(0.01);

beginShape();
for (float x = -5; x < 5; x+=0.01) {
  float f = 4*exp(-x*x/2f);
  curveVertex(x, -f);
}
endShape();
```


さらに、計算量少なそうな式に変更。
```java:Processing
size(1000, 600);
noFill();
translate(500, 500);
scale(100);
strokeWeight(0.01);

beginShape();
for (float x = -5; x < 5; x+=0.01) {
  float f = 4/(1+x*x);
  curveVertex(x, -f);
}
endShape();
```
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/8af5242c-3209-4ee3-2bc9-4fc70e2d09b6.png)
Intel MacからApple Silicon Macにそのまま移行したら失敗だった話

# 前書き
業務で使用している MacbookAir で node, python のインストールができなくなっていた。原因としては intel CPU の MackbookAir から Apple Silicon の MacbookAir に移行を行ったことだった。

# intel Mac から Apple Silicon Mac への移行
デフォルトで使用できる移行アプリを使用した。
（ローカルに重要なデータは保存してなかったので、ここで一から環境構築すればよかった。）

以降後に必要なライブラリなどが使用できることを確認して問題ないと判断しました。しかし、新たにnodeやpythonをインストールしようとするとエラーがでてインストールできなかった。（ここで問題発覚）

# 問題はパッケージのインストール先の違い

intel Mac では `/usr/local/bin` 配下にインストールされる。
Apple Silicon では `/opt/homebrew/opt` 配下にインストールされる。

私の環境では念の為再インストールを行っていたのか、両方にインストールされていた。Pathも2つ登録されており、どちらが優先されていたのかは不明である。

（Rosettaを使用して2つの環境を使い分けをするなどできるらしいが、今のところ必要性を感じないのでやめておく。）

# パッケージ依存問題の解消
解決方法としては、homebrew, nodenv, pyenv を再インストールすることで解決した。

1 . 既存のhomebrew, nodenv, pyenv の削除
```text:commandline
$ rm -r /usr/local/bin/homebrew
$ rm -r /usr/local/bin/nodenv
$ rm -r /usr/local/bin/pyenv
```

2 . 再インストール
homebrew のインストール（https://brew.sh/ja/）

```text:commandline
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

nodenv のインストール

```text:commandline
$ brew install nodenv

# パスの設定（zshの場合）
$ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(nodenv init -)"' >> ~/.zshrc
```

pyenv のインストール

```text:commandline
$ brew install pyenv

# パスの設定（zshの場合）
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

上記の操作によりパッケージが`/opt/homebrew`に集約され、動作するようになった。

```text:commandline
# nodeのインストール
$ nodenv install 18.16.0

# pythonのインストール
$ pyenv install 3.11.3
```


# まとめ
現在ではintel Macからの移行はレアケースになりつつあるが、intel → Apple Silicon への移行ではパッケージの依存関係で不具合が生じる可能性があることを実感した。このような場合は、移行アシスタントを使用することは避け、一から環境構築を行ったほうがよい。

# 参考文献
homebrew

https://zenn.dev/ackylarkham/articles/c93d5ed1689459

https://zenn.dev/omakazu/scraps/b3a4be96741a22

pyenv

https://nonakayasuo.com/python38-pyenv-error/

https://note.com/t_ak66/n/nc251eaef6523
Canva Create 2024 アップデート内容

先日開催されたCanva Create 2024イベントで発表された最新アップデートについての詳細をお伝えします。

## AIアップデート

**1. Magic Create**
- **機能概要**: ユーザーがプロンプトとスタイルを指定することで、AIが画像を生成できるようになります。
- **利用制限**: 無料プランでは月に50件、Canva Proでは月に500件の画像生成が可能になります。


**2. Magic Create for Graphics**
- **機能概要**: ユーザーはプロンプトとスタイルを指定して、グラフィックデザイン要素を生成できるようになります。


## UIアップデート

**1. 動画編集の簡素化**
- **機能概要**: ユーザーは動画をモックアップに挿入し、位置やサイズを調整できるようになります。


**2. プレゼンテーション用の画像のスマートな選択**
- **機能概要**: Canvaは、選択したテンプレートに基づいてカラーパレットやフォントを自動で推奨します。これにより、ユーザーは簡単にプレゼンテーションの見た目を変更できるようになります。

**3. 長い動画の要約**
- **機能概要**: Canvaは、長い動画を自動で短いクリップに要約できるようになります。


これらの新しいUIアップデートは近日中にリリースされる予定ではありますが、具体的な日付については言及されていませんでした。

## 全体の印象

これらのアップデートについて非常に前向きであり、Canvaがより使いやすく、かつ強力なツールになることが予想されます。新機能の導入により、ユーザーはさらに創造的なデザインを手軽に作成できるようになるでしょう。

これからのCanvaの進化が楽しみですね。
毎日ABC day7【c++】ABC339 A-C問題解説【ACコード付き】

# AtCoder Beginner Contest 339

https://atcoder.jp/contests/abc339

## A - TLD
英小文字と `.` のみからなる文字列$ 
S $が与えられます。$
S $を `.` で分割したときの末尾の文字列を出力してください。

文字列の中で1つ以上`.`が含まれることは保証されている。
一番後ろから探索し、`.`の位置以降の文字列をsubstr関数で切り出す。

```cpp
int main()
{
	string s;
	cin >> s;
	int i = s.size() - 1;
	while (i >= 0)
	{
		if (s[i] == '.') break;
		i -= 1;
	}
	cout << s.substr(i + 1) << endl;
	return 0;
}
```


## B - Langton's Takahashi
$H$ 行 $W$ 列のグリッドがあり、はじめすべてのマスが白で塗られています。グリッドはトーラス状（右端と左端は繋がっている、上端と下端は繋がっている）の時、以下の操作を$N$回繰り返した盤面を出力せよ。最初は左上のマスにいて、上を向いています。

`現在のマスが白だったら黒で塗り替えて、時計回りに90度回転して1マス進む、現在のマスが黒だったら白で塗り替えて、反時計回りに90度回転して1マス進む`

自分の向きをdirection,位置をCplaceで管理しながら操作をしていく。ここではboardを1次元配列で管理したが、配列の外にindexがいかないように注意。

```cpp
int H, W, N;
vector<string> board;

int main()
{
    // 入力と盤面の初期化
    cin >> H >> W >> N;
    board.resize(H * W + 1, ".");
    int direction = 1; // 1: 上, 2 : 右, 3 : 下, 4 : 左
    int Cplace = 1; // 現在の場所
    // N回の操作
    for (int i = 0; i < N; i++)
    {
        if (board[Cplace] == ".")
        {
            board[Cplace] = "#";
            direction = (direction % 4) + 1;
        }
        else
        {
            board[Cplace] = ".";
            direction = (direction + 2) % 4 + 1;
        }

        if (direction == 2) // 右
        {
            if (Cplace % W != 0) Cplace++;
            else Cplace -= (W - 1);
        }
        else if (direction == 4) // 左
        {
            if ((Cplace - 1) % W != 0) Cplace--;
            else Cplace += (W - 1);
        }
        else if (direction == 3) // 下
        {
            if (Cplace <= (H - 1) * W) Cplace += W;
            else Cplace -= (H - 1) * W;
        }
        else if (direction == 1) // 上
        {
            if (Cplace > W) Cplace -= W;
            else Cplace += (H - 1) * W;
        }
    }
    // 出力
    for (int i = 1; i <= H * W; i++)
    {
        cout << board[i];
        if (i % W == 0) cout << endl;
    }
    return 0;
}
```

## C - Perfect Bus

乗客の数が常に非負整数となるバスが$N$回停留所に停まった。それぞれの停留所での人の上限が与えられる時、現在のバスの乗客の最低値はいくらか。

常に0以上を保ちながら各停留所で人が乗り降りしているということなので、0にならないだけの人数が最初に乗っていたことになる。今回の問題のケースだと、マイナスになる部分で乗客が0人の場合が最小値となるので、現在の乗客数がマイナスになる時には自動的に0で補完してあげると最終的に最小の答えが求まる。

```cpp
int N;
long long A[200009];
long long Cpassenger;

int main()
{
	// 入力
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> A[i];
	}
	// 途中で負の数にならないように注意
	Cpassenger = 0;
	for (int i = 0; i < N; i++)
	{
		Cpassenger += A[i];
		if (Cpassenger < 0)
		{
			Cpassenger = 0;
		}
	}
	cout << Cpassenger << endl;
	return 0;
}
```
Amplify v6に更新してログインできなくなった話

# 前書き
Amplify でホスティングしているページでログインできない問題が発生した。

# エラー内容

```text:console
> UserAlreadyAuthenticatedException: There is already a signed in user
```

![Monosnap Image 2024-05-19 18-15-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524922/8d5966a0-82d6-7c37-1dd4-2e0d69a9df11.png)

`Amplify/Auth` ですでにサインイン済みの状態になっていることがわかった。
サインイン済みの状態でログインページからサインインをしようとするとこのエラーが発生する。
どうやらブラウザバックなどでログインページに遷移した場合、サインイン済みの状態でログインページへ遷移してしまうようだった。

```typescript: 修正前
import { signIn, type SignInInput, type SignInOutput } from "aws-amplify/auth";

// サインイン処理
async function handleSignIn(): Promise<void> {
    // サインイン情報を作成
    const signInInput : SignInInput = {
      username: userId.value,
      password: password.value
    }
    // サインインを実施
    const signInOutput : SignInOutput = await signIn(signInInput);
}
```

# 原因と解決手段
少し前に Amplify v6 へのマイグレーションを行ったことに起因すると考えられる。v6 では `fetchAuthSession` への変更が中心となっており、ログインページ周りでもロジックの修正が必要となる。本件では最後にサインインしたユーザ情報を維持してしまっているため、サインイン処理を実行する前にサインイン情報を持っているか判定し、ある場合は一度サインアウトを実施する必要がある。


```typescript: 修正後
import { signIn, type SignInInput, type SignInOutput, signOut, fetchAuthSession } from "aws-amplify/auth";

// idTokenが存在する（サインイン済み）場合、サインアウトする
const idToken = (await fetchAuthSession()).tokens?.idToken;
if (idToken) {
    await signOut();
}

// サインイン処理
async function handleSignIn(): Promise<void> {
    // サインイン情報を作成
    const signInInput : SignInInput = {
      username: userId.value,
      password: password.value
    }
    // サインインを実施
    const signInOutput : SignInOutput = await signIn(signInInput);
}
```

# あとがき
サインインされた状態を維持するのは望ましくないので、`onUnmounted` 時にサインアウトするようにするなど他の対処も必要かもしれない。


# 参考文献
https://docs.amplify.aws/gen1/vue/

https://tech.route06.co.jp/entry/2024/04/08/122004
AWS Glue 増分クローラーでハマったこと

## 最初に結論

### ハマったこと
AWS Glueの増分クローラーを使うときはデータソース（S3）にデータがない状態で初回実行してしまうと2回目以降のクロールでもスキーマ作成されずパーティション更新もされない。

### 回避するためには？

1. 初回実行前にデータを入れておく
2. 増分クローラーを使うのをやめる
3. テーブルやスキーマ作成部分をGlueに任せるのをやめる

## 背景

DBからS３バケットにデータを流し込んでAthena検索できる環境を構築するためにAWS GlueのCrawlerを使ってデータカタログテーブル作成・更新をしていました。

Crawlerを使えばパーティションキーをはじめとするテーブル情報の作成と更新を自動でやってくれるのでAthena検索をスムーズに行えるわけです。

ただ、Crawlerも万能ではないため性質を理解した上で使う必要があります。

## クローラーの仕組み

> クローラーを実行すると、クローラーは以下のアクションを使用してデータストアを調査します。
> ・生データの形式、スキーマ、および関連プロパティを確認するためにデータを分類する – カスタム分類子を作成して分類の結果を設定できます。
> ・データをテーブルまたはパーティションにグループ化する – データはクローラーのヒューリスティックに基づいてグループ化されます。
> ・メタデータをデータカタログに書き込む – クローラーでテーブルやパーティションを追加、更新、削除する方法を設定できます。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/crawler-running.html

#### 分類子

メタデータテーブル（テーブルのスキーマも含む）を定義する際にデータの形式を評価してスキーマを推測してくれるのが分類子です。

クローラーが実行されると、最初にデータストアを正しく認識した分類子が、テーブルのスキーマを作成するために使用されます。組み込みでの提供もありますし、カスタムすることもできます。

#### パーティション

クロール対象のS3バケットパスはあらかじめ指定しておくのですが、この配下にあるオブジェクトのスキーマのおおよそが類似している場合、クローラーはテーブルを個別で作成せずにパーティションを作成するわけです。

仮にパーティション毎に微妙にデータ型が異なっているにも関わらず、クローラーの判断でテーブルを分けなかった場合どうなるのかというと、スキーマの不一致でAthena検索がうまくできないことがあります。

> Athena がクエリを実行するときは、テーブルのスキーマと、クエリに必要なパーティションのスキーマを検証します。この検証では、列のデータ型を順に比較し、重複する列のデータ型が一致することを確認します。これにより、テーブルの中間で列が追加/削除されるなどの予期しないオペレーションが防止されます。パーティションのスキーマがテーブルのスキーマと異なることを Athena が検知した場合、Athena はクエリを処理できない可能性があり、HIVE_PARTITION_SCHEMA_MISMATCH で失敗します。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/glue-best-practices.html#schema-syncing

こうなるとS3のデータを削除して、`MSCK REPAIR`を実行してパーティションを作り直したりと色々面倒なことが起こります。

#### 料金

課金はクロール対象のデータ量によって（DPUが決まり、そちらに基づいて）決まります。

> AWS Glue データカタログにデータを取り込む場合は、時間あたりの料金がかかります。クローラーの実行に使用された DPU (Data Processing Unit) の数に基づいて時間あたりの課金が発生します。

https://aws.amazon.com/jp/glue/pricing/

コストを抑えようと思うとすでにクロール済みの部分はなるべくスルーしたいわけですが、そこで使われるのが増分クローラーです。

## 増分クローラーとは


> クローラーには新しいパーティションを追加するオプションがあり、安定したテーブルスキーマを持つ増分データセットのクロールが速くなります。典型的なユースケースは、スケジュールされたクローラーで、クロールごとに新しいパーティションが追加されます。このオプションをオンにすると、最初にターゲットデータセットで完全なクロールを実行し、クローラーが初期スキーマとパーティション構造を記録できるようになります。クロールの再実行時、スキーマに互換性がある場合にのみ、新しいパーティションが既存のテーブルに追加されます。最初のクロール実行後に、スキーマの変更は行われず、Data Catalog に新しいテーブルを追加することはありません。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/incremental-crawls.html


増分クローラーを使うことで文字通り、増えた分だけをクロール対象とするので処理時間とコストを抑えることが可能です。

ただし、注意点があります。（ここが本題の話）

完全なクロールが実行されて初回実行時にのみ初期スキーマとパーティション構造を記録できるようになります。以降はスキーマに互換性がある場合にのみ、新しいパーティションが既存のテーブルに追加されます。

> 最初にターゲットデータセットで完全なクロールを実行し、クローラーが初期スキーマとパーティション構造を記録できるようになります。

つまり、最初の1回を実行するときにデータがなければ以降のクロールは無意味ということです。テーブル自体は作成されますが、スキーマを作成しようにもデータがないので、空のテーブルが作られます。そうなったらもう終わりで、仮に2回目実行前にデータを入れたとしてもスキーマが作られることもないですし、パーティションも作られません。

この問題は回避できなさそうで初回実行前にデータを入れておくしかなさそうです。
デプロイしたアプリを記事に埋め込んでみた

# 完成図
今回はglitch.comにてデプロイしたアプリを、glitch.comの機能を使って埋め込んでいます。

https://glitch.com/

<p class="codepen" data-height="900.42578125" data-default-tab="result" data-slug-hash="BaepzZW" data-pen-title="Qiita_emb_mahjong_runk_navi" data-user="Kohki-Takatama" style="height: 900.42578125px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Kohki-Takatama/pen/BaepzZW">
  Qiita_emb_mahjong_runk_navi</a> by Kohki_Takatama (<a href="https://codepen.io/Kohki-Takatama">@Kohki-Takatama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# glitch.com から embed code を取得する

glitch.com では、デプロイしたアプリの埋め込みiframeタグを取得可能です。

https://help.glitch.com/hc/en-us/articles/16287567210637-Customizing-Embeds

```html
<!-- Copy and Paste Me -->
<div class="glitch-embed-wrap" style="height: 800px; width: 100%;">
  <iframe
    src="https://glitch.com/embed/#!/embed/mahjong-runk-navi?path=README.md&previewSize=100&attributionHidden=true"
    title="mahjong-runk-navi on Glitch"
    allow="geolocation; microphone; camera; midi; encrypted-media; xr-spatial-tracking; fullscreen"
    allowFullScreen
    style="height: 100%; width: 100%; border: 0;">
  </iframe>
</div>
```
しかし、これを直接Qiitaに貼り付けても、何も表示されません。
<!-- Copy and Paste Me -->
<div class="glitch-embed-wrap" style="height: 800px; width: 100%;">
  <iframe
    src="https://glitch.com/embed/#!/embed/mahjong-runk-navi?path=README.md&previewSize=100&attributionHidden=true"
    title="mahjong-runk-navi on Glitch"
    allow="geolocation; microphone; camera; midi; encrypted-media; xr-spatial-tracking; fullscreen"
    allowFullScreen
    style="height: 100%; width: 100%; border: 0;">
  </iframe>
</div>

| |
|:--:|
|![スクリーンショット 2024-05-30 8.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/4022d4b1-5125-a0cc-4d0f-0e3e710cb982.png)|
|エディタ上は貼り付けているが、記事に表示されない|

そこで、CodePenを使うことにしました。

# CodePenにcodeを貼り付け、Qiitaに埋め込む

QiitaではCodePenの埋め込みが可能です。

https://codepen.io/

そこで、CodePenに先程のコードを貼り付けたものを、記事に埋め込んでみました。

![スクリーンショット 2024-05-30 9.10.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/6f350c7b-3768-fb09-77b7-31156a585f5d.png)

これが成功し、冒頭に表示したものになっています。

# こだわりポイント

最後に、見やすくするために調整したポイントを紹介して終わります。

glitch
- アプリ部分をデフォルトで表示に変更（通常はコード表示）

CodePen
- デフォルトでResultのみ表示
- 高さ調整
Python FASTAPI 使ってみよう　仮

# はじめに

今回はPythonフレームワークFASTAPIについてやっていきます。

FASTAPIとは？
高速処理を可能でデバックなどもし易い。そんなフレームワークです。

ソースコードの構文について
　FLASKのようにJINJAにも対応していて、似ているところが多いです。

# 環境構築


インストールするのは以下の通りです。

pip install fastapi
pip install uvicorn
pip install sqlalchemy #後ほど使います
pip install sqllite #後ほど使います

# 環境テスト


```

pip install fastapi
pip install uvicorn
pip install sqlalchemy
pip install sqllite

```

#腕試し

```python:main.py
import uvicorn
from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

if __name__ == "__main__":
    uvicorn.run("main:app", port=5000, log_level="info")

```

# 動作確認方法
```url
http://locallhost:5000/docs
```
edgeaやchromeを使用して、緑色のfastapiの画面が表示されてることを確認してください。
表示された方は動作確認終了です。

# 次
次回オープンdocsを使って動作チェックを行います。
Power Apps キャンバスアプリのコードレビュー (Power  Apps Code Review Tool)

Power Apps キャンバスアプリを作成・公開した後に、アプリのパフォーマンスが悪いと感じたことはありませんでしょうか。原因については多々考えられますが、アプリ内で何か問題がないかを調査する際に、Code Review Tool というものが便利ですので、主にレビュー結果の見方についてご紹介します。

・[紹介元記事（英語）](https://powerapps.microsoft.com/ja-jp/blog/power-apps-code-review-tool/)

・[インストールおよびレビュー実施手順](https://github.com/microsoft/powerapps-tools/tree/master/Tools/Apps/Microsoft.PowerApps.CodeReview)

## アプリの概要・設定値
アプリ内で画面やコントロールがどれだけあるか、パフォーマンスに有効なアプリ設定が設定されているか、などが確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/2b5bed79-6dec-24bd-5343-81232ef00931.png)

日本語に翻訳するとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/23d1d4ce-9a65-b889-f0cf-ec1419b80cd5.png)

## チェックリスト
どのような観点でレビューを行ったかのチェックリストになります。
緑マークがついていれば指摘なし、赤マークがついていれば指摘あり、となりその後具体的な問題箇所をドリルダウンしていくことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/25b648ac-a33f-222d-2830-540c0a3fb556.png)

日本語に翻訳するとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/1cd944ac-5d1e-efbe-db12-bde4305ac7b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/54b3716b-b7c9-fa5c-457e-94cc17afb392.png)

## コードビューア
チェックリストで指摘があった項目に関して、具体的にどのコントロールや設定値のことを指しているかを表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/c4d7bafe-cf85-b42e-4949-0ca54263ff17.png)

例. 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/ed2690b8-8fcc-1f38-f6a5-5439d7fc8bca.png)


目視による確認含めたレビュー報告書作成や、その後の改修にあたっての実装支援などはMicrosoftのUnifiedサポートの方でも承っておりますので、お気軽にお近くの担当者にお問い合わせください。
ヒストグラムを正規化＋分割して反応率の高い範囲を確認する(SPSS Modeler データ加工逆引き10-17)

# ヒストグラムを正規化＋分割して反応率の高い範囲を確認する

![スクリーンショット 2024-05-14 12.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/09bde06b-9dde-e261-47cd-1d0e34964b22.png)

## 1.想定される利用目的

・量的変数と質的変数の関係性の確認する
・傾向スコアなどの値が高い/低いほど反応率が高いことで精度の安定性を確認する


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/hist_color.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-05-14 13.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/911ac843-a1f2-f6e0-9d88-6c0801e1c5d6.png)

a.入力するデータは次の通りです。
![スクリーンショット 2024-05-14 13.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b3e5541f-3d01-6ca1-7bb8-39c421a857a9.png)

b.[ヒストグラム]ノードを編集します。
![スクリーンショット 2024-05-14 13.24.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2f021f31-7c12-78f8-15a2-3feba4a35a01.png)

[実行]します。値が高くなるほど反応率は高いように見受けられます（＝フラグが多い）。

![スクリーンショット 2024-05-14 13.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/38c0eb40-d492-b825-ef26-ca7e4354edc0.png)


#### ヒストグラムを正規化する

c.[ヒストグラム]ノードを編集します。[オプション]タブの[色で正規化]にチェックを入れます。

![スクリーンショット 2024-05-14 13.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/953b9c62-a2d1-039d-a9bc-ca33f32ad352.png)

[実行]します。値が高いほどフラグの占有率が高くなると色で把握できます。
![スクリーンショット 2024-05-14 13.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7f9896dd-9931-af6e-233f-9a96ef33cbcf.png)

#### ヒストグラムを正規化したまま上下に分割する

d.[ヒストグラム]ノードを編集します。[オプション]タブの[各色ごとに個別のバンド]にチェックを入れます。

![スクリーンショット 2024-05-14 13.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/29e4fc5d-4827-09af-e65c-5bb557e0d907.png)

[実行]します。

![スクリーンショット 2024-05-14 13.25.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d3bd9826-07dc-54d6-07d0-2b7c173bcb8d.png)

#### 注意事項

bの設定で[flag]を[色]ではなく[パネル]に選択すると以下のように左右分割で表示されます。
予測の判別率確認には適当ではなさそうです。

![スクリーンショット 2024-05-14 13.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5bfbf9e5-cdad-26b0-cd77-d25e42d2ade0.png)


## 4.参考情報

#### ヒストグラムを新グラフ機能で表示する

https://qiita.com/416nishimaki/items/476126234de7c78bed65

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
画像に関する質問のまとめ



+ [回答で使う画像](https://qiita.com/Keiji_otsubo/items/bdeef379ecbc85ff4614)
+ [LWCのエラー画像から検索する](https://qiita.com/Keiji_otsubo/items/901030e0ddd7ef9bc760)
+ [画像を表示する数式項目の作成](https://qiita.com/Keiji_otsubo/items/91f1a222007bba6b2efc)
+ [Knowledge Article で画像を追加する](https://qiita.com/Keiji_otsubo/items/dc64a1794be080c99612)


+ [【日本語のみのヘルプ】リッチテキストエリアの画像が読み込まれず 'Image Not Available' が表示される](https://help.salesforce.com/s/articleView?id=000389113&type=1)
カスタム表示ラベル(Custom Labels)

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



+ [Lightning Email TemplatesでCustomMetadata or Labelsが使えない](https://qiita.com/Keiji_otsubo/items/22d4126169cf92412eaa)
+ [Flowでカスタムラベルを使う　winter21後の注意点](https://qiita.com/Keiji_otsubo/items/73c0968f75642b2f85e0)
+ [画面フローにおけるカスタム表示ラベルを用いたレコードの取得方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eoT8l)

:::note
原因がわかりました。Otsuboさんのキャプチャのように1つしか値を持っていないカスタム表示ラベルであれば、レコードを取得の際に「から始まる」を用いて動作しましたが、私が試みていたカスタム表示ラベルは値を複数持っていたため、「から始まる」では動作しないということのようです。

「レコードを取得」要素に単純な条件を加えるだけでは実現できなさそうでしたが、他に数式などを用いて実現することはできた。
:::

+ [定義済み項目値に空白行を含んだ文字列を設定したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmFq6)

:::note
カスタム表示ラベルで空白を含んだ値を設定してみてください。
グローバルアクションからもこのカスタム表示ラベルは呼び出せるようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/07223f08-15c5-31e7-63fe-1f2771bb2b29.png)

改行も機能しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bcc6a3a9-d7cd-a153-14fd-ff287c71e141.png)
:::

# 404エラー

+ [Classicメールテンプレートでカスタム表示ラベルが正常に表示できない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000Vx0I)

:::note
404エラーなので、URLが存在しないというエラーだと思います。 
このカスタム表示ラベル名のURLにはアクセス可能ですか？ 

もしかしたらプレビューではリンクが機能しないのかもしれません。
:::
CentOSでSSH公開鍵認証設定した際の作業メモ

# はじめに



### 概要
ユーザー(ユーザー名：ssh)を作成し、公開鍵認証でSSH接続できるように設定を行う。



### 環境などなど
- クライアント
    - OS：Windows11
    - SSHキーの配置場所
        - 秘密鍵ファイル：C:\\work\\.ssh\\id_rsa
        - 公開鍵ファイル：C:\\work\\.ssh\\id_rsa.pub
- サーバ
    - OS：CentOS 7.9
    - ホスト名：CentOS
    - SSH公開鍵の配置場所
        - 公開鍵ファイル：/home/ssh/.ssh/authorized_keys



# サーバ側の作業



## rootユーザーの作業



### sshユーザーの作成
```
[root@CentOS ~]# useradd -m -d /home/ssh ssh
```



### sshユーザーのパスワード設定
```
[root@CentOS ~]# passwd ssh
Changing password for user ssh.
New password: **********
Retype new password: **********
passwd: all authentication tokens updated successfully.
[root@CentOS ~]# 
```



### SSH接続設定の変更
```
[root@CentOS ~]# vi /etc/ssh/sshd_config


#空パスワードのユーザーのログインを禁止
#PermitEmptyPasswords no
PermitEmptyPasswords no

#公開鍵認証を許可する
#PubkeyAuthentication yes
PubkeyAuthentication yes


[root@CentOS ~]# 
```



### SSHサービスの再起動
```
[root@CentOS ~]# systemctl restart sshd.service
```



## sshユーザーの作業



### フォルダ「.ssh」の作成
```
[ssh@CentOS ~]$ mkdir /home/ssh/.ssh
```



### フォルダ「.ssh」の権限設定
```
[ssh@CentOS .ssh]$ chmod 700 /home/ssh/.ssh
```



### フォルダ「.ssh」の権限確認
```
[ssh@CentOS ~]$ ls -ld /home/ssh/.ssh
drwx------. 2 ssh ssh 47 May 29 17:56 /home/ssh/.ssh
[ssh@CentOS ~]$ 
```



# クライアント側の作業



## PowerShell



### 定義
```
$dirPath            = "C:\work\.ssh";
$privateKeyFileName = "id_rsa";
$publicKeyFileName  = "id_rsa.pub";
$privateKeyFilePath = Join-Path -Path "$($dirPath)" -ChildPath "$($privateKeyFileName)";
$publicKeyFilePath  = Join-Path -Path "$($dirPath)" -ChildPath "$($publicKeyFileName)";
```



### フォルダ作成
```
New-Item `
  -Path "$($dirPath)" `
  -ItemType Directory `
  -ErrorAction SilentlyContinue;
```



### SSHキー(秘密鍵/公開鍵)の生成
```
ssh-keygen `
  -t rsa `
  -b 2048 `
  -q `
  -N '""' `
  -C "${env:USERNAME}@${env:COMPUTERNAME}" `
  -f "$($privateKeyFilePath)";
```



### SSHキー(公開鍵)の配置
サーバーの以下の場所に配置する。
配置元ファイル：C:\\work\\.ssh\\id_rsa.pub
配置先ファイル：/home/ssh/.ssh/authorized_keys



# サーバ側の作業



## sshユーザーの作業



### ファイル「authorized_keys」の権限設定
```
[ssh@CentOS .ssh]$ chmod 600 /home/ssh/.ssh/authorized_keys
```



### ファイル「authorized_keys」の権限確認
```
[ssh@CentOS ~]$ ls -l /home/ssh/.ssh/authorized_keys
-rw------- 1 ssh ssh 738 May 17 13:51 /home/ssh/.ssh/authorized_keys
[ssh@CentOS ~]$ 
```



# クライアント側の作業



## PowerShell



### 公開鍵認証での接続確認
```
ssh -i "$($privateKeyFilePath)" ssh@CentOS
```



# サーバ側の作業



## rootユーザーの作業



### SSH接続設定の変更
```
[root@CentOS ~]# vi /etc/ssh/sshd_config


#rootユーザーのログイン禁止
#PermitRootLogin yes
PermitRootLogin no

#パスワード認証を無効にする
#PasswordAuthentication yes
PasswordAuthentication no


[root@CentOS ~]# 
```



### SSHサービスの再起動
```
[root@CentOS ~]# systemctl restart sshd.service
```
SwiftUI 日本語での日付の表示形式


## はじめに
日本語での日時表示を求められたとき、どのように設定すれば良いかで躓きました。この記事では、私がその問題に直面し、解決した方法について共有したいと思います。

## 問題
開発中のアプリで、タスクの締切日時を日本語で表示する必要がありました。しかし、表示される日付は英語表記のままでした。例えば、"May 27, 2024 20:29"のように表示されてしまい、"2024年5月27日 20時29分"のように日本語で表示する方法が分からずに困っていました。

以下はそのときのコードです：

```
List {
    ForEach(doIt) { item in
        VStack(alignment: .leading) {
            Text("タスク: \(item.content)")
                .padding(.trailing, 8)
            Text("タイムリミット: \(item.registerDate, formatter: dateFormatter)")
        }
    }
}
```

上記のコードでは、dateFormatterを使用して日付を表示していますが、適切な日本語フォーマットを設定していませんでした。

## 解決方法
日本語で日付を表示するためには、DateFormatterを使用してフォーマットを設定する必要があります。以下のように、dateFormatterを設定します。

```
private var dateFormatter: DateFormatter {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy年M月d日 HH時mm分"  // 日本語フォーマットに設定
    return formatter
}
// "2024年5月27日 20時29分" のように表示されます
```

この設定を行うことで、日付を"2024年5月27日 20時29分"のように日本語で表示することができます。

## DateFormatterとは
DateFormatterは、Foundationフレームワークに含まれている、日付と時刻の文字列表現を管理するためのクラス。具体的には、日付と文字列の間で変換を行うためのメソッドを提供します。

### 主な機能

・日付と文字列の間の変換: string(from:) メソッドを使用して Date オブジェクトを文字列に変換し、date(from:) メソッドを使用して文字列を Date オブジェクトに変換する。

・表示形式のカスタマイズ: dateFormat プロパティを使用して、任意の表示形式を指定できる。

・ローカライズ: locale プロパティを設定して、特定のロケールに基づいた日付表示形式を指定できる。


### 基本的な使い方

```

let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let date = formatter.date(from: "2024/05/27 20:29")
let dateString = formatter.string(from: Date())

```

### ロケールを指定して日付をローカライズ

```
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ja_JP")
formatter.dateStyle = .full
let dateString = formatter.string(from: Date())
// "2024年5月27日月曜日" のように表示されます

```

### カスタムフォーマット

カスタムフォーマットを指定する際には、特定の記号を使用します。
主な記号は以下の通りです：

y: 年 (ex. 2024)
M: 月 (ex. 5)
d: 日 (ex. 27)
H: 24時間制の時間 (ex. 20)
m: 分 (ex. 29)
E: 曜日 (ex. Mon)
a: AM/PM (ex. PM)



## おわりに
このようにして、日付の表示形式を日本語に変更することができました。DateFormatterを使用する際は、適切なフォーマットを設定することが重要です。同じような問題に直面している方々の参考になれば幸いです。

## 参考
[Apple Developer Documentation - DateFormatter](https://developer.apple.com/documentation/foundation/dateformatter)
[DateFormatterの使い方！書式や日付形式の調整方法](https://appdev-room.com/swift-date-formatter)
robloxでassistant その91

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

# 練習問題
ContextActionServiceを使え。

# 手順
- ReplicatedFirstに、localscriptを追加。
- スクリプトを書く。
```
local ContextActionService = game:GetService("ContextActionService")
local honkSound = Instance.new("Sound", workspace)
honkSound.Looped = true
honkSound.SoundId = "rbxassetid://9120386436"
local function handleAction(actionName, inputState, inputObject)
	if actionName == "HonkHorn" then
		if inputState == Enum.UserInputState.Begin then
			print("play")
			honkSound:Play()
		else
			honkSound:Pause()
		end
	end
end
ContextActionService:BindAction("HonkHorn", handleAction, true, Enum.KeyCode.H, Enum.KeyCode.ButtonY)

```


以上。