OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Solution Architect Associateへの道〜第８夜

# AWS Systems Manager

Q1. SSMでAutoScaling構成のEC2を管理している。RDPやSSHを用いずに、インスタンスの設定を行うためには何を利用すればよいか。

A1. AWS Systems Manager Run Command

EC2 or オンプレサーバにSSMエージェントを入れることで、マネージドインスタンスとしてSSMから管理を行える。Run Commandを利用することで、管理者タスクの自動化やアドホックな設定変更を行える。Run Commandは追加費用なしで、AWSマネコン・AWS CLI・AWS SDK・AWS Tools for Windows Powershellから利用できる。

# Cloud Hardware Security Module(CloudHSM)

Q1. とある企業がウェブアプリケーション向けにCloudHSMを利用している。Adminへのログインに3回失敗して、HSMが初期化されてしまった。不幸なことにkeyをローカルにコピーもしていなかった。どのように復旧すべきか？

A1. 打つ手なし！

- Administratorへのログインに3回失敗すると、全てのkey, certificates, その他のデータが破壊される仕様
- AWSサポートに問い合わせてもダメです
- AWSとしては、複数のAZに２個以上のHSMを利用することを強く推奨
- シングル構成のHSMインスタンスに異常が発生した場合も同様にkeyは失われるそうです

# Trusted Advisor

Q1. あなたの全てのAWSリソースがそれぞれのサービスの制限を超えないようにせよとの指示を受けた。これを実現するAWSサービスは？

A1. Trusted Advisor

以下についてAWSのベストプラクティスに基づいたレコメンデーションをしてくれる。
AWS Inspectorはデプロイされたアプリケーションのセキュリティ診断を自動で行ってくれるツール。

* コスト最適化
* セキュリティ
* フォルトトレランス
* パフォーマンス
* サービスリミット

# Workspaces

Q1.10台のデスクトップコンピュータをオンプレのADで管理している。今後着任する社員にはAWS上の用意したVDIを支給することになった。現行ADでの管理を継続するためのAWS上のサービスのセットは？

A1.AWS Directory Sevice, VPC connection, Amazon Workspaces
AWS Solution Architect Associateへの道〜第７夜

# Route53

Q1. パブリックなロードバランサーに対して、Route53を用いてDNS Zone Apexレコードを設定するには、どのように設定すれば良いか？

A1. ELBのDNS名に対するエイリアスAレコードを作成する

エイリアスはAWS Route５３固有の仮想レコード。CNAMEのように機能して、DNS名を別のターゲットDNS名(ELBとかS3とか)にマッピングすることができる。それらはリゾルバーに表示されないという点でCNAMEと異なる。リゾルバーにはAレコードと、結果として生じるターゲットレコードのIPアドレスだけが表示される。

ZONE Apex（=ドメイン名そのもの）をCNAMEにマッピングすることはできない。

- ELBのIPアドレスは、スケーリングやソフトウェアアップデートに伴って常に変化しうることに注意


# API Gateway

Q1. バックエンドにLambdaがいるAPI Gatewayをローンチした。APIエンドポイントはどのプロトコルを受け付けることができるか

A1. HTTPS only

- API GWは暗号化されていないHTTPは受け付けない。
- デフォルトではAPIは内部ドメインをAPIに対してアサインする
- その際、SSL証明書はAPI Gateway Certificateを用いる
- カスタムドメインのもとでAPIを利用したいときは、開発者が用意した証明書をセットできる
 

# Storage Gateway

Q1. オンプレミスのデータセンターに分析用データを保存しており、ストレージ拡張のためにクラウドを活用したい。分析アプリケーションは、最新のデータにはローカルで頻繁にアクセスし、古いデータにはほとんどアクセスしない。オンプレミスのストレージのスケールを最小限に抑えつつ、アプリケーションに対して低レンテンシのデータアクセスを提供するためには、Amazon Storage Gatewayのどのようなオプションを利用すれば良いか。

1. Stored Volume Gateway
2. File Gateway
3. Cached Volume Gateway
4. Tape Gateway

A1. 3. Cached Volume Gateway

- 頻繁にアクセスするデータが一部という部分がポイント
- Cached Volumeにより、頻繁にアクセスするデータをStorageGatewayにローカル的に保存しながら、S3をプライマリのストレージとして扱える
    - オンプレのストレージを必要以上に拡張せずに低レイテンシのアクセスを実現でき、コスパ良。

まとめ

- Volume Gateway
    - オンプレのアプリサーバからiSCSIデバイスとしてマウントできるボリュームを提供
    - Cached Volume Gateway
    - Stored Volume Gateway
        - 全てのデータセットに低レイテンシでアクセスが必要な場合に利用
- Tape Gateway
    - コスト最適で堅牢性のあるアーカイブ用途の長期間保管用オプション
- File Gateway
    - S3へのファイルインターフェースを提供
    - NFSやSMBを利用してS3にファイルを保存・取得できる
    - IAM、KMS、CloudWatch、CloudTrail、CLI、コスト管理などAWSサービスと統合できる

