OmniAICreator/Qiita-1.07M huggingface dataset:
青果卸売業の取引システム改修（DB)ー午後

応用情報技術者平成29年秋期 午後6

ファイル：2017h29a_ap_pm_qs.pdf

参照：
https://www.ap-siken.com/kakomon/29_aki/pm06.html

メモも簡単に記載します。
詳細の分析は、上記リンクをご参照くだいますようよろしくお願いします。


**１、〔取引システムの改修〕について，(1)，(2)に答えよ。**
（１）、図3中のd，eに入れる適切な属性名を，図2中の用語を用いて，全て答えよ。属性名の表記は図2の凡例及び注記に倣うこと。
(※正誤判定の都合上、主キー属性は{属性名}、外部キー属性は(属性名)と入力してください。)
ｄは仲卸売業者コードですね。
eは品目コード、産地コード、パレット数、単価
後は、予約情報は品目や産地に応じて仕入担当者に割当たるので、　仕入担当者コード　もいれなきゃいけないですね。

e 品目コード
　----------
  産地コード
  ----------
  パレット数
  単価

→

e 品目コード
　----------
  産地コード
  ----------
  パレット数
  単価

　仕入担当者コード
  ----------


仕入担当者コードを忘れしやすいですね。



（２）、図3中の予約エンティティにおいて，主キーに代用キーとして予約番号を用いる理由を，本文中の用語を用いて，35字以内で述べよ。

代用キーが「予約日、仲卸業者コード」を代用するので、
それがなぜかのことですね。

本文中には「予約情報を取りまとめる軸は今後変更される可能性がある」とあるので、"予約日"，"仲卸業者コード"を（複合）主キーとしてしまうと、変更時に問題が起こり得ることが想定されます。

仲卸業者は複数の予約を一括で予約できるため（私の答え）
→
予約情報を取りまとめる軸は今後変更される可能性がある（参考答え）


・代用キー：
データをシンプルに扱うために、単一でレコードを特定可能な属性をテーブルに追加し、複合キーの代わりにそれを主キーとする手法、この追加されて主キーとなる属性を代用キー（サロゲートキー）といい、通常は連番コードなどのように値の固有性を容易に確保しやすいものを設定します。

値自体に業務上の意味がない注文Noや社員IDなどがこれに該当します。
予約エンティティで言えば、"予約番号"は代用キー（サロゲートキー）であり、"予約日"，"仲卸業者コード"の組は代理キー（代替キー）という位置付けになります。


＜＜図３＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8030302a-ce2a-e1c8-df56-6c4192612100.png)


＜＜図２＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/36032e5d-73b1-393a-ff63-c34733d15c24.png)


**２、図4中のf～hに入れる適切な字句を答えよ。**
返品、販売明細には、品目コードと産地コードがないです。
仕入明細には、品目コードと産地コードがありますので、それをINNER　JOINする。

g　INNER　JOIN　仕入明細 t3 USING(仕入番号,仕入明細番号)
h　GROUP　BY　だから、SUM以外の項目でいいですね、品目コード，品目名，産地コード，産地名　ですね。
fは、合計返品金額、計算したものですね、SUM(t2.単価 × t1.パレット数)　ですね。

SUM(t3.単価 × t1.パレット数)　（私の答え）
→
SUM(t2.単価 × t1.パレット数)　（参考答え）

私は、仕入明細テーブルの単価と思ったけど、返品ときの単価は、販売明細テーブルの単価はずですね。
その返品は、仲卸業者から、卸売業者（U社）に返品するから。

＜＜図４＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/1b3a9e34-93bb-ed6a-3c1c-7817aa5ef645.png)
AWS Elastic Beanstalkとは

AWS Elastic Beanstalk についてよく分からなかったので理解を深めるためにまとめます。

#Elastic Beanstalkとは
Amazon Web Services (AWS) はめっちゃたくさんの機能があって逆に使いこなせんという初心者の方がすごい多いと思います。実際僕もそうです。

公式のドキュメントによると、、、よくわからん。。笑
要するにAWSにはインフラ系のたくさんの機能があるけど（容量のプロビジョニング、負荷分散、拡張、およびアプリケーションの状態のモニタリング等、、、）こういうのってせっかく早くアプリをリリースしたいのに、ここらへんで問題起きちゃうと大変だし、インフラの深い知識も必要になるからまるっと管理できる機能がほしいよ−って事ででてきたのがElastic Beanstalkという訳だと思います。

また、一連の Amazon EC2 インスタンスのサイズの変更、アプリケーションのモニタリングなど、ほとんどのデプロイタスクを Elastic Beanstalk ウェブインターフェイス (コンソール) から直接実行できるみたい。。すごいですね。


Elastic Beanstalk を使用するには、アプリケーションを作成し、アプリケーションソースバンドル (Java .war ファイルなど) の形式でアプリケーションバージョンを Elastic Beanstalk にアップロードした後、アプリケーションに関する情報を提供します。Elastic Beanstalk によって自動的に環境が起動され、コードの実行に必要な AWS リソースが作成および構成されます。環境が起動した後は、環境を管理し、新しいアプリケーションバージョンをデプロイできます。

##Elastic Beanstalk のワークフロー

![スクリーンショット 2020-09-13 18.18.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599304/f2d65dd3-22fd-203f-82bd-66e03f7ac486.png)
      
##どうやって利用するのか、、、。
アプリケーションを作成してデプロイした後、アプリケーションに関する情報をElastic Beanstalk コンソール、API、コマンドラインインターフェイス（統合された AWS CLI など）を介して利用できるみたい。

###しかもElastic Beanstalk使用量自体は無料！！アプリケーションが使用する基になる AWS リソースに対してのみ支払うだけらしい。


#概念
AWS Elastic Beanstalk では、アプリケーションを環境として実行するリソースをすべて管理できますとのこと。Elastic Beanstalk の主要な概念はこれらです。

##アプリケーション
Elastic Beanstalk アプリケーションは概念的にはフォルダと似ています。この中に環境、バージョン、環境設定等の部品が入っているということですね。

##アプリケーションバージョン
アプリケーションバージョンとは要するに、設計・開発・テスト・改善の一連の工程を短期間で繰り返す、イテレーションというアジャイルの開発サイクルの中で、デプロイ可能のコードをS3データとしてまとめたもの。アプリケーションバージョンはアプリケーションの一部であり、多数のバージョンを持つことができる、また各アプリケーションバージョンは一意です。
実行中の環境では、アプリケーションに既にアップロードしてあるアプリケーションバージョンをデプロイしたり、新しいアプリケーションバージョンをアップロードしてすぐにデプロイしたりできます。複数のアプリケーションバージョンをアップロードして、ウェブアプリケーションのバージョン間の違いをテストすることもできます。

##環境
環境は、アプリケーションバージョンを実行する AWS リソースのコレクションです。各環境が実行するのは一度に 1 つのアプリケーションバージョンだけですが、同じアプリケーションバージョンや複数の異なるアプリケーションバージョンを多数の環境で同時に実行できます。環境を作成するときは、指定したアプリケーションバージョンを実行するために必要なリソースを Elastic Beanstalk がプロビジョニングします。これはすごい。。

##環境枠
Elastic Beanstalk 環境を起動したら、まず環境枠を選択します。環境枠は環境で実行するアプリケーションのタイプを指定し、それをサポートするために Elastic Beanstalk でプロビジョニングするリソースを決定します。HTTP リクエストを処理するアプリケーションは、ウェブサーバー環境枠で実行されます。Amazon Simple Queue Service (Amazon SQS) キューからタスクを引き出す環境は、ワーカー環境枠で実行されます。

##環境設定
環境設定は、環境とその環境に関連付けられているリソースの動作を定義するパラメータと設定のコレクションを識別します。環境の設定を更新すると、変更の種類に応じて、Elastic Beanstalk は自動的に既存のリソースに変更を適用するか、既存のリソースを削除して新しいリソースをデプロイします。

##保存された設定
保存された設定 は、一意の環境設定を作成するための開始点として使用できるテンプレートです。設定を作成するか、保存された設定を変更し、Elastic Beanstalk コンソール、EB CLI、AWS CLI、または API を使用して環境に適用できます。API および AWS CLIは、保存された設定を 設定テンプレートとして参照します。

##プラットフォーム
プラットフォームは、オペレーティングシステム、プログラミング言語ランタイム、ウェブサーバー、アプリケーションサーバー、および Elastic Beanstalk コンポーネントの組み合わせです。ウェブアプリケーションはプラットフォームを対象にして設計します。Elastic Beanstalk には、アプリケーションを構築できるさまざまなプラットフォームが用意されています。
Linuc 202「nginxの設定と管理」おさらい

