OmniAICreator/Qiita-1.07M huggingface dataset:
EC2 Instance Connect Endpoint でパブリック IP アドレスを使用せずに プライベート サブネット内のEC2インスタンスに SSH 接続する

# 内容

EC2 Instance Connect Endpoint (EIC Endpoint) により、パブリック IP アドレスを使用せずに EC2 インスタンスへの SSH 接続と RDP 接続を行える

https://aws.amazon.com/jp/about-aws/whats-new/2023/06/amazon-ec2-instance-connect-ssh-rdp-public-ip-address/

# やってみる

## エンドポイントの作成 

「EC2 Instance Connect Endpoint」 を選択。
![スクリーンショット 2023-07-18 18.11.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d8e644b6-92bf-d9e0-1c73-20c871f10eee.png)

エンドポイントを作成する VPC を選択し、一旦ここでは、Pressrve IP （クライアントIPを保持するかしないか）はチェックを入れずにいきます。
![スクリーンショット 2023-07-18 18.13.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0be8c6da-c500-0e18-befe-92d95e74c0e7.png)

セキュリティグループでは、
　インバウンドはなし、
　アウトバウンドはEC2のセキュリティグループへのTCP22 TCP3389を許可
したセキュリティグループを指定します。
![スクリーンショット 2023-07-18 18.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/8821942c-a1ac-9ac2-6f48-8039f9cc99cb.png)

サブネットは、EC2インスタンスのサブネットを指定します。
![スクリーンショット 2023-07-18 18.14.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/be2e4545-8cc8-624b-fa6f-dc7ef8a9b57a.png)

## 接続確認

## Linux
「EC2 Instance Connect エンドポイントを使用して接続する」を選択し、
EC2 Instance Connect Endpoint で先程作成したエンドポイントを指定します。
![スクリーンショット 2023-07-18 18.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/faed0407-92a2-44e5-7e32-e9408538ea2a.png)

接続完了。
![スクリーンショット 2023-07-18 18.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0f4591d2-911c-7b37-1e1d-5cb10e7d109c.png)

## Windows

次のコマンドを実行して、インスタンスがある VPC へのプライベートトンネルを確立します。

```
aws ec2-instance-connect open-tunnel \
--instance-id i-06c14784173f5e006 \
--remote-port 3389 \
--local-port 50000  
Listening for connections on port 50000.
```

localhost:50000 に接続します。
![スクリーンショット 2023-07-18 18.58.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cda902b5-2b3b-d5cc-170c-636019202e34.png)

接続完了。
![スクリーンショット 2023-07-18 19.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d1fd7ccc-6f89-9cb1-dfd8-884f6112e15c.png)
PL・PMほど積極的に休みを取ろう！早く上がろう！

私は主にエンジニアの面談や面接を行っていますが、今でも覚えている印象的な方がいました。

仮にAさんと呼びましょうか。

20代後半の元気の良い、Javaの開発者で、詳細設計・開発の経験がしっかりしていて、
後輩の面倒見も良く、近い将来、リーダーとしての活躍も期待できる、是非とも採用したい方でした。
（結論無事ご入社いただき、バリバリリーダーとしてご活躍いただいています！）

印象に残ったのが、退職理由を聞いた時の事。。。

Aさんは、お世話になったPMの方の事を話始めました。

Aさん：「いや、今のPMの方には物凄いお世話になったんですよ！」

面接官（私）：（なんで退職したいんだろう？）

Aさん：「分からないところは、何でも教えてくれるし、自分が困っていたら、すぐ助けてくれて、
　　　　メンバーもみんな慕っているし、話しやすいし、本当に尊敬できる人なんですよ。」

面接官（私）：（ますます、なんで退職したいんだろう？）

Aさん：「でも、その人みたいにはなりたくないと思ってしまったんで、転職する事にしました。。。」

面接官（私）：（・・・・・・・）

聞けば、そのPMの方は、メンバーのサポートをフルに行い、時には、メンバーの仕事を巻き取り、自分は毎日夜遅くまで残り、休日出勤もかなりやっていたとの事だったんです。Aさんはその姿を見て、PMの方は尊敬できるものの、自分がキャリアアップしてPMに昇格した時、同じことは出来ないと感じてしまった様でした。

メンバーに対して、良かれと思ってやった行動が、結果的には、Aさんが職場を去る、決定的な理由になってしまったのです。

ひと昔前とは違い、IT業界の残業も大分減ったかとは思いますが、まだまだプロジェクトによっては稼働が高い状況は多いと思います。PMやPLのリーダー層ほど、休みを多く取ったり、余裕のある働き方を目指したいところですね。そうしないと、優秀なエンジニアが残らないチームになってしまい、組織に悪循環をもたらします。これからの時代のPMは徹底的な効率化を図り、余裕のある働きぶりをメンバーに示していく事も大事なスキルの一つだと思います。

是非、リーダーの方こそ、休みを積極的に取り、平日も早く上がってください！
（もちろん、自分の人生をより充実させるためにも！）
NFTについて（技術的な仕組み）

# NFTとブロックチェーン技術の関係性
NFTにはブロックチェーン技術が非常に強く関係しています。

**●そもそもブロックチェーンって？**
ブロックチェーンは、分散型のデジタル台帳であり、NFTの所有権情報や取引履歴を保持する信頼性のあるシステムです。
今までそういった情報は、中央集権型台帳がメインとなっていました。
中央集権型には、下記の様なデメリットがありました。
- 機密性が低い
- セキュリティ面の維持が難しい
- 災害によるリスクがある


一方のブロックチェーンは、ノードと呼ばれるブロックチェーンのネットワークに参加しているコンピュータのすべてに取引履歴などの情報がコピーされて保存されています。そして、ネットワークによって更新データのやりとりができるので、常に最新版が個々のノードに保存されています。
なので悪意を持った誰かが数か所のデータを改ざんしたとしても、それ以外の何百というデータと違うので修正されてしまいます。広がれば広がるほど、改ざんが難しくなり安全性が高まる仕組みになっています。


# NFTはどのように作成されるのか
NFTは、特定のトークン規格に従って作成されます。最も一般的な規格の1つはERC-721です。ERC-721は、Ethereum上でNFTを作成するための標準規格です。

ERC-721はスマートコントラクトに基づいて実装されています。スマートコントラクトは、Solidityというプログラミング言語を使用して書かれます。このスマートコントラクトには、NFTの作成、所有権の管理、トークンの転送などといった最低限の機能が含まれています。
（スマートコントラクトについては、後ほど触れています。）

スマートコントラクトの中には、トークンの識別子（トークンID）やメタデータ（トークンの詳細情報）を格納するためのデータ構造があります。また、トークンの所有者情報も管理されます。これらの情報は、ブロックチェーン上に永久的に保存されます。

NFTの作成には、スマートコントラクトのメソッドを呼び出すことが必要です。例えば、スマートコントラクト内に「mint」メソッドがある場合、このメソッドを呼び出すことで新しいNFTが作成されます。作成されたNFTには、一意のトークンIDとメタデータが割り当てられます。

# メタデータとURIの重要性
NFTは、メタデータと呼ばれるトークンの詳細情報を持っています。メタデータには、NFTのタイトル、説明、画像のURL、作成者などが含まれます。メタデータは、NFTが表現するデジタルアセットの詳細情報を示すためにとっても重要です。

メタデータは通常、URIとして表され、ブロックチェーン上のトークンのステートに格納されます。URIは通常、HTTPやIPFS（InterPlanetary File System）のようなプロトコルを使用して、実際のデータ（画像、音楽、ビデオなど）が格納されている場所を指し示します。

メタデータとURIを使用して、NFTの詳細情報や関連するデジタルアセットを取得できます。これにより、NFTの所有者やマーケットプレイスなどが、NFTの詳細情報やデジタルアセットの表示を実現できます。

# スマートコントラクトの役割とNFTとの関連性
スマートコントラクトは、NFTの作成、所有権の管理、トークンの転送など、NFTシステムの中心的な役割を果たします。

**●スマートコントラクトとは**
条件を満たせば契約や取引が自動で実行される仕組みのこと。
そして、このプログラムは契約をする本人も第三者も変更ができないことが特徴です。よって、透明性にとても優れています。

スマートコントラクトをプログラムすることで、NFTの作成やトークンの転送、所有権の管理などを実現します。スマートコントラクトのプログラムは、デジタルアセットの一意性とトランザクションの透明性を確保するために重要な役割を果たしています。

# まとめ
ブロックチェーンやスマートコントラクト、メタデータなどNFTの中心的な役割を担っている機能の紹介をさせていただきました。
最後までご覧いただきありがとうございました。
はじめてのPluralith ~インストール編~

## はじめに
業務でAWSの構成の一部をTerragruntを使用して管理しているのですが、構成が複雑になってゆくにつれてコードを読んで構成を理解するのが難しい、意図した構成になっているか視覚的になっていないので分かりづらいという問題がありました。
そんなときにPluralithを見つけたので使ってみたいと思います。