[AWS Storage Gateway とは](https://docs.aws.amazon.com/ja_jp/storagegateway/latest/userguide/WhatIsStorageGateway.html)

# VPC Endpoint

A1. 社内システムで機密情報を扱っている。EC2で処理した後、S3に配置したい。データ移動の際に、パブリックインターネットを介さないためにはどうすれば良いか

【選択肢】

1. VPC Interface Endpointを作成してS3へのルートを設定する
2. VPC Gateway Endpointを作成してS3へのルートを設定する

Q1. 2.VPC Gateway Endpointを利用する

- VPCとS3は広大なAWSネットワークの中に存在するものの、デフォルトではVPCからS3へのトラフィックはパブリックインターネットを介して到達する
- 初めてAWS使い始めると、↑が意味わからないけど、そういうもの
- PrivateLinkを利用したVPC Endpointサービスを利用すると、VPCと他のAWSサービスをAWSのプライベートな経路を介して接続できる（InternetGateway, NAT, VPN, DirectConnectなどが不要になる）
- VPC Endpointには２種類ある：interface endpointとgateway endpoint
- どちらを使うかは、VPCと接続するAWSサービス次第
- ほとんどのAWSサービス：Interface Endpoint
- S3、DynamoDBのみ：Gateway Endpoint
- VPCエンドポイントって言葉でざっくり覚えてるだけじゃダメなのね…[要チェック](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/endpoint-services-overview.html)
AWS Solution Architect Associateへの道〜第６夜

# CloudWatch

Q1. CloudWatchがenhanced monitoringでRDSから取得するメトリクスは何か

1. CPU使用率
2. RDS child process
3. 利用可能なランダムアクセスメモリの総量
4. disk I/O per second
5. OSプロセス

A1. 2,5

- デフォルトのCloudWatchはハイパーバイザからの情報を取得する
- enhanced monitoringではインスタンス上のエージェントから情報を取得する
- よって、DBインスタンスが小さい場合、上記２つのメトリクスの差異は大きくなる（ひとつの物理インスタンス上で多くのVMsがhypervisorによって管理されるため）
- enhanced monitoringはどれだけの数のプロセスやスレッドがCPUを利用しているかを知るために有用

- 見れるリスト
    - RDS child processes
    - RDS processes
    - OS processes

# CloudFront

Q1. Webやmobileからデータストリームを集めて解析するようなシステムがある。ユーザに対して地理的に近接したロケーションで処理を行い、リクエストに対して低レイテンシでレスポンスを返さなければならない。理想的な構成はどのようなものか。

1. CloudFront + Route53 latency-based routing + Kinesis
2. CloudFront + Route53 Geoproximity routing + Kinesis
3. CloudFron + Lambda@Edge + Kinesis

A1. 3

- 地理的に近接したロケーションで処理、ならLambda@Edgeですね


# CloudTrail

Q1.APIコールの履歴やリソースの変更をトレースしてログを取得し、なおかつそのログは暗号化したい。どーする？

A1. Use CloudTrail with its Default settings

- つまり何も考えずにCloudTrailを使うのです…
- デフォルトでCloudTrailイベントログは、S3-severside-encryption(SSE)で暗号化される。
- 設定すればAWS KMSを利用して暗号化することも可能。
- ログローテの自動化は、S3のライフサイクルポリシーで設定可能。
- CloudTrailコンソールには暗号化のオプションみたいなのは無い。


# CloudFormation

Q1. CloudFormationテンプレートを利用して、ELBの背後に4つのEC2を構成している。テンプレート中でDNSホストネームを設定するセクションは何か？

A1. Outputs

- こまけえ…こんな問題出るのだろうか…

　　-> （追記）微塵も出る気配はありませんでした。

- Outputsはスタックのプロパティを見たときに返される値を記述するセクション
AWS Solution Architect Associateへの道〜第５夜

# Aurora

Q1. マルチAZ構成でAutoScalingを構築している。このシステム中のAuroraのプライマリーDBインスタンスに障害が発生した場合、フェイルオーバの最中には何が発生するか？

A1. 場合分けして考える。

- Aurora Replicaが存在する場合（同 or 別AZ）
    - CNAMEをHealthyなレプリカに付け替える。一般的に約30秒で完了。
- Aurora Serverlessを利用している場合
    - 別AZにDBインスタンスを再構築
- シングルインスタンスの場合（Replicaがない）
    - 同一AZにインスタンスを再構築しようと試みる。不可能な場合、別AZに再構築する。


# DynamoDB

Q1. ゲームのアプリケーションでAPI GatewayとDynamoDBを利用している。Dynamoは読み込み書き込みのキャパシティを設定している。Dynamoのロードがピークになった時、リクエストをスロットリングしており、ゲームのパフォーマンスが低下していることに気づいた。これを改善するにはどうすればよいか。　

1. DynamoDBのテーブルをAutoScalingGroupに追加する
2. SQSキューをDynamoDBテーブルの前に配置する
3. DynamoDBテーブルとALBを統合する
4. DynamoDB Auto Scalingを利用する

A1. 4

- DynamoDB auto scalingを利用すると、実際のトラフィックに合わせてスループットが自動で調節される
- トラフィック増加に合わせてスケーリングされることで、tableやglobal secondary indexがプロビジョニングされた読込書込キャパシティを増加させる
- SQSはリクエストをキューイング・ポーリングするので、スループット向上を実現できるわけではない


# Redshift

Q1. Redshiftを利用している。AWSのリージョン障害が発生した場合でも復旧ができるよう準備をしなければならない。何が必要か。

1. Redshiftのsnapshotを作成するジョブをスケジューリングし、取得したsnapshotをS3に格納する。
2. Redshiftはフルマネージドな高可用DWHのため何もしなくてよい
3. Automated snapshotsを利用する
4. Cross-Region snapshots copyをRedshiftで有効にする


A1. 4

- 1は可能だが、作業のハードルが高いので推奨できない
- 別リージョンに復旧するためにはCross-Region snapshots copyを有効にしとかなければならないので、2はNG
- AWSリージョンがダウンした場合はAutomated snapshotsは利用できないのでNG


# Database Migration

Q1. アプリケーションとDBをAWSにマイグレーションする要件がある。オンプレのOracleをAWSのPostgreに移行する必要があるため、この移行にはスキーマやコード修正が伴う。AWSのどオプションが最もフィットするか。（２つの組み合わせ）

A1.

1. AWS Schema Conversion Tool 
2. AWS Database Migration Service

* AWS DMS
    * 同種・異種のDB移行のいずれにも対応
    * オンプレ to RDS(on EC2含む)、EC2 to RDS, RDS to RDSそれぞれ対応
    * SQL, NoSQL, text based target間のデータ移行にも対応
初めてのMAMP【URLのPublicを省略】

## URLからpublicを省略する手順
この記事は前回の続きですが、URLからpublicを省略したいだけの方は、そのまま読み進めていただいても問題ありません。
前回記事：[初めてのMAMP【アプリ作成からサーバー起動まで】](https://qiita.com/1992_momotaro/items/e14f67f329e8f9875c3b)

工程は **２つ** しかありませんので、１分もあれば読破可能です。

まずは現状を確認しておきます。

##【現状】mampでsampleappを開くと、、、
URLがこのような場合。
<img src="https://i.gyazo.com/161dca73184aceba8a73874e08c3aa0a.png" alt="Image from Gyazo" width="315"/>
下図のように、ファイル（フォルダ）のリストが表示されてしまいます。
<img src="https://i.gyazo.com/5b91676796b19309d5f4037b022bed5d.png" alt="Image from Gyazo" width="465"/>

URLの末尾にpublicをつけたら。
<img src="https://i.gyazo.com/685501b167136a96b2e122f3af26f10b.png" alt="Image from Gyazo" width="400"/>

トップページが表示されます。
<img src="https://i.gyazo.com/9d2910fe3449788bbc63db62304ebe30.png" alt="Image from Gyazo" width="700"/>

毎回URLにpublicをつけるのは面倒なので、入力を省略したい。というのが今回の目的です。

それでは作業に入りましょう。

##.htaccessの編集とファイルの移動 （VScode使用）
##### .htaccessの編集
MAMP > htdocs > アプリ名 > public > .htaccess を開く。（今回のアプリ名は「sampleapp」）
<img src="https://i.gyazo.com/09bef7609ee95dbd6d9fdaa2dfbb9c7a.png" alt="Image from Gyazo" width="700"/>

ファイルの中身を全て削除し、以下のように書き換えてください。（コピペでOK）

```ini:.htaccess
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]


    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 


    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php


</IfModule>
```

##### .htaccessファイルの移動
ファイルの場所を「publicの中」から「アプリ名直下」に移します。

<font color="blue">**before**</font>
MAMP > htdocs > アプリ名 > public > **ここから⬅︎**
<font color="red">**after**</font>
MAMP > htdocs > アプリ名 > **ここに移す⬅︎**

<img src="https://i.gyazo.com/4f68bdda60627833802b2cf7f84b7a03.gif" alt="Image from Gyazo" width="200"/>

以上で作業完了です。

##確認作業
URLを打ち込んで確かめてみましょう。
<img src="https://i.gyazo.com/749646d2ee1b5f335e6805fd192fcc5d.png" alt="Image from Gyazo" width="400"/>
ファイル（フォルダ）のリストではなく、トップページが表示されましたね。
<img src="https://i.gyazo.com/9d2910fe3449788bbc63db62304ebe30.png" alt="Image from Gyazo" width="700"/>

URLからpublicの入力を省略することができました。
AWS Solution Architect Associateへの道〜第４夜

# Encryption

Q1. S3バケットの中のデータが保管時に暗号化されていなければならない。また、暗号鍵はあなたの会社が提供・管理するという要件がある。これを実現するためのアクションは？

A1. 

* Use S3 server-side encryption with customer-provided keys(SSE-C)
* Encrypt the data on the client-side before sending to S3 using their own key

暗号化関連は、保管時（at rest）と転送時（in transit）で分けて整理。
鍵を誰が発行・管理するか、とかローテーションが自動化でできるためには、とかその辺が選択のキモかと。

## 暗号化整理

### at rest
* Server-side encryption
    * Use Sever-side encryption w/ S3-Managed Keys(SSE-S3)
    * Use Sever-side encryption w/ AWS KMS-Managed Keys(SSE-KMS)
    * Use Sever-side encryption w/ Customer-Provided Keys(SSE-C)  
* Client-side encryption
    * Use Client-side encryption w/ AWS KMS-Managed Customer Master Key(CMK)
    * Use Client-side encryption Using a Client-side Master Key

### in transit

* SSLを使いましょう

---

Q2. EC2にEBSをアタッチして利用している。次の文章から正しいものを２つ選択せよ。

1. インスタンス間・ボリューム間を移動する全てのデータは暗号化されている。
2. スナップショットは自動的に暗号化されている。
3. スナップショットは自動的に暗号化されていない。
4. ボリュームの中のデータのみ暗号化されており、転送時には全てのデータが暗号化されるわけではない。
5. 暗号化されたスナップショットから作られたボリュームは暗号化されていない。

A2. 1,2

EBSを作成しEC2にアタッチするとき、次のタイプのデータは全て暗号化されている。

※暗号化が有効になっているEBSの話ですね
※2019/5/27 の発表で新規EBSのデフォルト暗号化オプトインを公開

- EBSボリューム中のデータ
- ボリューム・インスタンス間を移動する全てのデータ
- EBSから作られた全てのスナップショット
- それらのスナップショットから作られた全てのEBS

ref1.

[新機能 – 新規 EBS ボリュームのデフォルト暗号化へのオプトイン](https://aws.amazon.com/jp/blogs/news/new-opt-in-to-default-encryption-for-new-ebs-volumes/)

---

Q3. 毎週アクセスされるような機密ファイルを保管するストレージシステムを探している。暗号化と自動のキーローテが行われ、同時に誰がアクセスしたかというようなaudit trail（監査証跡）を出したい。最もコスト効率の良い方法は？

1. SSE-C
2. SSE-S3
3. SSE-KMS
4. Standard S3
5. Glacier DeepArchive

A3. 3

- SSE-CやSSE-S3でも暗号化、キーローテーションは可能だが、監査証跡を残すことはできない。
- S3はAWS KMS customer master keys(CMKs)を用いてS3オブジェクトを暗号化する
- AWS KMSはオブジェクトは暗号化するが、メタデータは暗号化しない
- CMKはkeyID, 作成日, 説明, 状態などのメタデータを含む
- 典型的には、CMKはユーザがAWS KMSの外で利用する暗号鍵を生成、暗号化、復号化するために利用される（=エンベロープ暗号化）


# IAM
Q1.既にEC2用のIAMロールを利用している。新しいリージョンでEC2を立てたい時、IAMロールはどーする？

A1.IAMロールはGlobalなサービスなので、そのままアサインするだけでOK

---

Q2. 同一のVPC内にUAT用のEC2、本番用のEC2が存在する。UATインスタンスを担当するエンジニアが本番用インスタンスにアクセスできないようにするためのベストな選択は？

A2. IAMとTagを組み合わせる。
UAT、PRDそれぞれにタグ付けをして、IAMポリシーのconditionにそのタグを指定することで実現するのがよい。
【Raspberry Pi】Raspberry Pi 4の初期設定をしていく

最近よく目にする、耳にするRaspberry Pi(ラズベリーパイ)ですが、外出自粛でつまらない毎日に解決策を、と思い購入してみました。
ということで、その初期設定をまとめて、これから試そうという人々の参考になればなと思います。

# Raspberry Pi 本体だけではいけない
Raspberry Piというのは、あくまでもPCの基盤と同じようなものですので、それ単独ではどうしようもありません。
ディスプレイやキーボード、マウスなどが必要になってきます。
Amazonを見るとある程度の周辺機器がセットになった状態で販売されていることが多いようです。
私は[こちら](https://www.amazon.co.jp/gp/product/B082VVJCPT/)を購入しました。


## セットアップのための準備物
セットになっていたものも含めて私が準備したものは次のとおりです。
なお、PC(私はMacBook Pro)やネットなどの環境などは整っているものとします。

- Raspberry Pi 4B (4GB RAM)
- 32GB MicroSDHCカード
- USB-A&C カードリーダー
- 冷却ファン
- ヒートシンク
- MicroHDMI-to-HDMIケーブル
- 5.1V/3.0A USB-C電源アダプター
- ディスプレイ
- USBキーボード
- USBマウス

ディスプレイは既にあったものですので、トータルで15,000円くらいでした。
ディスプレイを買うとプラス1万円くらいになるのではないかと思います。

# OSインストール
## インストール前の準備
まずMicroSDカードのフォーマットを行います。
Raspberry Pi公式が推奨する[SDメモリカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter/)でフォーマットします。
Windows用とMacOS用があるので、手持ちのPCのOSに合ったものを選択します。

SD Card Formatterを起動し、MicroSDカードを入れます。
フォーマットしたいカードの選択を求められるため、選択してフォーマットを行います。
<img width="426" alt="スクリーンショット 2020-04-18 15.21.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621109/12af553f-a343-f4dd-9997-119eb06454de.png">


32GBよりも容量の大きいMicroSDカードを使用する場合、起動できない場合があるため注意します。
[こちら](https://www.fabshop.jp/raspberrypisdxc/)を参考にしてください。

## OS:Raspbianのダウンロード
今回はインストーラーであるNOOBSを使って、Raspbianのインストールをしていきます。
[こちら](https://www.raspberrypi.org/downloads/noobs/)から無料でダウンロード可能です。
![スクリーンショット 2020-04-18 14.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621109/0b4f5cc2-2ab5-4c41-306e-2a4c8440d2f8.png)

## MicroSDへの書き込み
ダウンロードしたZIPファイルをMicroSDカード上に解凍します。
この時、MicroSDカードのルートディレクトリ(カードを開いてすぐのところ)にファイルがあるようにします。
ディスプレイなどの周辺機器の準備を行い、MicroSDカードをRaspberry Piに挿入して電源を入れましょう。

# Raspberry Piの起動
電源を入れると虹色の画面が出ます。
その後の設定画面で言語を日本語に設定し、Raspbianにチェックを入れてインストールを行います。
<img width="485" alt="スクリーンショット 2020-04-18 16.08.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621109/1de76192-9cf4-865a-d7cf-dbd2b3821b1c.png">

処理が終わるとデスクトップが表示されて、無事に起動することができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621109/f09bf53a-3bb0-c593-460e-60f0cf4c9193.png)

# おわりに
ひとまず今回はここまでにします。
MacBookで画面共有したりする設定はまた今度まとめることにします。
なお、今後もRaspberry Piでなにか面白いことができたら、投稿していこうと思いますのでよろしくお願いします。
Powershell埋め込みバッチファイル(自分用)

#特徴
・2行目以降にPowershellスクリプトを書ける
・ダブルクリックで実行できる、オプションを渡すこともできる。
・最小化状態で起動する
・$env:SELFPATHでPowershellスクリプト(バッチファイル)本体のパスを取得できる
・外部powershellファイルを呼び出して実行できる

いろんなサイトを参考に組み合わせたものです、参考サイトは[参考サイト](#参考サイト)にリンクを張っておきます。

#スクリプト
下記のコードをコピーして1行目に貼り付け、バッチファイルとして保存します。

```batch
@if not "%~0"=="%~dp0.\%~nx0" (start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof)  else  (setlocal enableextensions enabledelayedexpansion & set "SELFPATH=%~dp0" & set "SELF=%~f0" & PowerShell.exe -ExecutionPolicy Bypass -Command "& (Invoke-Expression -Command ('{#' + ((Get-Content '!SELF:'=''!') -join \"`n\") + '}'))" %* & exit /b !errorlevel!)

```

#メモ

###コンソールウインドウを最小化から通常状態に戻す

エラーや入力待ちの入力を促す際に使えると思います。最小化するには7行目の61728を61472に変えます。

```powershell
$title = $Host.UI.RawUI.WindowTitle;
$Host.UI.RawUI.WindowTitle += (new-object random).next();
$process = (ps | where {$_.MainWindowTitle -eq $Host.UI.RawUI.WindowTitle});
$Host.UI.RawUI.WindowTitle = $title;
$hwnd = $process.MainWindowHandle;
[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');
$message = [System.Windows.Forms.Message]::Create($hwnd, 274, 61728, 0);
$nativeWindow = new-object System.Windows.Forms.NativeWindow;
$nativeWindow.DefWndProc([ref]$message)
```

参考サイト:[PowerShellの１行バッチでコンソールウィンドウを最小化/最大化/元に戻す。](http://scripting.cocolog-nifty.com/blog/2007/12/powershell_3d1e.html)


###引数を解釈する(簡易版)

```powershell
$arghash = @{}
$arghash["_blank"] = @()
if($args.Count -gt 0){
    $argname = "_blank"
    foreach($argval in $args){
        if($argval.StartsWith("-")){
            $argname = $argval.substring(1, $argval.Length-1)
            if(!($arghash.ContainsKey($argname))){
                $arghash[$argname] = @()
            }
        }else{
            $arghash[$argname] += $argval
        }
    }
}
```

#参考サイト

・[PowerShell - バッチファイル内に記述したスクリプトを実行する。](https://hake.hatenablog.com/entry/20180218/p1)
・[コマンドファイルを最小化した状態で実行します](https://amksystem.com/cmd/cmd2/)
Electronでデジタルサイネージを作る時の画面設定

# はじめに
デジタルサイネージでコンテンツを作る際、モニタサイズに合わせて画面を表示する必要があります。
画面の設定にはElectronのBrowserWindow APIを使ってウィンドウを固定してしまえば、あとはhtml内で表示の処理をすれば、コンテンツの制作が進めやすくなります。

# 目次
1. BrowserWindowのオプション
2. 参考

# 環境
- Windows10 64bit
- electron 8.2.1
- 縦型のFullHDモニタ（1080px x 1920px）での使用を想定

# 1. BrowserWindowのオプション
Electronで制作したコンテンツをアプリケーションとして起動する際、
画面サイズやフルスクリーンなどの設定は、BrowserWindowにオプションを追加することで、指定することができます。
まずは、[electronのサイト](https://www.electronjs.org/docs/tutorial/first-app#electron-development-in-a-nutshell)からmain.jsの一部を抜粋します。

```javascript:main.js
const { app, BrowserWindow } = require('electron')

function createWindow () {
  // Create the browser window.
  let win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

  // and load the index.html of the app.
  win.loadFile('index.html')
}

app.whenReady().then(createWindow)
```
このスクリプトの`new BrowserWindow`にオプションを追加していきます。

```javascript:main.js
const { app, BrowserWindow } = require('electron')

function createWindow () {
  // Create the browser window.
  let win = new BrowserWindow({
    x:0,
    y:0,
    width: 1080,
    height: 1920,
    backgroundColor:'#FFFFFF',
    webPreferences: {
      nodeIntegration: true  //※1
    },
    alwaysOnTop:true,
    kiosk:true,
    fullscreeen:true,
    frame:false,
    transparent:false
  })

  // and load the index.html of the app.
  win.loadFile('index.html')
}

app.whenReady().then(createWindow)
```
オプションの説明

|オプション名|型|説明|
|:--|:--|:--|
|x|Integer|ウィンドウの左からの座標|
|y|Integer|ウィンドウの上からの座標|
|width|Integer|ウィンドウの幅|
|height|Integer|ウィンドウの高さ|
|backgroundColor|String|背景色、transparentがtrueの時は、'#AARRGGBB'の順で透明度とRGBの指定ができる
|alwaysOnTop|Boolean|常に手前に表示|
|kiosk|Boolean|キオスクモード|
|fullscreen|Boolean|フルスクリーンモード|
|frame|Boolean|ウィンドウの枠の表示|
|transparent|Boolean|ウィンドウの透明度|

※1 `nodeIntegration`を`true`に変更していますが、
これは、コンテンツ内でjQueryを使う際にundefinedとなってしまうのを防ぐためです。

上記以外にも様々なオプションがありますので、詳しくは、
[Class:BrowserWindow](https://www.electronjs.org/docs/api/browser-window#class-browserwindow)を参照ください。

# 2. 参考
[ElectronでjQueryがundefinedになる](https://qiita.com/pirosikick/items/72d11a8578c5c3327069)
[JavaScript (Electron) を使ってアプリの見栄えを整える](https://qiita.com/nyanchu/items/9a1c910bbca55e9d2f3c)
[iOS] キーボードの上にツールバーを表示する


# やりたいこと
TextViewをタップした時に表示されるソフトウェアキーボードの上にツールバーを表示する
![スクリーンショット 2020-04-18 16.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562345/0fa92066-5962-19a8-362e-3392e0cd6706.png)

# 環境
Xcode11.3.1
Swift 5

# UITextView.inputAccessoryViewにツールバーを設定する
```
    // textView
    @IBOutlet weak var tweetTextView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
　　　　　// ツールバーを定義
        let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 0, height: 0))

　　　　　// サイズを自動で最適な物にしてくれる
        toolBar.sizeToFit()
        
        // ツールバーのアイテム：カメラ
        let cameraButton = UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(didTapCamera))

　　　　　// ツールバーにスペース追加。これがないと、右寄せにできない
        let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)

　　　　　// ツールバーのアイテム：ツイート
        let tweetButton = UIBarButtonItem(title: "Tweet", style: .plain, target: self, action: #selector(didTapTweet))

　　　　　// ツールバーにアイテム追加
        toolBar.items = [cameraButton, spacer, tweetButton]
        
        // TextViewにツールバーを設定
        tweetTextView.inputAccessoryView = toolBar
        
    } 
```
VueJS with typescriptでしばしば遭遇するProperty 'XXX' does not exist on type 'CombinedVueInstanceの解消法

VueJSをtypescriptで`Vue.extend`を使って記述していると、ちょいちょい、

```
Property 'XXX' does not exist on type 'CombinedVueInstance<Vue, ...>'
```

みたいなエラーに遭遇します。
これはわりと有名な問題で検索すると色々な情報がひっかかるんですが、「結局どうすればええんや？」というところがわかりにくかったので整理してみます。
調査自体は趣味の範疇ですが、調査に使ったコードは仕事のものなのでコードサンプルはありません。ごめんよ。

## 何が起こっているのか？
VueJSで画面(またはコンポーネント)を作る場合、独自にprops, state, methodなどを定義していくわけですが、その際に型推論が効かなくなって「そんなメソッド(プロパティ)知らんがな」と、言われているのがこのエラーです。

同じようにコードを書いていても型推論が効いたり聞かなかったりするのでやっかいです。
ちなみにこのエラーが出ても実行自体には問題ありません。

## 安直な解決方法
手っ取り早く解決するなら型を無視するのが楽です。

``` typescript
// @ts-ignore
this.someMethod()
```

`@ts-ignore`を書くと次の行の型検査がスキップされます。
またはもっと安易に`this`を`any`にキャストするという方法もあります。

``` typescript
(this as any).someMethod()
```

しかし、まぁ負けたような気がするのであまりお勧めではありません。

## たまに有効な解決方法
検索をかけるとmethodやcomputedの定義で明示的に返り値の型を定義しましょう。という解をよく見かけます。

```
methods: {
  someMethod(): string {
    return "hoge"
  },
}
```

これで型推論が有効になるケースもあるみたいですが、手元ではこれで解決したケースはありませんでした。。。
(ただし、既存のコンポーネントでエラーが発生していないものも多くあるので、そこではこれが効いているのかもしれません。)

いずれにせよ型の明示は人目での解析にも有益なので常につけるようにした方が良いです。

## もうちょっと調査する
手元でエラーになるコンポーネントとならないコンポーネントのソースを見比べてますが、違いがよくわかりません。
何かしら型推論が効かなくなる条件があるはずですが、それが何なのかはよくわからないです。

これはVueJS本体の方でも長くオープンしている問題で半日やそこらの調査でどうにかなる種類のものではなさそうです。

https://github.com/vuejs/vue/issues/8721

そこでそちらは一旦あきらめて`this`の型を比べてみました。
vs-codeを使っていれば、マウスホバーでそこの型が明示されますがそこには明確に違いがありました。

エラーになる方

```
CombinedVueInstance<Vue, unknown, unknown, unknown, Readonly<Record<never, any>>>
```

ならない方

```
CombinedVueInstance<Vue, {
    someData: number;
    ...
}, {
    someMethod(): void;
    ...
}, {
    ...;
}, Readonly<...>>
```

エラーにならない方ではメソッド定義の内容が匿名型(? 呼び方がよくわからん)で、そのまま入ってますがエラーになる方では`unknown`となっています。

要するに型推論できてない、ってことですよね。(^^;

## 型を明示する
型が推論できないなら明示すればよいはずです。
VueJSのtypesを調べると`extend`はいくつかオーバーロードされていますが、ここで使われているのはおそらくこれ。

```
  extend<Data, Methods, Computed, Props>(options?: ThisTypedComponentOptionsWithRecordProps<V, Data, Methods, Computed, Props>): ExtendedVue<V, Data, Methods, Computed, Props>;
```

Genericsで使われている型はそれぞれ以下を表しているようです。

- Data: stateの定義
- Methods: methodの定義
- Computed: computedの定義
- Props: propsの定義

ここに明示的な型定義を渡せば良さそうです。
こんな感じ

``` typescript
import Vue from 'vue'
import { ThisTypedComponentOptionsWithRecordProps } from 'vue/types/options'

interface DataType {
  someState: string
  ...
}

interface MethodType {
  someMethod(): void
  ...
}

// 使ってない場合は空でOK
interface ComputedType {}
interface PropType {}

export default Vue.extend({
} as ThisTypedComponentOptionsWithRecordProps<Vue, DataType, MethodType, ComputedType, PropType>)
```

これでエラーは解消されます。
Vuexを使っていて、`mapState`や`mapActions`している場合はそこでインポートしたproperty/methodも定義に含める必要があります。
(ただ、エラーにならない方の定義を見ると`mapActions`したメソッドは含まれていないので、そこは謎なんですが。。。)

## まとめ
定義を二重で書くのは面倒かもしれませんが、言語によっては当たり前のことだったりするものもあるし個人的には先に定義だけ見られるのはWelcomeです。

VueJS自体での解決はどうなんでしょうかね。
クラスを使った書き方の場合に起こるかどうかは不明ですし、3系でTypeScriptサポートの強化があるので2系での解消はやる気無さそうな気がします。

いずれにせよ型を無視するよりは100倍マシなので、エラーに遭遇したときはこの方法で回避しますv
AWS Solution Architect Associateへの道〜第３夜


# SQS

Q1. 週に１度、SQSキューからメッセージを取得して処理するバッチジョブを作成した。２週間後、メッセージが一部処理されていないことに気づいた。原因は何か？SQSの設定はデフォルト。

A1. メッセージが処理される前に削除されている

- SQSは一定期間後に自動でメッセージを削除している（Message Retention Period : Default 4 Daysで設定）
- キューイングされたメッセージが削除されるのは２パターン
    - アプリケーションで明示的に削除
    - Message Retention Period経過後に自動削除
        - デフォルトは4日になっているので、バッチが週に１度しか動かないなら設定値を伸ばしましょう

---

Q2. SQSとEC2を用いたチケット予約システムで、キューのポーリングがループしすぎており、空のレスポンスに対するオペレーションのコストが高い。どうすれば良いか？
具体的にはReceiveMessageWaitTimeSecondsをどう設定すれば良いか。

A2. ReceiveMessageWaitTimeSeconds>0 にしてロングポーリングにする

- SQSはデフォルトでショートポーリングが設定されていて、サーバのサブセットのみを照会して(?)、レスポンスに含めることができるメッセージがあるか判断する
- ショートポーリングはhigher througputが必要な場合に有効
- コストを下げるためにはロングポーリングの設定が有効
- RMWTSの値でポーリングのshort/longを決定できる
- デフォルトはゼロ（=short polling）
- まとめると、LongPollingはSQSに対して、メッセージが利用可能になるまで待つことを許可することで、空のレスポンスを削減して、結果コストを下げる

---

Q3.あるアプリがfanoutメッセージパターンを利用している。アプリでの注文ごとにSNStopicにメッセージが送られ、並列化された非同期処理のために複製されたのちにSQSキューにプッシュされる。SpotEC2でSQSキューからメッセージを取得して処理している最中に、EC2が異常停止した。この場合、SQSメッセージはどのようになるか？

A3. message visibility timeout expiresした時、メッセージは他のEC2インスタンスから処理可能になる。

- SQSは分散システムのため（利用者（ここではEC2）がメッセージを取得したかどうかを保証せず）自動的にメッセージを削除しない。
- 利用者はメッセージを取得して処理した後に明示的に削除しなければならない。
- 他の利用者がメッセージを重複して処理することを防ぐために、SQSはvisibility timeoutを設定する。（デフォルト30秒、最大12時間）

---

Q4. ウェブオーダーシステムでSQSを使っている。ある日、注文が2回処理されているものが大量にあることに気づいた。今後、これが起こらないようにするにはどうすればよいか？

1. SQSの代わりにAmazon Simple Workflowを利用する
2. retention periodを設定する
3. visibility timeoutを設定する
4. message sizeを変更する

A5. 1

- SQSの問題と見せかけて、SWFの問題（SQS神話崩壊）
- SWFではタスクが一度処理されると複製されることはない
- 多数のワーカーが存在しても、SWFはひとつのタスクをひとつのワーカーに割り振る
- さらに、SWFは未解決の決定タスクを同時に最大ひとつのみ保持する
- retention periodはメッセージ削除までの時間を決定するに過ぎないので、保持期間中に再度処理されると結局、処理が重複する
- visibility timeoutは一度に複数のワーカーがメッセージを処理することを防ぐだけなので解決にならない
- メッセージサイズは今回は関係なし

# SWF

Q1. 注文処理システムでSimple Workflowを利用している。ある日、いくつかの注文が４週間に渡って滞留していることに気づいた。原因は？

1. workflowが15-day maximum workflow execution timeを超えて削除された
2. workflowが14-day maximum workflow execution timeを超えて削除された
3. SWFがactivity taskからの手動のインプットを待っていた
4. SWFをリスタートする必要がある

A1. 3

- デフォルトではworkflowは最大1年間実行できる（よって1,2はNG）
- SWFを手動でリスタートすることは不可能
Conduit (2) - Monadic composition

[Conduit (1) - Haskell Streaming library  - Qiita](https://qiita.com/sand/items/74b93a6e1cf740c77f54)
[Conduit (2) - Monadic composition - Qiita](https://qiita.com/sand/items/8931518c2a42bcbe075f)
[Conduit (3) - Resource - Qiita](https://qiita.com/sand/items/37632cce2bace527b8f9)


Haskell のStreaming ライブラリである **Conduit** についての記事です。

記事のソースは作者による以下の記事です。
[Conduit Documents - snoyberg/conduit@github](https://github.com/snoyberg/conduit#readme)

APIは以下にあります。
[conduit: Streaming data processing library](https://hackage.haskell.org/package/conduit)


前回、Conduitの２つのcomponentを**.|** オペレーター で結合して、より大きなcomponentを作る方法をみました。しかしcomponentを結合するもう一つの方法がります。モナドの結合を使う方法です。

# 1. Source での結合

upstreamでモナド結合を使います。

```haskell:Monadic1.hs
module Monadic1
    ( runTest
    ) where

import Conduit

-- source :: Monad m => ConduitT i Int m ()
source :: ConduitT () Int IO ()  -- より具体的な型
source = do
    yieldMany [1..10]    -- A
    yieldMany [11..20]   -- B

runTest :: IO ()
runTest = runConduit $ source .| mapM_C print
```

ここでは２つのConditTモナド(yieldMany)を、通常のモナドのdo記法で並べてあります。結合されたsourceの動作は、まず初めに component A が1～10までdownstreamに流し、次に component B が11～20までを流す動作になります。

実際に動作させると以下のようになります。


```
stack build && stack exec test-exe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
```


# 2. Sink での結合

downstreamでモナド結合を使います。

```haskell:Monadic2.hs
module Monadic2
    ( runTest
    ) where

import Conduit

sink :: Monad m => ConduitT Int o m (String, Int)
sink = do
    x <- takeC 5 .| mapC show .| foldC     -- C
    y <- sumC                              -- D
    return (x, y)

runTest :: IO ()
runTest = do
    let res = runConduitPure $ yieldMany [1..10] .| sink
    print res
```

sinkは２つのConduit componentが、モナドのdo記法で結合されています。結合されたcomponentは次のように動作します。
まず上流からは、1～10までの値が流れてきます。最初に component C が、先頭の値から5個消費します。残った5個のstreamの値を、component D が消費します。


実際に動作させると以下のような結果が得られます。

```
stack build && stack exec test-exe

("12345",40)
```

ちなみにfoldCとsumCは以下の通りです。

foldCはstreamの全値を結合（モノイド）します。

```haskell:foldC
-- Monoidally combine all values in the stream.
foldC :: (Monad m, Monoid a) => ConduitT a o m a
```

sumCはstreamの全値を足しこみます。

```haskell:sumC
-- Get the sum of all values in the stream.
sumC :: (Monad m, Num a) => ConduitT a o m a
```


# 3. transformer で使用

これまでupstream と downstreamでのモナド結合を見てきました。最後に、中間の位置でtransformer としてモナド結合を使う場合を見ます。


```haskell:Monadic3.hs
module Monadic3
    ( runTest
    ) where

import Conduit

trans :: Monad m => ConduitT Int Int m ()
trans = do
    takeC 5 .| mapC (+ 1)    -- E
    mapC (* 2)               -- F

runTest :: IO ()
runTest = runConduit $ yieldMany [1..10] .| trans .| mapM_C print
```

上流から1～10の値をstreamに流します。
それをtransで加工して、downstreamに流しprintします。

transでは、E componentでstreamの最初の5個の値をとり1を足し算してdownstreamに流します。
streamには別に5個の値が残りますが、これはF componentで2を掛け算してdownstreamに流します。


実際に動作させて確認してみましょう。

```
stack build && stack exec test-exe

2
3
4
5
6
12
14
16
18
20
```


今回は以上です。
AWS Solution Architect Associateへの道〜第０夜

単なる自分用の勉強メモです。
暇つぶしに一問一答感覚で読めるよう意識。

ご注意
あくまで執筆時点の情報です。（2020/3ごろ）
最新の情報はAWS公式ページをご確認ください。

※適宜追記中。。。
[第1夜：EC2、ELB、ASG](https://qiita.com/aqui_sh/items/921894b002bc0d4e272a)
[第2夜：EBS、S3、Glacier](https://qiita.com/aqui_sh/items/433482ba1f25ffbdedfa)
[第3夜：SQS、SWF](https://qiita.com/aqui_sh/items/cbe8a80487aee65d9cc5)
[第4夜：Security、Encription、IAM](https://qiita.com/aqui_sh/items/ccfdff92742ed85d27fb)
[第5夜：Database、DWH、DataMigration](https://qiita.com/aqui_sh/items/0cc17705bacb3fe5dda3)
[第6夜：Cloud*サービス](https://qiita.com/aqui_sh/items/8d3c01ac12ce7ea29f50)
[第7夜：Network、Gateway系](https://qiita.com/aqui_sh/items/d1ab3abe2c304dee3b32)
[第8夜：Other（管理系サービスなど）](https://qiita.com/aqui_sh/items/9d584f2dcb49c6609db5)
[第9夜：サービス選ぶ系問題](https://qiita.com/aqui_sh/items/f9a88b5b8938de84d8e2)

2020年3月23日にSAA-C01試験が終了し、SAA-C02に改定されるということで、3月20日に滑り込みで取得しました。

ってことでこれから受ける人にはあまり参考にならないかもです。

ちなみにSAA-C00も2年前に受けて落ちましたが、今回受けた感想としては、サービスが爆発的に増えた分、重箱の隅を突く系の問題が減ったような印象でした。（あくまで印象）

勉強しながら書いていたので間違っている部分があるかも...
気付き次第修正します。

- 元ネタは非公式の問題集。英語のものです。
- 記事を書き始める前からじわじわと（2年くらい）勉強中
- 一応AWSで4年弱仕事しているので、（自分が知ってる）超基本にはあまり触れてないかもです。（こんなことも知らねーのかよというのもあるかと思いますが:sob:）
- 勉強時点での情報なので、AWSの変更によって正解が変わっている可能性があります。特にコストとか（どのタイミングでテストに反映されるのかちゃんと知らない）
- 英語の原文をうまく訳せなかったり、カタカナに直したり直さなかったりは、あくまでメモなので雰囲気でどうかひとつ
- タイトルは水曜どうでしょう復活記念（書き始めた頃に始まったんです...）

## 試験を受けて印象に残った箇所

- 暗号化の種類について（第4夜参照）
- DBの選択（DynamoDB？Aurora？RDS？みたいな）
- ３層モデルの基本・セキュリティ（DMZ、WebApp、DB）
- 可用性を担保するサブネットの構成
- AutoScalingの各種挙動
- （よく言われるけど）責任共有モデル
- S3、EBSなどのバックアップ・リストア
GMOあおぞらネット銀行APIを"sunabar"で使ってみた

銀行口座をAPIで操作できる、GMOあおぞらネット銀行「[sunabar](https://portal.sunabar.gmo-aozora.com/login)」を使ってみたので、アカウント登録から残高取得API実行までをまとめてみます。

# TL;DR
 - 利用には口座開設が必要
 - API仕様書は充実している
 - アカウントが複数必要なので管理に注意

# sunabarとは
銀行口座をAPIから操作できるテスト環境です。Web上から入金操作を行って、APIから残高を取得するようなことができます。審査はなく、個人でも無料で利用できます。
操作できるのはテスト用口座のみで、本物の口座は扱えません。

# 口座開設から残高取得までの流れ
 1. GMOあおぞらネット銀行口座を開設
 2. sunabarにログイン
 3. 開発者ポータルに登録
 4. 残高照会APIを実行

# GMOあおぞらネット銀行口座を開設
## 申込
sunabarの利用には口座開設が必須です。Webフォームから必要事項を入力し、本人確認書類をアップロードすればOKです。
私がやったときは1週間くらいで開設できました。

 - [口座開設 | GMOあおぞらネット銀行](https://gmo-aozora.com/account/)

## 開設後
キャッシュカードが郵送されてきたら、銀行公式サイトからログインしてパスワードなどの初期設定を行います。[^1]

 - [初期設定ガイド](https://gmo-aozora.com/account/firstsetting.html)

# sunabarにログイン
## ログイン方法
sunabarのログインID、パスワードは銀行公式サイトからのみ確認できます。上部のメニュー「お客様情報（申込・設定）」⇒「開発者向け」タブに表示されます。

定期的にシステム側で更新されるそうなので、少し注意が必要ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20639/df199350-6390-902c-071f-ce847eafefbd.png)

## sunabarで、できること
sunabarではテスト用口座を使って、API実行や仮想的な入出金が行えます。使える口座の口座番号や、API実行時に必要なアクセストークンもここから確認できます。

# 開発者ポータルに登録
sunabarではAPIを実行できますが、仕様書は別サイトで公開されています。こちらにも別途登録が必要です。

## 登録方法
登録は無料ですので、アカウント登録しましょう。
ページ上部の＋に○のボタンからアカウントを作成できます。このサイトは口座開設していなくても利用できるようでした。

 - [GMOあおぞらネット銀行API開発者ポータル](https://api.gmo-aozora.com/ganb/developer/api-docs/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20639/16d5fa0a-5f41-b46f-f8c0-f60921e16c89.png)

## 利用方法
「[ドキュメント](https://api.gmo-aozora.com/ganb/developer/api-docs/)」のページで利用可能なAPIのリクエスト、レスポンス形式、エラーコードなどを確認できます。

Ruby, Java, Nodeなど各種プログラミング言語での実行例もあり、使いやすいと思いました。

なお、このサイトにはWebhookなどの利用方法も書かれていますが、sunabarでは利用できないそうです。あと、[SDK](https://github.com/gmoaozora/)も公開されていますが、認証に必要な情報がないので同様に利用できないと思われます。

# 残高照会APIを実行
最後に、APIから口座残高を取得したいと思います。
ただ、アカウント登録者のみに公開の情報もあり、どこまで公開してよいのか微妙なのでぼやかして書きます。

## sunabarからATM入金
残高0円ではおもしろくないので、適当な金額を口座に仮想的に入金します。

sunabarトップページ⇒入出金シミュレーター⇒ATM入金から操作します。初期状態では個人と法人の2口座ありますが、とりあえず個人口座にしました。[^2]

## アクセストークンを確認
API利用時は各口座のアクセストークンが必要です。sunabarトップページ⇒「sunabarサービスサイトで使える銀行口座」⇒「トークン」列のコピーボタンから確認しておきましょう。

## API実行
それでは準備が整ったので、APIから残高を取得してみましょう。

```shell
# 残高照会API実行
curl -X GET \
  'https://api.gmo-aozora.com/ganb/api/simulator/personal/v1/accounts/balances' \
  -H 'accept: application/json;charset=UTF-8' \
  -H '<アクセストークン>'
```

レスポンスは下記のようなJSON形式で取得できます。

```json-doc
// 残高照会APIレスポンス
{
	"balances": [
		{
			"accountId": "XXXXXXXX",
			"accountTypeCode": "01",
			"accountTypeName": "普通預金（有利息）",
			"balance": "5800",  // <===== 残高
			"baseDate": "2020-04-18",
			"baseTime": "16:16:00+09:00",
			"withdrawableAmount": "5800",
			"previousDayBalance": "0",
			"previousMonthBalance": "0",
			"currencyCode": "JPY",
			"currencyName": "日本円"
		}
	],
	"spAccountBalances": [
		{
			"accountId": "XXXXXXXX",
			"odBalance": "5800",
			"tdTotalBalance": "0",
			"fodTotalBalanceYenEquivalent": "0",
			"spAccountFcyBalances": []
		}
	]
}
```

このように簡単に残高などの情報を取得できます。

# まとめ
sunabarでは銀行APIを無料で利用できます。仕様書も充実しているので使いやすいのかなと思いました。
銀行公式サイト、sunabar、API開発者ポータルとアカウントが複数必要なのがちょっと面倒かなという感じです。



[^1]: 最初、間違えて「あおぞら銀行」にログインしようとして焦りました。
[^2]: 上限は1,000万円です。現実には無理なんですかね。
rails sをするとCould not find a JavaScript runtime.が出てきてしまう時の対処法

ある日、作成中のアプリでrails sをするとCould not find a JavaScript runtime.というエラーが出て、ローカル環境に入れなくなってしまいました。

therubyraceを入れると直るという情報があったので、インストールしようと思ったのですが、libv8とバージョンを合わせろというエラーが出てきて、しばらくやっていましたが、解決できず、別の方法を探すことに。

node.jsをインストールすると直るみたい。
参考
https://djandjan.hateblo.jp/entry/2018/07/25/224929

ターミナル

```
$ curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
```

```
$ sudo yum -y install nodejs
```
MACのログインパスワードを入力するとダウンロードが始まります。


https://nodejs.org/ja/
からもダウンロードが可能です。
<img width="983" alt="ad7d432fd8d79af34d4c840daa1665bb.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606154/537012fa-8837-b47f-39ff-5ae73766c996.png">

こちらで直すことができました。
VagrantのMySQLをMySQLWorkbenchと接続する

## 環境
ローカル
・Mac
・MySQLWorkbench
・VagrantFile

仮想環境
・Vagrant
・CentOS7
・MySQL

## 背景
Vagrant上でインストールしたMySQLをローカルでMySQLWorchbenchで操作したかったため。
その接続を試みます。
Vagrant上にはすでにMySQLがインストールされていることを想定しています。

## ①Vagrantfileの設定
```php
vim Vagrantfile
```
ホストOSから仮想環境に接続できるIPアドレスの設定をする。
こんな感じでコメントアウトを外せばOK。

```php
# Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"
```
その後、vagrant up or vagrant reloadで設定を読み直してください。

## ②MySQLに接続（仮想環境）
vagrant sshをした後に、仮想環境のMySQLに接続します。

```php
mysql -u root -p
```
あらかじめパスワードを設定していた場合はそのパスワードを入力して（割愛）、mysqlが操作できるところまで行きます。

```php
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.29 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 
```

## ③MySQLでユーザーの権限を付与する
Workbenchで正しい接続先を記述しても、下記のような感じで弾かれるので外部接続の権限を付与してください。
pingが通っているのに接続できなかったので、ここで私はちょっとハマりました…

```php
192.168.33.1' is not allowed to connect to this MySQL server
```
↑Workbenchでコネクション確立するとき。
MySQLで権限を付与するコマンドを打ちましょう。

```php
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'192.168.%' IDENTIFIED BY 'root のパスワード' WITH GRANT OPTION;
```
これで、Query OK, 0 rows affected, 1 warning (0.00 sec)感じで実行できたら外部接続の準備完了です。

## ④最後に
最後にWorkbenchで接続ができるか確認してみます。
<img width="675" alt="スクリーンショット 2020-04-18 16.27.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610472/3f890ac6-ca41-8d73-1546-d7d13a4090dd.png">
テストコネクションなんかで接続確認ができて、適当にクエリを実行ができることを確認ができたら完了です。
お疲れ様でした。
SQLのメモ帳

メモ帳

# SQL
データベース言語の事、MySQLは箱

# DBMS
データベースマネジメントシステム、DBを管理する。私たちはDBMSとやりとりをする。

# リレーショナルベータベース
一般的なDB列と行からなる。関連（リレーション）二つのDBがIDで結びついている
RDBMS＝リレーショナルデータベースマネジメントシステム

# 文字
小文字でも大文字でもどっちでもよい
※可読性を上げるために統一性は大事

```
Select 〇
SELECT 〇
```

#SQL
データを集めて分析するのに役立つ

SELECT（カラムを記載,ここに式を描くときもある,WHEREより先に処理）
FROM（テーブル名を記載する）

```
SELECT　name,price
FROM items;
訳:itemsテーブルのnameとpriceを検索
```

WHERE（条件式を記載して範囲を限定する,fromの後に記載）

```
where price <= 1000;
訳:whereでpriceが1000円以下を検索
```

LIKE（条件式を記載して文字検索）

```
where name LIKE ワイン%;
訳:nameにワインで始まるものが含まれるものを検索
```
not(条件式以外を検索)

```
where not name LIKE ワイン%;
訳:nameにワインで始まるもの以外が含まれるものを検索
```
null(データがないものを検索)

```
where price is not null;
訳：値段のデータがないものを検索
```

AND,OR（複数の条件式を記載する時に使う）

```
where price = 1000
and name = "ワイン";
値段が1000円かつ名前がワインのものを検索

where price = 1000
or price = 2000;
値段が1000か2000円を検索
```

LIMIT (検索数を決める)

```
where price = "1000"
limit 5;
訳:値段が1000円の物を5件表示する
```

distinct(重複をの省く)

```
SELECT distinct (name)
訳：重複していない名前を検索
```

四則演算（データを計算することができる）

```
select price * 1.1
from items;
訳：アイテムの値段を1.1かけて表示
```

COUNT（＊）（カラムの数を数える）

```
select count(*)
from items
訳：アイテムテーブルの数を数える
```

AS（検索したカラム名に別名をつけることができる）

```
select name as item_name
from items
訳：名前とアイテム名として表示する

```
ORDER BY（DESC降下的,ASC上昇的）

```
order by price ASC;
訳：値段を上昇に並べ帰る
```

GROUP BY（どのようにグループ分けするかを記載する、集約式の事で）

```
group by toys_id;
訳：おもちゃのグループにある物を検索
```

HAVING　（グループの値に対する条件式を記載してさらにグループ内検索）

```
where price <= 1000
group by toy_id;
訳：おもちゃが1000円以下の物を検索
```


INNER JOIN（テーブルを結合する）

```
SELECT (*) 
FROM items
INNER JOIN toys ON toys_id = darts_id.toy_id;
```

BETWEEN（範囲検索）

```
where price between 1000 and 2000;
訳：値段が1000円から2000円の間の物を検索
```

IN (OR複数の条件式を使う場合IN使う可視化が上がる)

```
where price in (1000,2000,3000);
訳：値段が1000，2000，3000、の物を検索
```
【Oracle】ストアドパッケージ入門

# はじめに

以下の記事に続いて、ストアドパッケージについて復習した結果を記事としてまとめてみました。

* [【Oracle】PL/SQL入門](https://qiita.com/nkojima/items/93a9c01741965f11bb8c)
* [【Oracle】ストアドプロシージャ入門](https://qiita.com/nkojima/items/2f793251e4465a3a8da2)
* [【Oracle】ストアドファンクション入門](https://qiita.com/nkojima/items/aa7be169f2d983c0f413)
* [【Oracle】カーソル入門](https://qiita.com/nkojima/items/c073f977c4c0097bec53)

# 使用した環境

* Oracle社が提供している[Oracle Live SQL](https://livesql.oracle.com/)でOracle19cを利用しました。

# ストアドパッケージとは

* ストアドプロシージャやストアドファンクションをまとめたものをストアドパッケージ（以下、パッケージ）と呼びます。
* パッケージは「単にストアドプロシージャやストアドファンクションをまとめたもの」ではなく、スコープがパッケージ内に限られる変数やユーザー定義例外などを利用することもできます。
* パッケージの構造は、以下の2つに大別されます。
 * 仕様部：外部公開するオブジェクトの定義やサブプログラムの仕様を記述します。
 * 本体部：パッケージ内部で使用される変数の定義やサブプログラムの本体（実体）などを記述します。


# 作成したSQL

* 以下のSQLは、消費税に関する処理をまとめたパッケージです。
* ファンクションの`get_tax_rate`では、日付に応じた消費税率（8% or 10%）を返す処理となっています。
* プロシージャの`calc_tax_included`では、価格と販売日に応じて「消費税込み額」を返す処理となっています。
* プロシージャやファンクションの末尾が`END`ではなく、`END {プロシージャ名}`や`END {ファンクション名}`となっている点に注意が必要です。

```sql:pkg_tax.sql
-- 仕様部
CREATE OR REPLACE PACKAGE pkg_tax AS

  --ファンクション
  FUNCTION get_tax_rate(sales_date IN DATE) RETURN NUMBER;
  --プロシージャ
  PROCEDURE calc_tax_included(price IN NUMBER, sales_date IN DATE, tax_included OUT NUMBER);

END;
/
-- 本体部
CREATE OR REPLACE PACKAGE BODY pkg_tax AS

  -- グローバル変数の宣言部
  -- 現在の消費税率
  current_tax_rate NUMBER := 10;
  -- 以前の消費税率
  previous_tax_rate NUMBER := 8;

  -- 消費税率を返す。
  -- sales_date: 販売日。
  -- return: 消費税率。
  FUNCTION get_tax_rate(sales_date IN DATE) RETURN NUMBER
  -- 宣言部
  IS
    tax_rate NUMBER;
  -- 処理部
  BEGIN
    IF (sales_date >= TO_DATE('2019/10/01', 'yyyy/mm/dd')) THEN
      tax_rate := current_tax_rate;
    ELSE
      tax_rate := previous_tax_rate;
    END IF;

    RETURN tax_rate;
  END get_tax_rate;

  -- 消費税込額を求める。
  -- price: 商品の税抜き価格。
  -- sales_date: 販売日。
  -- tax_included: 消費税込額。小数点以下の端数は切り捨てとする。
  PROCEDURE calc_tax_included(price IN NUMBER, sales_date IN DATE, tax_included OUT NUMBER)
  -- 宣言部
  IS
    tax_rate NUMBER;
  -- 処理部
  BEGIN
    -- 消費税率の取得
    SELECT
      get_tax_rate(sales_date)
    INTO
      tax_rate
    FROM
      DUAL;

    -- 税込額の計算
    tax_included := TRUNC(price * (100 + tax_rate) / 100);
  END calc_tax_included;
END pkg_tax;
/
```

```sql:実行用SQL（ストアドファンクション）
SELECT
  -- 2019年9月30日における消費税率を求める。
  pkg_tax.get_tax_rate(TO_DATE('2019/09/30', 'yyyy/mm/dd'))
FROM
  DUAL;
```

```text:実行結果（ストアドファンクション）
8
```

```sql:実行用SQL（ストアドプロシージャ）
-- 宣言部
DECLARE
  tax_included NUMBER;
-- 処理部
BEGIN
  -- 2019年10月1日における、パソコン（59800円）の税込価格を求める。
  pkg_tax.calc_tax_included(59800, TO_DATE('2019/10/01', 'yyyy/mm/dd'), tax_included);
  DBMS_OUTPUT.PUT_LINE(tax_included);
END;
```

```text:実行結果（ストアドプロシージャ）
65780
```

# 参考URL

* [ここからはじめよう Oracle PL/SQL入門](https://www.oracle.com/technetwork/jp/ondemand/database/db-basic/b-11-plsql-1448399-ja.pdf)
Windows10でAnacondaでPythonでTensorflowセットアップ（GUI）

#概要メモ
PythonのTensorflowの環境構築とクイックスタートです。
Windows10にAnacondaをインストールしてPython(version3.7)にTensorflow(version2.1.0)をセットアップ。(すべてGUIでします）
最後にJupyterNotebookを使って公式クイックスタートプログラムを動かします。
（2020/4/18）

#Anacondaセットアップ
インストーラをダウンロードしてクリックするだけです。
https://www.anaconda.com/distribution/
詳しくは（マックですが）以下に乗ってます
https://qiita.com/FukuharaYohei/items/d8f82c827e0bae70096a

#tensorflowのインストール
上はCUIでやってますがGUIからできると思います

![tests.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/33c7f98c-025e-fa4b-ce7e-fb4069bd1a49.png)
"Environments"(1)→"Create"(2)から環境を新規作成。
"Home"から"Jumpyter Notebook"をインストール。
(3)の"All"のところは"Not install"でも良いと思います。
検索ボックス(4)に"tensorflow"と入力してインストールしたいものにチェック(5)して"Apply"(6)すればOKです。（はじめは"tensorflow"のみでいいと思います）

#実際に動かしてみる
PythonのエディタはJupyterでやって見ます。"Environments"→新規作成した環境の"▶"から"Open With Jupyter Notebook"でブラウザに以下が開かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/0990cbbf-4e3a-e4ea-a2e4-69093977a47a.png)
右の"New"から"Python3"を選択。実行環境兼エディタが開かれます。

公式クイックスタートから
https://www.tensorflow.org/tutorials/quickstart/beginner?hl=ja
サンプルプログラム全部コピペすればなにかすごいことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/a486246e-0bc9-c12e-14ac-66ecedaa3be2.png)

あとは保存して開始記念にすればいいと思います。注意点ですがPython3.7, Tensorflow2.1.0で実行してます。
環境が変われば動かない可能性があるので気をつけてください。
また、Tensorflowのバージョンが明記されていない場合がたくさんあります。バージョンによっては互換性がないので安易にコピペしては動かない場合が多いと思います。

なにかご指摘、ご不満ありましたらコメントお願いします。
Confluenceの警告・注意・情報・ヒントマクロ

ログレベルとかの感覚だと、warning→:warning: 黄色ってイメージなのですが、
Confluenceのマクロだとwarning→警告→:rotating_light: 赤です。

あと、[マクロ](https://ja.confluence.atlassian.com/confcloud/macros-724765157.html)のオートコンプリート(`{`の後にマクロ名入力するやつ)を使おうとしても、
注意がattentionとかでは出ないし、ヒントもhintで出なくて辛いのでまとめておきます。

|日本語名|色	|マクロ名(オートコンプリート用)|
|-------|------------------|------------------|
|警告	|:rotating_light: 赤	|warning |
|注意	|:warning: 黄色	|note|
|情報	|:information_source: グレー	|info|
|ヒント	|:white_check_mark: 緑	|tip|

([公式ドキュメント](https://ja.confluence.atlassian.com/confcloud/info-tip-note-and-warning-macros-724765216.html)もひとつのページにまとめちゃってるし、ひとつのマクロにしてtypeを指定する形式の方が使いやすかったのでは……感)
Docker内でRails cをしてadmin機能を持ったユーザを作成する方法


以下の記事の内容のDocker版です。
https://qiita.com/geek_shanshan/items/c68befcae55c078b5a9d


管理用にadminカラムを持ったユーザーを作成したいと思いました。

####前提
Rails は ```web``` で動作します。
Dockerをアプリに組み込めている状態です。



##手順

```
$  docker-compose up -d     #コンテナを起動する

$  docker-compose exec web bash   #コンテナ内に入りbundle install、rails cなどを使える状態にする

root@コンテナID:/アプリ名#rails c    #コンソールに入る

irb(main):006:0> User.create!(name:'admin', email:'admin@example.com',  password:'admin', admin: true)   #ユーザーを作る
```



終わりです。



既存のユーザにアドミン権限をつける方ほはこちら。


```
user = User.find(1)
user.admin = true
user.save
```
#Ruby の #Rspec ENV 環境変数を他のテストケースを汚さずにハッシュで上書きして特定のキーを削除する ( overwrite hash clean not dirty  by stub constant and delete specific key )

```rb

# run
#
# FOO=bar rspec this-spec-file.rb

describe do
  # OK
  describe do
    it do
      expect(ENV.fetch("FOO")).to eq "bar"
    end
  end

  # OK
  # it does not make dirty ENV ( overwritten in another test cases )
  describe do
    # Actually ENV is not hash but mock by Hash
    before do
      stub_const "ENV", ENV.to_h.tap {|env| env.delete("FOO") }
    end

    it do
      expect(ENV["FOO"]).to eq nil
    end

    # KeyError: key not found: "FOO"
    it do
      expect { ENV.fetch("FOO") }.to raise_error(KeyError)
    end
  end

  # OK
  describe do
    it do
      expect(ENV.fetch("FOO")).to eq "bar"
    end
  end
end


# is expected to eq "bar"

# is expected to raise KeyError

# is expected to eq "bar"

# Finished in 0.00387 seconds (files took 0.12889 seconds to load)
# 3 examples, 0 failures

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3080











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Bitcoinの仕組み

# Bitcoin ネットワーク
Bitcoinのネットワークは peer-to-peer(P2P) で接続した無数のノードによって構築されている。
ノードが接続するネットワークは2種類ある

- メインネット：本番用(実際の価値がある)
- テストネット：開発用

# Bitcoin ノード
ノードには大きく分けて4つの機能がある。

#### フルブロックチェーン機能

- ジェネシスブロック(0番目のブロック)から最新のブロックに含まれる全てのトランザクションを取得し、DBに保持する
- 全てのデータをDB上で管理しているため、外部データを参照する必要がない

#### マイニング機能

- Bitcoinのトランザクションを検証し、不整合なくブロックに記録する
- マイニングには膨大なコンピューティングリソースを必要とするため、ブロックの記録を行うことができたノードはその対価として Bitcoin を新しく生成し、受け取ることができる

#### ネットワークルーティング機能

- ノードはTCP通信で接続し、他のノードの発見、トランザクションやブロック情報の伝搬を行う

#### ウォレット機能

- 秘密鍵の管理をメイン機能として、公開鍵とアドレスの生成、残高の管理、Bitcoin の署名などを行う

# Bitcoin アドレス

- Bitcoin の受け取りに必要
- 銀行の口座のようなもの

### アドレスの生成手順
Bitcoin アドレスの大元は秘密鍵になるので、最初に秘密鍵を生成する必要がある
手順：秘密鍵の生成　→　秘密鍵から公開鍵を生成　→　公開鍵からBitcoin アドレスを生成

#### アドレスの導出
アドレスは公開鍵をもとに以下の手順で生成する

1. 公開鍵のハッシュ化
2. チェックサムの生成
3. Base58 Checkエンコードでアドレスを生成

# 参考
https://tomokazu-kozuma.booth.pm/items/1842654
【JavaFX】CSSの書き方【随時更新】

JavaFXの情報が少なすぎるので必要だと思った事はどんどん書いていきます。
#CSSの適用方法
sceneに対してgetStylesheets().add(String s)すればOK。コードのどの時点ででも適用可能(要検証)。
ここはいろんなところに書いてあるので参考にすべし。

```Java8:Main.java
css = "application.css";
scene.getStylesheets().add(this.getClass().getResource(css).toExternalForm());
```

#各NodeのCSSプロパティ
何も指定しないときのデフォルトのcssは[modena.css from JDK10.0.1](https://gist.github.com/maxd/63691840fc372f22f470)が適用されている(2020年4月現在)。このファイルでページ内検索かけて装飾したいNodeのプロパティを見ながらいじればとりあえず何とかなるのではないだろうか。
原則として各プロパティはほとんど**-fx-**というprefixがついているが、自分でカスタムして使う際にこのprefixを入れなければならないという決まりはない。
[JavaFX CSSリファレンス・ガイド](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/doc-files/cssref.html)も参照するとわかりやすい。

#配色の固定
デザイン論になるのだが、1つのページ、アプリケーションのレイアウトに使う色数は特別な理由でもない限り多くても4色までに抑えておくのが吉。でも毎回

```CSS:application.css
*{
    -fx-text-fill: rgb(231, 243, 234);
    -fx-background-color: linear-gradient(rgb(104, 132, 193), rgb(58, 61, 126));
}

.label{
    -fx-background-color: rgb(104, 132, 193);
}
:
:
```
などと同じ色をrgb指定するのは数字を覚えるのもコピペするのも面倒なので、最初に一括で指定してしまうと良い。


```CSS:application.css
*{
    -color-primary: rgb(104, 132, 193);
    -color-secondary: rgb(58, 61, 126);
    -color-tertiary: rgb(231, 243, 234);
    -fx-text-fill: -color-tertiary;    /*ルートで設定しておけばこうやって書ける*/
    -fx-background-color: linear-gradient(-color-primary, -color-secondary);
}

.label{
    -fx-background-color: -color-primary;
}
:
:
```
CSSの使い方というよりはデザインをスマートにするための知恵みたいなものかもしれない。

#-fx-font-family
JavaFXじゃなくてもよく出てくる、というかこれを検索するとHTML5の話ばっかり出てくるので意外とわからない話。
以下を実行することで指定できるフォントファミリーが一覧で出てくる。

```Java8:Main.java
import javafx.scene.text.Font;

System.out.println(Font.getFamilies().toString());
```
【Day56】積み上げ日記

##予定
■Udemy（有料教材）

##完了
■Udemy（有料教材）

##学習時間
４h

##学習ポイント
■背景をぼかす
Blur

■テキストボックス内に薄く文字を表示させる方法
テキストボックス選択→Placeholder

■パスワード入力時に暗号化する方法
テキストボックス選択→Secure Text Entry

■プロトコル
デリゲートメソッドが記載されている仕様書

■デリゲート
プロトコルを呼び出すための宣言

■デリゲートの宣言方法
変数名 . delegate = self
「変数名の代表は自分です！」

■デリゲートメソッド
プロトコル内のメソッド

■画面遷移
①ボタンをタップして画面遷移
②何かのタイミングで画面遷移
performSegue(withIdentifier : “ID” , sender : nil)
③ナビゲーションを用いた画面遷移
Editor →  Navigation Controller

■デバッグ　
原因を探る作業のこと

##疑問点
■overrideがあるタイプ、ないタイプの違いは？
【Day55】積み上げ日記

##予定
■Udemy（有料教材）

##完了
■Udemy（有料教材）

##学習時間
6h

##学習ポイント
■オプショナル型
−！や？のこと
−変数を宣言する際に！や？をつけることで、
変数にnilを代入することができる。
var 変数名 : 型？

■nilが入った状態だと、アプリケーションが落ちる

■パーツのレスポンシブ対応

■WebView はWebKit を使う

■変数indicatorは、メソッドが既に用意されているため呼び出すだけでOK

##疑問点
■オプショナル型はその場面で使うのか？
■アンラップはどういう時に必要か？
■ webView.load(request)　どういう意味？
rails未経験転職用ポートフォリオ作成手順

随時更新中

#勉強出来るサービス

progate/ドットインストール

paiza

Udemy/セールの時に買う(A8セルフバック25%が最強)

<a href="https://www.techpit.jp/">TechPit</a>

Ruby on Rails チュートリアル
https://railstutorial.jp/

#youtubeでエンジニアの方が開発してるのを見る
▷<a href="https://bit.ly/2ViPdVy">0から手を動かして作るRailsチャットアプリ【チュートリアル】/とだこうき氏</a>

#質問出来るwebサービス
▷<a href="https://bit.ly/2KjKwod">スタックオーバーフロー</a>
▷<a href="https://teratail.com/">teratail</a>
▷<a href="https://menta.work/">MENTA</a>

#書籍
<a href="https://amzn.to/3bmz8nw">「プロになるためのWeb技術入門」</a>
　▷少々古いですが、参考になりました。特に第5章

#その他

図書館で技術書を借りる
最近の図書館は、web予約とかも出来ます(地域により
技術書は高いので、図書館で借りて気に入った本を買いましょう

Twitterでの転職ポートフォリオ検索ワード
＃hiyokonitsuduke ＃Twitter転職

#参考youtube
▷<a href="https://www.youtube.com/watch?v=8UtQPtxbXF0">Railsでポートフォリオを作るまでの学習順序と具体的な教材について/勝又健太氏</a>

#参考

<a href="https://backlog.com/ja/git-tutorial/">サルでもわかるGit入門</a>
<a href=""></a>
Sequel ProでMySQLに接続できない時の対処法

#SequelProでMySQLを操作したい

macOSでローカル環境のmySQLに接続したいけど、
うまくいかなかった時の対処法をメモ

#やったこと
ググった結果、
通常のSequelProはMySQLの最新バージョンに対応していないため、
以下の手順で最新バージョンに対応したsequel-pro-nightlyを
インストールしてくださいとのこと。

```
$ brew cask uninstall sequel-pro
$ brew cask install homebrew/cask-versions/sequel-pro-nightly
```

やってみたけどやはり接続失敗。

##解決策
解決策としては以下２点が挙げられます。
1.MySQLの認証方法を変更する
2.違うGUIツールを使う(Table Plus:https://tableplus.com/）

###1.MySQLの認証方法を変更する


SequelProはMySQLのバージョン8.xの認証プラグインには対応していないため、
認証プラグインを変更必要があります。

まずは現在の認証プラグインを確認
`caching_sha2_password`になっています。

```
mysql> SELECT user, plugin FROM mysql.user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | caching_sha2_password |
+------------------+-----------------------+
```
認証プラグインを変更するには以下のコマンドを入力します。


```
>ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password 
BY '任意のパスワード';

+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | mysql_native_password |
+------------------+-----------------------+
```
これで認証プラグインが変更されました。

※任意のパスワードについて、パスワードポリシーに反しているとエラーになります。
パスワードポリシーの変更方法はこちら↓
https://qiita.com/freedog1/items/2616333fcca279397485

##SequelProの接続確認

名前：任意
ホスト：127.0.0.1
ユーザー名：root
パスワード：任意のパスワード

接続できましたでしょうか。
これでもできない場合は
SQLサーバが起動しているかどうか確認してみてください。