OmniAICreator/Qiita-1.07M huggingface dataset:
マイクロサービスアーキテクチャの概念のおはなし

## マイクロサービスアーキテクチャとは
システムを、協調して動作する小規模なサービスに分割したアーキテクチャのこと。
サービスの境界をビジネスの境界に合わせることで、特定のコードがある場所を明確にし、大規模かつ複雑になることを回避する。

## 優れたサービスにするために
下記を念頭に置く必要がある
### 疎結合
サービス間の結びつきを疎結合にすること。
1つのサービスの変更に対して、単独でデプロイが可能となる。
### 凝集性
関連する振る舞いを一緒に配置し、関連しない振る舞いは別の場所に配置すること。
振る舞いを変更したい場合、1箇所変更するだけでリリースが可能となる。
また、コードが把握しやすくなり、重複したコードが発生しにくくなる。
### 境界づけられたコンテキスト


## サービスをどの程度小さくすれば良いか
言語やコードの依存関係に依っても異なるため、明確な回答はない。
Jon Eavesという方が、マイクロサービスを「2週間で書き直せるもの」と特徴付けている。

## マイクロサービスアーキテクチャのメリット
### 技術異質性
サービスごとに異なる技術を使う判断ができる。
最大公約数的になることが多い標準化された汎用的な手法を選ぶのではなく、ジョブごとに適したツールを選ぶことができる。
### 回復性
あるコンポーネントに障害が発生していても、その障害が連鎖しなければ、問題を分離してシステムの残りの部分を機能させ続けることができる。
### スケーリング
モノリシックサービスでは、すべてを一緒にスケールさせないといけないが、マイクロサービスでは、必要なサービスだけをスケールできる。
### デプロイの容易性
モノリシックサービスは全体をデプロイする必要があり、影響が大きくリスクが高くなる可能性があるが、マイクロサービスでは、1つのサービスに変更を加え、残りのサービスとは独立してデプロイすることができる。
### 組織名の一致
アーキテクチャを組織に一致させることができ、1つのコードベースで作業する人数を最小化し、チームの大きさと生産性を最適化する。
(小規模コードベースで作業する小規模チームの方が、生産性が高い傾向にある)
### 合成可能性
機能を再利用する機会を広げることができる。
外部の第三者にI/Fを提供している場合、状況が変わったら別の方法で組み立てられる。
モノリシックアプリケーションの場合は、機能分割や別機能としての作り込みが必要となる可能性がある。
### 交換可能にするための最適化
サービスのサイズが小さいことで、さらに優れた実装に置き換えるコストやすべてを削除するコストが管理しやすくなる。
(巨大で扱いにくいレガシーシステムは誰も触りたくない)
STSでSpring Boot＋Gradleのプロジェクトを作成する

## 前提
・STSのインストールが完了している
## 新規プロジェクトの作成
1. Gradleをインストールする
   - 「ヘルプ」>「Eclipseマーケットプレース」を押下する
   - 検索で「Buildship Gradle Integration」を入力してEnterを押下する
   - 一番上位の「Buildship Gradle Integration」の「インストール」ボタンを押下する
2. プロジェクトを作成する
   - パッケージ・エクスプローラーで右クリックをし、「新規」>「Springスターター・プロジェクト」を押下する
   - 各項目を入力する
       - 「名前」→プロジェクト名を入力
       - 「タイプ」→「Gradle - Groovy」を選択
       - 「グループ」→グループ名を入力
       - 「パッケージ」→パッケージ名を入力
       - 「説明」→プロジェクトの説明を入力
   - 「次へ」ボタンを押下する
   - 必要なものを選択する。例えば以下。
       - Spring Web
       - Spring Boot DevTools
       - Lombok
       - H2Database
       - Spring Data JPA
   - 「完了」ボタンを押下する
## Gradleを実行する
1. コマンドプロンプトで下記を実行する。
```
cd (プロジェクトのディレクトリ)
gradlew build
```
※Javaのエラーが出た場合、PathやJAVA_HOMEの環境変数のバージョン等を確認する
2. プロジェクト名を右クリック>「Gradle」>「Gradleプロジェクトのリフレッシュ」を押下する。
3. プロジェクト名を右クリック>「リフレッシュ」を押下する。
## プロジェクトの実行
プロジェクト名を右クリック>「実行」>「Spring Bootアプリケーション」を押下する。

- H2DBのコンソールにアクセスする場合
    - http://localhost:8080/h2-console
コードとInterface Builderの連携について



## はじめに
今までMain.storyboardに複数ViewControllerを作ってアプリ開発をしていました。しかし、今後storyboardを分割して開発をするにあたって、このstoryboardにあるViewControllerとコードで書いたViewController.swiftの関係ってどうなっているんだろうと思い、調べたことを記事にしました。
以降この記事ではこの二つを区別するため、
ViewController(コード) ※コードで書いたViewController.swift
ViewController(SB) ※Storyboardに作ったViewController
と書きます。

## 何を書いたか
アプリ起動から画面表示までのViewController(コード) と
ViewController(SB)の変遷を書きます。

## なぜ書いたか
本題を調べるにあたって、様々な記事を参考にさせていただいたのですが、私が基本的な部分を理解してなかったため、なかなか記事を読んでも理解が深まりませんでした。私自身の今回調べたことの整理を兼ねて、同じような疑問を持った方の参考になったら嬉しいです。

## 説明
それではアプリ起動→画面に表示までの流れに沿って説明していきます。

### 先に説明しておきたいこと
表現が正確かは自信がないですが、私の理解ではViewController(コード) とViewController(SB)の2つは別々にインスタンス化され、ViewController(コード)にViewController(SB)の情報が取り込まれてインスタンス化され画面に表示されているというイメージかと思いました。
この点を押さえた上で読み進めていただけたら幸いです。

### 準備
今回はXCodeで新規プロジェクトを立ち上げて、初期状態からInterfaceBuilderのViewControllerのルートビューを青にしただけのプロジェクトを例に使って説明していきます。![1f9070f2a6981d543f7d0312b73d6814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2182598/ef11b336-a926-2c5d-9af9-1895d9b58818.png)

### Main.storyboard読み込み
まずプロジェクトの初期状態だと、Info.plistが下の画像のような設定になっています。
![18dcb27eab24984cd4b0abeb1b4c96fc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2182598/c56dfe11-63fc-7942-c544-109acfba30ca.png)

一番下の行に、「Storyboard Name」とあり、これが最初に読み込まれる画面になるのですが、Mainが指定されています。Mainにはview controllerしかなく、Entry Pointに指定されているので、ViewController(SB)が読み込まれます。
最初の画像からもわかるようにViewControlle(SB)のCustom ClassはView Controller(コード)に指定されリンクされているので、次にViewController(コード)が自動でインスタンス化されます。

