OmniAICreator/Qiita-1.07M huggingface dataset:
社内AWS勉強会に参加してみた

AWSについて右も左もわからない2年目社員が、社内AWS勉強会に参加してみましたので、内容を紹介させて頂きたいと思います。

社内で開催されたAWS勉強会は初心者向けで、全く知識のない私でも概要を理解し、最終的には多少AWSを業務で扱えるようになりました。
下記に社内AWS勉強会で学んだことを非常ーーに大まかにですがまとめておきたいと思います。

## 社内AWS勉強会で学んだ内容
- VPC、EC2の概要
- VPC、EC2ハンズオン
    - プライベートネットワーク内でのサーバ構築法
- S3の概要
- S3ハンズオン
    - S3を用いたオブジェクトのCRUD
    - S3のバージョニング機能
    - パケットポリシー設定
    - 署名つきURLの発行方法
- RDSの概要
- RDSハンズオン
    - DBインスタンスの作成方法
- DynamoDBの概要

"最終的には多少AWSを業務で扱えるようになった"と先述しましたが、例えばVPC、EC2の基礎知識、S3やDynamoDBの扱い方など、本勉強会で習得したことを思い出しながら業務に活かすことができました。
中でもVPC・EC2のハンズオンで学んだサーバー構築法が、直近で最も活用できたと思います。
･･･という事で、次項にプライベートネットワーク内でのサーバ構築法をまとめておきます。

## プライベートネットワーク内でのサーバ構築手順
### VPC作成
1. VPCダッシュボードから"VPC"を選択し、"VPCの作成"をクリック
2. 名前はユニークに定める
3. IPv4アドレスの範囲を"10.20.0.0/16"に設定する。

### プライベートサブネット作成
1. VPCダッシュボードから"サブネット"を選択し、"サブネットの作成"をクリック
2. 名前はユニークに定める
3. VPCは前項で作成したものを選択する
4. IPv4アドレスの範囲は、VPCで定めた範囲に収まるものに設定する。(例：10.20.2.0/24)

### ルートテーブル作成
1. VPCダッシュボードから"ルートテーブル"を選択し、"ルートテーブルの作成"をクリック
2. 名前はユニークに定める
3. VPCは前項で作成したものを選択する
4. 作成後、下画面の"サブネットの関連付け"タブを選択し、前項で作成したサブネットと関連付ける

### EC2作成
1. EC2ダッシュボードから"EC2"を選択し、"インスタンスの作成"をクリック
2. 該当のインスタンスタイプを指定する
3. "インスタンスの設定"では、VPCとサブネットを前項で作成したものに設定する
4. "セキュリティグループの追加"では、パブリックネットワークに置かれる踏み台サーバからのアクセスを許可するため、ssh(22番ポート)を許可するよう設定しておく(踏み台サーバについては後述の"プライベートネットワークサーバ構築確認"内の"踏み台サーバの作成"にて記載)
5. 上記設定が完了したら、作成ボタンを押下しインスタンスを作成する
6. 作成時にキーペアの選択が表示されるため、新しいキーペアを作成し、ダウンロードしておく

## プライベートネットワークサーバ構築確認
### 踏み台サーバの作成
プライベートネットワークサーバに接続するための踏み台サーバを作成する。

#### パブリックサブネット作成
1. VPCダッシュボードから"サブネット"を選択し、"サブネットの作成"をクリック
2. 名前はユニークに定める
3. VPCは前項で作成したものを選択する
4. IPv4アドレスの範囲は、VPCで定めた範囲に収まるものに設定する。(例：10.20.3.0/24)

#### インターネットゲートウェイ作成
1. VPCダッシュボードから"インターネットゲートウェイ"を選択し、インターネットゲートウェイを作成する
2. 作成したインターネットゲートウェイをチェックし、"VPCにアタッチ"を選択する
3. 前述で作成したVPCを選択する

#### ルートテーブル作成
1. VPCダッシュボードから"ルートテーブル"を選択し、"ルートテーブルの作成"をクリック
2. 名前はユニークに定める
3. VPCは前項で作成したものを選択する
4. 作成後、ルートテーブル作成画面の下画面にある"ルート"タブを選択し、前項で作成したインタネットゲートウェイをターゲットにしたルートを作成する
5. 下画面の"サブネットの関連付け"タブを選択し、前項で作成したサブネットと関連付ける

#### EC2作成
前述した"EC2作成"と同様の手順で作成する
(セキュリティグループについては、社内LAN等限定的な回線から接続する場合は設定すること)

### ツールを用いて接続確認
TeraTermやPuTTY等のツールを用いて、踏み台サーバへログイン後、プライベートサーバに接続できるかを確認する(接続方法の詳細についてはこちらでは割愛)

## まとめ
AWSに限った話ではありませんが、やはり本勉強会は座学だけではなくハンズオンを行ったことで、各サービスがどのような役割を果たしているのか理解できたのではないかと思います。実践する事は大事だなと再認識しました。
今後も本勉強会で学んだことを振り替えつつ、業務等でAWSを活用していきたいと思います。
FirebaseAnalyticsのBigQueryからDAU・新規ユーザー数を取得しちゃうよ


FirebaseAnalyticsはクエリAPIがないので、FirebaseAnalyticsのデータを外部で使いたい場合は、BigQueryでSQLを実行して取得しなくてはなりません。
以下は、Firebaseのプロジェクトにおいて、東京時間（UTC+9)に設定していることを前提にしています

