OmniAICreator/Qiita-1.07M huggingface dataset:
Cloud9でIAMロールに共有させる方法

## 概要
- Cloud9には、ペアプログラミング用にユーザーの共有設定がある。
- 共有設定を、IAMユーザーでなくIAMロールに設定する方法について記載。
- 実際、ここ（[Environment と異なるアカウントのユーザーを招待する](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/share-environment.html#share-environment-invite-user-cross-account)）に書いてあるままといえば、そのとおり。

## 方法
### 方法１. マネージメントコンソールから付与する
- [Environment と異なるアカウントのユーザーを招待する](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/share-environment.html#share-environment-invite-user-cross-account)
- 注意点は、共有するユーザー（ [Invite Members (メンバーを招待する)] ）には、**スイッチロール(STS)時のARN**を指定すること
	- 例）`arn:aws:sts::[account_id]:assumed-role/[Role名]/[スイッチロールするIAMユーザー名]`


### 方法２.　CLIから付与する
- 上記の手順にはないけど、CLIでも設定できる
	- [create-environment-membership](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/cloud9/create-environment-membership.html)
	- [New-C9EnvironmentMembership Cmdlet](https://docs.aws.amazon.com/powershell/latest/reference/Index.html)
- このとき、`EnvironmentId`指定でメンバー追加をしなきゃいけないけど、Listコマンドで取ったとき、`Id`の情報しか取れんかったので、以下のスクリプトでいい感じに他情報も取って、`create-environment-membership`実行しました。
- `create-environment-membership`の` --user-arn`ももちろん、**スイッチロール(STS)時のARN**を指定すること

```
$c9_list = @(Get-C9EnvironmentList)
Write-Output $c9_list

$arrResults = @()
foreach ($c9_id in $c9_list) {
    $c9_data = @(Get-C9EnvironmentData -EnvironmentId $c9_id)
    $objResults = New-Object PSObject -Property @{
        Arn = $c9_data.Arn;
        Name = $c9_data.Name;
        OwnerArn = $c9_data.OwnerArn;
    }
    $arrResults += $objResults
}

Write-Output $arrResults

# 実行結果
OwnerArn                                                                        Name                  Arn                                                                                    
--------                                                                        ----                  ---                                                                                    
arn:aws:iam::[account_id]:user/hoge                                             hogehoge              arn:aws:cloud9:[region名]:XXX:environment:[EnvironmentId]
・・・

# 実行結果のId使ってメンバー追加
aws cloud9 create-environment-membership --environment-id [EnvironmentId] --user-arn arn:aws:sts::[account_id]:assumed-role/[role-name]/[AssumeRoleするIAMユーザー名] --permissions read-write/read-only --region [region名]

```


## せっかく設定しても残念だったこと
[IAM ロールを使用する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use.html) の制限でなんとセッション時間１時間から延長できないので、**１時間でセッション切れちゃう**。使い勝手悪いのでなんとかなったら嬉しいんですがね。
Zapier 最高すぎるよね！ Github Issue への Post を Twitter に画像つきでツイートする例。

Zapier 最高すぎるよね！ Github Issue への Post を Twitter に画像つきでツイートする例。

# Github issue をトリガーにする

![image](https://user-images.githubusercontent.com/13635059/51801521-5e052880-2282-11e9-97ba-06c3cbcc98d8.png)

# Filter を使う

- Extract Pattenを選ぶ、python基準の正規表現が使える
- Input は Github Issue の Bodyにする
- パターン抽出で `https:\/\/user-images\.githubusercontent.com\/[a-z0-9\-_/]+\.png` と入力する、最初のアップロード画像を抽出する

![image](https://user-images.githubusercontent.com/13635059/51801527-72e1bc00-2282-11e9-93cc-2edddd66e987.png)

![image](https://user-images.githubusercontent.com/13635059/51801527-72e1bc00-2282-11e9-93cc-2edddd66e987.png)

# Twitter をアクション設定する

Image として抽出済みの 画像URLを指定する

![image](https://user-images.githubusercontent.com/13635059/51801545-a7557800-2282-11e9-8172-782d2125a3ea.png)

# 成功した例

ちょっと画像があれで分かりにくいかもしれないが、画像つきツイートが成功しているのが分かる

![image](https://user-images.githubusercontent.com/13635059/51801551-c5bb7380-2282-11e9-8e43-42e8e875eae4.png)


[いなうらゆうま🤖君に届かないリプライ on Twitter: "これはやばい。ZapierでGithub Issueを作成すると、はてなブログに投稿する連携のサンプル。 https://t.co/a75N51awDi https://t.co/g8stqfUgzh" / Twitter](https://twitter.com/YumaInaura/status/1089513975493152769)

# これで解決！

Github issue をそのままTwitter共有しても、画像がシェアされない問題が。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
複数NICマシンでのルーティング設定（static route）

# はじめに
例えば新しいパソコンを買ってきて家でネットワークにつなぐとき、SSIDとパスワードを入力してつなぐ。DHCPを指定すれば、接続に必要な情報は勝手に登録されるため、IPやデフォルトゲートウェイなどを意識して設定することはない。しかし、仕事で扱うパソコン等であれば、NICを複数枚持っているようなケースも存在する。

昨今色々なスクリプト言語やIDEによってアプリ開発のハードルは下がったように感じるが、ネットワークはまだまだ苦手な人が多い。今回は、特に新しくサーバや端末に固定IPを振って接続するケースで、どうすればよいかをまとめる。


# ネットワーク設定の方法
## やりがちな間違い
「パソコンにIPを設定する」=「IPやサブネットマスクやデフォルトゲートウェイを設定する」で概ね間違っていないが、**複数のNICに対してデフォルトゲートウェイを設定してはいけない**。複数のNICにデフォルトゲートウェイを設定してしまうとネットワークが不安定になり、通信ができなくなってしまう。

###### 備考：開発する際の注意
仮に各NICにデフォルトゲートウェイを登録していても、他のNICが有効になっていなければ通信できてしまうこともある。例えば、個別テストのために、ひとつずつケーブルを突き刺した場合である。こうしてテストした場合、いざ全部のケーブルを接続した時点で、全部のNICに設定されたデフォルトゲートウェイが読み込まれ、結果ネットワークが不安定になる。個別の通信試験の段階から、実際に使用するすべてのNICを有効にして望むことが望ましい。

## ルーティングの方法：Static Route
異なるネットワークのIPにアクセスするときの出口として必要なのがデフォルトゲートウェイであり、そもそも同じネットワークのIPとしか通信しない場合、デフォルトゲートウェイさえ必要ない。しかし、**通常はデフォルトゲートウェイでいいが、特定のサブネットに対しては別のIPを経由したい**場合がある。こういうケースでは、static routeを使う。

### 想定するケース
以下のケースを想定する。

- パソコンの設定
    - NIC A
        - IP: 192.168.1.10/24
        - Gateway: 192.168.1.1/24
    - NIC B
        - IP: 10.20.30.40/24
- ルーティングについて
    - 他のネットワークに通信するとき、通常は192.168.1.1/24を経由する（デフォルトゲートウェイ）
    - ただし、サブネット10.50.60.0/24に対しては、10.20.30.50/24（例えばL3スイッチ）を経由したい

このとき、**10.50.60.0/24への接続を10.20.30.50/24を経由するようstatic routeで指定**する。

### Windowsの場合
コマンドプロンプトで```route```コマンドを使用する。


```DOS
$ route add 10.50.60.0/24 mask 255.255.255.0 10.20.30.50
```
削除するときは次のように、```add```を```delete```にすれば良い。

```DOS
$ route delete 10.50.60.0/24 mask 255.255.255.0 10.20.30.50
```

この設定をずっと有効にする（再起動してもこの設定が有効になる）ためには、```-p```オプションを使用する。

```DOS
$ route -p add 10.50.60.0/24 mask 255.255.255.0 10.20.30.50
```

設定がうまくできたかどうかは、

```DOS
$ route print
```

で確認できる。


### Linux(RHEL)の場合
RHEL(CentOS)の場合、```route```コマンド(```ip route```)で追加するか、```/etc/sysconfig/network-script/route-eth[x]```ファイルに記述する（xは、NICに対応するethに合わせて数字を入れる）。今回は後者を紹介する。

上記の設定の場合、各ファイルには次のように設定してあるとする。
eth0が192.168.1.10/24のNIC A, eth1が10.20.30.40/24のNIC Bである。

```text:/etc/sysconfig/network/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=192.168.1.10
GATEWAY=192.168.1.1
```

```text:/etc/sysconfig/network/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=10.20.30.40
```

このとき、eht1用(IP=10.20.30.40)に対するファイル ```/etc/sysconfig/network-script/route-eth1``` を追加する。

```:/etc/sysconfig/network-script/route-eth1
10.50.60.0/24 via 10.20.30.50
```

その後、ネットワークの再起動を行う。

```text
# service network restart
```

# おまけ
以上でstatic routeの設定は終わる。最後に、通信するサブネットがごくごく限られているなら、デフォルトゲートウェイを設定せずに、明示的にstatic routeだけにするのもアリだと考える。
インターフェースとは

おつかれさまです。
プログラミング初心者です。

いままでなんとなく通り過ぎていた単語を振り返ってみて
理解に詰まったもの、気になったものを少し投稿したいとおもいます。
「インターフェース」ってなんだろうと疑問に思われる方の参考になれば幸いです。

## 1.インターフェースとは

非常にわかりやすく言うのであれば
#####「このクラスは、**メソッド(≒関数)を持ちます！」という「約束」「規格」となります。


例をあげましょう。
例えばコントロールパネル(controlPanel)というインターフェースがあったとします。
このコントロールパネルには、「再生」「停止」「早送り」というメソッドがあるとします。

このcontrolPanelをimplementした場合には
#####必ずそのクラスには「再生」「停止」「早送り」が実装されていなければなりません。
#####実装されてなければエラーを起こしますという制約にもなるのです。

下記にわかりやすい図がありますのでもしよろしければ参考ください。

参考文献：
https://www.gixo.jp/blog/5159/

##2.具体的になに？

まとめると「この機能実装することをお約束します」という宣言
と思うと良いでしょう。

##3.用途、便利な使いかた

私はこれを読んで、先に宣言しちゃって大丈夫？
機能の拡張しにくいんじゃない？
と思ってました。

新しくわかりやすい例をもってきました。

1. コンセントの規格が決まり、電化製品は基本的にはその規格に沿ったコンセントを作る必要があることになった（インターフェース） 
1. ドライヤーを作った 
1. 電子レンジを作った 
1. 冷蔵庫を作った 
1. テレビが発明された

ここで上記の家電製品のコンセントの形が全て統一されていれば、全て同じ電源タップが使えますね。変換機を買ってきたり、工事をしてコンセントの形を変えたりなどということは不要になります。 
逆に言えば、家電製品の開発者は「コンセントの形を統一する必要性に迫られる」ということになりますが、それがインターフェースの本質です。

引用元：
https://teratail.com/questions/70213


上記のように未来のことを考えると、
「このような規格で作ってね」と宣言する
メリットが非常にわかりやすいのではないでしょうか。

もし規格が異なっていれば、ユーザビリティとして非常に好ましくない結果が想定されますゆえ・・・。

##3.extendとの違いは？

さて、ここでextendについても触れたいと思います。
例えばこんなpersonクラスがあるとします。

````java
class Person {
     String name;
     eat(){}
```

このpersonクラスを継承して、Programmerクラスを作ります。
あるクラスを継承したクラスを作るには、クラス名の後ろに
extends クラス名
を付けるだけです。

```java
class Programmer extends Person {
     Programming(){}
}
```

こちらは「継承」と呼ばれる親クラスの使用になります。
インプルメントはインターフェースの利用に対し、こちらは
**親のメソッド**を拡張して使用します。

例えば、親のメソッドで使用している値や動きを使いたい場合、
わざわざもう一度親メソッドの動きを再現する必要なく
呼び出す（継承する）ことで使用することができます。

ここはインターフェースとの違うところなのでご注意ください。

いかがでしたでしょうか。
インターフェースの理解の参考になれば幸いです。
PowerApps で SherePoint リストを更新

[Power BIとVisio、SharePointリストを使った座席表を作ってみた](https://qiita.com/afujie/items/d6450ec83403424c3d59) の続きです。
最終的には、ワンタップやワンクリックで座席を登録できるようにしたいのですが、少しずつ進めたいので SharePoint のリストを更新できればOKなアプリを作ります。

# これまでの構成

座席表のレイアウト表示は、Power BI を使用しました。
座席情報は、SharePoint Onlineリストを使用しました。

# 今回の構成

これまでの構成は、座席レイアウトを表示する部分なので今回は、座席情報を入力する部分を追加します。
入力部分は、PowerApps を使用します。

#進め方

PowerAppsは、データを基にウィザード機能で画面を作ると一覧画面、詳細表示画面、編集画面をスマートフォンのレイアウトで自動で作成してくれます。
使い方は、座席についたら一覧画面から座席を選んで名前を登録できる様にします。

#手順

1. データを用意
    1. 前回、作ったSharePoint リストに座席の数だけ情報を登録
       (ここではFloorリストに DESK1-A1、DESK1-A2...、DESK1-B1...、DESK2-A1...)
2. データから画面を作成
    1. Office 365 のアプリ ランチャからPowerAppsを起動
    2. PowerApps の画面左側の[作成]タブから[データから作成]をクリック
    3. 説明画面が表示されたら画面中央のアプリを操作してみます。（これサンプルイメージじゃなくてサンプルアプリです）
    4. 一通り試してみたら[このアプリの作成]をクリック
    5. データを使用して開始で、「SharePoint」の[携帯電話 レイア...]をクリック
    6. 「データに接続する方法を選択してください。」で[直接接続(クラウド サービス)]を選んで[作成]ボタンをクリック
    7. 「リストの場所を表す SharePoint URL を入力してください。」でサイトのURLをコピー&ペーストして[移動]をクリック
    8. 「一覧の選択」でSharePoint リストを選んで[接続]をクリック
    9. しばらくするとアプリが作られて、ようこそ画面が表示される
3. 画面を調整
    1. 画面左側の「画面」ペインに画面や画面の要素がツリー表示される
        * BrowseScreen1 が一覧画面
        * DetailScreen1 が詳細画面
        * EditScreen1 が編集画面
    2. 一覧画面をカスタマイズ
        1. 登録者の表示は不要なので、BrowseGallery1 をクリックしてプロパティの[レイアウト]を「 タイトルとサブタイトル」に変更
        2. この時に詳細画面へのボタンが無効になるため修正
            1. BrowseGallery1 の NextArrow1 をクリックして、関数バーの OnSelect の 値を 「Navigate(DetailScreen1, None)」に修正
        3. 座席の追加も不要なので、IconNewItem1をクリックしてプロパティの[表示]をオフに変更
    3. 詳細画面をカスタマイズ
        1. 座席の削除は不要なので、IconDelete1をクリックしてプロパティの[表示]をオフに変更
    4. 編集画面をカスタマイズ
        1. 添付ファイルの編集は不要なので、EditForm1をクリックしてプロパティの[フィールドの編集]をクリック
        2. フィールド画面の添付ファイルの右端の[...]ボタン、[削除]メニューの順にクリック

4. アプリの公開
    1. [ファイル]メニュー、[名前を付けて保存]タブの順にクリック
    2. 保存場所が[クラウド]になっていることを確認
    3. アプリ名をつけて、[保存]ボタンをクリック
    4. 保存画面で[このアプリを共有する]ボタンをクリック
    5. 共有画面で名前やメール アドレスなどで共有先を指定して[共有]ボタンをクリック
AWSアカウントでのIAMユーザの作成

ふとAWSを使おうと思い、以下を参考にした。
[AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888)

ただ、IAMユーザの作成でちょっとUIが変わっていたのでその辺りをまとめておく。

# そもそもIAMユーザって何？
IAMはIdentity and Access Managementの略。AWSへのアクセス権限を人やAWS以外のサーバに付与するためのもの。ただ、自分一人しか使わない場合でも、常にAWSアカウントを作った時のルートユーザで作業し続けるのは危険なので、最低限の権限を与えたIAMユーザで作業するのがベストプラクティスらしい。

# IAMユーザの作成
1.　[IAM](https://console.aws.amazon.com/iam/home)のページにアクセス
2.　**個々のIAMユーザーの作成**をクリックし、**ユーザーの管理**をクリック
![01.JPG](https://qiita-image-store.s3.amazonaws.com/0/184582/1812350b-73fb-6a61-212a-02a4b5aeb698.jpeg)
3.　**ユーザーを追加**をクリック
![02.JPG](https://qiita-image-store.s3.amazonaws.com/0/184582/831ec508-b1fd-d4b4-554e-4eb7a0f398b3.jpeg)
4.　**ユーザー名**を入力して**AWSマネジメントコンソールへのアクセス**にチェックを入れ、パスワードを入力して**次のステップ**をクリック
![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/184582/3d9721ce-98b1-8b98-0946-421568e19191.jpeg)
5．**グループの作成**をクリック
![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/184582/d861b857-fb45-3265-6fbc-2ef0f69ba729.jpeg)
6．**グループ名**を入力し、**AdministratorAccess**にチェックを入れて**グループの作成**をクリック
![07.JPG](https://qiita-image-store.s3.amazonaws.com/0/184582/a51e1952-793a-b84f-4319-9cdf3d19ae0a.jpeg)
7．**次のステップ**をクリック
![08.JPG](https://qiita-image-store.s3.amazonaws.com/0/184582/78b4eed0-6a3e-9df7-dd21-9311584e7e4c.jpeg)
8．タグの必要性はよくわからないので適当に入力するか空欄で**次のステップ**をクリック
![09.JPG](https://qiita-image-store.s3.amazonaws.com/0/184582/4d3c50f8-b09b-bd40-19b4-3ec8297070cd.jpeg)
9．**ユーザーの作成**をクリック
![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/184582/f74aa6ba-2c29-a7b9-5cd3-7263c4e6ce88.jpeg)
10．完了
![13.jpg](https://qiita-image-store.s3.amazonaws.com/0/184582/a9046c64-867c-db23-2af1-5ee1d8d07f35.jpeg)

# 二段階認証の導入
1.　[IAM](https://console.aws.amazon.com/iam/home)のページにアクセスして左側のメニューから**ユーザー**をクリック
2.　設定するユーザーを選択
![15.jpg](https://qiita-image-store.s3.amazonaws.com/0/184582/bb9d3d08-aa71-3d04-82b8-ce7ea066af6e.jpeg)
3.　**認証情報**タブに移動し、**MFAデバイスの割り当て**の**管理**をクリック
![17.jpg](https://qiita-image-store.s3.amazonaws.com/0/184582/f00f6772-cdab-d21b-7c34-acac95f0052e.jpeg)
4.　ここではAuthenticatorを使うことを想定しているので**仮想MFAデバイス**を選択し、**続行**をクリック
![19.jpg](https://qiita-image-store.s3.amazonaws.com/0/184582/a4b59ebb-6b20-9553-e5ed-4219326b0e1d.jpeg)
5.　AuthenticatorでQRコードを撮影し、MFAコードを2回連続入力して完了
![21.jpg](https://qiita-image-store.s3.amazonaws.com/0/184582/5f416e47-5892-3d94-274c-2b26b3494a90.jpeg)
python3 標準入力 まとめ

# はじめに
python3 標準入力まとめです。
paizaの問題などでよく使いそうなものをまとめています。

## 1行に要素1個

#### 単語1個
```:入力
aiueo
```

```python:main.py
hoge = input()

print(type(hoge))
print(hoge)
```

```:出力
<class 'str'>
aiueo
```

#### 整数1個

```:入力
100
```

```python:main.py
hoge = int(input())

print(type(hoge))
print(hoge)
```

```:出力
<class 'int'>
100
```

## 1行に要素n個
1行に複数要素ある場合。
要素間はスペース区切りを想定しています。

#### 単語n個を配列に格納

```:入力
foo bar baz
```

```python:main.py
list = [s for s in input().split()]

print(type(list))
print(list)
```

```:出力
<class 'list'>
['foo', 'bar', 'baz']
```

#### 単語n個を各変数に格納

```:入力
foo bar baz
```

```python:main.py
str1, str2, str3 = [s for s in input().split()]

print(type(str1))
print(str1)

print(type(str2))
print(str2)

print(type(str3))
print(str3)
```

```:出力
<class 'str'>
foo
<class 'str'>
bar
<class 'str'>
fbaz
```


#### 整数n個を配列に格納

```:入力
100 200 300
```

```python:main.py
list = [int(i) for i in input().split()]

print(type(list))
print(list)
```

```:出力
<class 'list'>
['100', '200', '300']
```

#### 整数n個を各変数に格納

```:入力
100 200 300
```

```python:main.py
num1, num2, num3 = [int(i) for i in input().split()]

print(type(num1))
print(num1)

print(type(num2))
print(num2)

print(type(num3))
print(num3)

```

```:出力
<class 'int'>
100
<class 'int'>
200
<class 'int'>
300
```


## n行に要素m個

### n行に整数m個

要素5つ, 3行の入力を想定しています。

```:入力
5 3
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
```

```python:main.py
n, m = [int(i) for i in input().split()]
table = [[int(i) for i in input().split()] for m in range(m)]

print(type(n))
print(n)
print(type(m))
print(m)

print(type(table))
print(table)
```

```:出力
<class 'int'>
5
<class 'int'>
3
<class 'list'>
[[10, 11, 12, 13, 14], [20, 21, 22, 23, 24], [30, 31, 32, 33, 34]]
```
## おわりに
しっかりしたエラー処理などはしていないため、使用の際は気をつけてください。。。

# 参考文献
- [新約:標準入力の受け取りその1(Python3対応版)](https://qiita.com/clarinet758/items/33bed8bb2907c68b5242)
- [Python2で競技プログラミングする時に知っておきたいtips(入出力編)](https://qiita.com/lethe2211/items/6cbade2bc547649bc040)
HadoopYarnクラスター環境構築メモ

HadoopYarnクラスターの環境を構築する時には、色々な疑問点が遭ってしまいましたが、次に間違えなくなる為に、環境構築時の要注意ポイントをメモしてみたいです。
# 環境変数
HadoopYarnクラスターで以下の環境変数が必要となります。

- JAVA_HOME
- CLASSPATH
- HADOOP_HOME
- HADOOP_CONF_DIR
- SCALA_HOME
- SPARK_HOME

# HDFSの起動手順
 HDFSのnamenodeをフォマットします。

```bash　　
$ hdfs namenode -format 
```
　HDFSサービスを起動します。

```bash
$ start-dfs.sh
```

# HDFSの確認方法
　jpsコマンドでHDFSクラスターに以下のノードが起動されていたかどうかを確認する

- Master側：
 - NameNode
　　- SecondaryNameNode
- Slave側：
　　- DataNode
　
　　ブラウザでHDFSクラスターも確認できます。

```bash
http：//master:50070
```
# yarnクラスターの起動手順
　　以下でyarnを起動する

```bash
$　start-yarn.sh
```
# yarnの起動と確認方法
　　jpsコマンドでyarnの稼動状態を確認します。
　　以下のノードが確認できます。

- Master側：
 - NameNode
 - SecondaryNameNode
 -　ResourceManager
- Slave側：
 - DataNode
 - NodeManager

  ブラウザも確認できます

```bash
　　http：//master:8088
```

  Sparkのspark_env.shに設定する変数は以下です
　SPARK_MASTER_HOST=マスターのホスト名
　SPARK_MASTER_PORT＝7077

  Sparkのslaveに設定する変数は以下です
　Masterのホスト名又はIP
　Slaveのホスト名又はIP

# Sparkの起動と確認手順
　以下でSparkを起動する

```bash
$　　start-all.sh
```
  jpsコマンドでSparkの稼動状態が確認できます

- Master側：
 - NameNode
 - SecondaryNameNode
 - ResourceManager
 - Master
- Slave側：
 - DataNode
 - NodeManager
 - Slave

  ブラウザも確認できます

```bash
http：//master:8088
```
Vue.jsでPugを使ってみる

## やること

HTMLが簡単に書けるテンプレートエンジンであるPugをVue.jsで使ってみます。


## 環境構築

#### vue-cliのインストール

VueCLIを使うので入れていない場合はインストールします。  

```
$ npm install -g @vue/cli
```

#### プロジェクトの作成

適当な名前でプロジェクトを作成します。 
--defaultはセットアップをデフォルト設定で行うことを指定するオプションです。  

```
$ vue create pug-test --default
$ cd pug-test
```

#### Pug関連のパッケージのインストール

次にVue.jsでPugを使うために必要なパッケージをインストールします。 
プロジェクトのルートフォルダへ移動したことを確認してから以下のコマンドを実行してください。 
ESLintを無効にしている場合はeslint-plugin-pugを含める必要はありません。

```
$ npm install --save-dev pug pug-plain-loader eslint-plugin-pug
```

## vueファイルでの使い方

さっそく使ってみます。  

src/App.vueを開いて1行目にlang="pug"を追加してください。 
これはtemplateタグ内でPugを使用するという宣言です。

```vue
# App.vue
<template lang="pug>
...略
```

Pugが有効になっているはずなので適当に書いてみます。  

```vue
<template lang="pug">
  div
    h1 This is a Pug example
    #container
      p Hello world!
</template>
```

ファイルを変更して保存したら 
コマンドラインで`npm run serve`としてください。 
ブラウザでlocalhost:8080を開いてきちんと表示されて入れば成功です。 

![image01.png](https://qiita-image-store.s3.amazonaws.com/0/274914/42ea7887-262d-1def-d21d-fce2c0fff6f6.png)
GitBook でドキュメントを書く準備を整える

ちょっと書いてみたくなったのでメモ

# 環境
|ミドルウェア|バージョン|
|:---------|:--------|
|Node.js|10.15.0|
|GitBook cli|3.2.3|

# 手順
1. Node.js をあらかじめインストールしておく
2. GitBook CLI をグローバルにインストールする

    ```
    $ npm install gitbook-cli -g
    ```

3. GitBook コマンドで初期化する

    ```
    $ gitbook init
    ```
    
    新規でディレクトリを作成したい場合は次のように入力する
    
    ```
    $ gitbook init ./<作成したいディレクトリ名>
    ```

4. 現在のディレクトリ（もしくは新規作成したディレクトリ）に新しいファイルが作成されていることを確認する

    ```
    $ ls
    README.md	SUMMARY.md
    ```

5. サーバを立ち上げる

    ```
    $ gitbook serve
    Live reload server started on port: 35729
    Press CTRL+C to quit ...

    info: 7 plugins are installed 
    info: loading plugin "livereload"... OK 
    info: loading plugin "highlight"... OK 
    info: loading plugin "search"... OK 
    info: loading plugin "lunr"... OK 
    info: loading plugin "sharing"... OK 
    info: loading plugin "fontsettings"... OK 
    info: loading plugin "theme-default"... OK 
    info: found 1 pages 
    info: found 0 asset files 
    info: >> generation finished with success in 0.4s ! 
    
    Starting server ...
    Serving book on http://localhost:4000
    ```

## 確認
ブラウザから次のURLにアクセスして、画面が表示されればOK

```
http://localhost:4000
````

# 注意事項
- GitBook CLI は今後アクティブな開発は行われない(アナウンスがあった)

# 参考
- [Setup and Installation of GitBook](https://toolchain.gitbook.com/setup.html)
- [CLI toolchain](https://docs.gitbook.com/v2-changes/important-differences#cli-toolchain)
Backlog World 2019 Report

##[Backlog World 2019](https://backlogworld2019.jbug.info/) に参加してきました。

### 久々の秋葉原
秋葉原は久々でした。昔は毎週のように遊びに行っていたのですが、随分雰囲気が変わりました。
![IMG_1397_20.jpg](https://qiita-image-store.s3.amazonaws.com/0/309141/82470d08-5c38-0e6a-c236-65230622a213.jpeg)

秋葉原 UDXにての開催。（ビル風が強い…）
![IMG_1398_20.jpg](https://qiita-image-store.s3.amazonaws.com/0/309141/174e956e-43f4-681d-32cd-f5c2fa84fab6.jpeg)


### Backlog との出会い
Backlog は、仕事で出会い、問題の管理の仕方など使いがっての良さでのめり込んでしまいました。
JBUGというコミュニティがあり、そちらからこの Backlog World を知った、という感じです。


その様子を個人の感想を交えながらお伝えできれば、と思っております。（拙い部分もあるかも、ですが、その辺はご容赦を）

### どんなイベント？？？
**[スケジュール](https://backlogworld2019.jbug.info/#schedule)** にもありますように、３つのＲｏｏｍで
講演であったり、イベントだったり、が開催されており、気になる講演、イベントに任意で参加できます。
「-プロジェクトマネジメント×働き方改革-」というサブタイトルが付いていることから、
プロジェクトのマネージメントに関するお話、
プロジェクトにおけるBacklogの位置づけであったり
それを取り巻く環境、ツールなどのお話もありながらも、
「APIを使うには…」のような開発者寄りな内容もあったり、
自分に合った内容を選択できるのはとても良いと思います。

集まった人は…2～300人は居たんじゃないかな…と思うくらい大盛況でした。

![開会式前](https://qiita-image-store.s3.amazonaws.com/0/309141/4d0678be-8e48-e0ab-955b-7a301982c2b4.jpeg)

私は以下の講演を聞いてきました。

- 基調講演「田舎の木材工場で起きた奇跡」と、その後。
- 「連絡板」が支える、Backlog嫌いなクライアントとのコミュニケーション
- 小さなチームの全員マネジメントな日常
- Backlogでわかる炎上の見分け方、消し方
- カスタマー・リレーションとエンジニアを繋ぐBacklog
- "男女不問？！"女性脳を活かしたプロジェクトマネジメント
- スペシャルセッション「スーパーマリオで学ぶプロジェクトマネジメント」

敢えて、それぞれについての詳細は書かないことにします。

### 胃の腑に落としてみると…
それぞれの内容を自分なりに胃の腑に落としてみたところ、以下のようになりました。

- ユーザに対する成功体験を感じてもらう。
    - それは、小さなことからでも。
        - 成功体験を積み重ねることで、ユーザは成長する。
    - 説明書よりも、体験型、チュートリアルのようなものが大切。
    - わかりやすさ、直感は大切です。
        - それは「色」という視覚的なところから、人の心理的なところまで、幅広いアプローチが有効。

> 確かにそうですよね。
うちの母は、全くコンピューターなんて触れません（興味すらない）でしたが、
家族と連絡するため「Facetime」を使っている間に、iPhoneを使いこなせるまでになりました（！）
今では、逆に「そんな使い方するんだ！？」と感心することもしばしばです。
これも「成功体験」の結果の一つだと思います。

- 疑問を「どうして？」を突き詰めること、とても大切。

- プロジェクトマネージメントを全員一丸となって成功に導いていくことが大切。

- Backlogチケットの鮮度を保ちながら、断捨離のできる管理人が大切。
    - 極端な話、チケットが無駄になっても良いと思えるくらいな思想・環境を用意しても良いのかもしれない。

- ツールの利用についてのルール化が大切。きちんとルールに沿って使う。
    - 計画、実施を少しずつでも見えるようにする。
        - プロジェクトのエンドまでが明確になる。
        - 期間に収まらない場合でも、納得いく形でのトレードオフができる。
    - Chatwork、Slack と共用している場合など、社内、社外と言った使い分けも有効。

> 全員が納得できるルールを決めることは難しいし、それ以前に当たり前なところもありますが、とても大切なことですね。

- 「計画性」「表現力」「合理性」がマネージメントでは大切になっていく？？？
- 男性脳、女性脳というけど実はあまり関係ない？？？

> 実に興味深いですね。
「計画性」「表現力」「合理性」を鍛えていきたいですね。

それ以外にも気が付くことがありました。
それは
**　　みんなどんな感じに Backlog 使ってる？？？**
です。
隣の席の人とお話することがあったのですが、
　「どんな使い方しているのか参考になれば良いな、と思い参加しました」
のようなことをお話されてました。

実際に質問コーナーでは、
　「多量のチケットを発行したときのチケットの陳腐化はどうしてる？」
　「そもそもどうやって登録している？」
　「計画通りにいかない場合は、そのチケットたちはどうする？」
と言った実務に沿った質問が多かったような気がします。
（良いアイディアを取り入れたいのはみんな同じでしたね😄）

### まとめ
普段の視点とは全く異なる視点の内容だったので、
　「目から鱗」
　「なるほど、納得！！🖲🖲🖲」

本当に勉強になりました。

Backlog World 2019 は終了しましたが、
JBUGという勉強会が、全国各地で開催されているようです。
ご興味があればぜひ参加してみるのも良いのかな、と思いました。

新しい扉が開く…かも？しれませんよ。

### おまけ
お昼には「まい泉の豚ヒレ」お弁当がでて幸せ💛
![IMG_1401_20.jpg](https://qiita-image-store.s3.amazonaws.com/0/309141/8dbfeb08-544a-6ed2-2859-baf03a2c5f2c.jpeg)
![IMG_1402_20.jpg](https://qiita-image-store.s3.amazonaws.com/0/309141/5650c3fd-de4d-53d7-5295-49989695ba34.jpeg)
Node.jsでGoogle Cloud Speech-to-Text API用のストリームデータを作成する

2019/01/27時点においては、モジュール内部の設定を変更しないと動かないというやっかいな状態だったのでメモ
APIに送る部分をファイルストリームにすればファイル保存もできます

## 1. [SoX](http://sourceforge.net/projects/sox/files/latest/download)のバイナリにパスを通す

録音をするために必要なプログラムです。
上記リンクからバイナリをダウンロードして、インストールディレクトリにパスを通します
以下のようにバージョンが表示されれば大丈夫です

```
> sox --version
sox:      SoX v14.4.2
```

## 2. モジュールのインストール
SoXをNode.jsから使うためのモジュール　node-record-lpcm16と
Cloud Speech-to-Text APIを使うためのモジュール　@google-cloud/speechを
npmでインストールします

```
> npm i node-record-lpcm16
> npm i @google-cloud/speech
```

## 3. node-record-lpcm16を修正する
node-record-lpcm16 v0.3.1では設定値に問題があるようなので、node-record-lpcm16/index.jsを直接修正します

27行目からのcase文を以下のように変更します

```javascript
case 'sox':
      var cmd = 'sox';
      var cmdArgs = [
        '-q',                     // show no progress
        '-t', 'waveaudio',        // audio type
        '-d',                     // use default recording device
        '-r', options.sampleRate, // sample rate
        '-c', options.channels,   // channels
        '-e', 'signed-integer',   // sample encoding
        '-b', '16',               // precision (bits)
        '-t', 'wav', // この行を追加する
        '-',                      // pipe
        // end on silence
        'silence', '1', '0.1', options.thresholdStart || options.threshold + '%',
        '1', options.silence, options.thresholdEnd || options.threshold + '%'
      ];
      break
```

## 4. サンプルを実行する

以下のサンプルを実行します

```javascript
// Imports the Google Cloud client library
const speech = require('@google-cloud/speech');
const record = require('node-record-lpcm16');

// Creates a client
const client = new speech.SpeechClient({
    projectId: '自分のプロジェクトID',
    keyFilename: 'サービスアカウントキーのjsonパス',
});

const encoding = 'LINEAR16';
const sampleRateHertz = 16000;
const languageCode = 'ja-JP';

const request = {
    config: {
        encoding: encoding,
        sampleRateHertz: sampleRateHertz,
        languageCode: languageCode,
    },
    interimResults: false, // If you want interim results, set this to true
};

// Create a recognize stream
const recognizeStream = client
    .streamingRecognize(request)
    .on('error', console.error)
    .on('data', data =>
        process.stdout.write(
            data.results[0] && data.results[0].alternatives[0]
                ? `Transcription: ${data.results[0].alternatives[0].transcript}\n`
                : `\n\nReached transcription time limit, press Ctrl+C\n`
        )
    );

// Start recording and send the microphone input to the Speech API
record
    .start({
        sampleRateHertz: sampleRateHertz,
        // Other options, see https://www.npmjs.com/package/node-record-lpcm16#options
        verbose: false,
        recordProgram: 'sox', // Try also "arecord" or "sox"
        silence: '0.5',
    })
    .on('error', console.error)
    .pipe(recognizeStream);


console.log('Listening, press Ctrl+C to stop.');
```

### 実行結果例

```
Listening, press Ctrl+C to stop.
Transcription: 音声認識のテストです
```
Azureで仮想マシンを構築する

# はじめに
Microsoftが無料で公開している学習支援サイト「Azure Learn」のもくもく会に参加した。
Azure CLIとAzure Portalを使ってAzure上に仮想マシンを構築したのでその記録を残す。

※ Azure Learn
https://docs.microsoft.com/ja-jp/learn/


# 前提
- Azureのアカウントを持っていること
- Windows 10を使っている

# 仮想マシンの構築 ～CLI編～
## Azure CLIをインストールする
[マイクロソフトの公式サイト](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?view=azure-cli-latest)からAzure CLIのインストーラをダウンロードする。

ダウンロードしたらインストーラをダブルクリックして、指示に従ってインストールする。
以下の画面が表示されたらインストール完了。
![pasted image 0.png](https://qiita-image-store.s3.amazonaws.com/0/178845/c1c7574c-d86a-98fd-0c72-2ddb386a0d92.png)

## Azure CLIにログインする
Power Shell(以下PS)を開いて、下記のコマンドを実行する。

```powershell:powershell
az login
```

## リソースグループを新規作成する
PSで下記のコマンドを実行する。

```powershell:powershell
az group create --name ExampleGroup --location "Central US"
```

## 適当に変数を設定する
PSで下記のコマンドを実行する。
※これはやらなくてもいいけど、繰り返し出てくるので変数にしておいたほうが良い。

```powershell:powershell
$USERNAME=”azureuser”
$PASSWORD=”#P1passwordpasswordpassword”
$RSGROUP=”ExampleGroup”
```
## 仮想マシンを作成する
PSで[az vm create]コマンドを実行する。

```powershell:powershell
az vm create `
--name azureVM `
--resource-group $RSGROUP `
--image Win2016Datacenter `
--size Standard_DS2_v2 `
--location eastus `
--admin-username $USERNAME `
--admin-password $PASSWORD
```

## 作成した仮想マシンの状態を確認する
### コマンドラインから確認する
PSで[az vm get-instance-view]コマンドを実行する。

```powershell:powershell
az vm get-instance-view `
  --name azureVM `
  --resource-group $RSGROUP `
  --output table
```

下記のような結果が返ってくる。仮想マシンが構築されていることがわかる。
![pasted image 0 (1).png](https://qiita-image-store.s3.amazonaws.com/0/178845/c605c44f-ab74-37a9-1e38-bc04bba5473a.png)

### ポータルから確認する
Azureのポータル画面を開いて、リソースグループを表示する。
上記で作成したExampleGroupが作成されていることが分かる。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/178845/232f319b-e3e2-9c6b-7939-765a65b46758.png)

さらに、「ExampleGroup」をクリックする。
仮想マシンが作成されていることがわかる。

# 仮想マシンの構築 ～GUI編～
## Azure Portalのリソースグループ追加画面を開く
Azureのポータル画面にアクセスして、リソースグループ＞追加を選択する。
![0.png](https://qiita-image-store.s3.amazonaws.com/0/178845/4c98e03d-45a3-f367-ee52-80d703f662be.png)

## リソースグループを追加
リソースグループ名を選択して「確認および作成」ボタンを押下する。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/178845/f7b1a419-7292-3ff3-2393-904ac9a4644c.png)

## リソースグループが作成されたことを確認
再びリソースグループ画面を表示し、先ほど追加したリソースグループが表示されることを確認する。
※表示には時間がかかるので、すぐに表示されなくても焦らないこと
![2.png](https://qiita-image-store.s3.amazonaws.com/0/178845/272f7549-17f6-dc37-2a82-2020a264d379.png)

## リソースグループに仮想マシンを追加
リソースグループ画面で先ほど追加したリソースを選択する。
表示された画面で「リソースの作成」ボタンを押下する。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/178845/8c8e70d5-175b-4422-02ed-8d092d5c42cb.png)

## Marketplaceから仮想マシンを選択
Marketplaceが表示されるので、Windows Serverを選択する。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/178845/39de844e-1ad6-3f31-2f7a-749aecdafa75.png)

## 仮想マシンを作成
次の画面で「作成」を押下して、仮想マシンを作成。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/178845/113f5c2a-f84f-4719-ea9f-c98b012683e5.png)

おわり。
processingで雪の結晶を作ってみよう

<h1>はじめに</h1>
はじめまして。Adachiです。

今回はProcessingを使って、クリックすると角の数が増えていく雪の結晶のプログラムを公開しようと思います。

<h3>注意</h3>

ProcessingについてはProcessing3.4のJavaモードを使っています。

<h1>code</h1>

コードは以下のようになります。

```
ArrayList<Koch>koch=new ArrayList<Koch>();
ArrayList<Koch>kochSTK=new ArrayList<Koch>();

void setup() {
  size(800, 800);
  strokeWeight(0);
  stroke(#ffffff);
  fill(255);
  noFill();
  int n=6;
  for (int i=0; i<n; i++) {
    float d=i*TWO_PI/n;
    float r=width*0.37;
    koch.add(new Koch(width/2+cos(d)*r, height/2+sin(d)*r, 
      width/2+cos(d+TWO_PI/n)*r, height/2+sin(d+TWO_PI/n)*r));
  }
  noLoop();
}

void mousePressed() {
    redraw();
}

void draw() {
  background(0);

  beginShape();
  for (Koch k : koch) {
    k.update();
    kochSTK.addAll(k.mkKoch());
  }
  endShape();
  koch.clear();
  koch.addAll(kochSTK);
  kochSTK.clear();

  println("step : "+frameCount);
}

public class Koch {
  float sx, sy, ex, ey;
  public Koch(float sx, float sy, float ex, float ey) {
    this.sx=sx;
    this.sy=sy;
    this.ex=ex;
    this.ey=ey;
  }

  public void update() {
    vertex(sx, sy);
    vertex(ex, ey);
  }

  public ArrayList<Koch>mkKoch() {
    ArrayList<Koch>koch=new ArrayList<Koch>();
    float l=sqrt((sq(sx-ex)+sq(sy-ey)))/3;
    float a=atan2(ey-sy, ex-sx)+PI/3;
    float x=lerp(sx, ex, 1./3.);
    float y=lerp(sy, ey, 1./3.);
    float xx=x+cos(a)*l;
    float yy=y+sin(a)*l;
    koch.add(new Koch(sx, sy, x, y));
    koch.add(new Koch(x, y, xx, yy));
    x=lerp(sx, ex, 2./3.);
    y=lerp(sy, ey, 2./3.);
    koch.add(new Koch(xx, yy, x, y));
    koch.add(new Koch(x, y, ex, ey));
    return koch;
  }
}
```
<h3>実行結果<h3>

![20150301000826.png](https://qiita-image-store.s3.amazonaws.com/0/338044/49392ada-d3a7-12a1-1524-ffeae039bae3.png)
↑クリック6回したときの雪の結晶

<h1>参考文献</h1>
つらねの日記:http://turanegaku.hateblo.jp/entry/2015/03/01/002827
さくっとプログラムのコード行数などを調べる

# 概要
D-ScannerというD言語のコード行数などを調べるツールの使い方メモです。

コード行数だけでなく、シンボルの定義位置を調べたりトークン数やimportしているモジュールなどを一覧で出力したりできます。

全部は調べ切れていないので、よく使いそうなやつだけピックアップします。
便利な使い方などあれば編集リクエストをお願いします。

# 準備
D-Scannerはdubで公開されているツールです。
ソースは[GitHubにある](https://github.com/dlang-community/D-Scanner)ので1からビルドしても良いですが、dub経由が圧倒的に楽です。

要するにdubさえインストール済みなら `dub fetch dscanner` でダウンロード、 `dub run dscanner` で実行できます。
以下、fetchを済ませた前提で実行部分だけ書いていきます。

ちなみに`dub run`で動作させるアプリに引数を指定するときは`dub run dscanner -- --help`のように`--`で区切ってそれ以降に指定します。

# 手順

## 行数を調べる (--sloc)
`--sloc` を指定することでファイルの行数を調べることができます。
フォルダも指定することができるため、dubでビルドが設定してある場合はsourceフォルダを指定すれば良いです。

```bash:ファイル指定の場合
# ファイルのコード行数を調べる
dub run dscanner -- --sloc app.d

# 結果例
app.d:  8
total:  8
```

```bash:フォルダ指定の場合
# dubプロジェクトの行数を調べる
dub run dscanner -- --sloc ./source

# 結果例
./source/app.d: 8
./source/config.d:      26
total:  34
```

## importの一覧を調べる (--imports)
`--imports`を指定するとimportしているモジュールがわかります。

```bash:ファイル指定の場合
# ファイルのimport一覧を調べる
dub run dscanner -- --imports app.d

# 結果例
std.experimental.all
std.experimental.typecons
```

```bash:フォルダ指定の場合
# dubプロジェクトのimports一覧を調べる
dub run dscanner -- --imports ./source

# 結果例
std.experimental.all
std.experimental.typecons
std.json
std.traits
```

## 定義位置を調べる (--declaration/-d)
引数に`-d <シンボル名>`を指定すると定義位置調べられます。
VSCodeのコンソールで実行していれば、ファイルパスをctrl+clickすることで対象のファイルが開けます。
（定義位置に飛ぶのもできそうだけどちょっと書式が違う？）

```bash
# 定義位置を調べる
dub run dscanner -- -d main

# 結果例
./app.d(19:6)
```
Datadog＋DockerComposeでElixir/Phoenixのログをみる

![datadog2.png](https://qiita-image-store.s3.amazonaws.com/0/14363/21c654bc-f4f4-2b5a-ac43-f958689dfbb9.png)

[前回](https://qiita.com/studio23c/items/510a12abd53f3651b5b2)、 DockerCompose使ってElixirの開発環境を作った。基本的に、この環境を使って入れば、どんなOS上で開発を行っていても、エラーは、同じものが出ます。これをAWSなどのインスタンスにアップしてユーザーテストなどをしてもらうんですが、その時のElixir/Phoenixのログを見たい場合、テストする人に、ブラウザのデベロッパツールに出ているものなどを貼ってもらう必要がある。

ただ、送ってもらえない場合は、開発者が自分で、そのエラー状況を再現しないければならない。これは、たまに、難しい・。。環境（動作環境・開発環境＝Docker Compose）は同じものでも、テストした人の状況によっては、再現がめんどくさいなど。そんな時は、テストした**テスト環境（AWS）のエラーログ**をみたくなる。

こんなケースに、ログ収集サービスがある。**Datadog**は、その機能を有している。ログ収集の方法は、[Datadog](https://docs.datadoghq.com/logs/log_collection/docker/?tab=nginxdockerfile)の方に書いてある通りで、docker-compose.ymlへの記述方法も書かれているが、、なんどか聞かれたので、需要があるのかな？と思い、投稿。

```docker-compose.yml
labels:
  com.datadoghq.ad.logs: '[{"source": "phoenix-test", "service": "phoenix-test"}]'
```

ログを出したいサービスのところにlabelsとして、こんな感じに**１つ書いて**おけばいい。

datadogの方では、上の場合を例にとれば、**phoenix-test** という文字でフィルタすれば、見やすくなると思います。
ファイルサーバーの内容をtreeコマンドで一覧に

#はじめに
社内で他方面から仕事の依頼を受けたり、いくつものversionをもつ企画書を扱ったりで、自然とフォルダの中が汚くなっていくことにストレスを感じることありませんか。というか共有フォルダとか、もはや命名ルールとかあっても汚くなりますよね。

あのフォルダどこだっけ。で困りませんか？

#ということで

綺麗にするためには、まずは現状を知ることが大事ですね。今回は現状を知ることだけを記事にします。

[treeコマンドについて](https://qiita.com/kanuma1984/items/c158162adfeb6b217973)


#やり方

共有ファイルに接続する(winとmac両方と載せていきます。)

```bash
> net use \\server01
$ set use \\server01
```
中身を見てみる

```bash
> dir \\server01
$ ls \\server01
```

```bash
> tree \\server01
$ tree \\server01
```

txtファイルに内容を書き込む

```bash
> tree \\server01 > test.txt
$ tree \\server01 > test.txt
```


#おわり

txtファイルの内容を元に、階層構造の整理を行うきっかけになりました
Cognito No integration defined for methodについて

## 初めに

Cognitoを使用中、デプロイ時に

`No integration defined for method`

とエラーが出てくることがある。

この対象法を紹介

## 結論

このエラーは統合リクエストの編集不足でエンドポイント等が存在しないAPIがある可能性が高い
なのでデプロイするリソースのAPIを調べてみて該当するものがないか確認する。

合致するものがあればとりあえずMOCK設定でデプロイしてパスするかどうかを確認する

自分はこれで処理できた

## 終わりに
No integration defined for method
だけじゃなくてどのAPIがエラーなのかも教えてくれると嬉しいな、、、
VBSを使ってIEの操作を自動化する(ページ遷移・フォーム入力・ボタンクリック)

# VBSを使う理由
特にこれという理由はありません。
以前の職場で使っていたのと、調べ物をしているときにIEの自動化の記事を見かけたのでこの言語を選びました。

# 環境
Windows10
VBSを動かすための環境構築などはしてないので、最初から使えるのかもしれません。

## 実現したかったこと

- 勤務先のポータルサイトから開けるメールのページ(Outlook)へアクセスすること

## やったこと

主に以下の3つ。

- IEを開いて目的のページへ飛んだりするページ遷移
- ログインが必要な箇所でのフォーム入力
- フォーム入力後のログインボタンのクリック

## ソースコード

### ページ遷移

**※コードの全部は最後のリンクから飛んだ先に置いてるので、ここでは少し省略してます。**

```automate.vbs

    Dim objIE

    'オブジェクトの作成
    Set objIE = CreateObject("InternetExplorer.Application")
    
    'IEを表示させる。Trueで表示
    objIE.Visible = True 

    '指定したURLを開く
    objIE.Navigate2 "ポータルサイトのURL"

   'ページが読み込まれるまで待つ
    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100        
    Loop

```

### フォーム入力

```automate.vbs

    'IDとパスワードを入力する
    With objIE.document      
    .getElementsByName("loginName")(0).Value = "ログインID"   
    .getElementsByName("password")(0).Value = "パスワード"        
    End With     

    Dim objbutton

    'button要素をコレクションとして取得
    Set objbutton = objIE.document.getElementById("btn_login")     
    
    objbutton.click


```

JavaScriptを書いているのと同じ感じで書けます。
`With objIE.document`のところは、下のようにも書けます。

```tmp.vbs
objIE.document.getElementsByName("loginName")(0).Value
objIE.document.getElementsByName("password")(0).Value
```

今回は`input`要素の`name`に対して`value`を設定していますが、
IDがあればそれを使ったほうが自分にとっては楽です。


### ボタンのクリック

```automate.vbs

    Dim objbutton

    'button要素をコレクションとして取得
    Set objbutton = objIE.document.getElementById("btn_login")     
    
    objbutton.click

```

上記の処理を何度か繰り返して、目的のページにたどりつくといった感じです。
これだけだとあまり恩恵は感じられませんが。。。


## デバッグ用コード

変数の中身などを確認する際に使いました。
ログファイルに値を出力します。

```vbs:automate.vbs

    Sub logging(str)
    
        Dim fso, fi
        Set fso = CreateObject("Scripting.FileSystemObject")
        
        'ファイルを開く
        'もしも存在しない場合には作成する
        Set fi = fso.OpenTextFile("ログファイル名", 8, true)
        
        fi.WriteLine (Date() & " " & Time() & ": " & str) 'ログを書き込む
        Set fi = Nothing
    
    End Sub

```

# ソースコードはこちら

上に書いてあるのを全部くっつけただけのやつです。
https://gist.github.com/itsumoonazicode/6677df4c4286c5637162421bda14d314
人工知能は人間を超えるかを読んだまとめ

# 人工知能は人間を超えるか
読書メモ。[人工知能は人間を超えるか](https://amzn.to/31GBnyG)を読んだので、個人的に大事だと思った箇所をキーワードごとに三行程度でまとめる。

## 人工知能とは？
人間のように考えるコンピューター（著者定義）
研究者によって定義は異なる。

## 人工知能は実現できるか?
できる。
理由は、人間の脳は電気回路と同じだから。

## 人工知能は人間を超えるか
超えるかもしれないし、超えないかもしれない。

## 技術的特異点
人工知能が自分より賢い人工知能を作り始めた地点のこと。
「レイ・カーツワルイ」は技術的特異点は2045年に到来すると主張している。

## 強いAI
正しい入力と出力を備え、適切にプログラムされたコンピューターは、人間が心を持つのと全く同じ意味で、心を持つとする立場

## 弱いAI
限定された知能によって、一見知見な問題解決が行えればよいとする立場

## 第一次AIブーム
コンピューターで「推論・探索」をすることで特定の問題を解く研究が進んだが、複雑な問題が解けないことが明らかになりブームが終了した。

##  第二次AIブーム
コンピュータに「知識」を与えることで、問題を解決しようとする試みが行われたが、知識を書き起こす作業は予想以上に大変でブームが終了した。

## 知識表現
人間が誰でも持っているような知識をコンピューターにどのように表現すれば、処理しやすくなるのか？
ex. 人間には手と足が2本づつある

## オントロジー研究
知識を記述すること自体に対する研究のこと

## is-a 関係
上位下位の関係のこと。下位は上位に属する。
ex. 犬は哺乳類である、いちごは果物である

## parf-of関係
部分があるものに含まれた一部である関係のこと
ex. 手は人間の一部である

## ウェブマイニング
ウェブデータを解析して知識を取り出すこと

## データマイニング
ビックデータを分析して知識を取り出すこと

## ヘビーウェイト・オントロジー
人間がきちんと考えて知識を記述していくためにはどうしたら良いかを考える立場

## ライトウェイト・オントロジー
コンピュータにデータを読み込ませて自動で概念間の関係性を見つける立場

## ワトソン
IBMが開発した人工知能プログラム
ライトウェイト・オントロジーの立場をとり、質問に含まれるキーワードと関連しそうな答えを高速に導くことができる

## 知識獲得のボトルネック
人間が持っている膨大な一般常識をコンピューターに扱わせるには、膨大な知識を扱う必要があり、それは極めて困難であること。

## フレーム問題
コンピューターにとって、あるタスクを実行する時に「関係のある知識だけを取り出してそれを使う」ことが難しいこと。
[参考](https://www.ai-gakkai.or.jp/whatsai/AItopics1.html)

## シンボルクラウンティング問題
コンピューターは記号（文字列・言葉）をその意味するものと結びつけることができない。
ex. 人間なら「シマウマ」を知らなくても、「ウマ」「シマ」がどんなものか知っていれば、実際にシマウマを見たときに「シマシマのウマだからあれがシマウマか」と認識できるが、コンピューターにはそれができない。


## 教師あり学習
「入力」と「正しい出力」がセットになった訓練データをあらかじめ用意して、ある入力が与えられたときに、正しい出力ができるようにコンピューターに学習させる方法

## 教師なし学習
入力用のデータのみを与え、データの中にある一定のパターンやルールを抽出し、データに内在する構造を掴む方法

## ニューラルネットワーク
人間の脳神経回路を真似をして物事を分類する方法

## 機械学習を行う際のデータセット
共通のデータセットを使う。
理由は、プログラムが成功した際に、良いアルゴリズムだったからなのか、たまたまデータが良かったのかわからないからである。
[エムニスト](https://www.codexa.net/cnn-mnist-keras-beginner/)

## ディープラーニング
データをもとにコンピューターが自ら特徴量を作り出す方法
laravel herokuデプロイ時に起きた問題

**あくまで自分用のメモです。**

xamppでのテスト環境時では起きず、herokuの本番環境にデプロイしたら発生したエラーについてメモ。

##1. ReflectionException Class App\Http\Controllers\~~ does not exist

```web.php
//修正前
//Route::post('test/add','vueController@post');

//修正後
Route::post('test/add','VueController@post');

//##VueControllerを呼び出したい##
```

####原因
web.phpからのコントローラー指定の際、コントローラー名の大文字と小文字を間違えるというあり得ないぐらい単純なミス。

xamppでのテスト環境上では小文字のままでも問題なく動いたため、無駄に悩んでしまった。
加えて'v'と'V'という紛らわしいミスで余計に見つからなかったのかもしれない。

別にautoloadがうまくいってないとかhttpsの強制とかsessionの不具合とかpost予約語説とかまｔｔｔｔｔｔｔｔったく関係なかった。

でもどの段階で大小区別が変わったのかはまだ不明。


##2. ページ遷移時に500エラー
laravel標準？のエラーページに飛ばされchromeのコンソールには何も表示されない状態
laravel debugerをheroku上で適用したらはっきりと原因が分かった

```web.php
//修正前
    public function index(){
        return view('layouts.shop.index',compact('valueB'));
    }

//修正後
    public function index(){
        return view('layouts.shop.index',compact('valueA','valueB'));
    }
```
####原因
layouts/shop/index.blade.php上で使用しない変数（今回の場合valueA）をコントローラーから渡すと
`compact(): Undefined variable: valueA`
というエラーが出た。



今後またエラーが発生したら追記

どうしてもうまくいかない問題が発生したら時間を開けてから考え直すと結構解決する。
気持ちを変えたり初心に帰ってからコードを見ると1.みたいな初歩的なものは見つかりやすいかもしれない。
時間があればの話だけど...
Googleがますます進めるAI開発

ここ数年来、メディアでも取り上げられ続けている人工知能、AI。AIの最先端をひっぱる存在としてみなに認識されているGoogleのAI開発は、とどまるところを知らず、最近もオンラインメディアに取り上げられています。まずは、自然言語処理の最新モデルBERT。人間を上回るスコアをあげたということで注目されています。また、AlphaGoで囲碁の世界チャンピオンをやぶったDeepMindが次に挑戦しているのがゲームの世界。それから2018年8月にGoogleが発表したガイドラインに関する記事も取り上げます。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/](https://www.techcrowd.jp/related/)


#[Google最新技術「BERT」と「東ロボ」との比較から見えてくるAIの課題](https://hbol.jp/179474/5)

ハーバー・ビジネス・オンラインにフリーのITコンサルタント鳥谷氏が投稿している記事です。

GoogleのAIチームが先日発表した、ディープラーニングを使った自然言語処理の最新モデルがBERTが話題になっていますが、BERTおよび東ロボを題材にあげて、最近またよく見うけられる「AIが人類を超える日が近づいている」という声に対して、それは違うという説明をしている記事です。

BERT(Bidirectional Encoder Representations from Transformers )はディープラーニングを使った自然言語処理の最新の実装です。文書比較、質問回答、固有表現抽出など、11種類の自然言語処理ベンチマークで従来の記録を塗りかえました。SQuADというベンチマークシナリオでは人間を上回る精度を記録しています。これらの結果を、少ない学習データ環境で高い性能を出せるファインチューニングと呼ばれる実装で出した点も高く評価されています。

多様なベンチマークで従来の記録を上回る結果を叩き出しているだけでなく、人間を上回るベンチマークスコアを出したこともあり、「BERTの読解力が人間を上回った」とか、「AIが人類を超える日が近づいている」という声もまたメディアでもいろいろ見受けられるようになっています。

しかし、BERTが人間を上回るスコアを出したといっても、特定の定められたシナリオで人間より精度の高い結果を出した」に過ぎず、この結果を持って人間の汎用的な読解力と比較することは出来ないと解説してくれています。また、AI技術について『人間に選択肢決定の判断材料を提供する新しい道具』というのが今のAI技術に対する適切な位置付けとまとめてくれています。鉄道・自動車のような機械からコンピュータ・電卓のようなものまで、移動手段や計算速度としては人間を上回っても、人間の道具に過ぎないのと同じように、現在のAI技術は道具に過ぎず、それらをうまく使えるようになることが重要になるようです。


#[DeepMindのゲームAI「AlphaStar」、StarCraft IIでプロゲーマーに完勝。しかし条件平等化で1敗を喫す](https://japanese.engadget.com/2019/01/25/deepmind-ai-alphastar-starcraft-ii-1/)

engadget日本版の記事です。Google(Alphabet)傘下のAI開発子会社Deepmindが、囲碁AI「AlphaGo」で人間のチャンピオンを破った後、こんどはAIでコンピューターゲームに挑戦することにしている活動をレポートしています。

新たに開発されたAI「AlphaStar」は、リアルタイムストラテジーゲーム「StarCraft II」で人間と対戦するものとして開発されたゲームAIです。AlphaStarは人間のプレイヤーによるプレイ記録をまず学習し、そのAIを2つに分割して
さらにそれぞれを互いに対戦させて鍛え上げ、1週間の学習期間中これを繰り返すことで、AlphaStarはStarCraft IIを200年分訓練したとされています。

そしてAlphaStarはプロゲーマーと対戦し10戦全勝としました。ただし、AlphaStarは人間のプレイヤーに対して有利な点があったため、人間と対等の条件となるように修正して再び対戦したところ、プロゲーマーが勝利。この先、AphaStarと人間との戦いがどのような展開をみせるのか楽しみです。


#[2018年AI動向：Google『AI利用に関する原則』公開：軍事・国際法・人権に反する利用を禁止](https://news.yahoo.co.jp/byline/satohitoshi/20181231-00109705/)

Yahooニュースの2018年12月31日、大晦日に掲載された記事です。2018年のAIの動向を振り返って、一番インパクトのあったこととして、Googleのスンダー・ピチャイCEOがブログにて発表したGoogleの『AI利用に関する原則』(ガイドライン)を取り上げています。

Googleが2018年6月にこのようなガイドラインを発表した背景として、まずは2017年9月に米国防総省（DoD)とGoogleが契約した「Project Maven」で、GoogleのAI技術と画像認識技術をDoDに提供。それらの技術が軍事ドローンに利用される可能性があるということで社内外から批判を浴びたことを紹介しています。さらに2018年4月にはGoogleの3000人以上の社員が、このDoDとの契約に反対する請願書にサインしてピチャイCEOに提出しています。

そして「AI利用に関する原則」として2018年6月に公表されたガイドラインは以下の7つ。
１．社会に貢献できる利用（Be socially beneficial）
２．不公平な偏見が生じる利用をしない（Avoid creating or reinforcing unfair bias）
３．安全な開発設計とテスト（Be built and tested for safety）
４．説明責任を果たす（Be accountable to people）
５．プライバシーの保護（Incorporate privacy design principles）
６．研究成果の標準化と知識の共有（Uphold high standards of scientific excellence）
７．有害な利用の制限（Be made available for uses that accord with these principles）

さらに、ピチャイCEOはGoogleとしてAIを利用しない4つの領域を明らかにしています。
１．有害な事象を発生させる可能性のある技術
２．人間に危害を与えることを目的とした武器、その他の関連技術
３．国際的なプライバシー規範に反する監視のための情報収集に利用する技術
４．国際法と人権の原則に反する技術

AI技術において世界一の研究開発と技術力、商用サービスへの取組が一番進んでいるGoogleがAI利用原則を示したことのインパクトは大きかったようです。
「ただいま」ボタンを作ってみました

我が家の日々のコミュニケーションを簡単にしてくれる「ただいま」ボタンを作ってみました。
「ただいま」ボタンの使い方、作り方に関して簡単にご紹介します。


###なぜ「ただいま」ボタンが欲しいと思ったのか？
仕事の関係で、夫婦別々に暮らしていて、日々のコミュニケーションツールとしては、主にLINEを使用しています。
毎日、家に帰った時に「ただいま」のメッセージを送りあっているのですが、スマートフォンのLINEでメッセージを送ろうとすると、下の図のように、1メッセージ送るのに最大7回の操作を行う必要があります。
毎日のことなので、結構面倒だなと思い、もっと簡単にする方法はないかなあと考えていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/232585/d6565018-cda9-3d0b-a4e4-5a9cac8e5c17.png)


###ボタン押したらメッセージが送れます！
ボタンを押してメッセージを送ることができたら、手軽なのではと考えました。ボタンを使えば1回ボタンを押すだけでメッセージが送れます！
下図の上段が「ただいま」ボタンがない場合と、下段が「ただいま」ボタンがある場合のイメージ図です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/232585/f4412df0-a5a2-b49b-4344-48bfcc92ff47.png)



##MESHのボタンタグとSORACOM LTE-M Button
前から気になっていた、[MESHのボタンタグ](http://meshprj.com/jp/tag/MESH-100BU-Button.html)と[SORACOM LTE-M Button](https://soracom.jp/products/gadgets/aws_button/)をボタンデバイスとして使ってみました。
ボタンに合わせてアーキテクチャは2パターン作成致しました。

###Case1
- MESHボタンタグは単体では通信機能を持ちません。そのため、通信できるデバイスも合わせて使用する必要があります。
　現状はとりあえずWindows版のアプリで試してみました。実際の運用を考えると、別のデバイスに切り替える必要あり。
- LINEへの通知はLINE BOTを使用しています。BOTを追加したグループを作成し、そのグループトークにメッセージを送信しています。
- ボタンから通知を受けて、メッセージを送信するところは、IFFTとAzure Functionsの[LINE Bot C# Template](https://marketplace.visualstudio.com/items?itemName=pierre3.LINEBotCSharpTemplate)を使用しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/232585/ee6e728f-1e30-9d17-0141-43ea2db8602a.png)


###Case2
- SORACOM LTE-M Buttonは単体で通信機能を持っているので、MESHボタンのように中継デバイスが不要です。
- ボタンから通知を受けて、メッセージを送信するところは、AWS Lamda経由でCase1のAzure Functionsを呼び出しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/232585/dd7710e9-acc8-a77c-bc6d-7a785b0e435e.png)

##実際に導入してみて
実際に作って日々のコミュニケーションに取り入れてみています。ボタンを1回押すとメッセージが送れるので、もともと解消したかった課題も解消され、便利に使っています。

##類似のサービス
作った後に調べてみると、同じようなサービスとして、[Qrio ただいまキット](https://first-flight.sony.com/pj/qrio_tadaimakit)を見つけました。こちらを見て、今回作った「ただいま」ボタンは、子供の帰宅通知や、離れて暮らす親子の見守りにも便利に使えるのかなと思いました。
ScalaでMapのmapの挙動の注意点

知らなかったのでメモ。

Mapのmapメソッドは、mapに渡す関数の返り値型によって、mapの返却値の型はMapになるときとListになる時がある。
この違いに気づかず若干ハマった。

# 結論
調べた範囲では、map(f: A => B)とすると、以下結論になる。

- B がタプルもしくはc -> dの形の場合はmapの返り値はMap
- B がそれ以外の場合は返り値はList

# 例
以下、同じMapのmapメソッドでも、map1, map2はMap型、list1はList型として変える。

```scala
object MapConversion extends App {
  val newMap = Map("1" -> 1, "2" -> 2, "3" -> 3)

  val map1 = newMap.map {
    case (_, value) => (Math.random(), value)
  }

  val map2 = newMap.map {
    case (_, value) => Math.random() -> value
  }


  val list1 = newMap.map {
    case (_, value) => value
  }

  println(map1) // => Map(0.15985975180002765 -> 1, 0.6619101600969522 -> 2, 0.18256060363818238 -> 3)
  println(map2) // => Map(0.31876372630036387 -> 1, 7.773814391255351E-4 -> 2, 0.2837391028402594 -> 3)
  println(list1) // => List(1, 2, 3)
}
```

ソースを見て挙動を確認したいが難しいので諦める。
NodejsでSlackにメッセージ投稿(2019年1月版)

本家の説明 => https://api.slack.com/methods/chat.postMessage

```postMsgToSlack.js
  const SLACK_TOKEN = 'ここにトークンを入力'; 
  const CHANNEL_ID = '投稿したいチャンネルのIDを入力';
  const USER_NAME = '投稿する際のユーザーネームを入力';
  const msg = '投稿したいメッセージ';

  const request_promise = require("request-promise");
  
  const res = await request_promise({
    uri : 'https://slack.com/api/chat.postMessage',
    method : "POST",
    headers : {
    	'content-type' : 'application/x-www-form-urlencoded',
    	'charset' : 'utf-8' 
    },
    form : {
      token: SLACK_TOKEN,
      channel: CHANNEL_ID ,
      username: USER_NAME ,
      text: msg
    },
    json : true
  });

  console.log(res);
```
【VirtualBox】Windows 7のISOイメージファイルから検証環境を作成する

# はじめに
以前、Windows 7の検証環境として、かって Modern.IE と呼ばれていた [Free Virtual Machines](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/) があるわけですが、これは英語版かつEnterprise版なんですよね。
以前、別ブログにて「[「modern.ie」の日本語化対応について](http://blogs.wankuma.com/yaju/archive/2014/01/18/328348.aspx)」の記事を書きましたが、それとて作成するのが面倒くさい。5年前の記事ですから今も通じるかどうか分かりません。自分はその当時のスナップショットを保持しています。

「[WinFormsでChromiumブラウザコンポーネント(CefSharp)を使ってみる](https://qiita.com/yaju/items/97b61d0d8bc3f9ed044d)」で、ほぼ初期状態のWindow 7のPC上に最低限の.NET Framework 4.6とVisual Studio 2015 の Visual C++ 再頒布可能パッケージをインストールした状態だとアプリケーションの終了時に落ちてしまう現象が発生し、調査することにしたのですが、Modern.IEの検証環境では正常終了してしまいます。

そこで古いPCの実機を潰して、Windows 7のライセンスを確保しました。

# Windows 7のISOイメージの取得
マイクロソフトではプロダクトキーがあれば該当する製品(例 Windows 7 Professional SP1)のWindows 7のISOイメージファイルをダウンロードできるようにしてくれています。
https://www.microsoft.com/ja-jp/software-download/windows7

“Windowsを再インストールしたいけど、インストールメディアが見つからない！”場合に便利、このダウンロードサイトからは、Windows 7、Windows 8.1、Windows 10が入手可能です。
 [WindowsのISOイメージファイルはここからゲット！ Microsoft公式のダウンロードサイト](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1158790.html)

【2022/06/20追記】
サポートが切れたため、マイクロソフトのサイトからISOイメージファイルのダウンロードできなくなっています。
アーカイブサイトからならダウンロードが可能です。

https://archive.org/details/win-7-pro-sp1-japanese

## プロダクトキーの取得
[Windows 7 のプロダクトキーの探し方](https://support.lenovo.com/au/ja/solutions/ht500032)

# VirtualBoxでISOイメージから作成
Windows版のVirtualBoxを使用します。
VirtualBoxがインストールされていない場合、下記サイトから取得してインストールしてください。
https://www.virtualbox.org/

1. 「新規」アイコンボタンをクリックします。
2. 仮想マシンの名前を付けバージョンをWindows 7の対象bit数に合わせて「次へ」ボタンをクリックします。
3. メモリーサイズは、今回は2048MByte に変更して「次へ」ボタンをクリックします。
4. ハードディスクは「仮想ハードディスクを作成する。」を選択して「次へ」ボタンをクリックします。
5. ハードディスクのファイル・タイプは「VDI(VirtualBox Disk Image」を選択して「次へ」ボタンをクリックします。
6. 物理ハードディスクにあるストレージは「可変サイズ」を選択して「次へ」ボタンをクリックします。
7. ファイルの場所とサイズは、デフォルトの仮想マシンの名前と32.00GBにして「作成」ボタンをクリックします。
8. 仮想マシンを作成したら「起動」アイコンボタンをクリックします。
9. ISOイメージファイルを選択します。
10. 以降は画面の指示に従って進めることでWindows7がインストールされます。

# Windows 7の起動後の設定
## 画面サイズを大きくする
画面サイズの初期値は、800 x 600 となっているため、デスクトップ上で右クリックし「画面の解像度」を選択して、1024 x 768 などに変更します。

## VirtualBox GuestAdditionToolのインストール
ホストOSとファイル共有やクリップボードの双方向やドラッグアンドドロップの双方向が出来るようにするために、VirtualBoxのファイルメニューの「デバイス」メニューから「Guest Addition CD イメージの挿入」を選択してクリックします。
以降は画面の指示に従って進めてください。

クリップボードの双方向やドラッグアンドドロップの双方向にしたのに機能しない場合、VirtualBox仮想マシン上で動いているVBoxTray.exeを一旦終了させ、`C:¥Windows¥System32¥VBoxTray.exe` をダブルクリックして起動し直します。

# スナップショット
スナップショットとは、簡単に説明すると仮想環境の状態を丸ごとバックアップする機能です。
スナップショットを作成しておくと、その状態にいつでも戻すことができます。

※スナップショットの分だけ容量が多く取られるので、ディスク容量はチェックしておきましょう。急に一時停止状態になっていると思ったら容量が足りなかったです。

## 作成
VirtualBoxのファイルメニューの「スナップショットの作成」をクリックします。スナップショットの名前と説明の入力画面が表示されるので、状況が分かる名前と説明を入力して「OK」ボタンをクリックします。
 
## 復元
VirtualBoxマネージャーで対象の仮想マシンを選択して「マシンツール」アイコンを選択すれば、スナップショットの状態がツリー構造で表示されます。対象のスナップショットを選択して「復元」アイコンボタンをクリックします。

### 仮想マシンを閉じる時
仮想マシンを閉じる際に、仮想マシンの電源オフの配下に「現在のスナップショット (直前のスナップショット名) に復元」のチェックボックスがあり、チェックを付けておくと常にスナップショット状態で復元されます。

# 最後に
Modern.IE の時には、仮想ハードディスクをダウンロードする形式だったため、ISOイメージファイルから検証環境を作成するという発想がなかったんですよね。
Ubuntu とかISOイメージファイルから仮想マシンを作成したので、Windowsだって出来るのではないかと調べたらMac版の記事が見つかったので出来ることを確信しました。

これにより、Chromiumブラウザコンポーネント(CefSharp)の異常終了したところでスナップショットをとって何度か試すことで原因を解決することが出来ました。