OmniAICreator/Qiita-1.07M huggingface dataset:
トークンを鍵とする：大規模言語モデルの汎化性能評価の新時代

# Unlocking Tokens as Data Points for Generalization Bounds on Larger Language Models

今回は、最新の研究成果である「Unlocking Tokens as Data Points for Generalization Bounds on Larger Language Models」という論文をご紹介します。この研究は、大規模言語モデル（LLMs）の汎化性能を評価するための新しいアプローチを提案し、その理論的基盤と実験的結果を通じてその有効性を検証しています。

### 論文情報
- **タイトル**: Unlocking Tokens as Data Points for Generalization Bounds on Larger Language Models
- **リンク**: [arXiv:2407.18158v1](https://arxiv.org/abs/2407.18158v1)
- **発表日**: 2024年7月25日
- **著者**: Sanae Lotfi, Yilun Kuang, Brandon Amos, Micah Goldblum, Marc Finzi, Andrew Gordon Wilson
- **DOI**: 10.48550/arXiv.2407.18158v1

## 背景と目的
大規模言語モデル（LLMs）は、その膨大なパラメータ数により、高度な自然言語処理タスクで優れた性能を発揮しています。しかし、これらのモデルの理論的理解、特にその汎化性能に関する理解はまだ十分とは言えません。従来の研究では、モデルの圧縮技術に基づいた一般化境界が提案されてきましたが、これらはしばしば「空」であり、特に大規模なモデルに対しては実用的でないとされてきました。

この論文の目的は、トークンレベルでの一般化境界を導入することで、LLMsの汎化性能をより厳密かつ具体的に評価する新しい方法を提案することです。これにより、学習データ内の膨大なトークン数をデータポイントとして利用し、従来の文書レベルのアプローチよりも詳細で正確な評価を可能にします。

## 研究の焦点
本研究の焦点は、トークンをデータポイントとして扱い、これを利用して汎化境界を導出することにあります。従来の方法では、独立同一分布（IID）の文書に基づく一般化境界が主流でしたが、実際のデータは非IIDであることが多く、この仮定は現実的ではありません。本研究では、マルチンゲールの性質を活用し、非IIDデータに対するより精密な汎化境界を提案しています。

具体的には、MonarchマトリクスやKronecker分解、後処理量子化といった高度な圧縮技術を利用し、モデルの圧縮後も高品質なテキスト生成能力を維持しつつ、非空の一般化境界を提供することを目指しています。

## 実験の概要と結果
この論文では、LLaMA2-70Bなどの大規模LLMsに対して、新しいトークンレベルの汎化境界を適用した実験を行いました。以下に主な結果を示します：

1. **トークンレベルの評価の有効性**: トークンを個々のデータポイントとして扱うことで、評価の精度が向上しました。トークン数が非常に多いため、文書レベルよりも細かな評価が可能となり、より詳細な汎化性能の分析が行えました。

2. **圧縮技術の効果**: MonarchマトリクスやKronecker分解といった圧縮技術の適用により、モデルの圧縮サイズを削減しつつ、トークンレベルでの評価において高い精度を維持できました。これにより、実際の運用においても高い性能を発揮するモデルが開発可能となります。

3. **実際の応用可能性**: 圧縮されたモデルは、計算資源の節約と性能のバランスを保ちながら、高品質なテキストを生成する能力を維持しています。このため、大規模なテキスト生成タスクや自然言語処理タスクにおいて、実用的な応用が期待されます。

### 賛否両論
**賛成意見**
- **新しい理論的貢献**: トークンレベルでの一般化境界の導入により、従来の文書レベルのアプローチよりも詳細な評価が可能となり、LLMsの理論的理解が深まりました。
- **実用的な応用**: 圧縮技術を用いることで、モデルの計算資源の効率的な利用と高性能の両立が可能となり、実際の応用においても高い価値を提供します。

**反対意見**
- **計算コストの懸念**: トークンレベルでの評価には大規模なデータセットの処理が必要であり、計算資源の負担が増加する可能性があります。また、特定のデータセットやタスクに対してこのアプローチの適用がどの程度効果的であるかについて、さらなる検証が求められます。

本研究は、大規模言語モデルの評価に新たな視点を提供し、実際の応用においても高い価値を持つと考えられます。この記事が皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、コメント欄にお寄せください。
[rails7] bin/devの役割とその仕組み

## 経緯
今回個人開発をする上で、新しく「rails new」　を行い「bin/dev」でローカルサーバーを立てようとした際に、下記のようなエラーが出たため、このエラーを解決するためにbin/devについて調べたのでこれをまとめます。

```
❯ bin/dev
zsh: no such file or directory: bin/dev
```

## エラーの原因
railsのbinファイルにdevというファイルがない

## そもそもbin/devとは？
bin/devコマンドは、Rails7においてrails sコマンドの代わりになるコマンドです。これまでrails sを実行していたタイミングで利用します。

なぜrails sではダメなのか？

理由はrails６までデフォルトでwebpackerというgemがありましたが、rails7から廃止になりました。これにより今まで自動的にできていたコードのサイズを小さくし（ミニファイ）、古いブラウザでも動くよう変換し（トランスパイル）、複数ファイルをまとめて一つにし（バンドル）、圧縮するプロセスができなくなってしまいます。

そのため、bin/devを使うことで、これらのプロセス（ミニファイ、トランスパイル、バンドル、圧縮）を適切に管理し、複数のプロセスを同時に実行することができます。これにより、開発環境で必要な全てのタスクが一括して実行され、効率的な開発が可能になります。

## bin/devの仕組み
ではbin/devの中身はどうなっているでしょうか？

まずbin/devコマンドとはターミナルで実行すると、binフォルダにあるdevファイルの処理を実行することで始まります。

```
if ! gem list foreman -i --silent; then
  echo "Installing foreman..."
  gem install foreman
fi

exec foreman start -f Procfile.dev "$@"
```

このスクリプトは、Foremanがインストールされていない場合にインストールし、Procfile.devファイルを使ってForemanを起動し、定義されたプロセスを実行します。

つまり、bin/devを使用するには、Procfile.devというファイルを作成する必要があります。
```
touch Procfile.dev
```
これにより、bin/devを行うと適切に「Procfile.dev」というファイルを読み込み、その中に定義されたプロセスをForemanが実行します。

## Procfile.devで設定する内容
ここで「web: bin/rails server」を設定されていることで、bin/devをするとサーバーが立ち上がるという仕組みです。

またjsやcssのビルドもここで設定できます。
これをすることでbin/devを行なった際にjsやcssをビルドすることができます。
```
# サーバー起動
web: bin/rails server -p 3000
js: yarn build --watch
css: yarn build:css --watch

# 各行の形式は、<プロセス名>: <コマンド>です。
```

## まとめ
新しく「rails new」を実行し「bin/dev」でローカルサーバーを立てようとした際に、bin/devファイルが存在しないエラーが発生しました。このエラーはRails 7での変更によるもので、webpackerが廃止されたためです。bin/devは複数のプロセスを管理するためにForemanを利用し、Procfile.devに定義されたプロセスを実行します。Procfile.devを適切に設定することで、サーバー起動やJavaScript、CSSのビルドが自動的に行われ、効率的な開発が可能になります。
Pythonのf文字列：便利な使い方10選

## はじめに
Pythonの f文字列（フォーマット済み文字列リテラル）は、Python 3.6から導入された強力な機能です。文字列内に直接Python式を埋め込むことができ、コードの可読性と効率を大幅に向上させます。この記事では、f文字列の便利な使い方を10個紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/f8e1c76a-ce18-41b6-f331-859ebf3b7080.png)

## Pythonのf文字列：便利な使い方10選

1. 基本的な変数の挿入

2. 式の評価

3. メソッドの呼び出し

4. 辞書のアクセス

5. 条件式（三項演算子）

6. フォーマット指定子の使用

7. 左寄せ、中央寄せ、右寄せ

8. 日付のフォーマット

9. 2進数、8進数、16進数表現

10. デバッグ用の=指定子

## 1. 基本的な変数の挿入

最も基本的な使い方は、変数の値を文字列に挿入することです。

```python
name = "太郎"
age = 30
print(f"私の名前は{name}で、{age}歳です。")
```

実行結果：
```
私の名前は太郎で、30歳です。
```

## 2. 式の評価

f文字列内では、Python式を評価できます。

```python
x = 10
y = 20
print(f"{x} + {y} = {x + y}")
```

実行結果：
```
10 + 20 = 30
```

## 3. メソッドの呼び出し

オブジェクトのメソッドを直接呼び出すこともできます。

```python
name = "python"
print(f"大文字: {name.upper()}")
```

実行結果：
```
大文字: PYTHON
```

## 4. 辞書のアクセス

辞書のキーを使って値にアクセスできます。

```python
person = {"name": "花子", "age": 25}
print(f"{person['name']}さんは{person['age']}歳です。")
```

実行結果：
```
花子さんは25歳です。
```

## 5. 条件式（三項演算子）

f文字列内で条件式を使用できます。

```python
x = 15
print(f"{x}は{'偶数' if x % 2 == 0 else '奇数'}です。")
```

実行結果：
```
15は奇数です。
```

## 6. フォーマット指定子の使用

数値のフォーマットを指定できます。

```python
pi = 3.14159
print(f"円周率は{pi:.2f}です。")
```

実行結果：
```
円周率は3.14です。
```

## 7. 左寄せ、中央寄せ、右寄せ

文字列の位置揃えも簡単に行えます。

