OmniAICreator/Qiita-1.07M huggingface dataset:
auroraserverless v2のmax_connectionsどうする（雑メモ）

#### ポイント
・maxxconnectionsの値反映させるためには再起動必要
・postgreの場合は最小容量に注意
・それ以外の場合はざっくりいうと最大容量に基づいて計算されるので設定後にmax_connections確認コマンドで確認しよう

#### 引用
ACU の最大値から計算した値を反映するようにmax_connections パラメータが増加しました。Aurora が max_connections に使用する計算式によると、メモリサイズが 2 倍になると 1,000 増加します。

5,000 という max_connections 値は、最大容量設定のメモリサイズから算出しています。

max_connections パラメータは、以前の容量範囲の値をそのまま反映しています。この値をリセットするには、DB インスタンスを再起動する必要があります。

PostgreSQL 互換 Aurora Serverless v2 DB インスタンスでは、最小容量 0.5 ACU を指定すると、max_connections 設定の上限が 2,000 になります。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html#aurora-serverless-v2.parameters-based-on-max-capacity

#### 言いたいこと
maxconnectionsの非機能要件を満たす確認するにはmysql入ってクエリで確認すればOK（容量の範囲を変えなければ変動しない（厳密には容量の範囲を変えても再起動しなければ変動しないが））
サーバー構築なんてできないと思っていた話 ～新米SE失敗談#その1

