OmniAICreator/Qiita-1.07M huggingface dataset:
1-08入出力装置、１-09入出力インタフェース

### 入出力装置
#### 入力装置
コンピュータにプログラムやデータのほか，音声や画像などを入力した
り，コンピュータに指示を与えたりする装置

キーボード、マウス、タブレット、イメージスキャナー
位置情報を入力する装置を総称して，ポインティングデバイス

####バーコードリーダ
商品などに印字された帯状のバーコードを読み取る装置です。POSシステムの入力装置として使われる。
POSシステム
バーコードを使って商品の販売情報をリアルタイムに収集し，売筋商品や死筋商品を把握できるシステム

#### 出力装置
コンピュータ内部で処理したデータを外部に出力する装置

##### ディスプレイ
液晶ディスプレイ 
有機ELディスプレイ 

解像度 画素やピクセル
VRAM(Video RAM) ディスプレイに表示される内容を一時的に記録するために使用される専用のメモリ,一般的には，nビットでは2ⁿ通りの色を対応する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/98d78415-cfac-0e69-ec5a-138d48b6dedf.png)
#### プリンタ
レーザプリンタ 印字音が静かで，印刷品質も非常に高く，ページ単位で印刷するため高速で，ビジネス用 （大学の）
インクジェットプリンタ 印字音が静かで，印刷品質も高く，低価格でカラー印刷でき，個人向け（自宅の）
ドットインパクトプリンタ 印字音が大きく，印刷品質も高くない，複写式の伝票印刷に用いられる（JCOMの方の）
#### 3Dプリンタ
3Dプリンタは，モデリングソフトで作成した3Dのデータに基づいて，熱で溶かした樹脂や金属粉末を層状に積み重ねるなどの方法で立体物を作成できるプリンタ

### 入出力インタフェース
PC本体と周辺機器を接続するための規格の総称。
#### USB
PCと周辺装置を接続する標準的なシリアルインタフェース（データを高速に1ビットずつ直列に転送するインタフェース）USBハブ
USBの規格
さらには，USB3.1（10Gbps）・USB3.2（20Gbps）なども登場してきています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/4b3cc50a-4b16-42b5-4d29-f8b9e081cb71.png)
	
#### ブルートゥース
免許不要の2.4GHz帯の電波を利用したインタフェース。半径100mで最大速度は24Mbps
BLE（Bluetooth Low Energy）低消費電力で長時間動作、IoTに適している

#### Zigbee
免許不要の2.4GHz帯の電波を利用したインタフェース。数M程度で通信速度も最大で250kbps。低コストで低消費電力
LANよりも狭い，数m程度の近距離のIT機器同士が通信するネットワーク
をPAN（Personal Area Network）という。BLE、Zigbeeなどが用いられます。
【Terraform】MetabaseをFargateで実行し、データをEFSで永続化

## 概要
AWSを利用している場合、[Metabase](https://www.metabase.com/)をECSにデプロイすることが多いのかなと思います。
ただ、Fargateで動かした時のデータの永続化をどうするか悩んでしました。
ここでいうデータとは
- ログインユーザー
- Metabaseに保存した質問
等を指します。

デフォルトではアプリケーションの実行環境下にH2データベースを作成し、そこにデータを溜めていきます。しかし、本番運用する際はPostgresにその役割を委託することが推奨されています。
参考：[Configuring the Metabase application database](https://www.metabase.com/docs/latest/installation-and-operation/migrating-from-h2)

本稿は、「「それでもデフォルトのままがいい！Postgresにデータを保存したくない！」」という熱い気持ち（？）がある私のような方への手順書になります。

## 手法
前述の通り、デフォルトでデータはアプリケーション内の`metabase.db.h2.db`ファイルに蓄積されていきます。ECS on EC2であれば、このファイルをEC2のファイルシステム、ひいては接続されたEBS等にマウントすれば仮にECSが停止したとしてもデータは永続化されるのですが、Fargateで動作する場合はどうすればいいのでしょうか？
そういえば、EFSがFargateと接続できたような…。。。

安西先生…。
![Eh7J3mEUYAADAZf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759541/0b1ffac0-bc52-9b9e-da00-7c3551fe9a1b.png)

[Fargate で実行されている Amazon ECS コンテナまたはタスクに Amazon EFS ファイルシステムをマウントする方法を教えてください。](https://repost.aws/ja/knowledge-center/ecs-fargate-mount-efs-containers-tasks)

とりあえずPrivateSubnetで動くRDSがあるとして、以下のようなインフラと理解しました。
（一部簡略化しています。）
![名称未設定ファイル.drawio (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759541/7553bc6e-43b9-5073-7d86-36fd330a1f60.png)

Terraformも書いてみました✨

https://github.com/iisyos/metabase_ecs

## 結論
「え？もしまたMetabase環境を作る機会があったらって？」

「…」

「Postgresにデータを保存します。」

[Migrating to a production application database](https://www.metabase.com/docs/latest/installation-and-operation/migrating-from-h2#metabases-application-database)
Fly.io に Livebook コンテナをデプロイしてトークン認証できなかったときの対処法

## はじめに

以前、2023年03月30日に Fly.io に Livebook コンテナをデプロイする方法を記事に書きました

https://qiita.com/RyoWakabayashi/items/5ac91260b4d6b55adc1a

この方法では、 Fly.io のログから認証トークンを取得し、 Livebook の認証を行うようにしていました

今日(2023年06月02日)、同じ方法で Livebook コンテナをデプロイしたところ、 Livebook の認証がどうしてもパスできません

ログから認証トークンを確かにコピーアンドペーストしているにも関わらず、何度やってもホーム画面に遷移しません

これはどういうことでしょうか

## 原因

Fly.io の CLI である flyctl が2023年04月20日のリリースで大きく機能変更されていました

https://github.com/superfly/flyctl/releases/tag/v0.0.528

`fly launch` や `fly deploy` でアプリケーションをデプロイした際、デフォルトで２台構成にされるようになったのです

特にクラスタリング設定等していなかったので、同じドメインで別々の Livebook がそれぞれの認証トークンで起動してしまいます

この状態では、どちらか片方の認証トークンを入れてももう片方の認証が通らず、結果、どうやっても認証をパスできません

## 対処法

2023年04月28日のリリースで `ha` フラグが追加されました

https://github.com/superfly/flyctl/releases/tag/v0.0.545

`fly launch --ha=false` のように指定することで、１台構成で起動させることができます

## まとめ

まだまだ更新が激しい界隈ではよくあることですね
Pythonで旧約聖書にある大洪水後の世界人口を計算してみた

# 前提条件
* Python3
* matplotlib

旧約聖書の創世記に記述のある大洪水があったと仮定する。それが発生したのは今(2023年)から4813年前とする説を採用する。
そのときのノアの家族はノアとその配偶者と、3人の息子とその配偶者の8人であったとする。
ノアの息子達の世帯から子供が生まれたとする。
大洪水から50年目以降は一定の割合で人が亡くなったとする。

>人口増加率 A = (当該時点の人口-前時点での人口)/前時点での人口 * 100

人口が一定のA%/年で増えるとすると、T+1年の人口Nt+1はT年の人口Ntを使って次のように表すことができるそうです。

> Nt+1 = Nt + (A / 100) * Nt = (1 + A/100) * Nt 

# 目的
大洪水後の世界人口を計算してみる。

# 環境構築
```
pip install matplotlib
```

# サンプル
```noa-population.py
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

# 人口増加率を求める
def a(p0, p1):
    a = (p1-p0)/p0 * 100
    return a

# 人口増加率や人口減少率から次の年の人口を求める
def p(a0, p0):
    p1 = (1 + a0/100) * p0
    return p1


# ノアの大洪水が2010年の調査結果より4800年前にあったとして、それから2022年までの年数
t = 4812

# 初期化
a0 = 0
p0 = 0
c0 = 0
pd = 0

# 人口を格納するリスト
pt = []
# 最後の年の人口
pmax = 0
# 人口の減少率
d = -27.19452095

# グラフ描画用
x = []
y = []

for year in range(t):
    l = len(pt)
    if year == 0:
        # ノアの家族の人数
        p0 = 8.0
        pt.append(p0)
    elif year == 1:
        # ノアの3人の息子達の世帯から子供が生まれたとする
        c0 = 3.0
        p1 = p0 + c0
        # 人口増加率を求める
        a0 = a(p0, p1)
        # 人口増加率から次の年の人口を求める
        p2 = p(a0, p1)
        pt.append(p2)
    else:
        # 人口増加率から次の年の人口を求める
        pn = p(a0, pt[l-1])
        pt.append(pn)
        # infになったら、処理を終了する
        if pt[l] == float('inf'):
            print(year)
            print('overflow')
            break
        # 大洪水から50年目以降は人口減少率を導入し、次の年の人口を求める
        if year >= 49:
            pd = p(d, pt[l])
            pt.append(pd)
    x.append(year-2790)
    y.append(pt[l])
    m = len(pt)
    pmax = pt[m-1]
print(pmax)

plt.title("Population change")
plt.xlabel("Year")
plt.ylabel("Population")

plt.plot(x,y)
plt.show()
```
## 実行結果
```
8000359587.187075
```
## グラフ
![noa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/0aaafb88-9db6-6603-8c36-bed3492f8192.png)

# 参考資料
https://amzn.to/3MQJ2BF

https://dmpl.doshisha.ac.jp/wp-content/uploads/2015/06/simulation_and_model.pdf

https://ja.wikipedia.org/wiki/%E3%83%8E%E3%82%A2%E3%81%AE%E6%96%B9%E8%88%9F#:~:text=%E7%82%AD%E7%B4%A0%E5%B9%B4%E4%BB%A3%E6%B8%AC%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%A3,%E3%81%93%E3%81%A8%E3%81%8C%E7%A2%BA%E8%AA%8D%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82

# 編集後記
人が亡くなる割合は、2022年時点での世界人口80億人に近くなるよう調整したので、人口減少率に関する仮説を立てることはできてない。しかしながら、大洪水後のノアの家族8人から人口が増加したとする可能性を示せたと思う。
He3で3分でタイポグラフィウィジェットを開発する

He3のホームページで説明されているように、He3は開発者が必要とする多くのツールを含む開発者のツールボックスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/0d7a2800-f859-de71-96c8-9c65c223ce4b.png)


uToolsやRaycastと同様に、He3もユーザーが独自のツールを構築するためのオープンシステムを提供しています。

ブログを書いていると、中国語と英語の間にスペースを入れたり、数字を入れたりと、タイポグラフィの問題によくぶつかるんですが、たまたま最近、そのツールが必要になったんです：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/4bb781ca-1ce6-263e-0ce3-5716ccfbdddd.png)

アップルのiPhoneからの収益は、2022年の同じ四半期と比較して、2023年の最初の3ヶ月で増加した。
という書式が必要：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/57c0b720-0ac1-2147-f119-d6c89db3a8ba.png)

AppleのiPhoneからの収益は、2023年の最初の3ヶ月は、2022年の同じ四半期と比較して増加しました。
このテキスト変換のシナリオのために、He3は非常に便利なTextTransformコンポーネントを提供しており、変換メソッドだけを与えられたツールを開発することができます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/179aa319-8d42-23f7-dead-dc0802f59be0.png)


TextTransform コンポーネント開発ドキュメント：https://docs.he3app.com/components/TextTransform.html

まずはHe3が提供するWebサイド（https://portal.he3app.com/home/createTool）にアクセスしてログインし、「ツール作成」ページでツール名、ID、説明、キーワードを記入し、ワンクリックでプロジェクトパッケージをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/9f40c7ec-3f86-0a9b-0c2c-fb11af940957.png)


プロジェクトを開き、npm installを実行して、依存関係をインストールします：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/c032873e-1770-1d86-78e0-41f995f6325e.png)


