OmniAICreator/Qiita-1.07M huggingface dataset:
SPA・SSR・SSG・ISRをちょっと詳しく。

# 調査背景
フロントエンドでよく耳にするこれらの単語について、開発された技術動向や特徴についてあまり理解していなかったので、調べてみた。

## SPA
シングルページアプリケーションの略
CSR（クライアントサーバーサイドレンダリング）と同義。
ページとしてのロードは1回で他のページも表現できる。
→ページ遷移していなくてもURLを書き換えることができ、内容を変えられる。
### SPAが開発された背景
従来のページ遷移では全てのリソースをロードする必要があったため、ユーザーを待たせることがあった。
また、新しくロードされた場合データが消えてしまう。※Local Storageに保存する必要があった。
### SPAの課題
SPAはページ遷移などを含めて動的に表示する必要があり、
``JavaScript``でHTMLをレンダリングする。
よって、``JavaScriptが使えないクローラーだと何も表示されず、SEOが弱い。``
そのため、SEOが必要ある場面はHTMLを記述し、SEOが必要ない場面でSPAを使用することが多かった。
## SSR
サーバーサイドレンダリングの略
SPAをサーバーサイドでレンダリングする技術。

### SSRが開発された背景
SPAでは、一つのフロントファイルで色々なページを表示する性質上、HTMLはほぼ空でJavaScriptによってレンダリングしている。
一方で、``SSRは、最初にロードするときだけ、先にサーバーサイドで該当ページのHTMLをレンダリングする。``その結果、``クローラーがJavaScriptを実行できなくてもHTMLを解釈できる。``最初にロードされた後はSPA同様に動く。
``各ページごとにレンダリングするからSEOに強い。``
``最初にロード以外はページロードが発生しないからSPAのように動作が早い。``
### SSRの課題
``サーバーを必要とする点``
``サーバーサイドでレンダリングしていると遅い``（APIなど多くの情報を含むと）
## SSG
スタティックサイトジェネレーションの略
静的サイトの生成
### SSGが開発された背景
SSRでは初めにサーバーの処理が必要なためユーザーを待たせていたが、
SSGでは``事前に静的ページを生成しておき、アクセスがあったときに生成したページを表示する。APIについては、静的ページを生成するビルド時に叩いておく。``これにより、サーバーでの処理がなくなるので処理が早くなる。
### SSGの課題
APIをビルド時に叩くため、更新のあるAPIについて``最新の情報を取得できない。``これに対してはページの更新があるたびに静的ページを生成し直す必要があった。
## ISR
インクリメンタルサイトリジェネレーションの略
SSG同様全てのページをビルド時に生成する。次に``各ページに有効期限を設ける。そして、アクセスがあるたびに有効期限が切れているかのチェックをする。有効期限が切れていれば、ページの再生成を行う。この際生成されたページは次のアクセス時から渡されるようになる。``

### ISRが開発された背景
SSGの問題点（``更新が多いサイトでは何度もビルドしなおす必要がある。``)を解消する。
【お手軽】サイバーエージェントの日本語特化型の大規模言語モデルOpenCALMをGoogleColaboratoryで再現

# はじめに
この記事はCyberAgentが公開した日本語特化のLLM(大規模言語モデル)、OpenCALMをとりあえず試したメモです。

# 結論
以下のコードで実行できます。

```cmd:準備
# パッケージのインストール
!pip install transformers accelerate
```

```python:用意
# パッケージのインポート
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

# モデルとトークナイザーの準備
model = AutoModelForCausalLM.from_pretrained(
  "cyberagent/open-calm-3b", 
   device_map="auto", 
   torch_dtype=torch.float16
)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-3b")
```

```python:実行方法
# プロンプトの準備
prompt = "Q:睡眠で大事なのは、量、タイミング、質のどれ？\nA:"

# 推論の実行
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
    )
    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)

```

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/857602/bdda8b3a-5131-e16f-5187-27691cc084a5.png)


# メモ

- 事前に「編集」⇒「ノートブックの設定」でGPUにする必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/857602/770ca973-3ace-93ad-92aa-92bc78b1088d.png)

- cyberagent/open-calm-7bは無料のT4タイプでは動かない。