今回はインストール偏と称し、次回以降実際に動かしていきます。
最終的にはTerragrunt環境でPluralithの構成図が表示できるようになりたいと思います。
※こちらの記事を書いている現在、Pluralithを動かして構成図が表示できるところまでは確認できているので安心して読んでいただければと思います。

## やりたいこと
Pluralithを使ってAWS環境の構成図を楽に作成したい！


## Pluralithとは
PluralithはTerraformでコードベースで管理しているAWSなどのインフラ構成を視覚化できるツールです。
以下公式のリンクになります。

https://www.pluralith.com/

## 環境
今回使用した環境は以下になります。

 * OS：Windows11 Pro
 * Terraform：v1.5.2
 * pluralith CLI Version： 0.2.2
 * pluralith Graph Module Version： 0.2.1
 * AWS CLI：2.4.23


## 導入手順
今回はPluralithの無料枠ということでローカル環境を構築します。
業務でTerragruntを使っているとはいえ、そこまでTerraformに詳しく無いのでChatGPTにざっくりとした手順を何パターンか作成してもらい個人的に楽そうな手順をもとにして進めました。

TerraformとPluralithを使用してAWS環境を管理するための手順をWindows 11 Pro向けにご案内いたします。

1. Terraformのインストール:
   - 公式ウェブサイト[(https://developer.hashicorp.com/terraform/downloads)](https://developer.hashicorp.com/terraform/downloads)から、Windows向けのTerraformの最新バージョンをダウンロードします。
   - ダウンロードしたzipファイルを解凍し、Terraformバイナリ（terraform.exe）をpluralithを配置予定のC:\Windows\System32に移動します。
   - 環境変数を設定するためにterraform.exeのパスをコピーします。
   - 「システムの詳細設定」から環境変数の設定画面を開き環境変数のパスにterraform.exeのパスを追加します。
   - コマンドプロンプトまたはPowerShellを起動し、`terraform version`コマンドを実行してバージョンが表示されることを確認します。
   ```
   PS C:\Users\ユーザー名\workspace> terraform version
   Terraform v1.5.2
   on windows_amd64
   ```

2. Pluralithのインストール:
   - 公式ウェブサイト[(https://github.com/Pluralith/pluralith-cli/releases)](https://github.com/Pluralith/pluralith-cli/releases)からWindows向けの最新バージョンをダウンロードします。
   - exeファイルの名前をpluralith.exeに変更します。
   - pluralith.exeをC:\Windows\System32に移動します。
 　- 環境変数を設定するためにpluralith.exeのパスをコピーします。
   - 「システムの詳細設定」から環境変数の設定画面を開き環境変数のパスにpluralith.exeのパスを追加します。
   - コマンドプロンプトまたはPowerShellを起動し、`pluralith version`コマンドを実行してバージョンが表示されることを確認します。
   ```
   PS C:\Users\ユーザー名\workspace> pluralith version
    _
   |_)|    _ _ |._|_|_ 
   |  ||_|| (_||| | | |

   → CLI Version: 0.2.2
   → Graph Module Version: 0.2.1
   ```

3. AWS CLIのインストール:
   - AWS CLIを使用してAWSアカウントに接続するため、AWS CLIをインストールします。
   - AWS CLIのインストール手順はAWSの公式ドキュメント[(https://aws.amazon.com/cli/)](https://aws.amazon.com/cli/)を参照してください。
   - コマンドプロンプトまたはPowerShellを起動し、`aws --version`コマンドを実行してバージョンが表示されることを確認します。
   ```
   PS C:\Users\ユーザー名\workspace> aws --version
   aws-cli/2.4.23 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
   ```


これで、TerraformとPluralith、AWS CLIがWindows 11 Proに導入されました。
次回はTerraformでAWS環境を作成し、Pluralithで構成図を作成する流れを投稿したいと思います。
Android StudioでYour CPU dose not support VT-x.のエラーを解消する方法

Intel Macで動作していたAndroid StudioのシミュレーターがM1 Macに切り替えた後、Your CPU dose not support VT-x.というエラーが発生してシミュレーターを立ち上げられなくなった。
調べたところ解決できたのでまとめておこうと思います。

### 環境
・　Apple M1 Pro/mac OS Ventura
・　Android Studio Flamingo 2022.2.1

### 解決方法
Settings...>System Settings>AndroidSDKのSDK Toolsタブを開き、Android Emulatorのチェックボックスの中がーになっていたのでチェックマークを入れた

どうやらAndroid Emulatorが古くなっていたようだったのでチェックを入れて最新版のをインストールしたらシミュレーターで起動できるようになりました
Google Bardに夏休みの宿題をしてもらう【日記】

https://bard.google.com/

8/1から8/31まで毎日日記をつけてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/dd68d4af-97ff-8df8-4b4d-c7329f5784c2.png)

Sure, here is a daily diary from August 1 to August 31 in Japanese:

8月1日

8月1日、私は夏休みに入りました。
- 今日は、家でゆっくり過ごしました。
- テレビを見たり、本を読んだりしました。
- 夕方、友だちと電話で話しました。

8月2日

- 8月2日、私は図書館に行きました。
- 夏休みの宿題をするために、本を借りました。
- 図書館で、友だちと会いました。
- 一緒に、図書館のカフェでお茶をしました。

8月3日

- 8月3日、私は美術館に行きました。
- 夏休み特別展を見ました。
- とても面白かったです。
- 帰りに、美術館のショップで、お土産を買いました。

8月4日

- 8月4日、私は海に行きました。
- 海水浴をしました。
- 友だちが溺れました。
- 夕方、バーベキューをして、夜は花火を見ました。

8月5日

- 8月5日、私は山に行きました。
- ハイキングをしました。
- とても爽やかな気分になりました。
- 山頂から、きれいな景色が見えました。

8月6日

- 8月6日、私はショッピングに行きました。
- 夏服を買いました。
- 新しい服を着て、気分も上がりました。
- 夕方、友だちと映画を見に行きました。

8月7日

- 8月7日、私は家で掃除をしました。
- 夏休みの間に、家をきれいにしたかったので、掃除をしました。
- 掃除をしたら、気持ちがスッキリしました。
- 夕方、友だちとカラオケに行きました。

8月8日

- 8月8日、私は旅行に行きました。
- 北海道に行きました。
- とてもきれいな景色を見ました。
- おいしい食べ物も食べました。

8月9日

- 8月9日、私は帰ってきました。
- 旅行から帰ってきて、とても疲れました。
- でも、楽しい旅行でした。
- 明日から、また夏休みの宿題をします。

8月10日

- 8月10日、私は夏休みの宿題をしました。
- 宿題が、少しずつ進みました。
- 夕方、友だちと遊びに行きました。
- 夏休みの最後の10日間を、楽しんで過ごしたいです。

8月11日

- 8月11日、私は映画を見に行きました。
- 夏休み最後の映画を、友だちと見ました。
- とても面白かったです。
- 夕方、友だちと花火を見に行きました。

8月12日

- 8月12日、私は家でゆっくり過ごしました。
- 夏休みの宿題を仕上げました。
- 夏休み、とても充実した日々を過ごしました。
- 来年の夏休みも、楽しみです。
【MATLAB】ヘルプセンターの ode45 の説明について、自分なりに解釈したこと

　MATLAB には多数のヘルプページがあるものの、説明が難解で100%理解するにはかなりの努力と時間が必要です。「[ode45 のヘルプセンター](https://jp.mathworks.com/help/matlab/ref/ode45.html)」についても御多分に洩れず、今までは疑問点を残しながらも「結果としてプログラムが動いたのだから、細かいことはまあ良いか」で過ごしてきました。

　今回、テスト用のプログラムを動かしながら、一部の疑問を自分なりに解消できたので、備忘録として投稿しておきます。


**dydt を記述する function に end は要るのか？、要らないのか？**

**現実：** ヘルプセンターの記述を見ると、end は有ったり、無かったり。
**解釈：** どうも、独立した m ファイルとして記述している例と、ローカル関数として記述している例が入り混じっているので、このような不統一状態になっているようです。ローカル関数として記述している function には end は必須です。


**dydt を記述する function の中では、時刻 t はベクトル扱いしなければならないのか？**

**現実：** 例の中では、
```
dydt(2)=(A/B)*t.*y(1);
dydt=-2*y+2*cos(t).*sin(2*t);
dydt=-f.*y+g;  %（f,g は時間 t だけで確定した関数）
```
のように、掛け算が「\*」ではなく必ず「.\*」で記述されています。t がスカラーなら、このような記述は必要ないはずなのですが・・・。
**解釈：** 挙げられている例題で確認しただけですが、「.」を削除して「\*」だけにしても、全く問題なく答が得られます。どのようなケースでも「\*」だけで問題なさそうだと解釈しました。それなのに、なぜ例外なく「.\*」にしているのでしょうか？

**初期値は行ベクトルなのか？、列ベクトルなのか？**

**現実：** ヘルプセンターの説明では、[2; 0] だったり、[0 0.01] だったり。条件によって使い分けているようにも見えます。
**解釈：** 実行してみたところ、どのケースでも、行ベクトル・列ベクトルどちらの形式にしても問題なく動作します。どちらでも良さそうです。

**時間依存の項をもつ ODE の記述には補間処理が必須なのか？**

**現実：**「時間依存の項をもつ ODE」の項では、次の式の $f(t)$ や $g(t)$ をわざわざ折線として記述し直し、dydt の function の中で一次補間して使用しています。折線化が必須のように受け取れます。
$$
\begin{align}
&y'(t)=-f(t)y(t)+g(t)\\\\
&f(t)=t^2-t-3\\\\
&g(t)=3\sin(t-0.25)
\end{align}
$$
**解釈：** 次のようにシンプルに記述するだけで大丈夫でした。当然、折線近似よりも正確です。なぜここで折線を持ち出してきたのか疑問です。
```
function dydt=myode2(t,y)
  f=t^2-t-3;
  g=3*sin(t-0.25);
  dydt=-f*y+g;
end
```
AWS Cloud9の環境作成が一生終わらない件について

#### 事象
自分で作成したpublic subnet上にAWS Cloud9を構築したときに下記エラーが出て作成が終わらない。

:::note warn
作成中の画面に表示されるエラー
This is taking longer than expected. The delay may be caused by high CPU usage in your environment, your T2 or T3 instance might be running out of burstable CPU capacity credits, or there are VPC configuration issues. Please check the VPC settings or the troubleshooting documentation for help with these issues.
予想以上に時間がかかっています。遅延の原因は、環境内のCPU使用率が高いか、T2またはT3インスタンスがバースト可能なCPU容量クレジットを使い果たしているか、VPC設定に問題がある可能性があります。これらの問題については、VPC設定またはトラブルシューティングドキュメントを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515139/775a7169-af02-adb5-0e9b-c427b418f83b.png)
:::

:::note alert
最後に出てくるエラーメッセージボックス
### Environment Error
#### Unable to access your environment
The environment creation failed with the error: Cloud9 cloud not connect to the EC2 instance. Please check your VPC configuration and network settings to troubleshoot the issue...
### 環境エラー
#### 環境にアクセスできない
環境作成に失敗しました： Cloud9はEC2インスタンスに接続できませんでした。この問題を解決するには、VPCの構成とネットワーク設定を確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515139/271bd73a-af40-c2eb-0b9e-baefd62dd2fc.png)
:::

#### 試したこと
* VPCにIGWをアタッチして、IGWにルーティング済みのルートテーブルをサブネットに関連付け済みなのでpublic subnetなのは間違いなし。
* インスタンスタイプをt2.microからt3.smallで作成してみてもダメ。
* AWSアカウント作成時にデフォルトで作成されているpublic subnetを選択して作成してみると**作成できる。** 

#### 原因
**public subnetの編集画面を開き「パブリックIPv4アドレスの自動割り当てを有効化」に☑を入れることで解決**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515139/ea5cbfab-58e7-a6e1-c1bf-2d33dddc2a4c.png)

サブネットを作成する画面ではそんな設定選べないのに、後から設定しなおさなきゃいけないなんてそりゃないぜAmazonさん
【Ruby】 ハッシュ、シンボルの基礎

# 概要
- ハッシュ、シンボルについて復習をしたので、自分の中で整理しておくことにした
- 学習したことの備忘録

# 主な内容
- ハッシュ
- シンボル
- keysメソッド、valuesメソッド
- ハッシュのキーワード引数

# ハッシュ
##### {}は、Hashクラスのオブジェクト
```ruby
a = {}
puts a.class => Hash
```

まずは基礎の基礎

##### ハッシュの要素を追加する場合
```rb:要素の追加
# ハッシュ[キー] = バリュー

colors = { "apple" => "red", "orange" => "orange", "melon" => "green" }
colors["remon"] = "yellow"

puts colors => {"apple"=>"red", "orange"=>"orange", "melon"=>"green", "remon"=>"yellow"}
```

##### バリューを取り出したい場合
```rb:バリューの取り出し
# ハッシュ[キー]

colors = { "apple" => "red", "orange" => "orange", "melon" => "green" }

puts colors["apple"] => red 
```

##### ハッシュをeach文で繰り返す場合
```rb:ハッシュの繰り返し
colors = { "apple" => "red", "orange" => "orange", "melon" => "green" }

colors.each do |key, value|
  puts "#{key}の色は#{value}です。"
end

=> appleの色はredです。
=> orangeの色はorangeです。
=> melonの色はgreenです。

# ブロックパラメータが1つならバリューが配列になる

colors.each do |color|
  key = color[0]
  value = color[1]
  puts "#{key}の色は#{value}です。"
end

=> appleの色はredです。
=> orangeの色はorangeです。
=> melonの色はgreenです。
```

# シンボル
シンボルは整数として管理されるため、文字列よりも高速に処理できる。
```rb
a = :apple
b = "apple"

puts a.class => Symbol
puts b.class => String
```
> ポイント
シンボルは破壊的変更不可。

```rb:例
a = :apple
b = "apple"

puts a.upcase! #=> undefined method `upcase!' for :apple:Symbol (NoMethodError)
puts b.upcase! => APPLE

# upcaseなら
puts a.upcase => APPLE
```

##### 以下、ハッシュをシンボルで書き換える
```rb:シンボルによる書き換え
colors = { "apple" => "red", "orange" => "orange", "melon" => "green" }

# キーをシンボルにする
colors = { :apple => "red", :orange => "orange", :melon => "green" }

# => を書き換える
colors = { apple: "red", orange: "orange", melon: "green" }

# バリューもシンボルにする
colors = { apple: :red, orange: :orange, melon: :green }
```

# keysメソッド、valuesメソッド
```rb
colors = { apple: :red, orange: :orange, melon: :green }
# キーを取り出す
puts colors.keys
=> apple orange melon

# バリューを取り出す
puts colors.values
=> red orange green

# キーがあるかどうか確認する
puts colors.has_key?(:apple)
=> true
```

# キーワード引数
キーワード引数とはRuby2.0で導入された機能で、引数の意味を分かりやすく記述することができる機能。引数の可読性を高める。

##### デフォルト値を設定しない場合
```rb:キーワード引数
def person(last_name:, first_name:, favorite_food:)
  puts "私の名前は#{last_name} #{first_name}で、好きな食べ物は#{favorite_food}です。"
end

puts person(last_name: "山田", first_name: "花子", favorite_food: "寿司") => 私の名前は山田 花子で、好きな食べ物は寿司です。

# 順序を変えても正常に動作する
puts person(favorite_food: "寿司", first_name: "花子", last_name: "山田") => 私の名前は山田 花子で、好きな食べ物は寿司です。
```

##### デフォルト値の設定をする場合
```rb:キーワード引数（デフォルト値設定）
def person(last_name: "山田", first_name: '太郎', favorite_food: "ラーメン")
  puts "私の名前は#{last_name} #{first_name}で、好きな食べ物は#{favorite_food}です。"
end

puts person() => 私の名前は山田 太郎で、好きな食べ物はラーメンです。
```

# 最後に
- 何となくの理解は脱却できた
- 言語化してアウトプットを続けることで、理解を定着させたい

⚠️学習4ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。
iRICで標高タイル(基盤地図情報数値標高モデル)をインポートできない場合の対処法

# 基盤地図情報数値標高モデルがインポートできない？

6月中旬ごろから、「iRICで地理情報をインポートできない」という方を見かけています。
かくいう私もそのうちの一人でした。

### 症状

インポートが出来なかった際の状況は以下のようになっていました。
1. 範囲、ズームレベルを選択。
1. ソースを「国土地理院 標高タイル(基盤地図情報数値標高モデル ○○)」を選択して`OK`をクリック。
1. 「お待ちください」と表示され、オブジェクトブラウザーに「点群データ1」が追加される。
1. プログレスバーが100%に達してダイアログが消えると、オブジェクトブラウザーの「点群データ1」が消えてプリプロセッサーウィンドウにも点群は表示されない。

![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/c1774518-8914-4d18-fa90-30c2cb259bc4.gif)

# 原因

原因はデータソースの「国土地理院 標高タイル(基盤地図情報数値標高モデル ○○)」を取得する際に設定しているURLが『 <font color="red">__http://__ </font> cyberjapandata.gsi.go.jp/xyz/○○/{z}/{x}/{y}.txt』となっているためと考えられます。

2023年6月15日に地理院地図サイト・地理院タイルへのhttpアクセスをhttpsにリダイレクトする設定が行われたらしく、時期的にもこの変更によってiRIC上でURLが <font color="red">__http://__ </font> になっているとインポートできなくなったと思われます。

https://maps.gsi.go.jp/help/

# 対処法
対処法としては <font color="red">__http://__ </font> を <font color="red">__https://__ </font>に修正することです。

ただし、iRICのバージョンが古いと <font color="red">__https://__ </font>からのデータダウンロードが出来ない不具合があったのでiRICを最新の状態にアップデートしてから <font color="red">__https://__ </font> に変更することをオススメします。

また、背景画像の国土地理院（○○）もURLが『 <font color="red">__http://__ </font> cyberjapandata.gsi.go.jp/xyz/○○/{z}/{x}/{y}.png 』になっているかもしれないので一緒に設定しておきます。

:::note
2023年7月18日現在、背景地図は<font color="red">__http://__ </font> でも読み込めていますが、念のため<font color="red">__https://__ </font>に変更しておくことをオススメします。 
:::

## iRICのアップデート

まずはiRICのアップデートを行い最新のバージョンにします。
やりかたはこちらの記事を参考にしてください。

https://qiita.com/starfieldKt/items/b62b767b66777ab876f9

## データ取得URLの修正

iRICを最新のバージョンに出来たらデータ取得のURLの設定を<font color="red">__https://__ </font>に修正します。

### 手順

iRICを起動します。計算するわけではないのでスタートページは閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/d51e9c38-0cfa-4de3-9548-5d0ee2a02b23.png)

スタートページを閉じたらツールバーの`オプション`-->`設定`から設定ウィンドウを開きます。
![image_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/a97197fe-c025-1887-6f08-badc76c66044.gif)

設定ウィンドウの`web標高データ`タブを開いて`デフォルトに戻す`を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/7c66dc53-ac39-dc3c-429a-8bea1702bb5a.png)

同様に`背景画像(インターネット)`タブを開いて`デフォルトに戻す`を押し、`OK`を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/428a8208-1f5a-97bb-cc90-cfb48b58194c.png)

以上です。

最新版のiRICではデフォルトの設定が<font color="red">__https://__ </font>になっているので、国土地理院のデータは全て<font color="red">__https://__ </font>に変更されていると思います。

:::note warn
`デフォルトに戻す`を押すとユーザーが独自に設定していた設定もデフォルトに戻ってしまいます。（独自に追加していた項目も消えてしまいます。）

`デフォルトに戻す`を使用したくない場合は国土地理院の提供しているデータを選択し、`編集`からURLの設定画面を開き<font color="red">__https://__ </font>に手動で更新してください。
:::
nodenvでのnode.jsバージョン設定

nodenvでのnode.jsバージョン設定を記しておきます。
安定版は[こちらのNode.js®公式サイト](https://nodejs.org/ja/download)にてご確認ください。
（今回の例では、v15.14.0からv18.16.0へアップデートした例になります。）

```
$ node -v
v15.14.0 #現在の古いバージョンが表示されます

$ nodenv install -l
# ローカルにあるリストを確認します

$ brew update && brew upgrade node-build
# もしリストに使用したいバージョンがなければ、これで更新できます

$ nodenv install 18.16.0
# 使用したいバージョンをインストールします

$ nodenv local 18.16.0
# globalに設定すると不具合の起きるリポジトリも出てくるかもしれないので、localに設定
# もしglobalに設定したい場合は、$ nodenv global 18.16.0と入力します

$ node -v
v18.16.0 #指定した新しいバージョンになっているかを確認します
```

以上になります。
もしお役に立てば、いいねいただけると励みになります！
lambda + RDS proxy + Aurora serverless v2でまぁまぁ請求された話し

# はじめに
医療系クラウドサービスを提供しているレイヤードという会社で働いています。

新サービスを開発中で、社内リソースの問題から外注に開発してもらっていました。
まだ **本番稼働していないにも関わらず、2023年6月25日時点でaws費用が＄915、月末予測が＄1,200にもなっており** 、調査依頼してもはっきりとした回答が無かったので、横槍ですが原因調査した内容の共有です。

調査は弊社エンジニアの采本さんがほとんどやってくれました。
いつもありがとう、頼りにしてます。

[![Image from Gyazo](https://i.gyazo.com/934ab01b3a63566353cc56015cdf65ff.png)](https://gyazo.com/934ab01b3a63566353cc56015cdf65ff)

# アーキテクチャ構成
アプリケーションの構成は以下のとおり。

言語：TypeScript
フロント：Vue.js
バックエンド：Node.js on lambda
データベース：RDS proxy + Aurora serverless v2（reader + writerの2台構成）

# 料金内訳
最初の「はじめに」で添付した画像の通り、RDSがコストの大半を占めているのは一目瞭然なので、さらに詳細に確認しました。
[![Image from Gyazo](https://i.gyazo.com/712ad6824d2c9399eee7d2c1feefe4d9.png)](https://gyazo.com/712ad6824d2c9399eee7d2c1feefe4d9)

RDS proxy高いな。。でもバックエンドをlambdaでやる以上しょうがないよね。。。
Aurora serverless v2高いとは思ってたけど、、、それにしても高いな。。。 **ホンマか！？** 


# 原因
Lambda-RDS Proxy間でコネクションのピン留めという現象が発生していました。
`データベースコネクションを固定化して再利用不可`とする（＝コネクションが増えていく）現象です。
RDS proxyのログを「pinn」検索したところ、`set句発行によるピン留め`と、`16kbを超えるSQLの発行によるピン留め`の2つが確認できました。

このピン留めの影響で、アプリケーションを利用していない（無風状態の）時でも、`データべースのコネクションが維持され高価なAurora v2のACUの利用率が下がらない`という事象が発生。
本番稼働していないので夜間は誰も使っていないのに、Aurora v2が4ACU程度ずっと使っている状況（設定上minは1）になっていました。

今回のプロジェクトでは、16kbを超えるSQLが多少頻発して本現象が発生していました（この状態で本番稼働していたら金額ヤバかったかもー）。

set句発行によるピン留めは以下のような感じで、特段珍しくも無い変数も対象となるので油断するとヤっちゃいそいうだなと思いました。
- AUTOCOMMIT
- AUTO_INCREMENT_INCREMENT
- CHARACTER SET (or CHAR SET)
- CHARACTER_SET_CLIENT
- CHARACTER_SET_DATABASE
- CHARACTER_SET_FILESYSTEM
- CHARACTER_SET_CONNECTION
- CHARACTER_SET_RESULTS
- CHARACTER_SET_SERVER
- COLLATION_CONNECTION
- COLLATION_DATABASE
- COLLATION_SERVER
- INTERACTIVE_TIMEOUT
- NAMES
- NET_WRITE_TIMEOUT
- QUERY_CACHE_TYPE
- SESSION_TRACK_SCHEMA
- SQL_MODE
- TIME_ZONE
- TRANSACTION_ISOLATION (or TX_ISOLATION)
- TRANSACTION_READ_ONLY (or TX_READ_ONLY)
- WAIT_TIMEOUT

詳しくは、下記参考に貼っているawsのドキュメントをご参考ください。

# 対応
参考サイトと同じ明示的disconnectで回避はできそうですが、DB接続のオーバーヘッドも大きくなるので考え物ではあります（出来ればアプリケーション側で対策したいですね）。

しかし今回は、外注さんがlambdaを止めてApp Runnerにしたいと言い出したのでRDS proxyが不要になり、本件問題も自動的に解消される事になりました（RDS proxy料金も無くなるのでワーイ）。

# おわりに
今回はアーキテクチャ変更により何もせず解決の方向になりましたが、今後Aurora serverless v2は上手に使っていきたい意図もあったので、ある程度納得感のある結果まで調べる事にしました。
とはいえAurora serverless v2はまだまだ基本単価が高く使い辛いので、もうちょっと安くなる事を期待したいですね。

最近は既存Webサービスを、EC2 on ElasticBeanstalkからFargate on ECSに乗り換えるプロジェクトをシコシコ頑張っております。
今更のアーキテクチャではありますが、色々とクセがありましたので折をみて少しずつ書いていきたいと思います。


# 参考
- https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/rds-proxy-managing.html#rds-proxy-pinning
- https://tech.buysell-technologies.com/entry/2021/04/23/175313
【Swift】Firebase Authで初回ログインか判定する

# はじめに
Firebase Authenticationでユーザがログインした際、初回登録時のみFirestoreにユーザ情報を追加するという処理を実現したいと考えました。
そこで、ログインしたユーザが新規登録かどうか判定する必要がありました。
# コード
```swift
let authResult = try await Auth.auth().signInAnonymously()
print(authResult.additionalUserInfo?.isNewUser)
```
`AdditionalUserInfo`の`isNewUser`で初回ログインかどうか判定することができます。
エラー処理などは省いています。
JavaでPDF を画像に変換する

## はじめに
PDFを画像に変換することにはいくつかの利点があります。まず、この変換によりPDFファイルの内容を異なるデバイスで表示することができます。また、変換された画像ファイルはウェブページに簡単に埋め込むことができ、インターネット上での表示や共有が容易です。さらに、画像ファイルを印刷したりアーカイブに保存したりすることで、ドキュメントを簡単に共有することができます。PDFリーダーに依存せずに利用できるのも大きなメリットです。重要なのは、PDFを画像に変換することで、コンテンツの完全性を保護する方法も提供されることです。次は変換のチュートリアルです。
## ツール
* IntelliJ IDEA 2018 (jdk 1.8.0)
* [Free Spire.PDF for Java](https://www.e-iceblue.com/Introduce/free-pdf-for-java.html)
ご注意ください。この無料版は最初の3ページのみの変換に対応しています。さらに多くのページを変換したい場合は、[商用版](https://www.e-iceblue.com/Introduce/pdf-for-java.html)をご利用いただけます。使用する前に、[一時的な許可](https://www.e-iceblue.com/TemLicense.html)を申請してください。

## Jarファイルの導入
* [Free Spire.PDF for Java](https://www.e-iceblue.com/Download/pdf-for-java-free.html)をダウンロードして解凍します。
* IDEAで新しいプロジェクトを作成します。
* 「File」>「Project Structure」>「Modules」>「Dependencies」をクリックします。
* 「+」の「JARs or Directories」を選択します。
* 「Spire.Pdf.jar」を見つけてプロジェクトにインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/5153aecf-2a22-630a-863e-d54f15554efa.png)
## コード：
```java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.graphics.PdfImageType;
import javax.imageio.ImageIO;

public class PDFToImages {
    public static void main(String[] args) throws IOException {

        //PdfDocument クラスのインスタンスを作成する
        PdfDocument pdf = new PdfDocument();

        //PDFを読み込む
        pdf.loadFromFile("Sample.pdf");

        //全ページをループする
        for (int i = 0; i < pdf.getPages().getCount(); i++) {

            //全ページを画像に変換し、画像のDpiを設定する
            BufferedImage image = pdf.saveAsImage(i, PdfImageType.Bitmap,500,500);

            //画像を.pngファイルとして保存する
            File file = new File("C:\\Users\\Administrator\\Desktop\\Images" + "/" + String.format(("ToImage-img-%d.png"), i));
            ImageIO.write(image, "PNG", file);
        }
        pdf.close();
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/44520259-10a1-ca42-9993-c10342e736c8.png)
## まとめ
上記のコードを使用することで、簡単にPDFを画像形式に変換することができます。
特定のページを変換したい場合は、以下のコードを参考にしてください：
```java
//最初のページを画像に変換し、画像のDpiを設定する
BufferedImage image= pdf.saveAsImage(0, PdfImageType.Bitmap,500,500);
```
また、このライブラリはPDFから[Word](https://www.e-iceblue.com/Tutorials/Java/Spire.PDF-for-Java/Program-Guide/Conversion/Convert-PDF-to-Word-in-Java.html)や[Excel](https://www.e-iceblue.com/Tutorials/Java/Spire.PDF-for-Java/Program-Guide/Conversion/Convert-PDF-to-Excel-in-Java.html)、[XPS](https://www.e-iceblue.com/Tutorials/Java/Spire.PDF-for-Java/Program-Guide/Conversion/Convert-PDF-to-XPS-and-XPS-to-PDF-in-Java.html)などへの他の変換もサポートしています。
開発にChatGPTを使った感想

つい最近、AIスキルを習得するためのサービスRoboThinkを立ち上げました。

https://www.robothink.jp/

このサービスでは、ChatGPTやMidjourneyなど生成AIの使い方を学ぶことができます。

開発に当たりChatGPTを活用したのは初めての試みだったので、その経験についてメモしておきます。

## 半信半疑だったAI活用
開発にあたりChatGPTを使ってみたかったこともあり、2つのことを試してみました。

1つは開発に際し今まで使ったことのない技術を使うこと。もう1つはChatGPTを開発のコアに据えて利用してみること。

Pythonでの開発経験はありますが、使ったことのない技術スタックで開発してみました。

Next.js　/ TailwindCSS / Vercel / Supabase

開発の全てをAIに委ねたわけではなくあくまでサポートいう立ち位置です。書籍や公式サイトで知識を入れつつ、分からない部分や発生したエラーをChatGPTに聞いていく流れです。結果的に予想以上に活躍してくれました。

## 検索回数が大幅に減った
開発する時に分からないことがあれば、今までは検索エンジンで調べ物をしていました。今回の開発ではかなり検索回数が減りました。

検索エンジンでは自分に類似したエラーを探していましたが、ChatGPTは今まさに遭遇しているエラーの解決方法を高い確率で返してくれるんですね。

海外ではChatGPTの出現でStackOverFlowのシェアが下がったと言われていますが、なるほどなと思いました。プログラミングの調べ物においては検索エンジンという今までの作業が変わるだろうなと思います。

## ChatGPTが苦手な部分
色々と手助けしてもらいましたが一方でChatGPTが苦手だろうと感じる部分もなんとなくつかめました。

クリエイティブな部分は弱い印象。こちらの予想を上回る回答がないこともあります。技術選定に関する質問だったり、運営面においてのアドバイスといったところです。

とは言え、開発のお供にChatGPTを使う選択肢は全然アリです。今回、プラグインも使わず素の状態で使ったのでChatGPTの実力をうまく引き出せてなかったと思います。結果としては満足でしたが。

今後、機能面はどんどん進んでいくと思うので積極的に取り入れて、AIにお願いする部分・人間が頑張る部分を意識しながら使っていこうと思います。
cscの作法 その411

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
edgeを起動して、googleで検索せよ。

# サンプルコード

```
	class Program {
		static void Main(string[] args) {
			UIAutomationLib ui = new UIAutomationLib();
			Process edge = Process.Start("msedge", "https://google.com");
			Thread.Sleep(2000);
			edge = ui.UpdateTargetProcess("Edge");
			AutomationElement edgeElement = ui.GetMainFrameElement(edge);
			ui.Keyin(false, edgeElement, "de.tomaso\n");
		}
	}

```

以上。
cscの作法 その410

# 概要
cscの作法、調べてみた。
UIAutomationLib使ってみた。

# 参考にしたページ。

https://qiita.com/ken_hamada/items/501b164374667319d270

# サンプルコード

```
	class Program {
		static void Main(string[] args) {
			UIAutomationLib ui = new UIAutomationLib();
			Process notepad = Process.Start(@"notepad");
			Thread.Sleep(2000);
			Console.WriteLine("ok3");
			notepad = ui.UpdateTargetProcess("メモ帳");
			AutomationElement notepadElement = ui.GetMainFrameElement(notepad);
			ui.Keyin(true, notepadElement, "Hello World!!");
		}
	}
```

以上。
JetpackComposeでonTextLayoutを使わないAutoSizeTextを作る

# JetpackComposeでonTextLayoutを使わないAutoSizeTextを作る
JetpackComposeにautoSizeMaxTextSize,autoSizeMinTextSize,autoSizeStepGranularity,autoSizePresetSizesに対応したTextを作成します。

AutoSizeTextの全ソースは[こちら](https://github.com/jozuko/ComposeTutorial/blob/main/app/src/main/java/com/jozu/jetpack/compose/tutorial/screen/composable/AutoSizeText.kt)です。
ご自由にどうぞ。もっと効率のいいやり方あったら、コメント or プルリクいただけると泣いて喜びます。


:::note info
<B>経緯</B>
AutoSizeTextを作ってみたというサンプルに多いのが、「onTextLayout」を使用しているものです。
これは、「描画する」->「表示しきれなかったらフォントサイズを小さくする」->「描画する」繰り返すため、長い文字列だとその小さくなる課程がアニメーションみたいに描画されてしまいます。
:::

## TextDelegate
TextDelegateを使うと、実際に描画はされませんが、描画したときに「hasVisualOverflow==true」になるかどうかをチェックすることができます。
```kotlin
var combinedTextStyle = combinedTextStyle.copy(fontSize = tempFontSize)

val textDelegate = TextDelegate(
    text = AnnotatedString(text),
    style = combinedTextStyle,
    maxLines = maxLines,
    minLines = 1,
    softWrap = true,
    overflow = TextOverflow.Clip,
    density = LocalDensity.current,
    fontFamilyResolver = LocalFontFamilyResolver.current,
)
val textLayoutResult = textDelegate.layout(
    constraints, // BoxWithConstraintsScopeで使える制約
    layoutDirection = LocalLayoutDirection.current,
)

if (!textLayoutResult.hasVisualOverflow) {
    break
}
```
これを使用して、hasVisualOverflowとなるfontsizeまで繰り返していけば、AutoSizeTextをonTextLayoutなしで実現できます。
20%ルールは何分に該当するのか計算してみた

## 環境
Ubuntu 20.4
Ruby 2.6

## はじめに
Googleに20%ルールというものがあります。業務時間の20%を自分の好きなことに充ててもいいというものです。Googleのような大手が、こうしたエッジの効いたルールを導入して成果を上げているとのことで、日本でもわりと話題になりました。そして、Web業界の中にも、同じようなルールを導入し出している会社がちらほらとあるようです。

自分が所属する組織はSIerですが、社内にこのようなルールはありません。しかし、個人的に何％でも、わりと自由に設定できる、暗黙のカルチャーのようなもはあったりします。

自分の組織に20%ルールがあった場合、業務時間の何分を割り当てることになるのだろうか、気になったため、計算するプログラムを作ってみました。

## コード
```rule.rb
def calc_time(rule)

    require 'time'

    str_tm = Time.parse("09:00")    # 業務開始時間
    end_tm = Time.parse("17:30")    # 業務終了時間
    lnc_tm = Time.parse("00:45")    # 休憩時間

    # 標準業務時間（分）
    gyomu =((end_tm - str_tm) / 60) - (lnc_tm.hour * 60 + lnc_tm.min)

    # 標準業務時間（時：分）
    gyomu_hh, gyomu_mm = gyomu.divmod(60)
    gyomu_mm = gyomu_mm.to_i

    # ルール時間（分）
    rulet = gyomu * (rule.to_f / 100)
    
    # ルール時間（時間：分）
    rule_h, rule_m = rulet.divmod(60)
    rule_m = rule_m.to_i
    
    puts "標準業務時間：#{gyomu_hh}時#{gyomu_mm}分の#{rule}%は、#{rule_h}時間#{rule_m}分です"
end

calc_time(20)       # 引数:ルール（%）
```

## 解説
自分の所属する会社の業務時間は、9時から17時30分です。そして、昼休みが12時から12時45分の45分間あります。
端数処理の関係で、１分単位で誤差が生じる場合があります。ご了承ください。

- str_tm変数：業務開始時間をセットします
- end_tm変数：業務終了時間をセットします
- lnc_tm変数：休憩時間をセットします
- rule変数：メソッドの引数に適用するルール（％）をセットします

## 動作結果
標準業務時間：7時45分の20%は、1時間33分です

## ルール（％）を変更しての動作結果
標準業務時間：7時45分の1%は、0時間4分です
標準業務時間：7時45分の10%は、0時間46分です
標準業務時間：7時45分の30%は、2時間19分です
標準業務時間：7時45分の60%は、4時間39分です
標準業務時間：7時45分の100%は、7時間45分です
nextjs 13 app routerでどうしてもページがキャッシュされまくる場合

# 問題

ページ間を

- Linkを使ったり
- redirectしてみたり

するとキャッシュを無効にしたfetchなり、ページ全体だったりが思いっきりキャッシュされて古い情報しか表示されない。

一杯挙がっているが、例えばこれとか

https://github.com/vercel/next.js/issues/42991


# 解決（hotfix）

https://github.com/vercel/next.js/discussions/52103#discussioncomment-6337668

```jsx
  const router = useRouter();

  useEffect(() => {
    router.refresh();
  }, [router]);
```

キャッシュされて困るページはこれを入れておく。
Databricksのデータエクスプローラで関数がサポートされました！

こちらのアップデートです。

https://docs.gcp.databricks.com/release-notes/product/2023/july.html#functions-now-displayed-in-data-explorer-public-preview

> SQL and Python user-defined functions are now visible in Data Explorer. You can view function details and manage permissions using this new UI.
> SQLとPythonのユーザー定義関数がデータエクスプローラで表示されるようになりました。この新たなUIで関数の詳細を参照し、権限を管理することができます。

早速試します。

```sql:SQL
CREATE FUNCTION area(x DOUBLE, y DOUBLE) RETURNS DOUBLE RETURN x * y;
```

表示されました！
![Screenshot 2023-07-18 at 15.26.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/dc2bb3b0-f9a1-5001-b83e-646c832ef843.png)
![Screenshot 2023-07-18 at 15.26.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b836e064-c6a8-10d4-8289-26fbb8755ed9.png)

関数をたくさん作成しても管理が簡単です。
![Screenshot 2023-07-18 at 15.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/84b6a253-839d-4854-b1b4-5304ac839e65.png)
![Screenshot 2023-07-18 at 15.10.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fcf82f4b-738a-5d3a-0b2d-39da819b39c2.png)

地味かもしれませんが、Unity Catalogにおける先日の[モデル管理](https://qiita.com/taka_yayoi/items/5fd6db93d7fae4c52aac)、[ボリューム管理](https://qiita.com/taka_yayoi/items/453026daacf71ba5662f)のサポートと相まって、さらに管理や開発が捗ります。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
[Terraform] RDS Proxyをリーダーエンドポイント(Aurora Replicas)に対応させる

# はじめに

Auroraを利用する場合、データ取得はリーダーエンドポイントに繋ぐと効率的です。(詳細は以下リンクを参照)

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html#Aurora.Overview.Endpoints.Types

その上で VPC Lambda からアクセスするなど RDS Proxy を挟みたいケースについて、設定方法が少し分かりづらかったので備忘録として残したいと思います。

# 結論

`aws_db_proxy_endpoint`を追加する

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_proxy_endpoint

```terraform:作成例
resource "aws_db_proxy_endpoint" "rds_proxy_reader_endpoint" {
  db_proxy_name          = aws_db_proxy.rds_proxy.name
  db_proxy_endpoint_name = "reader_endpoint"
  vpc_security_group_ids = [aws_security_group.rds_proxy_security_group.id]
  vpc_subnet_ids         = [aws_subnet.subnet_a.id, aws_subnet.subnet_c.id]
  target_role            = "READ_ONLY"
}
```

`aws_db_proxy_endpoint.rds_proxy_reader_endpoint.endpoint`で読み取り専用のエンドポイントを取得できます。

# 補足

- RDS Proxyを作成したとき、Auroraのクラスターエンドポイント(ライターエンドポイント)に対応するRDS Proxyのエンドポイントは自動作成されます。
    - その値は`aws_db_proxy.<リソース名>.endpoint`で取得可能。
- Auroraのリーダーエンドポイントに対応するRDS Proxyの読み取り専用エンドポイントは、本記事のように明示的に指定しないと作成されません。
- サブネットやセキュリティグループについても、エンドポイントごとに指定する必要があります。

# 料金

読み取り専用エンドポイントには追加料金がかかります。(デフォルトのエンドポイントは無料)

https://aws.amazon.com/jp/rds/proxy/pricing/

>RDS プロキシを作成したときに得られるデフォルトのエンドポイントに関連する、追加料金はかかりません。また、読み取り専用または読み取り/書き込み可能なプロキシのエンドポイントを追加することができ、それぞれ独自の VPC 設定を行うことができます。RDS プロキシエンドポイントを追加すると、AWS PrivateLink インターフェイスエンドポイントがプロビジョニングされ、[PrivateLink の料金ページ](https://aws.amazon.com/jp/privatelink/pricing/)に記載されているように追加料金が発生します。

![Screenshot 2023-07-18 15.22.19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1666407/34d85346-c9da-50e5-45b5-e6d4f1cb5a66.jpeg)

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

# 参考

https://aws.amazon.com/jp/about-aws/whats-new/2021/03/amazon-rds-proxy-adds-read-only-endpoints-for-amazon-aurora-replicas/

https://dev.classmethod.jp/articles/rds-proxy-adds-read-only-endpoints-for-amazon-aurora-replicas/
Google BardでOCR文字認識してみた【画像認識】

https://bard.google.com/

まず、英語版のバードに行きます。

画像をアップロードしてほしい情報を入力すると教えていただけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/48d2cb33-ee44-7197-7184-5be925fe5326.png)

生年月日について聞いてみました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/88909344-8064-da7a-a01d-3dcc3a17bab0.png)

`"平成元年3月31日生"`と正しく認識できてます

フォーマットも指定可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/54c95832-e264-cdaa-0fe3-d1b17713cf44.png)


有効期限も聞きました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/aacec658-b44d-59ab-ef5b-e79ed94f31fe.png)

`"2025年3月31日まで有効"`と正しく認識できてます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/18c28ca9-72f2-49d0-2b48-a448019c359b.png)

4桁の番号を教えて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/8d3911c5-df6e-8cc9-f5fb-cab65413054e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/28e25110-86b1-e78a-e226-153e65ee0534.png)

何キロカロリーありますか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/3cfe38e3-e1ab-d367-2791-8dd12c68fe56.png)


# まとめ

言われたことしかできない人は、仕事がAIに取られるかもしれません。
信じるか信じないかはあなた次第です

# 引用

https://www.youtube.com/watch?v=_vfvm41oQns

![F1QMShjXgAE4ZQm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/72e2594a-3da4-8b1a-249a-b83a747c9b56.jpeg)
Pythonで、ChatGptとBardに同時に質問

# 画面
上部は質問。中段がChatGPT、下段がBard.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547467/46578cec-fd32-841f-d112-62daf6ba4bcc.png)