### init?(coder: NSCoder)関数
インスタンス化される際に、コード上では確認できませんが（おそらく内部で自動で呼ばれてる）[init?(coder: NSCoder)](https://developer.apple.com/documentation/foundation/nscoding/1416145-init)関数がよばれ、リンクされたView controller(SB)のファイルがデコードされて読み込まれます。この関数によって、ViewController(コード)とViewController(SB)のプロパティが統合され初期化されることになります。今回はしていませんが、この処理によってViewControllerに設定されたアウトレットやアクションなども接続がされます。
ただこの状態のままだとViewControllerのviewプロパティはnilの状態なので、viewが画面に表示される準備はできていません。

### viewプロパティ
UIViewControllerには[viewプロパティ](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621460-view)というものがあります。
ここに格納されたview階層が画面に表示されることになります。
この[viewプロパティ](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621460-view)が要求された時に[loadView()](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview)という関数が実行されます。
この関数によって関連づけられたViewController(SB)ファイルがロードされViewController(コード)のviewプロパティにview階層が設定され、青い画面が表示されることになります。

ちなみにこの[loadView()](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview)が行われ、画面に表示される準備ができた後、おなじみの[viewDidload()](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload)が呼ばれるようになります。



## 参考書籍・リンク
『親切すぎるiPhoneアプリ開発の本』
[Apple 公式ドキュメント　UIKit](https://developer.apple.com/documentation/uikit)
[Apple 公式ドキュメント　Foundation](https://developer.apple.com/documentation/foundation)


## 最後に
今まで、storyboard上で対応するViewControllerをCustom Classに設定すればリンクされる程度の理解でした。
調べていくとコード上で確認できない自動で行われている処理が多くあり、それがあって、簡単にViewControllerのリンクができていたことに気づきました。
しかし、storyboardの分割やカスタムセルを使ったり、Interface Builderを使わないで開発をするためにも、今回の内容は重要だと思います。
まだ理解が不十分な部分もあり、誤っている点もあるかと思いますが、理解が深まったら記事を更新していきたいと思います。

最後まで読んでいただきありがとうございます！
【Git】不要な新規ディレクトリやファイルをコマンド1発で削除する方法

## 背景

Git管理されているソースコードで開発をしているとします。

その過程で未コミットな新規(untrackedな)ディレクトリやファイルを削除したい時に、コマンド1発でそれを消す方法を恥ずかしながら最近知ったので、初心者向けに記録しておこうと思い筆を取りました。

## 状況

```bash:ディレクトリ構成
$ tree
.
├── committed.txt
└── uncommitted.txt
```

上記のようなGit管理されているソースがあり、ファイル名のとおりのcommit状況だったとするとgit statusを実行すると

```bash:git status
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	uncommitted.txt

nothing added to commit but untracked files present (use "git add" to track)
```

となります。

このようなシンプルな状況では`rm`コマンドを叩けば良いですが、複数ディレクトリにuntrackedなファイルが散らばっているときは非常に面倒です。

## 解決策

Gitの`clean`コマンドを使うとuntrackedなファイルを削除することができます。
`.`の箇所でパスをしています。

```bash:git clean
$ git clean -f .
Removing uncommitted.txt

$ git status
On branch master
nothing to commit, working tree clean
```


ちなみに`-n`をつけるとドライランとなり、消されるファイルを事前に確認することができます。
```bash:git clean dry run
$ git clean -nf .
Would remove uncommitted.txt
```

## まとめ
Git管理されているソースから不要な新規ファイルを消したい場合は下記の要領でGitのcleanコマンドを使うと1発で消すことができます。

`git clean -f .`

##  参考
https://git-scm.com/docs/git-clean
-4- 1Weekゲームジャムに参加した感想。

### 　目次
> * 感想
> * これからのゲーム制作手順
> * 完成させたゲームの紹介

#  　感想

結論から言うと、やり切った後は**かなり力がついた**と感じました。
そしてなにより**面白かった**です。企画者にそのゲームを遊んでもらい、どんな反応をされるのか。
そういった**ドキドキワクワク感が感じられる素晴らしい企画**だと思います。
他の参加者が作ったゲームのレベルも知ることができ、自分の実力の確認もできます。

問題は、**1週間で仕上げるというのは時間や力をかなり注がないと完成が難しい**ということです。
私は幸い時間がたくさんとれたのですが、それでも完成はギリギリでした。
ギリギリになってしまった要因は二つあります。
* **しっかりとした計画が練れていない。**
* **各機能をこだわりすぎ。**

ゲーム制作は主にコーディング作業をイメージすると思います。なんとなく作りたい内容を地道に形にしていく作業。
その**なんとなく**の部分をしっかりと計画を立てイメージを固めないととても非効率な作業になってしまいます。

また、定まっていないゴールの中、詳細な要素を一生懸命作りこんだり、
本当に必要な要素の制作が後回しになってしまったりと、**作業手順がかなりふらふら**していました。

## 　これからのゲーム制作手順

なんでもそうですが、**PDSAを回す**のがいいと思います。

1\. 作りたいゲームをおおまかに**計画**する。
2\. ゲームに必要な要素を書き出す。
3\. 各要素のフローチャートを作成する。
4\. 実際に要素を作成する。
5\. 要素をつなげ合わせ、計画通り動くか確認する。
→ **繰り返す**

これを細かく繰り返すことで、より効率的に作業が行えると思います。
あくまで、今後私が活動する中で実行していくことなので、この記事を見た皆さんはご参考までに。

## 　完成させたゲーム

**もちろん、完成させたゲームを紹介させていただきます**。是非、この記事を見た人はゲームを遊んでみてほしいdesu
。
また、1Weekゲームジャムの主催のYoutubeリンクも貼っておきます。ゲーム制作にとても役立ちます。お勧めです。

今後は、このゲームをもとにしたゲームを作りそれを**Googleplayに投稿するのを目標**にします。

では、**読んでくれてありがとうございます!**

https://unityroom.com/games/hirogames66sauna

https://www.youtube.com/@studio_shimazu
Eclipse上でGitに連携しプッシュする方法

1. Gitに空のリポジトリを作成する。
1. 作成したリポジトリのクローンURLをコピーする。
1. Eclipseを開き、プロジェクトを右クリックして「チーム」→「プロジェクトの共用」を選択する。
1. ローカルリポジトリのパスを指定する。既存のGitリポジトリを使用する場合は、「プロジェクトの親フォルダー内のリポジトリーを使用または作成」として、既存のリポジトリを選択する。それ以外の場合は、新しいディレクトリを作成してリポジトリを作成する。
1. プロジェクトを右クリックして「チーム」→「コミット」を選択する。
1. コミットするファイルを「+」をクリックし、「ステージされた変更」に移動する。
1. コミットメッセージを入力し、「コミットおよびプッシュ」をクリックする。
1. 「ロケーション」の「URI」にリモートリポジトリのURL+「.git」を入力する。
1. 「認証」にGitの「ユーザー」「パスワード」を入力し、「プレビュー」を3回クリックする。
※bitbucketを使用している場合、アプリパスワードを設定し、その生成されたパスワードを入力する必要がある。
【Rails】refileでのエラー解消（Refile.secret_key was not set.）

## この記事の目的
- 現在学習中のRailsについての理解とアウトプット、振り返り用
- Railsのrefileで起きたエラーの解消について

## バージョン
```
ruby 3.2.0
Rails 7.0.4.3
```


## 起きたエラーについて
Railsのrefileを使用して画像投稿機能を作成している際に下記のエラーが発生しました。

```
Refile.secret_key was not set.

Please add the following to your Refile configuration and restart your application:
Refile.secret_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
```
![スクリーンショット 2023-04-10 22.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/7ffdd62c-a974-ea65-7a31-0a120a015cab.png)

## 原因
refileのsecret_keyが登録されていないということみたいです

## 解消方法
- refileのsecret_keyを設定したあげる

### refileのsecret_keyを設定
`config/initializers/application_controller_renderer.rb`にエラー画面で出てきた`Refile.secret_key`を下記のように設定して下さい。
Rails7からは`config/initializers/`配下に`application_controller_renderer.rb`がデフォルトでないのでない場合は追加して下さい。追加後は`rails s`で再度サーバーを起動して下さい
```config/initializers/application_controller_renderer.rb
Refile.secret_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
```
サーバーを起動後確認すると無事画像が更新できていました！！
![スクリーンショット 2023-04-10 22.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/9e2da996-373b-cc7f-439b-ee1d174fa58a.png)

## 参考
[【プログラミング入門】Ruby on Rails でウェブアプリを作ってみよう ~ PART 2（実装①）](https://www.youtube.com/watch?v=uos2mowBrJA)
[rails 7.0では`config/initializers`配下のファイルが少なくなっている](https://qiita.com/SoarTec-lab/items/ca1b760cd4a5b70cc8b0)
【受験記録】Google Cloud Certified - Associate Cloud Engineer (GCP-ACE)

## 前提
- 7年目エンジニア
- アプリケーション開発メイン
- AWS全冠
- GCPは業務経験なし

## 試験結果
- 受験日: 2023/04/09
- 試験結果: 合格

## 試験感想
- 難易度はAWS SAAと同じくらいだと感じた。ただ、一部コマンドに関する問題もあったため、業務経験がない分、少し難易度が高いと感じた。(触っている人からすれば影響ないレベルと思われる。)
- AWSの知識が使える部分は多くあったが、先入観になっている部分もあり、混乱した部分もあった。
    - eg.) VPCがリージョンを跨げる、AppEngineがプロジェクトに1つずつ
- Kubernatesの知識は身に着けないと解けない問題もあった。
- 試験では日本語で受けたが、訳でいまいちな部分もあり、AWS試験と違い英語変換できなかったため、英語を推測して回答した問題もあった。
    - 権限について訳されていると逆にわかりにくいなど
- 試験結果も合否のみでした。

## 学習方法
### ※ちゃんと身に着けたいならハンズオンをすべきだが、資格試験のための知識習得であれば時間効率が良くないことが多いため、書籍＆模擬問題中心の学習を実施。

- 書籍
    - [Google Cloud エンタープライズIT基盤設計ガイド](https://www.amazon.co.jp/gp/product/4296112198/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&psc=1)
        - 主要サービスの知識を身に着けるために適切なレベルの書籍でした。
    - [Google Cloud認定資格Associate Cloud Engineer公式ガイド](https://www.amazon.co.jp/gp/product/4295011142/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)
        - コマンドやコンソール画面での操作を学習するために利用。辞書的な扱い。

- 問題集
    - whizlab
    - [GCP：Google Cloud Associate Cloud Engineer模擬試験問題集（4回分200問）](https://www.udemy.com/course/gcpgoogle-cloud4200-y/)
    - [公式模擬問題](https://docs.google.com/forms/d/e/1FAIpQLSc7bkUHpDbFShBI5xE4u8OO2vl99DrP0htnswa-la9DQynToA/viewform?hl=ja)
        - 有名どころを一通り利用

## まとめ
- 個人的にマルチクラウドの知識は身に着けていきたいので、継続して学習しようかと。
- 次回はCDLかCPAを受験したいと思う。
VSCodeで、英語フォントとメイリオを使って等幅フォントのように使う

# はじめに

いろいろなプログラミングフォントを使っていたこともありましたが、Windowsについているメイリオがかなりきれいなので等幅フォントとして使えたらいいのに、と思っていろいろやったら使えました。

ここ5年くらいは使っていますので、使い勝手はよいと思います。

# やり方

英語フォントとして、何かを用意します。

自分の場合は、Iconsolata を選びました。このようなページを参考にしています。

> プログラミングに最適なConsolasとかInconsolataとか - os0x.blog
> https://os0x.hatenablog.com/entry/20100822/1282495059

> プログラミングをするのに向いているフォントは何か - buralog
https://buralog.jp/programming-font/

> Inconsolataを日本語フォントの如くリンク改良- mofoolog
https://mofoolog.hateblo.jp/entry/windows-inconsolata-meiryoke-font-rink-1603

## Inconsolataダウンロード

Inconsolata で検索すると、ダウンロードの場所が2ヶ所出てきます。

Inconsolata - Google Fonts
https://fonts.google.com/specimen/Inconsolata
  いろいろ設定がありややこしいのでパスする。キリル文字(?)かなにか発音記号みたいなのが含まれたりしている気がするけど、そういうのは使わないので避ける。

Inconsolataフォント - ダウンロード
https://fontmeme.com/jfont/inconsolata-font/
  こちらのものを使います。シンプル。

## Inconsolata の上下矢印を削除する。

fontmeme の Inconsolata には、上下の矢印が半角で記載されています。

なので、上下矢印を使って文字幅が全角を期待していると、半角になってしまうので、なんだか残念な気持ちになったことが幾度かありました。

ですので、同じ気持ちになる方は、次のツールを使って、上下矢印を見つけて削除することをオススメします。

  FontForge is a free and open-source outline font editor.
  https://fontforge.org/en-US/downloads/

気にしない方は、そのままで大丈夫です。

## VSCodeの設定を行う

[Editor: Font Family]の項目に
[Inconsolata, メイリオ]と設定してください。

これだけで、英語数字(半角文字)の場合はInconsolataが使用され、全角文字の場合はメイリオが使われます。

これで、普通に使っている限りは

\[英語数字などの記号の文字幅]:[ひらがなカタカナ感じの文字幅]=1:2

になり、等幅フォントを使っているかのような操作性になります。

# 
以上です。
同時に二つのブランチの最新バージョンを用意したい


みなさん、こんな事ないですか？？
developブランチから切ったブランチAにdevelopブランチの変更分を取り込みたい。
けど、ブランチAのファイルをうっかり消してしまったので、また新たに二つのブランチの最新版のコードを用意したい。自分はこのような状況に遭遇しました。

developブランチをクローンして、ブランチAを切ってから、git pullでコードの最新化をしてもいいんですが、コミット履歴が汚くなってしまった経験があったので、二つのブランチの最新バージョンを同時に用意したいなと思ってました。
そのような場合の対処方法を学んだので、備忘録として残しておきます。


## やろうとした事
- ブランチAとdevelopブランチの最新化バージョンを同時に用意する


## 方法
### (1) developブランチをクローンする

```
git clone -b develop https:/github/....
cd github
```

### (2) (確認するため) 現在のブランチの確認

```
git branch
```

### (3) (確認するため) git branch -rでリポジトリのリモートブランチを確認


```
git branch -r

/// 下記のように出る
origin/HEAD -> origin/develop
origin/A
origin/B
origin/C
....

```

### (4)  git checkout -b A origin/A で　ブランチAの最新バージョンのコードをクローン+ブランチへのチェックアウトができる

```
git checkout -b featA origin/A 

```


## まとめ
(4)により、ブランチAの最新コードとdevelopの最新コードをローカルに用意することができました。
重要なのは、リモートリポジトリ上にあるブランチからダウンロードするために origin/Aとすることです。
【ChatGPT】効率的なソースコード処理のためのプロンプト5選

## はじめに
ソースコードを対象として手軽に使える以下の5つのプロンプトを紹介します。
* リファクタリングプロンプト：コードをよりシンプルかつ効率的にする方法
* 機能追加プロンプト：コードに機能を追加するときに考慮すべきこと
* テストコードプロンプト：コードをテストするための効果的な方法
* 解説プロンプト：コードを読む人が理解しやすくするための方法
* 学習プロンプト：コードを書くために必要な知識やスキルを身につける方法

このように、プログラマーがソースコードをより効率的に処理するための5つのプロンプトを紹介し、それぞれのプロンプトについて詳しく解説していきます。

##### ソースコードの事前準備
下記のソースコードを例として使用します。

```python:fibonacci.py
a, b = 0, 1

for i in range(7):
    print(a)
    a, b = b, a + b
```


## 1. リファクタリングプロンプト：コードをよりシンプルかつ効率的にする方法

```python:リファクタリングプロンプト
下記のソースコードのリファクタリングをしてください
```
![prompt1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/02a0e3ed-28c4-3a61-15b2-3b82dc1278da.png)


:::note info
さらに具体的に、下記のプロンプトもリファクタリングに有効です。
* 下記のソースコードを関数化してください。
* 下記のソースコードにコメントをつけてください。
* 下記のソースコードに型ヒントをつけてください。
:::



## 2. 機能追加プロンプト：コードに機能を追加するときに考慮すべきこと
```python:機能追加プロンプト
下記のソースコードに機能を追加する際に注意するべきことを教えてください
```
![prompt2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/d94a292b-d6a6-eb1d-000f-cda7d9c70215.png)


## 3. テストコードプロンプト：コードをテストするための効果的な方法
```python:テストコードプロンプト
下記のソースコードのテストコードを書いてください
```

![prompt3_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/4baf5146-8929-6f00-f0ba-2c54bf70d9e4.png)
![prompt3_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/9fdb0040-a108-b3b8-5d0b-3f03f61ddf39.png)


## 4. 解説プロンプト：コードを読む人が理解しやすくするための方法
```python:解説プロンプト
下記のソースコードの解説をしてください
```
![prompt4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/8634dc79-dadf-031e-79ff-9b40c3eec433.png)


## 5. 学習プロンプト：コードを書くために必要な知識やスキルを身につける方法
```python:学習プロンプト
下記のソースコードを理解するためには何を学べばよいか教えてください
```

![prompt5_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/06a2730e-3da1-7ce6-b7bf-6784fc648cd6.png)
![prompt5_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/9465601f-f887-5cf4-5708-cf179a3fb8f1.png)


## まとめ
プログラマーがソースコードをより効率的に処理するための5つのプロンプトを紹介しました。いずれのプロンプトも手軽に使えるので参考になれば嬉しいです。

【プロンプト再掲】
* 下記のソースコードのリファクタリングをしてください
* 下記のソースコードに機能を追加する際に注意するべきことを教えてください
* 下記のソースコードのテストコードを書いてください
* 下記のソースコードの解説をしてください
* 下記のソースコードを理解するためには何を学べばよいか教えてください
AngularCli ダウンロード (v15.2.5)

# はじめに
angularCLIをインストールしました。
自分用に記録しますが、もしも必要な方がいたら是非。

# 環境メモ

>MAC OS
>13.3.1（22E261）
>intelCore


# インストール

## CLIコマンドでインストール

```terminal
npm install -g @angular/cli
```

>公式サイト
>https://angular.jp/cli


## ※ここで出たエラー① npmのバージョンが古い

npmのバージョンが古いので怒られました。最新にします！！

```terminal
npm notice New minor version of npm available! 9.5.0 -> 9.6.4
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.6.4
npm notice Run npm install -g npm@9.6.4 to update!
```

```terminal
npm -v
=> 9.5.0
```

```terminal
npm update -g npm
```

```terminal
npm -v
=> 9.6.4 新しいバージョン！！
```

>npm公式サイト
>https://docs.npmjs.com/about-npm


## ※ここで出たエラー②

権限のエラーが出てきたので管理権限でもう一度入力しました。

```terminal
npm ERR! code EACCES
npm ERR! syscall rename
‥
```

```terminal
sudo npm install -g @angular/cli
```

以上でCLIのインストールができました。


## インストールされたかの確認 ngのインストール場所

```terminal
which ng
=> /Users/〜〜〜/bin/ng
```

## インストールされたかの確認 ngのバージョン

昔のバージョンの、ngコマンドだと怒られるので「v15.2.5」のものは「ng version」と間違えないように！

```terminal
ng version

? Would you like to enable autocompletion? This will set up your terminal so pressing TAB while typing Angular CLI commands will show possible 
options and autocomplete arguments. (Enabling autocompletion will modify configuration files in your home directory.) Yes
Appended `source <(ng completion script)` to `/Users/csshtml/.zshrc`. Restart your terminal or run the following to autocomplete `ng` commands:

    source <(ng completion script)
? Would you like to share pseudonymous usage data about this project with the Angular Team
at Google under Google's Privacy Policy at https://policies.google.com/privacy. For more
details and how to change this setting, see https://angular.io/analytics. No
Global setting: disabled
Local setting: No local workspace configuration file.
Effective status: disabled

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/
    

Angular CLI: 15.2.5
```


# 最後に

以上がCLIのインストールでした。
特に記述することはないのですが1点、下の warning が気になります。
原因は「Powershell」が原因みたいです。
解決までは調査できなかったので、また調べてみたいと思います。

>Powershell
>https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3


```terminal
npm WARN deprecated @npmcli/move-file@2.0.1: This functionality has been moved to @npmcli/fs
```
Rubyは全てがオブジェクト

今回以降まず
## Rubyは全てがオブジェクト
について書きたいと思います！
全てを一度に書くのは非常に困難だった為、何回かに分けて書いていきます:bow_tone1:
今回は結論と今後の説明順序などについて書いています。

公式リファレンス等でも度々言われているこの言葉、正直最初は全然わかりませんでした:sweat_smile:

結論を端的に書くと、以下の2つです。Rubyは
・全てクラスで定義されている
・『オブジェクト.メソッド』の形での呼び出しをしている

これだけ見ると正直ツッコミどころ満載なのですが、、、、、、
次回以降順番に書いていきたいと思っています:bow_tone1:

この説明の後に
```ruby:qiita.rb
puts 'hello world'
```
で有名な「puts」が「オブジェクト.puts」の形ではなく、組み込み関数のように使えている理由について、書きたいと考えています。

具体的に今後順番に以下の内容を書いていきます。
①JavaとRubyの違い
②Rubyを構成している3種類のオブジェクト
③クラスについて理解の深掘り
④Rubyを構成している三大クラス
⑤『オブジェクト.メソッド』の形での呼び出し
⑥まとめ

書きながら修正したい箇所が出た場合は臨機応変にしていきたいと思います！
Basic認証のパスワードは送信時に暗号化されていない

# 概要

- Basic認証のパスワードはHTTPで送信時に暗号化されていないらしい。情報を簡単にまとめておく。

# 情報

- Apacheのドキュメントに下記のような記載があった。（[https://httpd.apache.org/docs/2.4/howto/auth.html](https://httpd.apache.org/docs/2.4/howto/auth.html)）

    ```
     Basic 認証はクライアントからサーバへ、 パスワードを暗号化せずに送ります。
    ```

- ようはBasic認証の認証情報は「見ようと思えば簡単に見れちゃう」ということになる。
- ただし、Apacheの場合mod_sslというモジュールを併用することでSSL/TLSプロトコルを使った暗号化をする事ができる。そもそもHTTPSを使うことでも暗号化することができる。
- Basic認証単独で使った場合の欠点を補うべく生まれたのがDigest認証である。ApacheでDigest認証を実装する場合、Basic認証と左程変わらない手順で実装できるのでこちらの方がおすすめである。
- Digest認証の流れはこちらが分かりやすかった→[Digest認証とは](https://medium-company.com/digest%E8%AA%8D%E8%A8%BC/#:~:text=Digest%E8%AA%8D%E8%A8%BC%EF%BC%88%E3%83%80%E3%82%A4%E3%82%B8%E3%82%A7%E3%82%B9%E3%83%88%E8%AA%8D%E8%A8%BC%EF%BC%89%E3%81%A8,%E5%8C%96%E3%81%97%E3%81%A6%E9%80%81%E4%BF%A1%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
    1. クライアントがランダム文字列をサーバーに要求
    1. サーバーがランダム文字列をクライアントに返す
    1. 人間がクライアント側で認証情報を入力
    1. クライアント側が入力された認証情報とランダム文字列を連結
    1. 認証情報+ランダム文字列をハッシュ化する
    1. ハッシュ化された文字列をサーバーに送る
    1. クライアントからきた文字列とサーバー側で用意した「認証情報+ランダム文字列をハッシュ化した文字列」を照らし合わせる
    1. 一致したら認証成功

- ただDigest認証のハッシュは解析する事ができる古いアルゴリズムらしいので完璧じゃない。

# まとめ

|| HTTP | HTTPS |
| --- | --- | --- |
| Basic認証 | 　✕ | ◯ |
| Digest認証 | △ | ◯ |

- Basic認証をHTTPで使うと簡単に認証情報を見れてしまうので危険
- Digest認証をHTTPで使うと一応セキュアではあるが解析される可能性有り

HTTPSを使えるならそっちで今まで通りBasic認証でHTTPSで暗号化の方がいい気がする。（所感）
sha256.js【JavaScript】

```javascript

async function digestMessage(message) {
  const msgUint8 = new TextEncoder().encode(message);                           // (utf-8 の) Uint8Array にエンコードする
  const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);           // メッセージをハッシュする
  const hashArray = Array.from(new Uint8Array(hashBuffer));                     // バッファーをバイト列に変換する
  const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); // バイト列を16進文字列に変換する
  return hashHex;
}

const text = 'An obscure body in the S-K System, your majesty. The inhabitants refer to it as the planet Earth.';
const digestHex = await digestMessage(text);
console.log(digestHex);

// echo -n 'An obscure body in the S-K System, your majesty. The inhabitants refer to it as the planet Earth.' | sha256sum

```

https://developer.mozilla.org/ja/docs/Web/API/SubtleCrypto/digest#%E3%83%80%E3%82%A4%E3%82%B8%E3%82%A7%E3%82%B9%E3%83%88%E5%80%A4%E3%82%92_16_%E9%80%B2%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B
Bootstrapで作ったヘッダーの検索ボタンでホバーしたときの文字色を変更する

# 目的

Bootstrapで作ったヘッダーの検索ボタン、ホバーしたときの文字色が黒でかわいくないので変更します。


# 今回やること

今回の目標は1つ！
* 検索ボタンをホバーしたときの文字色を変更する


# 環境
* windows 10
* ruby 3.0.4
* rails 6
* Bootstrap 5.0.2


# いざ出陣
Bootstrapで作成したヘッダーの検索ボタンには、 `btn-outline-success` クラスが付いています。
```html:app\views\layouts\application.html.erb
<form class="d-flex">
  <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
  <button class="btn btn-outline-success border-2" type="submit">Search</button>
</form>
```

 `btn-outline-success` クラスのことは、枠線色を変更したときにscssに書いていたので、その下に以下を追加します。
あるクラスのhoverしたときの設定は、 `:hover` をつけて指定できます。
```scss:app\assets\stylesheets\application.scss
/*追加*/
.btn-outline-success:hover {
  color: $light;
}
```

# 余談
ついでに、文字が真っ黒なのかわいくないので変えたいけど、
背景とのバランスもあると思うので、背景を変えてからやろう。
MySQL 文字列系のデータ型の情報がまとめられている場所

# 概要

- MySQLの文字列系のデータ型の情報がまとめられている場所のリンクをおいておく。（公式ドキュメント）

# 情報

https://dev.mysql.com/doc/refman/8.0/ja/string-types.html
CloudWatch ログのインサイトが使いやすかった

# 概要

- 先輩から教えてもらってCloudWatchのログのインサイトが非常に使いやすかったので簡単にまとめておく。

# CloudWatchのログ

- CloudWatchのログは大体、日毎やlambda関数の実行毎にログストリームが分かれている。
    - 下記は[lambda（Node.js）からSlackにメッセージを送ってSlackアプリに発言してもらう](https://qiita.com/miriwo/items/59a45c89a65e071d9826)の記事で作ったlambda関数のログである。関数が実行されるたびに、ログストリームが作られる。

        ![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a0ea805d-24ae-2be4-4d30-df0baf057037.png)

- 「ログストリームを横断してすべてのログを眺めたい、、！」や「すべてのログで"Error"という文字列が出力されているエラーを見たい」くらいの要望なら、「すべてのログストリームを検索」を使えば良い。
- しかしもっと詳細にログをフィルタリングしたい、並び替えたい、条件に一致した最初の20個だけ出力したい、ログストリームだけではなく他のロググループも横断してフィルタリングしたい、ときなどは「すべてのログストリームを検索」だけでは若干足りない。

# ログのインサイト

- そこで活躍するのがログのインサイトである。

    ![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/12754393-00e7-9555-d41a-2b2292143f34.png)

- ログのインサイトは1つ以上のロググループを指定してSQLに似ているクエリを走らせることでログの抽出を行う事ができる。
- 「SQLに似ている」と書いたが、構文が何となく似ている様に見えるだけで全くの別物である。（ただ、ルールは単純なのでエンジニアならすぐ馴染めるだろう）
- SQLのselect文さながら、出力フィールドの指定やソート、出力の行リミットなどその他にもたくさん指定できる。
- 「構文覚えるのめんどい」という場合でもAWS側でサンプルクエリを容易してくれているのでそこまで苦労しないと思う。

    ![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cca8c442-680e-6838-994f-a38cc2137a2c.png)

# 使用方法

本当に触りだけ使い方をまとめておく。

1. プルダウンでロググループを1つ以上選択する。

    ![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fc618a54-9730-b3d1-f8a7-f188e8ee6f0a.png)

1. クエリを出力してほしい情報に合わせて記述する。

    ![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/53f4fa73-373f-d8ee-366b-1709ead6607b.png)

1. 「クエリの実行」を押下してクエリを実行する。

    ![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/58a9a399-c774-2cf2-fd46-627877a49617.png)

1. クエリの条件に合うログが出力される。

    ![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/83f2c54c-0da7-3e84-5e71-a6953c24d688.png)
iOSアプリの起動の流れをざっくり説明(初学者向け)

## はじめに
今までアプリ起動から画面が表示されるまでの過程を全く意識せずにコードを書いていました。アプリ開発を行うにあたって、アプリ起動の仕組みを少しでも理解したほうが良いと思い今回のタイトルについて調べてみました。

## 何を書いたか
UIKitを使用したiOSアプリの起動の仕組みをざっくりと書きました。
内容的には参考にさせていただいた、
『親切すぎるiPhoneアプリ開発の本』に載っている内容です。
あまりアプリ起動の仕組みに触れている本が見つからなかったのですが、
この本では詳しく載っておりとても参考になりました。
ただ2015年出版の本なので、現在との差分にも触れながら、
かつ自分の言葉で噛み砕いてアプリ起動の仕組みをアウトプットしてみたいと思い、本記事を書きました。

## 対象者
iOSアプリ開発初心者向けです。
アプリ起動の仕組みをざっくりイメージしたい人向け
詳細理解については別の記事や本を参考にしていただけたらと思います。

## アプリ起動の流れ
では、本題に入りたいと思います。

### 登場人物
起動の流れを説明する前に、まず簡単にこの後でてくる用語について説明します。あとで戻ってきてみてもらってもいいと思います。
#### ・UIApplecation
アプリの全体管理者的な存在
アプリケーションの起動、イベントループ(画面のタッチなどのイベントを見張っているところ)やアプリケーションのライフサイクルを管理します。

#### ・AppDelegate
アプリケーションのライフサイクルイベントを処理するメソッドを提供する。
アプリの起動や終了時に実行される処理などを実装することができる

#### ・SceneDelegate
iOS13以降で導入されたマルチタスク対応のアプリケーションで使用されるオブジェクト
UIWindowのインスタンスを作る、シーン(アプリケーションの画面の切り替えに使用される単位)が作成されたり、アクティブになったり、非アクティブになったりする際の処理を実装できる

#### ・UIWindow
iphoneの画面表示を管理するオブジェクト
このUIWindowの上にViewControllerのビューが追加され表示される仕組み。

### 起動の流れ
1. アプリ起動
アプリが起動されるとイベントループが実行され、UIApplicationがオブジェクト化されます。
UIApplicationが起動の準備をしてくれます。

2. AppDelegateに追加処理がないかを確認
アプリの起動準備ができると、UIApplicationがAppDelegateに
「起動準備できたけど、何かやることある？」と問い合わせます。
AppDelegateの該当のメソッドに処理を記述しておけば、このタイミングでその処理を実行できます。

3. シーンとUIWindowの生成
iOS 13以降では、SceneDelegateがシーンとUIWindowを生成しています。SceneDelegateのscene(_:willConnectTo:options:)メソッド内で、最初に表示するViewControllerをUIWindowに登録し、ウィンドウを表示します。

4. ViewController生成と表示
生成されたViewControllerがUIWindowの最初の画面パート担当を管理するコントローラーとして登録され、ViewControllerのルートビューが画面に表示されます。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2182598/11b8a524-2a2c-26bc-ef79-d408e5d2cb2b.png)



# 参考文献
『親切すぎるiPhoneアプリ開発の本』

# 最後に
iOSアプリ起動までの流れを大まかに書いてみました。
まだ理解が浅い部分もあるため、実際の挙動と異なる点や間違っている点などありましたら、コメントなどでご指摘いただけたらとても嬉しいです。

ここまで読んでくださりありがとうございました！
ECRのプッシュコマンドでエラーが出た

## 状況

ECRにプッシュする段階、プッシュコマンドの1つ目でエラーが出た。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2896283/31769400-d7db-47b8-957d-d5bec6ecd4e9.png)

エラー内容

~~~powershell
> (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin 259733176869.dkr.ecr.ap-northeast-1.amazonaws.com
Get-ECRLoginCommand : 用語 'Get-ECRLoginCommand' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログ
ラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを
確認してから、再試行してください。
発生場所 行:1 文字:2
+ (Get-ECRLoginCommand).Password | docker login --username AWS --passwo ...
+  ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-ECRLoginCommand:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
~~~


## 解決策
powershellで動かそうといろいろ調べたけどAWS CLI使うのが手っ取り早そうだな、ということでAWS CLIのインストールで対応することに。

以下、AWS CLIの導入手順。

#### 1. AWS CLIのインストール 

下記URLからインストーラーをDLする。

https://awscli.amazonaws.com/AWSCLIV2.msi

インストーラーを起動してインストールを進める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2896283/00c2de78-65a0-41b9-bd42-bdddce4c3ff5.png)

インストールが完了したら、コマンドプロンプトかpowershellで`aws --version`を実行してインストールできているか確認しておく。

~~~cms
>aws --version
aws-cli/2.11.11 Python/3.11.2 Windows/10 exe/AMD64 prompt/off
~~~

#### 2. アクセスキーの作成

[サービス] → [IAM] → [ユーザー] → [任意のユーザー] 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2896283/5c65c333-ce77-9d7f-8152-24a77a516861.png)

→ [セキュリティ認証情報] 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2896283/6725041f-9842-b013-571f-d26b4aeec0f2.png)

→ [アクセスキー] → [アクセスキーを作成]  (画像はアクセスキー作成後のもの)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2896283/e80e8792-3170-4029-983d-c4335d409739.png)

アクセスキーが作成できたらAWS Access Key IDとAWS Secret Access Keyを控えておく。

#### 3. AWS CLIの設定

コマンドプロンプトかpowershellを開いて`aws configure`を実行する。
指示に従ってAWS Access Key IDとAWS Secret Access Keyを入力する。
（残り2つは入力しなくて良さそう）

~~~cmd
>aws configure
AWS Access Key ID [None]: **************
AWS Secret Access Key [None]: ***************************
Default region name [None]:
Default output format [None]:
~~~

#### 4. プッシュコマンド実行
成功！！！


## 問題点

VSCodeのターミナルでawsコマンドが使えない・・・

（追記）VSCodeを再起動したら使えるようになった。
Next.jsのチュートリアルのプロジェクト作成で詰みかけたので、解決に至る方法を共有します


初めまして、お久しぶりです。ソラノアナです。

お仕事でNext.jsを使うことになり、[Next.jsのチュートリアル](https://nextjs.org/learn/basics/create-nextjs-app/setup)をやってみました。しかし上手くいかず、チュートリアルに記載があるような画面にはなりませんでした。それを解決するのに半日以上かかってしまったので、備忘録と情報共有を兼ねて本ページを作りました。

# おことわり
Next.js初心者が手探りでいろいろ試した結果についての内容なので、あくまで「とりあえずこうしたら動いた」程度の内容です。
間違った内容が混ざっていたり、余計なことをしていたりする可能性はあります。その際はコメントで優しく教えていただければと思います。
また本ページでは、同じ初学者が、チュートリアルの始まり部分で詰んでドロップアウトするというのを少しでも減らすことを目的に記載しています。

# 事象の背景・症状
まず、[Next.jsのチュートリアル](https://nextjs.org/learn/basics/create-nextjs-app/setup)に記載のある以下のコマンドを叩いても動かず。
```ruby:CMD
npx create-next-app@latest nextjs-blog --use-npm --example "https://github.com/vercel/next-learn/tree/master/basics/learn-starter"
```
以下の記載を参考に、リンク先にあるコマンドを叩いても動かず。
>If it doesn’t work, please take a look at this page.（うまくいかない場合は、こちらのページをご覧ください。）
```ruby:CMD
npx create-next-app nextjs-blog
```

自分で試行錯誤して、以下のコマンドを叩いたところ、一応プロジェクトが作られる。
```ruby:CMD
npx create-next-app nextjs-blog --use-npm
```
しかし、後にチュートリアルで記載されている内容と全く違う画面となっている。

↓作られたプロジェクトの実行画面
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274916/9c188d0b-1492-8877-06f7-964720184e42.png "作られたプロジェクトの実行画面")
↓後にチュートリアルで提示される実行画面
![welcome-to-nextjs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274916/f8a6e331-aef4-07d0-0935-bfc20f3fcbab.png "チュートリアルで提示される実行画面")

# 環境
Windows11 pro 22H2
npm: 8.3.1

# 解決策
まず、以下のコマンドを叩いてデフォルトのプロジェクトを作成する.
```ruby:CMD
npx create-next-app nextjs-blog
```
途中いろいろ聞かれるが、以下の通り答える
```ruby:CMD
√ Would you like to use TypeScript with this project? … No
√ Would you like to use ESLint with this project? … Yes
√ Would you like to use Tailwind CSS with this project? … Yes
√ Would you like to use 'src/' directory with this project? … Yes
√ Would you like to use experimental 'app/' directory with this project? … No
√ What import alias would you configured? … @/*
```
次に、チュートリアルで扱っているプロジェクトを[ここのページ](https://github.com/vercel/next-learn)からzipでダウンロードしてくる。

コマンドを叩いて作成したnextjs-blogプロジェクトの package.json の"next"の値を"latest"に変更する。
```diff_ruby:package.json
{
  "name": "nextjs-blog",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "autoprefixer": "10.4.14",
    "eslint": "8.38.0",
    "eslint-config-next": "13.3.0",
-    "next": "13.3.0",
+    "next": "latest",
    "postcss": "8.4.21",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "tailwindcss": "3.3.1"
  }
}
```

次に、作成したプロジェクトのnextjs-blog\src\pages以下を全て削除する。

上のディレクトリに、ダウンロードしたファイルのnextjs-learn-master\basics\learn-starter\pages以下の中身をコピペする。

次に、作成したプロジェクトのnextjs-blog\src\styles以下を全て削除する。

最後に、上のディレクトリに、ダウンロードしたファイルのnextjs-learn-master\basics\learn-starter\styles以下の中身をコピペする。

# 終わり
僕の環境では、この手順でチュートリアルにある画面を出すことができました。また、windows10の別端末でもできたため、たぶんほかの環境で動くのではないかと思います。
~~やはり公式ドキュメントの類はクソ！~~

見ていただきありがとございました。
aws-sdk-s3でROLEを使って操作する

備忘録。

## EC2でIAM-ROLEを利用している場合

```ruby
credential = Aws::InstanceProfileCredentials.new
client = Aws::S3::Client.new(region: 'ap-northeast-1', credentials: credential)
```

## ECSでTaskRoleを利用してる場合
```ruby
credential = Aws::ECSCredentials.new(retries: 3)
client = Aws::S3::Client.new(region: 'ap-northeast-1', credentials: credential)
```
※retriesは指定した方がよい。metadataの情報を元にAPIをコールするため、データ取得に失敗する可能性があるため
Power Apps で文字から文字コードへの変換をする

こんにちは。
最近、得意料理が「暗殺者のパスタ」になった男です。

標記の件、ちょっとだけ引っかかったのでメモっておきます。

# なんで逆が無いの？
文字コードから文字への変換は、**Char()** でできる。
たとえば、**Char(65)** の結果は、 **"A"** だ。
フツーに考えたら、**Code("A")** とかで **65** って返ってきてほしい。
でも、これがないのよ。なんで？

EncodeUrl はあるのに、DecodeUrl がないってのも、ちょっとアレだったんだけど、これ、マジでないの？

# しょうがないので、こんな感じに
とりあえず、以下のように対応しました。
もうちょいスマートな方法がある気がするんだけど、これぐらいしか思いつかなかったので。

``` 
// 初めに 文字 と コードのセットをコレクションに入れる
ForAll(Sequence(126, 1, 1),
    Collect(colAscCode,{​​​ch: Char(Value), code: Value }​​​)
);
```
```
// A の文字コードを取得するのはこんな感じ
LookUp(colAscCode, ch="A").code
```
```
// 変数 hogehoge のアルファベットの次の文字（"A" なら "B"）を取得するのはこんな感じ 
Char(LookUp(colAscCode, ch=hogehoge).code + 1);
```

# ホントにないの？
一応、リファレンスとか見返したんだけど、それっぽいものはないみたい。
もしかしてあったらゴメン。
Windows11 ライセンス認証のエラー(0xC004C008)が発生したときの対処法

## 現象
Windowsのライセンス認証の状態が「アクティブではありません」となり、「このプロダクトキーが別のデバイスで既に使用されているため、このデバイスのWindowsをライセンス認証できません。」というエラーが発生しました。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322574/afa1b6d8-c2ec-7df4-bb5f-b001d2390779.png)


## 対処法
エラー下にある「電話でのライセンス認証」を実行してください。

::: note warn
認証までの一連の処理に20分ほどかかるため注意してください。
:::

日本を選択します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322574/b726f5bb-6d9e-dbde-953c-16803ff9029b.png)


電話番号が表示されるので電話をかけ、ガイダンスに従っていきます。
途中インストールIDを聞かれるので表示したままにしてください。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322574/6d6fcbcb-023c-9725-7874-1057bccaf146.png)


確認IDが読み上げられるので間違えないように入力(入力できない場合はメモ)を行ってください。聞きそびれた場合はもう一度確認できます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322574/e13bc3ee-8f43-97a1-82a8-a5ee5c01ffd9.png)


ライセンス認証が完了すると以下の画面が表示されるため、閉じるを押してください。以下画面にならずエラーが発生する場合はガイダンスに従いましょう。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322574/76420663-4f82-01a1-bbd3-b06a0fb31822.png)

ライセンス認証に状態が「アクティブ」になれば認証成功です。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322574/c735e45f-0736-cbf4-bb6a-ada5d5668ecd.png)


## 原因
セットアップ時にライセンス認証を行った後に設定を間違えていたことに気づき、クリーンインストールを実施しました。
その際にプロダクトIDが変更され別のPCとして認識(?)。もう一度ライセンス認証を行おうとするとすでに認証されたPCが登録されているためエラーが発生したと考えられます。　詳しい方いれば教えてください。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322574/9d9d9c90-2091-a5c2-3dc1-eaaab82cbc71.png)


## 参考
> https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=1711-3075&rid=282!
PHP 改行コードはPHP_EOLを使おう

# 概要

- PHPでの改行はPHP_EOLを使ったほうが良いらしいので簡単にまとめてみる。

# PHPの改行

- 「独習PHP（第3版）」を読むと改行の説明に`\n`を使っている。
- ただし、これはLinuxやMacOSの場合のみでWindowsの場合は`\r\n`を使う様にも記載されている。
- 環境に依存したコードはなるべく書きたく無いものである。

# PHP_EOL

- PHP_EOLはPHPで最初から定義されている定数のことで、「行末文字」を示している。

https://www.php.net/manual/ja/reserved.constants.php

- 環境に依存せず、改行を表すことができる。

# 例

- 下記の2行はLinuxやMacOSの環境なら同じ出力がなされる。

    ```
    <?php

    echo "朝ごはんを" . "\n" . "食べました。" . "\n";
    echo "朝ごはんを" . PHP_EOL . "食べました。" . PHP_EOL;
    ```
sslhを使ってwebとsshを共存 in docker

# 前提条件
webとsshを同じ334ポートで共存させたい。なお、webはdocker内部、sshは外部、ドメインがあるもしくは固定ipアドレスである

※自分自身をさす方法として今回はドメインを用いたが、ifconfigコマンドや/etc/hostsファイルがなんやかんやとか、dockerにも方法はあるので、あきらめないこと
※内部と外部の違いは少ないです。強いて言うなら、オーバーヘッドの量だと思われます。たぶん固定ipが一番いいです

ただのメモなので、短いです。

これを用いることによって、私は学校WiFiの中でサーバにssh接続できるようになりました。個人的には、ポート封鎖しかしてないんだなぁと思いました。

※大半の時間はdockerを使わずに入れようと努力した結果無理でした。

## コードをどう変更したか
※私は、webページをtraefikというものでURLごとに各dockerに振り分けています

```diff_yaml:docker-compose.yml
version: "3"

services:
  traefik:
    image: traefik:latest
    container_name: traefik
    ports:
      - 80:80
      - 8080:8080
      - 8081:8081
      - 8082:8082
-     - 443:443/tcp
-     - 443:443/udp
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./config:/etc/traefik:ro
      - ./letsencrypt:/letsencrypt
    networks:
      - traefik-net

+ sslh:
+   image: oorabona/sslh
+   environment:
+     LISTEN_IP: 0.0.0.0
+     LISTEN_PORT: 443
+     SSH_HOST: oligami.ml
+     SSH_PORT: 22
+     HTTPS_HOST: traefik
+     HTTPS_PORT: 443
+   ports:
+     - 443:443/tcp
+     - 443:443/udp
+   command:
+     - -f
+   restart: unless-stopped
+   links:
+     - traefik
+   networks:
+     - traefik-net

networks:
  traefik-net:
    # docker network create traefik-net
    external: true
```
oligami.mlは私のサーバアドレスなので自前のアドレスか固定ipに変えてください。たぶん固定ipの方がいいので私は変えてきます。

# 参考

https://hub.docker.com/r/oorabona/sslh
Rubyにおけるputsとreturnの違い

Rubyにおけるputsとreturnは
何か似てる感じがして分かりにくいですよね:disappointed_relieved:

結論としてputsとreturnの違いは
**戻り値を必要とするか否か**です:point_left:

そして、**戻り値**というのは
**何らかの処理結果で返される結果**のことをいいます

使用する目的としては以下の通りになります！
```
puts：文字列を出力する為に使う
return：一連の処理結果から戻り値を返すこと
```
ちなみに**値**というのは、
**数値だけでなく文字列、真偽値、配列、ハッシュなど**
あらゆるものを含みます！

さて、戻り値を返せないputsを使おうとすると
どうなってしまうのでしょうか？？

例えば、このようにreturnの代わりにputsを使って
年齢に応じて運賃を出す処理を書いたとします

ちなみに年齢を入れる引数は数値の8とします
```ruby 
#大人は12歳以上で200円 こども12歳未満6歳以上で100円  幼児は6歳未満で無料
def train_fare(age)
  if age >= 12
    puts '大人料金になります'
    puts 200
    
  elsif age < 12 && age >= 6
    puts 'こども料金になります'
    puts 100
  else age < 6
    puts '6歳未満は幼児で無料となります'
    puts 0
  end
end

#引数として年齢を入力する(age)には8を入れる
puts "東京駅から新宿駅までの料金は#{train_fare(8)}円です"

出力結果 #=> 
こども料金になります
東京駅から新宿駅までの料金は円です
```
このように料金の数値の値が
何も出力されませんでしたね、、

これはtrain_fareという関数の中で
returnではなく、値を返すことが出来ない
**putsを使ったのが原因**です🙇‍♂️

**putsを使ったことにより**
**train_fareの関数の処理結果の数値を返すことが出来ず**、
結果として#{train_fare(8)}の値が
**nil**という存在しないものに
なってしまいました、、:frowning2:

ですので、putsではなくreturnを使いましょう
```ruby:
#大人は12歳以上で200円 こども12歳未満6歳以上で100円  幼児は6歳未満で無料
def train_fare(age)
  if age >= 12
    puts '大人料金になります'
    return 200
  elsif age < 12 && age >= 6
    puts 'こども料金になります'
    return 100
  else age < 6
    puts '6歳未満は幼児で無料となります'
    return 0
  end
end

#引数として年齢を入力する(age)には8を入れる
puts "東京駅から新宿駅までの料金は#{train_fare(8)}円です"

出力結果 #=>
こども料金になります
東京駅から新宿駅までの料金は100円です
```
このように**returnを使うことによって**
**引数に入力した数値が処理結果として正しく返され**、
料金の数値がしっかり表示されました:relaxed:



以上になります。お疲れ様でした!
【厳選】Markdown記法の使用頻度高いもの集

## 背景
Qitaaで記事を書きたいと思いエディターを開いたものの、Markdown記法ってどう書くんだっけ？となりました。
個人的な忘備録になりますが、同じような境遇の方に役に立てば幸いです。

## 参考
以下記事を読んで勉強しました。
量が多い為、この中から厳選して紹介します。

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

https://qiita.com/tbpgr/items/989c6badefff69377da7

## 以下サンプル集です

## 見出し

### 記述例
```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
```

### 表示例
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6

## コードブロック
下記のようにバッククオート（`） か チルダ（~）を書きます。
コードブロック内にさらにブロックを書きたい場合は、異なる記号を使います。
### 記述例
~~~
```html:index.html
<p>Qiitaで初めての記事書いてみた</p>
```
~~~

### 表示例
```html:index.html
<p>Qiitaで初めての記事書いてみた</p>
```


## コードスパン
コードはインライン表示する事も出来ます。

### 記述例
```
`<p>インライン表示</p>`
```

### 表示例
`<p>インライン表示</p>`

## 最後に
最低限のものをまとめました。
やりたい事は大体出来るので、詳しく知りたい方は参考記事を読んでみてください。
AHC(AtCoder Heuristic Contest)はいいぞ

# ヒューリスティックは面白い！！

ABC,ARCでアルゴリズム力を鍛えるのも楽しいですが、自分はヒューリスティック力を鍛えるAHCをオススメします！

## AHCとは？

ABC,ARCの様な完全解答を目指すわけではなく、問題を解いたスコアを改善していくようなコンテストです。
開催期間に関しては数日にわたる為参加しやすい長期型、半日で終わる短期型が行われています。
言語に関しても同様に用いる事ができるので特殊な準備は必要ありません。

## おすすめ理由

### スコアを改善する楽しさを実感できる、途中経過も意味がある

普段のアルゴリズム問題だとACになる方法を考え、ACかどうかしか評価されませんが、AHCだと””改善””が重要なので考えが全て纏まらなくとも、一部でも実装が行われていればスコアが変動する可能性を秘めています。

実装したコードがしっかりとスコアを良くした時の喜びによって新たな方針を考えるというループにハマってしまいます。

### レートが下がることがない

競技プログラミングきつい、辛いの理由にレート変動が存在していると思います。
ただ本コンテストはコンテスト成績が悪くても下がることのない単調非減少型を採用している為、レートが下がることはないです。
レートを気にしてしまいなかなか競技プログラミングに参加を悩んでしまう、やめてしまった人は特に参加する事をお勧めします。

### ABC,ARCで得た知識も役にたつ

スコアを改善するとのことですが、当然その途中に実行時間、メモリの問題を考える必要があります。その時は高速化や効率化を行う必要もあるので経験が生かせると思います。

### (初心者用)テンプレートも存在する時がある。

いつも存在しているわけではないですが、一部の言語のサンプルコードが存在している事があります。
「勉強始めてそんなにコード書けないかも」と言った人でもテンプレートを用いる事で最初からコンテストに参加でき、自分のできる範囲で実装が行えます。

## コンテスト中で自分が行っている事
- まずACを出せるコードを書く(テンプレート)
- 貪欲法によってある程度の改善を目指す
- ある程度行き詰まった時にヒューリスティックを目指していく
    - 山登り法
    - 焼きなまし法

## もっと動き方を知りたい人に参考になるサイト

https://qiita.com/tsukammo/items/7041a00e429f9f5ac4ae

https://img.atcoder.jp/intro-heuristics/editorial.pdf

## 結論

競技プログラミングをやってない人、またやってるけど熱が覚めてしまった人、などいろんな人が楽しめると思うので一回参加してみて欲しいです！！！！！！
競プロ典型 90 問 044 - Shift and Swapping

# クエリ問題を解いてみた
今日解いてた問題で自分が苦手だったのでメモ程度にまとめまふ
# 問題のURL
https://atcoder.jp/contests/typical90/tasks/typical90_ar

#ソースコード
```python:a.py
N,Q = map(int,input().split())
A = list(map(int,input().split()))
rotate_cnt = 0
for _ in range(Q):
    t,x,y = map(int,input().split())
    x -= 1
    y -= 1
    if t == 1:
        A[x-rotate_cnt],A[y-rotate_cnt] = A[y-rotate_cnt],A[x-rotate_cnt]
    elif t == 2:
        rotate_cnt += 1
        if rotate_cnt > N:
            rotate_cnt =0
    elif t == 3:
        print(A[x-rotate_cnt])
```
まずこの問題、愚直にやろうと思えばすごく簡単なんですがおそらく問題文をそのまま
やってしまうとTLEになると思います、、
てことで、どうやって計算量を減らしつつ解くかなんですけど
この問題Tが1,3のときはO(1)なので特に気にしなくて愚直にやればいいと思います。
問題は右にシフトするのを愚直にやってしまうと以下のようになります、、。
まずリストの要素数をN、そしてシフトする回数をKとおきます。
そうするとシフト1回にたいしてO(N)行われるので結果として
O(NxK)になってしまいます。要素数とクエリ回数の最大値を取って当てはめてみると
O(4x10^10)となってしまい、間に合いません。
なので何回シフトしたかを記録する変数rotate_cntを作ります。
Tが２のときrotate_cntを1つ足して行きます。そしてTが1,3のとき
与えられたx,yからrotate_cntを引いてあげれば右にシフトした挙動と同じになります。
どうしてかというと、、
(例)
あるリスト[1,2,3,4,5]が与えられたとします。(0-indexed)
そしてrotate_cnt=1、つまり右にシフトが1回行われたとします。
なので右に1回しふとしたときのリストが[5,1,2,3,4]となります。
まずT=1の時を説明します。
ここではインデックス番号2,3のときを説明します。
右に1回シフトした時のリストでの挙動は[5,1,3,2,4]となります。
次にrotate_cntを使ってやってみます。
右にシフトってことはインデックス番号が1つずつずれるという感じです。
つまり、今回は2,3をしたいのですが、ひとつ右にずれているので1つインデックスを戻すイメージで
2-rotate,3-rotateをしてあげることで挙動が同じになります。
Tが３のときも同様にずれている分戻してあげるイメージで大丈夫です。
またrotate_cntがNよりも大きくなったとき、それは
1,2,3,4,5
5,1,2,3,4
4,5,1,2,3
3,4,5,1,2
2,3,4,5,1
1,2,3,4,5
というふうに一周してるのでrotate_cntを０にしてあげます。

# 最後に
こういう問題はわかれば簡単なので5分から10分程度で解きたいですね。
ショートカット.appの「URLの内容を取得」で長さが変わる辞書配列持ちJSONをPOSTする

ショートカット.appから何らかのAPIを叩く際に、JSONをPOSTすることがあります。
そんなときは「URLの内容を取得」アクションを使ってJSONを投げるわけですが…![スクリーンショット 2023-04-11 18.22.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192970/775e398c-687f-c731-3c73-00bbc1a8f470.png)
（このJSON編集がやたら落ちやすい、という問題はさておき）
この方法だと、JSONの要素の個数は固定されている必要があります。可変長のリストを変数として読み込ませても、うまく行きません。
例えば、`the_list=[{"A":"aaa"},{"B":"bbb"}]`というリストを上記アクションの`key="TEST", value=the_list`的な気持ちで代入しても、`{"test":["{\"A\":\"aaa\"}\n{\"B\":\"bbb\"}"]`みたいな感じで、要素間が`,`ではなく改行だったり過剰にエスケープされてしまったりと、上手くいかない。 
配列に自由が効かないということは、たとえば 
```json
{
  model:"gpt-3.5-turbo",
  temperature:7.5,
  messages:[
    {"role":"system", "content":"質問には140字以内で簡潔に答えてください。"},
    {"role":"user", "content":"私の名前は笠間哲史です。"},
    {"role":"assistant", "content":"こんにちは、笠間哲史さん。"},
    {"role":"user", "content":"私の名前はなんですか？"}
  ]
}
```
のような形式で、`messages`配列がどんどん伸びていくようなAPIを叩きたいとすると、「URLの内容を取得」アクションのJSON POSTではうまくいかない。

# 解決策:JSON文字列を作ってFileとしてPOST
仕方ないので、自力でJSON文字列を作っちゃいましょう。 
送るコンテンツはヘッダーで`Content-Type="application/json"`になってるので、「URLの内容を取得」アクションの「本文を要求」を、JSONではなくFileにして、自分で組み立てたJSON文字列を渡せばOKです。例えば↓こんな感じ。
![IMG_20EDB3719EBF-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192970/e8465882-1c2e-754d-cb32-05abe52fcc53.jpeg)
これで配列の長さも中身も自由自在。
Enjoy!

## 参考文献
https://stackoverflow.com/questions/63462615/post-a-json-list-using-choose-from-list-select-multiple-on-in-shortcuts
【Rails】cancancanでは継承元のclassを指定してまとめて権限設定することが可能

[cancancan](https://github.com/CanCanCommunity/cancancan/)のgemのソースコードを読んでいたら、発見があったので記事にします。

## できること

`Ability`クラスでの権限設定で、継承元のクラスを指定すると子クラスの権限設定も行われます。

## コード例

例えば以下のように書くと、`ApplicationRecord`を継承しているクラス全体に適用することができます。

```ruby:books_controller
class BooksController < ApplicationController
  before_action -> { authorize! :read, Book }
  # ...略
end
```

```ruby:ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    can :manage, ApplicationRecord
  end
end
```

## 該当コード

```ruby:
def possible_relevant_rules(subject)
  if subject.is_a?(Hash)
    rules
  else
    # チェックしたい対象のリソースと関連するルール（abilityクラスに記載されているもの）を探すメソッド内で、
    # alternative_subjectsというのが呼ばれています。
    positions = @rules_index.values_at(subject, *alternative_subjects(subject))
    positions.compact!
    positions.flatten!
    positions.sort!
    positions.map { |i| @rules[i] }
  end
end
```

```ruby:gems/cancancan-3.5.0/lib/cancan/ability.rb
def alternative_subjects(subject)
  subject = subject.class unless subject.is_a?(Module)
  if subject.respond_to?(:subclasses) && defined?(ActiveRecord::Base) && subject < ActiveRecord::Base
    [:all, *(subject.ancestors + subject.subclasses), subject.class.to_s] # ここで継承元クラスを取得しています
  else
    [:all, *subject.ancestors, subject.class.to_s]
  end
end
```

## さいごに

逆に言えば、継承先までは許可したくない場合（ケースとしてあるかわかりませんが）は、明示的に`cannot`を使う必要がありそうです。
Az Copy を使って Azure ストレージアカウント間でデータをコピーする


# 概要
AzCopy は、ストレージ アカウント間の BLOB またはファイル コピーに利用できるコマンドラインです。
 この記事は、AzCopy をダウンロードし、ストレージアカウント間でデータをコピーする方法を記載します。

# 1.AZCopy のダウンロード
**1.1 以下のサイトにアクセスしAzCopy 実行可能ファイルをダウンロードします。**
https://learn.microsoft.com/ja-jp/azure/storage/common/storage-use-azcopy-v10#download-azcopy
※お使いのOSに対応しているファイルを選択してください。

**1. 2 zipファイルを展開します。**

**1. 3 Powershellを管理者権限で実行し、ダウンロードフォルダに移動します。**

**1.4 下記のコマンドを実行します。エラーなく実行できれば完了。**
```code
.\azcopy
```
※システムの環境変数に登録しておくと、フォルダを移動しなくても実行が可能になります。
**～システム環境変数への登録手順～**
・システムの詳細設定から環境変数を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142984/3546918a-516d-92e7-e066-48cde4fbca93.png)
・システム環境変数の新規からフォルダパスを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142984/1ca3974c-5416-a84f-dc11-2b0c12ccbab8.png)

※コマンドプロンプトから登録する場合は以下。
コマンド「setx 変数 値 /m」で追加可能。例：「setx testpath c:\test /m」と入力。

# 2.SASトークンを取得する
コピー元、アップロード先のストレージアカウントのSASトークンを取得します。

**2. 1 コピー元のBLOB画面より共有アクセストークンをクリック。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142984/ed91bb4b-f914-6217-8eba-98ed17dbc8e4.png)

**2. 2 共有アクセストークンのアクセス許可よりすべての項目にチェックを入れる。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142984/680a5f3e-926c-c82f-dd74-aeca70e1ff05.png)

**2. 3 SASトークンを発行しクリップボードにコピーする。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142984/c3bd548d-d596-bf4e-c88e-4f53adb32a93.png)


**2. 4 2.1～2.3までの手順をアップロード先のBLOB画面からも実行する。**
※発行したSASトークンは手順3.1で使用するのでメモ帳に控えておいてください。

# 3.AZcopy の実行
**3. 1 Powershellを管理者権限で実行し、下記のコマンドを実行する。**

```code
azcopy copy "コピー元のBlob の SAS URL" "コピー先のBlob のSAS URL" --recursive=true
```
**3. 2 Final Job Status が Completedになっていたらコピー完了です。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1142984/42d122b4-bcdc-5ba8-a0ec-20880bc8ec84.png)

以上が手順になります。
C#で静的分析ツール(StyleCop.Analyzers)を使用する

# 1. はじめに
* C#のソースコードの記述をある程度統一したいため、制的分析ツールを使用したい
* StyleCop.Analyzersで不要なルールを除外して運用したい

# 2. 開発環境
* C#
* .NET 6
* Visual Studio 2022
* Widows 11
* StyleCop.Analyzers (NuGet)

# 3. StyleCop.Analyzersのインストール
* ソリューションエクスプローラーの依存関係を右クリックして、```NuGet パッケージの管理```を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/cc9d2847-e204-06ad-6c66-95a9f2f77086.png)

* ```StyleCop.Analyzers```をインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b26c476d-3ddf-e24c-f610-2b47bd3bc089.png)

* ```OK```ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f92bfc16-9940-634a-250b-9572f203e5d4.png)

* インストールが完了すると、エラー一覧で警告が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/1c60b17d-36e8-fcc8-93f7-a3a99b905d2c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4525b716-5004-14ca-d5ce-ba4581bd4c7b.png)

# 3. 不要なルールの非公開にする手順
## 3.1. Code Analysis 規則セットの追加
* ソリューションエクスプローラーのプロジェクトを右クリックして、```追加``` > ```追加```を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/c34f3a58-7c21-5cb7-1d5a-762df5a710c9.png)

* ```Code Analysis 規則セット```を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f2096236-a339-677e-91cb-cd4c077f5542.png)

* Code Analysis 規則セットが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/2eea2b5c-0fc9-530d-2a66-00ddc1c244af.png)

## 3.2. Code Analysis 規則セットの設定
* 下記ルールについては英語圏のルール等のため非表示にする

|No  |コード  |タイプ名  |タイプ名  |
|---|---|---|---|
|1  |SA1101  |PrefixLocalCallsWithThis  |ローカルクラスまたは基本クラスのインスタンスメンバーへの呼び出しには、C＃コードファイル内で接頭辞「this.」が付いていません  |
|2  |SA1200  |UsingDirectivesMustBePlacedCorrectly  |AC＃usingディレクティブは、名前空間要素の外部に配置されます。  |
|3  |SA1309  |FieldNamesMustNotBeginWithUnderscore  |C＃のフィールド名は、アンダースコアで始まっています。  |
|4  |SA1629  |DocumentationTextMustEndWithAPeriod  |C＃要素のXmlヘッダードキュメントのセクションは、ピリオドで終わっていません。  |
|5  |SA1633  |SA1633FileMustHaveHeader  |C＃コードファイルに標準のファイルヘッダーがありません。  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/63bb0c4f-5196-bea3-4902-245a6f3b03a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/a59ecfa1-361d-3b19-cd90-75569cc51e22.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5e89f719-1351-8510-3bae-ef06af0d3678.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/74887fd3-2875-22c9-ed28-b429f09d1db4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/73e876a2-02c3-83ac-2434-b9d01f606635.png)


# 4. 参考文献

https://anderson02.com/cs/cs-rules/cs-rules14/

https://anderson02.com/cs/cs-rules/cs-rules19/