参考
[Google Colab で OpenCALM-7B を試す](https://note.com/npaka/n/n2185b422a2f2)
Firebase Dynamic Linksが非推奨になりました（2024年の5月頃予定）

# Dynamic Linksとは
Dynamic Linksとは、Firebaseが提供するリンク作成サービスです。

UniversalLinksやディープリンクを作成するのは、これまでとても面倒な作業を要していましたが、このサービスによってかなり簡単になっていました。

https://firebase.google.com/docs/dynamic-links?hl=ja

# Dynamic Linksが非推奨になった

現在、FirebaseのダッシュボードからDynamicLinksを開くと、以下のような画面になります。どうやらDynamic Linksが非推奨になるとのこと。

![スクリーンショット 2023-05-19 10.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/40ac96e9-ee84-9999-b4d9-4d809c559d6a.png)

> Firebase Dynamic Links は新しいプロジェクトには推奨されなくなりました。将来、Dynamic Links サービスは終了しますが、発表日から少なくとも 12 か月以内に移行してください。 

2023年5月中旬に発表された案内です。つまり12ヶ月以内に移行して欲しいということは、大体2024年の5月頃にはサービス終了するのではないかと予想できます。

# これまでに作ったリンクと、新しく作るリンクは機能するのか？

> はい、新しいリンクと既存のリンクは、Dynamic Links サービスがシャットダウンされるまで引き続き機能します。

この点は問題なさそうですね。
サービス停止までの間はリンクが機能することを告げています。

# すぐ対応するべき？

> 2023 年第 2 四半期の終わり頃に、さらなる情報を発表する予定です。

どうやら2023年の第2四半期（2023年6月末頃？）に追加の発表があるらしいです。
もしかするとDynamicLinksと同じようなサービスがリリースされる可能性もあるので、まずはこの発表を待った方が良さそうですね。。

DynamicLinksをがっつり活用したプロジェクトもあると思うので、別サービスに簡単に移行できたりすると良いのですが…。
今後の発表を待ちましょう。

## まとめ
開発したアプリの一覧はこちらから！

https://lit.link/taminaryousuke

一番バズったアプリは「ガチャメーカー」です！

https://apps.apple.com/jp/app/%E3%82%AC%E3%83%81%E3%83%A3%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC-%E3%81%82%E3%81%AA%E3%81%9F%E3%81%A0%E3%81%91%E3%81%AE%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%82%AC%E3%83%81%E3%83%A3%E3%82%92%E4%BD%9C%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA/id1617490189

Twitterもやってます。
https://twitter.com/minnasinario


### 参考URL

https://firebase.google.com/support/dynamic-links-faq?hl=ja&authuser=0

https://qiita.com/kyo2bay/items/994996c2bf9ddd8d0da3
特徴量エンジンKaskadaの宣言型クエリ言語 Fenl〜イントロダクション

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語（のパラダイム）を学ぶことは、特別に楽しいことです。

ということで、まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。特に、日本語に置き換えるにあたっての用法が固まっていない分野として、自分にとって受け止めやすいのは何か？という観点からの試みとなっています。

https://kaskada.io/docs-site/kaskada/main/fenl/fenl-quick-start.html

## Fenlとは？
Fenl は、**特徴量エンジニアリングのために設計された宣言型クエリ言語**です。

Fenlでは、計算**方法**(how)を記述するではなく、計算したいもの(what)を**宣言**します。

この宣言型という特徴は、**一旦定義した式を組み合わせて再利用**できることにつながっています。

## Fenlは既存の言語とどう違うのか？

Fenlにおける計算は*temporal*です（時[間]に関係します）。

計算の結果として、時系列のヒストリカルデータに対する、時系列にバインドされた値を生成します。

Fenl はその時間計算(temporal computation)により、過去の任意の時点で式の値がどのようになっていたかを取得できます。

宣言型（What）で定義された値は、時間に沿って、いわば「タイムトラベル」できます。

タイムトラベルにより、異なる時点間の計算の結果を組み合わせることができます。

タイムトラベルによって実現される値は、時の流れに沿ってのみ移動できるようになっていることから、Fenl は未来に関する情報が過去に「漏れる」ことを防ぎます。
（筆者補足：つまり、特徴量エンジニアリングにおける典型的な問題であるターゲット漏洩を避ける設計となっている）

クエリ言語として、Fenl は特徴量エンジニアリングで使用される最も一般的な操作を簡潔に表現することに重点を置いています。Fenl は、以下の直感的な構文を提供することで、特徴量の扱いを容易にします。

 * Temporal lookups 経時的（時間経過に沿った）ルックアップ
 * Chained operations　連鎖操作
 * Named expressions　名前付き式
 * Reading & constructing structured values　構造化された値の読み取りと構築

### 「時系列」という訳語：タイムライン(timeline)とタイムシリーズ(time-series)

一般に、「時系列」という語は、time-seriesの訳語として用いられます。
Fenlドキュメントでは、タイムライン(timeline)とタイムシリーズ(time-series)という語を、異なる意味で用いています。
一般語としてのタイムライン(timeline)には、予定、年表など様々な意味がありますが、現代的な用例としては、ソーシャルメディアにおけるタイムライン（投稿やコメントなどの履歴）がイメージしやすいかと思われます。
では、タイムラインは、タイムシリーズとどう異なるか？

この対比の文脈では、タイムシリーズは、常時発生している、つまり、より現実的に表現すれば、一定間隔で発生しているデータであることが強調されます。
これに対して、タイムラインの特徴は、「イベント」という性質と関係して説明されます。上の例で言えば、タイムラインのコメントは、毎時、毎日のような一定間隔ではなく、任意の間隔で発生する、という現実に対応するものと理解できます。


##  関連情報

https://www.datarobot.com/jp/wiki/target-leakage/
UnityのVisualScriptingの変数スコープ

# 動機
UnityのVisualScriptingをさわってみてて、変数どこまでつかえるんだろう。と思ったことをメモ
特にSubGraph化（埋め込み・外部）したときの挙動がきになった

## 変数の種類

使いみちは個人の感覚です
| 種類 | スコープ | 使いみち？ |
|:-----------|:------------|:------------|
| Graph       | そのグラフの中        | あまりつかわない         |
| Flow     | 一連の処理の中      | 基本はこれを使う       |
| Object       | 付属オブジェクトがわかればどこでも    | publicなオブジェクトメンバー。基本はこれ         |
| Scene         | シーンがわかればどこでも          | 複数シーンで使うと面倒なやつ           |
| App       | アプリの中ならどこでも       | 便利だけど多用すると危険なやつ       |
| Saved    | Appで終了時に保存される     | 設定とかそんなやつ      |

この中で、Flowだけは型宣言がありません


## ネストしたらどうなる？
親グラフから埋め込みネストした先の変数
| 種類 | スコープ |
|:-----------|:------------|
|Graph|親GraphのGraph変数はみえません|
|Flow|親グラフのFlow変数みえる|
|Object|親グラフのThisObject変数は見える|
|Scene|見える（当たり前）|
|App|見える（当たり前）|
|Saved|見える（当たり前）|

当たり前ですが単独のファイルにしたGraphでは、
Flow変数は定義が保証されてない
Object変数はThisの中身が保証されてない
ので外で定義されてる前提にはできません
埋め込みと切り出しではSubGraphの意味が違うと思ったほうがよい

## C#からVisualScriptingの変数をつかう方法
まあ、対象が存在してればとり方は同じ。
（Graph変数は使うことないと思う＆GraphPointerとは・・・）

```C#
using Unity.VisualScripting;
    // アプリケーション変数
    //取得
    Scene scene = Variables.Application.Get<Scene>("AppVariable");
    // セット
    Variables.Application.Set("AppVariable",scene);
    // シーン変数
    GameObject obj = Variables.Scene(scene).Get<GameObject>("SceneVariable");
    Variables.Scene(scene).set("SceneVariable",obj);
    // こんな使い方もある
    Variables.ActiveScene().Set("SceneVariable",obj);
    // オブジェクト変数
    string str = Variables.Object(obj).Get<String>("ObjectVariable");
    Variables.Object(obj).Set("ObjectVariable",str);
    // グラフ変数 GraphPointerってどう取るんだ？？
    int i = Variables.Graph(graphPointer).Get(int)("GraphVariable");

```

ExistOnObjectとかExistInSceneとかメソッドがあるけど、OnObjectなのに、引数がObjectだけで変数名がないのでどうつかんだ状態（Sceneにも同じメソッドあるけどこちらも引数にSceneしかない）

## 雑感

まあとにかく資料が少ない。英語ですら少ない。
なんといっても名前をBOLTから変えたからVisualScriptingで検索しても出てこない。
BOLTでも仕様がかわってたりと、呼び名が変わってたりとか（SuperGraphとSubGraph）

どの変数をいつつかうのか、とか分かりづらいのか、
[こんなやり取りも](https://gamedev.stackexchange.com/questions/202950/when-should-flow-variables-be-used-in-unity-visual-scripting)

アプリケーション変数は大人数での開発（VisualScripting自身が今の所大人数に不向きだけど）では、使い方気をつける必要があるけど、ゲーム中一つあればいいインスタンス等には有用じゃないですかねぇ

実際、Graphを書いてみると、線が**ごちゃごちゃ**になって見づらいので
Sequenceつかって横に長くならないように
フロー開始時点でフロー変数にコピっておく（ワーニング対策）
グラフ変数はつかわない（今のところ劣化版フロー変数）
処理ブロックごとに埋め込みネストしとく
のが綺麗になっていいかもしれない

Unityセンセイ、これからVisualScriptingどうするんですかね・・・
デバッグしづらいですよ（笑

## おまけの備忘録

C#のクラスやメソッドをVisualScripting側で使ってて、仕様変更したときに、「どこでつかってた！？」となりがち。
（Graph同士でもよくある）

ちゃんとどこかに書いておけばいいのだけど、正直無理なんで今やってる探し方
Graphファイル自身はテキストファイルなので、VSCodeのターミナルで、Graphのおいてあるフォルダに移動し

```
Graphフォルダ% find ./ -type f | xargs grep -l "探したい関数名等" *.asset
```

これでつかってるファイル名が取れるのでそのグラフを開いて目視で探してます
Graph内の検索ほしいよ・・・
Graphは差分も取りづらいしね

## さらにおまけ（23/05/20）

GraphからC#のスタティックメソッドをよびだしたとき、挙動がおかしかった
以下、現象と解決（？）方法の備忘

１）Object変数にGameObjectのListをつくり、インスペクタで入れておく
２）Graph内で上記変数を引数にC＃のメソッドにわたす
３）C#のメソッドにわたった段階ではListの中身が空（ListはNullではない）
４）GraphでForループで回すとListの中身ははいっている

対策
C#メソッドにわたすまえにListオブジェクトの何らかのメソッドを呼ぶ（CountItemなど）

推察
Graph内でListにアクセスした段階で**初めて**Listを初期化してるんじゃないか。

これはどっかに書いてあるのかなぁ・・・
Power Automate Desktopで実行中のフローを監視する

# 結論
Power Automate Desktopの設定から実行中のフローを監視するウィンドウを表示する設定があります。

# はじめに
Power Automate Desktopはフローの実行が完了すると通知されるようになっています。
さらにフロー実行中、今何のアクションをしているかが分かると安心して自動操作の様子を見守ることができるのになと思っていたらそれらしいものを見つけたので紹介します。

# 手順
1. Power Automate Desktopを起動し、「設定」をクリックします。
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/47231216-c17c-f368-366d-be27769f82dc.png" width=75%>
2. 設定ウィンドウが表示されたら、「監視/通知」の項目を「フロー監視ウィンドウ」に変更します。
1. 「保存」をクリックします
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/9aa45754-c727-0599-0c79-b00f8516af12.png" width=25%>

1. フローを実行したときに右下に監視ウィンドウが出ていれば設定がうまく反映されています。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/b91b1a73-2f10-5a9e-17fd-fbb0b47bda0f.png)

以上です。
【AWS】異なるVPCにあるRDSに接続する

# はじめに
「VPC A」から「VPC B」内のRDSに接続したかったため、ピアリング接続設定した際の設定手順を備忘として残しておきます。

# 1.「VPC A」と「VPC B」のDNS解決、DNSホスト名を有効にする
![VPC設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/73464f6a-2e73-ad25-2e32-a1ee8f4cb640.png)
無効の場合は編集します。
![VPC設定_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/b574af54-7eb4-7e6f-e0b4-042ccde240f1.png)

# 2.ピアリング接続を作成
以下を設定します。
リクエスタに「VPC B」
アクセプタに「VPC A」
![peering設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/e16784a1-15aa-7d50-1eac-429b30ffaae1.png)

# 3.VPCピアリング画面でリクエストの承諾を行う
![peering設定_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/84a68299-4305-d6c8-7247-7c1534fd4684.png)

# 4. VPCピアリングのDNS設定でアクセプタDNS解決を有効に変更する
![peering設定_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/7c5bce39-7b47-94ba-28cc-58d78eb5d778.png)
![peering設定_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/98ed1728-89d0-07a4-367a-2708c17088dc.png)

# 5. ルートテーブル設定
「VPC A」と「VPC B」のルートテーブルに先ほど作成したピアリング接続を割り当てます。
送信先はそれぞれのVPCのIPアドレスを設定します。
ターゲットには2.で作成したピアリング接続ID（pcx-XXX・・・XXX）を設定します。
片方だけの設定だと戻りの通信が迷子になるので、両方指定する必要があります。
![ルートテーブル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/af747ee4-c82d-414b-ae61-cb723366e1bf.png)

# 6. RDSのセキュリティグループ
インバウンドルールに接続元のVPCアドレスを追加するか、EC2のプライベートIPアドレスを追加します。
![RDSセキュリティグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344923/ed1ae24b-0914-7316-6a09-04d4a5347709.png)

# 7. 接続確認
「VPC A」から「VPC B」にあるRDSに接続できるか確認します。（MySQLの場合の一例）
```
mysql -u XXX -pXXX -h xxx.xxx.xxx.rds.amazonaws.com
```

# おわりに
作成したピアリング接続を削除する際に、設定したルートテーブルの削除も行えます。
DNS解決、DNSホスト名の有効と、RDSのセキュリティグループのインバウンドルールは手動で戻す必要があります。
IBM Cloud：VPN 限定利用ユーザーのアカウント招待

# はじめに
IBM Cloudでは、Classic 環境に対してSSL-VPNでアクセスできる環境を無償提供しています。一方で、SSL-VPNのためだけにアカウントへユーザーを招待すると、ユーザー権限の管理の手間が増えてしまいます。

そこで本記事では、SSL-VPNのみを利用するユーザーに対して、VPN接続のみを許可した状態でアカウント招待する方法を記載いたします。

# ユーザー招待の前提
以下の権限を持つユーザーであれば、VPN 専用ユーザーを追加できます。
- クラシック・インフラストラクチャーの場合：アカウント上でのユーザーの管理の許可
- IAM アクセスの場合：ユーザー管理アカウント管理サービスに対する管理者またはエディターの役割


# 招待手順
本手順は以下のIBM Cloud docsに基づいています。
[IBM Cloud docs：VPN 専用ユーザーの追加](https://cloud.ibm.com/docs/account?topic=account-iamuserinv&locale=ja&interface=ui#add-vpn-only)

1. 「Manage」-> 「Access（IAM）」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/544e9dd8-1a60-a517-b2a1-08e33856b6f9.png)

2. 左の「Users」よりユーザー一覧を開き、「Add VPN-only user」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/27c0a94f-bd32-3ac3-7d49-deca30b57048.png)