プロジェクトの構造は非常にシンプルで、主にpackage.jsonとindex.vueファイルで、index.vueファイルにはツールコードを書きます（ここではVue3の書き方で、「コピーライティング・コレクト」npmを使用しています。パッケージを使って英語から中国語に変換しています）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/440bdf7e-a16b-79b5-c004-f79026a5f1d3.png)


const sampleData = `He3是一个包含近400种工具的终极开发者工具箱，涵盖了前后端开发者的日常所需。He3的智能搜索和剪贴板智能推荐 将您的开发效率提升到一个新的水平。`

const service = new CopyWritingCorrectService();

const transform = (inputValue: string): string => {
  return service.correct(inputValue);
};
</script>
そして、npm run devを実行し、He3クライアント（クライアントをインストールしてログインする必要があります）で、私たちのツールが表示されます。：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/8027aa9d-4196-616f-3081-cdcfbf1e6412.png)


開発したら、npm run publishを実行すると、私たちのツールが公開され、私たちのツールのリンク先がhttps://t.he3app.com/67cj
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/7bd75a24-eadf-c510-8c7a-079ccca62231.png)



この時点で、私たちのツールは正常にリリースされました 🎉🎉🎉

後日、He3のWebサイトでツールのレビュー過程を見ることができます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329120/eedc4d14-b769-2063-2e67-3fb396ba0134.png)


このように、全体的な開発環境は非常にシンプルで、ローカルのノード環境とHe3クライアントさえあれば独自のツールを構築でき、He3では変換シナリオを高度にカプセル化したコンポーネントを提供しているため、わずか数行のコードで小さなツールを実装できる。 最後に、「中国語・英語コピーコレクター」もぜひお試しください！：https://t.he3app.com/67cj
PyTorch でのトレーニング時に UnidentifiedImageError 出たときの対処法の一例

## はじめに

PyTorch で機械学習モデルのトレーニングを実行した際、 `UnidentifiedImageError` というエラーが発生しました

このエラーはトレーニングに用いる画像ファイルが破損しているときなどに発生するもののようです

ただし、今回私が遭遇したケースの場合、トレーニング用の画像ファイルは全て問題なくプレビューで開くことができ、破損しているわけではなさそうでした

エラーメッセージには `._sample.jpg` でエラーが発生したように書いていますが、 `sample.jpg` はトレーニングデータにあるものの、 `._sample.jpg` なんていうファイルは見当たりません

非表示ファイルを表示してみても存在しません

というわけで、このケースでの対処法をメモとして残しておきます

## 原因

エラーの原因となっていた（と思われる）ファイル `sample.jpg` を `ls -l` で見てみると、以下のような表示になっていました

```bash
$ ls -l ./sample.jpg                                
-rw-r--r--@ 1 oec  staff  129616  5  9 15:19 ./sample.jpg
```

パーミッション表示(`-rw-r--r--`)の後に `@` が付いています

この `@` は macOS の拡張属性 (EA = Extented Attribute) が付いていることを表します

そして、この拡張属性を持つファイルを圧縮すると、拡張属性が別ファイルとして追加されてしまうようです

今回、トレーニングデータをローカルで圧縮し、それをサーバに送って展開していました

その結果、 `._sample.jpg` という画像ではないのに拡張子 `.jpg` という不正なファイルができてしまい、それがエラーの原因になっていたのでした

参考記事:

https://qiita.com/__hage/items/467ddef0172f7f92b4ea

## 対処法

`ls -l@` とすると、拡張属性の内容が確認できます

```bash
$ls -l@ ./sample.jpg
-rw-r--r--@ 1 oec  staff  129616  5  9 15:19 ./sample.jpg
        com.apple.lastuseddate#PS            2 
        com.apple.quarantine         2
```

前述の参考記事にある通り、 `xattr -c` で拡張属性を全て削除できます

```bash
xattr -c ./sample.jpg
```

改めて `ls -l@` とすると、拡張属性が消えています

```bash
$ ls -l@ ./sample.jpg  
-rw-r--r--  1 oec  staff  129616  5  9 15:19 ./sample.jpg
```

この状態で圧縮してサーバに送り、トレーニングを実行することで、エラーが解消しました

## まとめ

とりあえず `ls -l` をしてみて `@` という謎の記号を見つけたので対処できましたが、まだまだ知らないことが多いです
Primer on Latency and Bandwidth 日本語まとめ

# Speed Is a Feature
サイトが高速であることが求められています。サイトが高速であるとこのような利点があります。
- ユーザー エンゲージメントの向上につながります。
(ユーザー エンゲージメント:ウェブページがフォーカス状態にあった時間、またはアプリの画面がフォアグラウンド表示されていた時間の長さ)

- ユーザー維持率の向上につながります。

- コンバージョン率も高くなります。
サイトを高速にするためにはどこを改善すればいいでしょうか？
- レイテンシ
(データ転送における指標のひとつで、転送要求を出してから実際にデータが送られてくるまでに生じる、通信の遅延時間のこと)
- 帯域幅
(通信するときに使われる電波や光の周波数の範囲のこと)

要するに下の図のように長さを短く幅を太くすれば高速に多くつながるよねという考え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1493403/936766a5-bd7b-0bb7-8709-7032f0048c27.png)
これはパケットが
# The Many Components of Latency
レイテンシは時間の定義ですがそこにはたくさんの要素があります。
- 伝搬遅延 : データがある地点からある地点まで到達するのにかかる物理的な時間
- 伝送遅延 : 信号が行き先へ到達するために必要な時間間隔
- 処理遅延 : パケット ヘッダーの処理、ビットレベルのエラーのチェック、パケットの宛先の決定に必要な時間
- キューイング遅延 : パケットが出力インタフェースのキューに入っている時間

# Speed of Light and Propagation Latency