関連記事: [BigQueryのSQL入門 ~データ参照する上で押さえておきたい3つの基本+α~](https://qiita.com/vankobe/items/e53d6838312ed98bb3ee)

## 日毎のアクティブユーザー数（DAU）を取得するSQL

```
#standardSQL
select 
 _TABLE_SUFFIX AS day,
 count( distinct user_dim.app_info.app_instance_id)
from
`プロジェクトID.データベース名.app_events_*`
where _TABLE_SUFFIX BETWEEN '20171221' AND '20171225'  group by _TABLE_SUFFIX order by _TABLE_SUFFIX
```

## 日毎の新規ユーザー数を取得するSQL

```
#standardSQL
select 
 DATE(TIMESTAMP_ADD((TIMESTAMP_MICROS(user_dim.first_open_timestamp_micros)), interval 9 HOUR)) AS day,
 count(distinct user_dim.app_info.app_instance_id)
from
`プロジェクトID.データベース名.app_events_*`
where _TABLE_SUFFIX BETWEEN '20171221' AND '20171224' group by day order by day
```

## Firebase Analytics最高！
Google Analyticsだと大金を払わないと生データをもらえないんですが、firebaseならBig Queryの使用量だけで生データを参照できるので、他カスタムなKPIも似た感じで取得できますね^^
Enjoy
Symfony3.4でのBundle追加手順

## 環境

- LinuxまたはMacOS
- PHP 5.6以上
- Composer
- Symfony 3.4

## Bundleの追加
`AdminBundle`という管理画面用のBundleを追加する例で記載します。
手順は[公式サイト](https://symfony.com/doc/master/bundles/SensioGeneratorBundle/commands/generate_bundle.html)の通りですが、オプションを指定すると次のように1行で生成できます。

```bash
# コンソールで実行
php bin/console generate:bundle --namespace=AdminBundle --format=annotation --no-interaction
```

## composer.jsonへの追加
次のような文章が表示された場合、composer.jsonを修正する必要があります。

> The command was not able to configure everything automatically.  
> You'll need to make the following changes manually.  

composer.jsonファイルはSymfonyプロジェクトの一番上の階層にあります。
編集内容は次のサンプルの３行目のように、
`"AdminBundle\\": "src/AdminBundle",`
を追加します。

```json:composer.json
"autoload": {
    "psr-4": {
        "AdminBundle\\": "src/AdminBundle",
        "AppBundle\\": "src/AppBundle"
    },
```

その後、次のコマンドを実行します。

```bash
# コンソールで実行
composer dump-autoload
```
VivadoでシミュレーションするTclスクリプト

#はじめに

Xilinx 社のFPGA開発環境の Vivado、いちいち GUI でマウスボタンをポチポチするのは面倒です。
Vivado は Tcl スクリプトでバッチ処理が出来るので、決まり切った仕事なら Tcl スクリプトを書いて処理させたほうが楽です。
この記事では、Vivado でシミュレーションするTclスクリプトを解説します。

#環境

 - Xilinx Vivado 2015.4
 - Xilinx Vivado 2016.4
 - Xilinx Vivado 2017.1
 - Xilinx Vivado 2017.2

#Tclスクリプトの説明

##1 プロジェクトを開く

このスクリプトではすでにプロジェクトが作られていることを前提にしています。
変数 project_name にプロジェクト名を、変数 project_directory にプロジェクトのあるディレクトリを設定しておきます。
この例では、project_name に "project" を、project_directory にTclスクリプトのあるディレクトリを指定しています。

```Tcl:simulation.tcl
set project_directory   [file dirname [info script]]
set project_name        "project"

open_project [file join $project_directory $project_name]
```

##2 実行時間を設定する

シミュレーションする実行時間(runtime)を設定します。設定しない場合は、Vivado のデフォルト値である 1000ns が設定されます。

```Tcl:simulation.tcl
set_property -name {xsim.simulate.runtime} -value {1000ns} -objects [get_filesets sim_1]
```

シミュレーションが明示的に終了されるまで無限に実行する場合は次のように all を指定します。

```Tcl:simulation.tcl
set_property -name {xsim.simulate.runtime} -value {all} -objects [get_filesets sim_1]
```

##3 シミュレーションを実行する

```Tcl:simulation.tcl
launch_simulation
```

##4 プロジェクトを閉じる

```Tcl:simulation.tcl
close_project
```

#Tclスクリプトの実行

## Vivado のバッチモードで実行する

Tclスクリプトを Vivado のバッチモードで実行する場合は次のようにします。

````
shell% vivado -mode batch -source simulation.tcl
````

##Vivado の GUIモードから実行する

Tclスクリプトを Vivado のGUIモードから動かす場合は次のようにします。

````
Vivado > Tools > Run Tcl Script... > simulation.tcl
````

#Tclスクリプトサンプル

```Tcl:simulation.tcl
#
# simulation.tcl  Tcl script for simulation
#
set project_directory       [file dirname [info script]]
set project_name            "project"
#
# Open Project
#
open_project [file join $project_directory $project_name]
#
# Set runtime
#
set_property -name {xsim.simulate.runtime} -value {all} -objects [get_filesets sim_1]
#
# Run Simulation
#
launch_simulation
#
# Close Project
#
close_project
```

#参考

- [VivadoをGUIを使わずに実行するためのTclスクリプト達](http://qiita.com/ikwzm/items/a0120079d2f7f86a5904)
スケジュールを引くということをEASYに考える

# スケジュールの組み方を知らない人

忙しくなれば、なるほどスケジュールの組み方が雑になる。。。
ざっくり２日あればいけるか・・・とかざっくり４日ないとやばいかな・・・？みたいな
すぐにスケジュール引けと言われたときもそうなる

# スケジュールの引き方基礎

とにかく細かく工数を出す
どんなに忙しくても工数を出す。。。
それをしないと、タスクを振られる側としては、納得がいかないもの
（自分もそう思ってた）

結果的に適当になんとなくでアサインしまくったハリボテのスケジュールでは、
メンバーのやる気を減退させてしまう

**PMの立場になってなんとなくこっち側の気持ちもわかった気がする**

# とにかく工数を出すって？

例えば、なんらかの登録画面があったとして、
その画面の提供する機能レベルで箇条書きする。

- 登録
- 削除
- 外部APIとの連携(GET)
- 画像アップロード

上記の箇条書きしたものに対して、それぞれ工数を出していく

- 登録 = 6h
- 削除 = 3h
- 外部APIとの連携(GET) = 1h
- 画像アップロード = 3h

計13h = 1日(8h)と5h
つまり１日と半日かければ、実装が完了する。

このレベル感で、スケジュールを組めば、
なぜこの画面あるいは機能に、このスケジュールを組んだ根拠になるので、
メンバも納得あるいは、指摘しやすい。

**これをもって必ずメンバにレビューしてもらう**

結局、現場でやってる人の意見も聞き入れないと、机上の空論となってしまうからだ。

# 期間によって見せ方を変える

長期のスケジュールであるなら、
縦軸が期間、横軸がタスクレベルで切ると見やすい

短期のスケジュールであるなら（1ヶ月とか）
縦軸が期間、横軸が人のほうがわかりやすい

# まとめ
- 各スケジュールに対して、細部まで血を通わせて工数を算出する
- 差し込みで入ってくるような緊急タスクも考えながら、時間を確保しておくことが大事
- 全然根拠がないスケジュールで、終わるわけないじゃん。な雰囲気が一番やばい

血を通わせたスケジュールでも終わるわけないという結論が出たならば、
どれくらいの期間伸ばしてほしいというのが打診できる。
交渉を行うまでに必要な道筋というわけです。
OmiseGo SDKの残高

# OmiseGo SDKの残高

残高システムについてと、どう使うのかを記載。
下記を参照。
https://github.com/omisego/ewallet/blob/develop/docs/design/balances.md

## 残高システムへの理解

残高は、特定の鋳造トークン(暗号通貨/ロイヤリティ/ポイント/コイン)の量数を保持するために使われる。
保持は、これらの量数が実際に、どのレコードにも保存されていないため、見積もりの範疇であり、
それらは、ローカル台帳から複式簿記をつかって、貸方と借方の合計を差し引き、計算されて求められる。
残高は、eWalletデータベース内に保持され、データベースレベルでの一貫性を保つため、写像がローカル台帳に作成される。
これらの台帳には、アドレス、名前、識別子の３つのフィールドがある。


- **address(アドレス)**: 残高に金銭を送るために使われる残高ID

- **name(名前)**: 特定の残高を識別するための修正可能なフィールド、デフォルトでは、識別子には名前がつかわれる。

- **identifer(識別子)**:現在のアカウントまたはユーザ内でのタイプやユニークな識別子
  - `genesis`,`burn`,`primary`,`secondary:#{uuid}`を含めることができる。
  - `genesis`残高は、必要であれば遅延作成される。主要な残高は、ユーザやアカウントのために作られる。(口座も、使い終わった残高を持つことができる。)
  - 現在のアカウント/ユーザの中では、値はユニークであるべきであり、アカウントは主要と、使い終わった残高のみもつことができる。複数のセカンダリー残高は、生成されたUUIDを加えて、作成することができる。`genesis`残高は、関連するユーザや口座はもっていなく、単独で動く。
  - セカンダリー残高は今のところ利用できない。代わりの残高(例として、違う銀行の口座)をつくることができ、主要アドレスの変更も可能である。

## 鋳造プロセス

鋳造する際、トークンは、`genesis`(唯一複式簿記台帳にマイナスから始めることが許されている)残高から取得でき、マスター口座の主要残高に転送できる。(ひとつのeWalletにマスターアカウントはひとつ)。これにより、管理者は、主要残高から、他のアカウント口座へ転送することができる。

## 特定のアカウントからの貸方/借方勘定

貸方または借方の処理(入出力)をする際、`account_id`パラメータを使い、利用されている口座を明記することができる。与えられた口座の主要残高は、貸方の場合は、金銭の取り出しに使われ、借方の場合は、金銭が戻るときに使われる。デフォルトでは、アカウントは明記されていなく、マスター口座が使われる。
Angularで作るER DIAGRAM TOOL - 第十四回　Export JSON

今回は、Export JSON機能。
流れとしては、
・navbarのExport JSONをクリック
・モーダルが開く
・ダウンロードボタンを押してダウンロード
となります。

では、開かれるモーダルダウンロードから。

##（１）モーダルダウンロード

/src/app/modal-download/modal-download.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/aedce01e34f26747b19e1f0ecf72fc42a6065a0f#diff-a92da9eaef0bd78db9a049f376bcc7f1

/src/app/modal-download/modal-download.component.html
https://github.com/dog-ears/er-diagram-tool/commit/aedce01e34f26747b19e1f0ecf72fc42a6065a0f#diff-12d124f7e7d163dc41c5259d7ca56f0f

/src/app/app.module.ts
https://github.com/dog-ears/er-diagram-tool/commit/aedce01e34f26747b19e1f0ecf72fc42a6065a0f#diff-fc6b22833aeaf77f8440c4970ade705e

・ModalDownloadComponentのimport

次はnavbarから開く処理

##（２）navbar

/src/app/navbar/navbar.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/aedce01e34f26747b19e1f0ecf72fc42a6065a0f#diff-12468dba4acc93d6788c4f72b2b89a70

・DomSanitizerをimport、そしてDIする
・ModalDownloadComponentをimport

以上です。
次回は、エクスポートしたデータを読み込む機能を追加する予定です。
Angularで作るER DIAGRAM TOOL - 第十三回　many-to-manyのリレーション作成の実装

##（１）many-to-manyのリレーションシップ作成機能

/src/app/service/data.service.ts
https://github.com/dog-ears/er-diagram-tool/commit/b9911a0a182ff33d0dc910910baad7dc71c11cea#diff-ae990bb302f27e60323deb45d6746b17

・addManyToManyRelation()の中身を実装

・新しくできるpivotモデルの名前は、
source_model.name + target_model.name
または、
target_model.name + source_model.nameとなります。
※どちらが先に来るかは、昇順で決まります。

また、pivotモデルは、
[source_model.name]_id と [target_model.name]_idという名前の２つのschemaを持ちます。

![cap13_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/4ccf088f-76fd-52a4-24b2-6c9708d9f7ae.jpeg)

これで、many-to-manyリレーションシップの実装も完了しました。
次回は、Export JSON を実装します。
Angularで作るER DIAGRAM TOOL - 第十二回　one-to-manyのリレーション作成の実装

##（１）リレーションシップ用のschema追加

one-to-manyリレーションシップ作成の流れは以下の通り。

・モデルのendPointから別のモデルのendPointにドラッグドロップ（実装済み）
・リレーションシップモーダルが開く（実装済み）
・dataServiceで、リレーションシップ用のschemaを追加
・schemaのhtml生成が終わり次第、コネクションの作成。

/src/app/service/data.service.ts
https://github.com/dog-ears/er-diagram-tool/commit/c6b7fa501853122f27855293165a7b1b8af3f43a#diff-ae990bb302f27e60323deb45d6746b17

・addOneToManyRelation()の中身を実装



##（２）schema生成時、削除時にコネクションを追加・削除するよう修正

![cap12_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/401642d3-05ab-0521-f8c2-381579534e7b.jpeg)

カラムは追加されましたが、endPointがずれてしまいました。

次の「schemaのhtml生成が終わり次第、コネクションの作成」のときに合わせて再描画フラグを立てます。
ついでに、削除時の処理も追加しましょう。

/src/app/schema/schema.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/c6b7fa501853122f27855293165a7b1b8af3f43a#diff-153991cc3d6496727ece175d022d38c5

・JsPlumbServiceのimport、DI
・ngAfterViewInit()、ngOnDestroy()から、それぞれjsPlumbService.initSchema()、jsPlumbService.destroySchema()を呼び出し



/src/app/service/jsPlumb.service.ts
https://github.com/dog-ears/er-diagram-tool/commit/c6b7fa501853122f27855293165a7b1b8af3f43a#diff-da7afb11f9169e78d9b5cfea7afcc510

・Schemaクラスのimport
・initSchema()を実装
-- shcema にbelongstoがあるときのみ処理する
-- belongstoに入っているモデル名からモデルを取得するメソッドgetModelByName()が必要になるので、のちほどdataクラスに追加する。
-- コネクションを生成

・destroySchema()を実装
-- shcema にbelongstoがあるときのみ処理する
-- 自分をターゲットにしているコネクションを削除



/src/app/class/data.ts
https://github.com/dog-ears/er-diagram-tool/commit/c6b7fa501853122f27855293165a7b1b8af3f43a#diff-ba726bfa70586322bd593dddb7beaf87

・getModelByName()を実装

![cap12_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/3afc3289-437a-a0e4-5c16-c80ee0581bcc.jpeg)

これでコネクションが生成され、
さらにリレーションシップ用のxxx_idというカラムを削除することで、コネクションも削除されます。

![cap12_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/83072711-5cc1-f5be-f9b3-28afbbf6a414.jpeg)

しかし、コネクション生成後、Sourceとなるモデルを削除すると、コネクションが残ってしまいます。
なので、こちらも修正



##（３）Source Model削除時にコネクションを削除する機能を実装

/src/app/service/jsPlumb.service.ts
https://github.com/dog-ears/er-diagram-tool/commit/579524ff6dfa637b522f0c1e9a6f313bddb662aa#diff-da7afb11f9169e78d9b5cfea7afcc510

・destroyModel()にコネクションを削除する処理を追加



削除コネクション終点にあるschemaのエレメントIDから、shcemaを取得するメソッドgetSchemaByElementId()をdataに実装します。

/src/app/class/data.ts
https://github.com/dog-ears/er-diagram-tool/commit/579524ff6dfa637b522f0c1e9a6f313bddb662aa#diff-15a154169b0b6112f2adcdf51a565ee2

・Schemaクラス読み込み
・getSchemaByElementId()を実装

/src/app/class/model.ts
https://github.com/dog-ears/er-diagram-tool/commit/579524ff6dfa637b522f0c1e9a6f313bddb662aa#diff-15a154169b0b6112f2adcdf51a565ee2

・getSchemaById()を実装

これで、one-to-manyコネクション追加・削除機能の実装が終わりました。
次回は、many-to-manyコネクションを同じように実装していきます。
Python > .egg-info > requires.txt > link: 依存ライブラリを書いておく

球形粒子の散乱コードをNumpy, Scipy, Matplotlib, Shapelyを使って実装したPyMieScattというコードがある。
https://github.com/bsumlin/PyMieScatt

そのパッケージの.egg-infoは下記の通り。
https://github.com/bsumlin/PyMieScatt/tree/master/PyMieScatt.egg-info

requires.txtというファイルがある。ここに必要なパッケージの情報が記載されているようだ。

requires.txtについては下記の情報を見つけた。
http://studio3104.hatenablog.com/entry/2015/04/08/210932
@ Studio 3104::BLOG.new

> 依存ライブラリを書いておく

情報感謝です。



### 余談

http://studio3104.hatenablog.com/entry/2015/04/08/210932
> パーフェクト Python を Kindle で購入しましたが、検索出来ないし文字を選択できないのでコピペ出来なくて大変不便なので、物理版を購入すれば良かったと後悔しております。

こういう残念な電子版は時々遭遇してしまう。
マーキングも付けれない電子版は「持ち運べる」だけの利点しかない。

学習者にとっては、「如何に自分の必要な部分を再度読む時に読みやすくするか」というのが知識の吸収・再利用の点で重要だと思う。残念な電子版ではそれができない。上記の場合、物理板であればそれができる。
PyMieScatt > PKG-INFO > link: v1.0からv1.2の書式 | PKG-INFOの使用例

球形粒子の散乱コードをNumpy, Scipy, Matplotlib, Shapelyを使って実装したPyMieScattというコードがあるようだ。
https://github.com/bsumlin/PyMieScatt

PyMieScatt/PyMieScatt.egg-info/に[PKG-INFO](https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt.egg-info/PKG-INFO)というファイルがある。

これは何か?

検索すると以下が見つかった。v1.0からv1.2(draft)の定義が記載されている。
https://pythonhosted.org/pkginfo/metadata.html

Pythonの公式ドキュメントに以下を見つけた (強調のため一部、太字にした）。
https://docs.python.jp/3/distutils/examples.html
> この呼び出しは、 distutils.core.setup() 関数を実行して name メタデータを読み取っています。ソース配布物もしくはバイナリ配布物が Distutils で作られていたとしても、メタデータフィールドは PKG-INFO という静的なファイルに書かれます。Distutils ベースのプロジェクトが Python にインストールされるとき、 **NAME-VERSION-pyX.X.egg-info 以下にある配布物のモジュールやパッケージと一緒に PKG-INFO がコピーされます**。ここで NAME はプロジェクト名、 VERSION はメタデータで定義されたバージョン、 pyX.X は 2.7 や 3.2 のような Python のメジャーバージョンとマイナーバージョンです。

上記リンク先の下に続くコード(distutils.distのDistributionMetadata())にて使用例がある。

PKG-INFOに定義したパッケージの情報をユーザが読むための仕組みなのだろう。
とりあえず webpack 4 で Babel 6 か 7 を導入する

※ 2018/03/06 現在、正式版の最新が 6 で、ベータ版の最新が 7 です。

# 1. そもそも Babel とは何か

今のブラウザがサポートしていない最新の js のコードをサポートしている js のコードに変換するツール
→コードを便利に書ける
→嬉しい

# 2. 準備

参考「[とりあえず webpack を使ってみる - Qiita](https://qiita.com/kerupani129/items/72c1a8d5ab6dffa70abf)」

webpack は 4 の方が設定が簡単なので 4 で行きます。

```json:package.json
...
  "scripts": {
    "dev": "webpack --mode development --module-bind 'js=babel-loader'",
    "build": "webpack --mode production --module-bind 'js=babel-loader'"
  },
...
```

# 3. インストール

## 3.1. Babel 6

```shell:ターミナル
npm install --save-dev babel-core babel-preset-env babel-loader
```

以下はどちらか 1 つ。

```json:.babelrc
{
  "presets": ["env"]
}
```

```json:package.json
...
  "babel": {
    "presets": ["env"]
  },
...
```

## 3.2. Babel 7

```shell:ターミナル
npm install --save-dev @babel/core @babel/preset-env babel-loader@8.0.0-beta.0
```

※ `@babel/loader` ではなく `babel-loader@8.0.0-beta.0`

以下はどちらか 1 つ。

```json:.babelrc
{
  "presets": ["@babel/preset-env"]
}
```

```json:package.json
...
  "babel": {
    "presets": ["@babel/preset-env"]
  },
...
```

参考「[GitHub - babel/babel-loader at v8.0.0-beta.2](https://github.com/babel/babel-loader/tree/v8.0.0-beta.2)」

# 4. その他

## 4.1. Babel 関係のパッケージについて

- `babel-cli`, `babel-core`
    - コマンドラインから使うか API を使うかでどちらか 1 つを選択
    - 今回は webpack で `babel-loader` から API を利用するので後者
    - 今回は関係ないけど、Babel 7 では `@babel/cli` を使うときに `@babel/core` も必要
- `babel-preset-env`
    - `babel-preset-es2015`, `babel-preset-es2016`, `babel-preset-es2017` が含まれる
    - 設定が色々便利
- `babel-polyfill`, `babel-plugin-transform-runtime`
    - ポリフィル。本記事では説明を書かないけど、たぶん必要
    - どちらを使うか迷うぐらいなら後者の方が良いと思う
    - (babel-preset-env 2.0 でポリフィルできるようになるらしい)
- その他
    - 他にも preset や便利なパッケージが沢山ある (`babel-preset-react` など)
    - ドキュメント参照→「[4.3. ドキュメント](#43-ドキュメント)」

参考「[Babel 7 リリースプレビュー - Qiita](https://qiita.com/ybiquitous/items/3e6fe8a252c6097186a6)」
参考「[babel-polyfillとbabel-runtimeの使い分けに迷ったので調べた - Qiita](https://qiita.com/terrierscript/items/d2a9d5d4daedaacff924)」
参考「[babel-preset-env 2.0のuseBuiltInsを使ってpolyfillする - Qiita](https://qiita.com/shisama/items/88080011bbc69e3e620b)」

## 4.2. babel-loader のバージョンについて

まぎらわしいですが、以下のような対応になっています。

- babel 6 | babel-loader 7
- babel 7 | babel-loader 8

## 4.3. ドキュメント

- Babel 6「[What is Babel? · Babel](http://new.babeljs.io/docs/en/index.html)」
- Babel 7「[What is Babel? · Babel](http://new.babeljs.io/docs/en/next/index.html)」
自分用メモ：コピーからの一手間を減らしたい

メモ用。
```
@echo off
setlocal

set browser="ブラウザのパス"
set search=http://www.google.co.jp/search?q=英和+

mshta.exe "vbscript:Execute("str=window.clipboardData.getData(""text""):CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(str^&""""):close")" > temp
set /P word=<temp
if "%word:~0,4%"=="http" (
  %browser% %word%
) else if "%word:~0,2%"=="\\" (
  start %word%
) else (
  %browser% %search%"%word%"
)

del /q temp
endlocal
```
bash 小技

既にご存知とは思いますが・・業務で自分がよく使う小技を紹介させて頂きます

## 1. ファイル名の末尾に .bak をつけたバックアップファイルを作る (ブレース展開)

`$ cp -a example_file{,.bak}`

## 2. 直前のディレクトリに移動

`$ cd -`

## 3, 直前のコマンドを root で実行

`$ sudo !!`

長いコマンドを打って Permission deneid と言われた時などに・・

## 4. テンポラリファイル作らずにファイルを比較 (プロセス置換)

`$ diff <(sort file1) <(soft file2)`

iptables の設定の確認　`# diff <(iptables-save) /etc/sysconfig/iptables` とかでよく使います

## 5. hisotry から番号を指定して実行

`$ !47`

## 6. ASCII 文字コード表

`$ man ascii`

## 7. 自分のグローバル IP を知る

`$ curl ifconfig.me`

## 8. 直近のコマンドの最後の引数

`$ cd !$`

例えば何かのファイルを移動して、その移動先に移動して何かしたい時とかに使っています
`$ mv example_file ../../../`
`$ cd !$`

## 9. 末尾から最短一致

`${path%/*}`

ディレクトリ名を取得する時とかに
`dirname ${hoge}`でもいいかもしれない


## 10. 先頭から最長一致

`${path##*/}`

 ファイル名を取得する時とかに
`basename ${path}` でもいいかもしれない
macOSでOSクリーンインストールした時に役に立ったTime machineについてメモ書き

OS X El Capitan から macOS High Sierra にOSアップデートした。
ややバッテリーの持ちが悪くなっていたのでクリーンインストールを実施することにした。

>(参考)[MacのOS X High Sierra（ハイシエラ）をカンタンにクリーンインストール（初期化）する方法！](https://takakojima.com/high-sierra%EF%BC%88%E3%83%8F%E3%82%A4%E3%82%B7%E3%82%A8%E3%83%A9%EF%BC%89%E3%82%92%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)

基本的には事前にバックアップを取っていたため問題は発生しなかったが、
iTunesづてにiBooksに連携していたpdfファイルが正常にバックアップが取れていないことにアップデート後に気づいた。
※iBooksのファイルは通常のFinder運用しているとわからないところに格納されています。

>/Users/USER/Library/Containers/com.apple.BKAgentService/Data/Documents/iBooks/Books

LibraryがFinderだと見れないです。
気づかずにクリーンインストールしちゃったのでもう私のMacには残ってません・・・

そこで・・・

### **Time machine から復元！**

できたのでメモ書き。

OS更新前後で同一のユーザ名を使用していたら問題なくTime machineの機能で復元できたのかもしれないが、ユーザ名も変更していたためTerminalからコマンドを用いて頑張りました。

### 1.まずは当時のユーザと同一のユーザ名のアカウントを作成。
普通に「システム環境設定」の「ユーザとグループ」から作成。

### 2.Terminalからsuコマンドで作成したユーザからログインしてTime machineのファイルを捜索
`su USER`
別ユーザログイン

`cd /Volumes/TimeMachine/Backups.backupdb/PC_Name/YYYY-MM-DD-hhmmss/HDD_Name/Users/USER/hogehoge`
TimeMachine内を捜索
**※USER以下のフォルダがsuログインしていないと権限不足で閲覧できません！**

`cp sourceHogehoge /foo/bar/tergetHogehoge`
ファイルのサルベージ

`exit`
ログアウト

これでTimeMachineの個人フォルダ内にあった他ユーザからは権限不足でサルベージできないファイルがサルベージできました。

めでたしめでたし。
Windows10 にApacheを導入する

#1.はじめに
こんにちは、こむぎです。AmazonEc2で動かしているサーバ上で、DBを触りたい。
DBを触るにあたり、検証やたたき台等の用途でローカルな環境でもDBをいじれたらいいなと思っています。そこで、ローカル環境のWindows10にMysqlを導入して、ローカルな環境でDBをいじれるようにしていこうと思います。今回は、Mysql導入に必要なApacheを導入していきます。

#2.この記事のゴール
Winbows10にApacheをインストールし、ブラウザで[http://localhost](http://localhost/)にアクセスしてapacheの初期画面が表示されるところまで。

#3.環境・各アプリケーションVer
OS:Windows10
Apache:httpd-2.4.29-Win64-VC15


#4.手順
##4-1.Apacheのインストール
###4-1-1.Apacheのダウンロード
Apacheの[リンク](https://www.apachelounge.com/)からhttpd-2.4.29-Win64-VC15をC:/apache配下にダウンロードして解凍

###4-1-2 Apacheのインストール
cmd [control]+[shift]+[enter]同時押しで管理者権限でcmd実行

```
c:/apache/httpd-2.4.29-Win64-VC-15/Apache24/bin>httpd -k install
```

```conf:
Installing the 'Apache2.4' service
The 'Apache2.4' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.
httpd: Syntax error on line 37 of C:/apache/httpd-2.4.29-Win64-VC15/Apache24/conf/httpd.conf: ServerRoot must be a valid directory
```
インストールは成功したが、どうやらhttpd.conf内で参照している各パスが正しくないためテストがうまくいってない模様。
httpd.confのバックアップをしたうえでコンフィグ編集を行う。

###4-1-3.httpd.confの編集
```conf:httpd.conf
ServerRoot "c:/Apache24"
↓
ServerRoot "C:/apache/httpd-2.4.29-Win64-VC15/Apache24"

DocumentRoot "c:/Apache24/htdocs"
↓
DocumentRoot "C:/apache/httpd-2.4.29-Win64-VC15/Apache24/htdocs"

<Directory "c:/Apache24/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
↓
<Directory "c:/apache/httpd-2.4.29-Win64-VC15/Apache24/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
</Directory>

<IfModule alias_module>
 ScriptAlias /cgi-bin/ "c:/Apache24/cgi-bin/"
</IfModule>
↓
<IfModule alias_module>
 ScriptAlias /cgi-bin/ "c:/apache/httpd-2.4.29-Win64-VC15/Apache24/cgi-bin/"
</IfModule>


<Directory "c:/Apache/cgi-bin">
↓
<Directory "c:apache/httpd-2.4.29-Win64-VC15/Apache24/cgi-bin">
```

###4-1-4httpdをstartさせる。

```
c:/apache/httpd-2.4.29-Win64-VC-15/Apache24/bin>httpd -k start
```

```
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using [ipv6 address]
Set the 'ServerName' directive globally to suppress this message.
```
何やらエラーのような文字列が。調べると、
「サーバのドメイン名を確実に検出できなかったので、ipv6のアドレスを代わりに使用していますよ。このメッセージを表示させなくするには、サーバにグローバルなドメイン名を設定してくださいね」というようなニュアンスでした。

###4-2.ブラウザアクセス
ブラウザにてhttp:/localhost/ にアクセス

以下の画面が表示されていれば、Apacheのインストールは無事完了です。

![localhost-itworks-20180306.PNG](https://qiita-image-store.s3.amazonaws.com/0/124676/b92bc476-b4bf-a33b-8669-0bad69e52c04.png)

#5.最後に
今回はWindows10にApacheを導入してみました。httpd.confのパス部の編集が面倒であればディレクトリをhttpd.confに合わせる形のほうがより早いかもしれませんね。自分に合った環境でお試しください。
次回は、Windows10にPHPを入れてみます。
では、お疲れさまでした。
業務でよく使う git コマンド best 10


他に有益な記事がたくさんあると思いつつ、自分のメモから投稿させて頂きます・・

## 1. 直近のコミットメッセージがイマイチだったので修正

`$ git commit --amend`

## 2. 直近のコミットの内容がイマイチだったのでやり直し

`$ git reset HEAD~1`

## 3. コミット履歴のファイル名だけちょっと知りたい

`$ git log --stat`

## 4. コミット履歴の詳細を知りたいぞ

`$ git log -p`

## 5. ゴミファイルを削除したい

`$ git clean -n` もしくは `$ git clean --dry-run` して
`$ git clean -f`

(ちなみに `$ git clean -fd` でディレクトリも削除できるよ！)

## 6. 他の開発者のリモートブランチをローカルにチェックアウト

`$ git checkout -b local-branch-name origin/remote-branch-name`

## 7. 改行コードを無視して差分を見たいんだが・・

`$ git diff -w`

## 8. リモートで削除されたブランチをローカルでも削除 (掃除)

`$ git fetch --prune` もしくは `$ git fetch -p`

## 9. 所々の理由で topic branch の patch を作って誰かに送ろう

`$ git diff master..topic > topic.patch`

(ちなみに patch 適用する時はリポジトリ直下で `$ patch -p1 < topic.patch`)

## 10. git で実行権限も付けられればエラーにならないのになあ・・

`$ git update-index --add --chmod=+x script.sh`
VRYoutuber環境構築のときのメモ（走り書き）

大手（企業がバックについている）以外のVtuberはだいたい服とかの貫通はしょうがないって感じ。
結構HMDを使わないで、facerigだけを利用してVtuberを名乗り認められている実況者もいる。
モデルにバーチャル空間でなりきる方法は大体ググればでてくるので、以降はそのような基礎的な部分でなく、躓く部分の解説をしていく。

#モデルになったときの関節の動きを制御する

Humanoid型ボーンを入れたモデルリグにFinal IKを入れて、rHandやlHand、HeadTargetを設定すれば、動くっちゃ動く。でもそれは、腕の可動域が決められてないので、人間には到達不可能な角度までグルングルン回せてしまう。ここでだいぶ躓いた。Rotationを制限したいのに、Mayaなどでのpdx作成において制限を加えてもUnityにfbxへと変換すると正常に作動してくれない。
海外のフォーラムを読み漁ってようやく発見した（見落としていた。。）
RotationLimitってFinal IKにあったんでござるね。。。
でもこのLimit、なんか４種類あるからどれを使えば良いのかわからんし、どこにアタッチすれば良いのかも不明だった。
はい、これ見ろ。
https://www.youtube.com/watch?v=b7EgN0X-TsI
なるほど、わかったがわからん。

なんかできた。↓
![できたわ.PNG](https://qiita-image-store.s3.amazonaws.com/0/234198/1d1a3f55-2d77-444a-703a-52e71c7b52e5.png)


左右の肘、及び手首にFinal IK のRotationLimitHingeをつけてやり、それぞれのMin、Maxを人間の動くであろう可動域に設定してやる。これで「手首がグルングルン」やコントローラーを後ろに持っていったときに「肘が９０度に後ろに曲がる」といった妖怪も阿鼻叫喚な事象は防げそう。
未だにわかっていないのは、「肩の可動域ってどうやって設定すればいいんだろう」ということ。
人間の骨の動きって、１つの動きに連動して他の骨も微調整のために動くっていう複雑な仕組みだから、それを再現するのマジムリ…リスカしょ…ってなるわな。
暇な時に海外のフォーラム漁っときます。。
改定後のOracle Master Silver 12c 受けました。

そして撃沈しました。


今回の敗因
・クラムメディアに頼って黒本の学習をしなかったこと。

試験に出たもの
​
＞よく出た
RMAN
data pump(インポートエスクポート）
外部表
SQL*LOADER エクスプレスモード含む
SQL*LOADER ロードモード

＞出た
CREATE DATABASE LINK
SHUTDOWN ABOUT
PMON
SMON
DBWR
LGWR
バックグラウンドプロセス
サーバープロセス
共有サーバー構成
表領域
表圧縮
フラッシュバック
データベースインスタンス
ネーミングメソッド
排他行ロック
プロファイル
メデャインスタンス
ローカルネーミング
バックアップ（レベル1,0)
リモートデータベースジョブ
スケジューラ
軽量ジョブ
アーカイブログ
アップグレード（１こ）
アラート・ログ・ファイル
インスタンス起動・停止 モード
インスタンス障害
REDOログ
共有サーバー
高速リカバリ領域
ジョブチェーン
ALTER TABLE
ALTER TABLE XXXX RETENTION
ALTER SYSTEM
PFILE
SPFILE
RELOAD
自動セグメントアドバイザ
シュリンク（縮小）
CREATE TABLE SPACE
バックグラウンドプロセス
Oracle Net
ORA-01555
UNDO表領域
RETENTION XXXX
SHOW PARAMETER UNDO
ログライター・DBライター
チェックポイント発生のタイミング
（インスタンスリカバリの発生も含めて）
ディスパッチャ
DDLロギング


クラムメディアは試験科目によって高い的中率を誇りますが、当試験（1z0-062)では全く役にたちません！

初めから黒本で学習した方がよっぽどよいです。

というわけで、現在コツコツと再試験に向けて黒本で勉強中です。。

2018/04/28 追記　-----------------------------------------------

進展あったので追記します。
Silver 12cの合格は諦めてSilver11g（1z0-052)を受験した結果、無事合格しました。

正解率86%でした。

Silver11g(1z0-052)についてはクラムメディアの的中率は結構高かったです。
しかし自分の場合、BronzeDBAを12cでとってしまっていたため、Silver11g取得者として認定されるには、Bronze11gを取得する必要があるということを、試験合格後に知りました。。(ややこしい。。）

という訳で、現在Gold11g合格に向けて試験勉強中です。
（Gold11g合格後、DBA11gを受験予定です。）
ViewPager + Tablayoutとこれらを使わないFragmentを１つのActivityで入れ替え。

単位取得より広告収入の方が嬉しいみんめです。今回もAndroid関連です。

タブ付きViewPagerと、タブ無しFragmentレイアウトの共存。

#構造
- ナビゲーションドロワー
- include
    - toolbar
    - tabLayout(TabLayout)
        - TabItem
        - TabItem
    - fragment_container(Fragment Container)
    - viewPager(ViewPager)

ここで、TabLayout + ViewPagerを使うレイアウトと、TabLayoutなしで単にFragmentを表示したレイアウトを、別のアクティビティを用意しないで使います。

#Visibility
ViewPagerを使う場合。

```kotlin:setViewPager.kt
  private fun setViewPager() {
        val adapter = PagerAdapter(supportFragmentManager)
        fragment_container.visibility = View.GONE
        tabLayout.visibility = View.VISIBLE
        viewPager.visibility = View.VISIBLE
        viewPager.adapter = adapter
        tabLayout.setupWithViewPager(viewPager)
    }
```

使わない場合。

```kotlin:showFragment.kt
private fun showFragment(fm: Fragment) {
        if(viewPager.visibility == View.VISIBLE) viewPager.visibility = View.GONE
        if(tabLayout.visibility == View.VISIBLE) tabLayout.visibility = View.GONE
        fragment_container.visibility = View.VISIBLE
        supportFragmentManager.beginTransaction()
                .add(R.id.fragment_container, fm, FragmentTag.name).commit()
}
```

パーツのvisibilityを設定してあげて切り替えるよってだけです。
View.VISIBLEが見えて使える状態。
View.GONEが消えてる状態。

勝手な先入観（？）で、TabLayout+ViewPagerレイアウト用にアクティビティ新しく作ったりしてツールバー周りでおかしくなったりしてたのでメモ。
Wordで複数ページ表示を右→左にする方法

#背景
Wordで縦書きの文書を作成する際等、複数ページ表示が左→右だと不便な場合があります。

![見辛い2.png](https://qiita-image-store.s3.amazonaws.com/0/242148/7aa44af4-61f8-d6d0-6e12-0ef105f2d659.png)

これを解決する方法を検索すると、アラビア語等の言語を追加して、
[Wordのオプション]から文書の表示を変更するといった方法が見つかります。

しかし、ページ表示を反転するためだけに言語を追加するのはイケてないし、
UIの色んなとこにアラビア語のオプションが表示されてしまいダサいので、別の方法を考えます。

#とりあえずVBAで解決
何かいい方法がないかなーと調べると、Application.Dialogsオブジェクトを利用してダイアログ設定ができるらしいのでこれを利用します。

下記は、実行毎に複数ページ表示を右→左・左→右に切り替えるSubプロシージャです。

```vba:Normal.dotm
Sub 文書の表示方向を切り替える()
    With Dialogs(wdDialogToolsOptionsBidi)
        .DocViewDir = (.DocViewDir + 1) Mod 2
        .Execute
    End With
End Sub
```
これをNormal.dotmの標準モジュール内等にコピペして、クイック アクセス ツールバーに追加すれば
いつでも複数ページ表示を切り替えることが出来ます。
Azure上のUbuntu VMにDjangoプロジェクトをデプロイする

## 0. この記事について
Djangoで作ったホームページを公開しようと思い、Microsoft Azure上に仮想マシンを作ってデプロイした。その時の方法を記録する。

## 1. VMを作る
・Azure Portalから、Ubuntu Server 16.04 LTS の仮想マシンを作成した。
・そのままでは、再起動の度にIPアドレスが変わるため、静的なIPを設定するかDNS名を設定する。ここでは、後者にした。VMの「概要」→「パブリックIPアドレス」のアドレスをクリック→「DNS名ラベル」のところにラベルを入力。名前は、ここでは仮に`myapp.japaneast.cloudapp.azure.com`とする。
・ネットワークの設定をする。「ネットワーク インターフェイス」の「受信ポートの規則」で、「HTTP」を追加する。

### 2. VM上にプロジェクトを持ってくる
・プロジェクトのディレクトリは、VM上の`/home/user/myproject`にあると仮定する。
・プロジェクト内にある`wsgi.py`に次の行を追加する。

```python
import sys
sys.path.append('/home/user/myproject')
```
・やらなくても動くが、`settings.py`で`DEBUG = True`となっているところを`DEBUG = False`にしておく。
・`settings.py`で、`ALLOWED_HOSTS`の中に、Azureで設定したホスト名`myapp.japaneast.cloudapp.azure.com`を入れる。独自ドメインを使う場合は、それも入れる。
・`/home/user/myproject/`に、`virtualenv ENV`や`python -m venv ENV`で作った仮想環境のフォルダ`ENV`があると仮定する。

## 3. VM上にApacheを入れる
・`sudo apt-get install apache2 libapache2-mod-wsgi-py3`として、Apacheなどをインストールする。
・次のように、`/etc/apache2/sites-available/000-default.conf`を編集していく。
・staticとwsgiの設定をする。

```
<VirtualHost *:80>
    ...
    Alias /static /home/user/myproject/static
    <Directory /home/user/myproject/static>
        Require all granted
    </Directory>

    <Directory /home/user/myproject/myproject>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
</VirtualHost>
```
・その下に、さらに3行追記する。

```
<VirtualHost *:80>
    ...
    </Directory>

    WSGIDaemonProcess myproject python-path=/home/user/myproject/ENV/lib/python3.6/site-packages
    WSGIProcessGroup mysite
    WSGIScriptAlias / /home/user/myproject/myproject/wsgi.py
</VirtualHost>
```
`python-path`は、`ENV`で使っているpythonのバージョンなどに応じて書き換える。
・次に、ターミナルで権限関係の設定をする。
`chmod 664 ~/myproject/db.sqlite3`
`sudo chown :www-data ~/myproject/db.sqlite3`
`sudo chown :www-data ~/myproject`
・`sudo service apache2 restart`をする。

## 4. その他
・`error.log`や`access.log`は`/var/log/apache2`で見れる。
・[Djangoのドキュメンテーション](https://docs.djangoproject.com/ja/2.0/howto/deployment/wsgi/modwsgi/)には、`httpd.conf`を編集するデプロイ方法が書かれているが、Ubuntuの場合、これに相当するファイルは`/etc/apache2/apache2.conf`のようだ。今回は、これは編集しなかった。

## 5. 参考
・[How To Serve Django Applications with Apache and mod_wsgi on Ubuntu 14.04](https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-ubuntu-14-04)
・[Microsoft Azureの仮想マシンにAzureサブドメイン（DNS名ラベル）を設定する方法](http://zuvuyalink.net/nrjlog/archives/2926)
AWS CloudTrail の S3 Bucket を管理するなら専用のバケットがおすすめ

# tl;dr

* みんな大好き AWS CloudTrail
* IasCODE が流行だから CloudTrail も Ansible か Terraform で管理してみよう
* Bucket が多くなると管理が大変だから、terraform の backend と AWS Config と同居させてやろう
* ダメだった。今のところ単独のbucketにしてしまっておくのがよさそう
* ってことがどこにも見当たらなかったのでメモとして残す

# Want

* Ansible で S3 Bucket A を作成（プライベートバケット１つ）
* terraform で A に対して以下をそれぞれ管理、設定
    * terraform の backend
        * prefix に tf
        * ライフサイクルなし
    * AWS CloudTrail の出力先
        * prefix に cloudtrail
        * ライフサイクル3段（standard->glacier->delete）
    * AWS Config の出力先
        * prefix に config
        * ライフサイクル3段（standard->glacier->delete）
* CloudTrail と Config はグローバルイベントも単一のバケットに送れる
* terraform も同様に指定したリージョンでどこからでも使える
* なので、prefix で分けてあげればバケットが雑多にならなくていいかと思った。ライフサイクルもprefixで分けられるし。

# Why not

* terraform の backend として S3 を使う場合の Bucket を作成する（ansible）
* 作成した Bucket を CloudTrail 用のリソース一式を管理する backend にする
    * bucket policy がついてない（ansibleで追加してつけた）
* ライフサイクルイベントつけよう
    * ライフサイクルで31日後に standard 落とし
    * ライフサイクルで93日後に glacier 落とし
    * ライフサイクルで365日後に delete
    * 何回やっても３つセットができない
    * https://github.com/ansible/ansible/issues/30120 おいいいい
* じゃあ terraform でつけよう
    * ライフサイクル後から追加できなくない？
    * https://github.com/terraform-providers/terraform-provider-aws/issues/283 おおおおおおおい
* これじゃあ最初に Ansible で bucket 作って同居させるの無理じゃない？
* むしろそれぞれ別に bucket 作って、必要な設定をそれぞれ書いたほうが自由度が高い（そりゃそうか

# Conclude

* terraform backend 用 bucket は ansible で作る
    * プライベートバケットならそれだけでほぼ問題ない
    * 必要なポリシーは付けられる
    * ライフサイクルはほぼ必要ない（むしろ移行させない）
* AWS CloudTrail 用及び AWS Config 用 bucket はそれぞれ terraform で作る
    * CloudTrail 用モジュールで自前で bucket を用意する
    * 自前で s3_bucket リソースを用意するので、ライフサイクルも好きに出来る
* Ansible でも Terraform でもどっちでもいいので、Lifecycle をちゃんとサポートして欲しい。。。
GROVE multichannel gas sensor calibration

GROVE の Multichannel Gas sensor を使ってみています。どうやらうかつに calibration はやらないほうがいいみたい。プロダクトページの冒頭に「精確な測定はできません。値はガスの傾向を示しています」と書かれているので、数字そのものを信じないほうがよさそう。ただし calibration をすると、出てくる数字は少しまともっぽくなる様子。

# いつやるか
Seeed の[ドキュメント](http://wiki.seeed.cc/Grove-Multichannel_Gas_Sensor/#calibration)には「値があやしそうなときは～」と書かれているけれど、「新しい環境では常にやるべし」と書いている人もいる（[参考](https://github.com/Seeed-Studio/Mutichannel_Gas_Sensor/issues/2)）。ただ、環境整えるのは結構ハードル高い気がする。

私は Calibration しようと思う前は、パッケージ開封した初期状態のままでしばらく計測していた。しかしどうも NO2 が高すぎておかしい、あるいは、アルカン類（CH4, C3H5, C4H10）の数字の並びが不自然に思えて、適当にCalibration することにした。

# 手順と注意点

Calibration の手順は大まかには、センサーの出力する値が安定するところまで待って、平衡状態の数字をプリセット値に書き込むということの様子。空気が少なすぎてもだめだけど、風がびゅーびゅー吹く環境もあまり適切ではなさそう。

Calibration は github の[リポジトリ](https://github.com/Seeed-Studio/Mutichannel_Gas_Sensor/)内 `examples/calibration` にある Arduino スケッチで行う。公式には Ardunino Uno と Seeeduino が挙げられているけれども、要件は I2C で通信することで、esp8266 でも構わなかった。ここでは Wio-Node で行う。ところでヒーターの都合上本当は 5V 電源駆動が良いという噂もある。

ピン配置を確認する。UART 側はファームウェアを書き込むのに使う。esp8266 arduino にする Wio-Node では、`I2C1` 側が `IO4`, `IO5` になっている。Arduino Uno では `A4`(`SDA`), `A5`(`SCL`) になっているので、ガスセンサはそのまま `I2C1` 側に取り付ければよい（[ドキュメント](https://www.arduino.cc/en/Reference/Wire)）。

esp8266 は IO15 で周辺回路に電源を供給するかどうかを制御しているので、起動直後にピン設定を行う。センサーは MiCS6814 チップだけれども、通信の際に見えている I2C は、実際はセンサボード上のマイコンが解釈している。そのためセンサボード側のマイコンが起動するまで、`delay` を入れるのがよいだろう。

```
void setup(){
  pinMode(15, OUTPUT);
  digitalWrite(15, LOW);
  delay(1000);
  digitalWrite(15, HIGH);
  delay(5000);
  // 以下続く
```

Calibration に先立って、まず `examples/ReadSensorValue_Grove` を書き込んで、値が読み出せることを確認しておく。

また `examples/factory_setting` を一度実行して、出てくる数字を書き留めておくこと。最悪この値を書き戻すと元の戻ることができる。

`examples/GetVersion` はセンサボード上のマイコンが EEPROM の特定の値を読み出せた場合に Version2 と認識され、それ以外の場合は Version1 とみなされるようになっている。

`examples/calibration` において Version2 になると処理フローが大幅に変わるので、ここは確実に Version2 と認識してから各種処理を行ったほうがよい。進行状況はシリアルモニタに現れるので、確認しておく。最後は `Calibration ok` と出て終了する。

# 資料
プロダクトページに「回路図」「センサチップのデータシート」「コード」へのリンクがある。

データシートによると、センサーのヒーターは 5V 駆動時点での抵抗値が載っている。回路図によると 3.3V 駆動に合わせて抵抗値が変更されている。

センサボード上のマイコンは ATmega168 だけれど、`examples/new_firmware` によると、単純に ADC の値を I2C に乗せたり、EEPROM の読み書きを I2C 越しにできるようにしているだけになっている。つまり、ほとんどの処理は I2C で読み出した後の `MutichannelGasSensor.cpp` で行っている。

データシートにも書いてあるけれど、結局センサーは 3 つ入っている。コードを見ると、それぞれのセンサーからの値を読み替えている。実際の空気は混成されているので、この値の取り扱いは注意が必要になる。それぞれのガスが単品で高濃度で出るとわかっているときに使うと効果的ということか。

| sensor | variable | gas |
|:---|:---|:---|
| NH3 | ratio0 | NH3 C3H8 C4H10 |
| RED | ratio1 | CO CH4 H2 C2H5OH |
| OX  | ratio2 | NO2 |

プロダクトページには calibration 時に air condition is fresh にせよと軽く書かれているが、データシートの数値は synthetic air であり、要するに N2 と O2 の「合成空気/人工空気」の環境内で計測した数値が書かれている。正しい R0 の値はこの環境で測定したものを使うべし。
Buffaloの無線LAN APのクライアント数をZabbixに記録する

# 概要

* 社員から無線LANの接続が切れる事象が報告される
* [前回の調査](https://qiita.com/330k/items/d04adc01b936e3bb1102)から、NAPTテーブル溢れが原因ではないことが判明
* 今度は無線APの接続数を調査

# 環境

* 無線AP: Buffalo社製 WAPS-APG600H
* Zabbix 3.4.7

# Zabbix設定
## 外部チェックスクリプト

Zabbixサーバに以下の外部チェックスクリプトを配置。

~~~bash:count_airstation_clients.sh 
#!/bin/bash

HOST=$1
COMMUNITY=$2
IFACE=${3:-"1"}

snmpbulkwalk -v2c -c ${COMMUNITY} ${HOST} SNMPv2-SMI::mib-2.17.4.3.1.2 \
 | grep "INTEGER: ${IFACE}" | wc -l
~~~

このスクリプトでやっているのは、`snmpbulkwalk`で`SNMPv2-SMI::mib-2.17.4.3.1.2`以下の項目数をカウントしている。

正式なドキュメントは見つからなかったが、`SNMPv2-SMI::mib-2.17.4.3.1.2.(MACアドレス)`の値が2のものが、Web管理画面の「11g」「クライアントモニター」の端末に一致し、値が3のものが「11a」「クライアントモニター」の端末に一致したので、この項目から値を拾っている。

値が1のものはおそらく有線LAN側のARPテーブルを表示しているものと思われる。

ZabbixにはLow Level Discoveryという機能でSNMPの項目名と値を自動で拾ってくれる機能があるが、項目数を数える機能は見つけられなかった。

## Item登録

Zabbixの管理画面から「Configuration」「Templates」で無線LANのAP用のテンプレートを選択し、「Item」「Create Item」からItemを作成する。

* 11g側
    * Name: 「Wireless Clients 11g」
    * Type: 「External check」
    * Key: `count_airstation_clients.sh["{HOST.CONN}", "{$SNMP_COMMUNITY}", "2"]`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/dd329a16-c521-4c50-2981-dd682c0afb20.png)

* 11a側
    * Name: 「Wireless Clients 11a」
    * Type: 「External check」
    * Key: `count_airstation_clients.sh["{HOST.CONN}", "{$SNMP_COMMUNITY}", "3"]`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/dfa78908-09d3-36f0-91b9-7e7f15ef46f3.png)

## Graph登録

上記で追加したItemを「Create Graph」からGraphにする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/0d1b0fab-9263-26ef-af9a-33599f0dc6ba.png)

# 結果

WAPS-APG600Hは11g側と11a側でそれぞれ最大25台まで接続可能なのだが、
従業員が集まる朝8時半からの朝会の時間帯に全部使いきっていることが判明。

社員数が増加しているので、やはり機器を増強しないとな・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/23ad34a8-4810-bbd4-d6da-34198e56f78c.png)
RaspberryPiでI2Cを使えるように設定【2018年】

# この記事の内容
RaspberryPiでI/Oエキスパンダ（MCP23017）を使うため、I2Cを使えるように設定する。

## ラズパイ環境
- RaspberryPi 3 model B
- Raspbain 9.1

[Raspbainのバージョン確認方法](https://qiita.com/fujit33/items/16ce964c228a63a9d8dd)

# エラーが発生するまで

i2c-toolsのインストール（入っているかも）

```bash:インストール
pi@raspberrypi:~ $ sudo apt-get install i2c-tools
```
接続情報を取得してみる

```bash:エラー
pi@raspberrypi:~ $ sudo i2cdetect -y 1
Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory
```

# 解決方法

```bash:設定を開く
pi@raspberrypi:/dev $ sudo raspi-config
```
Interfacing Optionsを選択
バージョンが古いと、Advanced Optionの場合もある

<img width="400" alt="スクリーンショット 2018-03-06 0.17.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/135663/4a43f3f2-ca5f-733c-220e-83ef1111c82f.png">

I2Cを選択。
<img width="400" alt="スクリーンショット 2018-03-06 0.00.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/135663/9edcd854-b102-177a-17fd-d1972f0167a0.png">

<はい>　を選択
<img width="400" alt="スクリーンショット 2018-03-06 0.00.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/135663/29e8ef13-f1bc-4b49-bf49-11664dca6a60.png">


```bash:再起動
pi@raspberrypi:/dev $ sudo reboot
```

# 結果

```bash:いい感じ！
pi@raspberrypi:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
```
jenkins勉強会で学んだメモ殴り書き


# jenkins スライド

https://wiki.infra-workshop.tech/%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%83%AD%E3%82%B0/2018/03/05/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E5%B1%8B%E3%81%ABJenkins%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%82%93_%E3%82%AB%E3%83%B3%E3%83%9A?presentation=1#/13

https://wp.infra-workshop.tech/?tribe_events=%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E5%B1%8B%E3%81%ABjenkins%E3%81%A3%E3%81%A6%E3%81%A9%E3%81%86%E3%81%AA%E3%82%93%EF%BC%9F%E3%80%9C%E8%A8%80%E3%81%86%E3%81%A6%E3%82%8B%E3%82%AA%E3%83%AC%E3%82%82


結論から言うと

1. cronの置き換えは向いてない
2.  - 冗長化できないから
3.  - 死んでもいい事に使う
4.  マウスクリックで発動したいジョブに使う
5.  - うちの運用だとあまりない

パラメータ＝変数、パイプライン内で使える。

Pipeline script from SCM で git管理下のjenkinsfileを実行。

ifとかloopも書きまくり

sh 'docker run...' もしちゃう

### docker imageでCI

https://github.com/exemplary-buildpipeline-projects/studyosaka8-jenkins-docker-app/blob/master/Jenkinsfile#L101

実行フォルダがimageないじゃなくて？ホスト側になる？不思議仕様に注意とのこと

image名にパラメータを使ってますな。

pipelineの中で `docker run` してから作業する、というのはアリかも。

docker on jenkins on docker で使う。 docker.sock使って。


### java コマンド叩けば閉鎖空間でもnodeになれる
slaveからmasterに行くのでポートいらず、ワン・コマンド、サービス化可能、接続コマンドはjenkinsインストールし直さない限り変わらない

ノードの管理 > コマンド発行 > agent.jar を落とす → java runコマンド叩く


serverからkickするシーンでも、slaveから取りに来て蹴り始めるのでmaster->agentのpush通信は一切いらない


agent imageこれかな？

https://hub.docker.com/r/jenkinsci/slave/

jenkinsのパイプラインの言語はDSLと呼ばれるタイプのやーつ

> DSL（Domain Specific Language）は，ドメイン固有言語と訳されてます。DSLは，Java，C#などの汎用言語とは違い，ある特定の種類の問題に特化したコンピュータ言語です。  
http://gihyo.jp/admin/feature/01/dsl/0001

javaのgroovyとかだって


# docker コンテナからdocker psする方法

２つの合わせ技

これと
https://stackoverflow.com/questions/45121945/jenkins-in-docker-container-run-docker-pipeline

```sh
      && apt-get install -y sudo libltdl-dev
```

これで

https://qiita.com/hikoma/items/8fbfb4f783d31e66b228

```sh
 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker
```

できる！


# cronの代替rundeck

冗長化は複数ソフトの組み合わせ＋お手製でかなりつらそう

> Corosync と Pacemaker をセットアップしていきたいと思います。

https://cloudpack.media/4375

> - 他ツールとの比較   
 - Jenkins -> 多機能すぎてシンプルじゃない  
 - digdag -> GUIの機能(認証や設定変更)が不足  
 - Concourse CI -> GUIから編集ができない  
- Rundeck自体の冗長化はどうやるの？  
 - オンプレだとpacemaker & corosyncでやってる  
 - AWSなら、DBをRDSにして、ファイルだけをlsyncdとかで同期すれば簡単にできると思われる  
- https://wiki.infra-workshop.tech/%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%83%AD%E3%82%B0/2018/02/10/%E3%82%B8%E3%83%A7%E3%83%96%E7%AE%A1%E7%90%86%E3%81%A7cron%E3%81%AF%E9%99%90%E7%95%8C%E3%81%8C%E3%81%82%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7Rundeck%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%8F%E3%83%83%E3%83%94%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F


> https://dev.classmethod.jp/server-side/server/try-rundeck-job/
エージェントレス  
SSH接続できればジョブを実行できます。


# CIスクショ

> http://blog.mobming839.net/entry/2017/12/02/223839

```sh
# selenium_test.py を実行する
docker exec selenium_test python3 selenium_test.py https://www.google.co.jp/ screenshot.png
# スクリーンショットファイルをホスト側にコピーする
docker cp selenium_test:/screenshot.png .
```


docker-selenium 使って見た

https://qiita.com/yutaChaos/items/4a1da5d55a3bf0df889e
業務改善および標準・フォーマット作成のポイント

業務改善をやる機会が多いので、備忘録として、本記事を書いています。

# 品質マニュアル、規定、標準（手順書）の関係
用語の定義しだいで図は、微妙に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239166/519a3dc4-1725-eadf-c07c-9219a22a72b3.png)

# 標準、フォーマットに対する要求事項
作業者にヒアリングした結果、↓の意見を多く頂きました。

* 読むべき標準がわからない。
* 標準を読みたくない。
* 標準を読む時間がない。
* 読んでも、作業内容がわからない。
* 読んでも、該当する作業がない。
* フォーマットがない場合、文書作成、審査に手間がかかる。
* フォーマットに重複があり、何回も同じことを記載している。作成も改版も手間がかかる。

上記の意見の**背景や原因（＝要求事項）** は、↓

* 規定・標準が多すぎて、自部署が関係する規定・標準が把握できていなかった。
* 他部署の標準に自部署の業務が記載されている場合、把握できていないかった。
* 標準が別の標準を参照しており、複数の標準を読まなければ作業できない状態だった。
* 冗長的だったり、細かかったり、無駄な記載が多かった。
* 法律・規格の内容が転記してあるだけで、作業内容があいまいだった。
* 似たような言葉が使われており、理解しづらかった。（要求事項、要求仕様、仕様など）
* ある作業パターンの記載がヌケていた。
* 標準に「〇〇文書には、～～などを記載」と書いてあるが、フォーマットはなかった。
* フォーマットがなく、作業者はレイアウト、記載内容を考えながら作成しなければならなかった。（記載ヌケ・モレのリスク）
* フォーマットがなく、作業者が自由に記述しているため、審査者の負担が大きかった。（作成者によってレイアウトが異なる、ヌケ・モレ確認など）
* 記載の重複があり、転記したり、連動改版が必要な状態だった。（不整合、改版忘れのリスク）

# 標準作成のポイント
上記の要求事項を、満たすように作成ポイントを考えてみました。

* 目的、適用範囲、責任、定義、概要、手順、改訂履歴を記載。
* 標準＋OJTで作業できるレベルで作成。
  * 見れば作業できるレベルだと改版頻度が多くなる。（共有マニュアルか個人メモに記載）
* 概要には、作業内容、作業者、成果物、タイミングを明記。（フローチャートまたは表が望ましい）
* 手順を設定した経緯は記載しない。
  * 標準が長くなる。
  * 作業内容がわかりにくくなる。
  * 経緯を残す文書は、改善に役立つため、別途用意する。（共有マニュアルか個人メモに記載するなど）
* 『〇〇書には、以下の内容を記載する。』は、記述しない。
  * フォーマットを作成し、手順書は『〇〇書を作成』と記述。
  * 標準が長くなる。
  * フリーフォーマットは作成者、審査者の負担になる。
* 以下のような混同されやすい用語、人によって解釈が異なる用語は、使う用語を選択し、定義に記載。
  * 品質マニュアル、規定、規則、標準、手順書、マニュアル、作業標準
  * 様式、フォーマット、テンプレート
  * フェーズ、プロセス、アクティビティ、タスク
  * イベント、マイルストーン、ゲート、レビュー
  * 要求事項、要求仕様、仕様、設計仕様
  * 原理設計、機構設計、システム設計、外部設計、内部設計、基本設計、詳細設計
  * 検討、検証、試験、検査、動作確認、妥当性確認

# フォーマット作成のポイント
* 法律・規格の文書化要求は必ず入れる。
* 自由記載は極力避ける。
  * 人によって記載が変わるため、審査しにくい。
  * ヌケ・モレの原因になる。
  * フリーフォーマットは作成者、審査者の負担になる。
* フォーマット間の重複はできる限り減らす。
  * 記載する場合、どちらかの文書を参照にする。 
* フォーマットを見れば記載内容がわかり、標準や手順書を見なくて済むように作成。
* フォーマットの内容をデータベースに登録できるようにすると効率化しやすい。
  * テーブル形式で記載など
* フォーマットを利用する人に必要な情報が含まれていること。
  * 作成者が、作成しやすいか検討。
  * 文書を閲覧者（審査・承認者、他部門、監査員、顧客、エンドユーザーなど）に必要な情報はあるか。

# 監査対策
* 標準、手順書までは監査員が閲覧。
* 共有マニュアル、作業メモは見せない。
  * 実務レベルなので改版頻度が多く指摘されやすい。
* 作業メモ、共有マニュアルのフォーマットには様式番号を振らない。（監査員に存在を悟らせない）
* 監査員は、規定、標準を確認後、それに従った作業成果物の提出を求める。つまり、すべての規定・標準の成果物である文書リストを作成しておくと監査が楽になる。また、その文書リストでプロジェクトの進捗管理などが可能になる。

# 業務改善、システム開発・導入するために意識すること
* 業務を見える化しておく（フローチャートなど）
* 作業のインプット情報、作業者、作業内容、成果物（アウトプット）を明確にする。
* 成果物が次の工程で、誰が、どのように利用するか考える。
* フローチャートの判断作業は、データベースを作っておくと効率化される。
  * 経験に基づいて判断されることが多いため、データベースが有効的。 
* フォーマットからデータベースに登録できるようにする。
* 業務改善→システム開発・導入が効率的かつ形骸化しない。
Windows Serverセキュリティ対策

#概要
SIerだと業務ではWindowsが使われていて、LinuxサーバではなくWindowsサーバを立てる場合があります。Windows Serverは様々な機能があるので、余計なサービスを止めたり、ポリシーをきちんと設定しないとセキュリティを保てません。そこでWindows Serverのセキュリティ対策を行います。

##環境
Windosw Server2012R2（AWS）

##参考
この記事では紹介しませんが次のようなものもあります。
https://i-think-it.net/windows2012r2-setup-13/


#手順
##サービス停止
コントロール パネル\システムとセキュリティ\管理ツール\サービス を開きます。該当するサービスを停止します。
###DNS Client
停止して手動にします。

###Print Spooler
プリンタにつながってないので不要です。停止して無効にします。

###Shell Hardware Detection
USBメモリ、デジタルカメラの画像保存やCD/DVD挿入時のプログラム実行など行わないので不要です。停止して無効にします

###Windows Image Acquition
あれば停止して無効にします。


##グループポリシー
コントロール パネル\システムとセキュリティ\管理ツール\ローカル セキュリティポリシー から設定します。
###[アカウントポリシー]-[パスワードのポリシー]
+ パスワードの長さ　→　8文字以上
+ パスワードの有効期間　→　42日間
+ パスワードの履歴を記録する　→　3回
+ 複雑さの要件を満たすパスワード　→　有効

###[アカウントポリシー]-[アカウントロックアウトのポリシー]
+ アカウントロックアウトのしきい値　→　5回
+ ロックアウトカウンターのリセット期間　→　30分
+ ロックアウト期間　→　30分

###[ローカルポリシー]-[セキュリティオプション]
+ アカウント：Administratorアカウントの状態　→　無効
+ ネットワークセキュリティ：LAN Manager認証レベル　→　NTLMv2応答のみを送信(LMとNTLMを拒否する)
+ 対話型ログオン：Ctrl+Alt+Delを必要としない　→　無効
+ 対話型ログオン：最後のユーザー名を表示しない　→　有効
+ ネットワークアクセス：リモートからアクセスできるレジストリのパス　→　レジストリを削除する
+ ネットワークアクセス：リモートからアクセスできるレジストリのパスおよびサブパス　→　レジストリを削除する
+ ネットワークアクセス：匿名でアクセスできる共有　→　未定義
+ DCOM：セキュリティ記述子定義言語(SDDL)構文でのコンピューターアクセス制限　→　未定義
+ DCOM：セキュリティ記述子定義言語(SDDL)構文でのコンピューター起動制限　→　未定義
+ 監査：監査ポリシーサブカテゴリーの設定　→　有効

##ユーザーアカウント
[スタート]+Rを押して、[ファイル名を指定して実行]の検索窓に"netplwiz"を入力し検索。ユーザーアカウント設定画面にある、[ユーザーがこのコンピュータを使うには、ユーザー名とパスワードの入力が必要]のチェックボックスをONにする。

##ファイル共有の無効化
コントロール パネル\ネットワークとインターネット\ネットワークと共有センターからローカルエリア接続などを選択し、[Micorosoftネットワーク用ファイルとプリンター共有]のチェックを外す。

##SMB1.0無効化
サーバーマネージャーの[管理]メニューから[役割と機能の削除]をクリックし、[役割と機能の削除ウィザード]-[機能]にて「SMB 1.0/CIFS ファイル共有のサポート」のチェックを外す。
サーバ再起動後に iptable or ip6tables の rule が適用されない場合の対処方法

# 概要
Debian amd64 9.3(strech)でサーバ再起動した場合に ip6tables もしくは iptables のルールが適用されないことがある。それもかなりの確率で。その場合の対処方法。

2019/1/19追記: 最近busterでほぼうまく動いいてる

# エグゼクティブサマリー
```shell
sudo service netfilter-persistent reload
```
手で rule を適用しても良いと思うけど、↑のコマンド一発で iptables と ip6tables も入るみたいなので便利。

# 確認方法
コマンドのみ。それにしても、なんではいらんねやろ。

```shell
iptables -L -v -n
```

```shell
ip6talbes -L -v -n
```
LUISのサインアップから使い始めるまで

#はじめに
この記事は、社内勉強会で自然言語理解（NLU）を扱うに当たり、ハンズオンの事前作業としてLUISのサインアップ～使い始めることが出来るまでの流れを整理したものです。

#前提
LUISにサインインするアカウントがない場合の手順を記載しています。
アカウントがある場合は、サインインするだけで大丈夫です。

#手順
1.LUISのページにアクセスする
[https://www.luis.ai/home](https://www.luis.ai/home)にアクセスします。

2.赤枠の「Login / Sign up」を選択する
![WS000089.png](https://qiita-image-store.s3.amazonaws.com/0/199815/330428de-9f43-4b02-df5a-ff23cd9d5953.png)

3.赤枠の「アカウントをお持ちでない場合、作成できます。」を選択する
![WS000090.png](https://qiita-image-store.s3.amazonaws.com/0/199815/c9417057-e630-00c8-52bf-b2ba5285d795.png)

4.所有しているメールアドレス・希望のパスワードを入力し、次へを選択する
![WS000091.png](https://qiita-image-store.s3.amazonaws.com/0/199815/25f5277f-9c4b-586c-504b-0f1cd00f1781.png)

5.下図のように、メールを送信した旨が表示されます
![WS000092.png](https://qiita-image-store.s3.amazonaws.com/0/199815/39abc510-6d97-759f-9343-987b5465e45f.png)

6.入力したメールアドレス宛てに届いた「お使いのメールアドレスの確認」を確認します
7.太字になっている数字のコードをコピー（メモ）します
![WS000093.png](https://qiita-image-store.s3.amazonaws.com/0/199815/f45e12f5-2352-52fd-2e84-632a9b22410f.png)

8.先ほどのコードの入力画面で入力し、次へを選択します
![WS000094.png](https://qiita-image-store.s3.amazonaws.com/0/199815/884a139b-0ac3-bccd-5293-68e9936f03de.png)

9.画像で表示されている文字を入力し、次へを選択します
![WS000095.png](https://qiita-image-store.s3.amazonaws.com/0/199815/23b60541-1bf6-c49d-c27e-c3cbbdf3d236.png)

10.OAUTH2認可の確認画面が開くので、下部の「はい」を選択します
![WS000096.png](https://qiita-image-store.s3.amazonaws.com/0/199815/151302fc-0261-bc21-4681-c73649e49cb1.png)
![WS000097.png](https://qiita-image-store.s3.amazonaws.com/0/199815/a68f8413-8a28-486e-67b7-ef52aa6e33fb.png)

11.[https://www.luis.ai/home](https://www.luis.ai/home)にリダイレクトされます
※中々Loading画面から変わらない場合は、リフレッシュしてみてください。
![WS000099.png](https://qiita-image-store.s3.amazonaws.com/0/199815/b0467f2e-5464-4991-e3c3-21e8e76ea32f.png)

12.LUISのWelcomeページが表示されるので、最下部の「Ceate LUIS app」を選択します
![WS000100.png](https://qiita-image-store.s3.amazonaws.com/0/199815/efe99f33-67d6-ffd9-4f76-1f04355b60fa.png)
![WS000101.png](https://qiita-image-store.s3.amazonaws.com/0/199815/c984079a-370e-ec66-5b58-485dec14eee2.png)

13.必ずCountryにJapanを選択し、同意文言にチェックし、「Continue」を選択します
※Japanを選択すると、その下の選択項目が１つに減ります。
![WS000102.png](https://qiita-image-store.s3.amazonaws.com/0/199815/32fc1823-ce5a-fbc9-7486-42539ed42103.png)
![WS000103.png](https://qiita-image-store.s3.amazonaws.com/0/199815/291471cb-7ab0-382d-b9b6-ae49d0cf9cf5.png)

14.下記の画面が表示されれば準備完了です。
当日のハンズオンにてアプリを作成していきましょう。
![WS000104.png](https://qiita-image-store.s3.amazonaws.com/0/199815/775b223b-a29c-1eff-bdcf-0f198a451f76.png)


以上
storybook で babel 7 を使う

前提として babel 7 で `@babel/core` などでビルドが成功していることとする。

```
yarn add babel-core@7.0.0-bridge.0 -D  
```

```js:.storybook/webpack.config.js
const defaultConfig = require('../webpack.config')
const getStorybookConfig = require('@storybook/react/dist/server/config/defaults/webpack.config.js');

module.exports = (config, env) => {
  const newConfig = getStorybookConfig(config, env)
  newConfig.module.rules = defaultConfig.module.rules
  return newConfig
}
```

## 内容

何もなければ rules 以下は babel-preset-es2015 などがデフォルトで指定されているのだが、これが babel 7 環境だと動かないので、自分で指定した rules を使う。babel-loader はそのままならbabel-coreを使おうとするが、このブランチを指定することで @babel/core 側を使ってくれる。