3. 表示されている項目を入力します。
    - First name/Last name：ユーザー一覧に表示される名前です
    - Email：ユーザーを識別するための情報です
    - VPN user name：VPN接続時に利用するユーザー名です
    - VPN接続時に利用するパスワードです
![Screenshot 2023-05-19 at 10.22.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/468ccc5e-49e2-2d28-8307-ea9d8e8da79b.png)

4. ユーザー一覧画面にて、作成したユーザーをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/ff66dedb-8495-d31c-e7fd-8d66affc0313.png)

5. 「Enable SSL VPN Access」にチェックを入れます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/ac098ec0-0677-f40e-13bd-a25944945f64.png)

以上で接続できるようになりました！
ドメイン駆動設計とは？超絶簡単にメモ

##### ドメイン駆動設計
　・選び抜かれた知識をコード化する
　・ソフトウェアの利用者を取り巻く世界と実装を結びつけることを目的としている

##### ドメインとは
- 「領域」という意味
- ドメインに含まれるものは
  - 開発対象のシステムによって異なる
　　　（会計であれば`金銭`や`帳票`
　　　　物流システムであれば`倉庫` `貨物` `輸送手段`など）

##### 知識に焦点を当てる
- ユーザーが直面している問題を解決する
    - ドメインと向き合う
      
ドメインの概念や事象を理解し、その中から問題快活に役立つものを抽出して得られた知識をソフトウェアに反映する
これがドメイン駆動設計の神髄と言える

##### ドメインモデル
モデルとは？
 - 現実の事象あるいは概念を抽象化した概念
 - 必要に応じて取捨選択
     - 何を対象にするかはドメインによる
     - 取捨選択を行うことを **抽象化** と言い、その結果として得られる結果が **モデル**となる
   
ドメイン駆動設計では、ドメインの概念をモデリングして得られたモデルを **ドメインモデル**と呼ぶ

ドメインの概念をモデリングして得られたモデルを **ドメインモデル**という


##### ドメインオブジェクト
- ドメインモデルをソフトウェアで動作するモジュールとして表現したもの
- 利用者の問題の解決にかかわるものであるべきもの

##### ドメイン、ドメインモデル、ドメインオブジェクトの関係性
- ドメインで起こった変化はドメインモデルに伝えられる
    - 　会計システムにQR決済が追加されたらQR決済にまつわる概念をドメインモデルに追加される
- 　ドメインの変化はドメインモデルを経由して連鎖的にドメインオブジェクトに伝えられる
- 　反対にドメインオブジェクトがドメインに対して挙動を変化させることもある
    - 　QR決済に関する処理が追加されたとしてその結果にQR決済の処理結果を追加するようになるため
    - 　その処理結果をドメイン側が期待してたら正常な結果になるしそうでなければ異常な結果となってしまう
- 　ドメインの概念とドメインオブジェクトはドメインモデルを経由してつながり、お互いに影響しあうイテレーティブ（反復的な）開発が実現される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/d925037b-5d01-8ff6-43b4-afc2dfcf3b9e.png)

以上でドメイン駆動開発に関する簡単なメモでした

##### 参考文献
https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X
【Road to Cassandra Day】Cassandra リアクティブ スタイル プログラミング~高度なトピック②クエリ結果のキャッシュ

# はじめに

## Cassandra Day Tokyo