- 光速は真空中で約30万キロメートル/秒だが、銅線や光ファイバーなどの媒体を通ると遅くなる。これは媒体の屈折率と呼ばれる値によって決まる。
- 光ファイバーの屈折率は1.4から1.6の間で変化し、光速は約20万キロメートル/秒になる。これは最大速度に近い驚くべき技術的成果である。
- 光ファイバーを使ってニューヨークからシドニーまでパケットを送ると、往復で約160ミリ秒かかる。しかし、これは最短距離を仮定した場合であり、実際にはもっと長いルートを経由するため、遅延は200～300ミリ秒になる。
- 人間は100～200ミリ秒以上の遅延を感じると不快になり、300ミリ秒以上では反応が鈍くなり、1000ミリ秒以上では別のことに注意が移ってしまう。
- ユーザーの体験を向上させるためには、アプリケーションが数百ミリ秒以内に応答する必要がある。そのためには、ネットワーク遅延を管理し、開発のすべての段階で設計基準として考慮する必要がある。
# Last-Mile Latency
- 真空中の光速はネットワークパケットの伝播時間に上限を設けるが、高速である。
- しかし、銅線や光ファイバーなどの媒体を通ると光速は遅くなり、媒体の屈折率によって決まる。
- 光ファイバーでは屈折率を低くすることで光速に近づけているが、それでもニューヨークからシドニーまでの往復では約160ミリ秒かかる。
- 人間は100ミリ秒以上の遅延を感じると不快になり、1000ミリ秒以上では注意が別のことに移る。
- ユーザーの体験を向上させるためには、アプリケーションが数百ミリ秒以内に応答する必要がある。そのためには、ネットワーク遅延を管理し、開発のすべての段階で設計基準として考慮する必要がある。
# Bandwidth in Core Networks
- 光ファイバーは光を伝送するための細いケーブルであり、金属線よりも信号損失や電磁干渉が少なく、メンテナンスコストも低い。
- 光ファイバーは波長分割多重化という技術で多くの波長（チャンネル）の光を同時に送ることができ、高い帯域幅を持つ。一本の光ファイバーで数十テラビット/秒の帯域幅を実現できる。
- 光ファイバーは大陸や海を横断する長距離の通信に使われている。しかし、最終的には金属線に接続されるため、遅延が発生する。これは最終マイル問題と呼ばれる。
- 最終マイル問題はISPの技術やネットワークの構成によって異なるが、10～65ミリ秒の遅延が発生することがある。この遅延はユーザーの体験に影響するため、注意する必要がある。

# Bandwidth at the Network Edge
-インターネットの中核をなす光ファイバーは数百テラビット/秒のデータを移動できるが、ネットワークの端では帯域幅がずっと少なく、技術によって大きく異なる。
- 光ファイバーは波長分割多重化という技術で多くの波長（チャンネル）の光を同時に送ることができ、高い帯域幅を持つ。一本の光ファイバーで数十テラビット/秒の帯域幅を実現できる。
- しかし、ユーザーに届くまでに金属線に接続されることが多く、遅延が発生する。これは最終マイル問題と呼ばれる。
- 最終マイル問題はISPの技術やネットワークの構成によって異なるが、10～65ミリ秒の遅延が発生することがある。この遅延はユーザーの体験に影響するため、注意する必要がある。
# Delivering Higher Bandwidth and Lower Latencies
- 動画ストリーミングの人気の高まりにより、高い帯域幅の需要が増えている。しかし、帯域幅は光ファイバーや金属線などの技術やネットワークの構成によって制限される。
- 帯域幅を増やすためには、光ファイバーを増やしたり、波長分割多重化という技術を改良したりすることができる。光ファイバーは数百テラビット/秒のデータを移動できるが、金属線に接続されることが多い。
- 遅延を改善するためには、光ファイバーの品質を向上させたり、最短距離のルートを選んだりすることができる。しかし、光速は遅延の最小値を決めるため、大きな改善は期待できない。
- アプリケーションのパフォーマンスを向上させるためには、帯域幅と光速の制限を考慮したプロトコルやネットワークコードを設計し、最適化する必要がある。キャッシュやプリフェッチなどの技術を使って遅延を隠すこともできる。
UiPath初心者向け：実務で使える非活性ボタンの検出について(属性を取得アクティビティ)

# こんなことありませんか？
**ボタン(SAVEや送信)押下後に押下成功のポップアップやメッセージがすぐに消える。**
これに対して、「要素の存在を確認」アクティビティをしようとしても要素を確認できずにエラーになってしまう。
* 「要素の存在を確認」アクティビティについては↓を確認してください。
 UiPath初心者向け：実務で使える入力アクティビティがシステム、
サイトとの相性が悪い場合について(待機アクティビティ)
https://qiita.com/thxUVER2012/items/0e3954395b2e5ec436bf

# そのときにどう対応したか？
私は、ボタン押下後に何か変化がないかを探り、押下したボタンが非活性になったので、
これでボタン押下できると判断しました。
しかし、非活性を確認できるアクティビティがあるのかと思って調べました。

# 「属性を取得」アクティビティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/199910d2-98ee-c688-303f-e7c17717ae0b.png)
このアクティビティは、①～③を設定するとボタンが非活性であるかを調べられます。
①「画面上で指定」から非活性になるボタンを選択する。
②「"aastate"」を選択か入力する。
③非活性であるかの結果を格納する変数を入力する。
　非活性の結果は「disenable」になり、活性の結果は「enable」になります。

# 実践的にするなら
具体的に②、③を埋めてみました。
さらに1つアクティビティを追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/f72df27d-770d-755c-c30f-9d89e6a0ee66.png)
最初は「メッセージをログ」アクティビティか「メッセージボックス」アクティビティで非活性であるかの結果を確認するといいです。

# 最後に
今後もこのような記事を書いていくので、困っている方の助けになればいいなと思っています。
tRPCをNext13 App Directoryで使う

2023/6時点ではtRPCのNext.js Integrationの項目はNext13のApp Directoryとの連携をカバーしていない。

https://trpc.io/docs/nextjs/introduction

tRPC公式?が提供している以下のRepositoryも全体的にPoCの雰囲気が強く、おそらく試行錯誤の過程だと思われる。

https://github.com/trpc/next-13

## 何を参考にすればよいか

色々調べた結果、以下のレポジトリが最小構成で一番正解に近い気がする

https://github.com/devietti/trpc-next13-app

実装はNext.jsのRoute Handlersを使っているだけだが、これだけでいいみたい。

https://trpc.io/docs/server/adapters/nextjs#route-handlers

docsを読んでいると `@trpc/next` のパッケージをinstallするような説明があるがRoute Handlersを使う限りは不要。
[AWS Q&A 365][VPC]AWSのよくある問題の毎日5選 #74

# 1. Amazon Virtual Private Cloud（VPC）とは何ですか？
回答：Amazon VPCは、定義した仮想ネットワークにAmazon Web Services（AWS）リソースを展開できる仮想ネットワークです。この仮想ネットワークは、AWSのスケーラブルなインフラストラクチャを利用する利点を持ちながら、あなた自身のデータセンターで運用する従来のネットワークに非常に似ています。

# 2. Amazon VPCの特徴は何ですか？
回答：Amazon VPCには、Amazon Elastic Compute Cloud（Amazon EC2）インスタンスを選択したサブネットに展開したり、セキュリティグループを作成・管理したり、ルートテーブルやネットワークゲートウェイを設定したり、Amazon CloudWatchを使用してVPCリソースを監視するなど、いくつかの機能があります。

# 3. Amazon VPCの利用を開始するにはどうすればよいですか？
回答：Amazon VPCを利用するには、AWSアカウントに登録し、アクセス許可を確認し、IPアドレス範囲を決定し、利用可能なゾーンを選択し、インターネット接続を計画し、VPCを作成し、アプリケーションを展開する必要があります。

# 4. Amazon VPCの価格設定はどのようになっていますか？
回答：Amazon VPCの価格設定は、使用するリソースの種類とサイズ、VPCのデータの転送量、Amazon CloudWatchやAmazon Elastic Load Balancingなどの追加機能の利用など、いくつかの要素に基づいています。

# 5. VPCを企業ネットワークや自宅ネットワークに接続するにはどうすればよいですか？
回答：VPN接続またはAWS Direct Connectを使用して、VPCを企業ネットワークや自宅ネットワークに接続することができます。VPN接続では、インターネットを介してVPCと企業ネットワークや自宅ネットワークの間に安全かつ暗号化された接続を確立することができます。AWS Direct Connectでは、専用のネットワーク接続を使用してVPCと企業ネットワークや自宅ネットワークを接続することができます。
[AWS Q&A 365][VPC]Daily Five Common Questions #74

# 1. What is Amazon Virtual Private Cloud (VPC)? 
Answer: Amazon VPC is a virtual network that enables you to launch Amazon Web Services (AWS) resources into a virtual network that you've defined. This virtual network closely resembles a traditional network that you'd operate in your own data center, with the benefits of using the scalable infrastructure of AWS. 

# 2. What are the features of Amazon VPC? 
Answer: Amazon VPC provides several features, including the ability to launch Amazon Elastic Compute Cloud (Amazon EC2) instances into a subnet of your choosing, create and manage security groups, configure route tables and network gateways, and use Amazon CloudWatch to monitor your VPC resources. 

# 3. How do I get started with Amazon VPC? 
Answer: To get started with Amazon VPC, you'll need to sign up for an AWS account, verify your permissions, determine your IP address ranges, select your availability zones, plan your internet connectivity, create your VPC, and deploy your application. 

# 4. What is the pricing for Amazon VPC? 
Answer: The pricing for Amazon VPC is based on several factors, including the type and size of the resources you use, the data transfer in and out of your VPC, and the use of additional features such as Amazon CloudWatch and Amazon Elastic Load Balancing. 

# 5. How can I connect my VPC to a corporate or home network? 
Answer: You can connect your VPC to a corporate or home network using a VPN connection or AWS Direct Connect. With a VPN connection, you can establish a secure and encrypted connection between your VPC and your corporate or home network over the internet. With AWS Direct Connect, you can establish a dedicated network connection between your VPC and your corporate or home network.
Pythonの評価順序と短絡評価

