OmniAICreator/Qiita-1.07M huggingface dataset:
【NextJS】Uncaught RangeError: Maximum call stack size exceededの対処法

# きっかけはWebアプリ制作時。。。

> Uncaught RangeError: Maximum call stack size exceeded

またチミか。

# 原因

端的に言えば、変数やNextJSの場合はコンポーネントの入れ子構造をやりすぎるとこうなるようです。

## エラー例

修正前

```tsx
export default function Box ({children}:any) {
    return (
      <div style={{backgroundColor: "black", color: "white"}}>
        {children}
      </div>
    )
}

// ここと
const BoxInnder = ({children}:any) => {
    return (
        <Box>
            <h1>code test</h1>
            
        </Box>
    )
}

// ここで入れ子の読み込みがほぼ無限に起こっている(?)
const BoxInnderContent = ({children}:any) => {
    return (
        <BoxInnder>
            <h1>code test</h1>
            
        </BoxInnder>
    )
}
```

よい子はextendsを使いましょう。
GobotとRaspberryPiでLチカに挑戦

久々の投稿です。

GoBotをつかってLチカをやってみたので備忘録。

## 準備

* Raspberrypi3 model b+

## Gobotについて

![gobot-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1024959/59f8151d-dd46-79a7-7588-af7144c1c706.png)

Gobotは、Go言語で書かれたオープンソースのロボット/IoTフレームワークです。Gobotを使用すると、Go言語を使用して、Arduino、Raspberry Piなどのマイコン、センサーなどのデバイスを制御できます。

詳しくは、以下の公式ページから確認してください。

> Gobot - <https://gobot.io/>

Gobotは、多くのプラットフォームやデバイスに対応しており、豊富なドキュメントや例題が提供されているため、簡単に使い始めることができます。Gobotは、オープンソースのライブラリやAPIを提供しており、開発者は独自のアプリケーションやプロジェクトを簡単に作成することができます。

## RaspberrypiにGolangをインストールする

Golangの公式ドキュメントから、ラズパイ向けのあアーキテクチャを選択し、ダウンロードします。この記事を作成した時点での、Golangのバージョンは、