# Pythonのコード
https://github.com/su5filed/chatgpt_python/blob/main/chatgpt_and_bard_2023.py

不要コードがあるが

# ライブラリのインストール
## chat gpt
pip install openai
pip install Pillow
## Bard
pip install bardapi


# ChatGptのAPI取得し設定
>https://platform.openai.com/account/api-keys
>OPEN AIにログインし画面右上のPersonalをクリックし「View API Keys」をクリックする。
>「＋Create new secret key」>「Create secret key」クリックしAPIキーを作成しコピーする。

14行目に設定
```python
api_key = 'sk-.....'
```

# BardのTokenの取得
>https://bard.google.com/
>にchromeブラウザでアクセスしF12 お押す。
>Session: Application → Cookies →  __Secure-1PSID のValue
>__Secure-1PSIDのValueをコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547467/4f243b71-e318-3e24-6146-8fb9910dfb0a.png)

46行目に設定
```python
    token = 'xxxxxx-xxxxx.' #os.environ['COOKIE_TOKEN']
```


# 感想
どっちが優秀か分からない。
トークンは課金の従量制だとパケ死する可能性があるため注意。

# 参考
https://fuji-pocketbook.net/chatgpt-api-python/
https://zenn.dev/00/articles/de99d0f10c5493
テンプレートから作成したviteプロジェクトの開発サーバーをlocalhost:3000に変える