「Pythonの評価順序と短絡評価」について、たまに忘れてしまう自分とプログラミング初心者の方に向けて要点をまとめました。以下に要点を記します。

# 評価順序の要点
1\. 算術演算子（+, -, *, / など）
2\. 比較演算子（<, ==, >, != など）。
3\. 論理演算子（and, or）
(論理演算子の評価は**短絡評価** "_short-circuit evaluation_" と呼ばれる仕組みを持っています。)
１から順に評価されます。また短絡評価については以下に記します。

## 短絡評価の要点
短絡評価は論理演算子に適用されます。
<dl>
  <dt>and</dt>
  <dd>左側の式が『偽』の場合、右側の式は評価されずに結果が False となります。</dd>
  <dt>or</dt>
  <dd>左側の式が『真』の場合、右側の式は評価されずに結果が True となります。</dd>
</dl>

## 例題１
```python
a + b < c or d
```
<details><summary>答え</summary>

この例題では、まず a + b が評価され、その結果が c より小さいかどうか比較されます（比較演算子の評価）。そして、その結果が真であれば、論理演算子 or の右側の式 d は評価されません。
</details>

## 例題２
```python
B = True
C = 10
a = 10

if a == (B or C):
    print("条件式が真です")
else:
    print("条件式が偽です")
```
<details><summary>答え</summary>

この例題では、B は真であり、比較演算子の右側のオペランドである C の評価がスキップされます。したがって、「a == (B or C)」は「a == B」と等価となり、条件式は真となります。
</details>

# BまたはC
aがBまたはCの場合を表現するには、次のように書くことができます。
```python
if a == B or a == C:
```

また、よりシンプルな書き方としては、次のように書くこともできます。
```python
if a in [B, C]:
```
これにより、リスト内にaの値が含まれているかどうかを効率的に判定することができます。

# BかつC
aがBかつCの場合を表現するには、次のように書くことができます。
```python
if a == B and a == C:
```

よりシンプルな書き方としては、次のように書くこともできます。
```python
if a == B == C:
```

以上になります。
ご指摘などありましたら、コメントしていただくと嬉しいです。
【MySQL】ロリポップ！のデータベースの使い方

# はじめに
ロリポップ!レンタルサーバーでMySQLデータベースを使う方法をご紹介します。
（2023/6/2時点での情報になります）

# 目次
1. ロリポップ！のプランについて
2. データベース作成

# 1. ロリポップ！のプランについて
|  |エコノミ―|ライト|ベーシック|エンタープライズ|
|---|---|---|---|---|
|データベース数|なし|1|無制限|無制限|

エコノミープランではMySQLを使えず、ベーシックプランからは無制限になっています。
データベースを使うなら、ベーシックプラン以上がおすすめです。

# 2. データベース作成
![Screenshot 2023-06-02 231404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/b04c1e87-71a5-3e50-5964-618bea030251.png)
ロリポップ！にログインし、左サイドバーから「サーバーの管理・設定」→「データベース」をクリックします。

![Screenshot 2023-06-02 232624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/6d68688a-6015-abec-2b68-a84552df8516.png)
「作成」ボタンをクリックします。

![Screenshot 2023-06-02 232948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/52dad5ac-d3c4-0f99-4fd6-5867e7449f80.png)
「作成するサーバー」「データベース名」「接続パスワード」を決定し、「作成」ボタンをクリックします。

![Screenshot 2023-06-02 233346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/d3082e97-bfaf-63c5-bf7e-dc7d66abfda9.png)
成功すれば、先ほど作成したデータベースが表示されます。
「操作する」ボタンをクリックします。

![Screenshot 2023-06-02 233837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/25b3aae8-b855-c35e-8976-f84f34d80410.png)
「phpMyAdminを開く」ボタンをクリックで、phpMyAdminによるデータベース操作ができます。パスワードを忘れた場合は、「パスワード確認」ボタンから確認できます。
Reactとphpを組み合わせ、モードに応じた機能の切り替えを行いたい？

# ReactとPHPを組み合わせたい

弊社にはレガシーなPHPで作成されたシステムがあります。
全部をReactなどでリプレイスするのは現実的ではないです。
そのため、基本的な仕組みはPHPで行います。
ただ、新機能としてJSを用いてAPIを叩いて認証したり、DOMを操作したい場合があります。

## 技術選定候補
1. vanilla js
昔よりマシだが、さすがにaddEventlistnerとかDOM操作とかつらい

2. jQuery
いまさら感漂う。久々に書いてみたけどReactなどに慣れるとDOM操作がしんどい。

3. lit
web componentsをつくればよろしいが、いろいろライブラリが枯れてない。
Reactならあのライブラリあるのにな〜とか、前つくったあれを使いたいな〜とか思う。

4. svelte, solid, react
まあどれもPHPとうまく組み合わせるのは結構難しいような……。

で、いろいろ考えた結果、phpのページAから読みだしたときは、この機能。
ページBから読みだしたときは、この機能というようにつくってみました。

## Reactを呼び出す側

```html:auth.html
<div id="root" data-mode="auth"></div>
```

htmlというかphp側からは、こんな風にmodeを指定して呼び出します。

## Reactでmodeを取得する

```tsx:main.tsx
import React from "react";
import ReactDOM from "react-dom/client";
import { App } from "./App";
import { AppProvider } from "./providers/AppProvider";

const rootElement = document.getElementById("root");
const mode = rootElement?.dataset?.mode;

ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
  <React.StrictMode>
    <AppProvider>
      <App mode={AppModeSchema.parse(mode)} />
    </AppProvider>
  </React.StrictMode>
);
```
modeをelement.dataset.modeで取得します。
modeについてはTypeScriptのユニオンで定義しておくのが良いと思います。
自分でつくったmodeなんだから違ったときはzodでしっかりエラーを出すのがよろしいかと。

一応zodSchemaの例。

```ts:modeType.ts
export const AppModeSchema = z.union([z.literal("index"), z.literal("auth")]);
// type
export type AppMode = z.infer<typeof AppModeSchema>;
```
こんな感じですな。

## ReactのApp.tsxで振り分けを行う

```tsx:App.tsx
type AppProps = {
  mode: AppMode;
};
export const App = ({ mode }: AppProps) =>
  match(mode)
    .with("index", () => <IndexPage />)
    .with("auth", () => <AuthPage />)
    .exhaustive();
```

ts-patternを使って網羅的なmatchを書くのがよろしいかと思います。
indexのときのコンポーネントとAuthのときのコンポーネントを作成して呼び出すわけです。

これで、indexページでは```<div id="root" data-mode="index"></div>```とすれば良く
authページでは```<div id="root" data-mode="auth"></div>```とすれば良いです。

まあReactの重さを考えると、litのほうが良いような気もしますが
React向けにつくられた便利なコンポーネントを使いたい、とかいろいろ考えるわけです。
svelteでweb componentsにするか、とか。
preact使うか……とか。
いろいろ考えるわけですが……。

もっと速度が必要になったときに考えましょう。

とりあえずPHPのいろいろなページでモードを変えて使えるReactでした。

もっと良さそうな方法あったら教えてください。
最初のうちはReactで、サイズが気になりだしたらpreactとかになりそうな予感がしています。
Android App crashed immediately when open a dailog using BaseAdapter

元々はJavaで実装しましたがIntellijを利用してkotlinに変換しました。ところがAlertDialogを開く瞬間APPがcrashしました。このAlertDialogはsetAdapter()を利用して自分で実装したListAdapterを表示する
```kotlin
val builder = AlertDialog.Builder(this)
builder.setAdapter(playingAdapter) { dialog, item ->
                Log.d("MyApp", item.toString())
            }
```

```kotlin
class CustomListAdapter    //public constructor
    (//context
    private val context: Context, //data source of the list adapter
    private val items: List<Music>
) : BaseAdapter() {
    override fun getView(
        position: Int,
        convertView: View,
        parent: ViewGroup
    ): View {}
```
原因はconvertView: Viewはダメです。convertViewはnullになる可能性があるのでconvertView: View?すべきです。
```kotlin
 override fun getView(
        position: Int,
        convertView: View?,
        parent: ViewGroup
    ): View
```
AWS VPCエンドポイントを作成する

# 概要

- デフォルトのVPCのデフォルトのap-northeast-1aのデフォルトのサブネットにHTTPS（443）のリクエストを許可するVPCエンドポイントの作り方をまとめる。

# 詳細

- 「サブネット内のlambdaからVPC外のSecret Managerの値を取得する」ためのVPCエンドポイントを作成する。

# 方法

## VPCエンドポイント専用セキュリティグループの作成

1. AWSのマネジメントコンソールにアクセスする。
1. VPCのホームを開く。
1. 左サイドバーで「セキュリティグループ」をクリックする。
1. 右上の「セキュリティグループを作成」をクリックする。
1. 下記のように設定して作成する。
    - セキュリティグループ名：access-secret-manager-for-lambda-sg
    - 説明：access-secret-manager-for-lambda-sg
    - VPC：デフォルトVPCを選択
    - インバウンドルール：
        - タイプ：HTTPS
        - ソース：Anywher IPv4 0.0.0.0/0
    - アウトバウンドルール：
        - タイプ：全てのトラフィック
        - 送信先：カスタム 0.0.0.0/0

    ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/35e4475c-b11d-9d7e-ebd3-f514b4b502c3.png)


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