LinuC 202 出題範囲
https://linuc.org/linuc2/range/202.html

# nginx の設定と管理

## nginxコマンド

+ 設定の構文チェック

```
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

+ 設定反映 (reload)

```
# nginx -s reload
```

# nginx のSSL設定

ssl, ssl_certificate, ssl_certificate_key, ssl_ciphers, ssl_protocols

```
    # サーバ証明書
    ssl_certificate "/etc/letsencrypt/live/example.com/fullchain.pem";
    # サーバ証明書の秘密鍵
    ssl_certificate_key "/etc/letsencrypt/live/example.com/privkey.pem";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    # 暗号化スイートのリスト
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    # プロトコル
    ssl_protocols TLSv1.2;
```

＊`ssl_ciphers`のパラメータはMozillaWikiを参照する

Security/Server Side TLS
https://wiki.mozilla.org/Security/Server_Side_TLS


# リバースプロキシサーバーとしての設定

proxy_pass, proxy_http_version, proxy_set_header

```
    # HTTPヘッダ転送
    proxy_set_header    X-Forwarded-Host $host;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto $scheme;

    # アップストリームサーバのグループを定義
    upstream backend {
        server 127.0.0.1:8080;
    }
```

`upstream`の使い所がミソ。

```
# リバースプロキシ
server {
    listen 80;
    server_name example.com;
    # プロキシ先をアップストリームサーバに指定
    location / {
        proxy_pass http://backend;
    }
}
```

```
# アップストリーム
server {
    listen 8080;
    server_name example.com;
    root /usr/share/nginx/html;
    index index.html index.htm index.php;

    # PHP-FPM
    location ~* \.php$ {
        try_files $uri = 404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;

        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    }
}
```

# nginx でリダイレクトを行う

## return

`return`は特定のステータスコードを応答する。

```
    location / {
        return 301 https://example.com$request_uri;
    }