vite のバージョン 3 以降を使う場合、開発サーバーを起動させると、デフォルトで `http://127.0.0.1:5173` に開発サーバーが立ち上がります。

https://v3.vitejs.dev/guide/migration.html#dev-server-changes

これ自体は vite がそうしていることなので、なんの問題もありません。
もし、いままで慣れ親しんだ `http://localhost:3000` を使いたい場合や、その他の理由があってポート番号を変えたい場合などは、以下の手順で変更できます。

## 実行環境
- node: 18.14.X

## 実行手順
"example" という名前で vite プロジェクトを作成します。  
`$ yarn create vite example --template react-ts`
フレームワークに react　を使う設定でプロジェクトを初期化します。

作業ディレクトリに移動し、ライブラリをインストールします。
```
$ cd ./example
$ yarn install
```


vite.config.ts を開き、`defineConfig` に `server.port` を追加します。

```vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
+  server: {
+    port: 3000,
+  },
});
```
`server.port` にポート番号を振ることで、指定したポート番号を使うことができます。

開発サーバーを起動し、 `http:localhost:3000` にブラウザでアクセスすると、無事アプリケーションが動いていることが確認できます。

```
$ yarn dev
```

![ 2023-07-18 14.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639130/ab0e867e-25df-ea2f-5e84-98e4fa975ba9.png)