1. AWSのマネジメントコンソールにアクセスする。
1. VPCのホームを開く。
1. 左サイドバーで「エンドポイント」をクリックする。
1. 右上の「エンドポイントを作成」をクリックする。
1. 下記のように設定する。
    - 名前タグ：わかりやすい任意のもの（今回はaccess-secret-manager-for-lambda-env-pointとする）
    - サービスカテゴリ：「AWSのサービス」を選択
    - サービス：「com.amazonaws.ap-northeast-1.secretsmanager」を選択
    - VPC：デフォルトVPCを選択
    - アベイラビリティーゾーン：「ap-northeast-1a」を選択
    - サブネット：
        - アベイラビリティーゾーン：ap-northeast-1a
        - サブネットID：デフォルトサブネットのものを選択
        - IPアドレスタイプ：IPv4
    - セキュリティグループ：先に作成した「access-secret-manager-for-lambda-sg」を選択
    - ポリシー：フルアクセス

    ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c7a597a4-07fb-26d8-1dfb-ff4c16c0375a.png)
    ![VPC_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1afeb9bf-7530-8d1e-bde7-2ce17b65563a.png)
【ターミナル爆速操作！】たった4(+2)のショートカットでターミナル&Vimが爆速になる理由


# Introduction

**`VSCode`でリッチな開発体験を得られるようになった！**
**`Vim`で素早くコード移動できるようになった！**
**`ターミナル`ではカーソル or Delete キー連打！**

例えば`test.py`を実行するとします。引数も必要でした。
typo した時にこんな操作をしていませんか？

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292052/bdc461fd-4b31-cb27-57b7-b5f6aedb282b.gif)

どれだけ効率の良いコーディングをしても、実行にはターミナルの操作が必要です。
エディタでは効率を追求するのに、ターミナルは力技では勿体なくないでしょうか？

**ターミナルでもショートカットがあります。**

本記事では
**ターミナルと Vim(挿入モード)で共通したショートカットを、**
**すぐ覚えて使えるものに絞って 4(+2)個紹介し、**
**効率の良い操作で爆速にします。**

これを機に力技を卒業しましょう！

**※Mac ユーザーは以下の記事を参考にしてください。**

https://qiita.com/orangeboy/items/a51730ec2d157bf064d6

**本記事が少しでも読者様の学びに繋がれば幸いです！**
**「いいね」をしていただけると今後の励みになるので、是非お願いします！**

## 環境

Ubuntu22.04

## ターミナル & Vim(挿入モード)のショートカット

### カーソル移動

- `Ctrl + 左矢印`: 単語単位で前に移動
- `Ctrl + 右矢印`: 単語単位で後ろに移動

### テキスト削除

- `Ctrl + u`: カーソル位置〜行頭まで削除
- `Ctrl + w`: カーソル位置〜前方の単語削除

## おまけ: ターミナル限定ショートカット

本旨とは外れますが、覚えておくと便利なのでまとめておきます。
後から`time`を入れたり、`cd`を`ll`に変える時に重宝しています。

- `Ctrl + a`: 行頭へ移動(HOME キーと同様)
- `Ctrl + e`: 行末へ移動(END キーと同様)

## 最後に

最後まで閲覧頂きありがとうございました。

`Ctrl + 矢印`で単語間を飛び回り、`Ctrl + w`で単語ごと削除。
これだけでも煩わしかったターミナル操作が快適になります。

備忘録の側面もありますが、本記事がお役に立てば幸いです！
今更ながらAstroについて調べてみた

## はじめに
今更ながらAstroに入門したので、ドキュメントの内容などをまとめてみました。
結構短くまとめたので、気軽に見ていただけると嬉しいです！

## Astroとは？
> Astroは、コンテンツにフォーカスした高速なWebサイトを構築するためのオールインワンWebフレームワークです。
https://docs.astro.build/ja/getting-started/

## 特徴
### コンテンツ重視
- コンテンツに焦点を当てているため、アプリケーションに焦点を当てている最新のWebフレームワークでは実装する意味がないようなトレードオフを行い、高いパフォーマンス機能を提供している
- webアプリケーションを構築する場合は別のフレームワークを使うことが推奨される
### マルチページアプリケーション（MPA）
- 複数のHTMLページで構成されるWebサイトのことで、そのほとんどがサーバー上でレンダリングされる
- MPAは初回ロードの速さやSEOの面で優れているが、動的なUIや高度なインタラクションを必要とする場合にはSPAが適している
- Astroの他のMPAとの違いはJavaScriptとHTML、CSSのみで開発が行えること
### デフォルトで高速
- Next.jsで構築された同じサイトよりも、90%少ないJavaScriptで40%速く読み込むことができる
https://twitter.com/t3dotgg/status/1437195415439360003
### 簡単
- Web開発のスキルレベルや過去の経験に関係なく、親しみやすいと感じられるように設計されている
### 柔軟で充実した機能
- React、Preact、Svelte、Vue、Solid、Litなどはすべてサポート
- 同じページで異なるフレームワークも使用できる


## Astroアイランド（コンポーネントアイランド）
Astroのデフォルトで高速なパフォーマンスの秘密は、Astroアイランドにある
### Astroアイランドとは？
- Astroが開拓したWebアーキテクチャーのパターン
- 静的なHTMLページ内にインタラクティブなUIコンポーネントを配置する
- 1つのページに複数のアイランドが存在でき、アイランドは常に孤立して表示される

### Astroアイランドはどのように機能するか？
- Astroは、デフォルトではクライアントサイドのJavaScriptを一切使用せずにすべてのウェブサイトを生成する
- インタラクティブなUIを作成する場合、ページ全体をSPAのようなJavaScriptアプリケーションにするのではなく、アイランドを作成する
  - これによりサイトの大部分は軽量なHTMLとCSSのままになり、インタラクティブな部分だけがJavaScriptを使用して動作するため、高速でパフォーマンスの良いサイトを構築できる

### アイランドの利点
- パフォーマンス向上
- 並列ロード 
  - 優先度の高いアイランドが優先度が低いアイランドをブロックすることなく、並行でロードされる
  - 各コンポーネントのレンダリング方法とタイミングをAstroに正確に指示できる

## おわりに
最後まで読んでいただきありがとうございます！この記事が役に立ったり、Astroに興味を持つきっかけになったら嬉しいです！
高速なWebサイト作る上ではNext.jsとかよりも良さげなので使ってみようと思います。

## 参考
- https://docs.astro.build/en/getting-started/
tf.keras.layers.SimpleRNNの仕組みを手組みで確認する

# 目的
Tensorflow.Kerasに用意されているRNNレイヤーの構造を、手組みの場合と比較しながら理解します。

# 対象
本稿では、RNNレイヤーの1つであるSimpleRNNを対象とします。
https://www.tensorflow.org/api_docs/python/tf/keras/layers/SimpleRNN

# 前提
公式ドキュメント、専門書およびweb上の情報等を参考にリバースエンジニアリングを行いながら、結果を比較することで計算式、および重み行列とKerasレイヤーのパラメータとの対応関係を抽出しました。ソースコードを見て厳密に確認したわけではないため、100%正しい記載になっていない可能性がありますが、理解のためには十分かなと思います。

実行結果は以下の環境で計算した結果となります。
Python: 3.10.6
Tensorflow: 2.12.0 (tensorflow-aarch64)
Keras: 2.12.0
Numpy: 1.23.5

# 結果
天下り的ですが、SimpleRNNの計算式は以下のように表されることがわかりました。
```math
\begin{align}
s_t &= f(W x_t + U s_{t-1} + b) \\
y_t &= s_t
\end{align}
```
ここで
- $x_t$：入力値（$K$次元ベクトル）
- $s_t$：内部メモリ（$N$次元ベクトル）（SimpleRNNではそのまま出力になる）
- $y_t$：出力値（$N$次元ベクトル）
- $f$：Activation（デフォルトはtanh）
- $W$：入力に対する重み（$N\times K$行列）
- $U$：内部メモリに対する重み（$N\times N$行列）
- $b$：バイアス項（$N$次元ベクトル）

となります。

## 実証
SimpleRNNの計算が上式となることを、Kerasの出力結果と手組みの出力結果を比較することで確かめます。

まず入力値をランダムに生成します。
```python
# 時刻ステップTのK次元データをS個生成
S = 3
T = 2
K = 4
input = np.random.randn(S, T, K)
print(input)
```
[[[-1.00559132  2.19790855  1.22426653  0.43110155]
  [ 2.47757924  1.42999603  0.22461884  0.52406924]]

 [[ 1.58063093 -0.65496626  0.66998741 -2.05034626]
  [ 1.31754524  0.40744175  0.07545818  1.48894891]]

 [[-0.46522181  2.16090139  0.71952939 -0.45572353]
  [-1.99252205  0.38433699  0.49557174 -2.04901821]]]