```

## rewrite

`rewrite`はマッチしたリクエストURIを別の文字列に置換する。

```
server {
    listen 80;
    server_name example.com;
    rewrite ^ https://www.example.com$request_uri? permanent;
}
```

+ rewriteのフラグ
   - 指定なし -> URIを書き換えて後続の処理をする。
   - last -> URIを書き換えた後、コンテキスト内の処理を終了する。再度マッチングする。
   - break -> URIを書き換えた後、コンテキスト内の処理を終了する。
   - redirect -> 302(Found)リダイレクトする。
   - permanent -> 301(Moved Permanently)リダイレクトする。
READMEに競プロのバッジを追加するアプリを作ろうとしたら既にあったので OSS開発したお話


# はじめに

こんにちは。ganariyaです。

7月頃からGitHubのアップデートで、[自分のアカウントページにプロフィールに関するREADME](https://qiita.com/ganariya/items/009efffb237b85ae1a47)を書けるようになりました。
「自分の履歴書」として、一箇所に情報をまとめられるため便利です。

![スクリーンショット 2020-09-13 18.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211482/b84ff1dc-9ad0-cebd-f197-407cef6b0388.png)

GitHubのREADMEの機能の追加により、以下のようなバッジを追加する記事が増え、自分もなにかバッジにまつわるツールを作りたいなと考えました。

- [Qiitaコントリビューション数をGitHubのプロフィールに貼ってドヤれるサービスを作った](https://qiita.com/mikkame/items/f2c60d9caf8a8e38ec50)
- [Qiita記事にさりげなく（けど、わかりやすく）環境を記載する](https://qiita.com/zizi4n5/items/c5f0013236fd055c3e02)

そこで、競技プログラミングに関するバッジを作成しようと思い至り
以下のようなバッジツールの作成の**お手伝い**をしました。

[![Badge](https://cp-logo.vercel.app/atcoder/ganariya2525)](https://atcoder.jp/users/ganariya2525) [![Badge](https://cp-logo.vercel.app/codeforces/ganariya)](https://codeforces.com/profile/ganariya) [![Badge](https://cp-logo.vercel.app/yukicoder/ganariya)](https://yukicoder.me/users/3037)


# CP-Badgesの発見

競プロのバッジを作ろう！と思い立ったあたりで、ちょうど学会が近づきスライド作成・発表で多くの時間を取られていました。
その結果、2週間ほど開発時間が取れず、なかなか足を踏み出せずにいました。

ようやく学会が終わり、「よし作成するか！一応既存サービスあるか調べるか！...あるねぇ!！」となりました。悲しいですね。


[CP-Badges](https://github.com/kehsihba19/CP-Badges)というリポジトリです。

```
[![Badge](https://cp-logo.vercel.app/atcoder/ganariya2525)](https://atcoder.jp/users/ganariya2525) 
```

以上のように書くことで、バッジを作成することができます。
[![Badge](https://cp-logo.vercel.app/atcoder/ganariya2525)](https://atcoder.jp/users/ganariya2525) 

バッジの詳しい作り方はREADMEを御覧ください。

# プルリクエスト

先駆者様がいましたが、「ええぃ！僕が１からさらに作ってもっとすげぇのにしてやる！」とはなりませんでした。
他の方のリポジトリに貢献・コントリビュートできたほうが嬉しいからです。

まだCP-Badgesに追加されていない機能として

- YukiCoderのレベル
- TopCoder

があったためこれらを追加するプルリクエストを投げました。

リポジトリ作成者の[kehsihba19](https://github.com/kehsihba19)から以下のような温かい言葉をいただき

> Thank you for adding the support of Yukicoder OJ.
I will be happy to merge the pull request and add you as an active contributor to the repo.
Thanks again.
Good Work :)

ganariyaはとても嬉しい気持ちになりました。

OSS開発は　技術者の方とつながることができますしレビューなどもいただけてとても嬉しいです！
もっとやっていきたいですね。

# 課題

CP-Badgesですが、毎回のバッジ作成時にBeautifulSoupでスクレイピングをしてAtCoder, Codeforces, CodeChefのレーティングをとっている実装のようです。
これだとユーザが増えるにつれて重くなっていく可能性が高いです。

そのため、時間を見つけて

- APIを用いた高速化
- データベースを用意してキャッシュ
- cronなどで定期データベース更新

などのプルリクエストを投げてみようかなと思います。


# 最後に

OSS開発楽しいですね！
もっともっと積極的にやっていこうと思います。
Google Colaboratoryで書籍「Pythonで儲かるAIをつくる」の実習コードを動かす方法

# はじめに
書籍「Pythonで儲かるAIをつくる」の著者です。

![スクリーンショット 2020-09-19 14.27.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/3f365430-8d1b-f785-8ede-151df746f6e9.png)


Amazonリンク(単行本)
https://www.amazon.co.jp/dp/4296106961

Amazonリンク(Kindle)
https://www.amazon.co.jp/dp/B08F9P726T

この本では、書籍サポートサイトに実習コードをすべて公開しています。
https://github.com/makaishi2/profitable_ai_book_info/blob/master/README.md

これらのコードは導入なしに利用できるクラウド環境Google Colaboratoryで動かすことを前提にしています。
書籍購入を検討中の方が、実習コードを試しに動かすことの参考となるよう、Google Colaboratoryでこの本の実習コードを動かすための手順を、当記事で説明します。

# 事前準備
必要な事前準備は、gmailアカウントの取得と、Chromeブラウザの導入の2つです。

## gmail アカウント
gmailアカウント取得に関しては、いろいろなところでガイドが出ているので、説明を省略します。

## Chrome導入
Colaboratoryを動かす場合の推奨ブラウザは、Google Chromeです。
まだ、自分のパソコンに導入していない場合は、以下のリンクから、ダウンロード・導入を済ませて下さい。

https://www.google.co.jp/chrome/

## Chromeでgmailにログイン
上の2つの準備が終わったら、Chromeを立ち上げて、gmailにログインした状態にします。これで、すべての準備は完了しました。

# Colaboratory起動

## Colaboratory立ち上げ
新しいタブを開いて、以下のURLを入力して下さい。

https://colab.research.google.com/

下のような画面が出てくるので、**Github**のタブを選択します。

![スクリーンショット 2020-09-13 18.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ade296fb-e7b3-ea5f-594e-fc145c5dc5f3.png)


下の画面が出てきたら
①　一番上の欄に ``https://github.com/makaishi2``と入力し、Enterキーを押します。

②　その下の欄がdropdownに変化するので、クリックして``profitable_ai_book_info``を選択します。

![スクリーンショット 2020-09-13 18.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f9a64a2d-b85d-2d83-2f30-59e580f90ea1.png)

下の画面になるので、読み込みたいファイルを選択します。

ファイル名と、中身の対応については、次のリンクを参考にして下さい。
https://github.com/makaishi2/profitable_ai_book_info/blob/master/refs/notebooks.md

例えば、3章の実習を選択したい場合、下の図のように``ch03_03_first_ml.ipynb``を選びます。

![スクリーンショット 2020-09-13 18.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0ff37c8d-f71e-81d0-7e15-336cc40041e7.png)

下の図のようになっていれば、Notebookの読み込みに成功しています。

![スクリーンショット 2020-09-13 18.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/84c628c6-7e3a-906e-a447-87876b2d73c2.png)

最低限の使い方として、上の方の「#日本語化ライブラリの導入」の領域でマウスをクリックして選択状態にした後、Shift + Enterをひたすら繰り返すと、セルと呼ばれる処理の単位を一つずつ順に実行することが可能です。
一番最初だけ、下のワーニングが出るので、右の「**このまま実行**」を選んで下さい。

![スクリーンショット 2020-09-13 18.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/88d237fd-04e8-cc31-e029-d39c51d2d369.png)

最後までうまく実行できると、こんな画面になるはずです。

![スクリーンショット 2020-09-13 19.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/27d5bc38-08e9-507c-5b60-c29ee8777caf.png)
TypeScript 基礎


# TypeScriptとは
TypeScript はマイクロソフトによって開発され、メンテナンスされているフリーでオープンソースのプログラミング言語です。

大きな特徴として

- JavaScriptに対して、型定義などの機能を追加したもの。
- JavaScriptの最新仕様である、`ES2018`の構文仕様が使え、JavaScript言語の完全なスーパーセットになっている。(JavaScriptの構文等がそのまま使うことができる。)
- TypeScriptを書く際は、TypeScriptファイル(.ts) を 作成する必要があり、そのファイルをJavaScript ファイル(.js)にコンパイルししている。


## なぜ型を追加する必要があるのか？
型があることにより、コードを書いている時点でエラーに気づくことができます。コンパイルをするときに、型の制約のチェックを行うことにより、すぐにエラーを修正可能。型を追加することによって効率的に開発を進めることが可能となっているのがメリットとして挙げられます。

numberで定義しているものにstring型のものを入れてしまった場合

```ts

let num: number = 1;
```

```ts
let num: number = 'hoge'; // エラー: `string` を `number` に代入できません
```

こんな感じにエラーを出してくれます。

# 基本アノテーション

TypeScriptでは、変数、定数、関数、引数などの後ろに 「: 型名」を指定することで型を宣言することができます。

基本的な型定義

```ts
let num: number;
let str: string;
let bool: boolean;

num = 1;
num = '1'; // Error

str = 'its';
str = 1; // Error

bool = true;
bool = 'true'; // Error
```
配列の場合

```ts
let Array: string[];

Array = ['its', 'hoge'];

Array[0] = 123; // Error
Array = ['its', 123]; // Error
```

## any型
`any`型はすべての型と互換性があります。
`any`型にはどんな方でも代入でき、その変数を何にでも代入できます。

```ts
let hoge: any;

hoge = 'name'
hoge = 123

let num: number;
hoge = num;
```
これは問題なく動作します。

## null undefindの扱い
`null`と`undefined`は、any型と同じ扱いをします。

```ts
let num: number;
let str: string;

num = null;
str = undefined;
```

## union型
union型は、プロパティを複数の型を定義して、そのどれかに当てはまると使用可能にできるものです。

```ts
type strOrNum = String | Number;

strOrNum = 'hoge';
strOrNum = 123;
strOrNum = true // Error

```

## void
`void`は関数に戻り値がない時に使います。

```ts
function log(message): void {
    console.log(message);
}
```


# インターフェース
インターフェースは、複数の型のアノテーションを一つにまとめることができます。

```ts

interface User {
   name: string;
   full_name: string;
}

let name:User;
name = {
   name: 'hoge',
   full_name: 'hoge hoge';
};

name = {           // Error : `full_name` is missing
    name: 'hoge',
};
name = {           // Error : `second` is the wrong type
    name: 'hoge',
    full_name: 123;
};
```


# 参考
wiki
https://ja.wikipedia.org/wiki/TypeScript

TypeScript の概要
https://qiita.com/EBIHARA_kenji/items/4de2a1ee6e2a541246f6

TypeScript Deep Dive 
https://typescript-jp.gitbook.io/deep-dive/
APIリクエストを並列に捌く【Promise.all】

複数のAPIリクエストを発行して、全部の返答が来るのを待って次の処理にうつる。
そのやり方です。

※こちらの内容は、[reduceでasyncする方法はこれ！](https://qiita.com/_pipo_/items/1a6dae21188a7f81c822)で
@htsignさんにご指摘いただいたコメントをほとんどそのまま記事にさせていただいております。

# Promise.allを使え！
```typescript
const itemCodeList = [
  '000000001',
  '000000002',
  '000000003',
];

// キモはここ。
const itemList: Item[] = await Promise.all(itemCodeList.map(getItemFromCodeAPI));

// next func.. （有効なものだけに絞るとか）
const validItemList = itemList.filter(item => item.status !== 404);
```

## 解説
`Promise.all`を使うことで、並列に処理を捌くことができるようになります。
参考までに、APIを並列で捌かないよくない例として、私の愚コードを晒します。

```typescript
const itemCodeList = [
  '000000001',
  '000000002',
  '000000003',
];

const itemList = await itemCodeList.reduce(
  async (accum: Promise<Item[]>, itemCode) => {
    const prev = await accum;

    // APIからの情報を待つ
    const item = await getItemFromCodeAPI(itemCode);

    item && prev.push(item);

    return Promise.resolve(prev);
  }, Promise.resolve([]));
```

お分かりいただけますでしょうか？

ついさっきまでの自分はreduceの中でどうやってasync/awaitさせるかだけに執着してしまい、
APIリクエストを1つずつこなしていく**めちゃくちゃ遅いコード**を書いてしまっていたのです。。

木を見て森を見ずってやつですかね、
恥ずかしすぎてまじぴえん。

## 謝辞
@htsignさん、おかげさまで愚コードをリリースせずにすみました！
わかりやすいご指摘ありがとうございました！
New Relic初心者 logs parsingについて②

#0.はじめに
newrelic infrastructure agentを利用し、各種ログをnewrelicへ転送。logs parsing機能を利用して情報の切り出しが可能。
[前回](https://qiita.com/say8/items/3bb71e25db9ea681a8f6 "New Relic初心者 logs parsingについて")はapacheのアクセスログをnewrelicへ転送しparsing ruleを適用したが、今回は任意の形式のログに対してparsing ruleを適用する。

#1.ログ転送
###定義ファイル格納用ディレクトリ
ログ転送の定義ファイルが格納されているディレクトリへ移動

```
cd  /etc/newrelic-infra/logging.d/
```

###configuration fileを作成
ログ識別ができるよう、カスタム属性を付加しておく。

```
logs:
- name: "random"
  file: /home/devops/random
  attributes:
    log_type: random
```

###ログ更新
以下、クーロンにより定期的にrandomファイルを更新

```
#write date and randomnum
*/2 * * * * devops echo `date '+\%Y \%m \%d'` $RANDOM >> /home/devops/random
```

###ダッシュボード確認
少し待つとダッシュボードにアクセスログが更新される。
![img1](https://1akiia.dm.files.1drv.com/y4mhgx6wHuvHUnqgad3K9zr3KDycrwnIBuqXb4N7oJyMzosaREAI95C334RjfJyknnf-Di3URP8gDTx0GnHcukxi8Nb76cm3cDtYG_kMsNVbnx64bR8unR_-bWovFn5PzkUaG4Cd74sSKNumozKyBmWDchCXA-x8-fzgY8zA3_OPZyiTfvGrjXs2b-xK2OUdd3lze6w7kREVB26f-ts31ZxNA?width=1956&height=758&cropmode=none)


#3.log parsing
###Manage parsing rules
parsing を実施するログの絞り込みを実施。
今回は転送したファイルに、log_type:randomを付与しているため、この値を利用。

###Parsing logic
ログの形式に則り、parsing logicをgrok patternで表現。
![img2](https://1am9la.dm.files.1drv.com/y4mnCgVJhtiDxvGu96Jv8Rtlyh7NzXDKEhsih90kg85YfczvDHAOF4R2YhxDb8s018Rvz_erI0qPM6-C3OCzbhlcfuM173a1xkMOm9W34qBz55LaIDk5rrxeb2FINEshB3R0yH9ZASSbaYkVYEOiFeDjmXatk2C_m4LIoykuPBWRL_wvjrQ2GCWncP_um2-YnjQ70SpJasXgh2YYiFb-FEx9w?width=1956&height=734&cropmode=none)

###結果
結果は以下の通り。message領域のアクセスログに対してparsing logicが適用されている。
<img width="400" alt="img3.bmp" src="https://1ansng.dm.files.1drv.com/y4m-cTxj1MecDsQxwwWqjvTqnntekLJJZj0ooJMIGsBKNWv-WmdudZ8qlf7ohOMrlJut_ImTZtGnkRYykt2YwhyFWfcP2Dy7A3zQDsJmK5Cpjr1fhtFm2Gduo4oudBAD9p4jFCBETn9wl7U7tOlN_iNBkkd-o-QIus136zl0JZuyCkzLcpHty2pOEEfBP0HVasK1SqKkWBSEUnD6SXKXfWzQA?width=681&height=814&cropmode=none">
Android端末にVNCサーバーを入れる

UserLandでVNCを選択してインストールすると、簡単に他の端末からVNC表示することができます。

UbuntuですとRemminaが対応しています。

~~~~
vnc:192.168.xxx.xxx:51
もしくは
vnc:192.168.xxx.xxx:5951
~~~~

ちなみにsshログインをした場合はvncは立ち上がらないので自前で動かします。

~~~~
/support/startVNCServerStep2.sh
~~~~

こちらのファイルの中にユーザー名やパスワードを設定できる部分があります。
もし、うまくログインができない場合は直接書き換えても良いかとは思います。

解像度の変更は
Debian の場合は ~/.vncrc、Ubuntu の場合は ~/.vnc/tightvncserver.conf に下記の内容を書き込みます。

~~~~
$geometry = "1600x900"
~~~~

Webカメラが使用できないのでアレですが、opencvとかGUI系が動きます。
MySQLのユーザー・権限設定

MySQL上でのユーザー・権限設定について必要だったことを纏めました。具体的には、以下について書きました。

* rootユーザーのユーザー名の変更
* パスワードの変更
* 新しいユーザーの作成
* 権限設定
* 権限設定の反映

MySQL ver. 8.0.21 で動作確認済みです。

# MySQL上のユーザー・権限の仕様について

ユーザーは、ユーザーと接続元がプライマリキーとして `mysql.user` テーブルに保存されています。コマンドでユーザーに対する操作を行う場合には、「ユーザー名@接続元」という形式を利用します。

例：

* 'root'@'localhost' - localhostからのアクセスでのrootユーザーの権限設定
* 'root'@'%' - 全てのHostからのアクセスでのrootユーザーの権限設定

# rootユーザーを変更する

```
rename user 'root'@'localhost' to 'new-root-user'@'localhost';
rename user 'root'@'%' to 'new-root-user'@'localhost';
```

# パスワードを変更する

```
SET PASSWORD FOR 'new-root-user'@'localhost' = 'new-password';
SET PASSWORD FOR 'new-root-user'@'%' = 'new-password';
```

# 新しいユーザーを作成する

```
CREATE USER 'new-user'@'%' IDENTIFIED BY 'new-password';
```

# 権限を付与する

特に、ユーザーを新たに作成した場合は権限が付与されていないため、権限の付与が必須です。

```
# 例：あるDBに対してのみ、全権限を付与する。指定されたDB内であれば全ての操作ができる）
GRANT ALL PRIVILEGES ON db_schema.* TO 'user'@'%';
# 例：あるDBに対してのみ、テーブルとVIEWのSELECTの権限を付与する。
GRANT SELECT, SHOW VIEW ON db_schema.* TO 'user'@'%';
```

詳しい権限の設定については、[公式ドキュメント](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html)内の「Summary of Available Privileges」で確認できます。

本記事では触れませんが、「READ ONLY」の権限を付与するにはどうするか、という問いに対しては[こちらの投稿](https://stackoverflow.com/questions/20036547/mysql-grant-read-only-options)を併せて見ると良いかと思います。

# 権限関連の設定を反映させる

```
FLUSH PRIVILEGES;
```

# 参考
- [https://www.dbrnd.com/2017/07/mysql-how-to-change-the-default-name-of-root-user/](https://www.dbrnd.com/2017/07/mysql-how-to-change-the-default-name-of-root-user/)
- [https://www.cyberciti.biz/faq/mysql-change-user-password/](https://www.cyberciti.biz/faq/mysql-change-user-password/)
- [https://dev.mysql.com/doc/refman/5.7/en/grant.html](https://dev.mysql.com/doc/refman/5.7/en/grant.html)
Mac OSでJulia 1.4以降でMPI.jl導入でエラーが出る時

Julia 1.3では問題なくMPI.jlが入れられたとしてもJulia 1.4がだめなときは


```
export JULIA_MPI_PATH=/usr/local/Cellar/open-mpi/4.0.3
```
で解決するかもしれません・
パスに入っているのは、自分で入れたopen-mpiのパスです。パスは

```
/usr/local/Cellar/open-mpi/
```
と入れた後にtabキーを何回か押すと出てくると思います。
エラーが出ている場合には、rm MPIをした後にadd MPIで入れ直してみてください。


In English
If you get the following error:

```
┌ Error: Error building `MPI`: 
│ [ Info: using system MPI
│ ERROR: LoadError: libmpi could not be found
│ Stacktrace:
```
when installing MPI.jl in Julia 1.4 or later, 
adding 

```
export JULIA_MPI_PATH=/usr/local/Cellar/open-mpi/4.0.3
```
might resolve the error.
[Laravel] joinで結合先のカラムの取得がものすごく簡単でびっくりした話

```User.php
publict function content()
{
   $this->join('content', 'content.user_id', 'user.user_id')
}

```
とすると、発行されるSQLは

```sql
SELECT *
from user
inner join content
on 
content.user_id = user.user_id
where user.deleted_at is NULL

```

となる。多分（間違っていたらすみません）

ここでcontentの主キ-も(content_id)取得したいとする。
そこで**select()**の出番

次のようにする

``` php
$this->join('content', 'content.user_id', 'user.user_id')
     ->select('user.*', 'content.content_id')

```
すると



```sql
SELECT user.*,
       content.content_id
from user
inner join content
on 
content.user_id = user.user_id
where user.deleted_at is NULL
```

簡単に結合先のカラム取得できた。
Gitのバージョンアップがうまく反映されない時の対応方法

gitのバージョンを調べる。

```
$ git --version
git version 2.24.3 (Apple Git-128)
```

Homebrewでgitをバージョンアップ（アップグレード）。

```
$ brew upgrade git
Updating Homebrew...
Warning: git 2.28.0 already installed
```

既に最新になっているものの、`git --version`コマンドで確認するgitのバージョンは`2.24.3`である。

調べると、`git --version`を叩いた際に`(Apple Git-128)`と出てくる場合、Xcode（コマンドラインツール）経由でインストールしたgitらしい。

つまり、PC上には、
①Xcode（コマンドラインツール）経由でインストールしたgit（ver.2.24.3 (Apple Git-128) )
②Homebrew経由でインストールしたgit（ver.2.28.0）
が存在する。

どちらのgitを使用するかPCに設定する必要（PATHを通す）がある。
zshを利用しているので、`.zshrcファイル`にパスを記載する。

```
$ vi ~/.zshrc
```
`i`キーでINSERTモードにしてPATHを記載。

```
export PATH=/usr/local/bin/git:$PATH
```
`esc`キーでINSERTモードを終了し、`:wq`で変更を保存

ターミナルを再起動して、再度gitのバージョンを確認。

```
$ git --version
git version 2.28.0
```
Homebrew経由でインストールしたgitにPATHが通っていることを確認できた。
【EC2】AMIを使用したインスタンスの複製

## やること
- EC2インスタンス「`web-1a`」から「`web-server`」という名前のAMIイメージを作成する
- AMIイメージ「`web-server`」から、新たなEC2インスタンス「`web-1b`」を起動する
- 「`web-1b`」にssh接続し、複製が完了したことを確認する

## 1.　複製元のインスタンスを停止する
<img width="1440" alt="スクリーンショット 2020-08-10 18.06.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/c302fbce-9f4e-9cb5-1f42-0175a98d3289.png">

## 2. AMIイメージを作成する
<img width="1440" alt="スクリーンショット 2020-08-10 18.09.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/3a12b476-98c1-925f-b22b-6fd5c9972a2a.png">
<img width="1440" alt="スクリーンショット 2020-08-10 18.11.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/91410c36-2310-b322-4325-4d579bfa867b.png">

### 作成完了
<img width="1440" alt="スクリーンショット 2020-08-10 18.13.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/640ec768-917e-9b39-9015-d6916a46584f.png">

## 3. AMIイメージからインスタンスを起動する
<img width="1440" alt="スクリーンショット 2020-08-10 18.35.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/88697bda-c6e2-a5f2-4462-8be7809ea976.png">

## 4. インスタンスの設定をする
- インスタンスタイプの選択
- インスタンス詳細の設定
- ストレージの追加
- タグの追加：「Name」を「web-1b」に設定
- セキュリティグループの設定：「HTTP」と「HTTPS」を追加
- キーペアを作成または選択する

### 起動完了
<img width="1440" alt="スクリーンショット 2020-08-10 18.54.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/f89b1002-528e-5740-1ebc-e63d6a5d97a8.png">

## 5. 起動したインスタンスにssh接続する
```
$ ssh -i ~/.ssh/[秘密鍵名].pem ec2-user@[web-1bのパブリックIP]
```

## 6. インストール済みのファイルを確認する
```
[ec2-user@ip-[web-1bのプライベートIP] ~]$ sudo su -
[root@ip-[web-1bのプライベートIP] ~]# yum list installed | grep httpd
```

### 複製完了
Apacheの設定ファイルがインストールされたインスタンスが複製されたことが確認出来る

```
generic-logos-httpd.noarch            18.0.0-4.amzn2                 @amzn2-core
httpd.x86_64                          2.4.43-1.amzn2                 @amzn2-core
httpd-filesystem.noarch               2.4.43-1.amzn2                 @amzn2-core
httpd-tools.x86_64                    2.4.43-1.amzn2                 @amzn2-core
```
Arduino でマク〇ナルドのあの音を鳴らしてみる

# はじめに
なんとなく鳴らしてみたくなったので。

# やり方

有難いことに譜面を公開されている方がいらっしゃいました。これを参考にします。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">マクドナルドのポテト完成音の譜面をどうぞ。 <a href="http://t.co/pCaUMFv1pk">pic.twitter.com/pCaUMFv1pk</a></p>&mdash; 事務員G (@ZimuinG) <a href="https://twitter.com/ZimuinG/status/319277807119241216?ref_src=twsrc%5Etfw">April 3, 2013</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Arduino は Nano を使いましたが、Tone() が使えるボードなら何でも構いません。

**See also:**

 - [Arduino Nano (Arduino.cc)](https://www.arduino.cc/en/Main/ArduinoBoardNano)
 - [Arduino Nano (ht-deko.com)](https://ht-deko.com/arduino/nano.html)
 - [tone() (Arduino.cc)](https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/)

## 配線
パッシブブザーをブッ挿すだけです。お手軽ですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/46d87307-9489-ad13-5738-dbef6713faf6.png)

| ブザー | Arduino |
|:---:|:---:|
| + | D3 |
| GND  | GND |

**See also:**

 - [Chapter 7: Buzzer - Arduino UNO チュートリアル: サインスマートのプロジェクト練習教本 (ht-deko.com)](https://ht-deko.com/arduino/uno_tutorial2.html#02_02_07)

## スケッチ

Arduino のチュートリアルにある [『Play a Melody using the tone() function』](https://www.arduino.cc/en/Tutorial/ToneMelody) のコードをパクって作ります。

```cpp:FrenchFries.ino
#include "pitches.h"

static const int tempo = 130;
static const float duration = 60000 / tempo * 4;

int melody[] = {
  NOTE_G5, NOTE_FS5, NOTE_G5, 0 
};

int noteDurations[] = {
  8, 8, 8, 8
};

#define PIN_SPEAKER 3

void setup() {
  
}

void loop() {
  for (int i = 0; i < sizeof(melody) / sizeof(int); i++) {
    int noteDuration = duration / noteDurations[i];
    tone(PIN_SPEAKER, melody[i], noteDuration);
    delay(noteDuration);
    noTone(PIN_SPEAKER);
  }
}
```

`pitches.h` も忘れずにパクっておきましょう。

tone() / noTone() の (最初の) 引数はスピーカーのピンです。**Arduboy** なら `PIN_SPEAKER_1` **Wio Terminal** なら `WIO_BUZZER` 定数を使って鳴らせると思います。


**See also:**

 - [Arduboy (ht-deko.com)](https://ht-deko.com/arduino/arduboy.html)
 - [[応用] Arduboy 互換機 (Arduboy Clone) (ht-deko.com)](https://ht-deko.com/arduino/arduboy_clone.html)
 - [Wio Terminal (ht-deko.com)](https://ht-deko.com/arduino/wio_terminal.html)

## 実行

スケッチが転送されると問答無用で鳴り出します。ブザーを抜けば鳴り止みます、お手軽ですね！

**「パラッパッパッパー...♪」**

いえ、そっちじゃないです。


# おわりに
環境音がウルサイので (動画が撮れないので) 、実際に鳴っている動画とかはありません。
ROSでcatkin buildツールをインストールするコマンドメモ

以下のコマンドで、ROS使えるcatkin buildツールをインストールする

```
sudo apt install python-catkin-tools
```

環境
ubuntu16.04
ROS kinetic

# 参考
[ROS catkin buildの簡単な使い方](https://qiita.com/harumo11/items/ae604ba2e17ffda529c2)
GitHub 備忘録

## はじめに
Gitについて学んだはずなのに、いざ共同開発を始めようとしたときに自分が全然Gitを理解していないことに気が付いたので、備忘録として残すことにしました。

以下はGitHubに対する私個人の解釈が強く含まれていますので、何か誤解がありましたら遠慮なくご指摘ください。
## 開発環境
- Windows 10 Home

## GitHubの目的
簡単に言うと、チームで**ディレクトリ**を管理することである。

ある時点でのディレクトリの状態のことを**バージョン**と呼び、それを共同で管理するプラットフォームが**GitHub**。そして、**Git**はバージョンを管理するツールである。

ディレクトリのうち、Gitが接続されたものを**リポジトリ**と呼ぶことにする。また、GitHub上に存在して協同でリポジトリを**リモートリポジトリ**、自分のpc上のリポジトリを**ローカルリポジトリ**と呼ぶことにする。

つまり、GitHubを用いたチーム開発とは、**各個人がローカルリポジトリで作業をし、そしてそれぞれがその作業の結果をリモートリポジトリに反映させていくこと**である。

## 具体的な作業
### 1. 全体の作業を自分に反映

cloneとは、リモートリポジトリを自分のpcに**コピー**すること、すなわちローカルリポジトリを作ることである。繰り返しはなるが、リポジトリとは、Gitが接続された**ディレクトリ**のことである。よって作業もこれをただのディレクトリとみなして進めればいい。

```
git clone <<リモートリポジトリのURL>>
```
また、pullとは、既にリモートリポジトリをclone済みのときに、リモートリポジトリの内容を今のローカルリポジトリの内容（あるブランチについて）**更新**させることである。

```
git pull origin <<ブランチ名>>
```
ここでいうoriginは**リモートディレクトリ**を指している。


   
### 2. **branchを切って作業**
個人的にはこれは**パラレルワールド**を作っていくイメージである。
branchを切ることで異なる時間軸が用意できる。ローカルでの作業では、自分が進めたい時間軸を新たに作成してそこで作業をし、完成したらチームのメンバーに確認をしてもらって、メインの時間軸に自分の作業を反映させることができる。

<span style="color: #d61b09">※注意</span>：branchを切るためにはcdコマンドでそのディレクトリに移動をしておく必要がある。

- 新たなbranchを切ってそこに移動

```
git checkout -b ブランチ名
```



#### branchの種類
- **master branch**

デフォルトのメインのbranch。これを完成形に持っていくのが目標。
- **develop branch**

サブのbranch。ここまで共同で管理。確実に変更することがなさそうならmasterにpushする。ローカルでの作業のためにはさらにここからbranchを切っていく。

### 3. 自分の作業を全体に反映
ローカル（ワーキングツリーとも呼ばれる）で作業を進めたら、最終的にはそれは全体に共有させたい。すなわち、リモートリポジトリに作業を反映させたい。そのためには、

1. 自分の作業をローカルリポジトリに反映させること
2. ローカルリポジトリの内容をリモートリポジトリに反映させること

が必要である。

### 1. どのファイルをローカルリポジトリに反映させるかを決める(add)
どの作業をローカルリポジトリに反映させるかは選べるのである。選ばれたファイルたちがいる場所はステージやインデックスと呼ばれる。

```
git add <<ファイル名>>
```
現在のディレクトリ以下にある、作業をしたすべてのファイルをステージに上げたければ以下のコマンドも使える。

```
git add .
```

### 2. ローカルリポジトリを更新(commit)
インデックスの内容をローカルリポジトリに反映させる。

```
git commit -m "コミットメッセージ"
```
### 3. リモートリポジトリに反映(push)
ローカルリポジトリの修正内容をリモートリポジトリに反映させる。

```
git push origin <<branch名>>
```

## 考察・終わりに
新しい言葉がたくさん出てきてややこしいですが、実際にgithubを使いながら慣れていければと思っています。

https://backlog.com/ja/git-tutorial/
shellscriptでオプションを指定してみる

getoptsを以下のように使えばよい

```sh:test.sh
#!/bin/sh

while getopts l:a: OPT
do
    case $OPT in
        "l" ) echo "-l argument = $OPTARG !!";;
        "a" ) echo "-a argument = $OPTARG !!";;
    esac
done
```

オプションを指定して実行

```
$ ./test.sh -l "arg1" -a "arg2"
-l argument = arg1 !!
-a argument = arg2 !!
```

# 参考
[shell scriptでのgetoptsの使い方メモ](https://qiita.com/edo_m18/items/ccd49cc330cbc1b3ff61)
[bash によるオプション解析](https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb)
[bash: コマンドライン引数のオプション解析(optgets)](https://qiita.com/laikuaut/items/adf35ecb14c55f6fde92)
【初心者でもわかる】hover時に、画像の上に半透明の背景と文字を乗せる方法

# どうも7noteです。画像の上に文字を表示させたい時の方法パート②

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/onimage2/
【EC2】Bashコマンドによるサーバー設定

## Bashとは
Linuxにおけるデファクトスタンダードになっているシェルスクリプト

**シェルスクリプト**：ユーザーとカーネル（OSの基幹機能）とのやりとりで使用される言語

## やること
- EC2インスタンス作成時にユーザーデータを設定する
- EC2インスタンスを起動する
- インスタンスにssh接続し、Apacheの設定ファイルがインストールされていることを確認する

## 1.インスタンスを作成する
インスタンスの詳細設定以外は全てデフォルト値

## 2. ユーザーデータを設定する
![スクリーンショット 2020-09-13 17.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/6e7541ef-58f0-9013-ba3b-e42a0f86c5b4.png)

```:bashsetting.text
#!/bin/bash
# サーバーの設定変更
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=test-bash/g' /etc/sysconfig/network
hostname 'test-bash'
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo"|g' /etc/sysconfig/clock
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
# Apacheのインストール
sudo yum update -y
sudo yum install httpd -y
sudo chkconfig httpd on
===
```

## 3. インスタンスにssh接続する
HOSTNAMEが `test-bash` になっていることが確認出来る

```
$ ssh -i ~/.ssh/[秘密鍵名].pem ec2-user@[パブリックIP]

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@test-bash ~]$
```

## 4. ユーザーデータの適用を確認する
```
[ec2-user@test-bash ~]$ sudo su -　//管理者権限に移動
[root@test-bash ~]# yum list installed | grep httpd　//インストールされたファイルを確認
generic-logos-httpd.noarch            18.0.0-4.amzn2                 @amzn2-core
httpd.x86_64                          2.4.43-1.amzn2                 @amzn2-core
httpd-filesystem.noarch               2.4.43-1.amzn2                 @amzn2-core
httpd-tools.x86_64                    2.4.43-1.amzn2                 @amzn2-core
```
catkin build時にエラーになる（error: ‘xxx’ is not a class or namespace）

catkin build時にエラーになる

```
$ cd catkin_ws
$ catkin build
src/following_planner.cpp:163:23: error: ‘GoalStatus’ is not a class or namespace
   else if (status_ == GoalStatus::GOALREACHED)
                       ^