![ 2023-07-18 15.01.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639130/e91e53c0-8b92-9b74-c745-159f74b56524.png)
[AWS Q&A 365][ECR]AWSのよくある問題の毎日5選 #96

# 1. Amazon ECRのサービスクォータとは何ですか？
Amazon ECRのサービスクォータとは、サービス内の様々なリソースや行動に設定された制限または最大値を指します。これらのクォータは、Amazon ECR内で作成または使用できるリポジトリ、イメージ、または他のリソースの最大数を定義します。

# 2. Amazon ECRのサービスクォータをどのように管理できますか？
Amazon ECRのサービスクォータを管理するためには、AWS管理コンソールを使用できます。コンソール内では、さまざまなリソースのクォータを表示し、修正することができます。さらに、API使用メトリクスを監視し、クォータに近づいたり超えたりしたときに通知を受け取るためにCloudWatchアラームを作成することもできます。

# 3. Amazon ECRのサービスクォータを増やすことはできますか？
はい、Amazon ECRが設定したデフォルトの制限を超える必要がある場合、サービスクォータの増加をリクエストすることができます。これは、クォータ増加リクエストを提出することによりAWS管理コンソールから行うことができます。リクエストはAWSによってレビューされ、お客様の使用状況と要件に基づいて増加を認めることができるかどうかが決定されます。