Kerasの結果は次のようになります。return_sequences=Trueとして全ての時刻ステップの結果を取得します。また、デフォルトでゼロに初期化されてしまうbiasをbias_initializer='random_normal'として値を入れます。
```python
# 内部メモリはN次元とする
N = 2
rnn = tf.keras.layers.SimpleRNN(N, bias_initializer='random_normal', return_sequences=True)
output = rnn(input)
print(output)
```
tf.Tensor(
[[[-0.9842801   0.7969481 ]
  [ 0.93499136 -0.7715645 ]]

 [[ 0.44224197 -0.9944355 ]
  [ 0.7529196  -0.6964871 ]]

 [[-0.9916976  -0.10067604]
  [-0.999102    0.8626111 ]]], shape=(3, 2, 2), dtype=float32)

出力は$(S, T, N)$次元のテンソルとなります。

次に、SimpleRNNを手組みするために、$W,U,b$の重みをkeras.layerから取得します。
```python
W = rnn.weights[0].numpy()
print(W)
```
[[ 0.83396554 -0.95233345]
 [-0.9864013  -0.09958982]
 [ 0.21518016  0.05979133]
 [ 0.78888416  0.73306966]]

```python
U = rnn.weights[1].numpy()
print(U)
```
[[ 0.19022751 -0.9817401 ]
 [ 0.9817401   0.19022739]]

```python
b = rnn.weights[2].numpy()
print(b)
```
[-0.01591891 -0.03780531]

最後に、各サンプルごとに、SimpleRNNの数式に従って計算し、各時刻ステップ毎に結果を出力します。このとき、行列積の順序に注意します。（入力値や重み行列が数式とは転置になっているため）
```python
for x_s in input:
    s = np.zeros(N)
    for x_t in x_s:
        s = np.tanh(x_t @ W + s @ U + b)
        print(s)
```
[-0.98428005  0.79694807]
[ 0.93499136 -0.77156436]

[ 0.44224219 -0.99443547]
[ 0.75291959 -0.69648714]

[-0.99169759 -0.10067606]
[-0.99910198  0.86261118]

kerasの結果と一致していることが確認できました。