> 参考: [Gobotの公式ページ：Go, Robot, Go!](https://go.dev/dl/)

```bash
$ wget https://go.dev/dl/go1.20.3.linux-armv6l.tar.gz
```

インストールしたら展開する。

```bash
sudo tar -C https://go.dev/dl/go1.20.3.linux-armv6l.tar.gz
```

ダウンロードが完了したら、PATHを通します。

```bash
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
```

PATHが通っているか確認してみます。

```bash
$ go version
>> go version go1.20.3 linux/arm
```

バージョンが表示されていれば無事インストール完了です。

## サンプルプログラムを実行してみる

任意のディレクトリを作成して、プロジェクトを作成します。

```bash
mkdir sample-go-prj
cd sample-go-prj
go mod init github/<githubのユーザー名>/sample-go-prj
```

`main.go`を作成して、以下のコードを記述します。

```go
package main

import "fmt"

func main() {
    fmt.Println("Hello world")
}
```

まずは、ビルド・コンパイルしてプログラムを実行してみます。

```bash
$ go build -o main

$ ls
>>> go.mod  main  main.go

$ ./main
>>> Hello World

$ go run main.go
>>> Hello World
```

## 早速Lチカを試してみる

### Gobotをインストールする

> 参考：<https://gobot.io/>

```bash
$ go get -d -u gobot.io/x/gobot
```

### 配線図

raspberrypiとLEDの配線図は、念のため掲載しておきます。

LEDのプラス側を、7番ピン(port4)に差し込みます。抵抗1kΩの抵抗を付け、マイナス側は6番ピンに接続します。

![led_layout.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1024959/7449bbba-9208-3ac0-4ecd-14d926781616.jpeg)

### ソースコード

`main.go`を以下のように変更します。

> 参考：<https://gobot.io/documentation/platforms/raspi/>

```go
package main

import (
	"time"

	"gobot.io/x/gobot"
	"gobot.io/x/gobot/drivers/gpio"
	"gobot.io/x/gobot/platforms/raspi"
)

func main() {
	raspberry := raspi.NewAdaptor()
	led := gpio.NewLedDriver(raspberry, "7")

	work := func() {
		gobot.Every(2*time.Second, func() {
			led.Toggle()
		})
	}

	robot := gobot.NewRobot("blinkLED",
		[]gobot.Connection{raspberry},
		[]gobot.Device{led},
		work,
	)

	robot.Start()
}
```

Gobotの`Adapter`は、Golangで様々なハードウェアと通信するための方法です。ラズパイ用のAdapterを作成します。gobot.Everyで2秒ごとに、LEDを点灯させるように定義します。

### 動作

それでは、Lチカさせてみましょう。

```bash
$ go run main.go
>>>2023/04/23 17:30:22 Initializing connections...
>>>2023/04/23 17:30:22 Initializing connection RaspberryPi-7CB1B568 ...
>>>2023/04/23 17:30:22 Initializing devices...
>>>2023/04/23 17:30:22 Initializing device LED-1B094640 ...
>>>2023/04/23 17:30:22 Robot blinkLED initialized.
>>>2023/04/23 17:30:22 Starting Robot blinkLED ...
>>>2023/04/23 17:30:22 Starting connections...
>>>2023/04/23 17:30:22 Starting connection RaspberryPi-7CB1B568...
>>>2023/04/23 17:30:22 Starting devices...
>>>2023/04/23 17:30:22 Starting device LED-1B094640 on pin 7...
>>>2023/04/23 17:30:22 Starting work...
```

LEDが2秒間隔で点滅するかと思います。

## おわりに

Gobotを使って楽しいラズパイライフを送ろうと思います。
システム移行戦略「レガシーミミックパターン」＆「ストラングラーフィグパターン」とは？

# AWS Summit Tokyoが4年ぶりに現地開催！

この週末、日本で年一回のAWSの祭典「AWS Summit Tokyo」が幕張メッセにて開催されました。

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

4年ぶりの現地開催ということもあり、2日間ともものすごい数の人々が来場し、会場の熱気は大変なものでした！
![IMG_1096.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/df3f3596-9133-94cc-c16a-1a7cff326149.jpeg)


# 大人気セッション「アーキテクチャ道場！」

2日間の中でも特に人気を博していたのが、AWS　Japanのチーフテクノロジスト内海さんによる「アーキテクチャ道場2023！」。
昨年もオンライン開催にて好評を集めていたセッションで、30分という限られた時間内でAWS JapanのSAさんがお題に基づいてガチのアーキテクティングを行い、内海さんからその講評を受けるという流れを2本連続で実施する、大変濃密なコンテンツです。

![IMG_1199.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/4d4202b7-5289-e24e-1db3-729b6e678771.jpeg)

私も最前列でガチ受講していましたので、自社ブログにて詳細なレポートを投稿しております！

https://developers.kddi.com/blog/1Sawhc1UtnUQJHSbowVu1e

実はこのアーキテクチャ道場2023！内で、聞き慣れないシステム移行の戦略「レガシーミミックパターン」と「ストラングラーフィグパターン」がさらっと言及されていました。
日本語の情報が意外と少なかったため、このQiita記事ではこれらの移行戦略について調べた内容をみなさんにも紹介させていただこうと思います。


## レガシーミミックパターンとは？

ミミックと聞くと、有名なRPGに登場するニセの宝箱を思い浮かべる方は多いのではないでしょうか？
この設計戦略も実は同じ意味合いで命名されており、宝箱ではなくレガシーシステムに「擬態する（mimic）」というニュアンスです。

https://martinfowler.com/articles/patterns-legacy-displacement/legacy-mimic.html

古いシステムを少しずつ新システムへ移行していく際、特にトランザクション系のシステムにおいてデータは常に最新である必要があります。上記ブログでは旧システムの「灯を消さないように」と表現されています。

レガシーミミックパターンは有名なドメイン駆動設計（DDD）で登場する「Anti-Corruption Layer（衝突回避レイヤー）」を実現するものです。
移行過渡期のシステムからクライアント向けに機能を提供し続けるため、”隔離層”を作成することによって相手側への影響を極小化しようという思想です。

http://masuda220.jugem.jp/?eid=373

ミミックは主に「プロバイダー」と「コンシューマー」の2種類がよく見られます。

- 「プロバイダー」ミミックはイベント受信の役割をこなす。旧システム上でクライアントからのリクエストを受け付け、新システムへ連携する。これによってクライアント側はシステムが移行中であることを気にしなくてよくなる。

- 「コンシューマー」ミミックはレコード記録の役割をこなす。新システム上で処理された結果を旧システム側のデータストアにも連携する。これによって新旧システム間でのツジツマを合わせる。

![スクリーンショット 2023-04-23 20.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7622357c-6eb2-217e-438e-2c5bea1a0d49.png)

いずれのミミックも過渡的なもので、最終的には不要になります。


## ストラングラーフィグパターンとは？

ストラングラーフィグというのは熱帯植物の名前で、他の樹木に寄生するように育ち最終的に包み込んでしまうそうです。（日本でも屋久島などで見られる模様）
この移行戦略も、まさに古いシステムをすこしずつ置き換えて廃止するプロセスをとります。

https://amazonperu.exblog.jp/15158544/

具体的なアプローチとして、新旧システムの前段に「ファサード」を配置し、クライアントからのリクエストを新もしくは旧システムへルーティングできるようにします。これによって利用者は宛先変更を意識することなく、シームレスに新システムへ移行することができます。

https://learn.microsoft.com/ja-jp/azure/architecture/patterns/strangler-fig

「ファサード」とはフランス語で玄関（façade）を指します。一昔前のサービス指向アーキテクチャ（SOA）で聞いたことのある方も多いかも知れませんが、まさにシステム利用者にとっての玄関口となるレイヤーを設けるのですね。

![facade.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d5e5dbf9-7490-3bfb-7122-add4194db17b.png)

※ちなみに今回のアーキテクチャ道場2023！のお題では、「システム利用者が任意のタイミングでシステムを移行できること」という前提条件があったためストラングラーフィグは不適となり、レガシーミミックパターンが採用されていました。


# おわりに

今回の記事は私が調べた内容に基づく考察を含んでいるため、もし怪しい点やご指摘等あれば気軽にお知らせいただけると嬉しいです。

弊社メンバー @tempa3taku からも早速、世界最速の「アーキテクチャ道場2023！」受講レポが投稿されています！
今回のセッションで各SAさんの設計アプローチとして共通していた戦略部分にフォーカスし、具体例まで落とした考察記事となっていますので是非ご覧ください。

https://qiita.com/tempa3taku/items/7dca5b7676c492354623

また、前半のお題の総括で触れられた「Outboxパターン」についても以前に弊社メンバー @yoshii0110 が解説記事を書いていますので併せてご覧ください！

https://qiita.com/yoshii0110/items/cc88f3cad776ead9838c
Swift Playgroundsから端末の機能を利用できると知った件

[Reflective UI実践：現実世界が映り込むUI表現｜usagimaru｜note](https://note.com/usagimaruma/n/n0b32918b2e15)

先日Reflective UIなる興味深いトレンドを紹介している記事を見かけました。

カメラを使って写り込みや環境を反映させたり、加速度センサーを使って反射を表現したりと、インタラクションでUIを変化させるというものです。

今はフラットデザインやマテリアルデザインなどシンプルなUIが主流ですし、実際のアプリに組み込もうと思ったらカメラの許可が必要などハードルは高そうですが、面白い流れではあると思います。

<iframe width="560" height="315" src="https://www.youtube.com/embed/kzKihvt5HtY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

上記記事で紹介されている中で、とりあえずこちらをちょっと真似してみようかと思ったのですが、加速度センサーなどの利用が必要なため、端末で実行することが前提となります。

なので本来プロジェクトを作ってアプリとして制作しないといけないのですが、UI1個試すためにこれは少し大袈裟すぎる気がします。

なんとかプレイグラウンドで加速度センサーを利用できないか方法を探してみたところ、条件はつきますが、割と簡単にやれるみたいでした。

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

[Swift Playgrounds - Apple（日本）](https://www.apple.com/jp/swift/playgrounds/)

結論から言うと、iPadのSwift Playgroundsからだと実際のセンサーの値が取得できるようです。

https://gist.github.com/HonmaMasaru/9d7f2e36fb445c21e7c7a118f7a6c3c8

こちらをSwift Playgroundsで実行して、iPadをグリグリすると以下のようになります。

![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2763088/45729875-b3cd-8f0f-a16f-4a97c6be1ab3.gif)

肝となるのはこちらの一文です。

```swift
PlaygroundPage.current.needsIndefiniteExecution = true
```

このプロパティーをtrueにすると、プログラムが終了せず無期限で実行されるようになる、というものです。

Playgroundで非同期処理を行う際に意味もわからず差し込んでいましたが、今回ちゃんとした意味を知りました。

[Swift Playgroundsで非同期処理の完了を待つ方法](https://zenn.dev/yorifuji/articles/swift-playgrounds-indefinite-execution)

こちらが参考になります。

もう少し探ってみると、センサーだけでなく、カメラなどの利用もできるようです。

https://stackoverflow.com/questions/42702397/cannot-capture-video-data-on-swift-playgrounds-captureoutput-avcapturevideodata

また、Swift PlaygroundsのファイルはiCloud経由で同期できるので、Macでコードを書いてiPadで実行、というワークフローが可能です。

こちらは端末に依存した機能を試す際には積極的に利用していきたいところです。

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

上記が伝えたいことの全てではありますが、CoreMotionを利用したUIを作ってみたので公開します。

画面の傾いている向きに対して、ハイライト部分が移動するUIです。

![名称未設定2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2763088/e7ba9958-eab2-aafe-0180-8de00ea3956b.gif)

こちらをもう少し作り込めば上記YoutubeのUIにたどり着けるのではないかなという気がしています。

https://gist.github.com/HonmaMasaru/eacbfae59458534145bf79875b2fae47
Kaggleのコードを英語で読めないから,NotebookをPythonコードに変更しよう

# 他人のNotebook読みづらくないですか?

データ分析のKaggleをしていて、日々これを感じ、この鬱憤を晴らしたいという思いを込めてライブラリを作成しました。

[nparse](https://pypi.org/project/nparse/)
notebookをpythonファイルとmarkdownファイルに分解するcliツール。

本記事ではこちらのライブラリについて紹介をします。

# 1. ライブラリ作成のモチベーション

## 1.1. Kaggleで英語が大変ということ。

「Kaggle で 結果を残したい！」

私含め、このようなことを思う方はとても多いですが、皆が共通しているのは **『英語が大変!!』** と言うことです.

Kaggleには**英語で書かれた有益な公開notebookが多い**ためです.

初学者はよく公開notebookからライブラリの使い方や考え方を読み解いて得られることも多いですが、そこにハードルを感じてしまうとなかなか継続的に学習ができないと感じています。


## 1.2. 個人PCが低スペックで notebook を開けない

私は現在、低スペックのPCを用いて作業している関係でdeeplで和訳を調べながら、Kaggleの公開notebookを開いていると**ブラウザが固まったり**コードを読んでいても、**どこを読んでいたかわからなくなったり**とKaggleで結果を残す以前の障壁があるように感じました。

どこを読んでいるか記録するために、公開notebookをlocalにダウンロードして編集したり、公開notebookをkaggle上で編集したりしました。しかし、そもそも重いPCを利用している関係で、**なかなか継続的に学習することもできませんでした。**

そこで、notebookをpythonとmarkdownに分解するcliを作成しました。

# 2. 本ライブラリ[nparse](https://pypi.org/project/nparse/)の使い方


```
$ nparse [読みたいnotebookのpath].ipynb
```

これをすることで、`[読みたいnotebookのpath].py`と`[読みたいnotebookのpath].md`が自動で作成されます。


** 生成されたpythonファイルはノートブックのセルごと** に区切られているため、ここを編集することで、記録の管理がしやすくなることが期待されます。

```py
####################
#	<今のセルの数>/<全体のページ数>
# date_reading: <読んだ日>
# thought:  <感想>
# words: <覚えたい単語>
# reference: <使用ライブラリの公式ドキュメントなど>

####################

print("This is a code")

```

# 3. 本ライブラリ [nparse](https://pypi.org/project/nparse/)  の利点

`nparse`の主な利点は以下の通りです：

1. **記録がしやすい**:
    - Gitでの管理により、どの部分をいつ編集したかが明確になります。
    - 英語の意味や参照先のメモを残すための専用セクションを設けることで、学習の効率を高めることができます。

2. **編集が軽い**:
    - PythonファイルやMarkdownファイルはノートブックに比べて容量が軽く、シンプルなファイル構成のため、Gitでの編集履歴追跡が容易です。

3. **outputの出力がない**:
    - 公開ノートブックの多くはUIに重点を置いているため、コードと不必要なコンテンツが混在していることが多いです。`nparse`は、必要なコードのみを抽出し、分析に集中できる環境を提供します。

現在、`nparse`には特にオプション機能はありませんが、このツールのさらなる発展のために、フィードバックやプルリクエストを歓迎しています。

- GitHubページ: [https://github.com/makinzm/notebook-parser](https://github.com/makinzm/notebook-parser)

`nparse`を使用することで、データ分析のプロセスをよりスムーズに進めることができます。このツールが、あなたのデータ分析や学習に役立つことを願っています。

# 4. まとめ

[nparse](https://pypi.org/project/nparse/) は Kaggleの公開ノートブックやその他の大規模なデータセットの分析において、非常に便利なツールです。このCLIツールは、ノートブックをPythonファイルとMarkdownファイルに分解し、編集や記録の管理を容易にします。これにより、低スペックのPCでも効率的に作業ができ、英語の読解やライブラリの理解を深める際にも大いに役立ちます。
【読みやすいコード】リーダブルコード備忘録

# はじめに

**`新卒エンジニアが一年目で読んで良かった本`** のようなトピックで必ず挙げられる「リーダブルコード」をキャリア四年目にして今更読んだところ、これまでの開発経験で積み重なっていた点と点が線になる感覚があったので自分のための備忘録を残す。

# リーダブルコード

* ※個人的要点は太字
* ※一部ごとに所感を記録

## 理解しやすいコード

* **読みやすいコード＝理解しやすいコード**
* コードは他の人が最短時間で理解できるように書かなければいけない
* 「このコードは理解しやすいだろうか？」を自問自答する

### 所感

上長エンジニアがよく「半年後の自分に見せて必要十分な情報が含まれているかという視点で見ろ」と言ってくれるが、適切な助言だと思う。半年後の自分はもはや他人であるから。その他人を想像して、常にフレッシュな視点をもつ。誰が読んでも最短ルートで歩けるようコードを整備しなければならない。

## 【第I部】表面上の改善

### 命名

* 名前に情報を詰め込む
* **意図を明確に表現した、簡潔な命名にする**
* tmpという名前は、生存期間が短くて、一時的な保管が最も大切な変数にだけ使う
* **情報が損なわれない不要な単語は投げ捨てる（`ConvertToString()→ToString()`）**
* 何が起きるかを明確に表していて、誤解を生まない名前が最善である

### 美しさ

* 似ているコードは似ているように見せる
* 縦軸の位置を揃える
* 関連するコード（宣言など）を纏める
* コードを段落に分割する

### コメント

* 適切なコメントを書く
* **コードからすぐにわかることを書かない**
* コメントでコードを補うのではなく、コードを修正する
* ライターズブロックを乗り越える
  1. 脳内にあるコメントを全て書き出す
  2. コメントを読んで改善が必要なものを見つける
  3. 改善する
  * `// ヤバい。これはリストに重複があったら面倒なことになる。`
  * `// 注意:このコードはリストの重複を処理できません(実装が難しいため)`
* 歯切れの悪い文章を、単純に短く直接的にする
  * `これまでにクロールしたURLかどうかによって優先度を変える。`
  * `これまでにクロールしていないURLの優先度を高くする。`
* 関数の動作を正確に記述する
* コメントに含める入出力の実例を慎重に選ぶ

### 第I部の所感

リーダブルコードの根幹部分である。表面上を改善するだけでコードの可読性は一気に向上する。社内でコードレビューをする立場になって常々思うことだが、「表面上」が整えられているコードは読みやすく、つまりは理解しやすい。凄まじく冗長な命名、不揃いのインデントは「コードを読みたい」という気持ちを損なわせる。まずは見た目の美しさを洗練すること、これが読みやすいコードの第一歩である。

## 【第II部】ループとロジックの単純化

### 制御フローを読みやすくする

* 条件やループなどの制御フローはできるだけ自然にする
* **コードの読み手が立ち止まったり読み返したりしないように書く**
* 左側:調査対象の式。変化する
* 右側:比較対象の式。あまり変化しない
* if/elseブロックの並び順（衝突もある）
  * 条件は否定形よりも肯定形を使う
  * 関心を引く条件や目立つ条件を先に書く
* 行数を短くするよりも、他の人が理解するのにかかる時間を短くする
* 変更する時にはコードを新鮮な目で見る。一歩下がって全体を見る。

### 巨大な式は飲み込みやすい大きさに分割する

* ド・モルガンの法則を使う
  1. `not (a or b or c) ⇔ (not a) and (not b) and (not c)`
  2. `not (a and b and c) ⇔ (not a) or (not b) or (not c)`
* 説明変数、要約変数の導入
  * 簡潔な名前で式を説明することで、コードを文書化できる
  * コードの主要な概念を読み手が認識しやすくなる

### 変数と読みやすさ

* 変数のスコープを縮める
* if文の中だけで使う変数はif文の条件式でその変数を定義すればよい
* 変数定義は変数を使う直前でよい
* 変数は一度だけ書き込む
  * 変数を操作する場所が増えると、現在値の判断が難しくなる

### 第II部の所感

ここでもいかにコードを読みやすくするかという観点で述べられている。新人プログラマは制御フローをネストし、同じ変数を使い回す。これではコードは複雑化していくばかりだ。そういったコードは自然と書かなくなったが、最近では脳内知識を総動員して「目の前のコードをいかに簡単に書くか」という命題の解決に血眼になっていたので、これは自戒として記しておく。簡単なコード≠読みやすいコード。

> 「ロジックを簡単なコードに落とし込むことに一種の喜びを感じていた。これがコードのスピードバンプになっていた。」

## 【第III部】コードの再構成

* **無関係の下位問題を積極的に見つけて抽出する**
  1. 関数やコードブロックを見て「このコードの高レベルの目標は何か？」と自問する
  2. コードの各行に対して「高レベルの目標に直接的に効果があるのか？あるいは、無関係の下位問題を解決しているのか？」と自問する
  3. 無関係の下位問題を解決しているコードが相当量あれば、それらを抽出して別の関数にする
  * 関数を小さく独立したものにするメリット
    * 機能追加
    * 可読性の向上
    * エッジケースの処理
  * プロジェクト固有のコードから汎用コードを分離する
* **一度に1つのタスクを行う**
  * タスクをすべて列挙する
  * 別の関数に分割できるタスクを見つける
  * それ以外は、関数の論理的な「段落」
* コードに思いを込める
  * **ライブラリが何を提供してくれるかを知る**
* 短いコードを書く
  * 既存のライブラリで問題を解決できる
  * コーディングするよりもコマンドラインを使う

### 第III部の所感

小説を書いたら推敲があるように、コードを書いたら再構成する余地がある。「無関係の問題を抽出して分離する」「一度に1つのタスクを行う」は言語を問わず汎用的能力である。同時に、自分が考え得る大半のコードはライブラリに用意されている。コードを抽出し、その責務から適切な場所に分離する。時にライブラリやコマンドラインを駆使する。そのようにコードを再構成できれば、**`読みやすいコード`** はもう眼前に広がっているのではないのか。

## 解説

* 自然に読みやすいコードを書けるようになるための3つのステップ
  1. 実際にやる
  2. 当たり前にする
  3. コードで伝える
> 読みやすいコードを書いて、自分が書いたコードを忘れてしまっても問題ないようにする。読みやすいコードを書こう。忘れてもいいコードを書こう。

# 「リーダブルコード」参考記事

https://qiita.com/AKB428/items/20e81ccc8d9998b5535d

https://qiita.com/KNR109/items/3b14e2e8f89a33c0f959
ロバストPython 雑メモ

# 感想
わりと新しめの機能が多くて知識のアップデートになって良かった。

# 書籍のリンク
https://www.oreilly.co.jp/books/9784814400171/

## 1章 ロバストPython入門
コードの意図を伝えるのが大事
意図を伝えるための手法

# 第I部 型アノテーション
## 2章 Pythonデータ型入門
動的型付けと静的型付け
ダックタイピング
型システムはデータの振る舞いの雛形と制約を示す

## 3章 型アノテーション
型アノテーションは基本使うべきだが、自明なところでは使うべきではない。

## 4章 型制約
Optional,Union,Literal,Annotated,NewType,Final

## 5章 コレクション型
TypedDict,Typevar,Generic
カスタムコレクション
collections.UserDict,UserString,UserList
collections.abc.Set

## 6章 型チェッカのカスタマイズ
mypy,pyre,pyright

## 7章 実践的な型チェックの導入
ペインポイントを特定する
適用コードを絞り込む
monkeytype,pytype

# 第II部 ユーザ定義型

## 8章 列挙型
Enum,auto(),Flag,@unique
IntEnum,IntFlagはどうしても必要なら使う

## 9章 データクラス
dataclass
等価比較eq=Ture
比較order=True
イミュータブルfrozen =True
listに要素を追加などはできちゃうので注意
TypedDict,namedtupleよりは、基本的にデータクラスを使うべき

## 10章 クラス
データクラスではなくクラスを使うのは不変式があるとき

## 11章 インターフェースの定義
自然なインターフェースを目指す
テスト駆動開発
README駆動開発
ユーザビリティテスト
特殊メソッド
コンテキストマネージャで耐障害性を高める

## 12章 部分型
継承する場合はリスコフの置換原則に従う
継承を使う理由はis-a関係をモデリングすること
そうでないならコンポジションにするべき

## 13章 プロトコル
構造的部分型（オブジェクトが持っているプロパティ）のチェック
Protocol

## 14章 pydanticによる実行時型チェック
pydantic
組み込みバリデータ
カスタムバリデータ
型を厳密にしたい場合はstrictフィールドを使う

# 第III部 大規模な変更への対応

## 15章 拡張性
開放閉鎖の原則
実践しすぎると可読性が下がる

## 16章 依存関係
依存関係可視化ツール
pipdeptree,graphviz,gprof2dot,pyan3

## 17章 コンポーザビリティ
ポリシーとメカニズムを分ける
デコレータ

## 18章 イベント駆動アーキテクチャ
Pub/Subアーキテクチャ
Observerパターン
pypubsub
ストリーミングイベント
rx

## 19章 プラガブルPython
TemplateMethodパターン
Strategyパターン
プラグインアーキテクチャ
stevedore

# 第IV部 セーフティネットの構築

## 20章 静的解析
pylint,mccabe
セキュリティ解析
dodgy
bandit

## 21章 テスト戦略
テストピラミッド
AAAテスト
テーブル駆動テスト
pytest,pyhamcrest

## 22章 受け入れテスト
振る舞い駆動開発
vehave

## 23章 プロパティベーステスト
hypothesis

## 24章 ミューテーションテスト
テストのテスト
mutmut
ViewThatFitsで様々な画面サイズに応じてレイアウトを切り替える

縦横ともに、300以下には縮まらない要素があるとする
```swift
struct HogeView: View {
    var body: some View {
        minWidth300_minHeight300
    }
    
    var minWidth300_minHeight300: some View {
        RoundedRectangle(cornerRadius: 20)
            .frame(minWidth: 300, minHeight: 300)
            .padding(20)
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/94abf28a-8d79-d8f7-f31e-1bb3be0b3e53.png)

---

この要素を2つ表示したい時、VStackだと横画面にした場合に要素が見切れてしまう
```swift
struct HogeView: View {
    var body: some View {
        VStack {
            minWidth300_minHeight300
            minWidth300_minHeight300
        }
    }
    
    var minWidth300_minHeight300: some View {
        RoundedRectangle(cornerRadius: 20)
            .frame(minWidth: 300, minHeight: 300)
            .padding(20)
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/aeeddfdd-e9a8-7676-3cc7-dfee3281c881.png)

---

逆にHStackだと縦画面にした場合に要素が見切れてしまう

```swift
struct HogeView: View {
    var body: some View {
        HStack {
            minWidth300_minHeight300
            minWidth300_minHeight300
        }
    }
    
    var minWidth300_minHeight300: some View {
        RoundedRectangle(cornerRadius: 20)
            .frame(minWidth: 300, minHeight: 300)
            .padding(20)
    }
}

struct HogeView_Previews: PreviewProvider {
    static var previews: some View {
        HogeView()
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/9e8004c7-32b1-2787-5216-d27aed3af4fc.png)

---

縦画面の時はVStackで、横画面の時はHStackで表示させたい。
`ViewThatFits`で囲むと、画面にフィットする子要素を選択して表示してくれる
```swift
struct HogeView: View {
    var body: some View {
        ViewThatFits {
            VStack {
                minWidth300_minHeight300
                minWidth300_minHeight300
            }
            HStack {
                minWidth300_minHeight300
                minWidth300_minHeight300
            }
        }
    }
    
    var minWidth300_minHeight300: some View {
        RoundedRectangle(cornerRadius: 20)
            .frame(minWidth: 300, minHeight: 300)
            .padding(20)
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/7c837e9d-1f6a-7e3f-6ce5-56185059837d.png)
Goでrenameコマンドつくってみた🌱

# Goでrenameコマンドつくってみた🌱
gitbashにて自作コマンドの追加をしてみました。
初心者🌱の自分が、自分のためにメモとして書いているのでご容赦ください。

## 主に使用したパッケージ
- `os`
- `path/filepath`
- `flag`
## 今回のリポジトリ
https://github.com/takaryo1010/rename

## PATHの通し方について
`cd`コマンドみたいな感じで自分のコマンドを使ってみたかった。
まあビルドしたexeファイルにパスを通すだけだったんですけどパスの通し方について勘違いしていたので参考文献を自分のために置いておきます。

https://nikunimame.com/check-path/
## 面白かったところ
前回の記事で今回使った`os`、`filepath`以外のところを書こうと思います。
### [`flag`](https://pkg.go.dev/flag)について
```Usage.go
var option0 = flag.String("o","default","Option Description")
//引数1:オプションの名前　-o
//引数2:オプションの初期値　"default"
//引数3:オプションの説明　-hで出力される
var option1 = flag.Int("i",0,"int flag")
flag.Parse()//flagが定義し終わった後に宣言する必要がある
fmt.Println(*option0)
fmt.Println(*i)
```
すでに定義している変数にオプションの結果を代入するものもあるのでぜひ[公式ドキュメント](https://pkg.go.dev/flag)を読んでください。
<details><summary>出力結果</summary>


```
$ go run Usage.go
default
0
```
```
$ go run Usage.go -o hoge
hoge
0
```
```
$ go run Usage.go -i 1
default
1
```
</details>

### [`os.Rename()`](https://pkg.go.dev/os#Rename)について
```
func Rename(oldpath, newpath string) error
```
ということで、新しいpath名に変更できる関数です。今回はこれをディレクトリ内のファイルにかけている感じになりました。
それぞれのファイルにかける方法は、[このあたり](https://pkg.go.dev/path/filepath#Walk)を読むとわかるかも。
[前回の記事](https://qiita.com/takaryo1010/items/a37d1d9fad90ac285b7e)を読んでくれても嬉しいです。

## 感想
コマンドに引数を与えるというところでだいぶ時間を使ってしまった。
[前回](https://qiita.com/takaryo1010/items/a37d1d9fad90ac285b7e)つかったときは、`os.Args`だったが、今回は`flag.Args`を使ってみた。違いが理解できた気がする。
ファイルのリネームは便利だが、使用する場所を間違えると怖いので使ってくれる場合は慎重に使ってほしい。


## 参考文献
https://pkg.go.dev

https://nikunimame.com/check-path/
Javaのバッチプログラムに対してEclipseからリモートデバッグを設定する

JDWPを使用することで、リモートからJavaアプリケーションをデバッグすることができるようになります。

https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/introclientissues005.html

JDWPの設定を行ったアプリケーションに対して、リモートのEclipseからネットワーク越しにデバッグを実行します。また、バッチプログラムにかぎらずAPサーバ上で動作するJavaプログラムに対しても同様にデバッグできます。

### 環境
- CentOS 8(docker)
- OpenJDK 1.8.0_312-b07

### Javaプログラム側設定
Javaの実行時オプションにJDWPの設定を追加します。コマンド行を変更することができない場合、JAVA_TOOL_OPTIONS環境変数を使用することができます。

```shell
export JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=y"
```

オプションのaddressに対して接続ポートを設定します。
またリモートから接続するまでプログラムを停止させる場合は、suspend=yに設定する。APサーバ上のプログラム等、プログラム実行後に接続してもデバッグできる場合は、suspend=nでもOK。

suspend=yで実行した場合、以下のメッセージを出力して実行を停止します。
```shell
Picked up JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=y
Listening for transport dt_socket at address: 8787
```

### Eclipse側設定
プログラムを停止したいところで、ブレークポイントを設定したのち、Eclipseのデバッグ設定画面を開き、「Remote Java Application」の設定を行います。

接続プロパティで、設定先のホスト名（今回はlocalhost）とポート（今回は8787）を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/a1c65bc4-fdd3-23ce-75bb-df9316752c02.png)

### Eclipse設定後
接続プロパティ設定後、Debugボタンを押下すると、ネットワーク越しにアプリケーションと接続し、Javaアプリケーションが開始され、ブレークポイント設定箇所まで進みます。
paiza.ioでelixir その220

# 概要
paiza.ioでelixirやってみた。
genserverとagentやってみた。
だぶん、agentは、genserverで、出来てる。

# サンプルコード

```

defmodule Queue0 do
	use GenServer
	def start_link(state \\ []) do
		GenServer.start_link(__MODULE__, state, name: __MODULE__)
	end
	def queue, do: GenServer.call(__MODULE__, :queue)
	def dequeue, do: GenServer.call(__MODULE__, :dequeue)
	def enqueue(value), do: GenServer.cast(__MODULE__, {:enqueue, value})
	def init(state), do: {:ok, state}
	def handle_call(:dequeue, _from, [value | state]) do
		{:reply, value, state}
	end
	def handle_call(:dequeue, _from, []), do: {:reply, nil, []}
	def handle_call(:queue, _from, state), do: {:reply, state, state} 
	def handle_cast({:enqueue, value}, state) do
		{:noreply, state ++ [value]}
	end
end

Queue0.start_link([1, 2, 3])
|> IO.inspect
Queue0.dequeue
|> IO.inspect
Queue0.dequeue
|> IO.inspect
Queue0.queue
|> IO.inspect
Queue0.enqueue(5)
|> IO.inspect
Queue0.queue()
|> IO.inspect


defmodule Queue1 do
    use Agent
	def start_link(state \\ []) do
		Agent.start_link(fn -> 
			state 
		end, name: __MODULE__)
	end
	def enqueue(item) do
		Agent.update(__MODULE__, fn(state) -> 
			state ++ [item] 
		end)
	end
	def dequeue() do
		Agent.get_and_update(__MODULE__, fn([item | state]) -> 
			{item, state} 
		end)
	end
	def queue() do
		Agent.get(__MODULE__, & &1)
	end
end

Queue1.start_link([1, 2, 3])
|> IO.inspect
Queue1.dequeue()
|> IO.inspect
Queue1.dequeue()
|> IO.inspect
Queue1.queue()
|> IO.inspect
Queue1.enqueue(5)
|> IO.inspect
Queue1.queue()
|> IO.inspect




```
# 実行結果

```
{:ok, #PID<0.97.0>}
1
2
[3]
:ok
[3, 5]
{:ok, #PID<0.100.0>}
1
2
[3]
:ok
[3, 5]




```


# 成果物

https://paiza.io/projects/m4GkV2OrIJ9AaIxgUPKIfQ


以上。
【基本情報】アルゴリズムとプログラミング

# キュートスタック

### キュー(FIFO)

格納した順序でデータを取り出すことができるデータ構造。

### スタック(LIFO)
後に格納したデータから先に取り出すデータ構造。
処理の途中データを一時保存し、別の処理をした後で再度呼び出すデータ退避に使われる。

# データの探索

### 探索
配列などを使って目的のデータを探し出すこと。

### 線形探索法
先頭から順番に探索する方法。
平均探索回数は( N + 1 ) / 2

### 番兵法
探索したい目的のデータを配列の最後尾に追加する方法。

## 2分探索法
探索範囲を半分に限定しながら探索する方法。
データが昇順か降順に並んでいるだけ正しく探索できる。

平均比較回数はlog₂N回 (logN)
最大比較回数log₂N + 1回

## ハッシュ探索法
目的のデータの格納先のアドレスを、関数を用いて算出して探索する方法。
データを特定のアルゴリズムによって変換した値を格納アドレスとして用いる、高速でスケーラビリティの高いデータ探索技術。

### 一様分布
全ての事象が起こる確率が一定である確率分布のこと。

### シノニム
格納先のアドレスが衝突してしまうこと。

# プログラムの属性

### リエントラント(再入可能)
複数のタスクが同時に使用可能。

### リロケータブル(再配置可能)
主記憶のどこに配置しても実行可能。

### リユーサブル(再使用可能)
再ロードしなくても使用可能。

### リカーシブ(再帰的)
自分自身を呼び出す。

# プログラム言語とマークアップ言語

### インタプリント
1命令ずつ解釈しながら実行する。

### コンパイル
コンパイラを用いて、原子プログラムから目的プログラム(オブジェクトモジュール)を生成すること。

### リンク
リンカ(リンケージエディタ)を用いて、ロードモジュール(実行可能プログラム)を生成する。

### ロード
ローダを用いて、実行に先立ってロードモジュールを主記憶に配置すること。

## 開発ツール

### 統合開発環境(IDE)
アプリケーション開発のためのソフトウェア・支援ツール類をまとめたもの。

### Eclipse(エクリプス)
OSSとして提供される統合開発環境。

###　継続的インテグレーション
分担して書いたソースコードを共有の保管場所(リポジトリ)にマージするたびにビルドやテストを繰り返すこと。

### Jenkins
ビルドやテストを自動化するツール。OSSと提供されている。

### デプロイ
実行可能ファイルを実行環境にインストール、各種設定をして利用可能にすること。

## 形式言語

### BNF記法
プログラム言語の構文を定義する再帰的な記法。
「または」を使い定義。

### 正規表現
文字列の集合の規則を表す記法。
〇「GINGA」「KYOTO794」
×「2525A」

## マークアップ言語

###　SGML
電子的な文書の管理や変換を安易に行うためのマークアップ言語。
ISOの国際規格に制定されている。

### XML
ネットワークを介した情報システム間のデータ交換を安易にするためのマークアップ言語。
利用者独自のタグを定義できる。
リスト内の数字を偶数、奇数の順に並べ替えるアルゴリズム

# はじめに
リストの数字を偶数、奇数の順に並べ替えるアルゴリズムを実装しました。

# 方針
1.　偶数と奇数用の殻のリストを用意する。
2.　リストを始めから順に見ていき、２で割り切れるものは偶数のリストに追加する。それ以外は奇数のリストに追加する。
3.　偶数、奇数のリストを結合する。

# 実装
```python:even_first_odd_end.py
# 関数の引数に型を明示できるようにする。
from typing import List

# Noneを指定することで、対象のリストを上書きできるようにする。
def even_first_odd_end(numbers: List[int]) -> None:
    # 空のリストを作成する
    even_list, odd_list = [], []
    # リストの始めから見ていき、
    for num in numbers:
        # もし２で割った余りが０ならば、
        if num % 2 == 0:
            # 偶数用のリストに追加する。
            even_list.append(num)
        # それ以外の場合は、
        else:
            # 奇数用のリストに追加する。
            odd_list.append(num)
    # リスト内のすべての要素を、偶数用のリストと奇数用のリストを結合したものに置き換える。
    numbers[:] = even_list + odd_list

# テスト
if __name__ == "__main__":
    list1 = [1,2,3,4,5,6,7,8,9,10]
    even_first_odd_end(list1)
    print(list1)
```


# 参考
https://www.udemy.com/course/python-algo/
「ゼロから作る　Deep Learning」　1章　学習内容アウトプット　3日目

学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①１章　Python入門　1.5　Numpy

②・Numpyのｲﾝﾎﾟｰﾄ
　　⇒Numpyは外部ﾗｲﾌﾞﾗﾘなので、読み込むことが必要になる。
　　　import numpy as np
　　　以上のように書き込むことでｲﾝﾎﾟｰﾄできる。as npと記載することで
　　　これ以降のNumPyに関するﾒｿｯﾄﾞはnpとして参照することが可能になる。
　・Numpy配列の生成
　　⇒NumPyの配列はnp.array()メソッドで生成可能。np.array()は、Pythonのﾘｽﾄを引数に
　　　取り、NumPy用の配列を(numpy.ndarray)を作成できる。
　・NumPyの算術計算
　　⇒注意点は計算時に配列の要素数は同じにすることが大切な点。違う場合はｴﾗｰになる。
　　　配列とｽｶﾗｰ値との計算も行える。この機能は、ブロードキャストと言う。
　・NumpyのN次元配列
　　⇒Numpyは多次元の配列も作成可能。ここでもブロードキャスト機能は有効
　・1次元配列はベクトル、２次元配列は行列、３次元以上の配列をテンソル（多次元配列）という。
　・ブロードキャスト
　　⇒要素を拡大して形状のことなる配列どおしを演算できる機能。
　・要素へのｱｸｾｽ
　　要素のインデックスは通常どおり0から始まる。
　　X[0] 0行目要素
　　X[0][1] （0, 1）の要素
　　for文を使用して各要素にアクセス可能
　　X = X.flatten()でxを1次元配列に変換できる
　　x[x>15]でXから15より大きい数値をとりだすことが可能。
　　NumPyの配列にたいして不等号などの演算子を使用すると結果はブーリアンの配列になる。
　　上記はブーリアン配列を使用してTrueに対応した要素を取り出している。
　・NumPyは主な処理はCやC++で実装されている。Pythonは仲介役として存在し、パフォーマンスを
　　そこなうことなくPythonのシンタックスを使用できる。
　　※Pythonは動的言語　C,C++は静的言語（コンパイル型言語）
　　　⇒参考記事：https://qiita.com/wann/items/16920b070dc0483f152a
　　　　　　　　：https://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB.html
　　※シンタックス：プログラミング言語などの人工言語の仕様として定められた文法や表記法、
　　　構文規則などのルールを指す
　

③なし
④参考コードの模写
⑤なし
⑥なし
Ubuntu 23.04、Apache/2.4.55、php 8.1.12で、HTTP/2に対応する方法

#はじめに
まず最初に理解しておくことは、
UbuntuのApacheデフォルト設定の`"prefork" MPM (Multi-Processing Module)`は、HTTP/2をサポートしていないということです。
場所： `/etc/apache2/mods-enabled/mpm_prefork.load`

したがって、単純にHTTP/2の設定をするだけでなく"prefork" MPMモジュールも別のものに切り替える必要があります。

下記がその全手順です。

# fpm版のphpインストール
デフォルトのphpが、preforkモジュールに依存しているので、fpm版のphpに切り替えます。

```
sudo apt install php8.1-fpm
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.1-fpm
sudo a2dismod php8.1
sudo service apache2 restart
```



# preforkモジュールからeventモジュールに切り替え
preforkモジュールをeventモジュールに切り替える

```
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo service apache2 restart
sudo service php8.1-fpm restart
```

# HTTP/2の設定
`/etc/apache2/apache2.conf`に下記を追加します。

```
Protocols h2 h2c http/1.1
```

# http2モジュールをONに
http2モジュールをONにします。

```
sudo a2enmod http2
sudo service apache2 restart
```



以上です。お疲れさまでした。
ループ処理を使って入力内容を検証する

## はじめに
初投稿です。
Rubyの学習を始めて1ヶ月弱、オブジェクト指向を取り入れたアウトプットとしてコンソール上で遊べるブラックジャックゲームを作りました。
カードのヒット(引く) or スタンド（引かない）の選択をユーザーの入力から受け取る処理の部分で新しい学びがあったので、似たような学習段階の方々に向けて記事にしました。

## 概要
- 入力内容が正しい形式であることの確認方法として「入力の検証ループ」を紹介
- ブラックジャックゲームでの実使用例を紹介

※ オブジェクト指向の内容は含みません。**反復処理**を用いた内容です。



<br>

:::note warn
記事内では「入力の検証ループ」と表現しますが、公式の呼び方ではありません。
説明上、端的に表すためにこのように呼んでいます。
:::


## 気付きまでの経緯
#### ざっくり
- CLIゲームで入力の受け取り → 想定外の入力に対応しないとな → 例外処理を使う？
- 例外処理は例外的な問題への対応策。誤入力はエラーではないから、今ケースでは過剰かも？
- 入力内容の妥当性をチェックするだけなら「入力の検証ループ」で対応できる



#### もう少し詳しく
今回作ったブラックジャックのゲーム中にユーザーの入力によって処理を変える部分があり、想定外の入力にどう対応するべきかを考えたことが始まり。
最初は例外処理を使おうと考えたが、例外処理は

- 予期しない状況やエラーが発生した場合にプログラムが適切に処理できるようにする必要がある場合
- 外部リソース（ファイル、データベースなど）へのアクセス中にエラーが発生する可能性がある場合

このようなケースで使われることを想定しており、私の目的にはオーバーな対応策に思えた。

そこでいろいろ調べた結果、たどり着いたのが「入力の検証ループ」。



## 入力の検証ループ
### 入力の検証ループとは
ユーザーから「期待通りの妥当な入力」があるまでループを使って**再入力**を促すもの。
`loop`や`while`などの反復処理を利用して実装する。

言ってみれば
「正しい入力するまで出られません」なループですね。

#### 使い所
- ユーザーからの入力が特定の形式に従っていることを確認する必要があるとき
- 不正な入力が想定されるとき

#### メリット
- コードがシンプルで可読性、保守性の向上につながる
- if文の条件をメソッドで切り出せば色々な入力チェックに使いまわせる（再利用性向上）

#### コード例
`loop`を用いた例です。
if文の条件を<font color="red">`valid?`</font>メソッドに切り出していますが、ベタ書きでも当然OKです。
また、入力内容を返す必要がない場合は`break`で抜けてもいいです。
```ruby:loop_varidate.rb
loop do
  input = gets.chomp
  return input if valid?(input)
    
  puts "入力が無効です。もう一度お試しください。"
end
```
##### 処理の解説
1. `gets`でコンソールから入力を受け取り
2. if文で判定
3. 条件を満たせば、`return`でループを抜ける
4. 条件を満たさなければ、正しい入力を促すメッセージを出力、その後ループ続行






## ブラックジャックゲームでの使用例

##### コンソール上で入力を促す
※ 以下コンソールの表示例は一部抜粋
```
あなたの現在の得点は18です。
カードを引きますか？（Y/N）
```

##### 入力の検証ループ

以下の検証ループをメソッドにして、呼び出し元の別のループを抜けるかどうかの判定用に使いました。

```ruby:loop_varidate.rb
loop do
  input = gets.chomp.upcase
  return true if input == 'Y'
  return false if input == 'N'

  puts "入力が正しくありません。'Y' または 'N' を入力してください。"
end
```

- 入力内容が`YかN`なら検証ループを抜ける
    - Yなら`true`を返して、呼び出し元のループを続行
    - Nなら`false`を返して、呼び出し元のループを抜ける
- 入力内容が`YかN以外`の入力は検証ループを続行

`upcase` を使って小文字の入力でも通るようにしてあります。


##### 正しい入力の例

想定通りの入力なので検証ループから抜け、後続の処理が実行されます。
```
あなたの現在の得点は18です。
カードを引きますか？（Y/N）
n
ディーラーが引いた2枚目のカードはハートの8
```

##### 誤入力の例

想定外の入力なので、正しい入力をするまでループが回ります。
```
カードを引きますか？（Y/N）
z
入力が正しくありません。'Y' または 'N' を入力してください。
x
入力が正しくありません。'Y' または 'N' を入力してください。
Y
あなたが引いた3枚目のカードはクローバーの2
```



## おわりに
最後まで読んでいただきありがとうございます。

学び始めの方に少しでも参考になれば幸いです。
ループの練習の1つとして`irb`で試してみてもいいかもしれませんね。

ツッコミどころがありましたら遠慮なくご指摘いただけると嬉しいです。
資格の勉強法Tips集

# 保有済み資格と今年中に取りたい資格まとめ

## 保有済み資格
* 統計検定２級
* 基本情報技術者試験
* 簿記２級
* データサイエンティスト検定リテラシーレベル

## 今年中に取得したい資格
* G検定
* 応用情報技術者試験
* Pythonエンジニア認定基礎試験
* Pythonエンジニア認定データ分析試験

# 保有済み資格勉強法Tips
## 統計検定２級

使用参考書
[統計検定２級公式問題集CBT対応版]
(https://jitsumu.hondana.jp/book/b614221.html)

参考サイト
[統計web](https://bellcurve.jp/statistics/course/)
[YouTube とけたろうチャンネル](https://www.youtube.com/watch?v=mh36Jtcn0zg&list=PL42v8FcrspQZd9Ob3QZN97IEEvF9dWdXZ)

## 基本情報技術者試験

使用参考書
[基本情報技術者試験のアルゴリズム問題がちゃんと解ける本](https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%95%99%E7%A7%91%E6%9B%B8-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%95%8F%E9%A1%8C%E3%81%8C%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E8%A7%A3%E3%81%91%E3%82%8B%E6%9C%AC-%E7%AC%AC2%E7%89%88-%E7%9F%A2%E6%B2%A2-%E4%B9%85%E9%9B%84/dp/4798150460)

[出るとこだけ！基本情報技術者試験午後](https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%95%99%E7%A7%91%E6%9B%B8-%E5%87%BA%E3%82%8B%E3%81%A8%E3%81%93%E3%81%A0%E3%81%91-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C-%E6%A9%8B%E6%9C%AC/dp/4798151963)

[イメージ＆クレバー方式でよくわかる栢木先生の基本情報技術者試験教室](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8-%E3%82%AF%E3%83%AC%E3%83%90%E3%83%BC%E6%96%B9%E5%BC%8F%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-%E6%A0%A2%E6%9C%A8%E5%85%88%E7%94%9F%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E6%95%99%E5%AE%A4-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93/dp/4297123932)

参考サイト

## 簿記２級

使用参考書
[みんなが欲しかった簿記の教科書　日商２級商業簿記・工業簿記](https://bookstore.tac-school.co.jp/book/category/001001041/)

[みんなが欲しかった簿記の問題集　日商２級商業簿記・工業簿記](https://bookstore.tac-school.co.jp/book/category/001002002/)

参考サイト

## データサイエンティスト検定リテラシーレベル

[公式リファレンスブック](https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E6%A4%9C%E5%AE%9A-%E3%83%AA%E3%83%86%E3%83%A9%E3%82%B7%E3%83%BC%E3%83%AC%E3%83%99%E3%83%AB-%E5%85%AC%E5%BC%8F%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88/dp/4297128322/ref=sr_1_1?crid=2LG9KRHZ0LI9M&keywords=%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E6%A4%9C%E5%AE%9A&qid=1682234956&sprefix=%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%2Caps%2C215&sr=8-1)

使用参考書

参考サイト
ChatGPT APIで競合検索サービスを作ってみた

少し前にchatGPTの勉強会のようなものに参加した際に触発されて、自分でもサービスを作ってみました。

といっても、全然プログラミングはできないので、YouTubeを見ながら自分でアレンジした感じです。
見た動画はこちら↓
https://youtu.be/LX_DXLlaymg
 

4月から入った会社の研修でサービスを企画する研修がありました。

研修内で、ペルソナ設定やそれに基づく競合サービスの調査をすることがあり、chatGPTのAPIを使って楽に競合調査できないかな、と思って作ってみました。
（直接、OpenAIから聞けばいいじゃん、とは思ってはいけない）




仕組みはものすごく簡単で、入力した内容を質問形式になるように裏でくっつけて、返答を表示するようになってます。

↓対象ユーザー、提供する機能などを記載し、「送信」する
![スクリーンショット 2023-04-23 16.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552555/9da5f015-0413-df24-599a-07935acb1ea0.png)


↓chatGPTから返答が返ってくる
![スクリーンショット 2023-04-23 16.10.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552555/daa32784-784b-5b1b-fb5c-75d91a259eaa.png)

  
 
作ってみた感想としては、やっぱり情報の確度が低いですね。リクルートなのに「マイナビ２０２２」って書いてあったり。存在しないサービスの情報を提供されたり、なんてことが往々にしてあるのが課題です。


もしかしたら、私の設定次第で回答の精度が上がるのかもしれません。

また、動画を見ながらやる前に、「chatGPTにchatGPTのアプリ作らせてみよう」と思って試しましたが、見事失敗したので余裕があればその記事も書ければと思います。

ここまで読んでくれてありがとうございました！
Rubyのgetsメソッドにおけるgets.chompの意味と使い方

## Rubyのgetsメソッドとは

Rubyでプログラムがユーザーからの入力を受け取る際に、`gets`メソッドがよく使われます。`gets`メソッドは、ユーザーが入力した文字列をそのまま取得し、改行文字も含めて返します。

例:
```ruby
puts "お名前を入力してください: "
name = gets
puts "こんにちは、#{name}さん"
```
この例では、`gets`メソッドを使ってユーザーからの入力をname変数に代入しています。ただし、このままでは改行文字も含まれているため、出力結果が次のようになります。
```ruby
お名前を入力してください: 
太郎
こんにちは、太郎
さん
```
これを防ぐために、`gets.chomp`を使います。

## gets.chompの意味と使い方
chompメソッドは、文字列の末尾にある改行文字を取り除くことができます。`gets.chomp`を使うことで、`gets`で取得した文字列から改行文字を除去できます。
例:
```ruby
puts "お名前を入力してください: "
name = gets.chomp
puts "こんにちは、#{name}さん"
```
この例では、`gets.chomp`を使って改行文字を取り除いてからname変数に代入しています。これにより、出力結果が次のようになります。
```ruby
お名前を入力してください: 
太郎
こんにちは、太郎さん
```

## if文でgetsを使った例
getsメソッドをif文で使用する場合、改行文字が含まれているため、うまく条件分岐ができません。以下に、getsを使った場合の例を示します。
```ruby
puts "パスワードを入力してください: "
password = gets
if password == "p@ssw0rd"
  puts "ログインに成功しました"
else
  puts "パスワードが違います"
end
```
この例では、ユーザーが正しいパスワード`p@ssw0rd`を入力しても、改行文字が含まれているため、条件分岐が正しく機能しません。
```ruby
パスワードを入力してください: 
p@ssw0rd
パスワードが違います
```

## if文でgets.chompを使った例
`gets.chomp`を使用することで、改行文字を取り除いた文字列を取得し、正しく条件分岐を行うことができます。
```ruby
puts "パスワードを入力してください: "
password = gets.chomp
if p@ssw0rd == "p@ssw0rd"
puts "ログインに成功しました"
else
puts "パスワードが違います"
end
```
この例では、`gets.chomp`を使用して改行文字を取り除いてから`password`変数に代入しています。これにより、条件分岐が正しく機能します。
```ruby
パスワードを入力してください: 
p@ssw0rd
ログインに成功しました
```
## まとめ
Rubyの`gets`メソッドは、ユーザーからの入力を受け取る際に使用されますが、そのままでは改行文字も含まれてしまいます。`gets.chomp`を使うことで、改行文字を取り除いた文字列を取得できます。このように、`gets.chomp`は、ユーザー入力を扱う際に便利なメソッドです。特に、if文などの条件分岐で正しく動作させるためには、`gets.chomp`の使用が重要です。
開発する際にこれだけは覚えておこう！Gitのブランチとマージを使いこなす

# 0.ブランチとマージを使いこなそう

## 1.ブランチとは？

並行して複数機能を開発するためにあるのがブランチ

## 2.ブランチの仕組み

### Gitのデータの持ち方自体復習してみよう

- Gitのデータの持ち方

ローカルリポジトリ

⇨圧縮ファイルA

⇨ツリー（index.html , 圧縮ファイルA）

⇨コミット1(ツリー名、作成者、日付、コミットメッセージ)

コミット2を作成した場合、

親コミットが履歴される。(parent)

## 3.HEADとは何？

HEADとは：今自分が作業している場所を示している

## 4. ブランチの仕組みのまとめ

- 分岐することで、複数の機能を同時並行で開発するための仕組みがブランチ
- ブランチとはコミットを指すポインタ

## 5. git branchコマンドで押さえておきたいこと。

### 5.1 新しいブランチを作成する

git brunch <ブランチ名>

### 5.2 ブランチの一覧を表示する

git bruch

git brunch -a 全てのブランチを表示する

### 5.3 ブランチの切り替え

git checkout <既存のブランチ名>

git checkout -b <新ブランチ名>

## 6.マージには2種類ある

Fast Foward：早送りになるマージ：枝分かれしていない場合のマージ

Auto merge：基本的なマージ

## 7.コンフリクトを解決しよう

同じファイルの同じ行に対して異なる編集を行なったときに競合が起きること。

### 7.1コンフリクトが起きないようにするためには

- 複数人で同じファイルを変更しないこと！！

- pullやmergeする際に、変更中の状態をなくしておく(commitやstash)をしておく。
- pullするときは、pullするブランチに移動してからpullする
- コンフリクトしても慌てないこと

## 8. ブランチ名を変更したいときやブランチを削除する方法

ブランチ名の変更

git branch -m <ブランチ名>

git branch -m new_branch

ブランチの削除

git branch -d <ブランチ名>

※ masterにマージされていない変更が残っている場合は削除しない

（とても便利な機能）

強制終了する場合

git branch -D <ブランチ名>

## 9.ブランチを利用した開発の流れ

masterブランチをリリース用ブランチに、開発はトピックブランチを作成して進めるのが基本
[Swift] Enumの意外に知られてない性質

今回はEnumの意外に知られていない性質についてご紹介していきます。

## enumのcaseはprotocolで定義することができる
実はcaseはprotocolで定義することができます。これはSwift5.3で追加された機能です。
このようにして定義します。
```Swift
protocol EnumProtocol {
    static var foo: Self { get }
    static func hoge(arg: Int) -> Self
    static func fuga(arg1: Int, arg2: String) -> Self
}

enum Hoge: EnumProtocol {
    case foo
    case hoge(arg: Int)
    case fuga(arg1: Int, arg2: String)
}
```
associated valueがないcaseは、
```Swift
static var foo: Self { get }
```
associated　valueがあるcaseは、
```Swift
static func hoge(arg: Int) -> Self
```
このように、caseをprotocolで定義することができました。

## enumはクロージャで表せる
enumのcaseはクロージャで表すことができます。
ただし、クロージャで表せるのはassociated valueを使っているcaseのみとなります。

```Swift
let foo: () -> Hoge = Hoge.foo // ❌
let hoge: (Int) -> Hoge = Hoge.hoge // 🟢
let fuga: (Int, String) -> Hoge = Hoge.fuga // 🟢
```
正直、どこでつかうねんという感じですが、
この性質を利用して作られた、swift-case-pathsというライブラリがあります。
詳しい説明は省きますが、KeyPathと同じ感じで、このようなことができるようになったりするライブラリです。

```Swift
let hoges: [Hoge] = [.foo, .hoge(arg: 2), .fuga(arg1: 1, arg2: 2)]
hoges.map(/Hoge.hoge)
// [.hoge(arg2: 2)]
```
swift-case-pathsの`/`オペレーターの定義はこのようになっています。

```Swift
public prefix func / <Root, Value>(
  embed: @escaping (Value) -> Root
) -> CasePath<Root, Value> {
  .init(embed: embed, extract: extractHelp(embed))
}
```
`(Value) -> Root`
でcaseをクロージャで受け取っていることがわかると思います。
正直内部実装はあまり理解していないので解説はできないのですが、こういうところで使われているんだなー程度に思っていてください。

## まとめ
protocolでenumのcaseを定義できるのは便利ですね。
ただ、closureで定義できる性質は使い道が思い浮かんでいないので、面白い使い方を見つけたいですね。
VSCodeのスニペットを使って爆速で日報を書く方法

会社の事情でNotionやEvernoteなど使えないため、マークダウン形式のファイル(mdファイル)を使用してローカルで日報を書くことにしたので、そのためのセットアップ方法を残していきます。

より良いものが見つかったら随時更新予定です。

今回はmdファイルで以下のような日報フォーマットをコマンド一発で展開できるようにします。

![mdファイルの完成形.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/657980c0-fa8b-a53b-b0e7-8ebe69572aae.png)




## VSCodeでのスニペット設定方法

まず型を登録してすぐに使えるようにスニペットというものを登録していきます。

上部のバーから```Code→基本設定→ユーザースニペットの構成```を選んで下さい。
そうするとsnippetsの設定画面に飛びます。


![スニペットの設定の仕方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/e1b6c323-eb3a-227a-c5a6-821cb06e6fdc.png)


[[snippetsの設定画面]
![snippetsの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/b288b8cc-2fd2-f656-cc80-e2a912bd0db8.png)

このsnippetsの設定画面に以下のコードをコピペして下さい。
```
{
  "dailyReport": {
    "prefix": "dailyReport",
    "body": [
      "## 今日の目標",
      "",
      "## 今日の業務内容",
      "",
      "## 今日の結果",
      "",
      "## 学んだこと",
      "",
      "## 困っていること",
      "",
      "## 改善点",
      "",
      "## 次回試してみること",
      "",
      "## 雑感",
      ""
    ],
    "description": "dailyReport"
  }
}

```

これでスニペットの登録は完了です。


## 設定したスニペットを簡単に呼び出す方法

ここでmacユーザーの方は**mac側の設定**と**VSCode側の設定**が必要になります。
VSCodeで```command+space```を入力してみて下さい。それでVSCodeの入力補完が出てきたら元々設定から出来ているのでこの章は飛ばして下さい。

windowsユーザーの方は```ctrl+space```で入力補完ができるので、このmacとVSCodeの設定は飛ばして下さい。

もし```command+space```を入力してmacの「Spotlight検索」が出てきたら下の設定を行って下さい。

### Mac側の設定

Mac側の設定なので上部のタブからシステム環境設定→キーボード→ショートカット→Spotlightを選択して下さい。

そうすると以下の**spotlight検索を表示**のチェックボックスにチェックがついているので、そのチェックを外して下さい。

![スクリーンショット 2023-04-23 14.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/845b9891-5d9e-b28e-9107-acc43c16e2a1.png)


### VSCodeのショートカットキーの設定


1.上部のバーからCode→基本設定→キーボード ショートカットを選択して"候補"と検索する。

![キーボードショートカットの場所.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/46e80a8e-2486-4253-4bea-78c43c2723d2.png)


そしたら「候補をトリガー」と出てくるので、そこの鉛筆ボタンをクリックして```command+space```を入力してEnterキーを押して確定します。

![候補と調べる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/03bb427c-fb05-6d73-299a-a83abd70af8d.png)


これでVSCodeのショートカットキーの登録は完了です。



## 登録したスニペットを呼び出す

ファイルに戻り```command+space```を入力すると先ほど登録した〇〇が出てくるので、それをクリックすると一発で登録したフォーマットが入力されます。

![スニペットの呼び出し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481470/a0472458-eafa-6089-647e-3c416b3f75b3.png)


## まとめ

以上が爆速でVSCodeを使用して日報を書くためのセットアップです。

ぜひ日報を書いて振り返る癖をつけ、一緒に爆速で成長していきましょう！
Windowsでパス指定時のエラーの対処方法 (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

# エラーの中身
windowsでPythonを記載中
パスを文字列として指定するとエラーが起こることがある。
```python
file = "C:\Users\***.***"
```
```
    file = "C:\Users\***.***"
                             ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
```

# 結論
Windowsでパスを指定する際は、文字列の前に`R`を書く。

:::note alert
NG：エラーが出る書き方
```
"C:\Users\***.***"
```
:::

:::note info
OK：Rを先頭に記述する
```
R"C:\Users\***.***"
```
:::
もしくは`\`を`\\`に変更して

:::note info
OK：\を\\\\と記述する
```
"C:\\Users\\***.***"
```
:::
# 理由
Pythonでは`\`のあとに文字を書かれると「特殊な文字」（エスケープシーケンス）として認識してしまう。
例えば`\n`と書くと改行として認識される。
```python
print("Hello\nWorld")
```
```
Hello
World
```
しかし、`R"文字列"`と書くことで書いたそのまま文字列として認識させることができる（raw文字列）
```python
print(R"Hello\nWorld")
```
```
Hello\nWorld
```

もしくは`\\`と記述することで`\`と認識させることもできる
```python
print("Hello\\World")
```
```
Hello\World
```
AWS Lambdaでhostsファイルを設定する方法

AWS Lambdaでは、コンテナまたはEC2インスタンスとは異なり、/etc/hostsファイルを直接編集することはできません。ただし、/etc/hostsファイルの変更が必要な場合は、代替手段としてカスタムDNSリゾルバを使用することができます。

以下の手順でカスタムDNSリゾルバを作成し、Pythonコードで使用してください。

1. Pythonのsocketモジュールをオーバーライドするカスタムモジュールを作成します。
custom_resolver.pyという名前のファイルを作成し、以下の内容を記述してください。

```python:custom_resolver.py
import socket

_original_getaddrinfo = socket.getaddrinfo

def custom_getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
    if host == 'example.com':
        return _original_getaddrinfo('123.123.123.123', port, family, type, proto, flags)
    return _original_getaddrinfo(host, port, family, type, proto, flags)

socket.getaddrinfo = custom_getaddrinfo
```
この例では、example.comというホスト名が指定された場合に、123.123.123.123というIPアドレスに解決されるようにカスタムリゾルバを設定しています。必要に応じてホスト名とIPアドレスを変更してください。

2. AWS Lambda関数内でカスタムリゾルバを使用します。
Lambda関数のコードの冒頭に、以下のようにカスタムリゾルバをインポートしてください。

```python
import custom_resolver
```
この方法により、AWS Lambda関数内で特定のホスト名がカスタムIPアドレスに解決されるようになります。ただし、この手法は推奨される方法ではないため、状況によっては適切なDNS設定を使用することが望ましいです。
nuxt3(SSR) で sitemap.xml を生成する方法

# 経緯
nuxt2や、nuxt3(SPA)では、[nuxt/sitemap](https://sitemap.nuxtjs.org/)で、sitemap.xmlが生成できましたが、nuxt3(SSR)は対応していないため使うことが出来ませんでした。
自作のsitemap.xmlも試したが、意外と面倒でした。
そこで、他のジェネレーターを探しました。

# 使用するジェネレーター
- **[nuxt-mapple](https://github.com/L422Y/nuxt-mapple)**

こちらのジェネレーターを使用します。
(githubで検索してスター順に試したので、他にもいいものがあるかもしれません。)

# 使用方法
## install
環境に合わせて選択する。
```zsh
npm : npm i nuxt-mapple
yarn : yarn add nuxt-mapple
```

## nuxt.config.tsに追記
```ts
import { defineNuxtConfig } from "nuxt/config";

export default defineNuxtConfig({
    ~~~,
    modules: [
        ~~~,
        'nuxt-mapple', // <- 追記
    ],
    mapple: {
        basePath: 'https://example.com', // <- ドメイン
        staticRoutes: ['/'], // <- 追加したいルート
    },
    ~~~
})

```

## 生成・実行
```zsh
npm run build
npm run start
```

## 確認方法
`/sitemap.xml` にアクセス。

http://localhost:3000/sitemap.xml

xmlが確認できたら成功です。

# 最後に
以上がnuxt3(SSR)でsitemap.xmlを生成する方法でした。
開発のお役に立てれば幸いです。

[nuxt-mapple](https://github.com/L422Y/nuxt-mapple)は、除外したいページや、動的なページにも貼ることができるので、ぜひお試し下さい。
bybitのOHLCV(ローソク足+出来高)を全期間取得

## コード
#### データの取得

```python
from datetime import datetime
import time

import requests
import pandas as pd

url = "https://api.bybit.com/v5/market/kline"
symbol = "BTCUSDT"
# spot,linear,inverse
category = "linear"
# 1,3,5,15,30,60,120,240,360,720,D,M,W
interval = 15

timestamp = int(time.time())
values = []

while True:
    params = {
        "symbol": symbol,
        "interval": interval,
        "category": category,
        "start": (timestamp - 200 * 60 * interval) * 1000,
        "end": timestamp * 1000,
        "limit": 200
    }

    response = requests.get(url, params=params)
    response_data = response.json()

    if len(response_data["result"]["list"]) == 0:
        break

    values += response_data["result"]["list"]
    timestamp -= 200 * 60 * interval

data = pd.DataFrame(values)
data.to_csv(f"bybit_{symbol}_{category}_{interval}.csv", index=False)
```

#### 取得したデータ
![スクリーンショット 2023-04-23 15.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2528209/dc35e78f-8ff8-8bee-c8c2-7779310c7fe6.png)


#### 取得したデータの整形
```python
data = pd.read_csv(f"bybit_{symbol}_{category}_{interval}.csv")

# カラム名を修正
data.columns = ["timestamp", "open", "high", "low", "close", "volume", "turnover"]
# タイムスタンプをdatetime型に変換
data["datetime"] = (data['timestamp'].astype(int)/1000).apply(datetime.fromtimestamp)
# 昇順に並び替え
data.sort_values("datetime", inplace=True)
# "datetime"をインデックスに設定
data.set_index("datetime", inplace=True)
```

#### 整形後のデータ
![スクリーンショット 2023-04-23 15.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2528209/c1fff578-29ac-97bd-a19f-a29f13093055.png)
【1分理解】Amazon ELBとは！？(自分用)

|　　　　　　　　  　　　　　　　　   　　　　　　　　　　　　　　　　　　　　　　　　　|
|:-:|
|<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340698/00a59954-490f-58ff-2b53-311eb043e8b8.png">|

## ELB(Elastic Load Balancing)とは
複数のEC2インスタンスやコンテナにトラフィックを分散することができるサービス。



## ELBの特徴
1. ヘルスチェック
定期的にインスタンスに対してHTTPリクエストまたはTCP接続を送信し、レスポンスが返されるか確認。
ヘルスチェックが失敗した場合、該当するインスタンスに対してトラフィックを停止する。

2. 監視
アプリケーションのヘルスチェックやアクセスログを収集し、CloudWatchで監視することが可能。


## ELBの種類とその特徴
1. ALB (Application Load Balancer)
 HTTP/HTTPSトラフィックのルーティングに特化(レイヤー7)

2. NLB（Network Load Balancer）
 TCP/UDPトラフィックのルーティングに特化(レイヤー4)
 
3. CLB（Classic Load Balancer）
 HTTP/HTTPSおよびTCP/SSLトラフィックのルーティングに特化(レイヤー4, 7)
※CLBは最新の機能やセキュリティ対策に対応していないため、
　できるだけALBやNLBに移行することが推奨されている。
[ChatGPTプロンプト]人とAIの会話を要約してタイトルを作成する

- いくつかの例(Few-shot)を与えて回答のフォーマットを学ばせている。**例は与えすぎると不安定になるので、3個までが推奨**
- メッセージが短すぎてタイトルが作れない場合、「タイトルなし」と表示するように例で示している
- 「{human_message} {ai_message}」に人間とAIの会話を代入する
- 回答例の前にあえて何も付けないことで、AIが「answer：」という枕詞を付けることを防いでいる

```:Few-shotプロンプト
Please create a title for the text while following the constraints below.

# constraints
・The title must be within 10 characters.
・The title must end with a noun or a noun phrase.
・The title must be in the same language as the text.

text："""こんにちは"""
タイトルなし
text："""Please provide bulleted answers about the vision that OpenAI has for the company. Please also describe its impact on us."""
OpenAI's vision and impact
text："""{human_message} {ai_message}""
```
Rails controllerとは何か

# はじめに
Rails controllerについてまとめてみました。

# Rails controllerとは
ブラウザからのリクエストを受け取り、Model、Viewと連携しながら結果をブラウザに送る役割を担う部分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2860566/4fe323f0-82e3-f763-4d63-13748c068f84.png)

## 代表的な役割
* ブラウザからの入力を受け取る

* データをModelに要求する

* データの追加や変更をModelに指示する

* 適切なViewを選ぶ

* データをViewに渡す

これ以外にもcontrollerの役割はある
またRails controllerが実行する具体的な仕事のことを**action**と言う
								
# 参考記事
[Rails controllerを徹底解説！知っておくべき3つの知識も紹介](https://udemy.benesse.co.jp/development/system/rails-controller.html#:~:text=Rails%E3%81%AEcontroller%E3%81%A8%E3%81%AF%E3%80%81%E4%B8%80%E8%A8%80%E3%81%A7%E8%A8%80%E3%81%86%E3%81%A8,%E5%BD%B9%E5%89%B2%E3%82%92%E6%8B%85%E3%81%86%E9%83%A8%E5%88%86%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82 'RailsController')
STM32H743とILI9341で遊ぶ「理系フリマで入手」


目的
絶対的な処理速度のH743に液晶を繋げて
軽々と処理したい


ピン

13 SCK
12 MISO
11 MOSI

4 CS
3 DC

A1 RST



![o_cop474.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2bf3bbac-c806-a5af-da38-9985f6a165ec.jpeg)


![o_cop479.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6f114d95-f212-4389-8c9d-3cb9534b1d0b.jpeg)



```c++




//ili9341_text1_071

//インクルド
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

//設定
#define TFT_RST A1
#define TFT_DC 3
#define TFT_CS 4

//液晶の定義
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

//初期化
void setup() {

  //シリアルの初期化
  Serial.begin(9600);
  Serial.println("ILI9341 Test!"); 

  //液晶のリセットピンの設定
  pinMode(TFT_RST, OUTPUT);
  digitalWrite(TFT_RST, HIGH);
  //digitalWrite(TFT_RST, LOW);

  //液晶の初期化
  tft.begin();

  //画面のクリア
  tft.fillScreen(ILI9341_BLACK);
  
  //表示位置を0,0にする
  tft.setCursor(0, 0);

  //テキストの表示
  tft.setTextColor(ILI9341_RED);    tft.setTextSize(3);
  tft.println("Hello World!");


}//setup


//無限ループ
void loop(void) {
}//loop




```