OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】migrate時にAnnotateが実行されない

## はじめに
Annotateが実行できず、コメントが書き出されない時に試したことをまとめました。

## 環境
- Rails6.0.3
- Ruby2.7.1
- annotate3.1.1

## Annotateとは
schemaに書かれている情報をルーティングの情報をファイルの先頭にコメントしてくれるgemです。
カラム情報やルーティングを確認する手間が省くことができます。
導入や詳細な使い方は下記を参考にしました。
[【Rails】annotateの使い方](https://qiita.com/kou_pg_0131/items/ae6b5f41c18b2872d527)

## 発生したバグ(migrate時にコメントが書き出されない)
migrate時にannotateが実行され、modelにコメントされる設定にしているのに、実行されないという問題が発生しました。
作業ブランチで1つ目のmigrationファイルを作成して、migrateした時はコメントが書き出されたのに、作業同じブランチで2つ目のmigrationファイルを作成して、migrateしたら、コメントが書き出されませんでした。

いろいろ試しましたが、最終的には一度コメントを削除してから、migrateしたら、上手く行きました。


## やったこと
### 1. 設定ファイルを確認
`$ bundle exec rails g annotate:install`で生成された`lib/tasks/auto_annotate_models.rake`のAnnotateの設定を確認します。

```auto_annotate_models.rake
'skip_on_db_migrate' => 'false', 
```

`false`になっているのでmigrate時にコメントが書き出される設定になっています。(ここは問題なし)

### 2. 手動でAnnotateを実行
migarate時に実行されないので手動でAnnotateを実行します。
これでもコメントが書き出されない。。

```.bash
$ bundle exec annotate --models
```

### 3. gemを再インストール
それでもコメントが書き出されない場合は、gemを最インストールします。
再インストールすると直った場合もありました。

### 4. annotateのコメントを削除する
私の場合、いろいろ試してもコメントが書き出されなかったので、コメントを削除することにしました。

```.bash
$ bundle exec annotate --delete
```

modelからコメントが削除されたことを確認して、migrateもしくは手動で実行。

```.bash
$ bundle exec rails db:migrate

or

$ bundle exec annotate --models
```

削除して、migrateすると全てのモデルに書き出されました。

## おわりに
migrate時にannotateが実行されない原因は結局わかりませんでしたが、ひとまずコメントが書き出されました。
もし、原因がわかる方がいましたら、コメント頂けますと幸いです。
PrivateSubnetからNatGatewayを経由してSESメール配信

#NATGatewayの作成
VPCからNATゲートウェイ選択、作成クリック
![スクリーンショット 2020-10-06 13.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/5b3b69a5-f10e-5e46-df2a-5d2beef82803.png)
適当に名前をつけ、NATゲートウェイをおくパブリックサブネットを指定。ElasticIPの割り当ては自動でよければElasticIpの割り当てボタンをクリックすると勝手に振ってくれる。
![スクリーンショット 2020-10-06 13.07.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/71724a4d-8868-9b12-5711-b7cd3e72e69b.png)

#EC2から外部ネットワークへNATGatewayを経由して接続
VPCのルートテーブルから、対象のEC２インスタンスが存在するPrivateSubnetが明示的に関連づけられたルートテーブルを選択
![スクリーンショット 2020-10-06 13.08.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/8acc102b-a5aa-a9ee-7283-ad3c106d8d9a.png)
ルートの編集をクリック
![スクリーンショット 2020-10-06 13.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/4cabe467-8b3e-3e87-1016-63f5800456f4.png)
送信先を指定、ターゲットに先ほどPublicSubnetに配置したNATを指定。このNATGatewayをSESだけに使用したい場合には、SESのサポートからElasticIPをメールサバーに紐づけるようリクエストして、送信先をそのIPにする。（今回はIP絞らないお手軽版）
ルートの保存をクリック
![スクリーンショット 2020-10-06 13.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/19b070da-fc16-0df3-7584-697dc4c9c556.png)

#アクセステスト
[コマンドラインを使用して Amazon SES SMTP インターフェイスへの接続をテストする](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-email-smtp-client-command-line.html)
送信元になる予定のインスタンス内部で接続テストを実施

```terminal
openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
```

上記で接続確認ができれば、あとはアプリケーションから認証情報を持たせて普通に配信できる。

#備考
S3の場合いはVPCエンドポイントを使用してセキュアにアクセスすることができた、SESの場合にもエンドポイントの使用が可能になったがまだ東京リージョンでは利用できないため今回の対応は暫定的。
invalid query locator エラー


【原因】
ApexバッチのStart処理で、子レコードを取得するインナークエリのあるクエリを使用すると発生するエラー。

【対処法】
子レコードは、execute処理で取得する。

※参考 Salesforce ヘルプページ
Invalid Query Locator エラー
https://help.salesforce.com/articleView?id=000323582&language=ja&type=1&mode=1
Private SubnetにあるEC2からS3へ、VPCエンドポイントを利用してアクセスする

# エンドポイントの作成
VPCからエンドポイント選択
![スクリーンショット 2020-10-06 12.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/a21bc590-156d-89ae-10cb-275904e11cd2.png)
サービス名でS3を検索
![スクリーンショット 2020-10-06 12.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/fcfe2d8c-0e4a-6cb6-8666-8643464db8ba.png)
対象のVPCとPrivateSubnetが明示的に関連づけられているルートテーブルを選択
![スクリーンショット 2020-10-06 12.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/a931e0e9-2776-b17b-c45b-c5c3276c6271.png)
ポリシーは適宜用途に合わせて変更し、作成
![スクリーンショット 2020-10-06 12.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209804/4a8225d1-9c4e-3892-cc06-f2a7fbd66524.png)

# curlでアクセステスト
本来であればプライベートなサブネットに配置しているため、外部ネットワークに出られないはずだが、きちんとS３に到達していることが確認できる

```terminal
curl --verbose https://your.s3.host
```

# VPCエンドポイントとは
外部ネットワークにあるリソースにセキュアにアクセスする方法。[公式](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html)
AWS CLIでオートスケーリンググループの更新・デプロイ

# TL;DL

```terminal
bash deploy.sh v1.1.1
```

```sh:deploy.sh
#!/bin/bash
echo ""
echo "### Start Deploy $1 ###"
echo ""

echo ""
echo "### SSH Server ###"
echo ""
ssh -A YourSSHTarget bash deploy.sh

echo ""
echo "### Creating New AMI ###"
echo ""
created_ami_id=$(aws ec2 create-image --instance-id YourInstanceId --name "InstanceName-$1" | jq -r .ImageId)
echo "AMI_ID: $created_ami_id created"

echo ""
echo "### Update Launch Template ###"
echo ""

# update launch template
prev_template_ver=$( aws ec2 describe-launch-templates \
    --launch-template-ids YourTemplateId | \
    jq -r '.LaunchTemplates[].DefaultVersionNumber')

new_template_json=$(aws ec2 create-launch-template-version \
    --launch-template-id YourTemplateId \
    --version-description $1 \
    --source-version $prev_template_ver \
    --launch-template-data "ImageId=$created_ami_id")
echo $new_template_json| jq .

echo ""
echo "### Restart Autoscaling Group ###"
echo ""
# restart servers
aws autoscaling start-instance-refresh --auto-scaling-group-name YourAutoscalingGroupName
```

# 概要
パイプラインとかコードデプロイとかを使うのがモダンだが、まずはシェルでも良いかということで、書いてみた。

sshで対象のインスタンスに接続、今回はprivate subnetにあるインスタンスだったので、ssh configのプロキシ使用し、踏み台経由でアクセス。リモートサーバーで実行したい処理を実行（ソースコードもってくるなど） githubの認証情報をssh-agentに持たせたため、-Aオプション使用。

```sh
echo ""
echo "### SSH Server ###"
echo ""
ssh -A your-ssh-target bash deploy.sh
```

対象のインスタンス、でアップデート等が済み新しいバージョンが動き始めるようになったら、対象インスタンスからAMI作成。

```sh
echo ""
echo "### Creating New AMI ###"
echo ""
created_ami_id=$(aws ec2 create-image --instance-id YourInstanceId --name "InstanceName-$1" | jq -r .ImageId)
echo "AMI_ID: $created_ami_id created"
```

更新したAMIを元に起動テンプレートの新しいバージョン作成
```--source-version```を指定したかったので、対象起動テンプレートのデフォを取得した。

```sh
echo ""
echo "### Update Launch Template ###"
echo ""

# update launch template
prev_template_ver=$( aws ec2 describe-launch-templates \
    --launch-template-ids YourTemplateId | \
    jq -r '.LaunchTemplates[].DefaultVersionNumber')

new_template_json=$(aws ec2 create-launch-template-version \
    --launch-template-id YourTemplateId \
    --version-description $1 \
    --source-version $prev_template_ver \
    --launch-template-data "ImageId=$created_ami_id")
echo $new_template_json| jq .
```

今回はオートスケーリング グループの設定として常に起動テンプレートの最新バージョンを参照するように設定しているため、あとはインスタンス更新をトリガーする。

```sh

echo ""
echo "### Restart Autoscaling Group ###"
echo ""
# restart servers
aws autoscaling start-instance-refresh --auto-scaling-group-name YourAutoscalingGroupName

```

# 注意
AWS CLI v2.0.54
バージョンが違うと一部コマンドが実行できない。またpipだと最新版まで上げられなかったため公式ドキュメントの方法で最新版をインストールした。

試しに動かす際は、--dray-runをつけた方がいい。実際に変更は加えられないがエラーが起きるかどうか確認できる

ちゃんと使うなら、各種IDは別ファイルを参照させたりする、インスタンスが起動状態を確認する、例外処理を加えるなどの追記が必要。現状とりあえずお手軽版
MySQLがバージョン5から8に飛んだ謎、意外と知らないCharset、Collationのこと

# はじめに
今回はMySQL 8.0について以下の内容を紹介します。

- なぜ、バージョン5から8に一気に上がったのか
- Charsetとは何か
- Collationとは何か

Youtubeでも解説しているので、ぜひ確認してみてください。
[【YouTube動画】MySQL8.0](https://youtu.be/7H_foGxpRlY)
[![MySQL8.0](https://img.youtube.com/vi/7H_foGxpRlY/0.jpg)](https://www.youtube.com/watch?v=7H_foGxpRlY)

# MySQLの名前の由来
MySQLは共同創設者のMichael Widenius (通称 Monty) さんの長女 Myにちなんで名付けられました。
ちなみに、MySQLをベースに、完全なGPLライセンスにしたMariaDBは、次女のMariaにちなんでいます。

[参考]
[Why is the Software Called MariaDB?](https://mariadb.com/kb/en/why-is-the-software-called-mariadb/#:~:text=MariaDB%20continues%20this%20tradition%20by,a%20result%20of%20a%20contest.)


# MySQLがバージョンアップで5から8に上がった理由
MySQL 6.0はストレージエンジンにFalconを搭載したものを作っていたそうです。
しかし、Falconではなく、InnoDBを搭載したものの開発を進めたため、6.0は廃止になりました。

MySQL 7.0はMySQL Clusterと被るのを防ぎ、他のMySQL関連プロジェクトと数字を合わせるために、スキップしたという話です。
開発者のコメントとか特に見つからなかったので、ここら辺は眉唾程度に思ってください。


[参考]
[What happened to MySQL 6 & 7?](https://dba.stackexchange.com/questions/207506/what-happened-to-mysql-6-7)
[MySQL 8.0.0 Development Milestone Release登場！！](http://nippondanji.blogspot.com/2016/09/mysql-800-development-milestone-release.html)

MySQLの歴史に興味があれば、以下のQiita記事が詳しくてオススメです！
[MySQLの歴史が面白い](https://qiita.com/nom_bom/items/75d409b303f4814143c8#%E5%B9%BB%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B31-mysql5254)

# Charsetについて
MySQLではDBに文字を保存するとき、Charset (文字コード) を指定します。
Charsetのデフォルトは、5.7まではlatin1、8.0からはutf8mb4になっています。
昨今の絵文字ブームの影響を受けてか、MySQL 8.0からは絵文字もDBに保存できます！

## Charsetの確認方法
Charsetを確認するのに便利なコマンドを紹介します。

使用できるCharsetの一覧を表示する。

```bash
$ SHOW CHARSET;
```

データベースのデフォルトのCharsetを調べる。

```bash
$ SHOW CREATE DATABASE <db名>;
```

テーブルのデフォルトのCharsetを調べる。

```bash
$ SHOW CREATE TABLE <table名>;
```

[参考]
めちゃくちゃオススメします。浅すぎず深すぎず、MySQL 8.0について説明されています。
[MySQL 徹底入門 第4版](https://www.shoeisha.co.jp/book/detail/9784798162379)


# Collationについて
DBに保存した文字をソートするときの規則としてCollationが使われます。
ただ、これだけでも説明が長くなるので、Collationの読み方だけ紹介します (Collationは別記事で紹介します！)。

Collationの例として以下があるとします。

```bash
utf8mb4_ja_0900_as_cs_ks
```

utf8mb4はCharset (文字コード) の種類を示します。

jaの部分は言語名を示します。中国語ならzh、ロシア語ならruです。

0900はUnicodeのバージョンを示します。

asの部分はアクセントを区別するかどうかを示します。
日本語の場合、濁音、半濁音の区別で、例えば「ぱぱ」と「はは」を区別するかどうかです。
また、アクセントの違いを区別しないときは、aiを付けます (accent insensitive)。

csの部分は大文字小文字を区別するかどうかを示します。
日本語の場合、「びよういん」と「びょういん」を区別するかどうかです。

ksの部分は平仮名、カタカナを区別するかどうかを示します。
言語名をjaにした場合のみ使用できます。

以上のことを踏まえると次のように解釈できます。
意外と読むのは簡単ですね。

```bash
utf8mb4_ja_0900_as_cs_ks
=> ルールを適用する文字は、文字コード utf8mb4、日本語かつUnicode バージョン9.00であり、濁音・半濁音・大文字・小文字・平仮名・カタカナを区別する。
```


# まとめ
今回MySQLのメジャーナンバーの謎、Charset/Collationの意味について紹介しました。
別動画・別記事でもっと詳細にCollationを扱うので、ぜひ楽しみにしてください！

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
AWS Organizationsと無料枠

AWSの無料枠ってOrganizationsのメンバーアカウントだとどうなるんだっけ、というのを再確認したのでメモ。

# AWSの無料枠

AWSアカウントごとに、無料で使えるリソース量が提供される。特にアカウント作成直後は「12 か月無料」「無期限無料」のものが両方利用できるので、使えるサービスの幅が広い。

> **AWS 無料利用枠では、さまざまな AWS のサービスをそれぞれの上限まで無料でお試しいただけます。無料利用枠には、12 か月無料、無期限無料、短期トライアルの 3 タイプがあります。**12 か月無料タイプを使用したサービスでは、アカウント作成日からの 1 年間、所定の上限まで製品を無料でご使用いただけます。無期限無料タイプを使用したサービスでは、AWS アカウントをお持ちのあいだは常に、所定の上限まで製品を無料でご使用いただけます。短期トライアルタイプを使用したサービスでは、選択されたサービスに応じて、所定の期間か、または 1 回に限り、製品を無料でご使用いただけます。
> （[無料利用枠に関するよくある質問](https://aws.amazon.com/jp/free/free-tier-faqs/)）

具体的な利用可能サービスは、「[AWS クラウド無料利用枠 | AWS](https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc)」参照。「750 時間/月のLinux、RHEL、またはSLES t2.microインスタンスの使用」「750時間/月のWindows t2.microインスタンスの使用」などが含まれる。

# AWS Organizationsと無料枠

Organizationsで複数アカウントを統合管理している場合、そのうち1つのアカウントでしか利用できない。利用できない前提で、たまたま無料枠で費用が賄われたらラッキーぐらいに思っておいた方がよさそう。

> お客様がある組織にリンクされている (AWS Organizations において) 場合、当該組織で無料利用枠を利用できるアカウントは 1 つだけです。どのタイプの無料利用枠でも、当該組織の AWS のサービスの使用量は、組織の全アカウントの使用量を集計した数字になります。
> （[無料利用枠に関するよくある質問](https://aws.amazon.com/jp/free/free-tier-faqs/)）

また12か月無料のものは管理アカウント（旧称マスターアカウント）作成日が起算日となるので、メンバーアカウント作成時点ですでにこの期間が終わっているということもあり得る。

> お客様のAWSアカウントが、貴社によってAWS Organizationsで作成されている場合、すべてのメンバーアカウントのAWS無料利用枠の開始日は、その組織の管理アカウントが作成された日となります。
> （[AWS 無料利用枠の資格 - AWS Billing and Cost Management](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/free-tier-eligibility.html)）

# Organizations利用組織ではサンドボックス的なアカウントをどうするか

Organizationsを利用している組織は多いと思うのだけど、そうした組織でも従業員がAWSさわってみたいという時のサンドボックス的なAWS環境をどうするかという方針は必要だろう。AWSアカウントを独立させれば、いろいろな面で業務利用中の他AWSリソースに影響を及ぼさないことを担保できるけど、AWSアカウント作成には次のものが必要になる。

* rootメールアドレス
* （Organizationsのメンバーアカウントでない場合）支払い手段
* （Organizationsのメンバーアカウントでない場合）連絡先情報

Organizations内のメンバーアカウントを使うと、個別に支払い手段（多くの場合クレジットカード）を登録する必要がなく、また統合請求の形で支払い処理が簡素化され、各アカウント（≒利用者）毎の利用料も管理しやすい。一方でAWSの無料枠の恩恵はほとんどなくなる。そのメリット、デメリットを踏まえて…

1. Organizations内でメンバーアカウントを払い出す
2. 各自で（おそらく自分のクレジットカードと連絡先情報で）AWSアカウントを取得する
3. 各自で（〃）AWSアカウントを取得し、サンドボックスを卒業する必要が出てきたら、Organizationsにそのアカウントを招待する

…といったことが考えられそうに思う。3番目がいちばんオイシイのだけど、後から組織の運用ルールとかOrganizationsでの設定とかからくる制約を課すことになる。これをやりたければ、あらかじめルールを整えておいた方がよさそうに思われた。
React用語まとめ

今回はReactの基本的な用語をまとめます。
Reactで出てくる用語が分からない時の参考になれば幸いです。

##SPA(シングルページアプリケーション)
これは、単一のHTMLページでアプリケーションの実行に必要なすべてのアセット（JavaScriptやCSSファイルなど）をロードすることができるアプリケーションです。ページのリロードが発生しないため、ユーザーが快適に使用することができます。
また、全てをシングルページアプリケーションで構築せずとも、既存のウェブサイトの一部分だけを拡張し使用することも可能です。

##ES6、ES2015、ES2016 など
これらの頭字語は全て、ECMAScript言語の標準仕様の最近のバージョンのことを指しています。JavaScript言語とはこれらの仕様に対する実装です。また、アロー関数やクラス、テンプレートリテラル、let, constステートメントなどはES6バージョンで追加されており、できることの幅が大きく変化しています。

##コンパイル
プログラミング言語を、動作する機械が理解できるように翻訳する作業のことです。

##コンポーネント
ページに表示されるReact要素を返す、小さく再利用可能なコードのことです。再利用できることは、プログラミングにおいてとても重要です。
###種類
####class component
 クラスによって定義されたコンポーネント
 
 - React.conponentを継承する。
 - ライフサイクルやstateをもつ。
 - propsにはthisが必要である。
 - renderメソッド内でJSXをreturnする。
  
####functional component
 関数型で定義されたコンポーネント
 
- ES6のアロー関数で記述する。
- stateをもたない。
- propsを引数に受け取る。
- JSXをreturnする。

##props
Reactコンポーネントへの入力のことです。親コンポーネントから子コンポーネントへと順番に渡されるようなデータです。
また、読み取り専用なため、変更されるべきではありません。

##state
コンポーネント内で管理する変数のことです。
あるコンポーネントが時間とともに変化するデータと関連付けられている場合はstateが必要です。
stateとpropsの大きな違いは、propsは親コンポーネントから渡されますが、stateはコンポーネント自身によって管理されるということです。コンポーネントは自身のpropsを変更することができませんが、state は変更することができます。

##ライフサイクルメソッド
コンポーネントの様々なフェーズにおいて実行される特別な関数です。
コンポーネントの時間の流れは、生まれて、成長して、消えていくまでの循環です。それぞれの段階で必要な処理を記述します。

Mounting→Updating→Unmounting

これをなぜ使うのかと言いますと、関数の外に影響を与える関数を記述するためです。

##最後に
Reactを学習する上で登場する基本的な用語を自分なりにまとめてみました。また、Reactの特徴の一つであるJSXについては別の記事にて書かせていただいておりますので、そちらも見て頂けたら幸いです。

URL : https://qiita.com/Taisei-rgb/items/137f24d6256d71bab90a

ここまで記事を読んでいただきありがとうございました。React学習中の方の少しでも参考になれば幸いです。今後もフロントエンドをメインにアウトプットをしていきますので、今後ともよろしくお願い致します。
Oracleのシノニム切り替えについて

あるアプリでOracleのテーブルを参照しており、その参照元テーブルを洗い替えで更新したい場合、
シノニムを使用することによりアプリに影響がないように更新が可能です。

例えば、下記の図のような構成の場合を想定。

![スクリーンショット 2020-10-06 12.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397664/077f714f-78de-e77d-1f57-73ecdf5348f7.png)


#### 現在のシノニム確認
```
SELECT * FROM ALL_SYNONYMS
WHERE SYNONYM_NAME = 'HOGE_TABLE';

+----------------+---------------+----------------+---------------+-----------+
| OWNER          | SYNONYM_NAME  | TABLE_OWNER    | TABLE_NAME    | DB_LINK   |
+----------------+---------------+----------------+---------------+-----------+
| SAMPLE_SCHEMA  | HOGE_TABLE    | SAMPLE_SCHEMA  | HOGE_TABLE_1  | (null)    |
+----------------+---------------+----------------+---------------+-----------+
```

#### シノニムで参照されていないスタンバイ側のテーブルを洗い替え
```
TRUNCATE TABLE SAMPLE_SCHEMA.HOGE_TABLE_2;

INSERT INTO SAMPLE_SCHEMA.HOGE_TABLE_2
SELECT * FROM SAMPLE_SCHEMA.SOURCE_TABLE;
```

![スクリーンショット 2020-10-06 12.05.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397664/89cc8bd6-8c9c-56bc-4d00-4e18a6bcb1ac.png)


#### シノニム切り替え
```
CREATE OR REPLACE SYNONYM SAMPLE_SCHEMA.HOGE_TABLE
FOR SAMPLE_SCHEMA.HOGE_TABLE_2;
```

![スクリーンショット 2020-10-06 12.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397664/aeebba47-b917-d6f4-ea3e-c21af64c7540.png)

#### 切り替え後のシノニム確認
```
SELECT * FROM ALL_SYNONYMS
WHERE SYNONYM_NAME = 'HOGE_TABLE';

+----------------+---------------+----------------+---------------+-----------+
| OWNER          | SYNONYM_NAME  | TABLE_OWNER    | TABLE_NAME    | DB_LINK   |
+----------------+---------------+----------------+---------------+-----------+
| SAMPLE_SCHEMA  | HOGE_TABLE    | SAMPLE_SCHEMA  | HOGE_TABLE_2  | (null)    |
+----------------+---------------+----------------+---------------+-----------+
```
【kintone】IF関数を試してみよう

kintoneのIF関数とは！？
kintoneの文字列（1行）フィールドや、計算フィールドで使える
条件によって値を変えることができる便利関数です！

Excelとほぼ同じ使い方ができるのでぜひ試してみてください＾＾

## IF関数とは

使い方は公式ヘルプによると
[kintoneヘルプ](https://jp.cybozu.help/k/ja/user/app_settings/form/autocalc/if_function.html)
`IF(条件式,真の場合,偽の場合)`

とあります。

この記事では実際にIF関数を使って簡単なアプリを作って使い方を確認してみようと思います。

## ラジオボタン選択によって文字表示を変えるアプリを作る

では、IF関数を使って、

```
ラジオボタンで「もも」と「なし」を選ぶ

「なし」を選んだら「シャキシャキ！」
「もも」を選んだら「みずみずしい！」

のように表示を切り替える
```

というアプリを作ってみましょう。

まずは、

* ラジオボタン
* 文字列（1行）

を準備してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/7a830e45-6186-bab2-cb2c-1c7a3164fd63.png)


### ラジオボタンの設定

**項目と順番**に「なし」と「もも」を入力します。
**フィールドコード**に「果物」と入力して、[保存]ボタンをクリックします。
ついでにフィールド名も「果物」にしておきましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/edbe15e8-ded3-b418-8b3f-c6c610e53910.png)


### 文字列（1行）の設定

「**自動計算する**」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/30fbac95-5ec9-f891-650e-b7612b72c4ee.png)

すると見た目が変わって、計算式を入力できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/887864e8-c648-5260-0b40-be8e7e001bec.png)

赤枠のところにIF関数を使った計算式を入力します。

## 文字列（1行）に計算式を設定する
文字列（1行）の赤枠にIF関数を使った計算式を入力します。

IF関数は

`IF(条件式,真の場合,偽の場合)`

のように書くのでした。

今回は、

```
「なし」を選んだら「シャキシャキ！」
「もも」を選んだら「みずみずしい！」
```

と表示したいので、

* 条件式：果物が「なし」
* 真の場合：果物が「なし」なら「シャキシャキ！」
* 偽の場合：果物が「なし」でない（つまり「もも」）なら「みずみずしい」

と読み替えてIF関数に当てはめていけば良さそうです。

※
**真の場合**とは、「条件式が正しい場合」という意味です。
**偽の場合**とは、「条件式が正しくない場合」という意味です。

というわけで、これらを`IF(条件式,真の場合,偽の場合)`にあてはめると

`IF(果物="なし", "シャキシャキ！", "みずみずしい！")`
となります。

この計算式を赤枠内に入力しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/9b196ea4-2430-f973-ae57-afc0189254d7.png)


### 一度試してみましょう！
ではアプリを保存したら、新規レコード作成画面を表示します。


ラジオボタンで「なし」を選ぶと「シャキシャキ！」に切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/0a5baef1-7c4d-8c54-b852-0c41eb1b8de4.png)


ラジオボタンで「もも」を選ぶと「みずみずしい！」に切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/d7957be9-2fa9-2c30-07a6-fa1ec447e5e2.png)

## まとめ

IF関数の初歩の初歩使い方でした。
Excelとほぼ同じだったと・・・思います＾０＾

次回からは実際に使う場面をイメージした使い方を紹介していきます。
（シリーズ化したい）
[Docker] コンテナの起動を少しでも早くする

# 環境情報

```
Docker Engine v18.09
メモリを20GB程度積んだRHEL7
```

# コンテナが使うファイルシステム

dockerの関連ファイル群は/var/lib/dockerに入っており、特に指定していなければデフォルトのファイルシステムにて動いています。

```
# df /var/lib/docker
..
/dev/mapper/rhel-var ... /var
```

よってローカルにイメージをため込みすぎると以下が逼迫するというのはよく聞く話です。

```
/var/lib/docker/overlay2/
```


# コンテナの起動は連続すると早くなる

意外と知られていない事実に、<b>コンテナを連続して起動すると二回目は少し早く</b>なります。

これはDockerイメージがディスク上に保管されているのかメモリのキャッシュに残っているのかの差です。それを実感したい方は

```
time docker run ubuntu echo "hello"
```

といったようなコンテナを起動してhelloを標準出力するだけのコマンドを連続して叩いてみてください。少し早くなっているはずです。

ちなみに私が遊んでいる環境だと0.8sが0.6sになる程度なので誤差ですが、ここが明確に変化する場合は下記の対応はおススメです。

# /var/lib/dockerをRAMディスクにする

RAMディスクの説明や作り方は割愛しますが、dockerを停止→/var/lib/dockerを丸ごと別名でコピー→新たなファイルシステムとして/var/lib/dockerを用意→コピーしたファイル群を展開→dockerを起動　すると常にキャッシュにのっているスピードで起動されます。

ただし、メモリにのっている都合上再起動するたびに消えてしまうので、例えばイメージをローカルに置いている場合はそこの手当ては必要です。あと、やるのであればメモリが潤沢にある環境でやらないと結果的にシステム全体がSwap起こしたりするので注意してください。

# まとめ

Docker関連のファイルをすべてメモリに乗せることで、コンテナ環境の動作を早くさせることができます。また、<b>本質としてはイメージがディスクにのっているのかメモリにのっているのかによって変わる起動時間の揺れを防ぐ</b>ことが可能になります。連続して起動した際に大きな時間差がある場合、この揺れを無くしている設計は起動失敗判定に時間を使うのであれば重要です。

以上。
【備忘録】WindowsでNode.jsをアップデートする方法

#プログラミング勉強日記
2020年10月6日
Node.jsのバージョンをアップデートするときに少し詰まったので備忘録として記録する。
Windowsではnが使えないので、今回はnodistを用いてNode.jsをアップデートした。

#0. nodistをインストールする
　コマンドプロンプトで`nodist -v`を実行してnoditが使えるかどうかを確認する。使えない場合は、インストールする。以下のようになっていればインストールはできている。

```:コマンドプロンプト
>nodist -v
0.9.1
```

　[こちらのページ](https://github.com/nullivex/nodist/releases)からインストーラーをダウンロードしてインストールする。

![1005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/f46e18a2-3dc9-fb6a-c2a3-4ac68254ace0.png)


#1. Node.jsをインストールする
　次に`nodist dist`でインストールできるバージョンの一覧を表示する。以下のようにとても長くなる。

```:コマンドプロンプト
>nodist dist
  0.1.14
  0.1.15
  0.1.16
  0.1.17
  0.1.18
  0.1.19
  0.1.20
  0.1.21
  0.1.22
  0.1.23
  0.1.24
  0.1.25
  0.1.26
  0.1.27
  0.1.28
  0.1.29
  0.1.30
  0.1.31
  0.1.32
  0.1.33
  0.1.90
  0.1.91
  0.1.92
  (省略)
  11.0.0
  11.1.0
  11.2.0
  11.3.0
  11.4.0
  11.5.0
  11.6.0
  11.7.0
  11.8.0
  11.9.0
  11.10.0
  11.10.1
  11.11.0
  11.12.0
  11.13.0
  11.14.0
  11.15.0
  12.0.0
  12.1.0
  12.2.0
  12.3.0
  12.3.1
  12.4.0
  12.5.0
  12.6.0
  12.7.0
  12.8.0
  12.8.1
  12.9.0
  12.9.1
  12.10.0
  12.11.0
  12.11.1
  12.12.0
  12.13.0
  12.13.1
  12.14.0
  12.14.1
  12.15.0
  12.16.0
  12.16.1
  12.16.2
  12.16.3
  12.17.0
  12.18.0
  12.18.1
  12.18.2
  12.18.3
  12.18.4
  13.0.0
  13.0.1
  13.1.0
  13.2.0
  13.3.0
  13.4.0
  13.5.0
  13.6.0
  13.7.0
  13.8.0
  13.9.0
  13.10.0
  13.10.1
  13.11.0
  13.12.0
  13.13.0
  13.14.0
  14.0.0
  14.1.0
  14.2.0
  14.3.0
  14.4.0
  14.5.0
  14.6.0
  14.7.0
  14.8.0
  14.9.0
  14.10.0
  14.10.1
  14.11.0
  14.12.0
  14.13.0
```
　この中でバージョンを選びインストールする。

```:コマンドプロンプト
> nodist + 13.14.0
> nodist 13.14.0
> node -v (確認)
13.14.0
```

#2. npmをアップデートする
　Node.jsをインストールすると、npmも同時にインストールされるが、nodistでインストールされたnpmのバージョンは古いことがあるので、コマンドでnpmのバージョンを確認し、アップデートする必要がある。

```:コマンドプロンプト
> npm -v
> nodist npm 6.14.4
```
AzureVMに複数アタッチしたディスクの見分け方（Linux編）

AzureVMにデータディスクを複数アタッチした際にディスクを見分ける方法をご紹介します。

まずVMを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/9b604d8c-bbec-fd4e-34b8-e9b65d53ffd0.png)

そこに３つデータディスクをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/283b873d-9c24-37c9-8d63-50556901f729.png)

OSから見てみます。

```
[root@vm4testdd ~]# fdisk -l
・・・（中略）・・・

Disk /dev/sdc: 32 GiB, 34359738368 bytes, 67108864 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/sdd: 32 GiB, 34359738368 bytes, 67108864 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/sde: 32 GiB, 34359738368 bytes, 67108864 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

・・・（中略）・・・
```

うーん、サイズが同じなので見分けがつかない・・・。
そういう時は/dev/disk/azure/scsi1/を見てみます。

```
[root@vm4testdd ~]# ll /dev/disk/by-path
total 0
lrwxrwxrwx. 1 root root 12 Oct  6 02:19 lun0 -> ../../../sdc
lrwxrwxrwx. 1 root root 12 Oct  6 02:12 lun1 -> ../../../sdd
lrwxrwxrwx. 1 root root 12 Oct  6 02:12 lun2 -> ../../../sde
```

ポータルのディスク一覧のLUNとデバイス名の対応がわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24194/06425602-207a-06df-eadf-c7c2eb42afe8.png)


一応/dev/disk/by-pathでもわかりますが、OSディスクなどの情報も出てくるため、
/dev/disk/azure/scsi1の方が一目瞭然ですね。

```
/dev/disk/by-path:
lrwxrwxrwx. 1 root root  9 Oct  6 02:12 acpi-VMBUS:01-vmbus-00000000000088990000000000000000-lun-0 -> ../../sdb
lrwxrwxrwx. 1 root root 10 Oct  6 02:12 acpi-VMBUS:01-vmbus-00000000000088990000000000000000-lun-0-part1 -> ../../sdb1
lrwxrwxrwx. 1 root root 11 Oct  6 02:12 acpi-VMBUS:01-vmbus-00000000000088990000000000000000-lun-0-part14 -> ../../sdb14
lrwxrwxrwx. 1 root root 11 Oct  6 02:12 acpi-VMBUS:01-vmbus-00000000000088990000000000000000-lun-0-part15 -> ../../sdb15
lrwxrwxrwx. 1 root root 10 Oct  6 02:12 acpi-VMBUS:01-vmbus-00000000000088990000000000000000-lun-0-part2 -> ../../sdb2
lrwxrwxrwx. 1 root root  9 Oct  6 02:12 acpi-VMBUS:01-vmbus-00000000000188990000000000000000-lun-0 -> ../../sda
lrwxrwxrwx. 1 root root 10 Oct  6 02:12 acpi-VMBUS:01-vmbus-00000000000188990000000000000000-lun-0-part1 -> ../../sda1
lrwxrwxrwx. 1 root root  9 Oct  6 02:19 acpi-VMBUS:01-vmbus-f8b3781b1e824818a1c363d806ec15bb-lun-0 -> ../../sdc
lrwxrwxrwx. 1 root root  9 Oct  6 02:12 acpi-VMBUS:01-vmbus-f8b3781b1e824818a1c363d806ec15bb-lun-1 -> ../../sdd
lrwxrwxrwx. 1 root root  9 Oct  6 02:12 acpi-VMBUS:01-vmbus-f8b3781b1e824818a1c363d806ec15bb-lun-2 -> ../../sde
lrwxrwxrwx. 1 root root  9 Oct  6 02:12 pci-0000:00:07.1-ata-2 -> ../../sr0
```

デバイス名のマッピングはOS再起動により変わる可能性もあるので、
ファイルシステムにマウントする際はUUIDを指定するようにしましょう。

```
/dev/disk/by-uuid:
lrwxrwxrwx. 1 root root 10 Oct  6 02:19 9ac10116-694f-464a-932e-9b4383b28ac3 -> ../../sdc1
```
URLとドメイン

【概要】
----------------------------------------
<b>1.URLとは</b>

<b>2.ドメインとは</b>

<b>3.URLの構文</b>





1.URLとは
----------------------------------------
"Uniform Resource Location"の略であり、Webサイトの場所を表す文字列になります。
<br>
2.ドメインとは
----------------------------------------
接続先のサーバーの名前です。IPアドレスになるのですが、数字の羅列だとわかりにくいため別名として文字列に置き換わっています。"IPアドレス"とは、インターネット上で接続された機械が持つナンバーことで、住所によく例えられます。ドメインとIPアドレスに変換する仕組みを"DNS"といいます。
<br>
3.URLの構文
----------------------------------------

```tarminal
http://❶****.com❷:80❸/***.html❹/***.***❹
```
一つ一つ分解して説明していきます。
❶スキーム名：プロトコルを指定しています。他にはhttps(httpの通信内容を暗号化したセキュリティ強化Ver),ftp(ファイル転送で使用)があります。
❷ドメイン名：接続先のサーバーを指定し、IPアドレスで指定することも可能です。
❸ポート番号：サーバーの番号を指します。IPアドレスが住所であれば、ポート番号は住所の何号室の何番の部屋という例えになります。省略ができ指定がなければ一般的にhttpは80、httpsは443、ftpは20,21を使用しています。
❹パス名：サーバー上のディレクトリやファイルを指します。
<br>
AmazonLinux2 の EC2 からサクッと MSK の kafka topic を作ったりする方法

kafkacat とか kafka-topic.sh などの kafka-tools をインストールするのめんどいので、Docker でやるアプローチ

## MSK で kafka cluster の describe を得る

```
aws kafka describe-cluster --cluster-arn {{arn:aws:kafka:X:X:cluster/analytical-msk/X}}
```

## kafka-topic.sh で topic を create する

```
sudo docker run wurstmeister/kafka:2.12-2.4.1 /opt/kafka/bin/kafka-topics.sh --create --zookeeper "{{z1,z2,z3}}" --topic test --partitions 1 --replication-factor 1
```

## MSK で bootstrap-brokers を get する

```
aws kafka get-bootstrap-brokers --cluster-arn {{arn:aws:kafka:X:X:cluster/analytical-msk/X}}
```

## kafkacat で topic の list をする

```
sudo docker run -it --network=host edenhill/kafkacat:1.5.0 -b {{BROKER_HOST}} -L
```
RealSense L515で近くの物体をセンシングしたかった話


#### RealSense L515について
現在研究でRealSenseのL515を使用しています。

L515は、
>独自のMEMSミラースキャンテクノロジーを採用したSolid State式LiDAR深度カメラです。従来のToF方式の>LiDARと比べても高効率（※1）なレーザー出力が可能なモデルです。
>※1：デプスストリーミングの消費電力が3.5W未満

（引用：[スイッチサイエンス Intel RealSense LiDAR Camera L515](https://www.switch-science.com/catalog/6369/)）

です。

#### 使用用途
使用用途を簡単に説明すると、車などのレバーをL515でセンシングし、現在のレバーの位置を推定するために使っています。
今回はL515で撮影した深度画像とテンプレートマッチングを使ってレバーの位置を推定します。

#### 困っていたこと
Intel RealSense L515の[製品サイト](https://www.intelrealsense.com/lidar-camera-l515/)によると**Minimum Depth Distance**は**0.25m**と記載されています。

しかし実際に動作確認してみると、0.25m前後の物体は写すことができず、0.50m程度離さなければ物体を写すことができませんでした。

![100.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403760/cb21feb3-5dc0-1ea7-c9b9-7db3ff3b139c.gif)


設置場所の都合上、できるだけ近くにL515を設置したい。
せめて仕様通り、0.25mから写したい。
だけど、ある程度距離を離さないと写せない。

こんな感じで困っていました。

#### 解決方法
このIntel公式の[記事](https://www.intelrealsense.com/optimizing-the-lidar-camera-l515-range/)に答えがありました。

照射する**レーザーの強さを弱くする**と、**写すことのできる距離は短くなる**が**より近くの物体を写すことができるようになる**ことが判明

あとは、レーザーの出力の強さを少し弱めに設定すれば解決です。
Python(pyrealsense2)を使用する際のレーザー設定方法は、SDKのGitHubの[Issue](https://github.com/IntelRealSense/librealsense/issues/1258)に公式の人が回答してくれていたので、そちらを参考にしながら設定。

```python:レーザー出力・範囲の確認
# ストリームの設定
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)

# ストリーミング開始
pipeline = rs.pipeline()
profile = pipeline.start(config)

# レーザー出力・範囲の確認
depth_sensor = profile.get_device().first_depth_sensor()
laser_pwr = depth_sensor.get_option(rs.option.laser_power)
print("laser power = ", laser_pwr)
laser_range = depth_sensor.get_option_range(rs.option.laser_power)
print("laser power range = " , laser_range.min , "~", laser_range.max)
```


設定されているレーザー出力の強さと設定可能な範囲を確認してみると、

```:出力結果
laser_pwr = 100.0
laser power range = 0.0 ~ 100.0
```

デフォルトでは、最大値の`100`が設定されていました。

設定方法は下記の通りです。

```python:レーザー出力の設定
set_laser = 10
depth_sensor.set_option(rs.option.laser_power, set_laser)
```

この設定をすることで、無事にL515で近くのものをセンシングすることができるようになりました。

![10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403760/e39cd0db-4c99-2db1-69e3-c353955d1af0.gif)


#### 環境構築について（おまけ）
Mac+PythonでRealSenseを扱いたい場合、環境構築も少しつまずく可能性があるので、私が環境構築する際に参考にしたものを共有しておきます。
- [macOS Installation](https://github.com/IntelRealSense/librealsense/blob/master/doc/installation_osx.md)
- [Mac に pyrealsense2 をインストールする](https://qiita.com/comachi/items/14b358568365bc5ee474)
[SwiftUI]backgroundの指定場所ごとにどのように変わるかを調べてみた

SwiftUIでbackgroundの指定で思ったように塗りつぶしてくれなかったりしたので、どこで指定したらどのように塗り潰されるかを調べてみました。

### コードとView

```swift
struct ContentView: View {
        
    var body: some View {
        VStack {
            Spacer()
            Text("Hello world!")
                .foregroundColor(Color.white)
                .background(Color.green)
                .frame(maxWidth: .infinity, minHeight: 50)
                .background(Color.blue)
                .padding()
                .background(Color.orange)
            Spacer()
        }.frame(width: 320, height: 100)
    }
    
}

// Present the view controller in the Live View window
PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
```

![スクリーンショット 2020-10-06 11.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/d9ad126a-189f-022d-0b4e-e776b92b89b8.png)

### 解説

- `frame`の前に`background`を指定すると、テキストギリギリの範囲で塗りつぶされました（緑色）
- `frame`の後に`background`があり、かつ`background`の後に`padding`がある場合は、`padding`分内側で塗りつぶされました（青）
- `padding`の後に`background`を指定すると、`padding`も無視した領域で塗りつぶされました（オレンジ）

このように`background`の位置に注意することで、想定通りの塗りつぶしができそうです。
Mysqlの構文を使って計算した結果をWHEREで取り出す

# はじめに
はじめての投稿です。
20代は不動産付け、30代未経験、就活一社でそのままその自社開発企業に内定頂きました駆け出しエンジニアです。
今日はMysqlについて書きます。

土地のデータから一定の条件を満たすものを取り出すというプログラムです。
坪単価１００万円以下の土地をピックアップします。

create TABLEから。


```sql

-- テーブルをcreate (カラム：id :m2 :price)
CREATE TABLE lands(
 id INT NOT NULL AUTO_INCREMENT,
 m2 INT,
 price INT,
 PRIMARY KEY (id)
);

-- 次にデータをテーブルに入れ込みます
INSERT INTO lands (m2, price) VALUES
 (200, 100000000),
 (300, 30000000),
 (500, 40000000),
 (100, 50000000);

-- ＊（データぜんぶ）をSELECTしてlandsテーブルからWHEREで条件にあう形でデータを取り出します。
-- 「坪単価」なので定数3.30578を入れます。

SELECT * FROM lands WHERE price / m2 * 3.30578 < 1000000 ;

```

今回はテーブルを作り、データを入れ込むところからやりましたが、
もし、データが蓄積されているような場合であれば、

```sql
SELECT * FROM　テーブル名　WHERE　条件;
```

で取ってくることができますね。
以上です。


※　INT：整数ですよ、という宣言です。
※　NOT NULL：NULLを許さないよという記述です。主キーなのにNULLではこまりますので。
※　AUTO_INCREMENT：自動でidを連番で入れ込んでくれる便利なメソッドです。
※　PRIMARY KEY (id):idカラムのデータが主キーですよ〜という宣言です。これがないとAUTO_INCREMENTは使えません。
※　INSERT INTO：これから先に宣言するデータを入れ込みますよ〜という記述です。
※　VALUES：値のことです。上で言うと、（m2,price）となっているので、(m2 => 200, price => 1000000)と言う意味です。
ラーメンで学ぶJava　【その１】

#Javaをラーメンで学ぼう
なぜならみんなラーメンが好きだから。
Javaの基本をラーメンを通して学びましょう。

#一連の目標

- Javaの基本を理解して書けるようになる

読者のみなさんがこれくらいのレベルに達してくれたら嬉しいなあ。

#出力にチャレンジ
プログラミング学習において、"This is a pen."にあたる導入は"Hello World!"と出力することです。
しかし、ラーメン大好きなみなさんには「ラーメン大好き」と出力していただきます。

Javaで出力したい時のキーワードは
**System.out.println();**
です。この`()`の中に入れた内容が出力されます。

「ラーメン大好き」と出力したいならこう。

```java:Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println("ラーメン大好き");
    }
}
```

今は、
`public class Main`
`public static void main(String[] args)`
とかは気にせず、
**System.out.println();**の`()`中に"ラーメン大好き"
が入っていることを確認してください。

この状態で実行するとコンソールに
「ラーメン大好き」が出力されると思います。

念のため注意していただきたいのは、

- `""`や`()`、`{}`は半角であること。

です。これさえ守っていれば動くはずです。

さて、もしあなたが「ラーメンを食べたい」となった場合はどうすれば良いでしょうか。
「ラーメン大好き」を「ラーメンを食べたい」に置き換えれば大丈夫です。

```java:Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println("ラーメンを食べたい");
    }
}
```

あなたがラーメンを食べたがっていることが伝わったかと思います。

#変数について
上で書いた「ラーメン大好き」文をもう少しスマートに書いてみましょう。
スマートに書くには変数を使います。


変数はよく箱に例えられます。
箱に文字や数字を入れることで、その箱を見た人がその中の値を確認・利用することができるという仕組みです。

しかし、「ラーメンで学ぶJava」である以上、ラーメンに絡めた説明もしておきます。

我々が店でラーメンを食べる際、ラーメンは器に入っています。まさか麺とスープを手渡しするような店はないはずです。この「器」に相当するのが「変数」だとここでは思ってください。

店主さんが作ったラーメンが器に入って我々に提供され、我々は器の中身のラーメンを頂くわけです。

Java（や多くのプログラミング言語）も同様で、誰かが計算した結果を「変数」にいれ、我々はその変数の中身を使って更に計算をしたり、中身を出力したりするわけです。

では、変数を使って「ラーメン大好き」文を書いてみましょう。

```java:Main.java
public class Main {
    public static void main(String[] args) {

        String love = "ラーメン大好き";

        System.out.println(love);
    }
}
```

ここではあなたのラーメン愛を`love`という変数に込めました。
**System.out.println(love);**
によってあなたの愛の中身を出力しているのです。

「ちょっと待って、`String`って何。」
となった方、次回をお待ちください。
ComposerのPHPパスを変更する

PHPアプリケーションを開発する際に、Composerで使用するPHPバージョンを変更したい場合があります。
composerコマンドは環境変数Pathに設定されているものを使うので、実行対象のPHPのパスを変更する必要があります。

1.composer.batを検索します。

```
where composer.bat
```

2.プロジェクトフォルダへコピーする
3.コピー先のcomposer.batを下記のように編集する

```
@ECHO OFF
php “%~dp0composer.phar” %*
```
↓

```
@ECHO OFF
【設定対象としたいPHPの絶対パス】 “%~dp0composer.phar” %*
```
4.コピー先のcomposer.batを実行する
win10へ入れたanacondaからwsl上のipynbの起動



# 要望

学生さんがwin10でjupyter notebookを入れて，そのまま使ってます．でも，私はwslでfilesを同期しているのでそこへすんなりアクセスしたいです．


# 試行錯誤

-   **wslからのanacondaの起動:** wslへinstallするのはありますが，win10上のjupyter notebookを開くやり方は不明です．
-   **powershellでalias作成:** cdの長いのをaliasにできないかと思ったのですが，wshを云々カンヌンで挫折．


# 当座の方法

-   anaconda navigatorでpowershellを立ち上げて，
-   `cd \\wsl$\Ubuntu\home...` とうってから， `jupyter notebook` する．
-   補間が効くんでそれほどしんどくないかも．
-   でもはじめのUbuntuまでは覚えとく必要あり．ここでね．



------
 - **source** ~/Desktop/lecture_20f/math_python/jupyter_notebook_on_win10.org
msys2サーバダウンによる不具合回避方法の記録

# 2020/10/8 現在repo.msys2.orgは稼働しているようです．
よって以下の回避方法は不要と思われます．手順2で#をつけた行をもとに戻しておくといいかもしれません．

# 2020/10/6 現在repo.msys2.orgが落ちています
したがってパッケージのインストールや更新が出来ません．．．

# 不具合の回避方法
以下こちらの環境でやったことをまとめます．**なお，設定ファイルは，当該ファイルを右クリックし，「プログラムから開く」を選び，メモ帳で開いて編集してください．**

# 1. gpgフォルダの削除

- `mingw64.exe`(Chocolateyを使ってインストールしている場合は`C:\tools\msys64\｀にあります）を実行してターミナルを開く．

- 以下のコマンドを入力して，破損している鍵が含まれる情報を削除，その他諸々．**実行し終えたら，ターミナルを閉じる．**

```
rm -r /etc/pacman.d/gnupg/
rm -r .gnupg/
gpg --refresh-keys
```

# 2. pacman関連設定ファイルの編集

(例えば)`C:\tools\msys64\etc\pacman.d\`にある，以下の設定ファイルを下の例を参考に，編集する．（Serverから始まる行のはじめの3行の先頭に#を追加するだけ．）

- mirrorlist.mingw32
- mirrorlist.mingw64
- mirrorlist.msys

```:mirrorlist.mingw32
##
## 32-bit Mingw-w64 repository mirrorlist
##

## Primary
## msys2.org
#Server = http://repo.msys2.org/mingw/i686/
#Server = https://sourceforge.net/projects/msys2/files/REPOS/MINGW/i686/
#Server = https://www2.futureware.at/~nickoe/msys2-mirror/mingw/i686/
Server = https://mirror.yandex.ru/mirrors/msys2/mingw/i686/
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/
Server = http://mirror.bit.edu.cn/msys2/mingw/i686/
Server = https://mirror.selfnet.de/msys2/mingw/i686/
```

```:mirrorlist.mingw64
##
## 64-bit Mingw-w64 repository mirrorlist
##

## Primary
## msys2.org
#Server = http://repo.msys2.org/mingw/x86_64/
#Server = https://sourceforge.net/projects/msys2/files/REPOS/MINGW/x86_64/
#Server = https://www2.futureware.at/~nickoe/msys2-mirror/mingw/x86_64/
Server = https://mirror.yandex.ru/mirrors/msys2/mingw/x86_64/
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/
Server = http://mirror.bit.edu.cn/msys2/mingw/x86_64/
Server = https://mirror.selfnet.de/msys2/mingw/x86_64/
```

```:mirrorlist.msys
##
## MSYS2 repository mirrorlist
##

## Primary
## msys2.org
#Server = http://repo.msys2.org/msys/$arch/
#Server = https://sourceforge.net/projects/msys2/files/REPOS/MSYS2/$arch/
#Server = https://www2.futureware.at/~nickoe/msys2-mirror/msys/$arch/
Server = https://mirror.yandex.ru/mirrors/msys2/msys/$arch/
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
Server = http://mirror.bit.edu.cn/msys2/msys/$arch/
Server = https://mirror.selfnet.de/msys2/msys/$arch/
```

# 3. `gpg.conf`の編集
（例えば）`C:\tools\msys64\etc\pacman.d\gnupg\gpg.conf`を以下のように編集．
（`lock-never`の下の行にに，`keyserver hkp://keys.gnupg.net:80`）を追加するだけ．）

```:gpg.conf
no-greeting
no-permission-warning
lock-never
keyserver hkp://keys.gnupg.net:80
keyserver-options timeout=10
keyserver-options import-clean
keyserver-options no-self-sigs-only
```

# 4. ターミナルでの作業

- `C:\tools\msys64\mingw64.exe`を実行し，ターミナルを開く．

- 以下のコマンドを実行する．

```
pacman-key --init
pacman-key --populate
pacman-key --refresh-keys
pacman -Syu
```

最後のコマンドで正常にパッケージデータベースが更新され，更新のあるパッケージのアップデートが出来ればOK.
EC2のインスタンスの違い(オンデマンド・リザーブド・スポット)

## オンデマンドインスタンス

- 概要
	- 時間課金制の料金体系
	- 初期費用なし
	- 普通にインスタンスを立てると、こちらの費用が発生する

- 購入方法
	- EC2 > インスタンス > インスタンスの作成 から作成可能 (普通のサーバ作成方法)

![2020-09-30インスタンス _ EC2 Management Console - Google Chrome 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c39aade0-5e73-71d0-dc43-247c4c4ea369.png)


## リザーブドインスタンス

- 概要
	- 予約金の支払いをすることで、時間単価の割引が行われる
	- 前払い有りにすると初期費用が発生する
	- 1年や3年単位での購入になる

- 購入方法
	- EC2 > リザーブドインスタンス > リザーブドインスタンスの購入 から購入できる

![リザーブドインスタンス _ EC2 Management Console - Google Chro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b95e9f75-fea2-b27d-0c90-a83a53ab077c.png)


## スポットインスタンス

- 概要
	- 初期費用なし
	- 余剰のインスタンスを入札制で使用することで安い価格で利用できる。
	- 需要と供給によりオンデマンドより高い場合がある
	- サーバ使用中に、入札価格よりサーバ価格が高くなればサーバが落ちる

- 購入方法
	- EC2 > スポットリクエスト > スポットインスタンスのリクエスト から購入できる

![EC2 Management Console - Google Chrome 2020-09-30 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/303924aa-facf-73c1-7f32-5684de41431f.png)

- ※EC2の作成の画面からでも、`スポットインスタンスのリクエスト` から購入できる

![2020-09-30 インスタンスウィザードを起動 _ EC2 Management Console - Google C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b952771c-bec1-a789-1033-23710c0bdb04.png)


## 参考

- [EC2のオンデマンド、リサーブド、スポットの違い](https://awsjp.com/AWS/hikaku/OndemandInstance-ReservedInstance-SpotInstance-hikaku.html)
- [スポットインスタンスを安定して利用するための取り組み](https://qiita.com/megadreams14/items/766ce04ca6cb418e95ca)
- [AWSマイスターシリーズ リザーブドインスタンス&スポットインスタンス](https://www.slideshare.net/AmazonWebServicesJapan/aws-16524731)
PHPにおける配列のループ処理における基本コード

### 配列の基本コード

PHPで配列を使ったループ処理の基本的なコードを記述する。

```
$arr = ['a', 'b', 'c'];     //a,b,cの３つの要素を持つ配列
echo $arr[0] . PHP_EOL;     //配列の1番目の要素を表示
echo '-------------' . PHP_EOL;

foreach($arr as $ele) {     //配列をループ処理
    echo $arr[1] . PHP_EOL; //2番目の要素を表示
    echo $ele . PHP_EOL;    //要素を表示
    echo '-------------' . PHP_EOL;
}
var_export($arr) . PHP_EOL; //配列の中身を表示
```
表示結果

```
a
-------------
b
a
-------------
b
b
-------------
b
c
-------------
array (
  0 => 'a',
  1 => 'b',
  2 => 'c',
)
```

### 説明
配列は０番目から始まるため、$arr[0]が要素の’a'にあたる。

```
$arr = ['a', 'b', 'c'];     //a,b,cの３つの要素を持つ配列
echo $arr[0] . PHP_EOL;     //配列の1番目の要素を表示
```
$eleを要素の変数とする。

$arr[1]は'b'であり、要素数は３つのため、ループ処理をするとbが３回表示される。

直後に'echo $ele'があるので、３回表示しているbの次にa,b,cがそれぞれ表示されている。

```
foreach($arr as $ele) {     //配列をループ処理
    echo $arr[1] . PHP_EOL; //2番目の要素を表示
    echo $ele . PHP_EOL;    //要素を表示
    echo '-------------' . PHP_EOL;
}
var_export($arr) . PHP_EOL; //配列の中身を表示
```
Github Actions > 特定ブランチだけ無視する



branches-ignore:を使う



```yaml
on:
  push:
    # Sequence of patterns matched against refs/heads
    branches-ignore:
      - 'mona/octocat'      # Push events to branches matching refs/heads/mona/octocat
      - 'releases/**-alpha' # Push events to branches matching refs/heads/releases/beta/3-alpha
    # Sequence of patterns matched against refs/tags
    tags-ignore:
      - v1.*           # Push events to tags v1.0, v1.1, and v1.9
```



[GitHub Actionsのワークフロー構文 - GitHub ヘルプ](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#onpushpull_requestbranchestags)
AWS CodePipeline メモ 複数ブランチの追跡


更新日：2019/10/06


# 目的

## 現状

CodePipelineの設定画面で、Githubを選択した場合、ブランチ選択が必須になっている

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/5d03d7e1-1917-b4ee-3fe1-c1e0e26b20e8.png" width=300 />


## ゴール

Master以外のいずれのブランチにPushされてもCodePipelineが発火し、デプロイされてほしい

## なぜやりたいか？

* 他のCIツールでは複数ブランチからの発火ができている。
* 同じことやりたい



## AWS CodePipelineの仕様 
複数ブランチの選択


### スタックオーバーフロー

AWS CodePipelineで複数ブランチのTrackingしたい

以下のスタックオーバーフローで質問あり
[Can AWS CodePipeline track multiple feature branches and run tests on each? - Stack Overflow](https://stackoverflow.com/questions/46696036/can-aws-codepipeline-track-multiple-feature-branches-and-run-tests-on-each)


提案された解決法は以下

* 1. AWS Lambdaを使用して動的にパイプラインを作成(複製)する。
* 2. 外部CIを使ってCodePipelineに反映


※2019年現在もAWSには複数ブランチ対応はされていない

### 1. 動的にパイプラインを作成

残念ながら、CodePipelineの複数のブランチからビルドをトリガーすることはできません。 
私が使用した他のすべてのCIツールがすぐにこの機能を提供するため（GitLabCI、TravisCI、CircleCI、Bitbucket Pipelines、TeamCity）少し驚きです。

以下を参考にPushのたびに動的にパイプラインを作成する方法

[nicolai86/awesome-codepipeline-ci: an AWS CodePipeline, AWS CodeBuild, AWS APIGateway & AWS Lambda CI](https://github.com/nicolai86/awesome-codepipeline-ci)


### 2. 外部CIを使う




## 仕様について


[Serverless CI/CD for the enterprise on AWS](https://aws.amazon.com/jp/quickstart/architecture/serverless-cicd-for-enterprise/)


[aws-quickstart/quickstart-trek10-serverless-enterprise-cicd: AWS Quick Start Team](https://github.com/aws-quickstart/quickstart-trek10-serverless-enterprise-cicd)




# 情報


## 

[GitHub/CodeBuild/CodePipelineを利用してCloudFormationのCI/CDパイプラインを構築する ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/developing-cloudformation-ci-cd-pipeline-with-github-codebuild-codepipeline/)
>CodePipelineの場合、GitHubをアクションに指定すると1ブランチ1パイプラインで設定するようです


## cloud formation

[AWS CodePipelineをCloudFormationで構築してみた ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/create_codepipeline_in_cloudformation/)

設定にBranchは必須のようである

```
 Branch:
    Type: String
    Description: GitHub Branch
```

## match

[AWS::CodePipeline::Webhook WebhookFilterRule - AWS CloudFormation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookfilterrule.html)

>ここで指定した値が「refs/heads/{Branch}」であり、ターゲットアクションのアクション設定プロパティが「Branch」という名前で値が「master」である場合、MatchEquals 値は「refs/heads/master」として評価されます。


## AWS 仕様

[CodePipeline パイプライン構造のリファレンス - CodePipeline](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/reference-pipeline-structure.html)

>GitHub > Branch > 必須
【VR日記④】VRギャラリーを建設しました

VRど素人ですが、自分のHubsを持った あいちゃんです！今日も元気です！
[【VR日記③】](https://qiita.com/web500/items/fde537c80629d0f0cd5d)で、**VRギャラリーを建設しよう！**という意気込みを書きました。
その後、名古屋の**xR House**でサポート＆研修を受け、ギャラリーが完工しました。

#スポークの存在を知らなかった…
**xR House**のむろまちくんに相談する前に、まずは「やれるとこまでやってみよう」と、自分なりにHubsを触ってみました。

空間に自分の描いたイラストを持ち込むことはできました。
でも、それらを壁に設置しようとするとうまくいかない…。
ためしに、スポンジボブやバッドばつ丸を床に置いてみたのですが、ぴったり置くことができず、浮いてしまうのです。
[![VRoom_Ai-chan_uki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587320/3b777f51-049b-90dd-faea-42b27af8a88a.png)](https://youtu.be/CbwjYsLYMLI)

#スポークで作るんです！
**xR House**で研修を受けてわかりました！
MozillaHubsのなかでクリック＆ドラッグでモノを置くだけではダメなんです。
空中で、あるいは、壁から離れたところで「ピンどめ」してもだめなんです。
（あれこれやっていくうちに、ピンどめというボタンを見つけました。）

空間にモノをピタッとくっつけるのはもちろん、3Dモデル・画像・動画を使って独自のVR空間を作りたかったら、**[Spoke](https://hubs.mozilla.com/spoke)**というブラウザアプリ（Webサービス？）を使う必要があることを知りました。

🦊フェレットを棚板にぴったり座らせることができました！
![20201005-spoke.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587320/51e6a3bd-e4a3-59c1-1ccf-7fb67d4b6bab.png)
VR空間にある物体はほとんど3Dなので、X軸・Y軸に加えてZ軸も考えないといけないんですね。

Z軸を下げすぎると、フェレットの足が板に埋まってしまいます…。
む、むずい。指がつる…。慣れるまで苦労しそうです。パソコンはMacだけど、マウスを買う必要がありそうです。

#あいちゃんギャラリーのスポーク画面
**Spoke**を使えば、瀬戸市のグランドキャニオン（陶土採掘場）に、ギャラリーを建てることが可能です！徹夜してSpokeを触れば 一夜城が完成させられるんです。

![20201006-spoke.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587320/7e49453b-f3fe-2099-f478-fde76f4f763c.png)


この建物のどこかに、[【VR日記③】](https://qiita.com/web500/items/fde537c80629d0f0cd5d)でいただいた「アーティスト活動支援事業 助成金」（瀬戸市）のバナーをこっそり貼ろうと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587320/75a8cebf-80c7-f0bd-ecd9-b8dd052c8da7.jpeg" width="300">


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587320/3c4765ef-86b2-4238-600c-45111b1baf82.png" width=10%> ＞＞＞ということで、今回はSpoke by Mozillaのお話でした。【VR日記⑤】へ続く・・・
Gradle > Multi-Project




[Authoring Multi-Project Builds](https://docs.gradle.org/current/userguide/multi_project_builds.html)



## sample code

The code for this example can be found at 

[gradle/subprojects/docs/src/samples/userguide/multiproject/firstExample/water at master · gradle/gradle](https://github.com/gradle/gradle/tree/master/subprojects/docs/src/samples/userguide/multiproject/firstExample/water)



### Example 2. 
Build script of water (parent) project


```kotlin:build.gradle.kts
val cl = Action<Task> { println("I'm ${this.project.name}") }
tasks.register("hello") { doLast(cl) }
project(":bluewhale") {
    tasks.register("hello") { doLast(cl) }
}
```


gradleを実行してみる

```
> gradle -q hello


実行結果
I'm water
I'm bluewhale

```



### Example 4.
Water project build script


```kotlin:build.gradle.kts
allprojects {
    tasks.register("hello") {
        doLast {
            println("I'm ${this.project.name}")
        }
    }
}
```


gradleを実行してみる

```
> gradle -q hello


実行結果
I'm water
I'm bluewhale
I'm krill

```





### Example 5.
Water project build script


```kotlin:build.gradle.kts
allprojects {
    tasks.register("hello") {
        doLast {
            println("I'm ${this.project.name}")
        }
    }
}
subprojects {
    tasks.named("hello") {
        doLast {
            println("- I depend on water")
        }
    }
}
```


gradleを実行してみる

```
> gradle -q hello


実行結果
I'm water
I'm bluewhale
- I depend on water
I'm krill
- I depend on water

```
Djangoでallauthを使ってメールの2段階認証を実装する

#やること
Djangoでallauthを使ってユーザ登録機能を作る。
仮登録→メールが送信される→メールの中のリンクをクリックして本登録完了　の流れ。
今回はメールを送信する代わりにメールの文面をコンソールに表示する。

完成例はこちら↓　（多少カスタマイズしているので、完全に同じものができるわけではない。特に本登録完了画面）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650644/82263a47-164c-5188-c214-a965689bfa94.png" width="600">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650644/6d90197a-d02a-0a2b-61b1-d6f181c4792b.png" width="600">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650644/f1e2c1be-016c-2e7e-d254-4c47135dc057.png" width="600">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650644/05a2b4e5-f22a-60af-6eaa-ec68335cfce7.png" width="600">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650644/cd9c9634-db43-7241-5883-6f9b0f77bf52.png" width="600">


allauthでは、会員登録だけでなく、ログイン・ログアウト・パスワード再設定・Facebookやgoogleなどによるソーシャルログイン機能なども実装することができるが、今回はユーザ登録のみを作る。

#前提
ユーザ登録機能を作るプロジェクトは作成済みとする。

#環境
Ubuntu20-04
Django3.1
django-allauth 0.42.0

#手順
###①django-allauthのインポート
`pip install django-allauth`　でインポートできる。

###②ユーザ認証用のアプリケーション「accounts」を作成
`python manage.py startapp accounts`

###③settings.py
下記の＃の部分を追加する。

```python:settings.py
TEMPLATES = [
  {
     'BACKEND': 'django.template.backends.django.DjangoTemplates',
     'DIRS': [],
     'APP-DIRS': True,
     'OPTIONS': {
          'context_processors': [
               `django.template.context_processors.request',＃
           ],
      },
   },
]

AUTHENTICATION_BACKENDS = [
#allauthのあるなしにかかわらず、管理画面にユーザーネームでログインするのに必要
    'django.contrib.auth.backends.Modelbackend',

#allauthを使うときに必要
    'django.account.auth_backends.AuthenticationBackend',＃
]

INSTALLED_APPS = [
    'django.contrib.auth',＃
    'django.contrib.messages',＃
    'django.contrib.sites',＃
    'allauth',＃
    'allauth.account',＃
    'allauth.socialaccount',＃
]

SITE_ID = 1

#ユーザ登録確認メールを送信
ACCOUNT_EMAIL_VARIFICATION = 'mandatory'
ACCOUNT_EMAIL_REQUIRED = True

#コンソール上にユーザ登録確認メールを表示。ローカルで確認するため
EMAIL_BACKEND = 'django.core.backends.console.EmailBackend' 
```

`ACCOUNT_EMAIL_VARIFICATION`のところで、`'mandatory'`にすると確認メールが送られ、`'none'`にするとメールは送られない。

###④urls.py

```python:urls.py
from django.urls import path, include

urlpatterns = [
    path('accounts/', include('allauth.urls')),＃
]
```

ユーザ登録ページのurlやテンプレートは不要。allauthが提供しているため。
（ただしデザインはあんまりなので、カスタマイズした方がいい。でもこの記事では扱わない）
ちなみに、allauthが提供しているurlは、以下で確認できる。
[Django - Django Allauthを使う | django Tutorial](https://riptutorial.com/ja/django/example/29948/django-allauth%E3%82%92%E4%BD%BF%E3%81%86)

###⑤マイグレーション
`python manage.py migrate`を実行する。

###⑥確認
`python manage.py runserver`を実行して、[localhost:8000/accounts/signup/](localhost:8000/accounts/aignup/)　にアクセスする。

#終わりに
自分が会員登録機能を作っていて少し手間取ったので、覚え書きとして書きました。
筆者はDjango初心者です。間違っているところがある可能性が大いにあるので、発見された際はご指摘いただけるとありがたいです。

#参考
[Welcome to django-allauth! -django-allauth 0.32.0](https://django-allauth.readthedocs.io/en/latest/index.html)
[爆速で作れるDjangoユーザ認証機能【django-allauth】](https://sinyblog.com/django/django-allauth/)
Github で採用するFlowについてのメモ





[Git利用時のフローはどれを使うか - Qiita](https://qiita.com/tkhm/items/cc7855d32d640687b43c)


[Pete HodgsonさんのFeature-togglesが面白かったので翻訳してみた - Qiita](https://qiita.com/TsuyoshiUshio@github/items/51c6662cd45bded95389)


[GitLab flowから学ぶワークフローの実践 | POSTD](https://postd.cc/gitlab-flow/)


[2019年のDevOps/MLOpsエンジニアの標準的スキルセット - Qiita](https://qiita.com/poly_soft/items/8dd105341869f93b129c#git%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E9%81%A9%E5%88%87%E3%81%AA%E8%A8%AD%E8%A8%88%E3%81%A8%E3%82%BF%E3%82%B9%E3%82%AF%E7%B2%92%E5%BA%A6%E3%81%AE%E7%AE%A1%E7%90%86)