make[2]: *** [CMakeFiles/following_planner.dir/src/following_planner.cpp.o] Error 1
make[1]: *** [CMakeFiles/following_planner.dir/all] Error 2

```

以下の通りCMakelist.txtにc++のコンパイルオプションを追加して解決


```diff:CMakelist.txt
-# add_compile_options(-std=c++11)
+add_compile_options(-std=c++11)
```

# 環境
ubuntu16.04
ROS kinetic
Rails チュートリアル　バージョン違いで rails new できない時

超超初心者向けです。

railsチュートリアルで新しいアプリの作成時に

$ rails _6.0.3_ new hello_app

を実行すると、

Traceback (most recent call last):
.
.
can't find gem railties (= 6.0.3) with executable rails (Gem::GemNotFoundException)

このようなエラーが出てしまいました。



https://teratail.com/questions/80979



↑こちらの記事を参考にさせていただいて


$ gem install rails -v 6.0.3


でgem をインストールしてもう一度 


$ rails _6.0.3_ new hello_app

することで解決しました。
Luaメモリ詳細診断

現在、Luaはすでに各開発チームがプロジェクトのHot Fix機能を実現するための一般的な実装方法だと思われますが、プロジェクトに機能追加、バッグ修正は非常に柔軟で便利です。しかし、プロジェクトで大量にLuaを使用することにより、プロジェクト実行時の重要なパーフォマンス問題の一つでもあります。特にメモリ関連の性能問題は、メモリの割当過ぎかメモリリークかどちらも開発中のプロジェクトで集中的に発生しているようです。
このため、UWA GOTでLuaのメモリ詳細診断機能をリリースしました。すでにUWA GOT Onlineサービスを購入済みのユーザー様は、実機でテストしたデータを[UWAホームページ](https://jp.uwa4d.com/) にアップロードし、すぐLuaのメモリテストレポートを確認することができます。
![1_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/24c41fa6-0187-ec6f-ade5-0c42d579959a.jpeg)
現在のバージョンはすでに主流のuLua、ToLua、SLua とxLuaをサポートしております。開発チームがLuaのNativeライブラリをカスタマイズし、リネームすれば、UWAEngine.SetOverrideLuaLibを使用してライブラリ名を指定することができます。

**Luaメモリ診断は全体ヒップメモリ、ヒップメモリの詳細割当てとMonoオブジェクト参照の三つの部分に分かれております。以下をご参照ください。**

#####1、全体ヒップメモリ

本テストレポートではLuaの全体メモリトレンド及びLuaのいくつ重要なオブジェクトCountを表示しております。Table，UserdataとFunction（通常threadのCountが少なく且つ安定的であるあるため、ここでは表示されません）。
![2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7687a9db-efae-0a72-45ff-3b60e820e2e9.png)
上図の通り、プロジェクトが実行されたフレームごとのLuaメモリの使用状況をはっきり確認することができ、それぞれの数値が当初の予定値よりずれているかどうか、またはメモリリークのリスクがあるかどうか検討できます。
#####2、ヒープメモリ詳細割当

本レポートでは開発者がLuaヒープメモリの割当の多い関数を特定するのによく使用されます。開発者のLuaヒップメモリ使用の最適化のため、これらの関数の任意の1フレームの割り当てられたスタック情報を確認でき、Lua GCの発生率や発生時のメモリコストの低減につながります。
![3_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/35087c9d-0d2f-2679-0323-405242ff13c6.jpeg)
>備考：Lua関数のネーミング方法はX@Y:Z，内Xが関数名，取得出来ない場合はXがデフォルトでunknownに変わります；Yは当該関数が定義したファイルの位置；Zは当該関数が定義された終了の行番号。特に注意して頂きたいのは、LuaのスクリプトをBytecodeで実行される場合は，数値はずっと0になるため、テスト時はできるだけ、Luaのソースコードでの実行を推奨いたします。

また、Monoメモリの逆順分析機能と同じように、Luaのメモリ情報でも同様に確認することができます。閲覧方法を切り替えるだけで、どのLuaのスクリプトのどの行のコードで、大量のメモリを使用しているか見つかることができます。そして、開発者が直接対応されたLuaスクリプトを開き、その行のコードを修正でき、性能改善がこのように簡単にできます。
![4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/e8141968-be4e-66bc-c992-40cfc2b67a23.png)
#####3、Monoオブジェクト参照

すべてのLuaプラグインでは，以下のような類似仕組みが存在しますが

C#レイヤーにCacheを保持し、LuaにアクセスされたC#レイヤーのオブジェクトを参照します。この仕組みは主にLuaが再度C#オブジェクトにアクセスする際に、当該オブジェクトはすでにGCに回収され、ロジックエラーにつながることを防ぐためです。**そのため、Lua内にあるC#レイヤーのオブジェクト参照用にCacheを保持すると、それを解放されず、このような参照が多くなればなるほど、C#レイヤーのメモリリークに繋がります。**
開発者がこのような状況を調査しやすくするため、Monoオブジェクト参照のレポートでは、上述のCache内のC#レイヤーのオブジェクトを整理し、Cacheで現れたオブジェクトのタイプや各タイプのオブジェクトの合計数量を統計しました。当該オブジェクトはUnityEngine.Objectに継承され、当該オブジェクトタイプでDestroyされたオブジェクト数量も統計されます。詳細下図参照：
![5_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/d5eb8cb1-5f41-da9e-cf2b-7fc90925533d.png)
上図のそれぞれのオブジェクトタイプをクリックすれば、合計数量の変化を確認できます。ある数量を持続的に上昇しているタイプに対して、二つのサンプリングポイントの違うオブジェクト参照を比較すれば、さらにLua内の合理的ではない参照を特定することができます。
![6_1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/cdf480a5-ee99-c535-0186-69757e987dbb.jpeg)

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
ubuntu18.04LTS上で動画を録画

simplescreenrecorderをインストール

```
sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
sudo apt-get update
sudo apt-get install simplescreenrecorder
```

（必要に応じて）.vlcファイルを再生するには以下をインストールする

```
apt install ubuntu-restricted-extras
```

# 参考
[Ubuntuの画面録画が簡単にできるSimpleScreenRecorderのインストール方法と使い方](https://ry0.github.io/blog/2016/02/21/simplescreenrecorder/#gsc.tab=0)
[Ubuntu 18.04 LTSのセットアップ](https://qiita.com/SUZUKI_Masaya/items/54cc17a42597733c87d1)
【EC2】Elastic IPの設定

## やること
- EC2インスタンスにElastic IPアドレスを割り当てる
- EC2インスタンスにを割り当てられたElastic IPアドレスを解放する

## 1. EC2インスタンスを停止する
<img width="1440" alt="スクリーンショット 2020-08-09 9.57.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/1db10728-478c-cc44-8b69-87f4574493a5.png">

## 2. Elastic IPアドレスを割り当てる
![スクリーンショット 2020-09-13 17.50.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/31eae77f-1cdd-04dc-8c84-3ef35923d000.png)
<img width="1440" alt="スクリーンショット 2020-08-09 10.02.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/ad02c7bf-699c-f5e7-ee18-75ed5dda5d92.png">

### 割り当て完了
<img width="1440" alt="スクリーンショット 2020-08-09 10.03.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/dd4f9772-56ba-1b58-41bc-7275d2b0cf32.png">

## 3. EC2にインスタンスに関連付ける
<img width="1440" alt="スクリーンショット 2020-08-09 10.10.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/096b6fa7-01e5-5116-d952-4485c78e5380.png">

## 4. 関連付けるインスタンスとプライベートIPアドレスを選択する
<img width="1440" alt="スクリーンショット 2020-08-09 10.12.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/5ac40bc2-10ab-93da-210e-d79cf63ecfbc.png">

### 関連付け完了
<img width="1440" alt="スクリーンショット 2020-08-09 10.15.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/0d1af277-c205-0d09-f510-4533b72789a6.png">

## 5. 関連付けを解除する
<img width="1440" alt="スクリーンショット 2020-08-09 10.18.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/fdaa9697-7e19-0104-db27-0188a100eb47.png">
<img width="1440" alt="スクリーンショット 2020-08-09 10.20.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/b021d06c-82cb-3790-24f2-6dd48632b0bf.png">

## 6. Elastic IPアドレスを解放する
<img width="1440" alt="スクリーンショット 2020-08-09 10.22.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/b8634d7c-eb1a-d1c0-46f6-e32884ccaa3b.png">
<img width="1440" alt="スクリーンショット 2020-08-09 10.24.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/e1b94211-5901-6c14-20f1-f3926791c129.png">

### 解放完了
<img width="1440" alt="スクリーンショット 2020-08-09 10.26.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/20054958-3583-87ed-6a16-1e63de249c26.png">
ubuntu18.04でnfsプロトコルversion2を利用する方法

> [Ubuntu 17.10でnfsサーバーがプロトコルバージョン2をサポートするようにするにはどうすればよいですか？](https://www.it-swarm.dev/ja/17.10/ubuntu-1710%E3%81%A7nfs%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8C%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B32%E3%82%92%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/961133444/)

以下のように、/etc/default/nfs-kernel-serverに明示的に指定しなければいけないようだ

> /etc/default/nfs-kernel-serverを次の行に変更する必要があります。

```
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
# To confirm above mods are in effect after service restart use
#     cat /run/sysconfig/nfs-utils
#  or 
#    service nfs-kernel-server status
#
```

その後サービスを再起動すればOK

```
$ service nfs-kernel-server restart
```

# 参考
[Ubuntu 17.10でnfsサーバーがプロトコルバージョン2をサポートするようにするにはどうすればよいですか？](https://www.it-swarm.dev/ja/17.10/ubuntu-1710%E3%81%A7nfs%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8C%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B32%E3%82%92%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/961133444/)
A-Frameで3Dモデルを使用するときのメモ


ローカルで動かすのに苦戦したのでメモ

A-Frameで3Dモデル
gltfモデルのサンプルを落としてきた。

```
scene.gltf
scene.bin
index.html 
```
```index.html
<!doctype html>
<html>
  <head>
    <!-- A-Frameの導入 -->
    <script src="https://aframe.io/releases/1.0.4/aframe.min.js"></script>

    <title>A-Frame</title>
  </head>
  <body>
    <a-scene>
      <!-- gltfファイル -->
      <a-assets>
        <a-asset-items id="bird" src="scene.gltf" ></a-asset-items>
      </a-assets>
      <a-entity gltf-model="#bird" scale="0.01 0.01 0.01"></a-entity>   
    </a-scene>
  </body>