新米SE失敗談のその1です。
[※目次はこちらから](https://qiita.com/truetrue09091/items/a176c97f3fd6d5848f2a#%E7%9B%AE%E6%AC%A1)

# Q:サーバをローカルに構築できるのか？
簡単な機能の実装を担当することになった私とレビュー担当の先輩のやり取り

**先輩**「ローカルにDBサーバ立てて、動作確認してからレビュー依頼出してね」
**私**「はい、わかりました。（サーバって、データセンターにあるデカいコンピューターだよね。それを自分のPC
に構築する...無理...??）」

※当時のサーバーのイメージ
<img width="300" alt="server.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069615/8a707067-b346-1641-4f01-0f0c07bff7f0.png">

# A:構築できます。
## そもそもサーバーとは
上述の「サーバー＝データセンターにあるデカいコンピューター」という理解自体は正解といえば正解。
もうちょっと正確に表現しようとすると、
**「特定の機能を提供するためのソフトウェアをインストールしたコンピューター」** のこと。[^1]
サーバーはあくまでコンピュータの役割を表す言葉で、何かしらの機能を提供するコンピュータはその大小にかかわらずサーバーと呼ばれるっぽい。

## サーバーを構築するとは 
**コンピューターに特定の機能を提供するためのソフトウェアをインストールする**ということ。 [^2] 
目的のソフトウェアをインストールさえすれば、自分のPCであっても立派なXXサーバーとして振舞うことができる。 [^3]
先輩とのやり取りに立ち返ると、DBサーバを構築するとは「データベース機能を提供するためのソフトウェアをインストールしたコンピュータを作る＝自分のコンピューターにDBのソフトウェアをインストールして起動する」ことだった（はず）。 [^4]

# 次のステップ
## ソフトウェアのインストール先は？
今回のケースでは物理的なマシン（自分のＰＣ）にソフトウェアをインストールしたが、インストール先は物理的なマシンだけでなく
- 仮想マシン
- コンテナ

といったモノがあるらしい。
それはまた別の機会に整理することに。。

## まとめ
- 先輩が言いたかったことは、「君のPCにDBサーバの機能を提供するソフトウェアをインストールして、（アプリケーションをそのDBサーバに接続した状態で）動作確認してね」ということだった
- サーバーとは「特定の機能を提供するためのソフトウェアをインストールしたコンピューター」のこと 


#### 補足
[^1]: 特定の機能を提供するソフトウェア自体のことをXXサーバと称する人もいます。
[^2]: 実際のサービスにおいては、サーバーにふさわしいスペックを有したコンピューターを利用します。
[^3]: 1からサーバを構築する場合は、ソフトウェアをインストールする前段にも様々な作業が必要です。
[^4]: 1台のコンピューターに複数のソフトウェアをインストールすることもできます。（1台のサーバに複数の役割を兼任させることもあります。）
ソフトウェア名を暗記して満足していた話 ～新米SE失敗談#その2

新米SE失敗談のその2です。
[※目次はこちらから](https://qiita.com/truetrue09091/items/a176c97f3fd6d5848f2a#%E7%9B%AE%E6%AC%A1)

# Q：まずは覚えるのが大事？
チーム内でのやり取り
**同期**「このシステムって、WebサーバとAPサーバ何使っているんですか？」
**先輩**「WebはApacheでAPはTomcatだね。」
**私**「（WebはApacheでAPはTomcat...めもめも...）」

後日
**私**「うちのチームでは、WebはApacheでAPはTomcat使っているらしいわ」
**友人**「へぇ」

とりあえずまずは覚えなきゃと思って暗記を試みていた。

# A：覚えるの大事、理解するのはもっと大事
覚えるのは大事だが、理解するのはもっと大事。
ということで分からなかった諸々を整理していきます

## そもそもWebサーバー、APサーバーとは？
必要性を理解するために、まずは対象物を正しく認識したい。
敢えて文章化するとこんな感じかも。

- Webサーバ：Webの機能を提供するソフトウェアをインストールしたコンピュータ、もしくはそのソフトウェア自体
    - Webの機能とは？：リクエストに対して、HTMLや画像等の静的なコンテンツを応答する機能
- APサーバ：アプリケーションの実行に必要な機能を提供するソフトウェアインストールしたコンピュータ、もしくはそのソフトウェア自体
    - アプリケーションの実行に必要な機能とは？：アプリケーションの動作環境の用意、データベースとのやり取りなど

冒頭に出ていたApacheやtomcatはこれらの一種。
    
## なぜ必要？
**これらのソフトウェアを利用したほうが、効率的にWebサービスを提供できるから。**

Webサーバー/APサーバーと言われるソフトウェアは、Webサービスの提供にあたって必要となってくる機能を集約してパッケージとしてまとめてくれている。

それらの機能は自分たちで実装することもできなくはないはずだが、自分たちで一から作るのはとても大変。
それよりも、実績のあるソフトウェアを導入したほうが動作性も信頼できる。機能も豊富にある。だったら使わない手はないということなのかなと思います。

## なぜWebサーバとAPサーバを分ける？
色んな理由がありそうだが、
- 得意分野が異なるから
- セキュリティ対策として
- 管理がしやすいから

といった理由が主かもしれないです。
「得意分野異なる」については[こちら](https://qiita.com/tanayasu1228/items/11e22a18dbfa796745b5)、
「セキュリティ」「管理のしやすさ」については[こちら](https://thinkit.co.jp/article/11837)の記事にまとまっていました。

## 次のステップ
## Apache vs Nginx？
Apache、およびNginxは代表的なWebサーバソフトです。
Webサーバについて調べていると、両者の比較記事によくヒットしました。
両者を比較にあたっては、プロセスやらスレッドやらの概念を理解する必要がありそうで、私にはまだ時期尚早でした。。
勉強してまとめたいと思います。
サーバーレスが本当にサーバーレスだと思っていた話 ～新米SE失敗談#その3

新米SE失敗談のその2です。
[※目次はこちらから](https://qiita.com/truetrue09091/items/a176c97f3fd6d5848f2a#%E7%9B%AE%E6%AC%A1)

# Q:サーバーレスって本当にサーバーレス？
サーバーレスという言葉を耳にする機会がありました。
サーバーレスのシステムでは、サーバーがない状態でアプリケーションをどうやって実行しているのでしょう、、、

# A:サーバーレスでもサーバーは存在している
## サーバーレスとは
サーバーレス（アーキテクチャー）とは、
**「サーバーを自分たちで管理をすることなく、アプリケーションを実行できる（アーキテクチャー）」** のこと。
あくまで、サーバーを自分で管理しなくてよいだけであって、サーバー自体は存在しています。

## サーバーを管理するとは
サーバーを運用するにあたっては、様々な管理業務が発生する。以下に例を記載。

例）
- サーバの起動停止
    - サーバ費節約のために、サービス時間外になったらサーバーを停止するようスクリプトを用意する
    - サービス時間になったらサーバーが起動するようスクリプトを用意する
- OSやソフトウェアのアップデート
    - OSやソフトウェアに脆弱性が発見された場合、脆弱性に対応した新しいバージョンがリリースされる
    - サーバーの管理者は、新バージョンをテスト環境にインストールする
    - 新バージョンでも、アプリケーションがこれまで通りに動くかテストする
    - テスト環境での稼働確認が取れたら、本番環境のサーバーにも新バージョンをインストールする

などなど、それなりの手間暇がかかる。

## サーバーの管理が不要になると誰が嬉しいのか
AWS曰く、上記のような作業は[ビジネスに直接の価値を生み出さない作業](https://aws.amazon.com/jp/builders-flash/202003/awsgeek-serverless/?awsf.filter-name=*all)であり、削減の対象とのこと。
削減されると誰が嬉しいのかを整理してみました。
- インフラエンジニア？：サーバーの構築・管理業務がなくなるため、他の作業に手が回せる（？）
- アプリケーションエンジニア：サーバーの構築を待つことなく、コーディングしたプログラムをすぐに実行することができるので、開発効率の向上が見込める。


# 次のステップ
## サーバーレスの向き不向き
上述のようなメリットがあるのであれば、全システムサーバーレスにしたほうが良いように思えますが、サーバーレスにも向き不向きがあるとは思います。
サーバーレス環境での「プログラムの実行時間に上限がある」「OSやミドルウェアの設定を自由に変更できない」といった制約が影響しそうですが、具体的にどんなシステム・アプリケーションであればサーバーレスに向いているのかというのはまだまだなんとなくしか分からないので、勉強してまとめたと思います。
新米SE失敗談まとめてみた

# はじめに
新米SEです。
未経験から新卒でSEになり、色んな失敗をしてきました。
初めは「(IEを使って調べものをしていた私に)IE微妙じゃない？」という先輩の言葉すら理解できず、「そうですよね、微妙ですよね。。」といいつつしばらくはIEを使い続けているようなレベル感でした。

そんな私も入社して半年経つので、様々な失敗（＝学び）を棚卸していこうと思います。

私のように予備知識0もはやマイナスでこの世界に飛び込んだ人は「こんなんも分からないのか、、て思われるだろうなぁ」という気持ちを嚙み殺して、忙しそうな先輩に質問することが多いと思います。
そんな方々に私の失敗や学びが少しでも役立ってくだされば幸いです。


# 目次

## サーバーまわりのあれこれ
- [サーバー構築なんてできないと思っていた話](https://qiita.com/truetrue09091/items/e0af14ea1a067cc449a5)
- [ソフトウェア名を暗記して満足していた話](https://qiita.com/truetrue09091/items/c406e4ebe174a38659be)
- [サーバーレスが本当にサーバーレスだと思っていた話](https://qiita.com/truetrue09091/items/305eaf0611bc51b44416)


## CPUとかメモリとスレッドとか
（随時追加します）
AWS Certified Cloud Practitioner (CLF) の所感 

# はじめに
2022/09/26にAWS Certified Cloud PractitionerをピアソンVUE（テストセンター）で受けてきました。

# 動機
AWSの試験は今回が初めてでした。
以前から試験を受けよう受けようとは思っていましたが何かにつけて言い訳がましく敬遠していました。そのような状況の中で、先週の9/22に突然思い立ち、連休明けの9/26の朝に試験という日程を先に決めて、勉強は後回しという手法で重い腰を動かしてみました。

# 試験方法
AWSの試験登録のページにアクセスすると

:::note warn
2023 年 1 月1 日以降はピアソンVUE でのみ試験のご予約が可能となります。協定世界時 (UTC) の 2022 年 12 月 31 日、11 時 59 分 をもちまして、PSI での AWS 認定試験の配信は終了いたしますので、ご了承ください。
:::
という警告を確認できます。
今後のことも考えて、ピアソンVUEに慣れた方が良いと思いピアソンVUEを選択。

さらに進むと
- テストセンター
- onVUE 自宅または職場のオンライン

という選択肢が出てきます。
テストセンターを選択。というのも、家族の声が入ると即終了だったり、PCのセットアップに思わぬトラブルが発生したり、部屋を綺麗にしたりと意外と気をつけることが多いので、無駄な心配を減らすために外出を選択。
（本音はリモートワーク多めなので外気に触れたい、という思惑もあり）

:::note
テストセンターについては、広めの会場を想像していたが、そうではなくPCとパーティションに区切られたブースが横に並んでいるようなところでした。こちらについてはテストセンターによって色々なタイプがあるのではないかと思われます。いつも使う会場を決めて場慣れしておくとテストに集中しやすいかもしれません。
:::


# 勉強方法
AWSの公式に素晴らしい教材があるのでそれを活用しました。
[AWS Certified Cloud Practitioner](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/?c=sec&sec=resources)

下の方に日本語の公式練習問題集があります。
中でも、「AWS エキスパートによって構築されたトレーニング」タブの中に**AWS Cloud Practitioner Essentials**というコンテンツがあります。これを開くと英語版となるのですが、日本語版も存在してとても良いコンテンツとなっています。以前の日本語版は英語版に日本語字幕という構成でしたが、今回確認してみると、日本人メンバーでリメイクコンテンツとして用意されていました。（これは嬉しい！）所々にギャグ？も効いていてニヤリとする場面もあるかもしれません。

:::note
例えば**AWS Trusted Advisor**について、テキストで読むといまいちピンとこないサービスですが、動画で見ると実際のコンソール画面も確認できて内容がスムーズに理解できる構成となっています。
:::


# 感想
申し込みからテストまでを約４日間に凝縮することで、あまり負担にならずに軽い気持ちで受験することができました。普段使ってない幅広いサービスが多く登場し、これを使ってみると面白いかも？と楽しみながら勉強できました。今回は幸い合格できましたが、落ちたとしても無駄にはならない学習だったなと思っています。
せっかく得た知識を忘れずに継続したいので**AWS Certified Solutions Architect - Associate**など上位の試験にもチャレンジしていきたいです。
Qiita(215) 複写貼付：携帯計画者日記(4)

一つのブラウザ操作もままならないまま、二つのブラウザを操作しようとしています。　

iPhoneのSafariとChrome です。事実上ほとんどSafariだけ複数開いて使っています。　
出来るだけ予測変換を利用して入力数を減らすようにしています。何か変なとこが有ればご指摘ください。

# 範囲指定 
長押しすると、範囲を指定できる状態になる時と、ならない時がある。　
違いがわかっていない。　

# 複写　
範囲指定が終わると、コピーを選択できる時と、選択できない時があるような気がする。　

#  貼り付け
長押しすると、貼り付けが出る場合と、なかなかでない場合があるような気がする。

# 参考資料
携帯電話計画者日記(1)
https://qiita.com/kaizen_nagoya/items/7f5c52e9a1b6128b1d31

携帯電話計画者日記(2)
https://qiita.com/kaizen_nagoya/items/e74e04e50ab62e8211aa

自分で目標を立てて自分を変える努力。携帯電話計画者日記(3)
https://qiita.com/kaizen_nagoya/items/1919ee624538eb1931c3

携帯電話計画者日記(4)
https://qiita.com/kaizen_nagoya/items/ae40177bd99388796763
　
携帯電話計画者日記(5)
https://qiita.com/kaizen_nagoya/items/a375b739ced1bf470ed6

SNSの歩き方 携帯電話計画者日記(6)

https://qiita.com/kaizen_nagoya/items/eddf0dd00f92e8419144

携帯電話計画者日記(7)
https://qiita.com/kaizen_nagoya/items/d187113ca3464bfed0b9

なみのりがうまくなるのか波作るモータ作るの上手くなるのか 携帯電話計画者日記(8)
https://qiita.com/kaizen_nagoya/items/789e92b9eb3e15108e08

携帯電話計画者日記(9)
https://qiita.com/kaizen_nagoya/items/31b4adc339d0eeb37035

携帯電話計画者日記(10) 
https://qiita.com/kaizen_nagoya/items/a087f82bd477180e8cfd

携帯電話計画者日記(11) 
https://qiita.com/kaizen_nagoya/items/d34f4329906326e61680

携帯電話計画者日記(12)
https://qiita.com/kaizen_nagoya/items/adb5a0504177fcc06959

炎上商法 v.s. ネット・チャット 携帯電話計画者日記(13)
https://qiita.com/kaizen_nagoya/items/05d747b664b34f2fb9d2

血液検査：健康診断　データサイエンティストの自己データ管理。携帯電話計画者日記(14)
https://qiita.com/kaizen_nagoya/items/b3956b639368877eb199

### 文書履歴(document history)
ver. 0.01 初稿 　20220929
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Dockerで構築したpostgresDBにlaravelでmigration

# 目標
Dockerで構築したpostgresDBにlaravelでmigrationする

## 前提
- Dockerの環境構築は省略
- [postgresDBの環境構築](https://qiita.com/Yatsushi009/items/3d0932b89c51b8b05537)：省略

## 環境
- Windows10 wsl2 Ubuntu
- Docker version 20.10.17, build 100c701
- postgresql14
- adminer 4.8.1
- laravel9
- Composer version 2.3.7
- PHP 8.0.12 (cli) (built: Oct 19 2021 11:21:05) ( ZTS Visual C++ 2019 x64 )
※xampを用いてインストール

# 作業手順
1. laravelのプロジェクトを作成
    ```
    composer create-project laravel/laravel:^9 [project_name]
    ```
1. .envファイルの編集
    ```.env
    （略）
    # mysql 
    # DB_CONNECTION=mysql
    # DB_HOST=127.0.0.1
    # DB_PORT=3306
    # DB_DATABASE=laravel
    # DB_USERNAME=root
    # DB_PASSWORD=
    
    # postgres
    DB_CONNECTION=pgsql
    DB_HOST=127.0.0.1
    DB_PORT=5432
    DB_DATABASE=postgres
    DB_USERNAME=postgres
    DB_PASSWORD=test

    （略）
    ```
1. dockerでpostgresが起動しているか確認
    ```
    ----%docker ps
    CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                    NAMES
    10f74fe67832   postgres:14   "docker-entrypoint.s…"   25 seconds ago   Up 24 seconds   0.0.0.0:5432->5432/tcp   db_db_1
    ```
1. マイグレーションの実行
    ```
    C:\Users\user_name\dev\laravel\test>php artisan migrate
    
       INFO  Preparing database.
    
      Creating migration table ..................................... 26ms DONE
    
       INFO  Running migrations.
    
      2014_10_12_000000_create_users_table ......................... 37ms DONE
      2014_10_12_100000_create_password_resets_table ............... 22ms DONE
      2019_08_19_000000_create_failed_jobs_table ................... 30ms DONE
      2019_12_14_000001_create_personal_access_tokens_table ........ 48ms DONE
    ```
1. adminerで反映されているか確認
http://localhost:8080/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031888/c37c58ea-dacd-5ad0-3785-243cc5cd7f56.png)
paizaラーニング レベルアップ問題集 Aランクレベルアップメニュー JavaScript 累積和の計算

累積和の計算 (paizaランク C 相当)

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_twopointers_step1

素直に書くと、
```javascript:タイムーオーバー
for (let i = 0; i < N; i++) {
    let S = 0; //和S
    for(let j = 0; j < A.length; j++) { 		
        S += A[j];
	}
    console.log(S);
}
```
ですが、これだと計算量が多すぎてタイムオーバします。

# 解答例
上の解答では、和を求めるのに、毎回ループで計算していますが、
`S[i] = S[i - 1] + A[i]`の関係式を用いると、一発で求められます。
計算量を落とすのに使われます。
この問題のSを累積和と言います。
以下の解答では、累積和をつくりながら、出力しています。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const N = Number(lines[0]);
const A = lines[1].split(" ").map(Number);

let S = 0; //累積和S
for (let i = 0; i < N; i++) {
    S += A[i];
    console.log(S);
}
```
『自分用』Flutter入門　Providerの使い方

# この記事について
この記事はあくまで自分用に作ったものなので、読みにくい部分や間違いも含まれていると思いますが、
誰かのお役に立てれば幸いです。
では始めましょう！

### Providerとは
[参考記事](https://www.flutter-study.dev/create-app/provider)
Providerとは、Flutterにおける状態管理の方法の一つです。
Statefulなウィジェットでも代替可能ではありますが、UIと状態管理を別々のファイルで行うことで可読性を上げることができます。

### インストール方法
以下をターミナルの任意のディレクトリで実行
```
flutter pub add provider
```
それだけでOKです！
たまにインストール後ビルドエラーがでますが、大抵の場合は一回android studioを再起動すれば解決します！

### 使い方
文字で説明しても長くなるので、最低限のコードを載せておきます！

UIを作成する側
```page.dart
class Page extends StatelessWidget {
  const Page({super.key});

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Model>(
        create: (_) => Model(),
      child: Scaffold(
        body: Center(
          child: Consumer<Model>(builder: (context, model, child) {
            return Column();
          }),
        ),
      ),
    );
  }
}
```

モデル側

```model.dart
class Model extends ChangeNotifier {
    // この中で処理を書いていく
}
```

今回は以上です！
コピペして使ってみてください！
【AWS】CloudFormationでVPCを作成する。

## はじめに
AWS SAAに合格したので、DVAの勉強としてCloudFormationを勉強し始めたので超基本的なところだと思うけどまとめておく。
まずは、VPCの作成から。

## CloudFormationとは

公式ドキュメントより。
>AWS CloudFormation は AWS リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS で実行するアプリケーションにより注力できるようになります。

リソース管理をコード化して、楽しようみたいなイメージ。
IaCのひとつだと思う。

## 手順
ざっくりと以下の通り。
1. テンプレートの作成
2. スタックの作成

## 1. テンプレートの作成
テンプレートは、Jsonかymlで記述します。
今回はymlにします。
（実務ではどっちが多いのだろうか...）

```yaml: sample-20220926.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: VPC Sample Code

Resources:
  Vpc:
    Type: AWS::EC2::VPC
    Properties: #
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: sample
```

### コードの解説

- `AWSTemplateFormatVersion: "2010-09-09"`
形式バージョン。テンプレートの機能を識別。上記は最新バージョン。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/format-version-structure.html

- `Description:`
テンプレートに関する説明を記述する。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-description-structure.html

- `Resources:`
必須。スタックに含めるリソースを定義する。
今後はどのリソースにどんなプロパティがあるのか把握、理解するのが大変なのかなぁと思う。

```yaml
Resources:
  論理ID:
    Type: リソースタイプ
    Properties:
      プロパティセット（詳細設定みたいなもの）
```

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html

## 2. スタックの作成

1. AWSコンソールにログインし、CloudFormationにアクセス。
2. スタックを作成をクリック。
![2022_09_27_13_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/0361e0f2-cf88-242d-d9b1-ca1c19f28b92.png)

3. テンプレートの準備
さきほどのコードをアップロードします。
![2022_09_27_13_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/3fbd7a20-44e4-a794-7345-e4f111003002.png)

4. スタックの詳細設定
スタックの名前を入力。
今回はありませんが、パラメーターを設定していればここで設定。
![2022_09_27_13_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/b02ac96a-348a-d9ec-45c8-fed6f80c435d.png)

4. スタックオプション
タグなどの設定ができます。
この辺はあまり触ってないので、まだ理解できていません。
今回はそのままスクロールして次へを選択。
![2022_09_27_13_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/8393385c-80af-2c9e-3b07-d7f9e92b1ad1.png)

5. レビュー
確認画面です。問題なければ、
下部のスタックを作成ボタンをクリック。
![2022_09_27_14_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/c25f78d4-0cbc-1af6-b9ce-d29495b8a8be.png)


これでスタック作成は完了です。
少ししたら、右上の更新ボタンを押してください。
問題なければ、ステータスがcompleteになります。
![2022_09_27_14_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/c768ba5e-c174-c0c2-c4f6-fb3076a83a5d.png)

## リソースの確認
問題なく作成できました。
![2022_09_27_14_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513223/ae9bd9ce-aff2-a5b7-bb11-f273910939ca.png)

# さいごに
CloudFormationでのVPCの作成をやってみました。
今回は簡単でしたが、やっぱりテンプレートを書くのがしんどいですね。
でも一度書いたらかなり楽できるみたいなので、はやく使いこなせるようになりたいですね。

## 参考文献

https://docs.aws.amazon.com/cloudformation/index.html
SourcetreeでGithubのリポジトリをクローンする際にエラーが出た

macでは遭遇しなかったのでWindows特有の問題かも

# エラー文
```
The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n)
```

# 対処方法
コマンドプロンプトで以下を実行
```
"C:\Program Files (x86)\Atlassian\SourceTree\tools\putty\plink.exe" -ssh -C -i "path\to\private\key.ppk" git@github.com
```
plink.exeとssh接続に使用する秘密鍵へのパスは各環境によって異なるため注意
```
C:\Users\tenryu>"plink.exeへのパス" -ssh -C -i "秘密鍵へのパス" git@github.com
Using username "git".
Access granted. Press Return to begin session.
Server refused to allocate pty
Hi ユーザー名! You've successfully authenticated, but GitHub does not provide shell access.
```
これが出ればOK

しかしこの後もSourcetree上でssh認証の失敗エラーが出る
画面右下にあるアイコンからsshキーagentを起動し、生成した秘密鍵を選択するとエラーは解消された

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637441/132fa8ec-0f62-645d-db89-a69c95be5e66.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637441/b395289c-c7da-5243-6b3d-2b04bf7b1b2f.png)

## 参考

https://qiita.com/neon-izm/items/55de775dd50024403c5d 

https://qiita.com/moo/items/5ee3208254c34719914b 

https://qiita.com/chatii0079/items/17f8a79808e35f1ad225
Jetson AGX Xavier にVScodeをインストールしたけど、起動しなかった（解決した）

# 環境
- Jetson AGX Xavier
- Ubuntu 20.04
- Jetpack5.0

# やりたい事
VScodeを使いたい
# インストール方法(失敗)
インストールはうまくいくが、起動しなかった
```
sudo dpkg -i code_1.71.2-1663189619_arm64.deb
```
インストール成功→起動しない→アンインストール
```
sudo apt-get remove code
```
# インストール方法(成功)
バージョン1.65で起動できていると記事があったので1.65をインストール

https://packages.microsoft.com/repos/code/pool/main/c/code/code_1.65.2-1646922911_arm64.deb

```
sudo dpkg -i code_1.65.2-1646922911_arm64.deb
```
apt upgradeでバージョンアップすると使えなくなるので、以下を実行してaptから除外
~~~
echo code hold | sudo dpkg --set-selections
~~~

# 確認方法
code --version

## 参考にした記事
https://forums.developer.nvidia.com/t/vs-code-can-t-launch-with-jetpack-5-0/213980
タイムゾーンの設定について

## 環境
Ubuntu20.4

## 内容
タイムゾーンを設定する場合、日本であれば、'Asia/Tokyo'の値をセットします。仮に、シンガポールであれば、'Asia/Singapore'の値をセットすることになります。この値はどこを調べればわかるかと言えば、次のコマンドで調べることができます。
```
$tzselect
```

大陸の一覧が表示されるため、ウィザードに従って番号をうって進めて行くと、設定したい国の値を調べることができます。


日本を調べると、次のように表示されます。
```
You can make this change permanent for yourself by appending the line
        TZ='Asia/Tokyo'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Tokyo
```

メッセージにある通り、日本のタイムゾーン（つまりJST）を設定するには、TZという環境変数に、'Asia/Tokyo'の値を設定することになります。

ただし、コマンドラインから次のコマンドをうっても、次回OSを起動したときは、この値はクリアされてしまうため、OS起動時に、毎回自動でコマンドが実行されるよう、.profileに記述します。
```
TZ='Asia/Tokyo'; export TZ
```

.profileに記述することが推奨されているようですが、.bashrcに記述しても問題ありません。.profileの中身を見ると分かりますが、.profileの中から、.bashrcが実行されています。

タイムゾーンの値は環境変数で設定してもいいが、次のコマンドで設定することもできます。基本的にどちらかになります。
```
$timedatectl set-timezone Asia/Tokyo
```

設定したタイムゾーンの内容を確認するコマンドが次です。Asia/Tokyoで設定した場合、次のコマンドをうつと、 Time zone: Asia/Tokyo (JST, +0900) と表示されます。
```
$timedatectl
```

環境変数で設定する場合と、timedatectlコマンドで設定する場合とでは、どっちで設定する方がいいのかと言えば、正直、お好きなやり方でどうぞということになるかと思います。言わずもがなではありますが、環境変数で設定した場合、ログインしたユーザーにしか反映されないことにはなります。

RubyでTimeクラスや、Dataクラスを使ってシステム日付を取得した場合、タイムゾーンで設定されている日付（時間）が取得されることになります。

環境変数とtimedatectlの両方に値がセットされていれば、どちらの値が優先されるのかといえば、環境変数の値の方が優先されることになります。

環境変数とtimedatectl共にタイムゾーンの設定がされていない場合は、UTC（世界標準時）が取得されます。環境変数TZはデフォルトでは値が設定されておらず、timedatectlには、デフォルトでUTCが設定されているためです。
Next.jsでPublicディレクトリに配置した画像を配列としてmapで表示する

## いちいちコード書くのは面倒くさいと思った

### 経緯

個人の趣味のブログサイトでイラスト公開のページを作成した際、**Next.js**の`<Image>`で画像を表示していました。

ただ`<article>`のレイアウトをコンポーネント化したのに、画像が増える都度に**Props**でパスを渡しながらコンポーネントを増やしていくのは、**まだ運用していないにも関わらずちょっと面倒だなと思った次第**です。

というかせっかく記事はNotionをCMSとして更新できるので、**画像の更新もコードいじりたくない**と。

### 案1：NotionAPIで取得

**記事内の画像は普通にNotionAPIで取得している**ので、ここの画像もNotionAPIで取得するということも考えました。

ただ、APIで取得した画像の仕様として1時間でリンク切れになってしまうのを画像置場で使うのは。。。

また`<Image>`と違って自動最適化に対応しないので却下。

### 案2：S3などに置く

そもそも趣味でちょっとブログ書きたかっただけで、メインは画像ではないのでそこまでのコストはかけたくないので却下

### 案3：publicディレクトリに置く

**Next.js**は**Publicディレクトリ**に画像を置いておけば簡単に画像にアクセスでき、かつ`<Image>`は自動で最適化や遅延ロードにも対応しているので非常に使い勝手がよいです。

調べたら**glob**というワイルドカードを利用してパスを取得できるライブラリがあったので、それでいけるのではと。

配列で取得できるので**map**で表示していくのにも都合がよい。

## ということで案3を採用

### Next.jsでglob使用の注意点

そもそも**glob**は**node.jsのライブラリ**なのでフロント側のコードに書いたとしても下記エラーで動かないです。

```jsx
**Module not found: Error: Cannot resolve 'fs'**
```

サーバーサイドで動かさないといけないので、`getStaticProps`配下でパスを取得して、ページにはpropsで渡す必要があります。

**下記・・・A**だけで指定フォルダを検査してくれます。拡張子も指定できるので今回は**jpg**と**png**のファイルだけを指定します。**関数に渡すパスは絶対パスでも相対パスでもOKです**。

これで指定したファイルのパスが配列で取得できます。

```
export const getStaticProps = async () => {
    const glob = require('glob');

    **const files = glob.sync( "./public/*.{jpg,png}");　//・・・A**

    **const fileNames = files.map((file)=>{ return file.split("/").pop()})　//・・・B**
   
　　const comments = commentsArray
    return {
      props: {
        comments:comments,
        posts: fileNames,
      },
      revalidate: 1,
    };
  };
```

### 欲しいのはファイル名

パスの取得ができましたが、**Next.js**はpublicディレクトリを読む際に`”/ファイル名”`で読めるので、取得したパスからファイル名だけ切り出します**（上記・・・B）**。

あとは切り出したファイル名の配列をPropsで渡すだけです。

## 全体

**コードはこんな感じです。**

```jsx
import { memo } from "react";
import ArticleImg from "../components/articleImg";
import styles from "./illustration.module.css";
import { commentsArray } from "../lib/comment";

const illustration = memo(({comments, posts}) =>{
    return (
        <>
        <main className={styles.container}>
        {posts.map((fileName,index)=>{return <ArticleImg key={index} text={comments[index]} imgUrl={`/${fileName}`} /> })
           }
        </main>
        </>)
})
export default illustration

export const getStaticProps = async () => {
    const glob = require('glob');
    const files = glob.sync( "./public/*.{jpg,png}");
    const fileNames = files.map((file)=>{ return file.split("/").pop()})
    const comments = commentsArray
    return {
      props: {
        comments:comments,
        posts: fileNames,
      },
      revalidate: 1,
    };
  };
```

非常にシンプル！

ちなみに配列の順番はファイルの読み込み順になるので、コメントとずれないようにファイル名を変更してフォルダに入れておく必要があります。

それくらいは許容範囲(^^)

## 意外と使い勝手が良かった

そんなこんなで調査の時間含めると4〜5時間くらい掛かりましたが、**ssg**のお陰でページ遷移早いし、別のページに`<grid>`でサムネイル画像並べるのも**publicディレクトリ配下でフォルダ分け**ればロジックそのまま使い回せるので良かった。

## 参考にした記事

[glob公式Readme](https://github.com/isaacs/node-glob#readme)

****[javascript（nodejs）でフルパスからファイル名のみを取得する方法](https://nodachisoft.com/common/jp/article/jp000166/)****

****[【Node.js】 ワイルドカードを使用したファイル一覧取得](https://note.affi-sapo-sv.com/nodejs-glob-wildcard.php)****

****[Next.js でのエラー Module not found: Can't resolve 'fs' の対処方法](https://gotohayato.com/content/553/)****
git commit時に"*** Please tell me who you are."と言われた時の対処法

docker/laravelを学習中に一瞬詰まったので備忘録として残します。

## エラー内容
```terminal
〇〇@〇〇MacBook-Pro docker-laravel-handson %　git commit -m "feat create docker app container"

#ここからエラーメッセージ↓
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '○○@○○noMBP.(none)')
```

調べると、参考になる記事がありました。

> グローバル設定のuser.useConfigOnlyをtrueにすることで、グローバル設定も含め明示的にuser.name・user.email指定していないとコミットができなくなります。
["https://dev.classmethod.jp/articles/git-use-config-only/"](URL "Gitのリポジトリごとにコミット時の名前とメールアドレスの設定を促す方法")

## まとめ
社内開発、個人開発を同時並行で行う際はアカウントの切り分けができるので便利だと思いました。逆にどちらか一方の場合は特に意識することがなさそうなので、configで設定してしまった方が楽ですね。

["Git公式ページ"](https://github.blog/2016-03-28-git-2-8-has-been-released/)
【PHP】PHPで配列操作を極めたい

# コード
```PHP
<?php
foreach(['a'=>[1,2,3],'b'=>[4,5]] as $key => $array){
    echo $key,'=';
	foreach($array as $n){
        	echo $n;
    }
    echo PHP_EOL;
}
```

# 結果
```javascript
a=123
b=45
```
パクることは決して悪いことではない

新人教育で伝えます。

### 「パクることは決して悪いことではない」


## TTP(徹底的にパクる)
某企業で受け継がれるTTPという言葉。

- T
徹底
- T
的に
- P
パクる

営業やマーケティングなどビジネス用語として使われる言葉ですが、エンジニア初心者の方に知ってほしいため、この言葉を伝えております。

## パクるって良いの？
パクる
決して良い言葉として捉えることができませんが、グーグル検索・先輩からのアドバイス、これ全てパクる(＝真似る)と考えます。
もちろん、著作権的な問題はNGですけどね。

分からないことは、

真似る⇒真似ぶ⇒学ぶ

「学ぶ」の語源は「真似ぶ」であるという説があることから、パクることは決して悪いことでないと考えています。

## パクるから進化
パクった情報を、InputしてOutputすることで、自身のスキルとなります。
例えば、Outputとして、誰かに教えた際に、相手の理解度が低い際には、自身の理解度が低いのか？もう少し分かりやすい説明は無いのか？と自問自答して解決することで、自身のスキルアップに繋がります。

## おわり
分からないことは、決して、恥ずべきことではなく、当たり前のことです。

### 先ずは真似ることです:v:

真似たら、InputしてOutputしましょう。

私が考えるInputは・・・
1. パクって良いコードはデバッグして流れを掴む単純に真似ると意味ないです。
2. パクって良いコードを少し変えてみる。(例えば、条件式を変えてみる）

私が考えるOutputは・・・
1. 誰かに説明する。(ブログではなく、直接！)

Output少ない^^

おわり。
Instagramのインサイトをスプレッドシートで確認(API)(GAS)(定点観測)



# 前提
新しいことは紹介していません。
備忘録的投稿です。
参考記事のリンクが集めてあります(助けられました、ありがとうございました)。

#  目的

「Instagramビジネスアカウントの売上が伸び悩んでいる気がするが、原因が分からない」知人の、現状把握のお手伝い

#  ポイント

・今回目指しているのは、あくまで現状把握→課題発見までの部分

・仮説検証というより仮説探索

・「○〇な気がする…」といったなんとなく感じている問題を、定量指標で確認できるようにしたい

・インサイトは90日前までしか遡れないので、毎日の定点観測をスプレッドシートに残しておきたい

・SQLで扱える形に加工して、データから何らかの傾向(仮説)をつかみたい(筆者の勉強もかねて)　

# やること

以下記事を参考に、定点観測できる仕組みをつくる

[InstagramのインサイトデータをGoogle スプレッドシートに自動で登録する方法【API使用】 | Yamablog [ ヤマブログ ]](https://yamatk12.net/instagram-to-googless/)

[Instagram Graph APIの使い方とサイトに埋め込む方法 v5.0対応【2020年3月最新版】 | 西尾市・岡崎市・名古屋のホームページ制作はネイビーモバイル](https://navymobile.co.jp/instagram-graph-api)

[Instagram Graph APIとGAS（Google Apps Script）を使ってインスタグラムのフォロワー数を自動的に日々記録する - Qiita](https://qiita.com/joh_luck/items/af6f02c43e2f4497e15e)

# つまづいたところ

・アクセス許可項目を追加・変更したかったのでアクセストークンを取得しなおしたが、upoloadingの状態から進まなかった

→ページ更新し、一旦アクセス許可項目を0→必要なものだけ追加でリトライ成功

★長期アクセストークンを取得するステップをもう一度やり直す必要あり

・GASで実行ボタンが押せない(関数がないとの表示)

→一旦保存すると、実行ボタンおせるようになる

・実行したがオブジェクトがみつからないとの表示

→コードの各自変更部分から【】カッコを消し忘れていた(うっかり)

　スプレッドシートのシート名をコードと対応させていなかった(うっかり)

# ネクストアクション

ある程度たまったらSQLでデータ取得→加工→可視化(別ツール？)

# ちなみに・感想

・集まったデータをどんな風に分析すればいいのかは、こちらの記事が分かりやすそうだった（他も探し中）

[https://www.comnico.jp/we-love-social/business-profile-instagram-insight-2](https://www.comnico.jp/we-love-social/business-profile-instagram-insight-2)

・pythonの勉強もしているのでこちらもトライ。難しいところはなく成功

https://www.cloudnotes.tech/entry/instagram_graph_api

・今定点観測できる指標は、フォロー数・フォロワー数・投稿数・リーチ数・インプレッション数・プロフィール閲覧数だけど、他の指標もみられるようにしたいな(必要だと判断したら)
AWSを勉強するならGCPかAzureもご一緒に

かなりポエムです。

# AWS勉強したがる人多いですよね
良いことだと思いますし、技術者として必須科目に近い存在だと思います。ただ、AWSだけで良いのでしょうか？
確かに、AWS関連の就職口は、他のクラウド技術と比較し多いと思いますが、ある意味レッドオーシャン。星の数ほどいるAWS技術者との差別化はどうしましょう？
# といいつつ差別化が目的ではない、AWS以外のパブリッククラウドを一緒に習得する理由
例えば、IaaS。AWSでいえば、EC2なわけですが、EC2を使おうとおもえば、ELBやEBS、VPC等の周辺のサービスは、Availability Zone(Az)、および、冗長構成の考え方を理解するべきです。が、考え方によっては、なんでELB入れなきゃいけないの？Azわけるの面倒くさいな。。。とか疑問が思いついても不思議ではありません。
# そこで他のパブリッククラウドではどうなっているのか考える？
そこで、GCPもしくはAzure。IaaSはそのそもコモディティ化しているので、おなじような実装がされているはずです。AWSで実施した内容を、GCPやAzureでも再現しようとすれば、それぞれのクラウドの特徴、得手不得手も気が付くでしょう。また、その際、各手順の根本的な必然性も理解できるはず。その気づきは、ひとつのクラウドしか使っていないと気が付かないモノです。
# そしてそれは自身の強みになる
ということです。
Mapbox GL JS ロードされたタイルの情報を取得する

タイルがロードされた時に、そのタイルの情報を知りたい場合は
[こちら](https://docs.mapbox.com/mapbox-gl-js/api/events/#mapdataevent)のイベントを使用し、
```
    map.on('sourcedataloading', (e) => {
        if(e.sourceId=='composite'){
            if(e.tile!=undefined){
                var ca = e.tile.tileID.canonical; // tileID{x/y/z/key}
                var num = Math.pow(2,ca.z); // tile総数
                var tid = num*ca.y+ca.x;
                var pix = ca.key/tid; // tile pixel size?
                console.log(ca.x+','+ca.y+','+ca.z+':'+ca.key+':'+num+'//'+tid+':'+pix);
            }
        }
    });
```
のようにすることで取得できます。
【夏休み企画】#IT用語一問一答【毎朝投稿25日目】SSO

# この記事を読むと、、
- 「関連用語」を使って「SSO」を説明できるようになる
- 「SSO」がもっと好きになる(多分)

# 関連用語
federation / SAML 2.0 / OIDC / JWT / OAuth 2.0

[**復習用**] 記事の内容を見る前に上記の言葉で「SSO」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/95545bf6856236dc8c54

# SSOとは
SSO = Single Sign-On = 一度の認証処理で複数のアプリケーションを利用できる仕組み
- アプリごとにパスワードを作りまくらなくてよくなる👏
- **federation** = 連邦化 = 管理ドメインをまたがって個人のdigital identityを結びつけること
    - SSOはfederationの仕組みの一つ

- cf. Authentication = 認証 = 本人確認のこと
    - 以下の3つの方法で確認する
        - something you know
            - ex. パスワード
        - something you have
            - ex. スマートカード
        - something you are
            - ex. 生体認証
- cf. Authorization = 認可 = ユーザーごとに適切な権限をわたすこと
    - ex. 部長は編集+閲覧可、それ以外は閲覧のみ可

#### SSOの代表的な実装
- **SAML 2.0** = Security Assertion Markup Language 2.0
    - 認証、認可を行うためのXMLベースの規格
- **OIDC** = OpenID Connect
    - 認証もできるようにしたOAuth 2.0の拡張規格
    - Access Tokenに加えて電子署名されたID Tokenも発行することで認証する
    - ID Tokenは**JWT** = Json Web Tokenという形式で書かれていて以下の情報などを持つ
        - tokenの発行者
        - tokenの貰い手
        - tokenの有効期限
        - 署名アルゴリズム
        - 電子署名した文字列
    - cf. **OAuth 2.0**
        - 認可を行うためのオープンスタンダード
        - 認可サーバーからAccess Tokenをもらうことでリソースにアクセスできる
        - OAuthだけでは認証ができない
            - 具体的には、Access Tokenを使いまわしてなりすましができちゃったりする

# 参考資料
- https://en.wikipedia.org/wiki/Single_sign-on
- https://en.wikipedia.org/wiki/Federated_identity
- https://en.wikipedia.org/wiki/SAML_2.0
- https://jwt.io/introduction
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その036

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: データと自動化
データ管理と分析管理の演習

にある練習問題4問目をご紹介します

解説動画もご確認ください

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

https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-security-and-data-management/review-data-management?trail_id=administrator-certification-prep

問題はこちらです

![０００４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f96f1422-99cb-1703-c55e-39f2b7e9d9e1.png)


正解はDです


ダッシュボード閲覧者に設定すると各ユーザごとに閲覧者が異なるダッシュボードに設定可能です


Bのダッシュボードフォルダーはダッシュボードの格納場所なので閲覧には関係ないです


Aの検索条件も間違いです

間違っている理由は動画で分かりやすく解説してますのでご確認ください

<iframe width="560" height="315" src="https://www.youtube.com/embed/zWjzA0Pq0PM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
LRA1 にプログラムを登録する

「ワンライナーでウェイトをかけて表示する bash スクリプト」
https://qiita.com/nanbuwks/items/02a78c72fb22e610e6b8

で作ったワンライナーを使って、株式会社アイ・ツーの LoRa モジュール LRA1 にプログラムを登録します。

LRA1 は BASIC プログラムで動かすことができますが、プログラムを登録するにはシリアルポートから1行1行入力する必要があります。ターミナルソフトから一括コピペしようとすると、処理の取りこぼしが発生することがあるので、休み休み入力します。そのために上記ウェイトをかけて表示するワンライナーを使用します。


# 環境

- Ubuntu Linux 22.04 LTS Desktop Ja
  -  基本的に Bash の動く環境ならどれでも動くはず。
- USBシリアルモジュール で LRA1 と接続済み。
  -  ポートは /dev/ttyUSB0
-  通信ソフトとして picocom を使用
  - 改行コードが適切に処理できるなら何でもいいはず。
- プログラムは test.bas というファイルで保管しています。
  - 改行コードは lf です。異なる改行コードで保管している場合は必要に応じ、適宜スクリプトを変更する必要があります。

# 予備知識

LRA1 の改行コードは CRLF です。そのために picocom やスクリプトで改行コード変換の設定を使っています。

# 前準備


まず、picocom でパラメータを指定してポートを開きます。

```

$ picocom -b 115200 -r -l --omap crcrlf /dev/ttyUSB0
port is        : /dev/ttyUSB0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
stopbits are   : 1
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : yes
hangup is      : no
nolock is      : yes
send_cmd is    : sz -vv
receive_cmd is : rz -vv -E
imap is        : 
omap is        : crcrlf,
emap is        : crcrlf,delbs,
logfile is     : none
initstring     : none
exit_after is  : not set
exit is        : no

Type [C-a] [C-h] to see available commands
Terminal ready

>

```

プログラムが書き込めるようにし、既存のものを消去します。

```
>edit 1
OK
>>new
OK
```

Ctrl+A,Ctrl+X を押して、picocom を終了します。
```
>>
Terminating...
Skipping tty reset...
Thanks for using picocom


```

送信している状況をモニターするために、送信しているシェルとは別に /dev/ttyUSB0 をモニターします。
```
$ cat /dev/ttyUSB0 

```

別シェルを立ち上げ、上記スクリプトで test.bas を送ります。

```
while read line; do echo -n $line ; printf "\r\n";sleep 1;
 done < test.bas > /dev/ttyUSB0
```

モニター用のシェルで、送られているのが確認できます。

```
>>10 ' ------------------initialize----------------------
>>20 ' ------check watchdog (if $80=ctrl then error stop occored)
.
.
.
>>860 '--- ccs811 nwake up
>>870 Outp 28,0
>>880 Goto _ccs811measure
>>
```

送り終わったら、モニター用のシェルは Ctrl+Cで終了します。

```
>>^C
```

picocom を立ち上げて保存処理などを行います。

```

$ picocom -b 115200 -r -l --omap crcrlf /dev/ttyUSB0
.
.
.
Type [C-a] [C-h] to see available commands
Terminal ready

>>psave
OK
>>

```
【Git】リモートブランチが削除されているのにローカルで見ると残っている時の削除方法【GitHub】

<h2>はじめに</h2>
エラーを解消するためにリベースやら色々やった際に「revert-1-{ローカルブランチ名}」というブランチが生成されていて、
もう必要ないので削除しようとした所、削除されているのに表示されているというよくわからない状態になってしまったので、しっかり抹消できる方法を残しておきます。
<h2>とりあえず</h2> 
「revert-1-{ローカルブランチ名}」このブランチを削除するために、　

``git branch -d origin　{ブランチ名}``というコマンドを実行。(自分の環境では{ブランチ名}はrevert-1-feature/TopPage_Responsiveです)
```
$ git branch -d origin/revert-1-feature/TopPage_Responsive
error: branch 'origin/revert-1-feature/TopPage_Responsive' not found.
```
お？？どうやらローカルブランチを削除する場合このコマンドでいけるが、リモートブランチを削除するコマンドはまた別にあるみたいなので調べました。
<h2>リモートブランチ削除コマンド</h2>

``git push --delete origin <remote branch name>``コマンドで行けそうなので実行。すると、、、

```
error: unable to delete 'origin/revert-1-feature/TopPage_Responsive': remote ref does not exist
```
ブランチを確認すると
```
$ git branch -a
* develop
  feature/ContactPage_AdminPage
  feature/TopPage_Responsive
  main
  remotes/origin/develop
  remotes/origin/feature/ContactPage_AdminPage
  remotes/origin/feature/TopPage_Responsive
  remotes/origin/main
  remotes/origin/revert-1-feature/TopPage_Responsive //こいつ消したい
```
どうやらまだ残っているみたいだ。
<h2>解決方法</h2>

``git remote prune origin``このコマンドで消せるみたい！実行してブランチを確認すると、、、

```
$ git branch -a
* develop
  feature/ContactPage_AdminPage
  feature/TopPage_Responsive
  main
  remotes/origin/develop
  remotes/origin/feature/ContactPage_AdminPage
  remotes/origin/feature/TopPage_Responsive
  remotes/origin/main
```

消えてますね！お疲れ様でした！

<h2>参考記事</h2>

https://www-creators.com/archives/1062


https://qiita.com/hy3/items/96267f9cce825e685baf
関数リテラル、関数宣言、関数コンストラクタによる挙動の違いをまとめた

関数リテラルだとうまくいかないけど、関数宣言で書き換えてみたらうまくいった、なんてことがあったので、それぞれについてまとめてみます。
調べて自分の言葉でまとめているので、言い回しが不適切な部分もあると思います。見つけられた場合は訂正してくださると助かります。

# 宣言の違い
## 関数リテラル
```js
let func1 = function(){
    console.log("関数リテラル");
}
```
無名関数として宣言する。
再帰関数であれば下のように名前を付けて宣言するが、基本上で良い。
（再帰関数でも上のようにして宣言出来なくはない。）

```js
let func1 = function function1(){
    console.log("関数リテラル");
}
```
関数リテラルは、「関数式」、「function演算子」とも呼ばれる。

## 関数宣言
```js
function func1(){
    console.log("関数宣言");
}
```

「function文」とも呼ばれる。


## 関数コンストラクタ
```js
let func1 = new Function(console.log("関数コンストラクタ"));
```
「functionコンストラクタ」と呼んだ方が適切なのかもしれない。
が、ここでは変わらず関数コンストラクタと書く。
```js
let 関数名 = new Function(引数1,引数2,…,実行する処理1;実行する処理2;…);
```
上のようにして書くが、newは省略でき、引数はなくてもよい。

# 実験してみる
明らかに蛇足な記述もあるが、そのまま残して実験結果とする。
`console.log("a");`などは、関数が呼び出された場合、どの記述で呼び出されたのか分かりやすくするために書いた。
## 関数リテラル
```js
func1;
console.log("a");
func1();
console.log("b");
console.log(func1);
console.log("c");
console.log(func1());
console.log("d");

let func1 = function(){
    console.log("関数リテラル");
}

console.log("--------------関数記述後---------------------")

func1;
console.log("a");
func1();
console.log("b");
console.log(func1);
console.log("c");
console.log(func1());
console.log("d");
```
### 実験結果
関数記述前はどの式も関数を呼び出せなかったため、コメントアウトして実行した。
```
a
b
c
d
--------------関数記述後---------------------
a
関数リテラル
b
ƒ (){
    console.log("関数リテラル");
}
c
関数リテラル
undefined
d
```
先に書くが、`func1;`ではどの関数の宣言の仕方でもerrorとなった。
また、cとdの間の`console.log(func1());`で起こっていることは、
1. ()内のfunc1()が実行され、関数リテラルと表示される
2. func1()の戻り値をconsole.logしようとするが、設定されていなかったので`undefined` と表示される

と考えた。

## 関数宣言
関数の記述以外の部分は関数リテラルの場合と同じなので省略する。

```js
function func1(){
    console.log("関数宣言");
}
```
### 実行結果
```
a
関数宣言
b
ƒ func1(){
    console.log("関数宣言");
}
c
関数宣言
undefined
d
--------------関数記述後---------------------
a
関数宣言
b
ƒ func1(){
    console.log("関数宣言");
}
c
関数宣言
undefined
d
```

## 関数コンストラクタ
```js
let func1 = new Function(console.log("関数コンストラクタ"));
```
こちらも関数記述前は呼び出す

### 実行結果
```
a
b
c
d
関数コンストラクタ
--------------関数記述後---------------------
a
b
ƒ anonymous(
) {
undefined
}
c
undefined
d
```


# 主に参考にしたサイト
* [関数宣言と関数式の違いとは？［JavaScript］](https://atmarkit.itmedia.co.jp/ait/articles/1605/18/news018.html)
ワンライナーでウェイトをかけて表示する bash スクリプト

LoRa モジュール LRA1 にプログラムを転送しようとしたが、コピペだと処理が追いつかなくて取りこぼす。なのでウェイトをかけながら転送したい。ここでは転送に応用するために、ウェイトを書けながらファイルを表示するスクリプトについて考えてみる。
使い捨てできるようにワンライナーで。




# 環境

- bash (Ubuntu 22.04 LTS)


```
$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```


# ウェイトをかけながらファイルを表示する

## 一行ごとに0.5秒のウェイトをかける

```
while read line; do echo $line;sleep 0.5; done < test.bas

```


## 一文字ごとに0.1秒のウェイトをかける

```
while IFS= read -rN1 char; do if [ '%' = "$char" ];then printf "%%";else printf "$char";fi; sleep 0.1; done < test.bas
```

最初は単に
```
while IFS= read -rN1 char; do  printf "$char"; sleep 0.1; done < test.bas
```
としてましたが、test.bas に % が含まれているとそこで `printf: `%': missing format character` エラーが出ました。 printf の代わりに echo -n を使おうとしましたが、改行が無視されてしまいますね。

そこで上のように `%` かどうか判定するようにしたのですが、 `'%' = $char` としていたら今度は `bash: [: %: unary operator expected` エラー。調べてみたら、`'%' = "$char"` とすれば 変数の中身を解釈せずに処理するらしいです。
 

# CRLF を変換するフィルターを追加して、1秒ごとに1行表示する

test.bas は Linux の LF 改行コード。CRLFに変換しながら表示します。

```
 while read line; do echo -n $line ; printf "\r\n";sleep 1; done < test.bas
```


最初は
```
while read line; do printf "$line\r\n";sleep 1; done < test.bas
```
としていましたが、やはり `%` とか `\` とかがエラーが出るので、それらを解釈しない echo -n を使用しました。
【React】繰り返し処理で複数の画像を表示する

# やりたいこと
1. 親コンポーネントで画像のsrcとなるURLが入った配列を作る
1. 親コンポーネントから子コンポーネントにpropsで配列を渡す
1. 子コンポーネントでimageタグを作成、srcは親コンポーネントからもらったURLを参照する
# 実装
## 親コンポーネント
```react
const Parent = () => {
    const [srcArray, setSrcArray] = useState(['URL1','URL2','URL3']);
    return (
        <>
            <Child srcArray={srcArray} />
        </>
    )
}
```
## 子コンポーネント
```react
const Child = (props) => {
    const imageLists = props.srcArray.map((src,i) => {
        return <li key={i}><img src={src} /></li>
    })
    return (
        <>
            {imageLists}
        </>
    )
}
```

# 解説
親コンポーネントから渡された、画像のsrcが入った配列を受け取る。
配列なので、mapで処理を行う。
## mapメソッド
mapはJSの配列についてのメソッドで、
コールバック関数という、引数に何らかの処理を定義して使う関数です。
引数に指定した処理を行い、その結果を新しい配列として返します。
処理は配列の中身を取り出して行います。

今回は、配列の中身であるURL1,URL2,URL3をimageタグのsrc属性に指定していく。
## keyについて
mapを使う場合、`key`を指定しないと注意される。`key`を指定しないとどの要素が変更されたのかReactが認識できない場合があるので、`key`は指定したほうが良い。`key`はユニークなものである必要がある。
要素の並び順が変わったらインデックス番号も変わってしまうため、インデックス番号を`key`として使うのはあまりお勧めされていない。
今回は要素の並び順は変えないので、インデックス番号を使いました～。
composer require maatwebsite/excel  に失敗した


PHP 8.1.6 <br>
Laravel Framework 8.83.24<br>
<h3>エラー内容</h3>
Installation failed, reverting ./composer.json and ./composer.lock to their original content.
<h3>解決法</h3>

<ul><li>前提としてphpoffice/phpspreadsheetのパッケージが必要らしい</li></ul>
<p>composer require phpoffice/phpspreadsheetを実行</p>
<p>composer.json内に"phpoffice/phpspreadsheet": "dev-NumberFormatMask-Helpers"が記述される

<ul><li>バージョンが対応していないので直す必要がある</li></ul>
<p>composer.json内の上記部分を"phpoffice/phpspreadsheet": "^1.9"に変更</p>
<p>インストールできた</p>
第６回AIEDGEコンテスト　KV260のハードウェア構築ブログのまとめ

# 第６回AIEDGEコンテスト

２０２３年１月２３日まで、AIエッジコンテストが行われています。

https://signate.jp/lp/ai-edge-contest/2022

そこにKV260を使った必要なハードウェア構築をいくつかのブログでまとめました。
参考にしてください。

なお、２０２２年１１月末日までにコンテスト参加の意思がある方はKV260をいただける機会があります。
条件はVitisでハードウェア構築している方です。
FPGAを始めて見たい方は、ボードが無くても出来ますので、参加してみてください。


# 使用するパソコン
推奨はUbuntu18.04、Ubuntu20.04が搭載されているパソコンです。AIの学習をするならば、GPU付きが望ましいです。
ただ、ハードルが高くなるため、Windowsで動くように、ブログ記事は書いています。
ここで紹介しているブログは全て、Windows11で動作確認をしています。


# ブログ紹介

Windows 11にWSL2を使って、FPGA開発環境を整えた例です。

https://qiita.com/basaro_k/items/04eea702c83a927f920c

KV260　SDカードイメージの作り方です。バージョン２０２２．１の場合、素直にKV260が動かないので、その回避方法と、今回ブログを使う上でのライブラリー導入の仕方が書いてあります。

https://qiita.com/basaro_k/items/b164a56e978001b8161e


KV260を使うためには、Vitisプラットフォームを作成する必要があります。
ここでは、以前より簡単にVitis プラットフォームを作成する例を紹介しています。

https://qiita.com/basaro_k/items/7295b214f80226b28e7a

今回のAIエッジコンテストの課題でもある、RISCVを搭載させるためのブログです。
現在のところ、ハードウェア構築の部分まで記述しています。ソフトウェアの部分は随時追加させていただきます。
AIエッジコンテストで、KV260ご希望の方は、このブログの５番までやることを推奨しています。

https://qiita.com/basaro_k/items/7001f006722b249a7404

Vitis AIをKV260で動作させるためのブログです。
AIのHelloWorldである、MNISTまでをKV260上で実行しています。
AIEDGEコンテスト参加者で、KV260をご希望の方はここの１番を終了後、ファイルを提出すれば、
確率が上がります。

https://qiita.com/basaro_k/items/dc439ffbc3ea3aed5eb2




以後、リファレンスデザインのまとめ、ブログは、随時更新していきます。
bash スクリプトベースのWebサーバー負荷テストフレームワーク

# 概要

仕事でWebサーバーの負荷テストを何回もやってきたのですが、毎回、似たようなコードを書くモチベーションが下がってきましたので、自分の過去の知見でしかありませんが、テストフレームワークとして整理して、オープンソース化することにしました。

ソースコードおよび利用手順は、以下で公開しておりますので、興味のある方はぜひご覧ください。

https://github.com/tmori/web-server-load-tester

# 設計で目指したこと

目的は、「Webサーバーの負荷テストを実行するための簡易テストフレーム作る」です。
ここで、「簡易」とあえて添えているのは、あまり複雑な作りにせず、可読性があり、本フレームワークを利用する人が簡単に改造できるような構造を目指したいと考えたためです。

細かなプログラムの仕様を書くより、単純な構造でソース読みやすく作っておけば、長く利用できるのではないかと。少なくとも自分だけは ^^;※

※自分のパソコンのどこかに置いておいて、後で思い出せなくることがよくあります。

# 設計概要
クラス設計はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/1f2a33df-4452-c10e-ccef-7be462fea85e.png)

Webサーバーの負荷テストでは、Web APIを連続して多重で実行するケースが多いと思われ、本フレームワークでは、「連続実行」と「多重実行」に重点を置いています。

一方で、Web API発行部分やテスト結果の確認部分は、プラグイン(インタフェース実装)として個別開発する形としました。

入り口は bash スクリプトにしていますので、そこから先は自分に好みの言語で作られたプログラムを呼び出してもらうことになります。


# テスト実行時のデータフロー

テスト実行時のデータフローは下図の通りで、テスト項目毎に TestController を呼び出します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/7b0f21ee-61a8-173f-7587-f3ca58db786d.png)

テスト項目の内容は、以下のとおりです。
必要な項目を埋めて頂くことで、テスト自動実行させることができます。

* No
  * テスト項目番号
* Multiplicity
  * 多重実行数
* SetUp
  * テスト実施前のセットアッププログラム名
* TearDown
  * テスト実施後の後始末プログラム名
* Prepare
  * テスト事前準備用のプログラム名
* Do
  * テスト実行プログラム名
* Done
  * テスト終了時に実行するプログラム名
* DoRepeatNum
  * Do プログラムを実行する回数(連続実行数)

サンプルテスト項目定義例はこちら。

https://github.com/tmori/web-server-load-tester/blob/main/test-item/sample-test-item.csv

# 補足
まだ出来立てのほやほやですので、粗いところがあると思います。

今後、仕事で利用する中で改善を図っていく予定ですが、もし何か改善点などあればご連絡いただけると嬉しいです。
コンティグからラフにテロメア配列を探したい

# 背景
HiFi リードをhifiasmでアセンブルすると、運がいいとT2Tで繋がったコンティグも出力されるようになった。
### 目的
実際にどのコンティグがT2Tなのか調べたい。
## 方法
テロメア配列が密集している領域をコンティグから探してくる。
###環境
`samtools, bedtools` がインストールされていればOK.
`seqkit`はお好みで。

#### Step.0 コンティグを長さ順にソート(やってもやらなくてもよい)
ついでに100bpごとにfastaを区切っている
```shell
seqkit sort -l -r hoge.p_ctg.fa | \
seqkit seq -w 100 \
>sorted_hoge.bp.p_ctg.fa
```
#### Step.1 samtoolsでindex作ってchrom.sizes作る
```sh
samtools faidx sorted_hoge.bp.p_ctg.fa
cut -f 1,2 sorted_hoge.bp.p_ctg.fa.fai \
>sorted_hoge.bp.p_ctg.chrom.sizes
```
#### Step.2　bedtools makewindowsで任意のサイズのbinに区切ったbedファイルを作る
今回は10kbごとに区切った
```sh
bedtools makewindows -g sorted_hoge.bp.p_ctg.chrom.sizes -w 10000 >sorted_hoge.bp.p_ctg_10kb.bed
```
#### Step.3　bedtools getfastaで任意のサイズのbinに区切ったbedファイルに配列情報を付け足す
```shell
bedtools getfasta -fi sorted_hoge.bp.p_ctg.fa \
-bed sorted_hoge.bp.p_ctg_10kb.bed -tab \
>sorted_hoge.bp.p_ctg_10kb_seq.bed
```
#### Step.4　シェルでテロメア配列が任意のbinの中に何個存在するか数え上げてwigファイルとして出力
```sh
cat sorted_hoge.bp.p_ctg_10kb_seq.bed | \
awk 'BEGIN {OFS="\t"}{print $1,$2,$3, gsub(/AAACCCT|AGGGTTT/,"",$4)}' \
> sorted_hoge.bp.p_ctg_10kb_seq_telomere.wig
```
### 結果
IGVで眺めてみた
![telomere-like_seq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590306/1b2f2379-65c0-908e-7ff9-9e128da6fb60.png)
コンティグの両末端にテロメア配列っぽいのピークがみえるのでT2Tっぽいが、中央部にもテロメア配列がかたまっていたりするので、よくわからん。
### 考察
なんかもっとスマートな方法がある気がするので誰か教えて！
三項演算子とは？

この記事では
php7.4.21
Database server: MySQL Version 5.7.34
を使っています。

三項演算子を使うことで、if分を簡略化することができる。
例：

if分の場合
$array[
    'key' = 10,
];

if(isset($arry['key'])){
    $arry['key'] = *10;
}else{
    $arry['key'] = 1;
}

三項演算子を使った場合
$array[
    'key' = 10,
];
$arry['key'] = isset($arry['key']) ? $arry['key'] * 10 : 1;

三項演算子を使うと、if分の箇所が1行に簡略化できた。
どこにどの値が入ってるのかは、以下の通り。

値の出力先 = 条件式 ? Trueの場合の値 : Faulseの場合の値;

配列の初期化や変数の初期化の際によく使われる。
openpyxlでiter_rows()を使ったワークシート行のイテレーションを中断するとファイル削除できなくなる

openpyxlでエクセルファイルを開いたのちに削除しようとしてもプロセスがファイルをブロックしていて削除できなかった。

Windows環境
* Windows8.1
* Python 3.10.7
* openpyxl 3.0.10

```python
import os
from openpyxl import load_workbook

FNAME = 'sample.xlsx'
# EXCELファイルをオープン
wb = load_workbook ( FNAME, read_only=True )
sheet = wb.active
# 行をイテレーション
for row in sheet.iter_rows() :
    # なにか処理
    # イテレーションを中断
    break
# Workbookオブジェクトを閉じる
wb.close()
# EXCELファイルを削除  --> Win32エラー
os.remove ( FNAME )
```

根本的な対策はみつからなかった。
イテレーションを中断しないように変更する。

```python
import os
from openpyxl import load_workbook

FNAME = 'sample.xlsx'
# EXCELファイルをオープン
wb = load_workbook ( FNAME, read_only=True )
sheet = wb.active
# 行をイテレーション
is_terminated = False
for row in sheet.iter_rows() :
    # これ以上処理がひつようないならば空回しする
    if is_terminated is True: continue 
    # なにか処理
    # イテレーションを中断したい
    is_terminated = True
# Workbookオブジェクトを閉じる
wb.close()
# EXCELファイルを削除 --> 成功
os.remove ( FNAME )
```
キャパシティプランニング

# キャパシティプランニングの目的と概要
## 最適な機種の選定と設備の決定
### 機種の選定
```ユーザーの要求水準と必要な性能```を持つ機種の選定
### 設備の決定
```使用頻度、使用時間、データ量を考えた容量や台数```の決定

## 経済性と拡張性への配慮
将来のデータ量を考えた機能選択/資源共有を配慮して経済性を考えた```システム構築```

## 利用者のへのサービスの向上
ヒューマンインタフェースの検討/待ち時間を作らない```システム性能の決定```

# システム利用増大や付加への対応
## スケールアップ
ここのコンピュータやサーバーの能力を上げることで```負荷を賄う```考え方

## スケールアウト
コンピュータやサーバの台数を増やして```負荷分散```することで能力を上げて対応する考え方。

## プロビジョニング
将来的なシステム利用予測に基づいて、```あらかじめ必要となるシステム利用環境を準備```しておくこと。
通信環境、サービス環境、障害時の緊急対策などを含む。

# トランザクション処理時間の予測
オンラインリアルタイム処理の```応答時間を予測するためには、待ち時間モデル```が使われる。
代表的な「M/M/1」モデルだ。

http://objectclub.jp/technicaldoc/monkey/s_wait

## 気づき
使用率が上がるとその分応答時間は長くなるのか。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
【Laravel】特定のページのみログイン後、直前のページにリダイレクトさせる方法

特定のページからログインページに遷移してログインした時に、**元のページ（ログインページに遷移する前のページ）** にリダイレクトさせる方法を書いていきたいと思います。

## 直前のページに戻る方法

まず、ログイン後に直前のページに戻る方法ですが、それは下記の記事が参考になります。

[【Laravel】ログインした後、固定ページに飛ばさずにログインボタンを押した画面に戻りたい。 - Qiita](https://qiita.com/nekyo/items/f179875a8bcfba671785)
こちらの記事では`$_SERVER['HTTP_REFERER']`を使って直前のURLを取得していますが、laravelで用意されている`url()->previous()`を使って直前のURLを取得することも可能です。

```php:LoginController.php
    /**
     * Show the application's login form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showLoginForm()
    {
        // 直前ページのURLを取得
        $prevUrl = url()->previous();
        session(['url.intended' => $prevUrl]);
        return view('auth.login');
    }
```

## 特定のページのみリダイレクト先を指定する
直前のページへのリダイレクト方法を元に、特定のページからログインページに遷移してきた場合のみリダイレクト先を指定する方法を書いていきます。
やることは簡単で、該当するページのルート名を格納する配列を作って、直前のページのルート名がその配列の中に含まれている場合のみセッションをセットするようにすればいいだけです。

### 直前のページのルート名を取得する方法

```php
app('router')->getRoutes()->match(app('request')->create(url()->previous()))->getName();
```

### ルーティングの設定
```php:web.php

Route::get('hoge', [
    'uses' => 'HogeController@hoge',
    'as' => 'hoge'
]);
```

```php:LoginController.php
    // リダイレクトの対象となるルート名を定義
    private const PREV_REDIRECT_ROUTE_NAMES = ['hoge'];

    /**
     * Show the application's login form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showLoginForm()
    {
        // 直前ページのURLを取得
        $prevUrl = url()->previous();
        // $prevUrlを元に直前ページのルート名を取得（存在しない場合は404になります）
        $prevRouteName = app('router')->getRoutes()->match(app('request')->create($prevUrl))->getName();
        if (in_array($prevRouteName, self::PREV_REDIRECT_ROUTE_NAMES, true)) {
            // ログインページの直前ページのルート名が定数PREV_REDIRECT_ROUTE_NAMESに含まれていたらログイン後そのページにリダイレクトさせる
            session(['url.intended' => $prevUrl]);
        }
        return view('auth.login');
    }
```