```python
name = "Python"
print(f"{name:<10}|")  # 左寄せ
print(f"{name:^10}|")  # 中央寄せ
print(f"{name:>10}|")  # 右寄せ
```

実行結果：
```
Python    |
  Python  |
    Python|
```

## 8. 日付のフォーマット

`datetime`オブジェクトのフォーマットも直接指定できます。

```python
from datetime import datetime
now = datetime.now()
print(f"現在時刻: {now:%Y-%m-%d %H:%M:%S}")
```

実行結果（実行時の日時により異なります）：
```
現在時刻: 2024-07-28 12:34:56
```

## 9. 2進数、8進数、16進数表現

整数を異なる進数で表現できます。

```python
num = 42
print(f"10進数: {num}")
print(f"2進数: {num:b}")
print(f"8進数: {num:o}")
print(f"16進数: {num:x}")
```

実行結果：
```
10進数: 42
2進数: 101010
8進数: 52
16進数: 2a
```

## 10. デバッグ用の=指定子

Python 3.8以降では、変数名と値を同時に表示できる`=`指定子が使えます。

```python
x = 10
y = 20
print(f"{x=}, {y=}")
```

実行結果：
```
x=10, y=20
```

## まとめ

f文字列は、Pythonのコードをより簡潔で読みやすくする強力なツールです。これらの使い方を覚えておけば、文字列操作がより効率的になり、コードの品質も向上するでしょう。ぜひ、日々のコーディングで活用してみてください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/3c7785f5-6ddf-0616-c4d3-3124c11cd801.png)

## 参考情報