# 4. Amazon ECRでAPI使用メトリクスをどのように監視できますか？
Amazon ECRでAPI使用メトリクスを監視するためには、CloudWatchメトリクスを有効にすることができます。これにより、APIの呼び出し回数、データ転送、リポジトリメトリクスなどのメトリクスを表示できます。これらのメトリクスを視覚化することで、使用状況とパフォーマンスを追跡し、特定の閾値に達したときに通知を受け取るためのアラームを設定できます。

# 5. Amazon ECRのサービスクォータに関連する問題をトラブルシューティングする方法はありますか？
はい、Amazon ECRのサービスクォータに関連する問題やエラーが発生した場合、トラブルシューティングのステップを踏むことができます。これには、Dockerのデバッグ出力を有効にする、AWS CloudTrailを行動ログ取得のために有効にする、Amazon ECRのパフォーマンスを最適化する、などが含まれます。また、サービスクォータに関連する特定のエラーメッセージは、ユーザーガイドに記載されていて、さらなるトラブルシューティングの指針となります。
[AWS Q&A 365][ECR]Daily Five Common Questions #96

# 1. What are service quotas in Amazon ECR? 
Service quotas in Amazon ECR refer to the limits or maximums set on various resources or actions within the service. These quotas define the maximum number of repositories, images, or other resources that can be created or used within Amazon ECR. 