</html>
```

index.htmlをそのままクリックしても開かない。
VScodeのliveserverか、Netlifyにデプロイして実行。
array_push の返り値

array_push の返り値は処理後の配列そのものではなく、配列の要素数なので、書き方には気を付けなければいけません。

```example.php
$ex_array = array();
array_push($ex_array, 'youso');
//$ex_array = array_push($ex_array, 'youso1'); ではエラーになる
```
AWS基礎　7つのベストプラクティスとVPC・サブネットについて

自分用のメモです。

**AWS基礎**
---
**7つのベストプラクティス**

①「故障に備えた設計で障害を回避」
障害時でもシステムが停止しないように、システムの機能を分散する。


②「コンポーネント間を疎結合で柔軟に」
_コンポーネント（構成要素）を緩やかに結び付けて柔軟に
管理しやすいように分ける。


③「伸縮自在性を実装」
_使いたい分だけ、追加したり減らしたりする事ができる。


④「すべての層でセキュリティを強化」
_ネットワークからアプリケーションまでOSI参照モデルの全ての層でセキュリティを意識することが大切。


⑤「制約を恐れない」
_クラウドの利点を活用してシステム構築および運用する。


⑥「処理の並列化を考慮」
_別の処理を同時進行させ効率的な処理をする。


⑦「さまざまなストレージの選択肢を活用」
_優れた設計のシステムでは、複数のストレージソリューションを使用し、さまざまな機能を有効にしてパフォーマンスとリソースの使用効率を高めています。


**◆VPCとは？**
---

仮想ネットワークサービスの事。
AWS内のネットワーク環境（セキュリティ面の設定も含まれる）

VPCはAZを跨げるが、リージョンは跨げない(国をまたいで作れないって感じ)
・リージョン=国、利用できる地域
・AZ=（アベイラビリティーゾーン）データセンター

AZを1つのリージョンに複数作成することで、壊れても他のデータセンターが稼働できる。



**◆サブネット**
---
大きなネットワークを複数の小さなネットワークに分割管理しセキュリティレベルを高めるという考え方。
サブネットはAZを跨ぐことが出来ない、つまり一つのAZを選択して作成する。

VPCやサブネットにはIPアドレスの範囲を割り当てて使用。


**◆CIDR表記とサブネットマスク表記**
「192.168.1.0〜192.168.1.255」や「192.168.0.0〜192.168.255.255」といった表現は長いため、通常IPアドレス範囲を示す時には、「CIDR表記（サイダー）」もしくは「サブネットマスク表記」のいずれかの表記を用いる。

IPアドレスの最大表記
0.0.0.0/0      →                                全てのIPアドレス
10.21.59.223/32   →                        10.21.59.223  （1つのみ）
10.21.59.223/24    →                       10.21.59.*  (256個)
10.21.59.223/16    →                       10.21. *. *  (65536個)

/24で割り切れるIPの数は256個　/1減る毎に割り切れるIPは倍になっていく/23は512個 /22は1024個…

※VPCのアドレスレンジ帯は/16〜/28の範囲で作る
範囲を超えるとエラーになる。


**◆パブリックIPアドレス **
インターネットに接続する際に用いるIPアドレスのこと。 パブリックIPアドレスは、プロバイダーやサーバー事業者から貸し出しされる。

**◆プライベートIPアドレス**
 インターネットで使われないIPアドレス。 プライベートIPアドレスは、誰にも申請することなく自由に使える。社内LANを構築するようなときなど、このIPアドレスを用いるようにする。

[基礎_2](https://qiita.com/gen10717913/items/3e2baf876c63cff9d9ed)
AWSチャンネル参照
【EC2】Webサーバーの起動

## やること
- EC2インスタンスを作成・起動する
- インスタンスにssh接続し、Apahceサーバーの起動・表示ファイルの作成をする
- パブリックIPアドレスにアクセスし、サーバーの起動を確認する

## 1. インスタンスを起動する
<img width="1440" alt="スクリーンショット 2020-08-08 22.29.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/00ce8d1e-752b-25d9-1289-fff016e0164f.png">

## 2. AMIを選択する
<img width="1440" alt="スクリーンショット 2020-08-08 22.31.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/0b4df7e3-9077-1841-8acd-2ffe41d0abd1.png">

## 3. インスタンスタイプを選択する
<img width="1440" alt="スクリーンショット 2020-08-08 22.32.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/8f3cc2d1-c14b-b3cc-bebf-165b4cf095cb.png">

## 4. インスタンス詳細の設定をする
<img width="1440" alt="スクリーンショット 2020-08-08 22.40.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/f294722b-5caf-4bf1-7994-5ba005b6b0d6.png">

## 5. ストレージを追加する
<img width="1440" alt="スクリーンショット 2020-08-08 22.40.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/8fa1c363-c603-822e-db4d-ed65bd1ca5a1.png">

## 6. タグを追加する
<img width="1440" alt="スクリーンショット 2020-08-08 22.43.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/e6abc643-9a61-bf33-204a-102f8a2412ce.png">

## 7. セキュリティグループを設定する
HTTP、HTTPSを追加する
<img width="1440" alt="スクリーンショット 2020-08-08 22.46.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/934502a8-e819-8d27-d689-704296fdb6ca.png">

## 8.キーペアの作成または選択をする
<img width="1440" alt="スクリーンショット 2020-08-08 22.48.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/1b82a39d-b41c-76e1-1008-f6dde83156b3.png">

### 作成完了
<img width="1436" alt="スクリーンショット 2020-08-08 22.54.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/dba12aec-468b-8f48-c8ea-546986024140.png">

## 9. 起動したEC2インスタンスにssh接続する
```
$ ssh -i ~/.ssh/[秘密鍵名].pem ec2-user@[パブリックIP]
```

## 10. Apacheサーバーを起動する
```
[ec2-user@ip-[プライベートIP] ~]$ sudo su -　//管理者権限に移動
[root@ip-[プライベートIP] ~]# yum update -y　//ソフトウェアの更新状況を確認
[root@ip-[プライベートIP] ~]# yum install httpd -y　//サーバーにApacheをインストール
[root@ip-[プライベートIP] ~]# service httpd start　//Apacheを起動
```

## 11. ファイルを作成する
```
[root@ip-[プライベートIP] ~]# cd /var/www/html　//htmlディレクトリに移動
[root@ip-[プライベートIP] ~]# nano index.html　//Nanoエディタを利用してindex.htmlファイルを作成
[root@ip-[プライベートIP] ~]# service httpd restart　//Apacheを再起動
```
index.htmlの編集
<img width="1440" alt="スクリーンショット 2020-08-09 9.47.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/53759749-fbab-a070-c0d5-b1349a8a47ee.png">

### サーバーへのWebサイト構築完了
EC2インスタンスのパブリックIPアドレスにアクセスする
<img width="1440" alt="スクリーンショット 2020-08-09 9.49.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/bce1e9d8-f14d-32fd-6f1f-0c7518288a97.png">
【EC2】インスタンスへのssh接続

## sshとは
<img width="450" alt="スクリーンショット 2020-08-02 15.46.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/348ecb07-be72-cab4-a97b-a2be45689423.png">
「**Secure Shell**」の略で、リモートコンピュータと通信するためのプロトコル
パスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化される

``` none:sshコマンドの基本書式
$ ssh [オプション] ホスト名 [コマンド]
```

## 1. EC2インスタンスに設定した秘密鍵をsshフォルダに移動する
```
$ mv ~/Downloads/[秘密鍵名].pem ~/.ssh
```

## 2. 秘密鍵の権限を変更する
```
$ chmod 400 ~/.ssh/[秘密鍵名].pem
```

## 3. ssh接続する
```
$ ssh -i ~/.ssh/[秘密鍵名].pem ec2-user@[パブリックIP]
```

### 接続完了
```
The authenticity of host 'xx.xxx.xxx.xx (xx.xxx.xxx.xx)' can't be established.
ECDSA key fingerprint is SHA256:DGjzULHBFqLHFfqog1gMgytJvzi9ByO05xa70+MxAik.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'xx.xxx.xxx.xx' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
5 package(s) needed for security, out of 6 available
Run "sudo yum update" to apply all updates.
```
コンビニの冷やし中華を美味しく食べるライフハック

#冷やし中華おいしいですよね
昔は、冷やし中華はじめましたなんていう看板が出るまで食べられなかった冷やし中華ですが、いまじゃコンビニで通年に近く売っています。
しかし、このコンビニ冷やし中華、麺がゴワゴワしててあまり美味しくない。
そう。作り置きだからあまり美味しくないのです。

#コンビニ冷やし中華を美味しく食べるライフハック
そこで、コンビニの冷やし中華を美味しく食べるライフハックです。
1. 蓋を開け具の載ったプラスチックを一度別の場所に置いておく
2. 手を洗う
3. 水道水で麺をゆすぐ
4. 水切りをする
5. 具を載せてタレを掛ける
要は水で一回ほぐしてやるのです。おーいしー


ちなみに、ざるそばでも同じことができます。ただ、コンビニのざるそばは冷やし中華に比べると麺をゆすぐのは難しいですね。
【EC2】インスタンスの作成・起動

## 1. AMIを選択する
<img width="1440" alt="スクリーンショット 2020-08-02 15.00.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/01c2839a-7df9-45c9-1447-db639e2fb212.png">

## 2. インスタンスタイプを選択する
<img width="1440" alt="スクリーンショット 2020-08-02 15.01.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/2bc396af-ba0e-3294-5663-a50eb4444fd4.png">

## 3. ネットワーク・サブネット等の設定をする
<img width="1440" alt="スクリーンショット 2020-08-02 15.02.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/a980ef2b-42ed-7bae-ebde-064dbb5cabc4.png">

## 4. ボリュームの設定をする
![スクリーンショット 2020-09-13 17.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/06d4ceaa-24a5-c57f-bda7-b08134cc0852.png)

## 5.タグの追加をする 
![スクリーンショット 2020-09-13 17.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/a913fafe-e384-b35a-0775-246bc36a4461.png)

## 6. セキュリティグループの設定をする
![スクリーンショット 2020-09-13 17.31.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/ae226bc2-17c7-fa92-0a9b-5bc5c1df1486.png)

## 7. キーペアを選択or指定する
![スクリーンショット 2020-09-13 17.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/31bace61-fb81-8d3a-a68b-f0486e77d9ce.png)

### 作成完了
<img width="1440" alt="スクリーンショット 2020-08-04 14.04.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/834ab5cc-7a1e-c4d1-1ace-c880e4f6e12c.png">
【AWS】リザーブドインスタンスの見積りに失敗した件

#はじめに
クラウドインフラについて勉強中です。
Amazon EC2の見積りを作成していたところ、リザーブドインスタンスの理解を正しくできておらず誤った算出をしてしまったので、備忘の意味も込めて内容を記しておきます。

※初投稿です。
今後クラウドインフラについてアウトプットを増やしていきたいと思っています。
気になる部分があれば何でもご指摘いただけると喜びます！


#失敗した内容
失敗した内容としては、「1年契約する」ことで、「利用した時間×利用費」に対して割引が適用されると理解してしまってました。
例えば、月々500時間稼働した場合、リザーブド料金×500＝月々の利用費用となるというイメージでした。

#正しい理解
正しくは、「1年契約する」ことで、対象のインスタンスを「1年間フル稼働」した場合にかかる費用から大幅に割引される、というものでした。
つまり、月々500時間の稼働であったとしても、フル稼働分の744時間分の費用がかかる。
ただし、掛ける対象がオンデマンド料金より格段に安いリザーブド料金となる。
なので、対象のサーバが契約期間内で6,7割の時間で稼働し続けるなら、リザーブドインスタンスを適用したほうがお得ですよ、という話。

#参考情報
＞リザーブドインスタンス では、実際の使用に関係なく、全期間の料金をお支払いいただきます。
参考：課金の仕組み
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts-reserved-instances-application.html