1. Python公式ドキュメント - フォーマット済み文字列リテラル:
   [https://docs.python.org/ja/3/reference/lexical_analysis.html#f-strings](https://docs.python.org/ja/3/reference/lexical_analysis.html#f-strings)

2. Python公式ドキュメント - フォーマット済み文字列リテラル (PEP 498):
   [https://peps.python.org/pep-0498/](https://peps.python.org/pep-0498/)

3. Python公式ドキュメント - 文字列とバイナリデータの操作:
   [https://docs.python.org/ja/3/library/string.html](https://docs.python.org/ja/3/library/string.html)

これらの公式ドキュメントでは、f文字列の詳細な仕様や高度な使い方について学ぶことができます。特に、最新のPythonバージョンでの機能追加や変更点についても確認できるので、定期的にチェックすることをおすすめします。
学習記録アプリにsupabase,cicdを導入する

# はじめに
以前作った学習記録アプリはバックエンドを実装していなかったのでリロードするとデータが全て消えてしまいました。なので今回は以前の学習記録アプリのバックエンドにsupabase、そしてデプロイとテストを自動化するためにgithub actionsを導入しました。

https://qiita.com/bisketoriba/items/2276b48af22511ae1db8

# 作ったもの
前回と同じで特にスタイリングはしてません(なので見た目上は変化0です)。supabaseでデータを保持するようにしたのでリロードしてもデータが保持されるようになっています。

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3279945/76058c96-36a2-eb41-c64c-38adcfb4caf0.gif)



# 今回追加した技術

### バックエンド
- supabase
### デプロイ
- firebase
### テスト
- jest
- testing-library
### CICD
- github actions

# 気づき
今回はsupabaseでのバックエンド実装やfirebaseでのデプロイなど今までやったことない技術をたくさん使ったのでとても苦労しました。どれも特に教材とかでは学習せずネット記事や公式ドキュメントを見ながら進めていったので、自分で調べながら物事を解決する力が少しずつついてきた気がします(gptとも仲良くなれた)。また解決に時間がかかったエラーや勉強になったことは都度記事にしていたので、アウトプットも習慣化できるようになってきました。今回実装進めながら自分が思ったより以上に公式ドキュメントが苦手という発見もできたので、今後は何かあったらまず公式ドキュメントを見るという意識で実装を進めて行こうと思います。

# おわりに
アプリを作るって大変ですね。今後はこの学習記録アプリにTypeScriptやデザインをリッチにするためのChakraUIなども導入していきます。

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします:point_down:

https://projisou.jp
大規模言語モデルの脆弱性とスケーリングの効果を探る

# Exploring Scaling Trends in LLM Robustness

今回は、最新の研究成果である「Exploring Scaling Trends in LLM Robustness」という論文をご紹介します。この研究は、近年注目を集める大規模言語モデル（LLM）のスケーリングが、そのロバスト性、特に敵対的攻撃への耐性にどのように影響するかを詳しく探求しています。言語モデルのスケーリングによる性能向上は広く知られていますが、その一方で攻撃に対する脆弱性も報告されており、これを踏まえたモデルの安全性確保が急務となっています。

### 論文情報
- **タイトル**: Exploring Scaling Trends in LLM Robustness
- **リンク**: [arXiv](https://arxiv.org/abs/2407.18213v1)
- **発表日**: 2024年7月25日
- **著者**: Nikolaus Howe, Michał Zajac, Ian McKenzie, Oskar Hollinsworth, Tom Tseng, Pierre-Luc Bacon, Adam Gleave
- **DOI**: 10.48550/arXiv.2407.18213

## 背景と目的

言語モデルは、自然言語処理のさまざまなタスクにおいて驚異的な性能を発揮しています。これは、モデルサイズや学習データ量の拡大によって能力が向上する「スケーリング法則」によるものです。しかし、これらのモデルは「jailbreak」などの敵対的攻撃に対して脆弱であり、特に悪意あるユーザーによる不正利用のリスクが高まっています。この研究は、コンピュータビジョン分野で観察されたように、モデルサイズやデータスケールの増加がロバスト性の向上につながるかどうかを調査し、今後の安全対策に資するデータを提供することを目的としています。

## 研究の焦点

本研究では、以下の点に焦点を当てています：

1. **モデルサイズの影響**: モデルサイズの増加が、敵対的攻撃に対する耐性にどのような影響を与えるかを分析します。
2. **敵対的トレーニングの効果**: モデルが攻撃に対する防御力を獲得するために、敵対的トレーニングがどの程度有効かを検証します。
3. **攻撃の転送性**: 一つのタイプの敵対的トレーニングが、異なるタイプの攻撃に対しても防御力を発揮するかどうかを調査します。

## 実験の概要と結果

### モデルとデータセット

実験には、Pythiaモデルファミリーを使用し、サイズは14Mから12Bパラメータにわたります。これらのモデルは、一般的な自然言語処理タスクにおいて高精度を達成しており、特にスパムフィルタリング（Spam）、映画レビューの感情分析（IMDB）、パスワード一致（PasswordMatch）、および単語長の比較（WordLength）のタスクに使用しました。これらのタスクは、モデルのロバスト性を評価するために設計されています。

### 敵対的攻撃と防御

敵対的攻撃には、ランダムトークン攻撃（RandomToken）と貪欲座標勾配攻撃（GCG）を使用しました。RandomToken攻撃はモデルの語彙からランダムに選ばれたトークンを使用し、GCG攻撃は勾配に基づいたトークン選択を行います。これらの攻撃に対するモデルの耐性を評価することで、モデルサイズとロバスト性の関係を明らかにしました。

### 結果と考察

実験の結果、モデルサイズの増加がロバスト性の向上に寄与するものの、その効果は限定的であることが判明しました。特に、トレーニング時に敵対的なデータを使用することで、モデルの耐性が大幅に向上することが確認されました。さらに、異なるタイプの攻撃に対しても防御効果が転送されることが示され、特に100Mパラメータ以上のモデルではこの効果が顕著でした。

一方で、モデルサイズの拡大だけでは攻撃に対する完全な耐性を保証するものではなく、専用の安全対策が必要であることも示唆されています。このため、今後の研究では、さらなるモデルスケールの拡大と新しい防御技術の開発が求められています。

### 賛否両論

**賛成意見**

- 敵対的トレーニングの効果が確認されたことは、実践的な安全対策の指針となる。
- スケーリングがロバスト性向上に寄与するという結果は、今後のモデル開発における一つの重要な方向性を示している。

**反対意見**

- モデルサイズの増加のみでは、攻撃に対する完全な防御が達成できない点は懸念材料。
- 研究が特定のモデルと攻撃手法に限定されているため、一般化には慎重な検討が必要である。

この記事が皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、コメント欄にお寄せください。
オブジェクト指向1

##    はじめに

  __<font color="blue">　【オブジェクト指向】</font>を__ __<font color="blue">　【Java = ジャバ】</font>言語で考えてみました。__

##### Javaの基本的な記載方法は以下を参照。
https://qiita.com/nekoozi/items/c9be16d9dd447e687c6c

# <font color="blueviolet">__クラス　＝　設計図__</font>
「人」を表す Person クラス
```java
// Person = クラス名
public class Person {

    /* 属性(変数)の宣言
        ⇒ クラスが持つ情報（データを格納するための変数） */

    // フィールドの宣言
    private int age;          //年齢を表す age フィールド
    private String name;      //名前を表す name フィールド




    // コンストラクタの宣言
    /*  クラス名とメソッド名が同じの場合 */
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }




    /* 操作(メソッド)の宣言
        ⇒ クラスが持つ機能（なんの処理をするのか、命令文のまとまり） */

    // getterメソッド
    /*  インスタンスメソッド( age を取得するため) */
    public int getAge() {
        return age;
    }


    // setterメソッド
    /*  インスタンスメソッド( age に値を代入するため) */
    public void setAge(int age) {
        this.age = age;
    }


    // getterメソッド
    /*  インスタンスメソッド( name に値を代入するため) */
    public String getName() {
        return name;
    }


    // setterメソッド
    /*  インスタンスメソッド( name に値を代入するため) */
    public void setName(String name) {
        this.name = name;
    }


}

```


-------------


# <font color="blueviolet">__インスタンス　＝　クラスから実際に作り出したもの__</font>

コンストラクタを使用して、getterメソッドを使用して、年齢と名前を出力

```java
class PersonTest {
  public static void main(String[] args) {

    Person man = new Person(38,"太郎");
    //Personクラスを元にインスタンス化

    /* new するときにコンストラクタに渡す引数を指定 */
    
    System.out.println("年齢は " + man.getAge());
    System.out.println("名前は " + man.getName());

    Person woman = new Person(33,"姫");
    //Personクラスを元にインスタンス化
    
    System.out.println("年齢は " + woman.getAge());
    System.out.println("名前は " + woman.getName());

  }

}
```

-------------
実行結果
````
年齢は 38
名前は 太郎
年齢は 28
名前は 姫
````
-------------

オブジェクト指向2

https://qiita.com/nekoozi/items/d0e0cb616b45048143af 



## 参考文献

Java関連情報サイト様

https://www.javadrive.jp/start/

https://qiita.com/rawr/items/51af11d187aa60207ee3

https://qiita.com/mrshouuge/items/675fde85b2af6ddf187b
Running Mattermost using Docker on Amazon Linux 2023 ASAP

2024年7月28日時点で手っ取り早くMattermostを立ち上げる情報をまとめます。

# インスタンス起動時の注意
1. Amazon Linux2023を選択する(他のdistroでも同様にできるとは思いますが)
2. ポート範囲8065，ソース0.0.0.0/0のインバウンドルールを許可しているセキュリティグループをアタッチする
3. SSMにアクセスできるIAMインスタンスプロフィールをアタッチする(SSMで操作する場合)

# Install docker
参考情報(https://zenn.dev/rock_penguin/articles/28875c7b0a5e30)
```bash
sudo dnf update
sudo dnf install -y docker
sudo systemctl start docker
sudo gpasswd -a $(whoami) docker
sudo chgrp docker /var/run/docker.sock
sudo service docker restart
sudo systemctl enable docker
```

# Install docker-compose for all users
参考情報(https://qiita.com/JunkiHiroi/items/3bf722af3e77c73a1625)
```bash
sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
```

# Install Mattermost
```bash
sudo dnf install -y git
cd /opt
sudo git clone https://github.com/mattermost/docker
cd docker
sudo cp env.example .env
```

ここで，.envファイルを編集する。
```bash
sudo vi .env
```
DOMAINの箇所を，起動したインスタンスのパブリックIPv4 DNSに書き換える。
```text
# Domain of service
DOMAIN=ec2-xxx-xxx-xxx-xxx.region.compute.amazonaws.com
```

起動に必要なディレクトリ作成と権限設定
参考情報(https://docs.mattermost.com/install/install-docker.html)
```bash
sudo mkdir -p ./volumes/app/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes}
sudo chown -R 2000:2000 ./volumes/app/mattermost
```

Mattermost起動
```bash
sudo docker compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d
```

`http://DOMAIN:8065`にアクセスする。

# 最後に
簡単に動作させるだけならこれだけですが，本格運用を考えるといろいろとやることがあります。
参考情報(https://gihyo.jp/admin/serial/01/ubuntu-recipe/0702)
密結合と責務に関して（良いコード悪いコードで学ぶ設計入門のsection8を読んで）

## 目的
この記事では、エンジニア2年目の私が、密結合に関して、知らなかった点をまとめていきたいと思います。


## 背景
設計のことを読むだけではなかなか頭に入らず、また、業務でもそう都合よく理解したい内容が来るわけでもないため、アウトプットが必要だな、、と思い始めました。

## 本文

### section8 密結合に関して

#### 密結合とは？
あるクラスが他の多くのクラスに依存していること。

#### 具体的事例
ある商品を販売するサイトにおいて、通常の割引とsummer割引きがあるとする。
どちらも現在は1商品あたり300円引きである。

DiscountManagerクラスでは、
下記のようにgetDiscountPriceメソッドがすでに用意されている。
```java
class DiscountManager{

    ind discountPrice = getDiscountPrice(product.price);

    static int getDiscountPrice(int price){
        int discoutPrice = price - 300;
        return discoutPrice;
    }

    
}
```

SummerDiscountManagerクラスでは、上記メソッドを利用して計算するとする。
```java
    価格 = DiscountManger.totalPrice + DiscountManager.getDiscountPrice(product.price);
```

ここで、「現在は1商品あたり300円引き」の条件が、夏限定割引だけ変更になるとする。
しかし、DiscountManagerクラスの` price -300 `を変えてしまうと、
通常割引の価格まで変わってしまうという困ったことが生じる。


#### 課題
上記の設計では、DiscountManagerクラスの割引価格が固定されており、夏限定割引を適用する場合に通常割引の価格も変更されてしまいます。これが密結合の問題です。

#### 改善方法
単一責任になるように、下記のようにクラスを設計し直します。
通常と夏限定それぞれで仕様変更に対応できるようになります。

RegularPriceクラス
```java
    final int amount;
```
RegularDiscoutedPriceクラス
```java
    class RegularDiscountedPrice{
        final int amount;
        private static final int DISCOUNT_AMOUNT = 400;
        
        RegularDiscountedPrice(final Regular Price){
            int discountedAmount = price.amount - DISCOUNT_AMOUNT;
        }
        amount = discountedAmount;
    }
```
SummerDiscoutedPriceクラス
```java
    class SUmmerDiscoutedPrice{
        final int amount;
        private static final int DISCOUNT_AMOUNT = 300;
        
        SUmmerDiscoutedPrice(final Regular Price){
            int discountedAmount = price.amount - DISCOUNT_AMOUNT;
        }
        amount = discountedAmount;
    }
```

## 学び
Dryの原則は知っていたため、コードの重複は良くないもの、と思い込んでいました。
共通化する前に、コードの「責務」を一度考えることが重要と思えました。

## 実際の業務
今回の学びとは直接は異なりますが、下記のように迷うことが多いです。
今後は下記の設計でも応用できるようなことも調べていきたいです。
・コントローラのメソッドを分けるか否か
・ブレードのファイルを分けるか否か

## 次のステップ
継承に関しても注意点が多い、、とのことなのでまとめようと思います。
素朴な疑問 ~ モジュールバンドラーって何？ ~

# 素朴な疑問
筆者が新人教育する中で、プログラミング実務未経験者がよくされる質問を紹介します。
未経験者に限らず、「そういえば何のために使っている技術（ツール）なんだっけ？」とよく理解していないまま利用しているケースも少なくありません。
この記事で、その純粋で素朴な疑問を改めて明確にして理解を深めていきましょう！

# 今回の疑問
今回の疑問は表題通り、

「<font color="DarkOrange">**モジュールバンドラー**</font> って何？」　です！

モジュールバンドラーの代表的なものとして[webpack](https://webpack.js.org/)がありますね。

# モジュールバンドラーって何？
一言で言うと、
「モジュールを<font color="DarkOrange">**一つ（少数）のファイルへと変換する**</font>ツール」 です。

ここでいうモジュールとは、プロジェクト内の各ファイルのことを指します。
実際、我々がプログラミングしたモジュールは、そのままではブラウザ上で読み込ませることができません。
それには理由があります。以下の画像をご覧ください。

![スクリーンショット 2024-07-28 16.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115968/5225056b-bbd9-84ab-54bf-6aad59944ffe.png)
（出典：https://webpack.js.org/）

左側の「変換前」が、プロジェクト内の個々のファイルを表しています。
これらのファイルは`import`文や`require`関数によって互いに依存関係を持っております。
依存関係を持つファイルの中には、`.js`だけでなく`.sass`や`.cjs`などのさまざまな拡張子があります。
しかし、一例ですが、`.sass`は`.css`に変換しなければブラウザで動作しませんし、`.cjs`はnode.js環境でなければ機能しません。

そのため、モジュールバンドラーによってこれらのモジュールの依存関係を解消し、ブラウザで動作可能な形式に変換しているのです。
Recursive Introspectionによる自己改善型言語モデルの実現

# Recursive Introspection: Teaching Language Model Agents How to Self-Improve

今回は、最新の研究成果である「Recursive Introspection: Teaching Language Model Agents How to Self-Improve」という論文をご紹介します。この研究は、AIエージェントが自己改善する能力を持つための新しい手法を提案しています。

### 論文情報
- **タイトル**: Recursive Introspection: Teaching Language Model Agents How to Self-Improve
- **リンク**: [arXiv](https://arxiv.org/abs/2407.18219)
- **発表日**: 2024年7月25日
- **著者**: Yuxiao Qu, Tianjun Zhang, Naman Garg, Aviral Kumar
- **DOI**: arXiv:2407.18219v1

## 背景と目的
大規模言語モデル（LLMs）は、多様なタスクで高い性能を示している一方で、自己改善能力には限界があることが指摘されています。従来の手法では、モデルが自己のミスを認識し修正する能力を持つことは難しく、特に複雑な問題に対しては対応が困難でした。例えば、自己改善の試みとしてはオンライン模倣学習や強化学習を組み合わせる方法が提案されてきましたが、これらは限定的な成功にとどまっていました。

このような背景の中、本研究は「RISE（Recursive IntroSpEction）」という新しいアプローチを提案します。RISEは、モデルが自己の応答を振り返り、改善する能力を持つことを目的としています。この手法は、特に論理的推論や複雑な意思決定において、モデルが複数回の試行を通じて改善を行う能力を強化します。

## 研究の焦点
RISEは、シングルターンのプロンプトをマルチターンのマルコフ決定過程（MDP）に変換し、これによりモデルが逐次的に改善を行うプロセスを学習するよう設計されています。このプロセスでは、モデルが自らの過去の応答を評価し、必要に応じて修正する能力を身につけます。具体的には、RISEはオンポリシーロールアウトを用い、モデルがマルチターンの相互作用を通じて応答を改善するためのデータを収集します。

RISEのアルゴリズムは、オンライン模倣学習と強化学習の原則に基づいており、特に「報酬加重回帰（RWR）」を用いてモデルを訓練します。これにより、モデルは複数のターンを通じて自己改善を行う能力を獲得します。

## 実験の概要と結果
本研究では、RISEの有効性を検証するために、LLaMA2、LLaMA3、Mistralなどのモデルを使用しました。特に、数学的推論タスクでの実験では、RISEが顕著な性能向上をもたらしました。GSM8Kデータセットにおいて、RISEはLLaMA2-7Bの性能を17.7%向上させ、Mistral-7Bでは23.9%の向上が見られました。同様に、MATHデータセットでもLLaMA2-7Bで4.6%、Mistral-7Bで11.1%の改善が報告されました。

これらの結果は、RISEが単に初回の応答を改善するだけでなく、複数回の試行を通じてモデルが自己改善を行う能力を実証しています。また、これらの改善はモデルの基礎能力に依存することなく達成されており、RISEのアルゴリズムが幅広い応用可能性を持つことを示しています。

### 賛否両論
**賛成意見**
- RISEは、複数のターンを通じてモデルの応答を改善する能力を大幅に向上させます。特に、数学的推論のような複雑なタスクにおいて、その効果が顕著です。
- モデルが自己の過去の応答を評価し、改善する能力を学習することで、未見のタスクや新しいドメインへの適応力が向上します。

**反対意見**
- RISEの実行には高い計算コストが伴い、大規模なモデルでは特にリソースの消費が問題となります。
- 初回の応答が大幅に不正確な場合、自己改善のプロセスが十分に機能しない可能性があります。また、モデルの自己改善能力は与えられたフィードバックの質にも依存します。


この記事が皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、コメント欄にお寄せください。
[Swift]CollectionViewの作成

# CollectionView
CollectionViewは複数のアイテムを一覧表示させることができるUIコンポーネントの一つで、実際の開発現場でも非常に利用する場面が多いです。
今回も備忘録として基本の設定の仕方を備忘録として残していきます。

# 作成方法
Xcodeの立ち上げを行い設定を行なっていきます。
まずはCollectionViewをセットします。セットが完了したらCellのIdentifierの設定をします。
（名前はSampleCellとします）

![スクリーンショット 2024-07-28 15.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/17752a0f-da7a-4c13-ff7c-2d144fe9f271.png)

そして`dataSorce`と`delegate`を、ViewControllerに繋げます。
![Pasted Graphic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/a452cc82-5828-4746-ad57-ecf5014d9762.png)

配置する文字データをLabelにセットするので、Labelにtag番号を指定しておきます。
![スクリーンショット 2024-07-28 16.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/202e2c25-e37f-846e-e75c-f727220edc78.png)



# コード記述
```swift:title.swift
import UIKit

final class ViewController: UIViewController {
    
    private let collectionLabels = ["sample1", "sample2", "sample3", "sample4", "sample5", "sample6"]
    
    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

extension ViewController: UICollectionViewDataSource {
    // セクション数
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    // セル数
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return collectionLabels.count
    }
    
    // セルに値をセット
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        // widthReuseIdentifierにはStoryboardで設定したセルのIDを指定
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SampleCell", for: indexPath)
        
        // セルのラベルに値をセット。viewWithTagにはタグの番号を指定
        let title = cell.contentView.viewWithTag(1) as! UILabel
        title.text = collectionLabels[indexPath.row]
        
        // セルに枠線をセット
        cell.layer.borderColor = UIColor.lightGray.cgColor // 外枠の色
        cell.layer.borderWidth = 2.0 // 枠線の太さ
        
        return cell
    }
}

// セルのサイズを調整する
extension ViewController: UICollectionViewDelegateFlowLayout {
    
    // MARK: - UICollectionViewDelegateFlowLayout
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        
        let horizontalSpace: CGFloat = 10

        // 2列にするためのセルの幅
        let cellSize: CGFloat = (self.view.frame.width - horizontalSpace * 3) / 2

        return CGSize(width: cellSize, height: cellSize)
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 15.0 // 行間
    }
}
```
UICollectionViewDelegateFlowLayouでCellの行間や幅、指定次第で行数をこちら側でカスタマイズしセットすることができます。

# まとめ
基本中の基本となる実装ですがCollectionViewを調べてみると知らない機能はまだあり、奥は深いなと思います。
引続き学習を進めていきます。
桁数指定の数値項目

# 数値項目
データベースにしろ、javaにしろ、数値項目を扱う場合には通常int型にて処理する場合が多い。しかし、0始まりの項目に関しては0が消されてしまう可能性がある。特にIDなどの主キーを設定する場合によく用いられる。
また、主キーの場合には、0始まりでIDを降っていかずに、5桁の数字の場合には、00001などから採番を始める事もある。採番ルールを決めて確実にデータベースへの保管が必要となる。

# 桁数指定の項目に関しては
この桁数でデータベースとやりとりするなど指定されている桁数が決まっている場合には0埋めなどの処理をアプリ側で入れた上で、データベースに登録する必要がある。特にID等で0始まりのものがある場合には文字列型の文字数指定型を設定しておく必要がある。
TCP/IP関数を組込み関数にしました。

# TCP/IP組込み関数
Easy-ISLisp ver5.10においてTCP/IP関連の基本的な機能をもつ関数を組込みにしました。従来、CラッパーによるTCP/IPライブラリが付属していたのですが、この際、組込みにして仕様変更、入れ替えることとしました。このライブラリ作成にあたってはPoldyさんにお世話になりました。その節はありがとうございました。C言語で書き直し、場合によっては仕様を拡張する柔軟性を持たせています。Easy-ISLispの名前のごとくTCP/IP関数もとってもイージーになっています。


# 仕様

〇 (create-server-socket n)  サーバー用にポート番号nでソケットを生成します。

〇 (create-client-sokcet n IP)  クライアント用にポート番号と相手方IPアドレスによりソケットを生成します。

〇 (send-socket socket str) ソケットに文字列strを送信します。

〇 (recv-socket socket)  ソケットから文字列を受信します。

〇 (close-socket socket) ソケットを閉じます。


今のところ基本的な機能しかありません。実用は意図していません。計算実験、通信の理解を目的としています。


# サーバー・クライアントの簡単なコード

![bandicam 2024-07-28 16-15-20-551.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/3d191215-e424-dc60-3d4d-7505ef7febe1.jpeg)


このようにできるだけ簡単な仕組みでTCP/IPの学習ができるようになっています。


# なぜLispでやるのか？
PythonやRubyには優秀なTCP/IP関連の機能があります。豊富なライブラリがあり、実用的に使えます。では、なぜいまさらLispで？


一昔前、インターネットの黎明期においてポールグレアム氏はLispの用いることで成功を収めました。混沌とした時代においてLispにアドバンテージがあったと思います。でも、今となってはそれもなさそうに思えます。


私はLispのもつ同図像性がセキュリティー上の利点にならないだろうか？と考えています。生物学的プログラミングです。ウイルスが変異をして人間のもつT細胞の攻撃を回避することにヒントがないだろうか？という思いつきです。

Lispでなにか面白い遊びはないものか？と日夜、楽しんでおります。


# Easy-ISLisp
OSSです。ご自由にお使いください。フェードバッグがもらえると嬉しいです。
https://github.com/sasagawa888/eisl
ビルドとコンパイルの違い

## はじめに
自身がビルドとコンパイルをよく混同するので後学も兼ねて、**「ビルド」** と **「コンパイル」** の違いとを解説していきます。

## ビルドってコンパイルのこと？？
PCは機械語（マシン語）で動きます。機械語とは0・1の組み合わせからなるPCに指示を出す言語です。

私達が作成するプログラム（ソースコード）はコンパイル（翻訳）によって機械語からオブジェクトコードが生成され、オブジェクトコードで作られた実行ファイル（exeなど）を起動することでプログラムが動きます。

しかし、統合開発環境(IDE)では、実行ファイルの作成にビルドを使います。
IDEでもコンパイルは行われるのですがコンパイルを行う場合は一緒にリンク（合体）も行う為、コンパイルとリンクを一緒に行うことをビルドと言うのです。

そのため、 **ビルドとコンパイルの両者は異なる概念となります。**

## 終わりに
いかがでしたでしょうか？今回はとりあえず勉強して現場で実践していたりすると疑問に思っても仕事に関係ないから放置していたものだと思われます（私は放置していましたw）。

仕事で放置している物は今は必要なくても将来的に仕事を理解する時に必要になったりするので、放置している物があったら是非調べて教養を深めてみてはどうでしょうか？
割り算の余りが出せなくてもエンジニアとしてやっていけますか？

## はじまりはいつも自己紹介から

どうも！
割り算の余りが出せないモンスターです！

今回ですが、rubyで割り算と余りを算出する問題が出され正解を一発で出すことができなかったので、こちらの記事を書く決心をしました。

以下本文

## なんで、できんかったん？

今回の問題を解くのが難しいと感じたのは以下の理由があったからです。

```
1. rubyの組み込みメソッドが使えない。
2. 割り算の"/"は商しか出すことができないこと。
```

そのためわかりませんでした。

## 余りを出す組み込みメソッド "modulo"

皆様ご存知かと思われますが、rubyには割り算の余りを出すメソッドがあります。
それがmoduloメソッドです。

### 以下"modulo"の解説


### moduloメソッドの使い方
moduloメソッドは数値オブジェクトに対して呼び出され、引数として除数を指定します。すると、割り算の余りを返してくれます。以下にいくつかの例を示します。

```
puts 10.modulo(3)   # 出力: 1
puts 20.modulo(4)   # 出力: 0
puts 25.modulo(7)   # 出力: 4
puts -15.modulo(4)  # 出力: 1
```

上記の例では、10 ÷ 3の余りが1であることが分かります。同様に、他の例も同じように余りを計算してくれます。

## 一応割り算の例

```
dividend = 10
divisor = 3

quotient = dividend / divisor

puts "#{dividend} ÷ #{divisor} = #{quotient}"　


#出力 10 ÷ 3 = 3
```

上記を実行していただけるとわかりますが、単に"/"の割り算では余りは出力されません

## 結局どうやって解決したの？

なんのことはなくて、単に"%"を使うことによって出力しました。

%を使うと以下のようになります。

```
puts 10 % 3    # 出力: 1
puts -10 % 3   # 出力: 2
puts 10 % -3   # 出力: -2
puts -10 % -3  # 出力: -1
```

正直知ってしまったら、もうなんてことはない問題ですね😊

## "%"演算子と"modulo"の違い

みんな気になってうずうずしてスタンディングしていたと思いますが、座っていいですよ。

おまちかねの　'そこに違いはあるんか？'　と尋ねるお時間です。

### 以下解説

尋ねてみましたが違いはありませんでしたorz

### まとめ
この顔するので許してください

🥴

## 最後に

今回勉強したことで、もう2度と余りを求めたい時に迷わなくなりました。
皆様もどうしても余りを求めたい時があると思うのでこちらの記事のことを思い出すと何かいいことがあるやもしれません。
Googleの特殊検索まとめ

## はじめに
良いエンジニアは「検索力」があります。
より早く解決策を見つけるためには、やみくもに単語を打つよりも、効率的に調べることが大事です。

## さっそく本題

### 1.完全一致検索
- "エンジニア"
    - 「""」ダブルクォーテーションを付けることで、この単語のみに特化した結果が優先的に表示される

### 2.除外検索
- エンジニア　-web
    - 「-」を付けることで、その単語を検索結果から除外できる。
### 3.OR検索
- エンジニア　OR　web
    - 「OR」と「半角大文字」を検索単語の間に入れる。
    - 「どちらかの単語を含める」あるいは「どちらの単語も含める」という検索結果を得る。
### 4.タイトル検索
- intitle:エンジニア
    - 「intitle:」を検索ワード頭に入れる。
    - 上記例では、記事のタイトルに「エンジニア」が入った記事のみが表示される。
### 5.タイトル検索　複数ワードver
- allintitle:エンジニア　web
    - 「aligntitle:」を検索ワード頭に入れる。
    - 上記例では、記事のタイトルに「エンジニア」かつ「web」が入った記事のみが表示される。
### 6.サイト内検索
- site:https://example.com
    - 「site:」以下にサイトURLをセットすることで、特定のサイトの中のみ対象になる。
### 7.類似サイト検索
- related:https://exampleee.com
    - 「related:」以下にサイトURLをセットすることで、対象URLに似たサイトを検出する。
### 8.ファイル検索
- エンジニア　filetype:pdf
    - 「filetype:」で特定のファイル形式で検索結果を得られる。
    - 上記例では、「エンジニアに関するPDF資料」が表示される。
### 9.スライドシェア検索
- エンジニア　slideshare
    - 「検索ワード　slideshare」でslideshareサービスサイトを閲覧できる。
### 10.定義検索
- define:エンジニア
    - 「difine:」でその単語の定義を得られる。
### 11.キャッシュ検索
- cache:examle.com
    - 「cache:」でキャッシュバージョンを表示する。
### 12.特定の期間検索
- エンジニア after:2024-01-01 before:2024-06-30
    - 「検索ワード　after:YYYY-mm-dd before:YYYY-mm-dd」でその期間内に公開された検索ワードを表示する。
### 13.リンク元検索
- link:example.com
    - 「link:」で特定のウェブページへのリンクが貼られている他のウェブページを検索する際に使用。
### 14.変換検索
- 1　USD　in　JPY
    - 「数値　単位　in　単位」で単位間の変換した数値を得られる。














## 参考資料
https://kisopro.net/blog/programming/google-it/
M1以降(M2,M3)MacからビルドしたDockerイメージをECSやAppRunnerで動かすときのメモ


毎回M1MacでビルドしたDockerイメージからコンテナで動かそうとした時に躓くのでメモ。
M1 Mac環境では`docker build`するとデフォルトで**ARM**のイメージが作成される。

ECSはARM64とX86_64が選択できるのでまだ良いが、AppRunnerはARM64をサポートしていないので、デフォルトのままではエラーとなる。

ちなみにCahtGPTに聞いてみた。

### x86_64

	•	概要: x86_64は、64ビットの拡張命令セットを持つx86アーキテクチャです。x86アーキテクチャの拡張版として、より大きなメモリ空間とより多くのレジスタをサポートしています。
	•	開発元: 主にインテルとAMD。
	•	使用例: 主にデスクトップコンピュータやサーバーなどの高性能なコンピュータで使用されます。
	•	特性: 32ビットのソフトウェアとの互換性があり、長い間パソコンの標準アーキテクチャとして広く普及しています。

### amd64

	•	概要: amd64は、AMDが開発した64ビット拡張命令セットで、x86_64と互換性があります。
	•	開発元: AMD。
	•	使用例: ほぼx86_64と同義で、同じ用途や機器で使用されます。
	•	特性: AMDが自社製品向けに策定した名称で、x86_64と同じものとして扱われます。64ビットコンピューティングを可能にし、より大きなメモリとパフォーマンスの向上を実現します。


### ARM64

	•	概要: ARM64は、64ビットのARMアーキテクチャです。モバイルデバイスや組み込みシステム、エネルギー効率が求められる環境で広く使われています。
	•	開発元: ARM Holdings。
	•	使用例: スマートフォン、タブレット、Raspberry Pi、Appleの最新のMシリーズチップなど。
	•	特性: 省電力で効率的な設計が特徴で、モバイルデバイスや省電力が求められる場面で優れています。アーキテクチャはRISC（Reduced Instruction Set Computer）に基づいており、シンプルな命令セットで高効率を実現します。


 ## 設定方法

 具体的な設定方法は2つ。
 ### 1. Dockerfileで`--platform=〇〇`で指定する。
 ```Dockerfile
 FROM --platform=linux/arm64 nginx:latest
 ```

 ### 2 `docker build`コマンドの際に指定する。
 
 https://docs.docker.jp/engine/reference/commandline/buildx_build.html
 ```.zsh
 $ docker build --platform ００
 ```

ちなみに指定できるアーキテクチャは以下。

https://github.com/docker/buildx/blob/master/docker-bake.hcl

個人的にはDockerfileに書いておいた方が色々楽そう。（どちらもCIでやる場合はあまり変わらないか、、）
Raspberry Pi 上で face_recognition インストール時のハッシュエラーを解決する

# はじめに

Raspberry Pi に pip でパッケージをインストールする際、`ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.` というエラーが発生することがあります。   
これは、ダウンロードしようとしているパッケージのハッシュ値が、期待される値と一致しないために起こります。

この記事では、face_recognition のインストール時に発生したこのエラーの解決策として、`wget`コマンドを使ってパッケージを手動でダウンロードし、インストールする方法を紹介します。

# エラー内容

pip install時に以下のようなエラーが発生しました。

```bash
ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
    face-recognition-models>=0.3.0 from https://www.piwheels.org/simple/face-recognition-models/face_recognition_models-0.3.0-py2.py3-none-any.whl#sha256=8d6b0af2e37a17120c3f13107974bc252142a4ffcb4e58eabdfcf26608e52c24 (from face_recognition):
        Expected sha256 8d6b0af2e37a17120c3f13107974bc252142a4ffcb4e58eabdfcf26608e52c24
             Got        1e7cd2fe9bba3ecf96e311623dfcc3b9d1d3405a2c6c5147bfe71401ed536c08
```

[こちらの記事](https://github.com/MycroftAI/mycroft-precise/issues/79)を参考に、`--no-chache-dir`オプションをつけても同様のエラーが発生しました。

# 解決策

1. **パッケージを手動でダウンロードする**

   `https://pypi.org/project/face-recognition/#files`  から、インストールしたい `.whl` ファイルの URL をコピーします。
   そして、コピーしたURLを使い、`wget`コマンドを使ってパッケージを手動でダウンロードします。

   ```bash
   (env) hoge@hogehoge:~/tmp $ wget <コピーした.whlファイルのURL>
   ```

2. **ダウンロードしたパッケージを確認する**

   ダウンロードした `.whl` ファイルが確認できるか、`ls` コマンドで確認します。

   ```bash
   (env) hoge@hogehoge:~/tmp $ ls
   face_recognition-1.3.0-py2.py3-none-any.whl #<- ダウンロードしたファイル名
   ```

3. **ダウンロードしたパッケージをインストールする**

   ダウンロードした`.whl`ファイルを、`pip install`コマンドでインストールします。

   ```bash
   (env) hoge@hogehoge:~/tmp $ pip install face_recognition-1.3.0-py2.py3-none-any.whl 
   ```

   関連パッケージでも同様のエラーが発生する場合は、上記の手順を繰り返します。

# まとめ

`ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.` エラーは、パッケージのハッシュ値の不一致が原因で発生します。
手動でパッケージをダウンロードし、インストールすることでこのエラーを解決できます。 
# 参考文献
- [元記事。この人はtensorflowのインストールのバージョン](https://fight-tsk.blogspot.com/2019/07/pip-installerror-these-packages-do-not.html)
- [--no-chache-dirオプションをつける方法（私はこれはできなかった・・・・）](https://github.com/MycroftAI/mycroft-precise/issues/79)
- [python公式のface_recognitioページ](https://pypi.org/project/face-recognition/#description)
【便利】Windowsショートカットで爆速で仕事しよう！

# はじめに
IT業界の下流工程でも上流工程でも、なんならそれ以外の仕事に従事しているでも、避けて通れないのがPC。特にWindows PC。WindowsOSは、世界でのOSシェア率でトップに輝いています。

そんなWindowsのショートカットを覚えたら、どんな職場でも、お仕事爆速！アピールポイント増し増し！給料ザクザク（？）間違いなしなので習得推奨！
※ちなみに、以下で紹介するショートカットのCtrlをCommandに読み替えてMacで実行すると、同じような挙動をしてくれることが多いです。

# 紹介
## Windowsショートカット
- **Alt + F4（アプリの終了、シャットダウン）**
私が一番好きなショートカットッッッ！！！！このショートカットと出会って人生バラ色です。
どんなアプリやブラウザを立ち上げていても、このショートカットで一発終了してくれます。そしてなんと、シャットダウンまで実現してくれるので、一気にPC作業を終わらせたいときにうってつけなのです。
また実行できるのはシャットダウンだけではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804761/21f8cdc3-51d9-2f03-290b-7fc496dc73db.png)
このプルダウンを選択すると、「ユーザーの切り替え」「サインアウト」「スリープ」「再起動」も選べちゃいます。はぁ…ありがとう…。

- **Ctrl + T（新規タブを立ち上げ）**
ChromeやEdge、メモ帳などで新規タブを開きたいときにはこのショートカットにお世話になっています。ちなみに、仕事で使うことの多いテキストエディタである「サクラエディタ」だと、デフォルトの新規タブ立ち上げのショートカットはCtrl + Tではない（確か）なので、自分でカスタマイズが必要です。

- **Ctrl + W（タブを閉じる）**
新規タブの立ち上げときたらお次は対になる「タブを閉じる」でしょう。
私は気づいたらブラウザのタブを量産してしまうタイプなので、一日に一回はこのショートカットを叩いています。
また、場合によってはアプリも閉じることができます。上記で紹介したAlt + F4でももちろん可能ですが、Ctrl + Wに関してはキーの位置がAlt + F4よりちょうどよいんですよね個人的に（まあこれもキーボード配列で容易に変わるんですが）。
Ctrlに小指を置いて、Wは中指で押すといった容量でパンパンタブを消す瞬間の快感は何ものにも代え難いです。

- **Ctrl + E（検索バーの活性化）**
せっかくCtrl + Tで開いたタブを無駄にはせぬ！というSDGsなあなたに伝えたい、Ctrl + Eの存在を。
このショートカットをあたりまえに、寝る前に歯磨きをするが如く日常に取り入れることができれば、今の私のように謎の未使用タブを大量生産することもなくなるのでしょう…。

- **Win + E（ファイルエクスプローラーを開く）**
PC作業をしていれば一番最初に覚えるのではないか、とまで思うこのファイルエクスプローラーを出すショートカット。

- **Ctrl + Shift + N（フォルダの新規作成）**
ファイルエクスプローラー内で実行して、新規フォルダを作成するショートカットです。これも頻繁に使われるイメージ。

- **F2（ファイル／フォルダ名の編集）**
ファイルやフォルダが選択されている状態でF2キーを押せば、ファイル／フォルダ名の編集をすることができます。また、Tabキーとの合わせ技で、一度にいくつものファイル／フォルダ名の編集が可能です。
方法：
①F2キーを押下
②名前の編集をする
③そのままTabキーを押下
④真下のファイル／フォルダが編集可能状態になる
⑤②に戻る
・
・
・

- **Alt + 上矢印↑（階層の移動）**
ファイルエクスプローラー内で実行すると、自分が今いる階層の一つ上の階層に移動できます。エクスプローラー内の移動でマウスポチポチって地味に時間かかるので、めちゃくちゃお薦めです！

- **Alt + 左矢印←（階層の移動）**
上記のAlt + ↑と似ていますが、こちらは直前にいた階層に戻る、というショートカットです。ブラウザの「戻る」ボタンと同じ挙動をします。

- **Win + 上矢印↑（画面最大化）**
ブラウザやアプリの画面最大化を行います。いちいち右上の正方形のボタンを押さずに、即座に画面最大化が可能です（画面内のマウス移動って極力減らしたいですよね…）。

- **Win + D（デスクトップの表示）**
すべてのアプリを最小化し、デスクトップにまで戻してくれるショートカットです。私はGitのあれこれをするために頻繁にデスクトップを開くので、このショートカットに非常にお世話になっています。

- **Win + Shift + 矢印（画面の移動）**
モニターとPCの2画面で作業をする際によく使うこのショートカット。今手元で開いている画面を、一発で別画面に移動させてくれます。これはつい最近、キーボードの打ち間違えで発見した副産物的ショートカットなので、思わず声が漏れてしまいましたね。キモチェ～！ってなりました。

## おまけ
- **Ctrlで文字を飛ばしまくる**
これはショートカットではないジャンルですが、私はWindows PCで何かしらの文字を編集するときは、なんでもかんでもCtrlを左手小指で押しながら左矢印もしくは右矢印でカーソルを移動させることが癖になってます。
Ctrlを押しながらカーソル移動することによって、単語ごとや文節でスキップしてくれるんですよね。だから、わざわざマウスで修正する場所にカーソルをあててBackspaceもしくはDeleteキーを押さずに済みます。
Excelでも使える技なので、マウスを捨ててキーボードと共に生きていく同志諸君（と書いてカラフルボンバーズと読む。夏なのでね）には大変おすすめです。

- **「ん」を単体で打つ**
「xn」と入力すれば「ん」になります。
「nn」は同じキーを2回打つことになりますが、「xn」だと別のキーの2回打ちなのでタイプミスも減りますし、なにより入力しやすいです。

- **全角入力の場合で、半角スペースを入力する**
Shit + スペースキーで半角スペース入力ができます。
スペースのためにいちいち半角入力にするのもめんどくさいですし、人によってはファイル名にスペースを入れる際に、切り替えがめんどくさくて全角のまま行う人もいたりするので、この方法をチーム内共通で覚えておけば、ファイル名の見栄えがよくなるかもしれないですね。
ProcessCameraProviderとCameraControllerの違い

# はじめに
今回は以前にCameraXでのバーコード読み取り機能を実装していて気になっていたProcessCameraProviderとCameraControllerの違いを紹介していこうと思います
### 本文
ProcessCameraProviderはライフサイクルアーティファクトであり、
CameraControllerはビューアーティファクトになっています。
つまりCameraControllerはViewの機能の一部であり、単純なカメラ機能であればCameraControllerを使ってズームや画面の回転に合わせたPreviewの調整などをしてくれるので簡単に実装することができます。
ProcessCameraProviderはPreviewやUseCaseなどをLifeCycleOwnerに紐づけて初期化する必要があるが、ImageAnalyseなどを渡すことでやれることの様々な種類の機能を実装することができます
### 最後に
今回は似て非なるものが気になったので記事にしてみました
どなたかのお役に立てれば幸いです
Renesas RX210でmruby/c

e2 studioは遅いしWindowsのノートPCは画面が狭くて見通しがすこぶる悪いので、結局FreeBSDでLinux用のツールチェインを使って開発する事にしました。

FreeBSDにはLinuxのELFバイナリを実行する機能があり、蟹さんのツールチェインなどを動かしています。

実はportsを作ってネイディブのbinutilとgcc492をビルドしてみたのですが、ビルドはできるのですすが、正常に動くターゲットのバイナリが作れなかったので、あきらめました。

gccやbinutilのrxサポートは本家にも入っているのですがRenesas版には独自の修正が入っているようです。本家のgcc492にはmisaオプションはありません。

Renesas版のソースは提供されているので、頑張ればネイティブのコマンドが作れると思いますが、Linux互換機能で十分使えるので、ビルドはしません。

オープンソースのサイトにあるgcc4系の最後のパッケージのgcc-4.8.4.201902-SP1-GNURX-ELF.runを使いました。activation codeの事は[前の記事](https://qiita.com/yamori813/items/86148c20b6efb0f4fa0f)に書きました。

gcc8ではなくgcc4にしたのはmruby on YABMがすべてgcc4だからです。

ちょうどRXのmruby/cの記事が公開されていたので参考にしました。

https://qiita.com/nizuki926/items/230ecaecaa0c216ce361

同じコードを下記のレポジトリに突っ込んでビルドできるようにしてみました。

https://github.com/yamori813/rx-mrubyc

e2 studioで新プロジェクトで生成されたファイルにネットで見つけたコードを入れてmruby/cのコードとがっちゃんこしました。

makeするとmain.motが出来上がるので、このファイルをWindowsにコピーしてRenesas Flash Programmerで焼くと出来上がりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fd045461-3553-d142-a1b0-b8738e3e9fe3.png)

100円（税込）で動くmruby/cは最安値ではないでしょうか。

RX210へのmruby/cのポートはitocさんにpdf資料があるのですが、5年くらい前のもので、古くなっていますが、大変参考になりました。

timerサポートをやってきがついたのだがmruby/cはメモリの少ないターゲットではstackの設定が引っかかる事があるようです。RX210のtimerサポートではスタック調整のためldスクリプトをいじりました。

間違ったバイナリを焼かないために、main.motを作る時にCRCを表示するようにしました。

```
rx-elf-size main.elf
   text    data     bss     dec     hex filename
 106252    3272   12392  121916   1dc3c main.elf
rx-elf-objcopy main.elf -O srec -I elf32-rx-be-ns main.mot
CRC-32 : 29ACDD1A
```
Renesas Flash Programmerで焼く時に確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f4b62b5e-be9a-70a7-d6b8-1b5d3a0b312e.png)

Renesas Flash Programmerにはcliのコマンドもあるようです。

R5F52108ADFPの場合、焼先はFlashではなくてROMです。

スイッチ付のUSB HUBやケーブルを使うと設定を変えたときにコネクタの抜き差しをしなくてすむので便利です。

![写真（2024-07-30 8.39） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/408989d7-69fd-926b-33fa-624323e3ca1c.jpeg)

実装不良品でリセットボタンが付いてなかったのでこうしました。普通の製品ではリセットボタンでよいです。

R5F52108ADFPのROMの書き込み回数は1000回のようです。古い製品なのでちょっと少ないですが、トライ＆エラーをしている分にはそれほどにはならないと思います。ちなみに後継の製品で使われているR5F5210BBDFPは10000回のようです。

R5F52108ADFPにもデータ用のflashがあり、そこは8Kで100,000回の書き込みが出来るようです。Rubyスクリプトをいろいろ試したのであればmrbをそこに置くのも手かもしれません。データ用のflashは2バイト単位でのアクセスなので一旦ヒープにコピーして使うことにしました。
休日にプログラミングを楽しむエンジニアの正体　「シリアスレジャー」を楽しむ人たち

## はじめに

「エンジニアには休日にもプログラミングを楽しむ人がいる、休日でも勉強する人たちが多い」とよく言われます。休日にQiitaを書いている私もその一人かもしれません。

休日なのに仕事のような活動を楽しんでいる人たちは、もしかしたら「シリアスレジャー」として楽しんでいるかもしれません。

この記事は、休日に楽しく活動している人たちの正体を探るべく、「シリアスレジャー」を紹介します。

## シリアスレジャーとは

「シリアスレジャー」とは「真剣な余暇活動」を指します。「趣味に生きるの文化論」では次のように定義されます。

> アマチュア、趣味人、ボランティアによる活動で、彼・彼女らにとってたいへん重要でおもしろく、充足をもたらすものであるために、典型的な場合として、専門的な知識やスキル、経験と表現を中心にしたレジャーキャリアを歩み始めるもの

「シリアスレジャー」に対して、「カジュアルレジャー」は次のように定義されます。

> すぐにできる、内在的な価値のある比較的短期の楽しい活動であり、楽しむために専門的な訓練を必要しないもの

シリアスレジャーとカジュアルレジャーの比較は次表の通りです。

| シリアスレジャー | カジュアルレジャー |
|:-:|:-:|
| 専門的な知識・スキル | 専門性なし  |
| 継続性  | 場当たり  |
| 本気 真剣 熱心 真面目 ひたむき  | 気楽 リラックス  |


## もともと楽しんでいたものが仕事になった感覚

「休日に仕事をしている」というよりも、「もともとプログラミングや開発を楽しんでいた人たちが平日の仕事でも同じようなことをしている」という見方をすると、シリアスレジャーとしてプログラミングや開発を楽しんでいると考えることができます。

私もどちらかといえば、シリアスレジャーとしてデータサイエンスやQiitaを楽しんでいます。

休日に積極的に活動される全員に当てはまるとは言えませんが、「休日なのに〇〇する理由」の一つがシリアスレジャーかもしれません。

## おわりに

この記事ではシリアスレジャーについて説明しました。

この記事が休日に積極的に活動する人々への理解につながれば幸いです。

## 参考

宮入恭平 「「趣味に生きる」の文化論」

桜井政成「コミュニティの幸福論」
【AWS - CodeBuild】authentication required for primary source and source version


## やったこと

- GitHub Actionsで[aws-actions/aws-codebuild-run-build@v1](https://github.com/aws-actions/aws-codebuild-run-build)を使用して、AWSのCodeBuildでビルドを実施
- 下記リンクの記事を元にGitHub Actions ↔︎ AWS間の認証は実施済み

https://zenn.dev/kou_pg_0131/articles/gh-actions-oidc-aws

## エラー内容

```
authentication required for primary source and source version
```

## 原因

古いトークンを使用していたことと思われる
1. 自分はGitHub Actions実施
1. `authentication required for primary source`エラー発生
1. AWS認証トークン発行
1. GitHub Actions実施
1. `authentication required for primary source and source version`エラー発生

という流れで実施していた。
そのため、2の時点のトークン（この時点では発行していないので空）を使用し続けていたため、3以降でもエラーが発生していた

## 対応

一度CodeBuildとGitHubをDisConnectする
CodeBuildプロジェクトの上部 > 「Edit」 > 「Source」セクションで「DisConnect from GitHub」を選択して保存

自分は表示されていなかったので、以下対応を実施して保存した
Sourceセクション
Source provider　→ 「No source」　に設定
Buildspecセクション
Build specifications→ 「Insert build commands」
Build commands→ 適当に設定（echo "Hello World"等）

保存後に再度「Edit」からSource providerで「GitHub」を選択、「Repository」で対象のリポジトリを選択し、保存

ここまで実施して再度GitHub ActionsをRe-runすると、問題なく実施することができた

## 振り返り

2と5でエラーメッセージが変わっていたので、戸惑った

## 参考

- [CodeBuild で ビルドエラー “authentication required for primary source” になるときの対処方法](https://dev.classmethod.jp/articles/tsnote-codebuild-trouble-shoot-001/)
- [AWS CodeBuild failed CLIENT_ERROR: authorization failed for primary source and source version](https://stackoverflow.com/questions/64300151/aws-codebuild-failed-client-error-authorization-failed-for-primary-source-and-s)
Fizz Buzz (paizaランク C 相当) Swift らしく解く

Swift ならではのコードを紹介します。

https://paiza.jp/works/mondai/c_rank_skillcheck_sample/fizz-buzz

Swiftの[switch文](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/statements#Switch-Statement)は、caseラベルに`パターン`を指定できます。


この問題の場合は、`nを3で割った余り`と、`nを5で割った余り`のタプルをswitch文に指定して、caseラベルに取り得る値のパターンを指定します。

パターンの`0`は、余り＝0ですから、`3`もしくは`5`の倍数であることを表し、`_`は任意の値を表します。もちろん、`_`は`0`も含みますから、caseラベルを書く順番が重要です（上から順に評価されます）。

```swift
let N = Int(readLine()!)!
for n in 1 ... N {
    switch (n % 3, n % 5) {
        case (0, 0): print("Fizz Buzz") //3の倍数かつ5の倍数
        case (0, _): print("Fizz")      //3の倍数
        case (_, 0): print("Buzz")      //5の倍数
        case (_, _): print(n)           //上記以外
    }    
}
```

```terminal
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
Fizz Buzz
```


[Paiza](
https://paiza.io/projects/e/_Ks4bvHdSLQ3ZVZHWhErDQ?theme=twilight)で見る
Reactのプロジェクト作成

# Reactのプロジェクト作成コマンド
`my-app`という名称のプロジェクトを作成するときのコマンド
```
npx create-react-app my-app
```

`npx`はパッケージを一時的にインストールするためのコマンド。グローバルに何かをインストールしたくない時とかに使う。`create-react-app`はプロジェクト作成時にしか使わないし、グローバルにインストールするほどでもないので、毎回使うたびに`npx`で呼び出す感じ。

ちなみにTypeScriptのテンプレートにしたい場合は以下のコマンド
```
npx create-react-app --template typescript myapp
```

# 役目を終えたcreate-react-app
純粋なReactのプロジェクト作成するのであれば、上記のコマンドで良いが、今はもうReactの公式ドキュメントにはcreate-react-appは使われていない。

公式ドキュメントの記載
[フレームワークなしで React を使うことは可能？](https://ja.react.dev/learn/start-a-new-react-project#can-i-use-react-without-a-framework)

Reactフレームワークから何かを選んで使用することを勧められている。

# 参考
https://zenn.dev/nekoya/articles/dd0f0e8a2fa35f
https://ja.react.dev/learn/start-a-new-react-project
初心者，Python構築で躓く

# 始めに　
こちらの記事をよ～く読みましょう．私のような失敗は起きないはずです．

https://qiita.com/Obataskill/items/4cfe0d4d8cec8a140b8e



・PythonのバージョンはPython3.12.4です．


コマンドプロンプト上でpython　--versionと入力すると...
pythonと出ます．

~~~
> python --version
python
~~~

本当はこうなって欲しい...
~~~
> python --version
Python 3.12.4
~~~

# 原因
・PATHの入れ忘れ
インストーラを実行した際に表示される
add PATH　にチェックを入れ忘れるとこのようになるようです．

※チェックを入れ忘れてダウンロードをしてしまった場合でも，インストーラからアンインストールを実行し，再度インストールする際にチェックを入れれば問題が解決しました．

# 終わりに
手順書の確認，大事...
[TypeScript] 引数は同じだけど返り値が異なる関数の型定義にGenericsを使ってみた。

## 状況
下記のように、引数として受け取るものは同じだけど、返り値は異なる関数が複数ある状態を考える。
``` ts
const processToNumber: ProcessFunction<number> = (a, b, c, d, e) => {
    return a * 2;
};

const processToString: ProcessFunction<string> = (a, b, c, d, e) => {
    return b.toUpperCase();
};

const processToBoolean: ProcessFunction<boolean> = (a, b, c, d, e) => {
    return !c;
};
```

ESLintで引数に全て型を入れるように設定しているため、対応したら下記のような形になった。このような関数が追加されるたびに繰り返す必要があるのですごく気になる。
普通にコードが長くなって読みにくい。
``` ts
const processToNumber: ProcessFunction<number> = (a: number, b: string, c: boolean, d: object, e: string[]) => {
    return a * 2;
};

const processToString: ProcessFunction<string> = (a: number, b: string, c: boolean, d: object, e: string[]) => {
    return b.toUpperCase();
};

const processToBoolean: ProcessFunction<boolean> = (a: number, b: string, c: boolean, d: object, e: string[]) => {
    return !c;
};
```

## Unionタイプを作る
or演算をさせて出る予定の型を定義すると型定義のパートは分離できる。
しかし、新しいパターンが追加されるとどんどん冗長な書き方になっていく
``` ts
type ProcessFunction = 
  ((a: number, b: string, c: boolean, d: object, e: string[]) => number) |
  ((a: number, b: string, c: boolean, d: object, e: string[]) => string) |
  ((a: number, b: string, c: boolean, d: object, e: string[]) => boolean);


const processToNumber: ProcessFunction = (a, b, c, d, e) => {
    return a * 2;
};

const processToString: ProcessFunction = (a, b, c, d, e) => {
    return b.toUpperCase();
};

const processToBoolean: ProcessFunction = (a, b, c, d, e) => {
    return !c;
};
```

## Genericsを使うと便利
Tに返り値の型定義を行うGenericsを使うと何度も引数の定義をしなくても良くなった！
今までGenericsを知ってはいたけど活用の仕方がわからなかったため、これからは結構使えそう。
``` ts
type ProcessFunction<T extends number | string | boolean> = (
  a: number,
  b: string,
  c: boolean,
  d: object,
  e: string[]
) => T;

const processToNumber: ProcessFunction<number> = (a, b, c, d, e) => {
    return a * 2;
};

const processToString: ProcessFunction<string> = (a, b, c, d, e) => {
    return b.toUpperCase();
};

const processToBoolean: ProcessFunction<boolean> = (a, b, c, d, e) => {
    return !c;
};
```
子要素の高さを親要素の高さまでにする(flex)

# 困ること
CSSを組んでいると以下のようにchildの高さにつられてparentの高さが変わってしまう場面に遭遇します😥

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43805/fcc12509-9f7b-1bb7-9e6b-7ac7df2cc003.png)

ちなみにhtmlは以下(tailwindcss使用)
flex使う前提となってます
```html
<div id="grand-parent" class="h-52 w-52 m-4 p-2 border-4 border-zinc-600">
  <div id="parent" class="flex grow border-2 border-slate-400 p-4 gap-2">
    <div id="child1" class="border-2 border-purple-400 w-24 p-2">
      child1
    </div>
    <div id="child2" class="border-2 border-pink-400 w-24 p-2 flex flex-col">
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
    </div>
  </div>
</div>
```

このとき、child2に`max-h-full`と`overflow-auto`を設定して親の高さに収めようとしてみますが、ものともしません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43805/64942ab2-5494-34e9-20f9-c83d0df6c009.png)

# 解決方法

何度も同じ問題にぶち当たるわりには覚えられない対処法は以下

:::note info
親要素に`max-h-full`
子要素に`shrink`,`basis-0`をつかう
※ 子要素に`flex-col`か`max-h-full`を指定すれば使える、はず
:::

以下のようなhtmlで
```diff_html
<div id="grand-parent" class="h-52 w-52 m-4 p-2 border-4 border-zinc-600">
+ <!-- max-h-full追加 -->
+ <div id="parent" class="flex grow border-2 border-slate-400 p-4 gap-2 max-h-full">
    <div id="child1" class="border-2 border-purple-400 w-24 p-2">
      child1
    </div>
+   <!-- overflow-auto, max-h-full, basis-0,shrink追加 -->
+   <div id="child2" class="border-2 border-pink-400 w-24 p-2 flex flex-col  overflow-auto shrink basis-0">
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
      child2
    </div>
  </div>
</div>
```

このように表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43805/a7c39dc8-7af6-8cc9-7262-603b4d05be05.png)

よく忘れて毎度闘っている気がするので備忘録として残します
cssは難しいですね🫨
Angular materialのカレンダーBodyにある日を非表示にしたい(DateAdapter)

先日、下記の記事を書いたが、もっと良い方法があった

https://qiita.com/beltway7/items/a181a6cc65352a75b7d6

# DateAdapterを使えば良い

下記記事の「Provider上書き」がまさに正解！！

https://qiita.com/chibi929/items/3577a8b0a2d751dc6bb6#provider-%E4%B8%8A%E6%9B%B8%E3%81%8D

# サンプルコード

いつも通り、Stackblitz。

https://stackblitz.com/edit/stackblitz-starters-umgetp?file=src%2Fmain.ts

# 結果

![Screenshot 2024-07-28 at 15.21.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/cab1171d-ca96-4a39-f76b-f312625b2636.png)

# 最後に

もう、これ以上、良い書き方はないと思いますが、あったら教えてください！
Lambda関数を定期的に実行するEventBridge SchedulerをTerraformで作る

# 概要
最近はEventBridgeではなくSchedulerのほうが推奨されているらしいので、やってみました。

参考URL -> https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-EventBridge-Scheduler_0930_v1.pdf (P.9参照)

# 環境
- Terraform 1.9.1
- Terraform AWS Provider 5.36.0

# コード
```terraform
# Lambda関数
resource "aws_lambda_function" "sample" {
  # 省略
}

# EventBridge Scheduler使用するIAMロール
resource "aws_iam_role" "sample_scheduler" {
  name = "sample-scheduler-role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Sid    = ""
        Effect = "Allow"
        Principal = {
          Service = "scheduler.amazonaws.com"
        }
        Action = "sts:AssumeRole"
      }
    ]
  })
}

# Lambda関数を実行する権限を与える
resource "aws_iam_role_policy" "sample_scheduler" {
  role = aws_iam_role.sample_scheduler.name
  policy = jsonencode(
    {
      Version = "2012-10-17",
      Statement = [
        {
          Action = [
            "lambda:InvokeFunction",
          ],
          Effect   = "Allow",
          Resource = aws_lambda_alias.sample.arn,
        },
      ],
    }
  )
}

# Lambda関数を起動するスケジューラー
# EventBridgeではなく、Schedulerのほうが推奨されている
# https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-EventBridge-Scheduler_0930_v1.pdf (P.9参照)
resource "aws_scheduler_schedule" "sample" {
  name                         = "run-sample"
  schedule_expression_timezone = "Asia/Tokyo"        # 日本のタイムゾーンを指定
  schedule_expression          = "cron(0 1 * * ? *)" # 日本時間で設定可能！この場合は毎日AM1時0分

  flexible_time_window {
    mode                      = "FLEXIBLE"
    maximum_window_in_minutes = 1
  }

  target {
    arn      = aws_lambda_function.sample.arn    # 実行するLambda関数のARN
    role_arn = aws_iam_role.sample_scheduler.arn # スケジューラーのIAMロールのARN
  }
}

# SchedulerがLambda関数を起動できるように権限を追加
resource "aws_lambda_permission" "sample" {
  statement_id  = "sample-scheduler"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.sample.function_name
  principal     = "scheduler.amazonaws.com"
  source_arn    = aws_scheduler_schedule.sample.arn
}
```

# 参考URL
- [AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-eventbridge-scheduler.html)
一番小さい値 (paizaランク D 相当) Java解答例

# 問題文
https://paiza.jp/works/mondai/d_rank_skillcheck_sample/min_num

# 解答例
```java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		try (Scanner scanner = new Scanner(System.in)) {
			int min = scanner.nextInt();
			for (int i = 0; i < 4; i++) {
				min = Integer.min(min, scanner.nextInt());
			}
			System.out.println(min);
		}
	}
}
```

# 補足
JavaのStreamを利用してみた別解が以下。
```java
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		try (Scanner scanner = new Scanner(System.in)) {
			List<Integer> list = new ArrayList<>();
			for (int i = 0; i < 5; i++) {
				list.add(scanner.nextInt());
			}
			System.out.println(list.stream().min(Comparator.naturalOrder()).orElseThrow());
		}
	}
}
```
一応上記でも動く……が、このやり方だと値を全てlist上に保持していくことになるため、比較する値の個数が多くなっていくとどこかでOutOfMemoryErrorとかが発生するはず。その場合は大人しく最初の解答例のような実装（不要な値は捨てていく）にするほうが良い。