OmniAICreator/Qiita-1.07M huggingface dataset:
元に戻すgitコマンド その4（git add し忘れたファイルがあった時 編）

## はじめに

Webエンジニアになって２年目。そろそろ、`add`、`copmmit`、`push`、`pull`、あと、ブランチ切ること以外も覚えたいなと思い、Gitでずっと気になってた各種**「元に戻す操作」**を勉強がてら記事を書こうと思いました。

Gitの操作をしていると、失敗して元に戻したい時は結構多いんじゃないかなーと思います。戻したい場面はいくつかあると思います。

今回は、**`git add`し忘れたファイルがあった時**の対処について書いていこうと思います。

## どんな場面か？

いい感じの粒度でまとめたコミットにしたいと思いますよね？でも`git add`し忘れたファイルがあった時、追加したいファイルを忘れてコミットしてしまったので、もう一度コミットをやり直したい場合がありますよね。

## 解決方法

この場合、そのファイルを指定して`git add`して、`git commit amend`すれば大丈夫です。

ちなみに、英単語 **amend** は、修正する、という意味です。

```shell
$ git add 追加し忘れたファイル名
$ git commit --amend
```

実際にやって見ましょう。

以下に、２つのファイルがあったとします。

```sample.txt
サンプルテキストファイル

変な事書いちゃった！w
```

```practice.txt
練習用のテキストファイル

変な事書いちゃった！w
```

上記二つのテキストファイルですが、変な事を書いちゃってます。なので、その記述を消してコミットしたいところですね。

両方のファイルの`変な事書いちゃった！w`という記述を消して..

```shell
$ git add sample.txt
$ git commit -m "変なコード削除"
[master 71552a3] 変なコード削除
 1 file changed, 1 insertion(+), 3 deletions(-)
```

今回の例では、`sample.txt`だけコミットして、`practice.txt`をコミットし忘れて、コミットしたい時、どうしたらいいでしょうか？

この場合は、再度 `git add` で追加し忘れたファイルを追加し、`git commit --amend` を実行すれば、コミットし忘れたファイルが追加された状態でコミットされます。

例

```shell
$ git add 追加し忘れたファイル
$ git commit --amend
```

実例

```shell
$ git add practice.txt
$ git commit --amend
[master c7f9ff8] 変なコード削除
 Date: Fri Jun 1 03:25:00 2018 +0000
 2 files changed, 2 insertions(+), 10 deletions(-)
```


## 解決したかの確認方法

確認方法には、コミット履歴の閲覧ができる`git log`を使って、一個前だけ見るオプション`-1`と`diff`を見られる`-p`をつけたらいいと思います。

```shell
$ git log -p -1
```

以上です。

## 親記事（まとめ記事）