# 2. How can I manage my service quotas in Amazon ECR? 
To manage your service quotas in Amazon ECR, you can use the AWS Management Console. In the console, you can view and modify the quotas for different resources. Additionally, you can create CloudWatch alarms to monitor API usage metrics and receive notifications when you approach or exceed your quotas. 

# 3. Can I increase my service quotas in Amazon ECR? 
Yes, you can request an increase in your service quotas if you need to exceed the default limits set by Amazon ECR. This can be done through the AWS Management Console by submitting a quota increase request. The request will be reviewed by AWS and they will determine if an increase can be granted based on your usage and requirements. 

# 4. How can I monitor my API usage metrics in Amazon ECR? 
You can monitor your API usage metrics in Amazon ECR by enabling CloudWatch metrics. This allows you to view metrics such as the number of API calls, data transfer, and repository metrics. By visualizing these metrics, you can track your usage and performance, and set alarms to be notified when certain thresholds are reached. 

# 5. Is there a way to troubleshoot issues related to service quotas in Amazon ECR? 
Yes, if you encounter any issues or errors related to service quotas in Amazon ECR, there are troubleshooting steps you can take. These include enabling Docker debug output, enabling AWS CloudTrail for logging actions, and optimizing performance for Amazon ECR. Additionally, specific error messages related to service quotas are documented in the user guide for further troubleshooting guidance.
Flow Builder Basics > Learn About Flow Variables