# 参考
- [tf.kerasにおけるRNNのパラメータ数の計算方法](https://qiita.com/yuichi0625/items/29cf86b911013e3f9476)
AutoHotKeyでホームポジションの住民になる

この記事を書き始めた 2023/06/02 現在、私は沖縄にいるわけなのですが、台風2号のおかげで講義もなくなり、~~幾度となく繰り返される停電と復旧の影響でPCもろくに触れない~~ 停電に怯えつつ自宅で開発に励んでおります。
さて、それだけ時間があれば無論PCの前に座る時間=キーボードと戯れる時間が増えるわけで、ホームポジションに引きこもりたい欲が出てきます。しかし、矢印キー、BackSpaceキー、Deleteキー......こいつらのためにホームポジションを出なければならない！なんということか！！
調べたら、Windows PCのキーバインドをカスタマイズできる「AutoHotKey」なるものがあるとか。今更感しかありませんが、ひとまず触ってみることにしました。

## AutoHotKeyとは？
公式: [AutoHotKey](https://www.autohotkey.com/)
公式ページ「What is it ?」という項目を辿っていくと、wikiに飛びました。読み進めてみます。
> AutoHotkey is a free and open-source custom scripting language for Microsoft Windows, initially aimed at providing easy keyboard shortcuts or hotkeys, fast macro-creation and software automation that allows users of most levels of computer skill to automate repetitive tasks in any Windows application. User interfaces can easily be extended or modified by AutoHotkey (for example, overriding the default Windows control key commands with their Emacs equivalents).

どうやらWindowsでスクリプト言語とやらを書くと、キーボードやマウスでの操作を自動化できたり、新しくショートカットキーを割り当てられると......
割と多くの人が使ってるようなので、入れてみることにしました。

## 手順
1. 公式ページからAutoHotKeyをインストール
1. 自分の好きなようにカスタマイズしたスクリプトを`.ahk`形式で保存
1. ダブルクリックなどで、先ほど作成した.ahkスクリプトを実行
1. 終了: タスクバーのアイコンを右クリック -> Exit

簡単！

ちなみに、.ahkスクリプトのショートカットをスタートアップに登録しておけば、PCの起動時に自動的にこの設定を有効化してくれます。
起動後に毎回ダブルクリックしにいくのもめんどくさいので、`Win+R` -> `shell:startup` でスタートアップフォルダに入れておきましょう！

## サンプル
サンプルとして、私が自分のPCで設定したものを載せておきます。
```main.ahk
; non-conversion + w, s, a, d: Arrow key operation
sc07B & W::
    Send, {Blind}{Up}
sc07B & S::
    Send, {Blind}{Down}
sc07B & A::
    Send, {Blind}{Left}
sc07B & D::
    Send, {Blind}{Right}

; non-conversion + q: Backspace
; non-conversion + e: Delete
sc07B & Q::
    Send, {Backspace}
sc07B & E::
    Send, {Delete}

; Disable insert key (What is this key used for? I am constantly struggling with this.)
INS::
    return

; Input timestamp
^+d::
    FormatTime, TimeString, , yyyyMMdd
    Send, %TimeString%
    return
```

項目ごとに簡単に解説します。
前提として、構文は以下のようになっています。
- `入力キー::出力キー`
- 出力キー部分に `return` を指定: 入力キーの無効化
- `;` はコメントアウト

**矢印キーの設定**
```.ahk
sc07B & W::
    Send, {Blind}{Up}
sc07B & S::
    Send, {Blind}{Down}
sc07B & A::
    Send, {Blind}{Left}
sc07B & D::
    Send, {Blind}{Right}
```
`sc07B`は無変換キーです。Spaceキーの横あたりにあるやつ。
個人的にこのキーを使うこともないので、 `無変換キー+{WASD}` で 矢印(カーソル移動)としました。
同時押し系の入力キーの指定は `〇 & △` で書けるので、直感的で良いですね。
ちなみにWASDで矢印にした理由は、私がよくPCでゲームをしていて、この移動方法に慣れているからです。Vimに慣れているかたは`WASD` -> `HJKL` とかに変更してみても良いかもしれませんね。

**BackSpace, Delete**
```.ahk
sc07B & Q::
    Send, {Backspace}
sc07B & E::
    Send, {Delete}
```
BackspaceキーとDeleteキーです。
これも無変換キーと同時押しで、`q` と `e`に割り当てています。
全部左手だけでできるのはとても楽です。

**Insertキーの無効化**
```.ahk
INS::
    return
```
Insertキーって必要ですか？(Insert使うよ～って人がいたらコメントで教えてください)

**タイムスタンプ**
```.ahk
; Input timestamp
^+d::
    FormatTime, TimeString, , yyyyMMdd
    Send, %TimeString%
    return
```
手入力で `yyyymmdd` 打つのはもうやめましょう。
ということで、`Ctrl+Shift+D` でタイムスタンプを入力できるようにしました。
数字キーやテンキーに手を伸ばさなくて良いのはもちろん、カレンダーを確認しなくても日付を入力できるのは革命ですね。楽しくて何度も入力してしまいます。20230602202306022023060220230603......
開発しているとよくある「いつの間にか日付が変わってた」問題も、これで気付くことができますね！

## まとめ
日付入力は本当に革命だと思います。
Dockerコンテナでローカルストレージをマウント、コンテナ間のネットワーク共有

相変わらず忘れがちなDockerのオプションに関する備忘ログ。
今回はWindows WSL上で走らせるコンテナにローカルストレージをマウントする方法、およびコンテナ間での通信を行うためのネットワーク設定コマンドです。

コマンド例：SubVersionをDockerコンテナを利用して立ち上げ、ローカルストレージをマウント
```
docker run -d --name suna-svn-server --network=suna-network -v /mnt/c/svn-server:/var/opt/svn -p 3690:3690 garethflowers/svn-server
```

引数解説：
--network=suna-network
コンテナを"suna-network"ネットワークに接続し、コンテナでの通信用に利用
Dockerで立ち上げたREDMINEから、同じくDockerで立ち上げたSubVersionリポジトリを除く場合などに利用

-v /mnt/c/svn-server:/var/opt/svn
ホストの"/mnt/c/svn-server"ディレクトリをDockerコンテナ内の"/var/opt/svn"にマウント

以下、REDMINE、Jenkinsを同様の方法で立ちげる場合のコマンド。
```
docker run -d --name suna-redmine-server --network=suna-network -v /mnt/c/redmine-server:/usr/src/redmine/files -p 3000:3000 redmine
docker run -d --name suna-jenkins-host --network=suna-network -v /mnt/c/jenkins-data:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
```
【SwiftUI】アラートにテキストフィールドを付ける

# はじめに
SwiftUIでアラートにテキストフィールドを付ける方法を記事にしておきます。

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @State private var isPresented = false
    
    @State private var text = ""
    
    var body: some View {
        Button {
            isPresented = true
        } label: {
            Text("アラートを表示")
        }
        .alert("アラート", isPresented: $isPresented) {
            TextField("テキストフィールド", text: $text)
            
            Button {
                print("OK")
            } label: {
                Text("OK")
            }
        }
    }
}
```

![Simulator Screenshot - iPhone 14 - 2023-06-02 at 22.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4ef907b6-2631-6f1a-070b-f4a890b3e248.png)

# おわり
いい感じにできました！
SECCON BEGINNERS CTF2023 Choice[Crypto,midium]作問者writeup

# 0.はじめに
初めまして。高校二年のもちもちと言います
まずはSECCON BEGINNERS CTF2023に参加していただきありがとうございました！
solve数はこんな感じになりました。思いのほか崖ができちゃったみたく、Cryoto準備陣一同ひいひい言ってました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1539611/3cd3d871-0543-c7f9-adcb-a513602d0ba7.png)

他の作問者のwriteupまとめ(順不同)
- [taskさん(CoughingFox2)](https://qiita.com/task4233/items/2958820c903e4a25bf4c)
- [satokiさん(aiwaf, polyglot4b, polyglot4b2)](https://github.com/satoki/ctf4b_2023_satoki_writeups)
- [yuasaさん(double check, oooauth)](https://melonattacker.github.io/posts/36/)
- [Tsubasaさん(Forbidden)](https://twitter.com/Sz4rny/status/1665228721861672962)
- [xryuseixさん(shaXXX,drmsaw,phisher2)](https://qiita.com/xryuseix/items/1c03bcb43eee608dcb59)
......(追記予定)


# 1.考察ステップ
まずコード全体に目を通してあげると、
$$n,e,c,pq+qr+rp$$
が既知で$n$以上の任意の整数$k$に対して
$$p^k+q^k+r^k \mod n$$
が何度でも取得できるといった特徴の3変数のRSA暗号(Multi-Prime-RSA)だとわかります。
$$c^d \equiv m \mod n$$
であることからdを求めてあげたく、
$$ed \equiv 1 \mod φ(n)$$
を思い出してあげると、
$$n=pqr$$
より
$$φ(n)=(p-1)(q-1)(r-1)=pqr-(pq+qr+rp)+(p+q+r)-1=n-(pq+qr+rp)+(p+q+r)-1$$
となります。ここで$pq+rq+rp$と$n$が既知であることから、あとは$p+q+r$を求めてやればよく、この形までいけば三次の基本対象式を思い浮かんでくるのではないでしょうか
# 2.解法
$p^k+q^k+r^k$についての値を何度でも引っ張ってこれるので、連続する4整数でこの値をとってあげ、これらを$A_1,A_2,A_3,A_4$とすると
$$A_1=(p+q+r)A_2-(pq+qr+rp)A_3+pqrA_4$$が成り立ちます(実際に展開してみてください)。式変形をしてあげると
$$p+q+r= \frac{A_1+(pq+qr+rp)A_3-pqrA_4}{A_2}$$
となり、これを$\mod n$の世界で考えてやればよくなります
ただし、$\mod n$の世界において、加算減算乗算は適当で大丈夫ですが、除算は注意してください。
実装
```py
from typing import Tuple, Iterator, Iterable, Optional
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Util.number import inverse, long_to_bytes, bytes_to_long, getPrime
import sys

sys.setrecursionlimit(10000)
from number import n, A1, A2, A3, A4, c, s, e


def extGCD(a: int, b: int) -> Tuple[int, int, int]:
    if b != 0:
        d, y, x = extGCD(b, a % b)
        y -= (a // b) * x
        return d, x, y
    return a, 1, 0


def gcd(a: int, b: int) -> int:
    while b != 0:
        t = a % b
        a, b = b, t
    return a


def modinv(a: int, m: int) -> int:
    if gcd(a, m) != 1:
        return 0
    if a < 0:
        a %= m
    return extGCD(a, m)[1] % m


def main():
    while True:
        k = n
        # A1 = (pow(p, k+3, n) + pow(q, k+3, n) + pow(r, k+3, n)) % n
        # A2 = (pow(p, k+2, n) + pow(q, k +2, n) + pow(r, k +2, n)) % n
        # A3 = (pow(p, k+1, n) + pow(q, k +1, n) + pow(r, k+1, n)) % n
        # A4 = (pow(p, k, n) + pow(q, k, n) + pow(r, k, n)) % n
        X = (A1 + s * A3 - n * A4) % n
        Y = (modinv(A2, n) * X) % n
        phi = (n + Y - s - 1) % n
        d = modinv(e, phi)
        m = pow(c, d, n)
        print(long_to_bytes(m))
        break


if __name__ == "__main__":
    main()
```
```flag
ctf4b{E4sy_s7mmetr1c_polyn0mial}
```
HTMLの基本的なコマンド集

# 1.はじめに
HTML（HyperText Markup Language）はウェブページの構造とコンテンツを表現するためのマークアップ言語です。この記事では、HTMLでよく使用される基本的なコマンド（タグ）について説明します。

# 2.各コマンドについて
### (1) htmlタグ:
　htmlタグはHTMLドキュメントのルート要素です。すべてのHTMLコンテンツはこのタグの間に配置されます。
```:html
<html>
  <!-- HTMLコンテンツ -->
</html>
```

### (2) headタグ:
　headタグはドキュメントのヘッダー情報を定義します。titleタグはウェブページのタイトルを指定し、meta charset="UTF-8"は文字エンコーディングをUTF-8に設定します。
```:html
<head>
  <title>ウェブページのタイトル</title>
  <meta charset="UTF-8">
  <!-- その他のヘッダー情報 -->
</head>
```

### (3) bodyタグ:
　bodyタグはドキュメントの本文を定義します。ここに実際のコンテンツを配置します。h1からh6タグは見出しを表し、pタグは段落を表します。imgタグは画像を表示し、aタグはリンクを作成します。
```:html
<body>
  <h1>見出し1</h1>
  <p>段落のテキスト。</p>
  <img src="image.jpg" alt="画像の説明">
  <a href="https://example.com">リンクのテキスト</a>
</body>
```

### (4) h1〜h6タグ
　h1からh6タグは見出しを表します。h1が最も大きな見出しであり、h6が最も小さい見出しです。
```:html
<h1>これはh1見出しです</h1>
<h2>これはh2見出しです</h2>
```

### (5) pタグ:
　pタグは段落を表します。ここにテキストを配置すると、ブラウザは段落として表示します。
```:html
<p>これは段落のテキストです。</p>
```

### (6) imgタグ:
　imgタグは画像を表示します。src属性には画像のファイルパスを指定し、alt属性には画像の代替テキストを指定します。
```:html
<img src="image.jpg" alt="美しい風景の画像">
```

### (7) aタグ:
　aタグはハイパーリンク（リンク）を作成します。href属性にはリンク先のURLを指定します。
```:html
<a href="https://example.com">クリックしてサイトに移動</a>
```

### (8) ulタグとliタグ:
　ulタグは順序のないリスト（箇条書き）を作成し、liタグはリストの各項目を表します。ブラウザは項目を点や丸などで表示します。
```:html
<ul>
  <li>項目1</li>
  <li>項目2</li>
  <li>項目3</li>
</ul>
```

### (9) olとliタグ:
　olタグは順序付きリスト（番号付きリスト）を作成します。liタグはリストの各項目を表します。ブラウザは項目を番号で表示します。
```:html
<ol>
  <li>項目1</li>
  <li>項目2</li>
  <li>項目3</li>
</ol>
```
### (10) tableタグ、trタグ、tdタグ:
　tableタグはテーブルを作成します。trタグはテーブルの行（行）を表し、tdタグはテーブルのセル（列）を表します。テーブルはセルにデータやコンテンツを配置して表示されます。
```:html
<table>
  <tr>
    <td>セル1</td>
    <td>セル2</td>
  </tr>
  <tr>
    <td>セル3</td>
    <td>セル4</td>
  </tr>
</table>
```

# 3.まとめ
これらの基本的なコマンドを使用することで、HTMLで基本的なウェブページの構造やコンテンツを作成することができます。また、CSSと組み合わせることで見た目やスタイルをカスタマイズすることも可能です。このコマンド集が少しでも学習の参考になると幸いです。
JavaScriptのforEachループ内でreturnを使用して詰まった

# はじめに
学習用のメモとして投稿します。
JavaScriptで練習問題を解く機会があり、その際にforEachメソッドの挙動で少し戸惑いました。
その原因と解決策について書いていきます。

# 問題の挙動
実際のものから少し変更していますが、練習問題の内容は次のようなものです。

- ユーザー名 username を引数に受け取り、権限が許可されているかどうかを判定する関数 checkPermission を実装してください。
- ユーザーの権限は、次のようなオブジェクトの配列 users に格納されています。

```JavaScript
let users = [
  {
    username: '斉藤',
    hasPermission: true
  },
  {
    username: '齋藤',
    hasPermission: false
  },
];
```
▼呼び出し例

```JavaScript
console.log(checkPermission('斉藤')) // true
console.log(checkPermission('齋藤')) // false
```

引数で与えられたユーザーが存在しない場合の処理など細かい点は置いておくとして、とりあえずforEachを使用すれば実装できるのではないかと思い、次のような実装を考えました。
```JavaScript
function checkPermission(username) {
  users.forEach(user => {
    if (user.username == username) {
      return user.hasPermission
    }
  })
}

console.log(checkPermission('斉藤'))// undefined
console.log(checkPermission('齋藤')) // undefined
```

想定では、true又はfalseが表示されるはずでしたが、実際に動かしてみると結果はどちらもundefinedでした。。

# 原因
真偽値をreturnしているのに、何故undefinedなのか、最初は理解できませんでしたが、公式ドキュメントに記載がありました。

> forEach() は配列の各要素に対して callbackFn 関数を一度ずつ実行します。map() や reduce() と異なり、返値は常に undefined であり、チェーンできません。チェーンの最後に副作用を生じさせるのが典型的な使用法です。

> メモ: 例外を発生する以外の方法で、forEach() ループを止めることはできません。ループ中に中断する必要がある場合、forEach() メソッドは適切な方法ではありません。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

ループ中に中断できないということで、forEach内でbreakやcontinueを使用するのも適切ではないようです。

https://www.deep-rain.com/programming/javascript/778

forEachは、配列の要素を取り出して、一つずつコールバックに渡しています。forEach内でreturnが使用されると、次の要素をコールバックに渡す処理に移ります。これはループ内でcontinueを使用したのと同様の挙動で、最後の要素をコールバックに渡した後、最終的にはundefindが返ってくることになります。

これを踏まえて、コードを次のように修正しました。

```JavaScript
function checkPermission(username) {
  const user = users.find(user => user.username === username)
  if (user) {
    return user.hasPermission;
  } else {
    return undefined;
  }
}

console.log(checkPermission2('斉藤'))// true
console.log(checkPermission2('齋藤')) // false
```

これで想定通り動くようになりました。
他の言語ではあまりこのような挙動は見ないように思いますが（と言いつつそこまで詳しいわけではない）、、ちょっとクセがあるなと感じました。
[Git] 動作を試す 実行例42：branchでリモートリポジトリを指すブランチ追跡ヘッダを削除

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/7c37c8da1a8f8fd5645a) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/26ba1c71d9e7f146ec06) |
|:-:|:-:|:-:|

# 実行例

```
【Git】リモート追跡ブランチと上流ブランチを理解する【fetch・merge】
https://qiita.com/djkazunoko/items/373363648d2e0b620bf8
↓
引用: 
リモート追跡ブランチの削除
指定して削除(git-branch -r)
git branch -d -r <リモート追跡ブランチ> # git branch -d -r origin/main 

-----

(※まずlocal-repo2へ切り替え)
cd /test-space/local-repo2
git log --oneline --graph --all
↓
結果: 
* e009b2d (origin/branch-R1, branch-R1) message R2
| * c69a305 (HEAD -> master, origin/master, origin/HEAD) message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

※リモートリポジトリのブランチ追跡ヘッダを削除
git branch -d -r origin/master
↓
結果: 
Deleted remote-tracking branch origin/master (was c69a305).

git log --oneline --graph --all
↓
結果: 
* e009b2d (origin/branch-R1, branch-R1) message R2
| * c69a305 (HEAD -> master) message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

※origin/masterが消える

git branch -d -r origin/branch-R1
↓
結果: 
Deleted remote-tracking branch origin/branch-R1 (was e009b2d).

git log --oneline --graph --all
↓
結果: 
* e009b2d (branch-R1) message R2
| * c69a305 (HEAD -> master) message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

(※元に戻す)
git fetch origin master
↓
結果: 
From D:/test-space/remote-repo1
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master

git log --oneline --graph --all
↓
結果: 
* e009b2d (branch-R1) message R2
| * c69a305 (HEAD -> master, origin/master, origin/HEAD) message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

git fetch origin branch-R1
↓
結果: 
From D:/test-space/remote-repo1
 * branch            branch-R1  -> FETCH_HEAD
 * [new branch]      branch-R1  -> origin/branch-R1

git log --oneline --graph --all
↓
結果: 
* e009b2d (origin/branch-R1, branch-R1) message R2
| * c69a305 (HEAD -> master, origin/master, origin/HEAD) message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1
```

# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。
【論文読み】株価変動パターンの類似性を用いた株価予測

## はじめに
こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「株価変動パターンの類似性を用いた株価予測」という論文です。  

- タイトル： 【論文読み】株価変動パターンの類似性を用いた株価予測   
- 出典： 中川 慧, et al.; 人工知能学会 2017    
- URL： https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/367.pdf


## 概要
現在の相場と似た過去の相場を参考にする予測測プロセスを定量的に再現し、予測に活用する手法の提案を行う。  


## 特徴
- 現在の株価変動が過去のどの時点の株価変動に近いかを定量的に抽出  
- 音声認識の分野等で使用されているDyancmic Time Warping(DTW)距離を使用  
- 日次の株価変動を月初の値との比で表現した月間の株価変動を使用  
- 抽出した過去の株価変動が月毎の株価予測に有効な特徴量である  


## 想定される適用例
- 月毎等の変動率のパターンによる価格や需要の予測全般  


## 参考
- [株価変動パターンの類似性を用いた株価予測](https://www.ai-gakkai.or.jp/jsai2017/webprogram/2017/pdf/367.pdf)
Aurora MySQLで大量データ取得クエリ実行時、一時領域不足エラー

# こんな事があります

Aurora MYSQL2から3へ移行したら、今までは動いていた、大きなテーブルの全件取得クエリがエラーで失敗するようになってしまった。なぜだ？？

```
2023-05-23T08:54:57.927471Z 100299 [ERROR] [MY-013132] [Server] The table '/rdsdbdata/tmp/#sql3612_187cb_0' is full! (handler.cc:4380)
```

今日中に直さないとデータ連係に支障が出てしまう...。

# これで解決！
`temptable_max_mmap`と`temptable_max_ram`の値を調整します。

| 変数名 | 意味 | デフォルト |
|:-|:-|:-:|
| temptable_max_mmap  | 一時テーブルをストレージ上に作成する最大値  | 1GiB |
| temptable_max_ram  | 一時テーブルをメモリー上に作成する最大値  | 1GiB |

## 設定例

この例では、2つの変数を併用することで22GiBまでの一時テーブルを作成することができるようになります。2GiBまでの一時テーブルであればメモリー上に作成されるため、クエリの実行速度低下を緩和できます。

###  20GiBまでの一時テーブルをストレージに作成できるようにする場合
```
temptable_max_mmap = 21474836480
```

:::note warn
インスタンスクラス毎に一時ストレージのサイズが異なるので、仕様を確認の上、設定した方が良いです。
[Amazon Aurora MySQL のパフォーマンスとスケーリングの管理 - Amazon Aurora](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.Performance.html#AuroraMySQL.Managing.TempStorage)
:::


### 2GiBまでの一時テーブルをメモリーに作成できるようにする場合
```
temptable_max_ram = 2147483648
```

:::note warn
インスタンスクラス毎にメモリーのサイズが異なるので、仕様を確認の上、設定した方が良いです。
[Amazon RDS インスタンスタイプ | AWS](https://aws.amazon.com/jp/rds/instance-types/)
:::


# そもそも原因は？
この問題は、MySQL8.0から変更になった一時テーブルの仕様と、Aurora MySQL3のリーダーインスタンスの仕様がからんで発生します。リーダーインスタンスは、共有クラスター・ボリュームに書き込みができないAurora MySQLの仕様が原因です。

Aurora MySQL3（MySQL8.0）から、TempTableストレージエンジンが一時テーブルのデフォルトになりました。TempTableは一時テーブルをメモリー上に作成しますが、サイズが設定値を超えた場合、ストレージにオーバーフローしたデータを保存します。

このオーバーフローの処理方法が、ライターインスタンスとリーダーインスタンスで異なっています。

## ライターのオーバーフロー処理
temptable_max_ramまでメモリーに保存
↓
tempable_max_mmapまでローカルストレージに保存
↓
共有クラスター・ボリュームに保存
↓
もう書き込み先がないので、エラーを返す

## リーダーのオーバーフロー処理
temptable_max_ramまでメモリーに保存
↓
tempable_max_mmapまでローカルストレージに保存
↓
もう書き込み先がないので、エラーを返す

リーダーインスタンスは、共有クラスター・ボリュームに書き込みができない仕様なので、ローカルストレージがオーバーフローした時点で冒頭のエラーが発生します。そして、temptable_max_ramとtempable_max_mmapのデフォルトは1GiBなので、容易に上限に達してしまいます。

```
2023-05-23T08:54:57.927471Z 100299 [ERROR] [MY-013132] [Server] The table '/rdsdbdata/tmp/#sql3612_187cb_0' is full! (handler.cc:4380)
```

# 環境情報
* Aurora MySQL 3.02.2（MySQL 8.0.23）

# 参考資料
* [Aurora MySQL バージョン 3 での新しい一時テーブルの動作 - Amazon Aurora](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/ams3-temptable-behavior.html) 
* [Use the TempTable storage engine on Amazon RDS for MySQL and Amazon Aurora MySQL | AWS Database Blog](https://aws.amazon.com/jp/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/)
* [MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.4.4 MySQL での内部一時テーブルの使用](https://dev.mysql.com/doc/refman/8.0/ja/internal-temporary-tables.html)
Python100問パック1周目完走！！！

「はやたす」さんのUdemy『Python演習問題100問パック』の１周目が終了した。

分からない問題は解答動画を見ながらコードを書いたりしていたけど、１００問パックやる前の状態よりは「ここ、あのメソッドのやつ使うんじゃね？」とか「forループ使うんやろ？（ﾆﾁｬｧ」って感じに思うようになってた。
ぶっ通しで１００問パックやってたから、精神と時の部屋に入っていた気分だったZE🌟

まだ１周目なので、時間を見つけて２周目３周目やっていこうと思う。

そして覚悟を決めて来週あたり挑戦しに行くゾ！！！！！！！！！！