この記事の[親記事（まとめ記事？）](https://qiita.com/ryosuketter/items/34e429ae555179293fc3)がありまして、そこでは、gitを使ったさまざまな**元に戻す**方法の記事をまとめています。ぜひ、見てください。

## 参考
- https://git-scm.com/about/staging-area
元に戻すgitコマンド その3（コミットメッセージを間違えた時 編）

## はじめに

Webエンジニアになって２年目。そろそろ、`add`、`copmmit`、`push`、`pull`、あと、ブランチ切ること以外も覚えたいなと思い、Gitでずっと気になってた各種**「元に戻す操作」**を勉強がてら記事を書こうと思いました。

Gitの操作をしていると、失敗して元に戻したい時は結構多いんじゃないかなーと思います。戻したい場面はいくつかあると思います。

今回は、**コミットメッセージを間違えた時**の対処について書いていこうと思います。

## どんな場面か？

コミットメッセージに「ファイルの追加」と書こうとして誤字ってしまった時、誤字ってしまいました。

```shell
$ git commit -m "ファイルのちゅいか"
[master 9e647cd] ファイルのちゅいか
 1 file changed, 3 insertions(+), 1 deletion(-)
```

## 解決方法

```shell
$ git commit --amend -m "書き直すコミットメッセージ"
```

これで、直前のコミットのメッセージを書き換えることができます。

ちなみに、英単語 **amend** は、修正する、という意味です。

```shell
$ git commit --amend -m "ファイルの追加"
[master 73b1020] ファイルの追加
 Date: Fri Jun 1 02:06:32 2018 +0000
 1 file changed, 3 insertions(+), 1 deletion(-)
```

コミットIDも変わってますね。 (`9e647cd` → `73b1020`）

## 解決したかの確認方法

`git log`がいいかなと思います。

```shell
$ git log --oneline
73b1020 (HEAD -> master) ファイルの追加
7f532a3 added practice.txt
```

以上です。

## 親記事（まとめ記事）

この記事の[親記事（まとめ記事？）](https://qiita.com/ryosuketter/items/34e429ae555179293fc3)がありまして、そこでは、gitを使ったさまざまな**元に戻す**方法の記事をまとめています。ぜひ、見てください。

## 参考
- https://git-scm.com/about/staging-area
OTRSのメール通知でハマった話

# OTRSで「通知」をメールで受け取る際にハマった時の備忘録
OTRSの構築までは、よく出来たマニュアルもあり簡単になりました
[インストールマニュアル](http://otrs-japan.co/modules/wiki/gate.php/160720-OTRS5.0.10_install_manual_file-save.pdf?way=attach&_noumb&refer=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB%28OTRS%205.0.10%29&openfile=160720-OTRS5.0.10_install_manual.pdf)

そして、簡単なデモシナリオを作成して「なんとなくうまく動いてる」までも簡単です。
が、通知メールにハマりました
## 環境
CentOS7
OTRS5
## ハマった点
通知メールが届かない
## 設定
### OTRS-管理-メール設定-メールアカウント
OTRSには、メールアカウントを登録する箇所が複数有ります。このメールアカウントが何を指すのか？理解する必要があります。
このメールアカウント設定は 「IMAPやPOPからメールを取得する」アカウントで、複数設定できます。この設定からはアカウントの登録やメール取得のテストを行うことが出来ます（手動）
アカウント設定等間違っている場合は取得できないので、分かりやすいです
### OTRS-管理-メール設定-メールアドレス
この設定が、何のためのメールアドレス設定なのか当初解らず。この設定では単にメールアドレスを登録するだけです。ここで設定されたメールアドレスは「キュー」に対する「発信元アドレス」として設定することが出来ます。それだけの設定でした。OTRSでは「キュー」によって応答する返信元アドレスなどを変えることが出来るようです。
しかし、これがハマった原因です
### OTRS-管理-システム管理-システム設定-Framework-Core-
#### AdminMai
管理者からの通知に使われるアドレス（らしい）。下のNotificationSendMail と何が違うのかよく解らない
#### NotificationSenderMail
「通知」に使われる際のメールアドレス
### OTRS-管理-システム管理-システム設定-Framework-Core:Sendmail
今回は Office365 Outlookのアドレスを登録してみました。
#### SendmailMode
SMTPTLS
#### SendmailModule::Host
smtp-mail.outlook.com
#### SendmailModule::Port
587
#### SendmailModule::AuthUser
hogehoge@outlook.com
#### SendmailModule::AuthPassword
パスワード

Sendmailに関するアカウント情報はOutlook smtpの情報を入れてください
### 通知メールが飛ばない原因
上記設定を行い、通知（キューにチケットが入ったら通知 など）を行っても、一向にメールが飛ばず。
CentOsの メールログを見ると確かにエラーとなっているが原因は不明。しかし、特定のキューに限っては「飛んでる！」
この原因は Outlook等 smtpの仕様によるものでした

OTRSは sendmailに設定したアカウント情報でメールを発信します。outlookの場合 認証が必要ですので hogehoge@outlook.com のアカウントとパスワードを使います。

しかし、先ほどの OTRS-管理-メール設定-メールアカウント　で、hogehoge@outlook.comとは別のメアドを登録しておき、キューに設定しておくと smtp-mail.outlook.com から「送信元アドレスと認証アカウントが違うので、ダメです」と拒絶されます。

## 結果
outlookやgmail など、smtp 認証が厳しい場合、OTRSの「メールアカウント」は 「sendmail設定に使った認証アドレス（アカウント）以外、正しく送れない」

キュー単位で発信元アドレスを変更できる仕様のOTRSですが、送信元チェックの緩いMTAを作るなどしない限り この設定が徒となり通知メールが飛ばないと言うことになります
NotificationSenderMail も同様に、sendmailで設定したアカウントメールでないとエラーとなりますね
元に戻すgitコマンド その2（作業中に最新のコミットまで戻したいと思った時 編）

## はじめに

Webエンジニアになって２年目。そろそろ、`add`、`copmmit`、`push`、`pull`、あと、ブランチ切ること以外も覚えたいなと思い、Gitでずっと気になってた各種**「元に戻す操作」**を勉強がてら記事を書こうと思いました。

Gitの操作をしていると、失敗して元に戻したい時は結構多いんじゃないかなーと思います。戻したい場面はいくつかあると思います。

今回は、**作業中に最新のコミットまで戻したいと思った時**の対処について書いていこうと思います。

## どんな場面か？

ローカル（ワーキング（作業）ディレクトリ）上で作業をしていて、ゴチャゴチャ書き過ぎてしまい、もういっそのこと最新のコミットに戻したいと思った時。

ワーキングディレクトリについては、下の図を見てください。

<img src="https://git-scm.com/images/about/index1@2x.png">

上記は、コミットまでに必要な２段階手順の模式図[^1]です。

## 解決方法

例えば、最新のコミットした時のファイルの中身は、下記だとする

```practice.txt
# あいさつ

- おはよう
- こんにちは
- こんばんわ
```

コミット直後に確認したらこんな感じ

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

なんか色々書いて、エラーとかも出ちゃって、元の状態がわからなくなったとする。

```practice.txt
# あいさつ

- おはよう
- こんにちは
- こんばんわわわ
- こんばんみ
- こんばんび
- こんばんぶ
```

確認したら

```shell
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   practice.txt

no changes added to commit (use "git add" and/or "git commit -a")
```

`(use "git checkout -- <file>..." to discard changes in working directory)`

これの意味は、ワーキングディレクトリの変更を放棄するには`git checkout -- <file>...`を使って、です。
　（「discard」は放棄という意味）

なので、今回の例では、こう書きます。

```shell
$ git checkout -- practice.txt
```

ファイルは最新のコミットの状態になります。

```practice.txt
# あいさつ

- おはよう
- こんにちは
- こんばんわ
```

確認したら、こうなっているでしょう。

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

## オプション（`--`）をつける理由

まず、`git checkout`には2つの役割があります[^2]。

- 1. 作業ブランチを切り替える
- 2. 指定したコミットにおける任意のファイルをワーキングディレクトリに反映する

また、`git checkout` におけるファイルパスの指定方法はオプション（`--`）をつけることです。

オプション（`--`）をつける理由は、ファイル名と同じ名前のブランチ名があった場合作業ブランチが切り替わっちゃうからです。

実は、オプション（`--`）をつけなくても、`git checkout ファイル名`でもブランチ名と被ってなければ、場合に正しく動作します。ですが、万が一のためオプション（`--`）はつけておきましょう。

### 注意すること

`git checkout`の2つの役割の2つ目にあるように、`git`は`HEAD`、つまり現在チェックアウトしているブランチの最新の状態からチェックアウトするものとして扱います[^3]。

ブランチを切り替える作業をよくしてる人はわかると思いますが、`git`は　`checkout`してもなんの履歴も残りませんし、差分のデータを記録することもありません。言い換えると、同じブランチの任意のファイルにおいて、書き換えた最新の状態から最新コミットまでチェックアウト（元に戻す）します。なので、ファイルの変更は跡形も無くなります。まだコミットしていない内容なのでgitコマンドでは、もう二度と戻せないので、注意してください。

以上です。

## 親記事（まとめ記事）

この記事の[親記事（まとめ記事？）](https://qiita.com/ryosuketter/items/34e429ae555179293fc3)がありまして、そこでは、gitを使ったさまざまな**元に戻す**方法の記事をまとめています。ぜひ、見てください。

## 参考

[^1]: https://git-scm.com/about/staging-area
[^2]: http://www-creators.com/archives/1388#i-2
[^3]: https://yakst.com/ja/posts/2515
元に戻すgitコマンド その1（まとめページ）

## はじめに

Webエンジニアになって２年目。そろそろ、`add`、`copmmit`、`push`、`pull`、あと、ブランチ切ること以外も覚えたいなと思い、Gitでずっと気になってた各種**「元に戻す操作」**を勉強がてら記事を書こうと思いました。

Gitの操作をしていると、失敗して元に戻したい時は結構多いんじゃないかなーと思います。
戻したい場面はいくつかあると思います。

- **場合1** ：ワーキングディレクトリー上で最新のコミットまで戻したいと思った時
    - [Qiitaの記事「作業中に最新のコミットまで戻したいと思った時 編」](https://qiita.com/ryosuketter/items/356a0d691e2d088e47c7)
- **場合2** ：間違えてコミットした時
    - **場合2-1** ：コミットメッセージを間違えた時
        - [Qiitaの記事「コミットメッセージを間違えた時 編」](https://qiita.com/ryosuketter/items/0c5c299274bedf7c5297)
    - **場合2-2** ：`git add`し忘れたファイルがあった時
        - [Qiitaの記事「`git add` し忘れたファイルがあった時 編」](https://qiita.com/ryosuketter/items/24b00d82439511962203)
- **場合3** ：過去の特定のコミットまで戻りたいと思った時
    - [Qiitaの記事「過去の特定のコミットまで戻りたいと思った時 編」](https://qiita.com/ryosuketter/items/24bc33d7a1f2edb436de)
- **場合4** ：間違えて `git add`しちゃって取り消したい時
    - [Qiitaの記事「間違えて git add したら 編」](https://qiita.com/ryosuketter/items/a6047b0270ea999fd51b)

それぞれの場合に関して、記事を書いてみました。

## 注意すること

`git`で元に戻す操作は、これまでのコミットの履歴を書き換えることになります。すでに取り込まれたコミットを書き換えるということは

- コミットメッセージ
- コミットした人
- リビジョン番号（コミットID）
- 変更日時
- 変更ファイル

などが書き換わります。ずっと一人開発のプトジェクトであれば、そこまで大きな問題にはならないと思いますが、チーム開発の場合は大きな問題となり得る行為なので、仮にやる際はメンバー合意の上、十分注意して行ってください。

## 参考
- https://git-scm.com/about/staging-area
2018年になってもMySQLクライアントをローカル環境に入れてるの？そんなのdockerでいいじゃん

# TL;DR

つまりこういうこと.

インポートしたかったらこれ（`-e` を知らず、うまくいかずにしばらく悩んでたのは内緒の話）

```
docker run -it --rm -v "${SQL_DIR}:/sql" arey/mysql-client -h $DB_HOST -u $DB_USER -D $DB_NAME -p -e "source /sql/${SQL_FILE}"
```

クライアント上で悩みながらクエリ叩きまくりたければこれ

```
docker run -it --rm -v "${SQL_DIR}:/sql" arey/mysql-client -h $DB_HOST -u $DB_USER -D $DB_NAME -p 
```

エイリアスに登録しておきたいくらいだけど、マウントオプション考えるとちと厳しいかもしれん..

# あとがき

- docker万歳！依存性問題などで無駄に大量の時間を費やさないで済むの素敵すぎる（win10のアプリがしょっちゅう起動しなかったり遅かったりすることを除けばね...）
- 概要とあとがきしか書くことなかった...
Java研修でECサイト作成に使えそうな技術抜粋

※getter,setterなど一部割愛しているソースがあります。

## 今回用いる設定
build.gradle

~~~
dependencies {
	compile('org.springframework.boot:spring-boot-starter-data-jpa')
	compile('org.springframework.boot:spring-boot-starter-thymeleaf')
	compile('org.springframework.boot:spring-boot-starter-web')
	providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
	compile('mysql:mysql-connector-java')
}
~~~

## ログイン情報保持

ログイン情報を持ち回るにはセッションに詰めるのが便利

~~~
@SessionScope
@Component
public class AccountModel {
	private String id;
	private String name;
}
~~~

~~~
@Controller
public class MainController {

	@Autowired
	private AccountModel accountModel;
	
	/**
	 * ログイン処理
	 * @param model
	 * @param id
	 * @param post
	 * @return
	 */
	@RequestMapping("login")
	public String login(Model model,@RequestParam("id") String id,@RequestParam("pass") String pass) {
		accountModel.setId(id);
		// TODO パスワードチェック
		return "shop";
	}
}
~~~

~~~
  <form method="post" th:action="@{login}">
  	<input type="text" name="id" />
  	<input type="text" name="pass" />
  	<button>ログイン</button>
  </form>
~~~

これで最初にログインした際に詰めて都度チェックしてもよし、
購入時にセッション情報をチェックして保持していなければ個人情報登録画面へ遷移するなどもできる。

## データの検索
SpringDataJPAで自動実装されるメソッドの命名ルールについては以下を参照
[【Spring Data JPA】自動実装されるメソッドの命名ルール](https://qiita.com/sndr/items/af7d12be264c2cc4b252)

~~~
@Entity
@Table(name="item")
public class Item {
	@Id
	@GeneratedValue
	private int id;
	private String name;
	private int price;
}
~~~

~~~
public interface ItemRepos extends JpaRepository<Item, Integer> {
	/**
	 * select * from item where name like %{name}%
	 * @param name
	 * @return
	 */
	public List<Item> findByNameContains(String name);
}
~~~

~~~
@Controller
public class MainController {

	@Autowired
	private ItemRepos itemRepos;

	/**
	 * 検索処理
	 * @param model
	 * @param name
	 * @return
	 */
	@RequestMapping("search")
	public String search(Model model,@RequestParam("name") String name) {
		List<Item> itemList = itemRepos.findByNameContains(name);
		model.addAttribute("itemList", itemList);
		return "shop";
	}

}
~~~

~~~
  <form method="post" th:action="@{search}">
  		<input type="text" name="name"/>
  		<button>検索</button>
  </form>
~~~

## データの登録

JpaRepository#saveはpkが重複した場合はupdate,しない場合はinsert処理を行う

~~~
	/**
	 * 登録処理
	 * @param model
	 * @param name
	 * @param price
	 * @return
	 */
	@RequestMapping("submit")
	public String submit(Model model,@RequestParam("name") String name,@RequestParam("price") String price) {
		Item item = new Item();
		item.setName(name);
		item.setPrice(Integer.valueOf(price));
		itemRepos.save(item);
		return "shop";
	}
~~~

## 注意
今回は研修を想定しているため細かい箇所の実装は行っていないが、本来は入力値チェックや処理層の切り分けなど考慮すべき点は多い
CLRのexe.configの出力方法

#概要
CLRのexe.configの出力方法

#アプリケーションの場合
.vcprojを開き

```xml
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
```
を追加

#ライブラリの場合
.vcprojを開き

```xml
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
```
を追加

#注意
ライブラリの場合上記設定で出力されるがNativeから参照した場合に自動的に使ってはくれなさそうで

```csharp
AppDomain.CurrentDomain.AssemblyResolve
```
を使ってリダイレクト処理を書く必要がありそう

#参考
https://social.msdn.microsoft.com/Forums/vstudio/en-US/fae48caa-7746-4c8f-9c44-839bd23ed128/warning-c4691-when-building-a-ccli-executable-referencing-microsoftextensionslogging-via-nuget?forum=vcgeneral
https://blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime/
有償のITカンファレンスに参加する意味を考える

自分自身も、自分の周辺も、比較的有償のITカンファレンスに参加している人は多いです。国内・海外のものでも少し違いますが、お金という観点ではそれなりの金額がするものが多いですね。なぜこのようなカンファレンスに参加するのか、会社がお金を出すとしたらどんなことを考えてコストを出して送り出せばいいのかなど、考えを書いておきます。

# そもそもセッション受講が目的なのか？

最近のITカンファレンスのほとんどで、最終的に資料の共有や動画の公開があります。そう考えると、なぜ有償で参加する意味があるのかとも思いたくなるところですが、個人的には**セッション参加はITカンファレンスに参加する目的の１つではなく、比重の大きなものではない**と考えています。そもそも、たくさんのトラックがあるカンファレンスにおいては、全てのセッションに参加することは不可能です。いずれにしても、参加の後で公開情報を元に継続学習することはセットとして考えておいた方が良いと思います。

# セッションには、聴講だけでなく参加した方が良い

アメリカのITカンファレンスに出てみると、日本のものとは全く違うと感じるところは**スピーカーが素直に部屋を出られるかどうか**という点です。「質問はありますか？」と聞いて日本でなかなか実際にどんどん質問が出ることはまずありませんが、アメリカのカンファレンスではスピーカーが区切りを入れない限りは質問が止まりません。セッション中でももちろんそうですが、終わった後も機材を片付けているスピーカーの周りにはたくさんの人が集まり、意見を交わしたり、具体的な質問をしたり、**「このセッションすごく良かったよ、ありがとう。ところで、〇〇についていくつか具体的に聞きたいことがあるんだけど、今時間がなければ後でメールで質問させてもらってもいいかな？」**というようなやりとりはよくあります。これで断るスピーカーにはこれまで出会ったことはないので、**セッションに関連した既に存在する具体的な課題を解決することができる可能性**がありますし、**セッションを担当するレベルのエキスパートと知り合いになり、その後助けてもらえる可能性**を得ることができます。

日本でもAsk The Speakerコーナーなんかが設けられるケースはありますから、ここは積極的に質問や意見交換をしに行った方が良いでしょう。私が現在までにつながってきた主に北米の技術者の皆さんとのきっかけは、ほとんどのケースでこのような質問のやりとり、から始まっています。現在の仕事についているのも、このような積み重ねを意識したからだと思います。

**仮に有償サポートを受けることを考えてそのコストを考えた場合、カンファレンスに参加する費用ではすまないと思いますので、この観点だけでもカンファレンス参加のコストパフォーマンスは高いと思っています。目の前にある課題を解決できなくても、その様なつながりがある人材が会社にいることは長期的にビジネスを助ける事になります。**

# レコーディングされないセッション、あるいはエキスポ展示などは狙い目

セッションの中でも、例えば顧客のショーケースが含まれるもの、sneak peek（まだまだ荒い段階で見せる様なもの）などはレコーディングがされないことがあります。こうなってくると間違いなく現地に行かないと聞く方法はありませんので、参加に俄然意味がでて来ます。この様なセッションのスピーカーとこそ繋がれるタイミングが少ないので、狙って行きたいですね。事前のセッションリストでレコーディングがないとなっていなくても、プレスお断りとか、写真撮影厳禁とかなっているやつはそうなる可能性が高いです。チョークトークなどの参加者を巻き込むセッションもレコーディングされない傾向がありますし、そもそも普通のセッションより面白いです。

また、大抵のカンファレンスではスポンサーブースやプロダクトチームの展示なども行われていますので、こちらもネットワーキングには最適です。

**多くのITカンファレンスでは、ベンダーの中長期的な戦略がしっかり語られる事になります。この様なメッセージはもちろん、シンクロする形でレコーディングを伴わない現場感覚を実際に知る事で、本音も交えて今後何が起こるのかを判断する材料が得られるでしょう。**

# ITカンファレンスに出席する事で大きくモチベーションが上がることを甘く見ない

次に、会社の側から参加してもらう事に関しても書いておきましょう。これはほぼ間違いない事だと思いますが、**自分の行きたい有償カンファレンスに参加できる状態自体、技術者にとって大きなモチベーションアップになります。**試しに、これらのカンファレンスのハッシュタグなどでTwitterなど検索してみれば、会期中に盛り上がりを見せる参加者の雰囲気が伝わってくると思います。

また、これまで書いてきた様なリアルなネットワーキングによって、きっと会社のビジネスにも直接的・間接的双方で貢献できる様になるはずです。技術者が数日抜ける（常駐だと難しいかもしれませんが、その場合は生き残るために常駐ビジネス自体を考え直してください。技術者も常駐に出される様な会社にいてはいけません。）事、捻出するコストも確かにダメージはあるかもしれませんが、それを補って余りまるほど、所属する組織にもリターンがあります。ただしそれは短期的でなく中長期的なものなので、会社への帰属意識を高めつつ、繰り返しできるとより効果的です。

何れにしても、技術者に長期的な投資ができるくらいのビジネスモデルは用意しておきたいものですね。

# あとでレコーディングを視聴できるとしても集中して学習できる時間をまとまってとるのは難しい

仮にレコーディングセッションが８０あるとして、それを全部見るのに何日かかるかという事ですが、そもそもお金の問題以前に、技術者がまとまって学習をする時間を確保できているでしょうか。業務の合間で学習するにしても、まとまった時間がなければ短期での学習に限界があります。多くの参加者とともに「学習モード」に入ること、セッション以外からの様々な情報を得ることで、短い時間で学習モードに入り、その後の継続学習の効果が高まります。最新のテクノロジーに社員が対応可能になれば、会社としても良いことが多いですよね。

# Rock Star であれ

最後になりますが、技術者の方も、会社が**この人が参加すれば多くの良い影響を受けて、会社に戻ってからも周囲も含めて良い影響を与えてくれるはず**と思ってくれる様な「Rock Star」であることを意識して見ると良いと思います。対外的・対内的な認知が非常に高い状態であれば、このエントリーを読むまでもない状況になっているのではないかと思います。

## 究極の参加は登壇
あと、究極の参加の方法は、登壇者になることです。登壇者をオープンに募集するカンファレンスとそうでないものもありますが、意外にコミュニティ経由だと登壇者として参加できるとか、お手伝い枠がある場合などもあります。「中の人」になった場合、バックステージでの時間も含めてここまで書いてきたメリットは何倍にも膨れ上がります。いつかは登壇、と思いながら参加すれば、自分の領域を見極めることにもつながるかもですね。
AWS Certified Security - Specialty 合格しました。

## はじめに
皆さんこんにちは。
全然Qiitaの投稿が出来ていないJumpです。

標題の通り、**AWS Certified Security - Specialty**を取得してきました。

Qiitaとかにも、全然この認定資格の記事が無かったので、
誰かの役に立てば…と思い、投稿します。

## AWS Certified Security - Specialty　とは？
[こちらの公式ページ](https://aws.amazon.com/jp/certification/certified-security-specialty/)をご覧下さい。

- 専門的なデータの分類と AWS のデータ保護の仕組みに関する知識
- データ暗号化の手法とそれを実現する AWS の仕組みに関する知識
- セキュアなインターネットプロトコルとそれを実現する AWS の仕組みに関する知識
- AWS のセキュリティサービスとセキュアな運用環境を実現するサービスの機能に関する実践的な知識
- AWS のセキュリティに関するサービスおよび機能を使用した、運用環境における 2 年以上の経験を通じて得られたコンピテンシー
- 一連のアプリケーション要件に応じて、コスト、セキュリティ、導入の複雑さのバランスを勘案した意思決定を行える能力
- セキュリティの運用とリスクに関する知識

上記の能力に対する認定資格となります。

5月上旬に日本語でも受験が可能となったので、
AWS Summit Tokyoの会場で受けてきました。

## どんな問題が出る？
早速本題。

Securityと銘打っているだけあって、
セキュリティ/認証 系のサービスの問題が多数出てきます。

| 分野       |   試験における比重    |
|:-----------------|------------------:|
| インシデント対応                 |12% |
| ログと監視                      | 20% |
| インフラストラクチャのセキュリティ| 26% |
| ID およびアクセス管理           | 20% |
| データ保護                     | 22% |

”AWS 【↑のワード】”でググれば
ほとんど出題範囲のサービスが出てくると思います。

## どんな勉強した？
勉強した内容としては、以下です。

- AWS Certified Security - Specialty の模擬試験
- セキュリティ絡みのホワイトペーパー読む
- 出てきそうなサービスのBlack Beltの資料読む

## 感想
プロフェッショナルレベルの資格を既にお持ちの方は、
そこまでハードルは高くない気がします。
私自身、模擬試験を受験して、「こんな感じかー」となったので。

## 今後
残る認定資格は、
BigdataとNetworkのspecialityとなりました。

日本語版が出るのが先か、私が英語を習得するのが先か…
願わくば、後者でありたいものです。
Nautilusで開いているSFTPのディレクトリを端末から開く方法

Nautilusで開いているSFTPのディレクトリを端末から開く方法についてまとめます。

#方法
![Screenshot from 2018-06-01 16-41-57.png](https://qiita-image-store.s3.amazonaws.com/0/52291/1f557d13-c68e-21f7-de1e-5a320544efcf.png)
1. SFTPのディレクトリ内で右クリックします。
2. `リモートの端末で開く`をクリックします。
3. 端末が起動します。
array_mapで配列のindexを使う

array_mapの第3引数に`range`関数で数字の配列を作って渡すと配列自身のindexを渡しているわけではありませんが、良い感じになります。
その場合は第2引数引数と同じ要素数じゃないといけません。


```php
<?php

$array = ['Laala', 'Mirei', 'Sophie']; 

$withNumberArray = array_map(function ($name, $index) {
    return sprintf('%d. %s', $index, $name);
}, $array, range(1, count($array)));

var_dump($withNumberArray);

```


```terminal
array(3) {
  [0]=>
  string(8) "1. Laala"
  [1]=>
  string(8) "2. Mirei"
  [2]=>
  string(9) "3. Sophie"
}

```
HomebrewでCarthageの過去バージョンをインストールする

Carthageの過去バージョンをインストールしようとして苦労したので備忘録

# 手順
1. インストールしたいバージョンがチェックアウトできるか確認
2. 古いコミットをフェッチする
3. インストールしたいバージョンにチェックアウトする
4. インストール
5. チェックアウトしたリポジトリをもとに戻す

## インストールしたいバージョンがチェックアウトできるか確認
`brew log` でインストールしたいバージョンがチェックアウトできるかを確認する
あれば古いコミットをフェッチする必要はない

```
brew log carthage --oneline | grep インストールしたいバージョン
```

## 古いコミットをフェッチする
Homebrewは標準ではshallow cloneなのでgitの履歴が少ない
そのため、必要なバージョンが確認できなければ、リポジトリのあるディレクトリに移動してフェッチして取得する

```
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
git fetch --unshallow
```

## インストールしたいバージョンにチェックアウトする
`brew log` でインストールしたいバージョンのコミット番号を確認してそのコミットまで戻る
全部戻す必要はないのでCarthageのみ戻す

```
brew log carthage --oneline | インストールしたいバージョン
git checkout コミット番号 carthage.rb
```

## インストール
通常通りインストールする

```
brew install carthage
```

インストールが完了したらバージョンを確認してみる

```
carthage version
```

## チェックアウトしたリポジトリをもとに戻す
リポジトリが古いままとなってしまっているのでもとに戻しておく

```
git reset HEAD
git checkout .
```
Google Apps ScriptでスプレッドシートをJSON形式で配信したくてハマった

グーグルスプレッドシートに含まれているデータをJSON形式で配信できるようにこちらの記事を参考に試しておりました。
https://qiita.com/takatama/items/7aa1097aac453fff1d53

doGetメソッド内にスプレッドシートIDを埋め込む必要があるのですが、

```
function getData(id, sheetName) {
  var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
  var rows = sheet.getDataRange().getValues();
  var keys = rows.splice(0, 1)[0];
  return rows.map(function(row) {
    var obj = {}
    row.map(function(item, index) {
      obj[keys[index]] = item;
    });
    return obj;
  });
}

function doGet() {
  var data = getData('abc1234567', 'Sheet1');
  return ContentService.createTextOutput(JSON.stringify(data, null, 2))
  .setMimeType(ContentService.MimeType.JSON);
}
```
上記のabc1234567のところです。ここにスプレッドシートIDを埋め込むだけでいいのですが、埋め込んだもののスクリプトが動作しない。
なんどもつまづいた結果原因が判明しました。

私は、ずうっとファイル→ウェブに公開で表示されている、/d/以降の文字列を貼り付けていたのですが、![スクリーンショット 2018-06-01 16.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/137274/e7d3c754-5b48-966a-cd2e-d5742ad75268.png)
これではなく、アドレスバーに含まれている/d/以降の文字列を貼り付ける必要があったようです。。。。
![スクリーンショット 2018-06-01 16.07.27.png](https://qiita-image-store.s3.amazonaws.com/0/137274/98ba03db-a63b-2e5a-5f34-38147f26214b.png)

ハマりやすいので気をつけてくださいね。（私だけ？）

# ウェブアプリケーションとして導入
ウェブアプリケーションとしてスクリプトを公開する時、
![スクリーンショット 2018-06-01 17.20.17.png](https://qiita-image-store.s3.amazonaws.com/0/137274/00269d0f-b92d-5771-49a8-cbff94744826.png)
現在のウェブアプリケーションのURLと、「最新のコード」をテストしますのリンクのURLは異なる。
「現在の」は末尾がexec, 「最新のコード」は末尾がdevになっている。
ハマった事象としては、「最新のコード」のリンクはきちんと動作するのに、「現在の」のリンクはエラーになってしまう。
これは、一度版を管理として登録すると解消される。（こんなのわかるかい！）
OpenStack Days Tokyoのプログラム選考をやってみて

こんにちは、江崎(iorin)です。

私は、[OpenStack Days Tokyo (OSDT)](http://openstackdays.com/) ならびに、[Cloud Native Days (CNDT)](http://cloudnativedays.net/) イベントに実行委員として参加させていただいています。

両イベントは、今年8月2日(木)と3日(金)の二日間にわたって、[ベルサール東京日本橋](https://www.bellesalle.co.jp/shisetsu/tokyo/bs_nihonbashi/access) にて開催予定です。
[前回](https://qiita.com/iorin/items/02ab38a9380d33434fa3) は、実行委員という中の人の立場で、本イベントの方向性の検討の裏側を紹介しました。
だいぶ空いてしまいましたが、遅れていたプログラム作成がやっと終了し、来週から公開できるようになりました。
Qiita は、技術的なレポートを投稿する場ですから、本レポートでは、ことしのCall For Speakers の傾向とプログラム検討の裏側を披露しながら、クラウド分野において皆さまがどのようなテーマにご興味がありそうなのかについて共有したいと思います。

[イベント会場](http://openstackdays.com/access/) は、400名程度が収容できる大部屋と、それを分割してできる部屋を含めて50名〜160名程度が収容できる小部屋を合計7つ設置することができます。
例年は、午前中大部屋でのキーノート講演、午後は小部屋でスポンサー講演、企画セッションの他、クラウド技術に関する各種ハンズオントレーニングとOpsMeetupを開催していました。
また、展示スペースでは、50席程度のミニシアターが設置されます。
実行委員会では、キーノート講演、スポンサー講演ならびに、企画セッションの構成を中心に、イベントの建付けについて熱い議論を続けてきました。

##ことしのセッション検討経過について
[以前](https://qiita.com/iorin/items/02ab38a9380d33434fa3) もご紹介したとおり、今回はイベントテーマ「**Toward Cloud-Native**」に沿って、様々なOSSコミュニティやユーザーコミュニティと連携して、下記4領域のテーマを扱っていくことにしています。

・コンテナ技術(K8S, OpenStack & Container等)
・エッジコンピューティング、NFV
・AI/DeepLearning、HPC、GPU利用技術
・DevOps、CI/CD、PaaS(Cloud Foundry, Serverless/FaaS, Ansible, Kong 等)
※「ハイパーコンバージドインフラストラクチャ(HCI)」は、応募が無かったため削除

ことしも、それぞれのイベントでCall for Speaker (CFS) もおこないました。
その応募結果を見ながら、下記のポリシーでプログラムを立案していきました。

・「コンテナ技術」および、「DevOps、CI/CD、PaaS」領域は、OSDT/CNDTそれぞれで5件ずつ(各領域で10件程度)
・「エッジコンピューティング、NFV」領域は、OSDTとして5件程度
・「AI/DeepLearning、HPC、GPU利用技術」領域は、CNDTとして5件程度

また、各領域のセッションのうち、2/5程度を委員からの招待枠、3/5をCFSからの選出を行う方向としていましたが、今回はCFSの応募状況が活発であり、非常に魅力的な発表が多かったので、2日目午前の大部屋を3つに崩して、新たに6セッションを追加することにしました。

CFSの応募状況は、OSDT分が26件、CNDT分が23件です。
当初応募が集まると予想していた「コンテナ技術」よりも、「DevOps、CI/CD、PaaS」にいい案件が集まっています。
また、今回は技術動向の解説よりも、新技術を用いて先端的なユーザーがOpenStackやCloud-Nativeなシステムをどのように運用しているかという事例が多くなっています。
応募された各テーマ領域の検討チームで議論しながら、最後は委員全員の投票で案件を採択しました。

表でまとめると、今回のセッション構成は以下のとおりになります。

|テーマ領域|OSDTセッション数|CNDTセッション数|
|:-------:|:----------------:|:----------------:|
|コンテナ技術|5<br>(VIP2, CFS3/7)|5<br>(VIP2, CFS3/7)|
|DevOps、CI/CD、PaaS|5<br>(VIP2, CFS3/10)|8<br>(VIP2, CFS6/9)|
|エッジコンピューティング、NFV|6<br>(VIP3, CFS3/8)|-|
|AI/DeepLearning、HPC、GPU利用技術|-|7<br>(VIP2, CFS5/8)|
|スポンサー講演|10|0|
|(合計)|26|20|

このセッションの中で、皆さまがご興味ありそうな事例については、キーノートセッションにもご登壇いただくことになっています。
また、ハンズオンセッションは、5社の最新ソリューションを無料で体験することができますし、OpsMeetupでは、OpenStackを活用するユーザーと開発者が活発に議論できる場をご提供します。

##ぜひご来場ください
[プログラム](http://openstackdays.com/program/) は6/11(月)から公開、[レジストレーション](http://openstackdays.com/) は6/18(月)からの開始予定です。
最大の難関であるプログラムがやっと決まりましたので、今後は登壇予定者と会話しながら、魅力的なセッションに仕立て上げていく予定です。

今回のイベントでは、オンプレミスに限らず、マルチクラウド・ハイブリッドクラウドな時代のCloud-Nativeインフラ利用者やCIO/CTOに向けて、皆さまが持っている共通課題とその解決法をお互いにシェアすることを目指しました。
混とんとするクラウド技術のトレンドと先端的な利用方法がひと目でわかり、自分のビジネスに活用するヒントが得られることと思いますので、皆さまぜひ会場にお越しいただき、登壇者や参加者と活発にご討論ください。
【Ruby】Sinatraで部分テンプレート

部分テンプレートって便利ですよね、モジュールみたいで好き:basketball_player_tone3:


railsの部分テンプレートの記事って色々あるのに、sinatraはあんまりないから書き残して置こうと思います。

まあ、リファレンスに書いてあるから、そっち見て探せば良いんですがね:eyes:
（参考 -> [困ったらリファレンスかコード見て判断しろという声が聞こえる](http://sinatrarb.com/intro-ja.html)）
パンピーエンジニアの僕達はこんな、旧時代のgoogle翻訳みたいな文章読むの辛いんですよ・・・

実はsinatraはリクエストの処理の時みたいにerbファイルを呼び出せます。
今回は普通にgetリクエストで`index.erb`が呼び出された場合です。

```test_tmp.erb
<p>ここに部分テンプレートの内容を書くよ</p>
```

```index.erb
はい、簡単！
<%= erb :'test_tmp' %>
```

部分テンプレートなので、変数を渡して部分テンプレートを呼び出す度に変化を求める人もいるでしょう。

```test_tmp.erb
この値を受け取ったよ -> <%= locals[:value] %>
```

```index.erb
はい、簡単！
<%= erb :'test_tmp', :locals => {:value => 'qiita最高'} %>
<%= erb :'test_tmp', :locals => {:value => 'stackoverflowは英語だから嫌だ'} %>
```

良いですね。部分テンプレート良い感じ。
本当はrailsの`render`を使おうと思ったんだけど、sinatraだとよく分からなかった。
誰か強いエンジニアがsinatraで`render`の使い方を記事にしてくれるでしょう・・・:relieved:
Rocket.ChatをH2Oのサブフォルダからリバースプロキシ

突然Rocket.ChatをH2Oがすでに走っている自分のサーバに構築する必要が生じたので構築したが、一件単純ながら結構ハマって苦しんだので備忘録。


# 09/04追記
残念ながらいくつかのページ遷移においてサブフォルダからルート直下に飛んでしまう不具合に見舞われたため、手元の環境では結局サブドメインに移転してしまいました。
記事は残しておきますが、以下の項目は真似しないことをお勧めします。

# こうする

```yaml:/etc/h2o/h2o.confより抜粋
hosts:
  "example.com:443":
    paths:
      "/":
        file.dir: "/http/root/directory"
      "/rocketchat":
        proxy.reverse.url: "http://127.0.0.1:3000/rocketchat"
        proxy.websocket: ON
```
# 注意点はどこか？
## URL指定の仕方
node.js側にはinitから環境変数で`ROOT_URL=https://example.com/rocketchat`を渡すのでH2O側では単に`http://127.0.0.1:3000/`と指定しておかないと重複パスになって死ぬのかと考えがち（私はやらかした）だがそれは間違いで、上記の通りH2O側で改めてサブフォルダを指定しないと`Unknown path`なる一行のそっけないエラー表示に目の前を塞がれる。
なおnginxでも同じで、Apacheについては[公式ホームページに案内があるので参照のこと](https://rocket.chat/docs/installation/manual-installation/running-in-a-sub-folder/)。

## エラー表示について
Rocket.Chatのエラーページは1行テキストだが、H2Oのエラーページも（少なくともリバースプロキシ関連では）1行テキストなので混同に注意。
H2Oからnode.jsに接続できないときには`connection failed`とこれまた1行だけで出てくるがこれはリバースプロキシ先が繋がらないH2Oのエラー。見かけ上はさっぱり区別がつかない。

# おまけ
node.jsをLibreSSLシステム上で走らせようとするのは本当に大変なので、予定している人は諦めてOpenSSLを採用しましょう。
aws note

# AWS IoT

## Use it simple MQTT broker?
Yes!

## Rule Engine for bin-data?
Support. but no filter rule, except topic.

## What rule action support bin?
I guess SQS only. We can set base64-enc before queue to SQS.

## rule @ lambda
1 subscribe(event) = 1 invoke !!

## how match ?
- connectivity  low & good!  (# of devices)
- messaging hight.. (# of devices & frequency & data-size)
- shadow hight but typically we use low freq (system design)
- rule hight.. (# of devices & frequency)

# AWS IoT Analysis
ETL pipeline
## Support bin?
No..

# ALB
## with WAF
### SG vs IP-rules ?
SG win (due to waf is not fw)

### X-Forwarded ?
only ALB itself. WAF don't have it's IP.

# WAF
### Geo match except specific IP
We Can!

### String and regex matching?
- URL
- body(payload)
- http header
...

`header` we can custom name like 'x-hoge-fuga'

# API-GW
## with NLB (vpc link)
all clean

## Secure conn with ALB
- DO NOT register ALB's DNS to dedicated DNS server (r53)
- ALB + WAF  and custom header ?

## Where swagger/open-api export (MC)
Stage -> stages(select any) -> Export tag
OSI基本参照モデル

# OSI基本参照モデル

| 層       |       名称 |       |
|:-----------------|------------------:|:------------------:|
|7層             |              アプリケーション層 |               |
| 6層           |            プレゼンテーション層 |             |
| 5層             |              セッション層 |               |
| 4層               |                トランスポート層 |                 |
| 3層             |             ネットワーク層 |              |
| 2層          |           データリンク層 |       |
| 1層          |           物理層 


7〜5層を上位層
4〜1層を下位層
【Elm】パターンマッチとは何か？分岐と何が違うのか？

## パターンマッチ
パターンマッチはデータの構造通りに値を比較することが出来る。普通の条件分岐(if文)は値に比較をするだけで、データ構造のマッチングは行わない。

例えば以下のように値を扱える。

```.elm
record = {a = 1, b = 2}

case record of
    { a, b } ->
        a + b

-- -> 3
```

個人的には配列を以下のように扱えるのが斬新だった。

```.elm
-- String型のidをもつ任意のRecord型aをIdentifiable型と定義
type alias Identifiable a = { a | id : String } 

-- Identifiable型とその配列を引数として新たな配列をつくるupdateListを定義
updateList : Identifiable a -> List (Identifiable a) -> List (Identifiable a)
updateList e es =
  case es of
-- 配列の1番目の要素と2番目以降の要素でパターンマッチ
    h :: t ->
      if h.id == e.id 
        then
          e :: t
        else
          h :: (updateEpic e t)
    _ ->
      es ++ [e]
```
VisualStudio2017でLinuxアプリのリモートデバッグ環境を使用する上で発生した問題とその解決

# はじめに
以前作成した[記事](https://qiita.com/nyasai/items/cdaa18dbacb4ad35ae40)(VisualStudio2017でLinuxアプリのリモートデバッグ)の環境を使用する上で発生した問題と，その解決をいくつか残しておこうと思います．

# コンパイルができない
## 原因
GNU Cライブラリを更新していなどの原因で，ビルド時に必要なファイルが見つからず，コンパイルエラーとなっていたようです．
## 解決策
GNU Cライブラリ(libc)関連を更新/インストール，その後再起動を行うことで解決しました．
以下コマンドでパッケージの更新を行うのが一番手っ取り早いと思われます．  

```shell
sudo apt update
sudo apt upgrade
```

個別に必要なもののみインストールを行いたい場合は多分以下でいけると思います．(これは過不足あるかもしれないです．)

```shell
sudo apt update
sudo apt install libc6-dev
sudo apt install libc6-amd64
sudo apt install libc6-dev-amd64
sudo apt install build-essential
```

# root権限が必要なコードを実行できない
## 原因
見出しの通りです．
pthreadのFIFOスケジューリングを使用しようとしたとき，root権限が必要となってしまいます．
しかし前回記事の環境で実行すると，root権限で実行することができないため，思うように動作しません．
## 解決策
わりと強行策ですが，単にssh接続にrootユーザを許可するようにしただけです．  
「/etc/ssh/sshd_config」の「PermitRootLogin」を"yes"に変更．
以下コマンドでrootユーザのパスワードを設定

```shell
sudo passwd root
```

VS2017側からssh接続先にrootユーザのものを追加し，以降それを使用するようにする．

# 静的ライブラリのリンクができない
## 原因
前回記事に記載した箇所に「-l◯◯」を記載する場合，コンパイルオプショとしてはコンパイル対象のソースコードの記載よりも前に記載されてしまいます．
そのため，mathライブラリなどのコンパイル対象のソースファイルの記載よりもあとにライブラリのリンクオプションを記載しなくてはいけないライブラリのリンクができなくなってしまいます．

## 解決策
「プロジェクトのプロパティ」→「リンカー」→「すべてのオプション」→「追加の依存ファイル」の後ろに「-l〇〇」を追加することで，コードファイルの記載よりもあとに展開されるため，問題なくコンパイルが行えます．
![リンク.JPG](https://qiita-image-store.s3.amazonaws.com/0/249420/f3399d8f-c9ed-623f-b94c-4d79f8654165.jpeg)

[参考]
https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/#verbose
[Contact Support: 800-864-4162 ]How to resolve error like Transmit failed general failure 

I was unable to connect to my home network with my Win7 laptop, and when I went to ping, got the following: "PING: transmit failed. General failure." I haven't installed or uninstalled any software since it last worked two days ago. I've followed some of the tips listed in a previous thread: <a href="http://800supportnumber.com/ping-transmit-failed-general-failure/">How to resolve transmit failed general failure </a>

I've done the following:

1. flushed the dns cache

2. disabled and enabled the device

3. uninstalled and reinstalled the network driver (from the Device Management tool devmgmt.msc)

4. uninstalled the software associated with the device (from the uninstall program appwiz.cpl)

5. restored from a System Restore point prior to the error

The problem persists. Amplifying symptoms are as follows:

I can ping 127.0.0.1, but nothing else. IPCONFIG shows a self-assigned IP of 169.254.x.x

![ping-failure-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/261485/dc65680d-df95-14db-8d2d-78b6f0129671.jpeg)


Meda state reads Enabled. IPv4 and IPv6 connectivity read "No network access"

I've tested the cable with fox and hound and it rings good. I see lights on the router port, and Windows starts the IP acquisition process whenever I reset the router or unplug/replug the cable.
If you think that this method will not resolve your issue then call at support at 800-864-4162.
mcaportsでgfortran(gcc)をインストールする方法

OSをHighSierraにUpdateしたらfortranが動かなくなったのでインストールし直した。
いつも検索してしまうのでここで整理しておく。

OSのバージョンによって動くgccのバージョンに違いがあるので注意が必要。
（インストールする際に、動かせないものについてはerrorが表示される）

###対処法
1.gccのバージョンの確認（必要だったら）

```:terminal
$ port search gcc
```
２．gccのインストール

```:terminal
$ sudo port install gcc6
```

3．インストールされているgccの状態を確認（必要だったら）

```:terminal
$ sudo port select --list gcc
Available versions for gcc:
	mp-gcc6 
	mp-gcc7
	none(active)
```

4．利用するgccのバージョンの指定

```:terminal
$ sudo port select gcc mp-gcc6
$ sudo port select --list gcc
Available versions for gcc:
	mp-gcc6(active) 
	mp-gcc7
	none
$ which gfortran
/opt/local/bin/gfortran
```

これでmacportsでインストールしたgfortran(gcc)がdefaultで使用できるようになる。
Phoenixで Bambooを使用してメールを送信する


## 環境
Elixir 1.6.5
Phoenix 1.3.2
Mac OS High Sierra

## Bambooのインストール設定

まずは、メール用のプロジェクトの依存ライブラリである Bumboo をインストールする。

``` mix.exs
def application do
  [
    mod: {MyApp.Application, []},
    extra_applications: [:logger, :runtime_tools, :bamboo]
  ]
end

defp deps do
  [
    {:phoenix, "~> 1.3.2"},
    {:phoenix_pubsub, "~> 1.0"},
    {:phoenix_ecto, "~> 3.2"},
    {:mariaex, ">= 0.0.0"},
    {:phoenix_html, "~> 2.10"},
    {:phoenix_live_reload, "~> 1.0", only: :dev},
    {:gettext, "~> 0.11"},
    {:cowboy, "~> 1.0"},
    {:bamboo, "~> 0.7"},
    {:bamboo_smtp, "~> 1.2.1"}
  ]
end
```

## Bamboo のインストール

`mix deps.get` で追加した依存ライブラリをインストールする。

```
$ mix deps.get
```

## メール設定

プロジェクト設定ファイルに、メール設定情報を追記する。ここではSMTPサーバとしてGmailアカウントを使う。

``` config/config.exs
config :myapp, MyApp.Mailer,
       adapter: Bamboo.SMTPAdapter,
       server: "smtp.gmail.com",
       port: 587,
       username: "my@gmail.com",
       password: "password",
       tls: :if_available, # can be `:always` or `:never`
       ssl: false, # can be `true`
       retries: 1
```

## メーラーの作成

メーラーモジュールを作成する。

``` lib/myapp/mailer.ex
defmodule MyApp.Mailer do
  use Bamboo.Mailer, otp_app: :myapp
end
```

## メールの作成

メールモジュールを作成する。

``` lib/myapp/email.ex
defmodule MyApp.Email do
  use Bamboo.Phoenix, view: MyApp.EmailView

  def hello_email(email) do
    new_email
    |> to(email)
    |> from("my@gmail.com")
    |> subject("Welcome!")
    |> text_body("Welcome to My App!!")
  end
end
```

## コマンドラインからのメール送信

まずは、試しにコマンドラインからメールしてみる。

```
$ iex -S mix

Interactive Elixir (1.6.5) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> MyApp.Email.hello_email("tajima@whoocus.com") |> MyApp.Mailer.deliver_now

[debug] Sending email with Bamboo.SMTPAdapter:

%Bamboo.Email{assigns: %{}, bcc: [], cc: [], from: {nil, "my@gmail.com"}, headers: %{}, html_body: nil, private: %{}, subject: "Welcome!", text_body: "Welcome to My App!!", to: [nil: "tajima@whoocus.com"]}

%Bamboo.Email{
  assigns: %{},
  bcc: [],
  cc: [],
  from: {nil, "my@gmail.com"},
  headers: %{},
  html_body: nil,
  private: %{},
  subject: "Welcome!",
  text_body: "Welcome to My App!!",
  to: [nil: "tajima@whoocus.com"]
}
```


## Webアプリからのメール送信

次に、Webアプリからメールを飛ばしてみる。コントローラを作成してルータに登録する。
ここでは、単純にページにアクセスしたら固定のメールが飛ぶ仕組み。

``` mail_controller.ex

defmodule MyApp.MailController do
  use MyApp, :controller

  alias MyApp.Mailer

  def index(conn, _params) do
    MyApp.Email.hello_email("tajima@whoocus.com") 
      |> Mailer.deliver_now
    render conn, "index.html"
  end
end
```

``` router.ex
    get "/mail", MailController, :index
```

このページにアクセスする都度にメールが飛ぶ。
ここでは、個人的な試作のためにGmailアカウントを使用しているので、SMTPサーバへのアクセスと送信はそこそこ遅い。
メールサーバを立てる方が実用的である。

参考URL: http://www.whoocus.com/blog/?p=2655
aws cli で Aurora RDS パラメーターグループの設定値確認

## 事前準備
- jq インストールしておく(yum install jq, apt install jq) 
- aws configure で aws コマンドを使えるようにしておく　

## aurora_rds.sh

```
#!/bin/sh


case $1 in

   # RDS インスタンス一覧
   instances)
   aws rds describe-db-instances | jq -r '.DBInstances[] | .DBInstanceIdentifier + " : " + .DBParameterGroups[].DBParameterGroupName'
   ;;

   # RDS クラスター一覧
   clusters)
   aws rds describe-db-clusters | jq -r '.DBClusters[] | .DBClusterIdentifier + " : " + .DBClusterParameterGroup'
   ;;

   # クラスター パラメーターグループ
   cluster_pg)
   aws rds describe-db-cluster-parameter-groups  | jq -r '.DBClusterParameterGroups[].DBClusterParameterGroupName'
   ;;

   # インスタンス パラメーターグループ
   instance_pg)
   aws rds describe-db-parameter-groups | jq -r '.DBParameterGroups[].DBParameterGroupName' 
   ;;

   # クラスターのパラメーターグループキー, バリュー
   desc_cpg)
   # describe-db-cluster-parameter-groups のパラメータグループを指定
   aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name $2 | jq -r '.Parameters[] | select( .ParameterValue != null) | .ParameterName + " : " +   .ParameterValue'
   ;;

   # インスタンスのパラメーターグループキー, バリュー
   desc_ipg)
   # describe-db-parameter-groups のパラメータグループを指定
   aws rds describe-db-parameters --db-parameter-group-name $2 | jq -r '.Parameters[] | select( .ParameterValue != null) | .ParameterName + " : " +   .ParameterValue'
   ;;
   *)
   echo 
   echo "Usage: $0 [ instances | clusters | cluster_pg | instance_pg ]"
   echo "       $0 desc_cpg CLUSTER-PARAMETER-GROUP"
   echo "       $0 desc_ipg INSTANCE-PARAMETER-GROUP"
   echo
   ;;
esac
```

## 使い方

```
$ sh rds.sh 

Usage: rds.sh [ instances | clusters | cluster_pg | instance_pg ]
       rds.sh desc_cpg CLUSTER-PARAMETER-GROUP
       rds.sh desc_ipg INSTANCE-PARAMETER-GROUP
```

##### クラスター一覧
```
$ sh  aurora_rds.sh  clusters
rds-cluster-aaa : rds-cluster-aaa-rdsdbclusterparametergroup-111111111
rds-cluster-bbb : rds-cluster-bbb-rdsdbclusterparametergroup-222222222
```
##### クラスターパラメーターグループを指定してパラメーター確認
```
$ sh aurora_rds.sh desc_cpg rds-cluster-aaa-rdsdbclusterparametergroup-111111111
binlog_format : OFF
character_set_client : utf8mb4
character_set_connection : utf8mb4
```

##### インスタンス一覧
```
$ sh aurora_rds.sh  instances 
xxxxxxxxxyyyyy  : aaaaabbb-dbparametergroup-xxxxxx
zzzzzzzzllllll  : aaaaabbb-dbparametergroup-yyyyyy
```

##### インスタンスパラメーターグループを指定してパラメーター確認
```
$ sh aurora_rds.sh  desc_ipg aaaaabbb-dbparametergroup-xxxxxx
aurora_lab_mode : 0
basedir : /rdsdbbin/oscar
binlog_cache_size : 32768
```

#### 差分確認してみたりとか
```
$ sh aurora_rds.sh  instances | cut -d: -f2 > instance_parametergroups 
$ mkdir instances
$ for x in `cat instance_parametergroups` ; do sh aurora_rds.sh desc_ipg $x > instances/$x ;done
$ cd instances
$ for x in * ; do echo "== $x ==" ; diff rds-33-dbparametergroup-jfejifjeijejf  $x;done 
== xxxx == 
== bbbb ==
12a13
> innodb_print_all_deadlocks : 1
20c21
< long_query_time : 0.5
---
> long_query_time : 0.1
22c23,24
```
Node.js:[Don't know how to build task 'db:']の対処方法

#はじめに
かなり初歩的なエラーかと思いますが、私が初心者のため備忘録を含め記録として残したいと思います。


#結論:【rails db: migrate】ではなく、【rails db:migrate】を実行する。

ターミナルで`$ rails db: migrateと入力した際に以下のエラーが返ってきました。

```Swift:ターミナル
Error: Cannot find module 'ejs'
    at Function.Module._resolveFilename (module.js:547:15)
    at Function.Module._load (module.js:474:25)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous>
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
```

#`nmp init`を実行後`npm install -save ejs`を実行することで解決。


```Swift:solved
１）　npm init 質問に関しては全てエンターキーを押下
２）　npm install -save ejs
```


参考文献：Node.js超入門　(著)　掌田津耶乃様

ご参考になれば幸いです。
Microsoft Teams にIncoming webhookするPHP

```php
$webhook_url = 'hogehoge';
$options = [
  'http' => [
    'method' => 'POST',
    'header' => 'Content-Type: application/json',
    'content' => json_encode([
        'text' => 'Hello Teams!'
    ]),
  ]
];
file_get_contents($webhook_url, false, stream_context_create($options));

```
PHPでファイルパスの正規化

# 問題
[`PHP: realpath - Manual`](http://php.net/manual/ja/function.realpath.php)
> 返り値
> realpath() は、 たとえばファイルが存在しないなどの失敗時に FALSE を返します。


# 実装
WindowsとLinuxの両方に対応している関数が見つからなかったので書いた。

```php
function normalizePath($path, $separator = '/') {
    if (preg_match('/^(([a-zA-Z]:)?)[\/\\\\]/', $path, $matches) !== 1) {
        return normalizePath(getcwd().$separator.$path);
    }

    return $matches[1] . array_reduce(
        preg_split('/[\/\\\\]/', ltrim($path, $matches[1]), -1, PREG_SPLIT_NO_EMPTY),
        function($absolutes, $part) use($separator) {
            if ($part === '.') return $absolutes;
            if ($part === '..') return dirname($absolutes);
            if ($absolutes === $separator) return $absolutes.$part;
            return $absolutes.$separator.$part;
        }
    );
}
```
LaravelをHerokuにデプロイ

# Laravelのインストール
```sh
$ laravel new HerokuLaravel
$ cd HerokuLaravel
```
# Herokuコマンドのインストール
```sh
$ brew install heroku
```

# Gitの設定
```sh
$ git init
$ git add .
$ git commit -m 'init'
```

# Procfileの作成
```sh
$ echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
$ git add .
$ git commit -m "Procfile for Heroku"
```

# Herokuにデプロイ
```sh
$ heroku create # Teamで作る場合は　heroku create --org 
$ git push heroku master
$ heroku open
```

# ログの設定
```diff:config/logging.php
    'channels' => [
        'single' => [
-            'driver' => 'single',
+            'driver' => 'errorlog',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],
```

設定を反映

```sh
$ git add config/logging.php
$ git commit -m "use errorlog"
$ git push heroku master
```

# ロードバランサーの設定
```diff:app/Http/Middleware/TrustProxies.php
- protected $proxies;
+ protected $proxies = '*';

- protected $headers = Request::HEADER_X_FORWARDED_ALL;
+ protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB;
```
設定を反映

```sh
$ git add app/Http/Middleware/TrustProxies.php
$ git commit -m 'add proxy settings'
$ git push heroku master
```
# DBアドオンを追加
```sh
$ heroku addons:create heroku-postgresql:hobby-dev
```

# 環境変数（.env）の追加
```sh
$ cp .env .env.heroku

```

環境変数の設定及び、DBの設定ファイルを下記から参照して記述

```sh 
$ heroku config:get DATABASE_URL # postgres://<ユーザ名>:<パスワード>@<ホスト>:5432/<DB名>

```

composerのスクリプトを追加

```diff:composer.json
"scripts": {
+ "post-install-cmd": [
+ 	"chmod -R 777 storage"
+ ],
+ "compile": [
+ 	"@php -r \"file_exists('.env') || copy('.env.heroku', '.env');\"",
+ 	"@php artisan key:generate"
+]
},
```
設定を反映

```sh
$ git add .
$ git commit -m 'env file'
$ git push heroku master
```

マイグレーションコマンド実行の確認

```sh
$ heroku run php artisan migrate --seed
```

# 参考
https://devcenter.heroku.com/articles/getting-started-with-laravel
https://qiita.com/sutara79/items/a173b969474d9f5afe1b
https://qiita.com/c6h4clch3_gh/items/dbf38711d54677109c9a
Sublime Text3でEC2にSFTPで接続する（Windows）

##背景
ある日突然ATOMが起動しなくなってしまい、再インストールもうまくいかず、使わないのに入れていたSublimeTextに乗り換えた時のメモです（IDE嫌い）。
SFTPはすでに入れていることを前提に、設定ファイル周りのことを書きます。

###秘密鍵について
リモート先はEC2なので、秘密鍵はpemだろ？　って思ったのですが、pemではうまくいかず、WinSCPを使用しppkを生成しました。
###ポート
22じゃなくて1024～いくつかまでの数字で指定するという記事があったのでが、22でないと繋がりませんでした。


```sftp-config.json
{
    // sftp, ftp or ftps
    "type": "sftp",

    "save_before_upload": true,
    "upload_on_save": false,
    "sync_down_on_open": false,
    "sync_skip_deletes": false,
    "sync_same_age": true,
    "confirm_downloads": false,
    "confirm_sync": true,
    "confirm_overwrite_newer": false,
    
    "host": "サーバIP",
    "user": "hoge",
    //"password": "",
    "port": "22",
    
    "remote_path": "/home/hoge/",
    "ignore_regexes": [
        "\\.sublime-(project|workspace)", "sftp-config(-alt\\d?)?\\.json",
        "sftp-settings\\.json", "/venv/", "\\.svn/", "\\.hg/", "\\.git/",
        "\\.bzr", "_darcs", "CVS", "\\.DS_Store", "Thumbs\\.db", "desktop\\.ini"
    ],
    //"file_permissions": "664",
    //"dir_permissions": "775",
    
    //"extra_list_connections": 0,

    "connect_timeout": 30,
    //"keepalive": 120,
    //"ftp_passive_mode": true,
    //"ftp_obey_passive_host": false,
    "ssh_key_file": "C:\\～パス～\\id_rsa.ppk",
    //"sftp_flags": ["-F", "/path/to/ssh_config"],
    
    //"preserve_modification_times": false,
    //"remote_time_offset_in_hours": 0,
    "remote_encoding": "utf-8",
    //"remote_locale": "C",
    //"allow_config_upload": true,
}

```
WindowsでSublimeTextのSFTPを使用する記事が少なかったので書きました。
AlibabaCloudのROSテンプレートはとっても便利!!

# はじめに
最近、AlibabaCloudのROSに触っているので
今回はROSのテンプレートに触れたいと思います。

# テンプレートは２種類
２種類のテンプレートを紹介します。

## サンプルテンプレート
コンソールをみてもらうとわかりますが
サンプルのテンプレートが並んでそれからスタックを作成できます。

![835e07a9.png](https://qiita-image-store.s3.amazonaws.com/0/241104/fe4662f4-1d3e-7076-2a36-bea465ef51f4.png)

プレビューから、サンプルテンプレートがどのようにできているのか確認できます。
ちょっとミドルウェアを変えたりする際にはとても便利な機能です。

![fcda98e4.png](https://qiita-image-store.s3.amazonaws.com/0/241104/75bc5e95-4ad5-9879-19e2-3df2c37c10ba.png)

## マイテンプレート
マイテンプレートでは、自分自身のテンプレートドキュメントを保存できます。
そこからスタックの作成ができる便利なものです。
私も今までテンプレートはこちらに保存して、直ぐに起動できる環境を用意しております。

このコンソール一つで全てができるところが、気に入ってます。

![0cbe8e2b.png](https://qiita-image-store.s3.amazonaws.com/0/241104/8b2012cf-6233-7597-b11c-8cb60667f233.png)

# さいごに
今は自分のテンプレートで欲しい機能は
前の編集との差分が管理したい、
テンプレートのバージョン管理がしたい
といったテンプレートの変更管理ができると嬉しいです。
なので、更なるアップデートを期待してます。
やりたいことは「pandasデータフレームの名義変数の列を欠損値を含めて、理解（表現）すること。」。欠損値と空白の違い。

本日の投稿内容をまとめるため、メモ。
やりたいことは「pandasデータフレームの列を欠損値を含めて、理解（表現）すること。」

扱いづらい（わかりづらい）ポイントは以下２点。
１、欠損行を含んだ列のサマライズをするメソッドがデータフレーム（あるいはシリーズ）に存在しない点。
２、本当は欠損なのに、空文字列 ""　あるいは、スペース " "を含んでいると欠損として扱われない点。

１、欠損行を含んだ列のサマライズをするメソッドがデータフレーム（あるいはシリーズ）に存在しない点。
例えば、Series.describe()では欠損値はカウントされない。また全体の行数も表示されない。そのため、欠損行の数を見るためにはわざわざ以下を書かなければならない。

1-1 df[something].describe()
データの数、ユニークバリューの数等はわかる。
名義変数の種類や頻度はわからない。
欠損数もわからない。

1-2 df[something].value_counts()
私が知りたい、使いたいのはどちらかというとこちら。

1-3 「欠損行」、あるいは「欠損ではない行」の行の数
df[columna_name].isnull().sum()
df[columna_name].notnull().sum()

参考サイト
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html
https://qiita.com/hassaku_63/items/2c2c2cb01901bbffec0b


２、本当は欠損なのに、空文字列 ""　あるいは、スペース " "を含んでいると欠損として扱われない点。
もし手持ちのデータセットの空白が欠損の場合にはnp.nanで埋めなければならない。
2-1 df[columnname].str.strip()　で、スペースを削除
2-2 空白文字列　""　をnp.nanを置き換える。
DataFrame.replace()を使用する。
2-3 欠損数をカウントする。

参考リンク
pythonとRの欠損と空白の扱いの違いについての参考サイト
https://qiita.com/TomokIshii/items/c7c704f22edfebf7f133
replaceメソッドについて
http://nekoyukimmm.hatenablog.com/entry/2015/10/02/113324
モバイルアプリ作ったこと無いマンが1分でトレンドを把握できる図を書いた

モバイルアプリをクロスプラットフォームに開発する場合、今の技術的トレンドは何だろうということで、ちょちょっとそれらしいキーワードを検索してみました。

### Googleトレンド 2016.05.20 ~ 2018.05.20

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/84749/ab8bcd80-aa5c-7cf8-8c63-fd2d084ddd12.png)](https://trends.google.com/trends/explore?date=2016-05-20%202018-05-20&q=ionic,react%20native,xamarin,Flutter,PWA)

上記5つのキーワードがトレンドとなっているようですが、それぞれのフレームワークについて調べてみると、技術的なアプローチがぜんぜん違う！ :flushed: ということで、それぞれのアプローチの違いを簡単な図にまとめてみたのが以下です。

### 技術的アプローチ概略図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84749/0d79f96d-500c-514c-1be5-093bb6d8801a.png)

### 用語補足

**ハイブリッドアプリ：** WebViewを使用した UI と、Cordova フレームワークなどを利用したネイティブ機能（カメラやGPSなど）を組み合わせたモバイルアプリのことです。Cordova を利用すると、JavaScript でネイティブ機能にアクセスできるため、Web技術で Android、iOS 両対応なモバイルアプリを開発できます。デメリットとしては、ネイティブアプリに比べてパフォーマンスで劣ることや、利用できるネイティブ機能が、Cordova プラグインの対応状況により制限されることなどです。

*参考サイト：[ハイブリッドアプリとは?](https://qiita.com/soarflat/items/cf5d343c75baadb461dc)*

**PWA（Progressive Web Apps）：** Googleを中心に策定された、アプリのようなUXを提供するWebSiteのことです。ネイティブアプリではないため、公開時の審査やインストールが不要です。対応ブラウザであれば、オフライン対応、プッシュ通知、Home画面への追加などといった、ネイティブ機能が一部利用可能となります。iOS Safari も 11.3（2018年3月）で一部対応し、ようやく普及の準備が整いました。

*参考サイト：[iOSの11.3からのPWA対応でできるようになったこと](https://medium.com/@takeshiamano/ios%E3%81%AE11-3%E3%81%8B%E3%82%89%E3%81%AEpwa%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8-313f638a172b)*

### 各フレームワークの特徴まとめ

|名称|関連企業|開発言語|開発環境 <br> (Editor)|特徴|
|---|---|---|---|---|
|Ionic|Ionic|JavaScript|As you like|コンポーネントは Angular ベース。Cordova を利用して、クロスプラットフォームなネイティブアプリを開発できる。PWAも同時に開発できる|
|React Native|Facebook|JavaScript|As you like|コンポーネントは React ベース。Cordova 不要で、クロスプラットフォームなネイティブアプリを開発できる。WebView を使わずに、ネイティブのレンダリング API 経由で UI を描画できるため、ハイブリッドアプリよりも高速|
|Xamarin|Microsoft|C#|Visual Studio <br> ※ Win/macOS 版のみ|C# でクロスプラットフォームなモバイル／デスクトップのネイティブアプリを開発できる。ネイティブ機能の API は、ほぼ完全に移植されているため、ネイティブ開発と遜色のないアプリが開発可能|
|Flutter|Google|Dart|Android Studio, <br> Visual Studio Code|Dart 言語でクロスプラットフォームなモバイルネイティブアプリを開発できる。UIはネイティブのUIとは異なるエンジンで高速に描画される。まだ β版|

### どのフレームワークを選択すべきか？

開発言語を問わないのであれば、Xamarin か Flutter が検討できます。デスクトップアプリも視野に入れるのであれば Xamarin、Linux 上で開発するのであれば Flutter になりそうです。一方、Web技術をベースにするのであれば、柔軟性を取るのであれば、Ionic（というか Cordova ？）、パフォーマンスを取るのであれば React Native が有力でしょう。ただし、iOSアプリを開発する場合、どのフレームワークを選定するにせよ、Xcode（= macOS）環境が必要になる点は注意が必要です :point_up: 

もし、「対応ブラウザ」や、「できること」の制限が問題にならないのであれば、通常の WebSite と同様に公開できる、PWA を選択肢に入れる方が、ユーザー側の利便性は高いかもしれません

アプリのバックエンドについては、API サーバーを構築するか、mBaas（Mobile Backend as a Service）と呼ばれるサービスを使ってサーバーレスにするかの選択となりますが、プッシュ通知機能を使うのであれば、Firebase Notifications が無料で利用でき、また iOS への通知にも対応している、FireBase を選択するのが良さそうです

---

### 終わりに

なにぶん、調べた本人もモバイルアプリ作ったこと無いマン :expressionless: のため、誤り、違和感等ございましたら、コメント欄でご教示いただければと思います :bow: タイトルに書かれている図が見当たらない方は、狐に包まれたような気持ちになってください :tiger:
以上です。
androidstudioでAVDを起動できない

#はじめに
自分用の授業で学んだ事のメモとして使います。
※添付している画像は全てスクリーンショットとペイントで編集しました。

#AVDを起動できない
![bug1.png](https://qiita-image-store.s3.amazonaws.com/0/249280/5bc9dc25-8f2c-0e7e-3ee3-945522de197c.png)

![bug2.png](https://qiita-image-store.s3.amazonaws.com/0/249280/e6179287-0f5b-b03a-1d56-5e3d65a604df.png)
初めてAVDを起動しようとすると、このようなメッセージが出る。
内容を見てみるとIntelHAXMが必要で、VT-xが無効になっているそうです。
自分が今使っているPCの設定でこのメッセージが出たので、
まずはPCのBIOS(HPならF10キー)を開き、セキュリティ→システムのセキュリティに仮想化技術がある
![DelLNipUcAAoCQe.jpg](https://qiita-image-store.s3.amazonaws.com/0/249280/9d2b1f52-89fe-55e2-4281-0c8616b5bb12.jpeg)
この仮想化技術が無効になっているとAVDが起動できない

![DelLOvlUcAARCs_.jpg](https://qiita-image-store.s3.amazonaws.com/0/249280/7f2ae3a4-47f8-6f84-8d24-87cad8111413.jpeg)
このように有効にすると、起動出来るようになる

最初からしっかり設定を確認していればこのようなことはなかったと思いますが、
これも勉強になったので良かったです。