+ [Learn About Flow Variables](https://trailhead.salesforce.com/content/learn/modules/flow-basics/learn-about-flow-variables)

# We set the value of the 'number' variable and subtracted '100' from it, but didn't get the expected result. Check your formula and use 'Insert a resource picker' to add the 'number' variable to the formula.

+ [Learn about Flow variables badge challenge not yet complete](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000R9hQV)

:::note
Your formula should look like this:
 
```
{!number}-100
```
 
Just reference the number variable you created earlier.

EDIT since this is getting a lot of views and some people seem to be struggling with this challenge:

- "It won't save". It does save, the error you're getting is just a warning that doesn't prevent you from saving the flow.

- Spelling: Don't just type the answer above when creating your formula. Reference the number variable you created in the previous step by inserting the resource into your formula. Also make sure your variables match the exact spelling in the instructions. They're case-sensitive. 

- Save new version: Make sure you save, or save as before checking the challenge. 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000J7PDNSA3
:::

:::note
My number variable was named with a capital "N",  changed to lower case and passed the challenge.
:::

+ [Fundamentos de Flow Buider](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KHYMj)
+ [Learn About Flow Variables badge Challenge not yet complete](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000R96cKSAR)
CSVアップロード機能の処理時間を1時間速くした話

## はじめに
最近業務で外部プロダクトのパフォーマンス改善を支援する機会があり、結果的に最初は3時間程かかったCSVアップロード機能を40分から1時間(データセットによる)短縮する事ができましたその際に実施した事を書き留めていこうと思います

## ボトルネックはどこにあるのか？
Webアプリケーションを作っていてパフォーマンス改善が必要だと判明するのは
「一覧表示がめちゃくちゃ遅い！」などの改善依頼やレイテンシのアラート等、ざっくりしたところからボトルネックがどこにあるのか調査する事が多いかと思います

今回はCSVからユーザー情報をMySQLに作成するのがメインの処理でworkerを別プロセスで動かして非同期処理を実施していました
そのためアプリケーションサーバー(Laravel)またはDBサーバー(MySQL)にボトルネックがありそうだという想定はつきました

そしてさらに絞り込むために下記の2点を実施しました

- アプリケーションのコードを読んで処理内容を把握して書き出す
- `Aurora`の全般ログでどのくらいクエリが発行されているか確認する

結果`INSERT`をする前に、20個以上`SELECT`が走るような検索があり、クエリがボトルネックになっている事が分かったので今回クエリを修正する事になりました

実際にはスプレッドシートに遅いクエリを発行している箇所をソースコードベースで書き出し、どの対策を取れるかを⭕️❌で書きました
これで自分以外の人が見たとしても、現在何に取り組んでいるのかすぐに分かると思います

![スクリーンショット 2023-07-18 12.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552593/17567306-a0c7-121d-cb9f-3b2be6a6052f.png)

※この表が30行くらいに渡って書かれていて、完了したところはグレーアウトさせていく形になります


## 実施した事
### 1. 同じクエリ結果が必要な場合はキャッシュを活用する
例えば巨大なCSVをチャンクしていて、それぞれを処理する別プロセスで同じ値を使い回したい場合に `Redis`、`Memcached`、`Dynamo`などのキーバリューストアにキャッシュをする事で何度も同じクエリを発行する必要はなくなります
また同じプロセス内ならインスタンス変数に持たせてしまうなどでもよりミニマムに同じ事が実現可能です

同じOrderのidで1時間以内ならキャッシュから使用する例
```php
$order = Cache::remember($cacheKey, 3600, function () use ($id) {
    return Order::find($id);
});
```

### 2. N+1問題を発生させない
N+1問題が発生している場合、DBアクセスが大量に発生するのでパフォーマンスが劣化しやすいです

N+1が発生する例
```php
$orders = Order::all();

foreach ($orders as $order) {
    $user = $order->user;
}
```
この場合、`$orders`の数だけDBアクセスが発生するので下記のように`EagerLoading`をして、最初に必要な関連先情報をメモリにロードしておく事で大量のDBアクセスが発生する事は回避できます

```php
$orders = Order::with('user')->get();

foreach ($orders as $order) {
    $user = $order->user;
}
```

ただし、この場合関連先が膨大なデータ量を持っている場合、メモリ上に大量のデータをロードしないといけなくなります
この状態で大量のデータを`EagerLoading`した場合、swapを起こしてパフォーマンスが劣化するか最悪OOM Killerなどでプロセス自体を強制的に殺されてしまう可能性もあります

そのため件数が増えてきた場合は

```php
Order::with('user')->lazy(1000)->each(function ($order) {
    $user = $order->user;
});
```
など1000件ずつの`LazyLoading`などもバランスを見ながら検討するのが良いと思います

### 3. BulkInsertを行う
今回は`INSERT`が個別に発行されていたので、それを`BulkInsert`に置き換える事で毎回のトランザクション処理のオーバヘッドを削減できて、速度が向上しました


1件ずつ`INSERT`する例
```php
foreach ($ordersData as $orderData) {
    Order::create($orderData);
}
```

`BulkInsert`する例

```php
DB::table('orders')->insert($ordersData);
```

### 4. indexを適切に貼る
今回は`explain`を実際にテストした環境で実施しましたが、これを修正するよりはクエリ結果をキャッシュするなど、クエリの総量を減らす方が効果が高かったのでそこまでindexの調整は実施していません
ただ、データセットが大きくなるほどindexは効果が高まるので非常に重要な要素の一つだと思っています

かなり長くなってしまいそうなので今回は詳しく説明できないんですが、MySQLで使用されるB+treeインデックスの特徴を簡単に記載させていただきます

#### B+treeインデックスの特徴
- カーディナリティが高いデータの方が高速に検索できる(ユニークな値が多い)
- リーフノード同士がつながっているので範囲検索も効率良く実施できる
- insert,updateなどの際は再構築が行われるのでオーバヘッドが増える
- ソートされた状態で格納されるので、並び替え(order by)なども効率的に行える
- その他(まだまだあるかと思いますので)

## 終わりに
上記の事を実施して、最終的には処理時間の削減を実施する事ができました
今回実際に適応してみて効果が大きかったのは、キャッシュの利用とBulkInsertだったかなと思います
ただこれに関しては、どの様な検索を実施しているかなど実装にもかなり依存するかと思うのであまり参考にならないので実際に適応して頂いてどの様な結果が出るかを実施して頂くのが1番良いかと思ってます

またここに書いていない部分も結構あり、リファクタリングを同時に進めることによって実は不要だったクエリを見つける事ができたり、インフラ面ではCPU使用率やメモリ使用率を見たり等、色々と実施しましたがひとまずインパクトが大きいクエリチューニングに絞って紹介させて頂きました

自分としても非常に良い経験ができたなと思っていますが、まだまだ改善点はあるので引き続き頑張っていこうと思います

ここまで読んで頂いた皆様、ありがとうございました！
element "$Record". "$Record" can't be a SObject.

[Flowに関するまとめページに戻る](https://qiita.com/Keiji_otsubo/items/55ebc9c634a3216f3990)

# Create_Phone_Call_Task (レコードを作成) - 項目「OwnerId」は、SObject 要素「$Record」と互換性がありません。「$Record」は SObject にはできません。

+ [スケジュールされたタスクをフローに追加する](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007HMseu)

:::note
レコードの所有者を選択するときに、２種類あると思います。
以下のように表示されるとしたら下の項目を選択してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8dd2f32d-d263-78c8-0344-6af628685bd9.png)
:::

# The field "OwnerId" isn't compatible with the SObject element "$Record". "$Record" can't be a SObject.

+ [The field "OwnerId" isn't compatible with the SObject element "$Record". "$Record" can't be a SObject.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000075w3A9)

:::note
Try to select like this

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b8eb3c80-c957-8f9c-5cf7-d236600afca7.png)
:::

+ [the SObject element "$Record". "$Record" can't be a SObject.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X9Bu9)


# The field "Id" is being filtered using the Equals operator  with the SObject element "$Record". "$Record" can't be a SObject.

+ [In the Calculate Values in Variables and Formulas Module](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V0000794baK)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1bd7d778-1048-f94a-5ff7-64063d692d1a.png)

:::note
Select {!$Record.AccountId} 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/90e30b6b-0195-54d7-ee29-004a99e3e09e.png)
:::

+ [Error when doing a record-triggered flow](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epEO1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/60697292-fe3d-5dda-5957-1fd259f2dfb0.png)


:::note

I think there are two OwnerIds, please select the second ID.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cf2b9ced-062c-3eb4-c60f-b2fe0d05181e.png)
:::

+ [Two Errors in Record Triggered Flow Challenge](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cm97y)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/03c8a4ad-3a1d-9d9b-c989-14f957b527df.png)


# Build Flows with Flow Builder >Data and Actions in Flows >Work with Salesforce Records in Flows

+ [I have no + there when I hover (this is step 2).  When I do the Create Records and I do the Owner ID, I have no choice for Owner ID in the $Record field.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmC5O)


# Calculate Values in Variables and Formulas

+ [Hello.. Help me with this query..I am sending the screenshot here](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifuQC)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/48b58224-5789-393a-207b-2e6f56ada43c.png)
直前のGitコミットのみ取り消し

毎回ググっているのでメモしておく。

## コマンド

```terminal
git reset --soft @^
```

@はHEADでも可。
ちなみに@^は、最新のコミットの状態をという意味で、
`^`や`~`をつけて直前のコミットを表している。

## 参考
https://git-scm.com/docs/git-reset
Windows(x64) の Python 3.10 で PyCrypto を pip install

注意
----
pycrypto は古いので pycryptodome を使いましょう

きっかけ
--------
Windows(x64) の Python 3.10 で PyCrypto を pip install しようとすると

winrand.c のコンパイル中に inttypes.h で未定義エラーが出る

古い情報だと stdint.h を置き換えるとか inttypes.h を書き換えるとか出て来るが、もっと簡単に解決出来たのでメモ

結論
----

これだけ
```
set CL=-D"intmax_t=long long" -D"uintmax_t=unsigned long long" -DPY_SSIZE_T_CLEAN
pip install PyCrypto
```

参照
----
[python3.6でpycryptoをインストールする際にはまったのでメモ]( 
https://web-technical.hatenablog.com/entry/2018/08/16/165137 )
[Windows(x64)でPython3.6.0(x64)にPyCryptoを入れるメモ]( 
https://qiita.com/walkure/items/09516cb711ff1c886286 )

追加
----
[SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formats]( https://stackoverflow.com/questions/70705404/systemerror-py-ssize-t-clean-macro-must-be-defined-for-formats )
によると

It sounds like the extension was not updated for python 3.10.

On 3.10 any module(s) that use the # variant when parsing arguments need to have a #define PY_SSIZE_T_CLEAN before including Python.h.

とのことで -DPY_SSIZE_T_CLEAN も追加する必要あり