今年、2023年６月１日に、[Cassandra Day](https://www.datastax.com/events/cassandra-day-japan)が日本でも開催されます。
Cassandra Dayは、昨年、ベルリン、ロンドン、アムステルダム、ハノイ、ジャカルタ、ヒューストン、サンタクララ、シアトル、シンガポールでも開催されました。

今回の東京での開催に向けて、Apache Cassandraに関する記事を発表していきます。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/6a879803-d135-348b-f815-08be011607fa.png)](https://www.datastax.com/events/cassandra-day-japan)

## Apache Cassandraについて

Apache Cassandraとは、一言でいうなら、オープンソースの分散データベース管理システムです。

他の分散データベース管理システム同様、複数の汎用サーバーを用いて、ひとつのデータベースを構築します（開発などの目的のため、一つのサーバーのみで構成することも可能です）。

ここでは、詳しい説明は割愛し、興味のある方へのご紹介の役割は、公式サイトやWikipediaに譲ります。

https://cassandra.apache.org/_/index.html

https://en.wikipedia.org/wiki/Apache_Cassandra

# Cassandra リアクティブ スタイル プログラミング

本稿の内容は、以下のドキュメントを元にしています。

https://docs.datastax.com/en/developer/java-driver/4.15/manual/core/reactive/#advanced-topics


Cassandra リアクティブ スタイル プログラミングの紹介と基本的な使い方については、本稿執筆者による以下の記事を参照ください。

https://qiita.com/yoshiyuki_kono/items/c66763c389e88578ca18

## 高度なトピック
### クエリ結果のキャッシュ

`ReactiveResultSet`をサブスクライブすることは一度のみ可能です。これは意図的な設計上の決定です。そうしないと、ユーザーが同じクエリに 2 回目をサブスクライブするときに、利用者の意図とは異なり、同じクエリの、１回目のサブスクライブとは異なる実行が再びトリガーされる可能性があるからです。

テーブル列のすべての値の平均と合計の両方を計算したいとします。最も素朴なアプローチは、2 つのフローを作成し、両方にサブスクライブすることです。

２回クエリすることを避けようという意図による、以下のコードは正常に動きません。

```java
// DON'T DO THIS
ReactiveResultSet rs = session.executeReactive("SELECT n FROM ...");
double avg = Flux.from(rs)
    .map(row -> row.getLong(0))
    .reduce(0d, (a, b) -> (a + b / 2.0))
    .block();
// will fail with IllegalStateException
long sum = Flux.from(rs)
    .map(row -> row.getLong(0))
    .reduce(0L, (a, b) -> a + b)
    .block();
```

上記の 2 番目の `Flux` は、`rs` がすでにサブスクライブされているため、`IllegalStateException` をカプセル化する `onError` シグナルで即座に終了します。

テーブルを 2 回クエリすることを回避しながら、この制限を回避するための最も簡単な方法は、ほとんどのリアクティブ ライブラリが提供する`cache`を使用することです。

```java
Flux<Long> rs = Flux.from(session.executeReactive("SELECT n FROM ..."))
    .map(row -> row.getLong(0))
    .cache();
double avg = rs
    .reduce(0d, (a, b) -> (a + b / 2.0))
    .block();
long sum = rs
    .reduce(0L, (a, b) -> a + b)
    .block();
```


上記のコードは問題なく動作します。

オペレータ`cache`は`ReactiveResultSet`を一度のみサブスクライブし、結果をキャッシュして、キャッシュされた結果をダウンストリーム サブスクライバに提供します。

ただし、これは、結果セットが小さく、メモリに収まる場合にのみ可能です。

キャッシュの戦略が採用できない場合、ほとんどのリアクティブ ライブラリは、アップストリーム サブスクリプションを多くのサブスクライバーにオンザフライでマルチキャストするオペレーターも提供します。

上記の例は、次のように別のアプローチで書き直すことができます。

```java
Flux<Long> rs = Flux.from(session.executeReactive("SELECT n FROM ..."))
    .map(row -> row.getLong(0))
    .publish()       // multicast upstream to all downstream subscribers
    .autoConnect(2); // wait until two subscribers subscribe
long sum = rs
    .reduce(0L, (a, b) -> a + b)
    .block();
double avg = rs
    .reduce(0d, (a, b) -> (a + b / 2.0))
    .block();
```

上記の例では、`publish`オペレーターはすべての`onNext`シグナルをすべてのサブスクライバーにマルチキャストします。`autoConnect(2)`オペレーターは、アップストリーム ソースにサブスクライブする (そして実際のクエリ実行をトリガーする) 前に、2 つのサブスクリプションを取得するまで待機するように`publish`に指示します。

このアプローチは、結果をメモリにキャッシュする必要がないため、大規模な結果セットに適しています。
AccessのVBAで文字列の全角or半角変換

# 全角に変換

```vb
StrConv("文字列", vbWide)
```

# 半角に変換


```vb
StrConv("文字列", vbNarrow)
```

# 全角変換の動作確認用

* この文字ってちゃんと全角変換される？
* 全角変換されたらどんな文字になる？

を確認したい時用。

```vb:
Dim dic_ As New Scripting.Dictionary
dic_.Add "'", Null
dic_.Add "?", Null
dic_.Add "*", Null
dic_.Add "#", Null
dic_.Add "\", Null
dic_.Add ",", Null
dic_.Add "%", Null
dic_.Add """", Null
dic_.Add "&", Null
dic_.Add "=", Null
dic_.Add "{", Null
dic_.Add "}", Null
dic_.Add "(", Null
dic_.Add ")", Null
dic_.Add "[", Null
dic_.Add "]", Null
dic_.Add ";", Null
dic_.Add "~", Null
dic_.Add "|", Null
dic_.Add "$", Null
dic_.Add "!", Null
dic_.Add "<", Null
dic_.Add ">", Null
dic_.Add "/", Null
dic_.Add "-", Null
dic_.Add "ー", Null
dic_.Add "一", Null

Dim key_ As Variant
For Each key_ In dic_
    Debug.Print key_ '変換前。
    Debug.Print StrConv(key_, vbWide) '変換後。
    Debug.Print ""
Next
```

# 半角変換の動作確認用

* この文字ってちゃんと半角変換される？
* 半角変換されたらどんな文字になる？

を確認したい時用。

```vb
Dim dic_ As New Scripting.Dictionary
dic_.Add "＇", Null
dic_.Add "？", Null
dic_.Add "＊", Null
dic_.Add "＃", Null
dic_.Add "￥", Null
dic_.Add "，", Null
dic_.Add "％", Null
dic_.Add "＂", Null
dic_.Add "＆", Null
dic_.Add "＝", Null
dic_.Add "｛", Null
dic_.Add "｝", Null
dic_.Add "（", Null
dic_.Add "）", Null
dic_.Add "［", Null
dic_.Add "］", Null
dic_.Add "；", Null
dic_.Add "～", Null
dic_.Add "｜", Null
dic_.Add "＄", Null
dic_.Add "！", Null
dic_.Add "＜", Null
dic_.Add "＞", Null
dic_.Add "／", Null
dic_.Add "－", Null
dic_.Add "ー", Null
dic_.Add "一", Null

Dim key_ As Variant
For Each key_ In dic_
    Debug.Print key_ '変換前。
    Debug.Print StrConv(key_, vbNarrow) '変換後。
    Debug.Print ""
Next
```

# 参考サイトさん

http://officetanaka.net/excel/vba/function/strconv.htm

https://togetter.com/kiji/2015/05/21/23731

# バージョン

Windows 10 Pro 22H2 19045.2965
Microsoft Access for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
スリープを挟みながらaxiosを連続で呼び出す

# 初めに

フロントエンドを行っていると、時々以下のようなAPIに出会うことがある

1. 全従業員の従業員番号を取得する用のWebAPIをコールする
2. 従業員の詳細データを取得するWebAPIを従業員番号を引数にコールする

このとき詳細データを取得する間隔をサーバー側が規制している場合に、どうやってJavascriptで実装するかを備忘録として書いておく。

eslintの設定によってはloop内でawaitが使えない場合があるのでその時に使える書き方。
ただしeslintが緩いならloop内awaitのほうがスッキリする。

# 結論

以下の実装でスリープを挟みながらaxiosをコールできる。


```
    const result = await axios.get('/employees').then((res1) => {
        const employeeIds = res1.data;
        const sleepInterval = 50; // ms単位
        const sleepTimes = [...Array(employeeIds.length).keys()].map((_, i) => i * sleepInterval);
        return Promise.allSettled(sleepTimes
            .map((sleepTime, i) => new Promise(s => setTimeout(s, sleepTime))
                .then(() => axios.get('/employ_detail', {id: employeeIds[i]))));
    });
```

以上です。
Firestoreの複合インデックスをいい感じで使う！

# はじめに

Firestoreのすばらしさと同時に難しさを感じるのがインデックスの部分です。
作成に時間がかかるし、何を作ればいいかよくわからなくなる複合インデックスが理解が進むとFirestoreがより扱えるようになると思ったのでまとめてみます。


# 大前提

Firestoreはある程度複雑な検索条件も扱えるようになっていますが、すべての検索がインデックスを必要とします。
ん？と思われた方もいらっしゃると思いますが、確かに単純に検索条件を使うだけだとインデックスの作成を必要としません。
実は、複合インデックスはそれぞれのユースケースによって変わってくるので自分で作る必要がありますが、単一フィールド インデックスはデフォルトでは自動で付加されるようになっています。
そのおかげで気にせず我々はクエリーを作れるようになっています。

ただ、単一フィールド インデックスも状況によってはマイナス面も発揮するので、設定で除外することができるようになっています。
そしてその除外した方がいいケースは以下の通りです。

https://firebase.google.com/docs/firestore/query-data/index-overview?hl=ja#indexing_best_practices


# 通常の使い方

複合インデックスは、`orderBy`もしくは不等号の`where`と他の`where`を組み合わせたとき必要になります。

例えば以下のようなケースです。

```js
// 不等号を使ったケース
query(
  collection(getFirestore(), 'messages'),
  where('isPublic', '==', true),
  where('createdAt', '>', new Date(2023, 4, 19))
)

// orderByを使ったケース
query(
  collection(getFirestore(), 'messages'),
  where('isPublic', '==', true),
  orderBy('createdAt')
)
```

この場合はそれぞれ同じ複合インデックスを必要とします。
以下がその複合インデックスになります。

|フィールド|オーダー|
|-|-|
|isPublic|昇順|
|createdAt|昇順|

これを毎回頭で考えながら作っていくのはなかなか脳に負荷がかかる作業ですが、Firestoreはその負荷軽減のために例外を出して、インデックスの作成を依頼するURLを表示してくれます。

基本的にはこの例外を使って作っていくのが間違いがないので安心です。

実運用で使っている環境で例外を出すのは問題なので、例外を出していい環境で作成してから以下のコマンドでファイルに書き出して、デプロイコマンドで適応するのがいいと思います。

```sh
# インデックス情報を書き出し
firebase firestore:indexes > firestore.indexes.json

# インデックスを対象の環境へデプロイ
firebase deploy --only firestore:indexes -P 自分の環境
```

これでほとんどのケースはいいと思っています。
というか私も長い間、この方法しかやってきていませんでした。

# さきほどのケースだと勿体無いケース

自動で必要なインデックスの作成を指示してくれるのはうれしいのですが、その方法だと勿体無いケースが存在します。

例えば、通常は`isPublic`だけで検索するが、`userId`でも絞り込みをしたいときもあるケースなどがこれに当たります。
'isPublic`だけで検索するときは、さきほど記載した通りです。

その上で以下のクエリーを実行してみます。

```js
query(
  collection(getFirestore(), 'messages'),
  where('isPublic', '==', true),
  where('userId', '==', 'user1'),
  orderBy('createdAt')
)
```

すると、さきほどの作成した複合インデックスだと`userId`分キーが少ないのでURLでは以下の複合キーの作成を求められます。

|フィールド|オーダー|
|-|-|
|isPublic|昇順|
|userId|昇順|
|createdAt|昇順|

想定通りの結果だと思います。
実は、これ以外にも今回のクエリーを実行できる複合インデックスがあります。
それが以下の複合インデックスになります。

|フィールド|オーダー|
|-|-|
|userId|昇順|
|createdAt|昇順|

自分でGUI(indexファイルに書けばそれでもいけます)で設定する必要がありますが、これでもOKです！
さらにもちろん以下のクエリーでもインデックスを追加する必要がなくなるのでちょっとお得な感じです。

```js
query(
  collection(getFirestore(), 'messages'),
  where('userId', '==', 'user1'),
  orderBy('createdAt')
)
```

この動きを考えると`orderBy`や不等号があり、２個以上の追加条件があるクエリーに関しては分割して行った方が得な気がします！

といっても、ここで書いたユースケースのようにクエリーが状況によって変わるときに有効であって、全然変わらないのに複数の複合インデックスに分けるのは流石に無駄ですし、自分でインデックスを考えるのは間違えるリスクもあるので、やめた方がいいでしょう。

公式ページにも載っている方法です。

https://firebase.google.com/docs/firestore/query-data/index-overview?hl=ja#queries_supported_by_collection_group_indexes

結果として追加するインデックスの数が少なくなるようにするのがベストプラクティスだと思います。

# 終わりに

管理するインデックス数が減るのはインデックスの制限を超えないようにする効果もありますし、追加変更のパフォーマンスも向上するので、少し複雑なクエリーを実装するときは、立ち止まって自分で複合インデックスを追加することを考えてみるといいと思います。

あと余談ですが、RDBを使ったことある人だと違和感ある仕様ですよね。
RDBだと複合インデックスって大が小を兼ねるという感じで、A,B,Cの並びの複合インデックスがあれば、Aのインデックスを使った検索、A,Bを使った検索まで早くなるので大きめに作るということも考えるのですが、Firestoreの場合は分割していく方が汎用性あるんですよね。B-treeの概要は把握しているのでRDBの挙動は把握できるのですが、Firestoreの場合どうなっているんでしょ？理解できたらまた追記しようと思います。

こんな感じの始めた当初は考えもしなかったけど、知ってると便利なFirebaseのトピックをまとめて本にしたので、よかったら技術書典でみてみてください。

https://techbookfest.org/product/sbQRpfiiHdwDJcvfSTNUSr
RailsプロジェクトにPrettierを導入してみた

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [インストールと使い方](#Chapter1)
1. [rubocopと合わせて使う](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# インストールと使い方
gem もしくは npm でインストールできるらしいですが
今回は `gem` でインストールすることにしました。
```Ruby:Gemfile
group :development do
  gem 'prettier'
end
```
`bundle install`でインストール完了

以下コマンドで実行
```Ruby
# フォーマット結果の確認
bundle exec rbprettier --check '**/*.rb'

# フォーマットして上書き保存する
bundle exec rbprettier --write '**/*.rb'
```

<a id="#Chapter2"></a>
# rubocopと合わせて使う
```yaml:.rubocop.yml
# RubocopとPrettierが競合しないための記述
inherit_gem:
  prettier: rubocop.yml
```

<a id="#reference"></a>
# 参考文献
- [prettier/plugin-ruby](https://github.com/prettier/plugin-ruby)

# QA
### Q1. ESLintとどう違うの？
### A2.
ESlint -> 解析のみ
Prettier -> フォーマットまでやってくれる
[参考記事](https://developers-book.com/2021/05/19/628/)

### Q2. rubocopの自動整形とどう違うか
### A2. 
rubyだけに閉じたPJであればrubocopのほうがprettierの定義ファイルは不要。
複数言語を扱うPJの場合にPrettierでフォーマッタを統一することも出来るのがメリット。
JavaScriptの.mapメソッドとReactでのレンダリング

## 配列の `.map` メソッドについて

`.map` メソッドは配列の全ての要素に対して指定した関数を実行し、その結果から新しい配列を作成します。このメソッドの基本的な構文は以下のようになります：

```javascript
let newArray = oldArray.map(function(item) {
    // ここで何かしらの処理を行う
    return newValue;
});
```

ここで、`oldArray` は元の配列、`newArray` は新しく生成された配列を指します。関数内で item は現在処理している配列の要素を示します。そして、`newValue` は新しい配列に追加される値です。

具体的な例を見てみましょう。次の配列があるとします：

```javascript
let numbers = [1, 2, 3, 4, 5];
```

この配列の各要素を2倍にしたいと思います。これを `.map` メソッドを使って行うと以下のようになります：

```javascript
let doubled = numbers.map(function(item) {
    return item * 2;
});

console.log(doubled); // [2, 4, 6, 8, 10]
```

このように、`.map` メソッドを使用すると、元の配列の各要素に対して一定の操作を行い、その結果を新しい配列に格納することが簡単にできます。このメソッドは非破壊的であるため、元の配列を変更せずに新しい配列を作成します。

`.map` メソッドはJavaScriptの中でも非常に強力なツールの一つです。このメソッドを使えば、配列の各要素に対する処理を簡潔で読みやすいコードで実装することができます。是非、あなたのコードでもこのメソッドを活用してみてください。

## Reactでの `.map` メソッドの利用

上述したように、JavaScriptの `.map` メソッドは配列の各要素に関数を適用し、その結果から新しい配列を生成します。この機能は、Reactでのコンポーネントレンダリングにも非常に役立ちます。なぜなら、配列のデータを基に複数の同様なコンポーネントを生成したい場合がよくあるからです。ここでは、Reactで `.map` メソッドをどのように利用するかについて説明します。

まず、データの配列があるとします。例えば次のような配列です：

```javascript
let names = ['太郎', '花子', '次郎'];
```

そして、私たちはこの各名前をリストアイテムとしてレンダリングしたいと思います。これを `.map` メソッドを使って行うには以下のようにします：

```react
function NameList() {
  let names = ['太郎', '花子', '次郎'];

  return (
    <ul>
      {names.map((name, index) =>
        <li key={index}>{name}</li>
      )}
    </ul>
  );
}
```

このコードでは、`.map` メソッドを使用して `names` 配列の各要素に対して `<li>` タグを生成しています。また、key プロパティに index を設定することで、Reactが各要素を追跡し、効率的に再レンダリングできるようにしています。

なお、この `key` プロパティは、配列の要素が追加、削除、変更されたときにReactが効率的に再レンダリングを行うために重要です。一意で予測可能な値を key に設定することが推奨されています。`index` を使用することも可能ですが、要素の順序が変更される可能性がある場合は、一意のIDを使用する方が好ましいとされています。

以上のように、ReactではJavaScriptの `.map` メソッドを使用して、配列のデータを基に複数のコンポーネントを効率的にレンダリングすることができます。これにより、データ量が多く、動的なウェブアプリケーションを構築する際の柔軟性と効率性が向上します。


## 自分で試そう：挑戦編

これまでに学んだことを確認するため、以下の挑戦を試してみてください。これらの挑戦は、`.map` メソッドの理解を深め、Reactでの使用法に慣れるのに役立ちます。

### 挑戦1: 数値配列の操作
以下の数値配列があるとします：

```javascript
let numbers = [10, 20, 30, 40, 50];
```

`.map` メソッドを使用して、各数値を半分にした新しい配列を作成してみてください。

[解答](https://gist.github.com/mcaubrey/330afb9d634e06456c4da8005ee7734a)

### 挑戦2: オブジェクト配列の操作

次に、オブジェクトの配列があります：

```javascript
let students = [
  {name: '太郎', age: 15},
  {name: '花子', age: 14},
  {name: '次郎', age: 16},
];
```

`.map` メソッドを使用して、生徒全員の年齢が1歳増えた新しいオブジェクトの配列を作成してみてください。

[解答](https://gist.github.com/mcaubrey/b069877ca49828832c4056f8e9042c03)

### 挑戦3: Reactでのレンダリング

最後の挑戦として、Reactでの `.map` メソッドの使用法を試してみましょう。先ほどの `students` 配列を利用して、それぞれの生徒の名前と年齢を表示する `<Student>` コンポーネントをレンダリングしてみてください。例えば、以下のような形式で表示されるようにします：

```text
太郎 (15歳)
花子 (14歳)
次郎 (16歳)
```
[解答](https://gist.github.com/mcaubrey/0f1ad9fffc4c7f82456e255dce6f9c63)
DATE型とTIMESTAMP型の比較では秒数単位まで比較される

## 概略
DATE型とTIMESTAMP型のデータの比較時に、一部想定外の動きがあったため確認しました。
結論から言うとコンマ秒数まで比較対象のようで、TIMESTAMP型が0.001秒でも大きいor小さい値だと以上or以下の比較時にTRUEになりませんでした。
本記事では確認作業をまとめていきます。

なおSQLはSnowflake上で実行しております。

## やりたいこと
date_tableテーブルとtime_tableを下記の条件で比較し、結合結果を確認します。
①同じid
②日付が開始日付以上終了日付以下

## 事前準備

比較用にDATE型列を持つテーブルとTIME_STAMP型列を持つテーブルを作成します。
Snowflakeでは３種類のTIMESTAMP型がありますが、ここではTIMESTAMP_TZを指定します。
詳しくは下記の公式ドキュメントを参照してください。
Snowflake公式ドキュメント[日付と時刻のデータ型-TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ]
https://docs.snowflake.com/ja/sql-reference/data-types-datetime

```SQL

--DATE型テーブル
CREATE OR REPLACE TABLE date_table(
id varchar(1),
date_test date                   --日付列
)
;

--TIMESTAMP型テーブル
CREATE OR REPLACE TABLE time_table(
id varchar(1),
start_tz_test timestamp_tz,      --開始日付列
end_tz_test timestamp_tz         --終了日付列
)
;
```

データを投入していきます。
比較用に、TIMESTAMPテーブルのid = 'a'は日付指定のみ、 id = 'b'は時間まで指定し、start_tz_test列に0.001秒を加えます。

```SQL
insert into date_table values
('a', '2023-04-01'),
('b', '2023-04-01')
;

insert into time_table values
('a', '2023-04-01', '2023-04-30'),
('b', '2023-04-01 00:00:00.001', '2023-04-30 00:00:00.000')
;
```

## 比較確認
２つのテーブルを結合し、取得結果を確認します。
```SQL

select * from date_table as d
left outer join time_table as t
on d.id = t.id
and d.date_test >= t.start_tz_test
and d.date_test <= t.end_tz_test
;
```

--取得結果

|ID|	DATE_TEST|	ID_2|	START_TZ_TEST|	END_TZ_TEST|
|---|---:|---|---:|---:|
|a|	2023-04-01	|a	|2023-04-01 00:00:00.000 -0700	|2023-04-30 00:00:00.000 -0700|
|b|	2023-04-01	|

id = 'b'は結合ができてませんでした。
これは、比較時に日付型の値が2023年4月1日になった瞬間(='2023-04-01 00:00:00.000')のタイムスタンプ扱いとなり、開始日付列の値よりも0.001秒前となったため結合条件を満たせなくなったと考えられます。

## 対策
日付までの比較で時間以下の単位は考慮不要の場合は、TIMESTAMP型を日付に変換してあげてから比較するのが無難です。
```SQL
select * from date_table as d
left outer join time_table as t
on d.id = t.id
and d.date_test >= date(t.start_tz_test)        --date()で日付型に変換
and d.date_test <= date(t.end_tz_test)
;
```
--取得結果
|ID|	DATE_TEST|	ID_2|	START_TZ_TEST|	END_TZ_TEST|
|---|---:|---|---:|---:|
|a|	2023-04-01	|a	|2023-04-01 00:00:00.000 -0700	|2023-04-30 00:00:00.000 -0700|
|b|	2023-04-01	|b	|2023-04-01 00:00:00.001 -0700	|2023-04-30 00:00:00.000 -0700|

id ='b'も取得できました。
Xドメインで取得したドメインでEC2をSSL化した手順の備忘録

備忘録です。

# 証明書発行
１．AWS内で「ACM」を検索して、AWS Certificate Managerにたどり着きます
２．DNS認証にて、証明書を新規発行します
３．発行されたCNAME nameとvalueをメモる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/af78c02c-dd1d-a262-0b45-a59aee488014.png)

４． Xドメインの管理画面のDNSレコード設定画面にて先ほどのCNAMEレコードを入力する。ホスト名＝name、内容＝value。なお、valueの一番最後の「.」を外さないと登録できないのでご注意を。

# LBの作成
以下の記事の「ELBの作成」の章のとおりやる

https://dev.classmethod.jp/articles/for-begginer-ssl-communication-by-aws-certificate-manager/

# ドメインをLBに向ける
LBのDNSネームを、Xドメインの管理画面のDNSレコード設定画面にて入力する。ホスト名＝空、タイプ＝CNAME、内容＝DNSネーム。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/5e7815b1-7ea6-3246-9b35-3487ccd253e7.png)

# EC2のセキュリティグループの調整
LBからのアクセスだけを許可するように設定変更


おわり。
データサイエンスのための微分積分 第7回 無限小

:::note info
本記事は数学講座[2.6無限小](https://www.matongxue.com/lessons/1251/parts/830)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# 無限小の定義

数列{$a_n$}にとって、$\displaystyle\lim_{n\to\infty}a_n=0$があれば，数列{$a_n$}が$n\to\infty$のときの**無限小（Infinitesimal）** です。
同じで、関数$f(x)$にとって、$\lim f(x)=0$があれば、関数$f(x)$が$x\to x_0，x\to\infty$などの時の**無限小（Infinitesimal）** です。

例えば、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/4435ff7d-90fd-27d0-f1ee-ada1917ed69f.png)


# 極限と無限小

極限$\lim f(x)=L$が存在の充分必要な条件：
```math
f(x)=L+\alpha\iff \lim f(x)=L
```

$\alpha$が無限小、即ち、$\lim\alpha=0$です。

# 練習

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/02a25f4f-e296-11f6-cd72-269581f5b90f.png)


# 参照

https://www.ciper.me/2020/12/22/infinitesimal/
[自分用]Next.jsの繰り返し表示・リファクタリングについて

## mapを使って繰り返すメリット
mapを使うことによって、配列の中身を繰り返してくれる。
※詳しい使い方は以前作成したmapについての投稿をチェック

①見やすい
②変更箇所があったときに、一箇所の修正ですむ
③追加や削除をすぐに行える
④データと処理を分けることができる

## リファクタリング
①拡張子をjsxにまとめる。
jsxにすることでエディタがReact用にコードの補完を行ってくれる。

②srcディレクトリに「pages,components,styles」をまとめる。
pagesだけでも機能するが、srcにまとめた方がスッキリして見やすい。
**※注意点はsrcが存在する状態でのpages単独使用はできない**

③jsxファイルとcss modulesファイルをまとめる。
例えばMainというというフォルダーを作り、Main.jsxとMain.module.cssを格納する。
さらにMain.jsxをindex.jsxに変更することで、インポートに記述が少なくて済む。
※ただコードを探すときは大変。全てindexになっているから。

## 絶対パス設定
①jsconfig.jsonを作成。

②自動的に絶対パスにする方法
・「コマンド+カンマ」を押す。
・検索で「Import Module Specifier」を探す。
・none-relativeを選択する。
※上記の設定で「settings.json」に記述が追加されるが、チームで開発を行うときはしっかりgithubにあげるようにする。
Git リベースの概念を掴む

# リベースとは
以下の図のようなブランチが存在したとしよう。
![before_rebasing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691652/c9f7461b-dc80-d9c3-ae1f-f9aba5f85797.png)
このとき、**`topic`ブランチを**`master`ブランチで**リベースする**と、次のようになる。
```terminal
$ git checkout topic
$ git rebase master
```

![after_checkout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691652/01abf887-f4cc-f78e-07bc-caf1224552f0.png)
`コミット3'`は、`コミット2`と`コミット3`の変更を統合したコミットであり、`コミット2`を親コミットに持つ。

つまりリベースとは、アバウトに言えば、名前の通り**あるブランチのベース(根本)を付け替える**操作なのである。

仕上げに`master`も最新の状態にしよう。コマンドはこちら。
```terminal
$ git checkout master
$ git merge topic
```

![after_rebasing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691652/0f796f0e-7d7d-1153-1332-22a338684c74.png)

詳しく言えば、これは分岐の生じないマージ、**ファストフォワード**なマージである。

# リベースのメリット・デメリット
マージと比較した際、リベースのメリットは**履歴が簡潔**である点である。なぜなら、マージをすると親コミットを2つ持つマージコミットが作成されるが、リベースで作られるコミットは親コミットを1つしか持たない。そのため、履歴が一直線に並ぶのである。

逆にリベースのデメリットは**コンフリクトした際の解消が面倒**であることである。なぜかは複雑なので今回は省略する。

# リベースはするなって本当？
巷ではよく「リベースはするな」という言説が飛び交っている。たしかに、マージで代替できるので、わざわざリベースをする必要はないのかもしれない。ただし、本当にリベースしてはいけないのは、下記の条件をすべて満たすときである。
<ol>
<li>コンフリクトが生じないことが明らかである</li>
<li>リベースするブランチをリモートリポジトリにプッシュしていない</li>
</ol>

逆に言えば、これらの条件をクリアしていれば、履歴を完結するためにもリベースを採用した方がよい。

2番目の条件について詳しく見ていこう。すでにプッシュしたブランチをリベースするとどうなるだろうか。リベースとは、根元を付け替える、ある種の破壊的な操作である。すると、ローカルとリモートで図のように**構造の差異**が生じる。
![after_checkout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691652/225db37a-f0b2-1f25-723f-2bf002b909bf.png)
仮に、このあとリモートの方で`topic`に変更があったとしても、構造が違うので`topic`はプルできない。これが、プッシュしたブランチはリベースしてはいけない理由である。

# 最後に
今回はリベースを紹介したが、正直どちらを使うかはお好みでよい。ちなみに、プルでは暗黙的にマージを使って変更を統合しているが、リベースを使ってプルを行うこともできる。それは今回の記事では紹介しないので、気になったら調べてみてほしい。それでは。
tsv を 1行1件ずつの json にする・改

以前こんな記事書いたんですけど、
https://qiita.com/arc279/items/2515272a7050c0a13cbf

もうちょいイケてるやり方があったのでご査収ください。

## コード

```js:tsv2jsonl.jq
#!/usr/bin/env jq -n -R -f

input|split("\t") as $header
| inputs
| [$header, split("\t")]
| transpose
| map({(.[0]): .[1]})
| add
```

で、実行権限付けておく
```bash:bash
$ chmod +x tsv2jsonl.jq
```

これだけ。

## 使用例

```bash:bash
$ { seq -f 'c%g' 5; seq -f '%04g' inf; } | paste - - - - - | ./tsv2jsonl.jq -c | head -n 10
{"c1":"0001","c2":"0002","c3":"0003","c4":"0004","c5":"0005"}
{"c1":"0006","c2":"0007","c3":"0008","c4":"0009","c5":"0010"}
{"c1":"0011","c2":"0012","c3":"0013","c4":"0014","c5":"0015"}
{"c1":"0016","c2":"0017","c3":"0018","c4":"0019","c5":"0020"}
{"c1":"0021","c2":"0022","c3":"0023","c4":"0024","c5":"0025"}
{"c1":"0026","c2":"0027","c3":"0028","c4":"0029","c5":"0030"}
{"c1":"0031","c2":"0032","c3":"0033","c4":"0034","c5":"0035"}
{"c1":"0036","c2":"0037","c3":"0038","c4":"0039","c5":"0040"}
{"c1":"0041","c2":"0042","c3":"0043","c4":"0044","c5":"0045"}
{"c1":"0046","c2":"0047","c3":"0048","c4":"0049","c5":"0050"}
```

`seq -f '%04g' inf;` ってやってる通り、1行ずつ処理してくのでメモリに優しい。

## ポイント

`-n` オプションつけると標準入力から読むのをやめる（`null` が渡された扱いになる）

```bash:bash
$ jq -n .
null
```

で、 

* `input` ：標準入力から自力で1行読む（bash の read みたいな感じ）
* `inputs` ：標準入力から残りを全部読む（cat みたいな感じ）


を使って1行ずつ処理してく。っていう話。


cf. https://stedolan.github.io/jq/manual/#IO
2015年製の古いLinux PCでstable-diffusionを動かす

# 環境

|  OS  |  Linux Mint 21.1  |
| ---- |   ----|
|CPU|Xeon E3-1230V5|
|  GPU  |  NVIDIA Quadro K1200  |
|  メモリー  |  8GB  |
|hdd|1TB|
|cuda|12.1|

# 前提
nvidia製のGPUを使います。AMD製の物はROMcを使うかと思います。

# pythonの環境を作る

以下のサイトを参考にAnacondaで環境を作る。**インストールするpythonのバージョンに気をつけ、パッケージはインストールしない**。このサイト上のAUTOMATIC1111版web UIのインストールのリポジトリからダウンロードまでを完了する。

https://maywork.net/computer/ubuntu22-04-automatic1111-web-ui-install/

# cudaとpytorchなどのインストール

cudaツールキットから手順に従ってcudaをインストール。

https://developer.nvidia.com/cuda-toolkit

```
nvidia-smi
```
でcudaのバージョンなどが確認できます。![2023-05-19 02.10.15-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361032/e6be36ef-0cbe-67ac-d57a-a017606d72a0.jpeg)
↑こんな感じ

pytorchを自分のcudaのバージョンに合うようにインストール。(必要ないかもしれない。要検討)

https://pytorch.org/get-started/locally/

作成したanacondaの環境下(git cloneで作られたディレクトリ上)でターミナルを開き、
```
conda activate hoghoge(作成した環境名)
pip insatll -r requirements
```
を実行。パッケージをインストールする。

# 実行

```
./webui.sh
```
を実行すると、torch==2.0.1をインストールしようとし(すでに入っているのに)、137エラーでクラッシュ。
色々試した結果、

```
python3 launch.py
```
で動くことが分かった。

stable-diffusionは起動するがメモリ不足でフリーズするため、

```
python3 launch.py --precision full --no-half --lowvram --opt-split-attention
```
で起動するも、重いので、以下のサイトを参考にスワップメモリを増やした。

https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-20-04-ja

スワップメモリを増やすと画像生成ができた。
![IMG_20230519_014628.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361032/502e7ffc-31a7-ab43-02ff-a09ed1af7772.jpeg)

生成された画像がこちら(prompt = cat on a chair(他はデフォルトまま))
![00000-2993255729.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361032/ec3bf125-9ded-8351-7e1a-36bd5a418a24.png)

# 結果

多くのメモリが必要だということが分かったので、メモリを増設しようと思う。

# 参考サイト

古いwindowsPCでstable-diffusionを動かす方法が一通り載っています。

https://khurata.hatenablog.com/entry/2022/10/09/190129

linuxのコマンドなど参考になるかもしれません

https://pc.watch.impress.co.jp/docs/column/ubuntu/1493536.html

137エラーに関して

https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/8937

サーバーにスワップ領域を設定しようとすると、『fallocate failed: Text file busy』とエラーになる。

https://forums.ubuntulinux.jp/viewtopic.php?id=21483

---

**2023/05/26 追記 2023/06/18編集**

```RuntimeError: CUDA out of memory.```と出ていた時の対処法。
画像生成後にVRAMのリサイクルが上手くいってなかったようなので、```.zshrc```に以下を付記した。
~~バージョンアップデートしたら書き換えられて消えるかもしれないのでそこは注意。~~

```
export PYTORCH_CUDA_ALLOC_CONF="garbage_collection_threshold:0.6,max_split_size_mb:128"
```

結果:問題なく動くようになりました。

参考にしたサイト

https://www.kageori.com/2022/11/stable-diffusion-web-uiruntimeerror.html?m=1

非力なパソコンですが、時間を掛ければそれなりにいい画像も作れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361032/b1509b34-7364-918d-3330-70c563e5a80f.png)


ご意見や感想などあれば、コメントお願いします。
Rails7 on Windows をnssmでサービス化する

## Production 環境での起動

Apacheやnginxを立てるほどでもなく、pumaを用いる場合、公開用IPアドレスをバインドするため、通常起動のコマンドは以下のようになる。

```ps1
rails s -u puma -e production -b 192.168.1.1
```

`rails`コマンドで起動しているが、実体はどこにあるのか。コマンドプロンプトもしくはPowerShellで確認する。

```cmd
C:\WINDOWS\system32>where rails
C:\Users\alice\AppData\Local\Microsoft\WindowsApps\rails
C:\Users\alice\AppData\Local\Microsoft\WindowsApps\rails.bat
```
```ps1
PS C:\WINDOWS\system32> Get-Command rails|fl


Name            : rails.bat
CommandType     : Application
Definition      : C:\Users\alice\AppData\Local\Microsoft\WindowsApps\rails.bat
Extension       : .bat
Path            : C:\Users\alice\AppData\Local\Microsoft\WindowsApps\rails.bat
FileVersionInfo : File:             C:\Users\alice\AppData\Local\Microsoft\WindowsApps\rails.bat
                  InternalName:
                  OriginalFilename:
                  FileVersion:
                  FileDescription:
                  Product:
                  ProductVersion:
                  Debug:            False
                  Patched:          False
                  PreRelease:       False
                  PrivateBuild:     False
                  SpecialBuild:     False
                  Language:
```

## nssm でサービス化する

1. [nssm](https://nssm.cc/download) をダウンロードして、適当なフォルダに展開する。ここでは「nssm-2.24」を展開し、「win64」下のものを用いた。
1. nssm を展開したフォルダで、管理者のコマンドプロンプトから`nssm install <サービス名>`を実行する。ウィンドウが起動する。
1. 各項目を設定し、「Install service」を指定する。Railsのフォルダが「C:\Users\alice\source\repos\blog」の場合、以下のようになる。
   <dl>
     <dt>Application Path:</dt>
     <dd>C:\Users\alice\AppData\Local\Microsoft\WindowsApps\rails.bat</dd>
     <dt>Startup directory:</dt>
     <dd>C:\Users\alice\source\repos\blog</dd>
     <dt>Arguments:</dt>
     <dd>s -u puma -e production -b 192.168.1.1</dd>
   </dl>
1. 以降は、管理ツールの「サービス」で他のサービスと同様に扱える。
   - サービスのログイン(実行アカウント)は「ローカルシステムアカウント」になっているので、必要に応じて変更する。
   - スタートアップの種類は、「自動」となっており、Windowsの再起動時に自動で起動してくれる。
1. 登録を解除する場合は、管理者コマンドプロンプトから`nssm remove <サービス名>`を実行する。

## 参考
* [NSSM - the Non-Sucking Service Manager](https://nssm.cc/)
* [ASCII.jp：Windowsアプリをサービス化してサインイン前に起動！ (2-2)](https://ascii.jp/elem/000/000/933/933079/2/)
拡張子をどのように認識して処理しているのか

### コンピューターはファイルの拡張子を使用して、ファイルの種類を識別し、それに応じた処理を行う

- ファイル名の解析
ファイル名から拡張子を切り出す


- 拡張子のマッピング
拡張子を特定のファイル形式やファイルの種類に関連付けるために、拡張子と対応するファイルの処理方法をマッピングしている
→このマッピングは、オペレーティングシステムやアプリケーションによって管理される


- 関連アプリケーションの起動
拡張子に関連付けられたアプリケーションを起動して、ファイルを処理

EX).txtファイルはテキストエディタで開かれ、.jpgファイルは画像ビューアで開かれるようになっている

- ファイルのバイナリ解析
一部で、拡張子だけではファイルの種類を正確に判断できないことがある
その場合、コンピューターはファイルの先頭などのバイナリデータを解析して、正しいファイル形式を判断する
稼げるIT資格2023（本当？？）

# はじめに
稼げる資格の記事は有名ですが、CISSPが入っていたので「おっ！」と思い、記事にしてみました。

# Who am i ?
しがないエンジニアです。

# 本題

本当に稼げるのかわからないですが、稼いでいる人が持っていることが多い資格という意味でしょうか。
いくつか紹介されています。

https://www.spiceworks.com/tech/it-careers-skills/articles/highest-paying-certifications-2023/

```
AWS Solutions Architect Professional

Google Cloud Platform (GCP) Certified Professional Cloud Architect

Certified Information Systems Security Professional (CISSP)

Certified Information Security Manager (CISM) by Information Systems Audit and Control Association (ISACA)

PMP: Project Management Professional from Project Management Institute

```
このご時世クラウドが強いですね。CISSPも上位に入っています。ちょっと嬉しい気持ちになります。

他のサイトも見てみましょう。

https://www.indeed.com/career-advice/career-development/top-it-certifications


```
AWS Certified Solutions Architect – Associate
Certified Data Privacy Solutions Engineer (CDPSE)
Certified Cloud Security Professional (CCSP)
Certified Data Professional (CDP)
Certified Ethical Hacker (CEH)
Certified Information Security Manager (CISM)
Certified Information Systems Auditor (CISA)
Certified Information Systems Security Professional (CISSP)
Certified in Risk and Information Systems Control (CRISC)
Certified ScrumMaster (CSM)
Cisco Certified Network Professional (CCNP)
CompTIA certifications
Google Professional Cloud Architect
GIAC Security Essentials
ITIL 4 Foundation Level Certification
Project Management Professional (PMP)
VMware Certified Professional – Data Center Virtualization 2022 (VCP-DCV 2022)
```
CEH、CISSPともに入っています！
ここで言っているCEHはCEH MASTERのことを指しているんですかね？？

ITIL4も入っています！PMPも入っているんですね。

# 最後に
ランキング見ると資格取得のモチベーションになりますね。
【Flutter学習 #3】Flutterのフォルダ構成を知る

# はじめに
この記事はFlutter初心者の筆者が学習のために書いている記事です。
間違っていたら温かくご指摘いただけるとありがたいです。

# Flutterのフォルダ構成
Flutterはマルチプラットフォームで動くアプリを作れるので、フォルダ構成にも意味があります。
それぞれどんな役割なのかをみていきたいと思います。

```
.
├── android ← Android用のフォルダ
├── ios ← iOS用のフォルダ
├── lib　← 共通ソース用のフォルダ
├── linux ← Linux用のフォルダ
├── macos ← mac用のフォルダ
├── test ← テストコード用のフォルダ
├── web ← Web用のフォルダ
├── windows ← Windows用のフォルダ
├── README.md
├── analysis_options.yaml
├── flutter_app.iml
├── pubspec.lock
└── pubspec.yaml ← パッケージ管理
```

各プラットフォーム用のフォルダと、共通で使うフォルダに分かれています。
libとtestが共通で使うフォルダです。

<br>

以上をまとめると、Flutterでの開発手順は以下のようになりそうですね。
1. プラットフォーム依存しない処理を、libやtestで開発
2. プラットフォーム依存の独自処理などを各プラットフォームフォルダで開発

# 最後に
フレームワークを使っていると、「この処理をどこに作れば良いのか」ってことがたまにあるんですが、ここまで明確に区分けされていると開発者としてもありがたいですね。フレームワークが意図するところがはっきりと伝わってくる感じです。
【学習メモ】FizzBuzzを解いてリファクタリングに触れる

## はじめに
TypeScript 勉強中の👶です。
理解を深めるために日々の学びを記事にしています。
初心者の記事なので言い回しや記載に誤りがあるかも知れませんが、暖かく見守っていただけると幸いです。
<font color="gray">(よろしければ間違いをコメントいただけると学び、励みになります！)</font>

## FizzBuzz問題とは？
FizzBuzzとはプログラマがプログラムを書くことができるか調べるクイズのようなものです。
>ルール 
3で割り切れるときは「Fizz」を発言
5で割り切れるときは「Buzz」を発言
両方で割り切れるときは「FizzBuzz」を発言
該当しない場合、その数字を出力

下記のような出力が得られたら正解。
```
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz...
```
 今回は複数回に分けて、リファクタリングを行いながらFizzBuzzを解きました。

## 1回目、まずは思うままに解いてみる
敢えて、特別な書き方はしないでコードを書いてみます。
```ts
let i: number = 1;
let can_division_by3: boolean;
let can_division_by5: boolean;
let can_division_by15: boolean;
let result: string = "";

while (i <= 20) {
  if (i % 3 === 0) {
    can_division_by3 = true;
  } else {
    can_division_by3 = false;
  }
  if (i % 5 === 0) {
    can_division_by5 = true;
  } else {
    can_division_by5 = false;
  }
  if (i % 15 === 0) {
    can_division_by15 = true;
  } else {
    can_division_by15 = false;
  }

  if (can_division_by15) {
    result += " FizzBuzz";
  } else if (can_division_by3) {
    result += " Fizz";
  } else if (can_division_by5) {
    result += " Buzz";
  } else {
    result += ` ${i}`;
  }
  i++;
}
console.log(result);
```
#### ワァ。。コードめちゃ長。。(ドン引)
だいぶおめでたい感じの長さにできました。読みずらさワーストオブイヤー受賞です。

## 2回目解いてみる
改善点
- 三項演算子を使用
- 型宣言も推定できるところは省略した
```ts
let i = 1;
let can_division_by3;
let can_division_by5;
let can_division_by15;
let result = "";

while (i <= 20) {
  i % 3 === 0 ? (can_division_by3 = true) : (can_division_by3 = false);
  i % 5 === 0 ? (can_division_by5 = true) : (can_division_by5 = false);
  i % 15 === 0 ? (can_division_by15 = true) : (can_division_by15 = false);

  if (can_division_by15) {
    result += " FizzBuzz";
  } else if (can_division_by3) {
    result += " Fizz";
  } else if (can_division_by5) {
    result += " Buzz";
  } else {
    result += ` ${i}`;
  }
  i++;
}
console.log(result);
```

#### 三項演算子だけでもだいぶコード量が減って可読性がマシに。
三項演算子ってスゴイ。
でもまだまだ長いですね。

## 3回目、まだまだ短くできるよね
改善点
- 不要な変数を消す
```ts
let i = 1;
let result = "";

while (i <= 20) {
  if (i % 15 === 0) {
    result += " FizzBuzz";
  } else if (i % 3 === 0) {
    result += " Fizz";
  } else if (i % 5 === 0) {
    result += " Buzz";
  } else {
    result += ` ${i}`;
  }
  i++;
}
console.log(result);
```
#### スッキリ！
最初に比べるとスッと内容が入ってきます。

## 最後に、答え合わせ
模範解答を見て答え合わせします。
- " "をつけるif文を追加。(↑の書き方だと、先頭に" "が入ってしまうため)
- while文でなくfor文を使用。
```ts
let result = "";
for (let i = 1; i <= 20; i++) {
  if (i > 1) {
    result += " ";
  }

  if (i % 15 === 0) {
    result += "FizzBuzz";
  } else if (i % 3 === 0) {
    result += "Fizz";
  } else if (i % 5 === 0) {
    result += "Buzz";
  } else {
    result += String(i);
  }
}
console.log(result);
```

for文は繰り返す回数が分かっている場合、while文は終了条件が決まっているが明確な回数がない場合に使用することが多いようです。今回はfor文の方が適切ですね。個人的に、for文の先頭にループの条件を纏めて記載するため、より内容を把握しやすそうだと思いました。
ChatGPTで競技プログラミングの問題を生成してもらった

# はじめに
ChatGPTに自分のレベルに応じた問題を生成して貰えば効率よく競プロの勉強ができるのでは？と思ったので頼んでみた。


自分のAtcoderのレートが緑なので緑コーダー向けの問題生成を頼んでみる。

## 1問目
```
問題:
整数Nが与えられます。1からNまでの整数を順番に表示しますが、以下の条件に従って表示内容を変更します。

3で割り切れる場合は、その数の代わりに "Fizz" を表示します。
5で割り切れる場合は、その数の代わりに "Buzz" を表示します。
3と5の両方で割り切れる場合は、その数の代わりに "FizzBuzz" を表示します。
上記のいずれの条件にも該当しない場合は、その数をそのまま表示します。
```
出力例(N=15)
```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
```

回答例(Python)
```Python
def fizzbuzz(N):
    for i in range(1, N+1):
        if i % 15 == 0:
            print("FizzBuzz")
        elif i % 3 == 0:
            print("Fizz")
        elif i % 5 == 0:
            print("Buzz")
        else:
            print(i)

# 入力の受け取り
N = int(input())

# 解答の出力
fizzbuzz(N)

```

制約が出力されなかったが、問題と解答は良い感じ。
少し簡単な気がするので、もう少し難しい問題を生成するように頼んでみる。
## 2問目

```
問題:
N個の整数からなる数列Aが与えられます。数列Aの中で、連続する要素の和が最大となる部分列の和を求めてください。

制約:
1 <= N <= 10^5
-10^9 <= A[i] <= 10^9

入力:
N (数列Aの要素数)
A[1], A[2], ..., A[N] (スペース区切りの整数列)

出力:
連続する要素の和が最大となる部分列の和
```

回答例(Python)
```Python
def max_subarray_sum(N, A):
    max_sum = A[0]
    current_sum = A[0]
    
    for i in range(1, N):
        current_sum = max(A[i], current_sum + A[i])
        max_sum = max(max_sum, current_sum)
    
    return max_sum

# 入力の受け取り
N = int(input())
A = list(map(int, input().split()))

# 解答の計算と出力
answer = max_subarray_sum(N, A)
print(answer)
```

やはり問題と回答例は良い感じだが、狙ったレベルの問題を生成してもらうのは難しそう

### まとめ
問題と回答例は良い感じ
解答例を言語指定で出力してくれるのはありがたい
難易度調整には課題が残るかも
Service Quotasでリクエストしたクォータ制限の引き上げが反映されない

## Service Quotasとは
簡単に言うと・・・
- コンソールから操作できるサービスのひとつ
- AWSの各種サービスのクォータ制限の状態を確認できる
- AWSの各種サービスのクォータ制限の引き上げをリクエストできる（上限緩和）
[公式ドキュメントはこちら](https://docs.aws.amazon.com/ja_jp/servicequotas/latest/userguide/intro.html)

### クォータ制限の例
クォータ制限には以下のようなものがあります。
- リージョンごとに作成できるVPCの数：デフォルト5
- IAMロールにアタッチできるポリシーの数：デフォルト10

補足：クォータ制限はアカウントごとの固有の制限です。そのため、マルチアカウントによる環境の分離が推奨される理由のひとつでもあります。

## 発生した現象
ステータスが承認済になったことを確認してポリシーのアタッチを試みたが、引き上げリクエストが反映されない。

### 補足事項
- IAMロールにアタッチできるポリシーの数を10→20に引き上げのリクエストを実施。
- 以下の画像はサンプルです。リージョンごとのVPCの数のクォータの引き上げリクエストが承認された場合にコンソールで確認できる表示です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2293083/c6548a67-0d62-0b8c-ac13-4fcd105d7e78.png)

## 解決方法
コンソールにサインインし直す
- 過去に同じ作業を実施した際には特にサインインし直すことなく、反映されました。
- 明確な原因は不明ですが、サインインし直すことで当初のクォータ制限を超えてリソースを作成することができるようになりました。
WSL2で再起動の度にネットに繋がらなくなる問題を解決する

## 起こったこと
WSL2を久々に開いてpipコマンドを叩いたところ、ネットワークエラーが返ってきました。  
pingを叩いてみたところ、ネットワークに繋がらなくなっていました。

## 原因  
いろいろ調べたりした結果、WSL起動時に`resolve.conf`が自動で再生成され、nameserverが勝手に書き換えられていたことが原因でした。
設定をしていないと、再起動のタイミングでnameserverがデフォルトに書き換えられてしまい、ネットワークに繋がらなくなるようです。

## 対処法
### 1. 自動書き換えを阻止するように修正
`/etc/wsl.conf` をvimなどで開き、以下の通り書き換え、WSLを再起動します。
```
[network]
generateResolvConf = false
```

### 2. ネットワークにつながるようにする
`/etc/resolve.conf`を開き、以下の通り書き換えてネットワークに繋がるようにします。
```
nameserver 8.8.8.8
```
これで、毎回nameserverを書き換えなくてもネットワークにつながるようになると思います。