OmniAICreator/Qiita-1.07M huggingface dataset:
涙のCSSセレクタ

#新人時代のCSSってこんな感じ

20代の頃のCSSは
・親要素から共通するスタイルをざっくり指定
・子要素でスタイルを上書きしていく
という感じでした。

親よりも子が優先。CSSの指定は後出しが勝つ。
どうしてもスタイルがうまく適用されない場合は、idを付けて個別に対応。
それでもダメなら、禁断の「**!important**」を！

##でもね
そんな状態は長く続きませんでした。

例えば、以下のサンプルの場合、

```html:sample1.html
<h2>最新バージョン一覧</h2>
<dl>
  <dt>■<span>PC製品版</span>(3000円)</dt>
  <dd>クライアント:<span>1.11</span></dd>
  <dd>サーバー:<span>1.11</span></dd>
</dl>
```

```css:sample1.css
* {
  color: #000000;
}

dl {
  color: #ff0000;
}

dt {
  color: #0000ff;
}

dd {
  color: #00ff00;
}
```

##さあここで問題です
Q.「3000円」の文字色は何色でしょうか？
A.「<font color="Blue">#0000ff</font>」

正解です！
「3000円」はdt要素の中にありますから「<font color="Blue">#0000ff</font>」

##それでは、同じHTMLとCSSで
Q.「PC製品版」の文字色は何色でしょうか？
A. これもdt要素の中にあるから「<font color="Blue">#0000ff</font>！」

ブッブー！不正解！
**正解は「#000000」**

##なぜだ！?
colorは継承するプロパティなので、
「親のdt」から「子のspan」に「color」も受け継がれるはずなのに。。。
その時、一瞬にして、自分の脳内にあるCSSパーサーが爆発しました。

##なぜそうなったかというとね
「**spanタグにcolorの指定がなかった**」から。

「*」は全称セレクタといって、「すべて」という意味です。

そして今回「span」については、何もスタイルが定義されていませんでした。

つまり「span」のスタイルを指定しない場合、
「*」のスタイルが「span」のスタイルとなります。

言い換えると
「spanのcolor」→「未定義」
「\*のcolor」→「#000000」
なので
「spanのcolor」は「#000000」ということになります。

##まとめ
この経験は、あらためてCSSの詳細度について、きちんと勉強する良いきっかけになりました。
現在は、フロントエンドを中心に活動していますが、あの時お世話になった先輩の顔をふと思い出して、涙が頬を流れた週末でした。
デザインパターン学習メモ：「Iterator」

## 目的
GoF本より引用する。

> 集約オブジェクトが基にある内部表現を公開せずに、その要素を順にアクセスする方法を提供する。(P.275)

翻訳がやや明快ではないので、原書からも引用する。

> Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(P.257)

Iteratorパターンを用いることで、集約オブジェクトの内部実装と走査方法が切り離される。これによって、走査方法の変更が容易になる。

また、異なる集約オブジェクト間で共通の走査方法を提供することができる。

## 実装例
『デザインパターン入門』を参考に作成した。

```java:Aggregate.java
// Aggregate役
// 集約オブジェクトが実装する（走査するためのIteratorを提供する）
public interface Aggregate {
	// Iteratorを生成
	public Iterator<Item> createIterator();
}
```

```java:Iterator.java
// java.utilに含まれるクラス
// 今回の例に必要な箇所を抜粋
public interface Iterator<E> {
	boolean hasNext(); 
	E next();
	...
}
```

```java:Tray.java
// ConcreteAggregate役
// 具体的な集約オブジェクト
public class Tray implements Aggregate {
	private static final int MAX_SIZE = 100;
	private Item[] items = new Item[MAX_SIZE];
	private int last = 0;

	public Tray() {
	}

	public int getSize() {
		return last;
	}

	public Item getAt(int index) {
		return items[index];
	}

	public void addItem(Item item) {
		this.items[last] = item;
		last++;
	}

	@Override
	public Iterator<Item> createIterator() {
		return new TrayIterator(this);
	}
}
```

```java:TrayIterator.java
// ConcreteIterator役
// 具体的なIterator
public class TrayIterator implements Iterator<Item> {
	private Tray tray;
	private int index;

	public TrayIterator(Tray tray) {
		this.tray = tray;
		this.index = 0;
	}

	@Override
	public boolean hasNext() {
		if (index < tray.getSize()) {
			return true;
		} else {
			return false;
		}
	}

	@Override
	public Item next() {
		Item item = tray.getAt(index);
		index++;
		return item;
	}
}
```

### 実行例

```java:Main.java
public class Main {
	public static void main(String[] args) {
		Tray tray = new Tray();
		tray.addItem(new Item("item-A"));
		tray.addItem(new Item("item-B"));
		tray.addItem(new Item("item-C"));

		Iterator<Item> iterator = tray.createIterator();
		while (iterator.hasNext()) {
			Item item = iterator.next();
			System.out.println(item.getName());
		}
	}
}
```

```text:結果
item-A
item-B
item-C
```

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
 * 結城浩（2004）『Java言語で学ぶ　デザインパターン入門』SBクリエイティブ
rbenv rubyのバージョンが切り替わらなかった時にしたこと

```
rbenv versions
  system
* 2.3.1 (set by /vagrant/.ruby-version)
rbenv local 2.3.1
rbenv rehash
ruby --version
ruby 1.9.3p484 
```

切り替わらない。。


# したこと
```
benv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```

```
vi ~/.bash_profile
```

こちらを追記
eval "$(rbenv init -)"

```
source ~/.bash_profile
ruby -v
ruby 2.3.1p112 
```


無事、切り替わりました。

#参考
http://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf
重ね重ね・ArchLinux インストール覚書

[ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)より始めた自宅サーバ構築ですが、最低限の環境が整ってきました。ぼちぼち、[やりたい1](http://qiita.com/katz_engineer/items/f032a24cb273c4eb6669#やりたい1)として挙げた超軽量仮想環境を試したい。ですがそのデータをどこに置くか、またスクリプトを作った場合の置き場所、といった話題が地味な問題として挙がってきました。

仕事なら何も考えてないディレクトリで上司の承認を取ってとっとと決めてしまう所ですが（ヒドイ話😭だけど仕事は time is money なのでこんなどうでもいい問題に割く時間などありません）今回はどこまでも趣味に走ると決めた個人サーバ環境です。どうでもいい事は前例を踏襲する方針に従って、ではこの問題に関する前例は？を調べてみました。

# FHS (Filesystem Hierarchy Standard)

UNIX系OSの場合、ディレクトリ構造の標準が提唱されています。Filesystem Hierarchy Standard、通称 FHS と呼ばれるものです。Linuxについては Linux Standard Base 通称LSBという規格が検討されていて、その中でディレクトリ構造も議論されている模様…ですがこの辺を突っ込み始めると何だかごちゃごちゃしてるっぽいですな。深い所はスルーする方が幸せになれそうな気がします😅

というわけでFHS。LSBによる最新版は[FHS - The Linux Foundation](https://wiki.linuxfoundation.org/en/FHS)かな？バージョン3.0と書いてあります。LSBじゃないFHSは[Filesystem Hierarchy Standard](http://www.pathname.com/fhs/)でバージョン2.3、これが3.0の直前のバージョンとなるようです。いずれも英語のサイトです。

日本語でも色々解説されていますが、私が探した中では[ITmedia エンタープライズ 第14回 FHSによるディレクトリの規格化](http://www.itmedia.co.jp/help/howto/linux/0007master/14/)がお勧めです。何と言いますか、上っ面の抽象的な言葉のコピペではなくて、明確な判断基準を示してくれています。バージョン2.2なので少々古いですが、入門編としてはよろしいんじゃないでしょうか。

# 自作ツールの置き場所

上述のFHSに基づいて考えました。自作ツール mytool を置く場所を下記のように決めます。何となく、ものすごくLinuxっぽく、あるいはUNIXっぽくなったような気がします。なんかカッコいいぞ。

```
/ ルート
 │
 ├─ etc
 │   ├ opt
 │   │  └ mytool  ← mytoolの設定ファイルを置く
 │   :
 │
 ├─ opt
 │   └ mytool  ← mytool一式は、基本的にはここに集める
 │      ├ bin
 │      ├ doc
 │      ├ lib
 │      :
 │
 ├─ usr
 │   ├ local
 │   │  ├ bin  ← /opt/mytool/bin内容物へのシンボリックリンクを置く
 │   :  :
 │
 ├ var
 │   ├ opt
 │   │  └ mytool  ← mytool関連データ（動的に変化するもの）はここに置く
 :   :
 
```

ちなみに /usr/lobal/bin に実行ファイルのシンボリックリンクを置く理由は、デフォルトでPATHが通っているからです。これをやらないとPATHに /opt/mytool/bin を追加しなくちゃいけません。ログイン可能な全ユーザに設定しなきゃならないとなると、ちょっと躊躇しますよね… /usr/local/bin ならデフォルトでPATHが通ってて、しかもサーバ管理者に解放されている場所なので、都合が良いのです。

# iSCSIストレージのサブボリューム構造

[も一つ・ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/cc4786a8c586637eb17c)で決めたiSCSIストレージのマウントポイントを、上記ディレクトリ構造を踏まえて変更します。具体的には次の2ヶ所とします。

* /opt/mytool
* /var/opt/mytool

実際にサブボリュームを作成してマウントするのはツールの名前 mytool が決まってからにします。今回は、適当に決めていた /iscsi をやめる所までの作業とします。

## /etc/fstab から /iscsi の設定を削除

```
# mv /etc/fstab /etc/fstab.org
# cp /etc/fstab.org /etc/fstab
# vi /etc/fstab
# diff -U0 /etc/fstab.org /etc/fstab
--- /etc/fstab.org      2017-05-16 22:21:37.894240063 +0900
+++ /etc/fstab  2017-05-21 23:12:15.739160315 +0900
@@ -7 +6,0 @@
-UUID=〈省略〉      /iscsi  btrfs    _netdev,rw,relatime,space_cache,subvol=@      0 0
# rm /etc/fstab.org
```

## マウントポイント /iscsi を削除

```
# umount /iscsi
# rmdir /iscsi
```

## iSCSIストレージのサブボリュームを削除

```
# mount /dev/sdc /mnt
# btrfs subvolume list /mnt
ID 257 gen 26 top level 5 path @
# ls /mnt
@
# btrfs subvolume delete /mnt/@
Delete subvolume (no-commit): '/mnt/@'
# umount /mnt
```

今回は以上です。
Ruby で指定した年の日付の一覧を取得する

## サンプルコード

1月1日から12月31日までの Date オブジェクトを生成して、年月日と曜日を出力する。

```ruby
require 'date'

def print_dates(year)
  dates = (Date.new(year, 1, 1)...Date.new(year + 1, 1, 1)).to_a
  puts "The year #{year} has #{dates.size} dates."
  dates.each do |d|
    puts d.strftime('%Y-%m-%d %a')
  end
end

print_dates(2000)
print_dates(2001)
```

以下に出力結果の一部を記す。

2000年は閏年なので366日。2月29日が存在する。

```
The year 2000 has 366 dates.
2000-01-01 Sat
2000-01-02 Sun
2000-01-03 Mon
2000-01-04 Tue
(略)
2000-02-28 Mon
2000-02-29 Tue
2000-03-01 Wed
```

2001年は閏年ではないので365日。2月29日は存在しない。

```
The year 2001 has 365 dates.
2001-01-01 Mon
2001-01-02 Tue
2001-01-03 Wed
2001-01-04 Thu
(略)
2001-02-28 Wed
2001-03-01 Thu
```

## 参考資料

- class Date (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/class/Date.html
【AWS】Amazon Lexのカスタムボットできんにくフレンズを作ろう[Part1]

タダです。

Amazon Lex(以下、Lex)と戯れてみたレポートを何回か書いてみたいと思います。
今回は、定型文の会話を行うカスタムボットを作ってみた時の紹介記事です。
社内のLT大会で話してみたので、その模様は以下からどうぞ。

# 社内ブログとか動画
* [LT大会発表資料を公開！『過ぎ去りし絵文字を求めて』『AIとはじめるきんにくフレンズ』『例えるIT技術』](http://blog.serverworks.co.jp/tech/2017/05/17/lt-championship-27/)
* [アーカイブ動画](https://www.youtube.com/watch?v=bhY4maB6QSw)

[contents]

# Lexの概要
さて、改めてLexの概要をまとめてみると、次のような特徴があります

* Lexはアプリケーションの対話型インタフェースを作るのをサポートするサービス
    * チャットボット開発に最適
* Lambda,Cognito,Polly,MobileHub 等とも連携可能
* チャットのプラットフォームとして、Facebook Messanger,Twilio SMS,Slackと連携可能
* 従量課金制

## Lexの専門用語
Lexで扱う専門用語は次のものです

* Bot : ボットそのもの
* Intents : ユーザが入力した自然言語に応答する、ボットのアクションの固まり
* Utterances : Intentsを発動する口頭もしくは入力されるフレーズ
* Slot : Intentsを満たすための要求される入力データ
* Prompt : Slotを引き出すためのフレーズ
* Fulfillment : Intentsを実現するビジネスロジック 


## 公式資料
* [サービス概要](https://aws.amazon.com/jp/lex/)
* [ドキュメント](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/what-is.html)
* [SlideShare](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-ai)

# やってみたこと
* Slackにきんにくフレンズを召喚
    * 普段から使っているし、馴染みがある
* きんにくフレンズBot(@musclechang)に話しかけて自分のトレーニングメニューを管理するものを作ってみたい
    * トレーニングしたいと話しかけると、トレーニングメニュー、回数、セット数を聞いてくれて、最後は励ますようなボットです

## 実現するためにやったこと
### AWS側
Utterancesと、Slots、Promptはこんな感じです

<img width="968" alt="Screen Shot 2017-05-21 at 10.25.05 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/59666/775d226f-1e54-e1ca-04c3-3261013183d0.png">

Slots typesは３つ作りました

* Set(トレーニングのセット数)
* Training Menu(トレーニングメニュー)
* Count(何回やるかのカウント数)

Fulfillmentは、Lambdaでやらないので、「Return parameters to client」を選択しています
<img width="419" alt="Screen Shot 2017-05-21 at 10.27.11 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/59666/6f678a5c-e4aa-2142-82ee-0d010762e943.png">


### Slack側
Slackの連携部分は、以下のドキュメントを参考にしました

* [Step 3: Create a Slack Application](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/slack-bot-assoc-create-app.html)
* [Step 4: Integrate the Slack Application with the Amazon Lex Bot](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/slack-bot-assoc-create-assoc.html)
* [Step 5: Complete Slack Integration](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/slack-bot-back-in-slack-console.html)


### 結果
こんな感じの対話ができるフレンズができました！

![Screen Shot 2017-05-21 at 10.06.30 PM.png](https://qiita-image-store.s3.amazonaws.com/0/59666/9d4f666a-1523-341f-b809-b79dd49c0d6b.png)

# まとめ
* ノンプラグラミングでボットを作れました
    * 定型文しか返せないので、AIぽく入力した情報を貯めて、より良いトレーニングメニューを提案するような感じにしていきたい
    * 次回に他のAWSリソースと連携してみたいです(Lambda,Pollyとの連携とか)
zabbix3.0のansible-playbookを作ってみた

# 目的
本当はzabbix3.0の構築の簡略化だったのだが、
初めてのansible勉強がメインになりました。つまり今回は、自己満足です。

ブラッシュアップした２回目の記事([zabbix3.0(server/agent)のansible-playbookを作ってみた(その２)](http://qiita.com/mishikawan/items/23b94362be24e1bc0803)はこちら。


# やったこと
Ansible Documentationやqiitaを見ながら、Zabbixサーバの自動構築を書いてみた。

あと、[仮想(KVM)マシン構築を簡易にする環境作成](http://qiita.com/mishikawan/items/b04ff14c6fb4ef8d223b)と連動させ、最小限で検証環境を構築できるようにした。

# アウトプット

作成したplaybookを githubに登録してみた。
git clone https://github.com/mishikawan/zabbix30-ansible.git

* 興味があれば(ないと思いますが…)、git-cloneしてみてください。

# ディレクトリ構成
```
zabbix30/
|-- inventory
|   `-- inventory.ini     <--- 対象ホスト登録(今回は1台だけ)
|-- roles
|   |-- application       <--- zabbix系の設定事項
|   |   |-- files
|   |   |   `-- zabbix.conf.php  <--- 設定ファイルの元ファイル
|   |   |-- handlers
|   |   |   `-- main.yml   <--- handler(restart)設定ファイル
|   |   |-- tasks
|   |   |   `-- main.yml   <--- DB作成～zabbix-server.conf作成・再起動まで
|   |   `-- vars
|   |       `-- main.yml   <--- zabbix用DBパスワードの格納
|   |-- middleware        <----- 各yumインストールとMariadb稼働
|   |   `-- tasks
|   |       `-- main.yml
|   `-- os                <----- selinux,firewall,zabbix-repoの登録
|       `-- tasks
|           `-- main.yml
`-- zabbix30_deploy.yml   <----- main処理
```

# playbookを次に書くための自分へのヒント
### mainのplaybookを簡易にするために
[bastPractice](http://docs.ansible.com/ansible/playbooks_best_practices.html)を参考にして、mainには、roleの羅列のみを記載するように。
### 変数の設定(vars)/参照(tasks)方法

```ruby:roles/***/vars/main.yml
zabbix_setup:
  - zabbix_mariadb_password: password
```

```ruby:roles/***/tasks/main.yml
- name: create and modify zabbix user
  mysql_user:
    name: zabbix
    password: "{{ item.zabbix_mariadb_password }}"
    priv: 'zabbix.*:ALL,GRANT'
    state: present
  with_items: "{{ zabbix_setup }}"
```

### シェルの実行結果で処理を流すか否かを判断方法
mysqlで対象テーブルのselectを実行させ、処理が正常終了しなければ(!=0)、"insert zabbix DB"タスクを実行する

```ruby:roles/***/tasks/main.yml
- name: varliable zabbix user count
  shell: mysql -u root -ss zabbix -e "select count(*) from users"
  ignore_errors: yes
  register: count_users
- name: insert zabbix DB
  shell: zcat /usr/share/doc/zabbix-server-mysql-3.0.9/create.sql.gz | mysql zabbix -u root
  when: count_users.rc != 0
```

* when: count_users.rc .... 実行結果(return_code)
* 実行結果を判断したければ、 count_users.stdout != "1" 等の記載する。
* ignore_error: yes　を記載することで、エラーになっても次のタスクに進むことができる。

# 今後すること

* 汎用的な記載方法で作成
* zabbix-agentも作成
* DBのパスワード情報を一元化する。
Raspberry Pi で超音波センサーを使って楽器を作る

#Raspberry Pi に超音波センサーと連動させて音を鳴らす

####  概要
 Raspberry Pi と超音波センサーを使い、検知した距離に応じて音階を鳴らす。
　いくつか改良を加えるとアナログ楽器に似たものが出来上がると予想する。


　環境
- RaspberryPi3
- Python3 (ver3.6.0)
- 超音波センサー(HC-SR04)
- ブレッドボードとジャンプワイヤー

　手順の前に、いくつか準備が必要です。
1 以下のサイトを参考に、ブレッドボードと超音波センサー、Raspberry Pi3を接続する。
[【ラズベリーパイ3】Pythonで超音波距離センサ(HC-SR04)の精度向上（気温考慮）](https://algorithm.joho.info/programming/python/raspberry3-ultrasonic-distance-sensor-hcsr04-temp/)
2 Python-sonicが必要なのでインストールします。
　``` $ pip install python-sonic ```
　うまく行かない方は [python-sonic](https://github.com/gkvoelkl/python-sonic "python-sonic") こちらを参考にしてください。

3 GUI環境ならメニューの[プログラミング]-[Sonic Pi]をクリックします。
  CUI環境ならvnc等でアクセスし、上記と同じ手順を実行します。
　環境設定は以上です。


#### とりあえず、音を鳴らしてみる

以下のコードは上記で紹介したサイトのサンプルコードを元にアレンジしたものになります。

サンプルコードをダウンロードする

```
$ cd
$ git clone https://github.com/ototonari/sense-sonicpi
$ cd sense-sonicpi
```

実行する

```
$ python3 ./sample.py
```

以下、実行中の画面のサンプルになります。

```
15 cm
15 cm
20 cm
20*cm
･･･
```

#### サンプルコード

```py3:sample.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math
import RPi.GPIO as GPIO
import time
from psonic import *


# HIGH or LOWの時計測
def pulseIn(PIN, start=1, end=0):
    if start==0: end = 1
    t_start = 0
    t_end = 0
    # ECHO_PINがHIGHである時間を計測
    while GPIO.input(PIN) == end:
        t_start = time.time()
        
    while GPIO.input(PIN) == start:
        t_end = time.time()
    return t_end - t_start

# 距離計測
def calc_distance(TRIG_PIN, ECHO_PIN, num, v=34000): 
    avg = 10
    fout = open('inputValues.txt','wt')
    for i in range(num):
        # time.sleep()の値で音がなる間隔が変わる（超音波センサーで距離を測る間隔が変わる）
        GPIO.output(TRIG_PIN, GPIO.LOW)
        time.sleep(0.5)
        # TRIGピンを0.00001[s]だけ出力(超音波発射)        
        GPIO.output(TRIG_PIN, True)
        time.sleep(0.00001)
        GPIO.output(TRIG_PIN, False)
        # HIGHの時間計測
        t = pulseIn(ECHO_PIN)
        # ここから超音波センサーの値を扱う
        # 距離[cm] = 音速[cm/s] * 時間[s]/2
        distance = int(int(v * t/2) / 5)
        # 値の整形 一つ前の値と比較してプラスマイナス４０％以内
        if ((avg + 10) > distance) and ((avg - 10) < distance):
                
            print(distance*5, "cm")
        # play()この関数に渡す引数の値によって鳴る音が変わる
            play(distance + 59)
            avg = distance 
        else:
            print(avg*5, "cm*")
            play(avg + 59)
        
        
    fout.close()	
    # ピン設定解除
    GPIO.cleanup()

# TRIGとECHOのGPIO番号   
TRIG_PIN = 14
ECHO_PIN = 15
# ピン番号をGPIOで指定
GPIO.setmode(GPIO.BCM)
# TRIG_PINを出力, ECHO_PINを入力
GPIO.setup(TRIG_PIN,GPIO.OUT)
GPIO.setup(ECHO_PIN,GPIO.IN)
GPIO.setwarnings(False)

use_synth(PROPHET)
# 距離計測(TRIGピン番号, ECHO_PIN番号, 計測回数, 音速[cm/s])
calc_distance(TRIG_PIN, ECHO_PIN, 10, 34000)
```

詳しい解説は次回にしたいと思います。
ここまで見て下さりありがとうございます。
疑問点などございましたら、コメントよりお願いします。
ポートスキャンを『Suricata』で検知してみました

サイバー攻撃の標的となるホストやネットワークの事前調査の為、ポートスキャンが利用されます。
その為、ポートスキャンを監視することにより、サイバー攻撃を防ぐことに有効です。
※但し、全てのポートスキャンが検知できる訳ではないので、注意が必要です。

#■ Suricataとは
Suricataは、オープンソースの侵入検知システム(IDS)／侵入防御システム(IPS)です。

#■ 検証環境
Ubuntu 16.04
Suricata 3.2.1

#■ Suricataを導入・起動

#####◆インストール

```shell-session
$ sudo add-apt-repository ppa:oisf/suricata-stable
$ sudo apt-get update
$ sudo apt-get install suricata
```

#####◆設定ファイル

```
$ sudo cp -p /etc/suricata/suricata.yaml /etc/suricata/suricata.yaml.org
$ sudo vi /etc/suricata/suricata.yaml
～ suricata.yaml を編集 ～
$ diff /etc/suricata/suricata.yaml /etc/suricata/suricata.yaml.org
<     HOME_NET: "[検証サーバのIPアドレス]"
>     HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
$ sudo vi /etc/suricata/rules/emerging-scan.rules
～ 検知するポートスキャンを有効にする ～
```

#####◆Suricataを起動

```shell-session
$ sudo suricata -c /etc/suricata/suricata.yaml -i enp0s8
```

#■ Suricataのログを確認
検知したアラートは、/var/log/suricata/fast.log に出力されます。

```
◆ポートスキャンの一例
05/21/2017-20:25:41.797608  [**] [1:2100469:4] GPL SCAN PING NMAP [**] [Classification: Attempted Information Leak] [Priority: 2] {ICMP} ***.***.***.***.*** -> ***.***.***.***

◆OSフィンガープリントの一例
05/21/2017-20:29:18.608698  [**] [1:2018489:3] ET SCAN NMAP OS Detection Probe [**] [Classification: Attempted Information Leak] [Priority: 2] {UDP} ***.***.***.*** -> ***.***.***.***
```
SSHブルートフォース攻撃を『Fail2ban』で防いでみました

SSHブルートフォース攻撃とは、SSHに対する総当たり攻撃のことです。
複雑なパスワードを設定しても、時間はかかりますが、いずれログインに成功します。
その為、パスワード認証の場合、対策が必要です。

#■ Fail2Banとは
Fail2banは、ログファイルを監視し、悪意のある兆候を示すIPアドレスからの接続をブロックします。
Fail2Banは、sshdやApache HTTP Serverなどの不正アクセス対策に使用することができます。

#■ 検証環境
CentOS 7.3
Fail2ban 0.9.6

#■ 攻撃ログの確認
SSHブルートフォース攻撃のログは、通常のSSHログインと同様、/var/log/secure に出力されます。

```shell-session
$ grep "Failed password" /var/log/secure
May 20 15:31:11 localhost sshd[6358]: Failed password for invalid user testuser from ***.***.***.*** port 64168 ssh2
May 20 15:31:11 localhost sshd[6357]: Failed password for invalid user testuser from ***.***.***.*** port 64167 ssh2
May 20 15:31:11 localhost sshd[6355]: Failed password for invalid user testuser from ***.***.***.*** port 64165 ssh2
May 20 15:31:12 localhost sshd[6356]: Failed password for invalid user testuser from ***.***.***.*** port 64166 ssh2
May 20 15:31:12 localhost sshd[6354]: Failed password for invalid user testuser from ***.***.***.*** port 64164 ssh2
May 20 15:31:13 localhost sshd[6358]: Failed password for invalid user testuser from ***.***.***.*** port 64168 ssh2
May 20 15:31:13 localhost sshd[6357]: Failed password for invalid user testuser from ***.***.***.*** port 64167 ssh2
May 20 15:31:13 localhost sshd[6355]: Failed password for invalid user testuser from ***.***.***.*** port 64165 ssh2
May 20 15:31:13 localhost sshd[6356]: Failed password for invalid user testuser from ***.***.***.*** port 64166 ssh2
May 20 15:31:13 localhost sshd[6354]: Failed password for invalid user testuser from ***.***.***.*** port 64164 ssh2
```

#■ Fail2Banを導入・起動

#####◆インストール

```
$ yum install epel-release
$ yum install fail2ban
```


#####◆設定ファイル

```shell-session
$ cp -p /etc/fail2ban/jail.conf /etc/fail2ban/jail.d/jail.local
$ cp -p /etc/fail2ban/jail.d/jail.local /etc/fail2ban/jail.d/jail.local.org
$ vi /etc/fail2ban/jail.d/jail.local
～ jail.localを編集 ～
$ diff /etc/fail2ban/jail.d/jail.local /etc/fail2ban/jail.d/jail.local.org
23,24c23,24
< [sshd]
< enabled = true
> # [sshd]
> # enabled = true
160,161c160,161
< banaction = firewallcmd-ipset
< banaction_allports = firewallcmd-allports
> banaction = iptables-multiport
> banaction_allports = iptables-allports
```

#####◆Fail2Banを起動

```shell-session
$ systemctl start fail2ban
```

#■ 動作確認

#####◆Fail2banでブロックしたIPアドレスを表示

```shell-session
$ ipset list fail2ban-sshd
Name: fail2ban-sshd
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536 timeout 600
Size in memory: 16592
References: 1
Members:
***.***.***.*** timeout 590
```

アクセス制限時間の初期値は、600秒です。
アクセス制限時間は、bantimeで設定しています。

```shell-session
$ cat /etc/fail2ban/jail.d/jail.local
～ 省略 ～
bantime  = 600
～ 省略 ～
```
Android Studio 2.3.2に上げたらエミュレータが起動しなくなった

Kotlin、Androidのオフィシャルサポート言語になりましたね！
サーバサイドはやはりJavaが安定してますので、クラサバ両方でKotlinが使えるのは大きいですね。

Googleのトレンドを見るとこんなになってましたw 今年はKotlinの年になりそうです。
![Kotlin_-_Explore_-_Google_Trends.png](https://qiita-image-store.s3.amazonaws.com/0/75231/abc39b71-5735-74a1-80ff-8973ef88ddca.png)




### 本題
`Android Studio 2.3.2`に上げたらエミュレータが起動しなくなってしまい悩んでいたところ、ちょうど今日`Stackoverflow`のおまとめメールで解決方法を発見。動いた :relaxed:
私の環境は、`macOS Siera 10.12.5`です。
http://stackoverflow.com/questions/44094296/recently-i-installed-android-studio-2-3-2-with-all-sdk-update-but-not-able-to-o

ここからHAXMをダウンロードします。
https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager

zipファイルを展開するとdmgがあるので実行します。
すでにインストールされてましたが、上書きでインストールします。
Ruby｜添字アクセスを止めてメソッドにしましょう

外部APIと連携するプログラムのコードレビューしてた時にあったものです。
本のタイトル、著者、値段を取得する仕様になってました。
~~細かいところはあんまり覚えてない・・・~~

抜粋するとこんな感じ

```ruby
book_titles = ["吾輩は猫である", "人間失格", "舞姫"]
book_authors = ["夏目 漱石", "太宰治", "森鴎外"]
book_prices = [1500, 2000, 1700]

book_titles.each_with_index do |book_title, index|
  puts "タイトル：#{book_title}, 著者:#{book_authors[index]}, 値段:#{book_prices[index]}円"
end
```

なにがイケてないってタイトルでループしてそのインデックスを使って他の情報にアクセスしているところ
サンプルみたいな単純なプログラムだとこだわる必要はないが、もう少し処理が複雑になってきたらもう目も当てられない状況に・・・

どうやって`book_titles`、`book_authors`、`book_prices`を作っていたのか記憶が曖昧なのですが、各配列にちゃんとした意味があるなら１つのクラスとして集約されるべきだと思います。

なので、`Struct`を使ってリファクタぽいことしてみました。

```ruby
book_titles  = ["吾輩は猫である", "人間失格", "舞姫"]
book_authors = ["夏目 漱石", "太宰治", "森鴎外"]
book_prices  = [1500, 2000, 1700]

Book = Struct.new(:title, :author, :price)
books = []

3.times do |index|
  books << Book.new(book_titles[index], book_authors[index], book_prices[index])
end

books.each do |book|
  puts "タイトル：#{book.title}, 著者:#{book.author}, 値段:#{book.price}円"
end
```

メモリ効率的にどうなの？というツッコミは置いといて、
こういうリファクタがいいのやら、わるいのやら？
RubyでアドホックなCSVからのインポートスクリプトを書く時のひな形

CSVのデータをDBに取り込みたく、ActiveRecordを使いたい時。最近よく書くので

```ruby
require 'csv'

def import_row(row)
  # something to do
  return '必須項目がない' if row['必須な列'].blank? # 要 ActiveSupport

  nil
end

if ARGV[0].nil?
  puts 'input csv filename on arguments'
elsif !File.exist?(ARGV[0])
  puts "#{ARGV[0]} is not found"
else
  CSV.foreach(ARGV[0],
              headers: true,
              encoding: 'BOM|UTF-8',
              header_converters: Proc.new { |h| h.strip },
              skip_blanks: true) do |row|
    result = import_row(row)
    puts result + ',' + row.to_csv if result
  end
end
```

* ファイルはコマンドライン引数から受け取る。めんどくさいので。
* 行の処理はメソッドに分ける。これで、エラーメッセージを出して`next`みたいなことをしなくてよくなる。後置ifの強みが活かせるように思う。
* 例外的な行はメソッド内でチェックし、エラー行として出す。メッセージと元の行を出して有効活用する。`$INPUT_LINE_NUMBER`で行数を出すのも良い。ファイル出力もできるが、一旦は標準出力のリダイレクトで解決。場合により。
* `headers: true`で、ヘッダが日本語でも`row['列名']`でアクセスできる。ただ、BOMが付いていると`row.header[0]`にもBOMがついてきてアクセスできないとかトラブルもあり、ファイルを見つつやる必要はある。
* BOMがついてる場合は`encoding: 'BOM|UTF-8'`で解決。
* `header_converters: Proc.new { |h| h.strip }`でヘッダから空白が取れる、といった形で加工もできる。
機械学習系勉強会に行こう

# 内容

* R, Python, TensorFlowなど各言語、フレームワークを広めるための勉強会
* 事例紹介
企業の宣伝

# どこで知るか
各主催団体のサイトなどで得られるが、広く情報収集するなら下記サイトが役に立ちます。

* https://eventdots.jp/
    * 私はここの情報をベースにしている。下記connpass, atnd, DoorKeeperの情報も転載されるから。でも多少タイムラグがあるのかも。人気の勉強会はそのタイムラグの間に埋まってしまうこともある。
* https://connpass.com/
    * 結局、このconnpassに載っている勉強会が面白い気がする
* https://atnd.org/
* https://www.doorkeeper.jp/

# 勉強会の雰囲気
* オープンソース開発団体、ユーザーグループなど主催
    * そのツール類を広めようというのがモチベーションなので、チュートリアル、Tips、最新情報が得られて嬉しい。
* 企業主催
    * ソリューションの宣伝、新卒・中途採用のための宣伝と思われる。宣伝を聞かされるだけで正直ハズレという勉強会もある。ただ、Google、Amazonなどは使ってもらってなんぼなので、上記オープンソース系の勉強会に準じていて情報がたくさん得られて役に立つ。若いWeb系、データ分析系企業の場合は、オープンソース系団体と雰囲気が似ていて宣伝臭が少ないです。
    * 企業主催の場合はだいたい素敵な会場だ
        * Google、Amazon、その他Web系企業　は技術者の食堂兼憩い兼社内打合せスペースと思われる素敵空間なことが多い
        * Yahoo、Microsoft、リクルート　は「ステータス」という感じの会場だった
* 個人主催
個人主催少人数の会は行ったことがない。どんな雰囲気なのだろう。

# 持参するもの
勉強会側で特に指定されている場合以外は何もいらないけど、下記はあったほうがベターかなと

* PC
    * メモにノートがいいという人は（私はけっこうそう）ノートでいいけどたいていはWiFi環境が用意されているのでノートPCを持っていったらいい。「詳細はこのサイトで」とか紹介されることも結構あるのですぐ調べられるし。スマホでもいいけど。
* ジュースなど
    * 1-2時間と長丁場になるのでジュースなど。会場により飲み物が提供されたり自販機があることもあるけどないところもある。

# あきらめないで
人気の勉強会は気付いたら定員が埋まっていて補欠となってしまうことも多い。100人が定員で補欠の30番目となったらどうだろう、もうダメだとあきらめないだろうか。**あきらめないで**
100人程度の定員の場合は、日にちが近づくに連れてキャンセルが増え、結局は30-50人くらいキャンセルとなり繰り上がれることも多い。また、あまりに人数が集まると主催者側で広い会場に変更して定員を増やしてくれる場合がある。あきらめず登録しよう。
あるいは、ブログ枠ということで、勉強会の内容を事後にブログで公開すると約束する枠が空いていることが多い。勉強会側も宣伝となりよいのであろう。

# キャンセルは出来るだけせず、するならマナーを守って
申し訳ないが、私も直前にキャンセルしてしまうことがある。ほとんどの会は補欠者がたくさんいるので、キャンセルは出来るだけせず、するなら出来るだけ早めに徹底しよう。

# 勉強会側への希望
* 資料は事前に公開して欲しい
    * 勉強会後に公開されることが多い。勉強会のページかスライドシェアなどで。ただ、勉強会の内容をあらかじめ知っておけば参加者側として興味のない勉強会に行く必要がなくなるし、勉強会側としても内容のアッピールになるので、資料を事前に公開したほうが良いと思うがどうなのだろう。勉強会に合わせてあわてて資料を作ったという方もいるが、使いまわしている資料の方も多そうなので事前に公開して欲しい。
* ファシリティの内容を事前に知らせて欲しい
    * WiFiの有無は事前に告知されていることが多いが、ジュースの自販機類があるかどうかなど。

# 勉強会なんか意味あるの
「勉強会にたくさん行って勉強した気になる」私みたいな人を揶揄する方も多い。確かに情報量なら本やWEBサイトを読んだほうがいいし、Courseraなど役立つ教材もある。その通りなんだけど、本やサイトの情報だと自分の興味だけに固まってしまう。勉強会はいい意味で内容がぼやけているので、全然知らなかったけど自分の興味に必要な情報を得られる場合がある。
懇親会で人脈を作るというのもあるのだろうが、私はコミュ力極小なので、ほとんど参加したことがない。また、勉強会の聴講者じゃなく、発表者側になれよ、という批判もある。そうねその通り。まー私は人前で話すのが極度に苦手なので、Qiitaで行くよ。
F#を始めよう（０）

# 前書き
まずはじめに、自分のF#歴が短いことと、特にF#関係のコミュニティーに属さず、また自分が勤めている会社にもF#使いがいないため、半ば独自解釈の部分が多いと思います。
「これってそうじゃなくて、こういうことなんだよ」という指摘がたくさん出てくるかもしれませんが、技術に関する指摘は大歓迎ですので、これを機会に勉強させてください。 :sweat:  

# 経緯
2015年ごろから**関数型言語**に興味を持ち始め、はじめに**ラムダ計算**を勉強しつつ、2016年あたりから本格的にF#を使い始める。
自分が勤めている会社内でもF#の良さをアピールしつつ布教活動を続けているが、自分以外で使っている人は今の所１人しか居ない（しかもこの子は派遣さん）。


布教活動の中でいくつかのフィードバックをもらい、ザックリまとめると、こんな感じ。

* C#に比べて利点がよく分からない
* それLINQでもできるよね？
* ラムダ式使われると可読性が落ちる（ちょっと言いがかり的？F#関係ないじゃん）
* 関数型ってほら、LispとかMathematicaとか？ (向こうもよくわかっていない感満載）


## なぜF#か？
多分、自分がずっとWindows PC向けアプリケーション開発に携わり、そのほとんどが.NET Framework上のアプリケーションだったので、必然的にF#という選択をしたと思う。HaskellとかScalaとかにも興味あるんだけど。

あと、.NET Frameworkのライブラリとかも使用できるから、ちょっとした自分ツールや自分ライブラリを作るときにF#は便利だったりする。（作ったライブラリはC#側から呼べるし）


# F#を始めるために
## 開発環境の構築
詳しくはF# Software Foundation(http://fsharp.org) のサイトに書かれているが、英語なのでザックリいうと、

<dl>
<dt>選択肢1:</dt>
<dd>Visual Studioをインストールする</dd>
<dt>選択肢2:</dt>
<dd>Visual Studio Codeをインストールし、機能拡張「Ionide-fsharp」をインストールする</dd>
</dl>

お金をかけないで揃えるなら、手間がちょっとかかるけど選択肢2が良い。ただ、幸いにもC#の開発環境を整えている方なら、すでにF#を試す環境は整っていると思って良い。

# さあ、始めよう
## 最初に覚えて欲しいこと

それはコメントの書き方です。

いきなりコメントの書き方について項を持ってくるのは珍しいと思われるが、まず**最初にコメントを書いてからプログラムコードを書いて欲しい**という想いもあり、１番最初に持って来てみる。

他のプログラミング言語と同様に１行コメントと複数行コメントの両方を使える。

```fsharp
// 行コメント

(*
    複数行コメント
*)
```

## 変数や関数の宣言
F＃は**関数型言語**と呼ばれる言語であるため、変数と関数は同等に扱う。その証拠となるのが宣言の仕方で、 変数の宣言方法と関数の宣言方法はほとんど変わらない。

```fsharp:F#における宣言
// 変数の宣言
let n = 5

// 関数の宣言
let f x = x * 2
```

この時`n`はint型の変数で値が`5`になる。`f`は引数`x`を受け取り２倍して返す関数になる。

尚、同様の表現をC#で行なった場合は次のようになる。

```csharp:C#における宣言
// 変数の宣言
int n = 5;

// 関数の宣言（あえてF#と同等の書き方にした）
int f(int x){ return x * 2; }
```

## プログラム実行方法
F#はスクリプト言語のような環境が用意されており、好きな行のみを実行することができる。そのような制約があるため、F#では未定義な変数（シンボル）は参照前に記述する必要がある。

```fsharp
// 関数の宣言
let f x = x * 2

// 関数の実行例
f 5 // 10が返される

g 10 // エラー！

// 後から宣言しても上記gは実行できない。
let g x = x * 5
```

では実行方法について見て行きます。やり方は次の通り

1. 実行したいコードをマウス選択する
2. Alt+Enterを押す（Visual Studio/Code両方これでいけた気がする）
3. F# Interectiveウインドウが表示され、実行結果が出る。

![fsharpinterective.png](https://qiita-image-store.s3.amazonaws.com/0/182552/432b3132-a3ff-b47b-f071-dceb9c9fd8f1.png)

実行結果の最後の行にある`val it : int = 10`が最後に実行した式の結果が格納される。

> `val it`とは実行環境が最後に実行した式の結果を格納するためのシンボル名で 予約語の一部となっている。もちろん、最後に実行した式の戻り値が関数の場合も 同様に`it`が関数になる。

# 終わりに
## サマリー
今回の流れをまとめると次の通り。

* F#も他の言語と同様に行コメントと複数行コメントがある。コメントの書き方はもう分かりましたね？
* F#における変数と関数の宣言について、同じようなフォームになっており、関数も変数と 同等の扱いをすることが伺える（と自分は感じました）。
* F#のコードを実行する方法について記載した。コンパイルした 実行可能形式については後日記載します。

## 次回以降の流れ
* 静的型付言語なんだけど型推論のおかげで色々楽にコーディングできることを何となく説明したい
* C#との大きな違いは部分適用と合成だよなーってことを説明したい
* 副作用の有無を意識するだけでも他言語に応用できることを説明したい
* 難しいことは抜きにして、モナドについて説明したい
Linuxで親指シフトを利用する(Mozcとlibkkcの場合)

# 親指シフト入力方式について

日本語入力方式として、まずはローマ字入力、かな入力はご存知だと思います。そして第三の入力方式として、親指シフト(NICOLA)があります。

親指シフトは1979年以降の富士通のワープロに採用されていたキーボードで、日本語を早く楽に入力できる方式であるとしてPC全盛の今でも根強いファンが存在します。
親指シフト入力を採用した高価な専用キーボードも存在しますが、エミュレータの登場により今では通常のJISキーボードで普通のユーザが気軽に試すことができます。

# Linuxと親指シフト

WindowsやMacでは配列エミュレータソフトは数多くあり簡単に親指シフト入力環境が整えられますが、Linuxでは選択肢はあまり多くありません。
定番としては、日本語変換エンジンのAnthyを利用する方法があります。
AnthyはLinuxのディストリビューションで広く採用されている変換エンジンであり、変換エンジン本体に標準で親指シフト入力方式が搭載されています。
設定画面から入力方式を親指シフト(NICOLA)に切り替えるだけで親指シフトモードで入力可能です。

# 新たな親指シフトエミュレータ oyainput

このように手軽に親指シフトができるのは素晴らしいことですが、残念ながらAnthyは変換効率があまり良くありません。
変換効率で言えば、Mozcまたはlibkkcといった後発でより優れたIMEが登場しています。

最近のディストリビューションでは標準搭載される日本語変換エンジンはほぼMozc またはlibkkcとなっています。
加えて現在Anthyの開発は停滞しており、今後大幅に性能が強化されるかも不透明です。

つまり、親指シフトユーザとしては将来について不安が尽きない状況だったといえます。
この状況を変えるべく、Mozc や libkkc で利用可能な新たな親指シフトエミュレータとして oyainput が生まれました。

# oyainputの特徴

oyainputは Ubuntu16.04LTS、Fedora25、suseLinuxなど主要なLinuxに対応しています。

## インプットメソッド（fcitx、ibus）

fcitxもしくはibusを利用する場合は日本語入力中はキーボードが親指シフト配列になり、英語入力中は通常の英語配列キーボードになります。
uimなどその他のものも利用はできますが、英語←→日本語の切り替えに応じて親指シフトモードを自動で切り替えることはできません。
この場合は手動で親指シフト（日本語）モードと直接入力（英語）モードを切り替えることになります。
※切り替えはPauseキーを押すことで可能です。

## 日本語変換エンジン（Mozc、libkkc、Anthy）

日本語変換エンジンを選ばず利用できます。
つまりMozc、libkkc、もちろんAnthyでも利用できます。

## インストール方法

gitが未インストールの場合は下記コマンドでインストールします。gccとmakeもインストールします。

    sudo apt-get install -y git gcc make


作業用にホームディレクトリの下にworkというディレクトリを作成してみます。

    $ cd
    $ mkdir work
    $ cd work

gitから最新ソースを取得します。

    $ git clone https://github.com/inwskatsube/oyainput.git

メイクとインストールを行って完了です。

    $ cd oyainput
    $ make
    $ sudo make install

## 起動方法

ターミナルから以下のコマンドを打てば起動します。

    $ oyainput


## 便利な使い方

毎回起動のたびにコマンドを入力するのが面倒です。
Ubuntuをお使いの場合、Dashから「自動起動」と入力すると「自動起動するアプリケーション」設定ツールが見つかります。
「追加」を押して、以下の行をコマンドとして 設定すれば、次回からoyainputが自動で立ち上がります。

    gnome-terminal -e oyainput

# 設定など
詳しいカスタマイズ方法については以下をごらんください。

https://github.com/inwskatsube/oyainput/blob/master/READMEJP.md
pyenvでpipを使おうとするとUndefined errorが出るときの対処法

久々にpythonを使おうと、いつものように`pyenv`を利用して始めたわけですが、
あるパッケージを入れるために`pip`コマンドを入力したら

```
/usr/local/Cellar/pyenv/20141211/libexec/pyenv-exec: line 47: /Users/username/.pyenv/versions/3.4.2/bin/pip: Undefined error: 0
```

なんてエラーが出たのでその対処法。

## 環境

OS X Yosemite 10.10.5
brewを利用

## 対処法

`homebrew`で`pyenv`をアップデートし、
すでに入っているpythonのバージョンを`uninstall`→`install`することで直りました。

```
pyenv uninstall バージョン名
pyenv install バージョン名
```

`pyenv`のアップデートは別にしなくてもいけるかもしれないです。

`uninstall`をせずに`install`だけで再インストールしますと直りませんでした。
vagrant+BOXでCentOS7.3の仮想環境構築手順

# 仮想化手順
## まず最初に
BIOSの設定で仮想化支援機能(Intel VT-d)をオンにすること。

## Virtual BOXのインストール
### ダウンロードURL
https://www.virtualbox.org/wiki/Downloads

### インストール方法

1. welcome to the Oracle VM VirtualBox 5.1.18 setup wizard→Next>
1. Custom Setup→Next>
1. Next>
1. Warning : Network Interfaces（ネットワーク切断の警告（瞬断が起きます））→Yes
1. Ready to Install→Install

※インストール中にいくつか他のインストールを求められるので、すべてインストールする

## Oracle VM VirtualBox Extension Pack インストール
### ダウンロードURL
https://www.virtualbox.org/wiki/Downloads

### インストール方法

1. Oracle VM VirtualBoxマネージャーを起動
1. ファイル＞環境設定≫機能拡張
   →「新しいパッケージを追加」でOracle VM VirtualBox Extension Packを選択

## Vagrantインストール
### ダウンロードURL
https://www.vagrantup.com/downloads.html

### インストール方法

1. welcome to the Vagrant Srtup Wizard→Next
1. End-User License Agreement→I accept the terms in the License Agreementにチェック→Next
1. Destination Folder→Next
1. Ready to install Vagrant→Install
1. Completed the Vagrant Setup Wizard→Finish
1. You must restart your system for the configuration～（再起動が必要です）→Yes

## Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)インストール
### ダウンロードURL
https://www.microsoft.com/ja-jp/download/details.aspx?id=5555

1. 言語を選択：日本語　でダウンロード

## ディレクトリの作成、移動
### 仮想環境配置場所

* コマンドプロンプトで作業 （※フォルダ名は自由、ここではcentos73と入力）
1.  mkdir：ディレクトリの作成
	2. C:\> mkdir C:\centos73
1. cd：ディレクトリの移動
	2. C:\> cd C:\centos73

## BOXのダウンロード
* コマンドプロンプトで作業

1. bento/centos-7.3をダウンロードする
    ダウンロードするファイルについては（https://atlas.hashicorp.com/bento）参照

    1. C:\centos73> vagrant box add bento/centos-7.3

1. Enter your choice: の表示が確認出来れば「2」と入力する。
    →Enter your choice: 2

1.  ダウンロードが出来たことを確認する
    1. C:\centos73> vagrant box list

## 設定ファイル(Vagrantfile)の自動生成
* コマンドプロンプトで作業
  1. C:\centos73> vagrant init bento/centos-7.3

## 設定ファイル(Vagrantfile)の手動修正
* ソースを直接編集（さくらエディタなどで開く）

  　　編集ファイル：C:\centos73\Vagrantfile

```
    29行目　コメントアウト解除
       # config.vm.network "private_network", ip: "192.168.33.10"
     → config.vm.network "private_network", ip: "192.168.33.10"

    46行目　コメントアウト解除
       # config.vm.provider "virtualbox" do |vb|
     → config.vm.provider "virtualbox" do |vb|

    52行目　追加（#vb.memory = "1024" のあと）
     vb.name = "vg_centos7.3"

    53行目　コメントアウト解除
       # end
     → end

    最終行から1行上（endの前の行）に追加
    config.ssh.insert_key = false
```

## 仮想マシンの作成
* コマンドプロンプトで作業

  1. C:\centos73> vagrant up

  （※2回目以降は起動コマンドになる）



```
※もし下記のエラーが発生した場合は無視してよい
The error output from the command was:
/sbin/mount.vboxsf: mounting failed with the error: No such device
```

## 作成した環境を確認する
* TeraTermなどSSH接続出来るツールを使用する

```
IP:192.168.33.10
ID:vagrant　PW:vagrant　（一般ユーザ）
ID:root　PW:vagrant　（root）
```

## 仮想マシンの停止
* 必ず最後に停止すること
  1. C:\centos73> vagrant halt

# 参考URL
* Windows10でのvagrantによるCentOS7.2仮想マシン作成手順
https://itbyari.wordpress.com/2016/08/06/windows10%E3%81%A7%E3%81%AEvagrant%E3%81%AB%E3%82%88%E3%82%8Bcentos7-2%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E4%BD%9C%E6%88%90%E6%89%8B%E9%A0%86/

* VirtualBoxをWindowsにインストール
http://vboxmania.net/content/virtualbox%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
「jo」コマンドublinuxにインストールしてみた

# はじめに
JSON整形に便利な「jo」コマンド、ubilinux環境への導入メモ

# 環境

## OS
- ubilinux@edison (debian 7.11)
- git, gcc, make 等の開発環境はインストール済

# インストール

```
git clone git://github.com/jpmens/jo.git
cd jo
autoreconf -i
./configure
make check
sudo make install
```

# 動作確認

```
$  seq 1 10 | jo -a | jq .
[
  1,
  2,
  3,
  4,
  5,
  6,
  7,
  8,
  9,
  10
]
```

# 参考

- [コマンドラインから JSON が簡単に作れるツール『jo』をEC2にインストールしてみた＆ドキュメントを読んでみた
](http://dev.classmethod.jp/tool/jo-installed-amazon-linux-ec2-and-readed-manual-document/)
- [話題のjoを試してみた](http://qiita.com/yangci/items/4a7602df4faae5773532)
UE4でゲームパッドに接続されているか認識する方法

#はじめに

初めまして。Neetpiaです。
現在、幻想郷ディフェンダーズというアクションタワーディフェンスをWindows/PlayStation4向けに開発しています。

[幻想郷ディフェンダーズ](http://neetpia.sakura.ne.jp/works/GensoukyouDefendersReitaisai14/index.html)

このゲームですが、マウスとゲームパッド両方の操作に対応しています。
それだけならいいのですが、ゲームパッドが接続している場合、画面の表記が変化します。

例えば、早送りの表記です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/182661/6f57bc65-690a-7a2a-3676-6ab9717e3a69.png)

そのため、ゲームパッドを識別する必要があります。
ただ、検索しても資料がなかったので、ここで説明します。

#認識方法

たったこれだけです。
SlateCoreモジュールを依存に追加する必要があります。

```cpp
bool IsGamePadConnected()
{
	auto genericApplication = FSlateApplication::Get().GetPlatformApplication();
	if (genericApplication.Get() != nullptr &&
		genericApplication->IsGamepadAttached())
	{
		return true;
	}

	return false;
}
```

BluePrintには公開されていないようなので、C++で記述してBluePrintでも使用できるようにすると楽です。

```
UFUNCTION(BlueprintCallable)
static bool IsGamePadConnected();
```

UE4.14で使用できることを確認しました。

----

今後、少しずつ、幻想郷ディフェンダーズの開発で得たノウハウを公開していこうと思います。
Laravelでデバッグバーの使用制御

#config値を設定
config/app.phpの'debug'項目値をtrueに設定する。

```config/app.php
    ...

    /*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug'           => env('APP_DEBUG', false),

    ...
```

.env ファイル
```APP_DEBUG=true
```
ViewControllerにOutletを作成できない問題

#問題
Swift歴4日(時間的には20時間ぐらいw)で
http://easyramble.com/swift-todo-app-tutorial.html を参考にToDoアプリを作っていて下記のエラーに遭遇したので、後続のために一応自分の解決方法を残しておく。


>Could not insert new outlet connection: Could not find any information 
for the class named HogeViewController

##参考URL
他の方が他の要因でおきた場合の解決方法の記事があるため、先に掲載させていただく。

[Xcode でCould not insert new outlet connection が出て story board と controller の紐付けができなくなった時](http://kappa-game.hatenadiary.jp/entry/2016/02/18/Xcode_%E3%81%A7Could_not_insert_new_outlet_connection_%E3%81%8C%E5%87%BA%E3%81%A6_story_board_%E3%81%A8_controller_%E3%81%AE%E7%B4%90%E4%BB%98%E3%81%91%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F)

[Could not insert new outlet connectionエラーへの対処](http://qiita.com/akatsuki174/items/96132aaea00eb8967871)

[【Xcodeエラー】Could not insert new outlet connection: Could not find any information for the class named ViewControllerの対処法](http://www.clrmemory.com/swift/xcode-error-couldnt-insert/)

##自分が解決した方法
StoryboardのオブジェクトをViewControllerにOutletとして作成して変数としてアクセスできるようにしたいが、下のエラーでOutletを作成できない。
>Could not insert new outlet connection: Could not find any information 
for the class named HogeViewController

上の記事を参考にTodoアプリを作成中に一度プロジェクトを削除して、同名のプロジェクトとして作り直したのが原因で、その時に同名のViewControllerが作成されていたため起きた問題だった。

[Xcode でCould not insert new outlet connection が出て story board と controller の紐付けができなくなった時](http://kappa-game.hatenadiary.jp/entry/2016/02/18/Xcode_%E3%81%A7Could_not_insert_new_outlet_connection_%E3%81%8C%E5%87%BA%E3%81%A6_story_board_%E3%81%A8_controller_%E3%81%AE%E7%B4%90%E4%BB%98%E3%81%91%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F)を参考に
`rm -rf ~/Library/Developer/Xcode/DerivedData/<old project name>`で削除済みのプロジェクトのフォルダを削除し、Xcodeを再度開くと解決された。


##所感
主にweb(Rails)エンジニアをしてるわけだが、iOS周りが全くわからずエラーが出た時の無力感がすごい
Bash のプロンプトを bash-powerline でカッコよくする

![bash-powerline-with-git.png](https://qiita-image-store.s3.amazonaws.com/0/67627/c52e2abe-8a68-b8d6-adf0-741a0ce683df.png)

OS X で環境構築するときに忘れないように Bash のプロンプトを bash-powerline でカッコよくする設定をメモっとく。[Bash で Git のコマンドをオートコンプリートする](http://qiita.com/takuya0301/items/0da10393cd12e7f570a2)の続き。

# bash-powerline をインストールする

bash-powerline のスクリプトを `.bash_powerline` というファイル名でホームディレクトリにダウンロードする。ターミナルで `⌘T` を実行したときにカレントワーキングディレクトリに移動する動作を維持するためにスクリプトを修正する。その上で `.bash_profile` に `.bash_powerline` を読み込む設定を追加する。

```shell-session
$ curl -o ~/.bash_powerline https://raw.githubusercontent.com/riobard/bash-powerline/master/bash-powerline.sh
$ sed -i '' -e 's/PROMPT_COMMAND=ps1/PROMPT_COMMAND="ps1; $PROMPT_COMMAND"/' ~/.bash_powerline
$ cat <<EOF >> ~/.bash_profile
> [ -f ~/.bash_powerline ] && . ~/.bash_powerline
> EOF
```

# 参考文献

https://github.com/riobard/bash-powerline
c++ 自作ガベージコレクション ルートオブジェクトの見つけ方メモ

#メモメモ～
ガベージコレクションについていろいろ調べるとマーク&スウィープだったりコピーイングだったりといったアルゴリズムが出てくる。
それらに出てくるルートだが、具体的にどうやって取得するのかほぼほぼ書かれていなかったのでちょっとメモついでにここに書いておこうという訳で。

何をどうしたらいいのか分かりにくかったが、こちらのブログが大変参考になった。
時の羅針盤＠blog
http://compassoftime.blogspot.jp/2010/02/c-copy-gc.html

#esp???
なんやねん。
と最初思ったが、スタックポインタと呼ばれるもので要はどこまでスタックが積まれているかここを見ると分かる(という事?)。アセンブリ言語とかやったことある人からしたら常識なんじゃないか?クエスチョン多いな。

#スタックポインタの取得
それじゃあ取得してみよう!ということで色々調べた結果Cだとインラインアセンブラを記述して取得できる。だけれども64bitだとそもそもインラインアセンブラが使えないぞと。32bitでしか動かないのは嫌だなあ～。

#という訳で代替案
コンパイラ組み込み関数
https://msdn.microsoft.com/ja-jp/library/26td21ds.aspx
にある
_AddressOfReturnAddress組み込み関数
https://msdn.microsoft.com/ja-jp/library/s975zw7k.aspx
この関数を使うと現在の関数のreturnアドレス(戻り番地とか呼ばれてるやつ)が取得できる。
これを使って現在の関数からガベージコレクションの関数を呼んでそのreturnアドレスからエントリー関数のreturnアドレスまでを有効なオブジェクトとしてやって、それらをルートとしてやればうまくいきそう。(試してない)

2017/5/22追記
これはwindowsでVisual Studio c++を使った場合で他の環境には当てはまらないと思う
まあOS変わっても考え方は変わらないはず

図がないから分かりにくいかもしれん。
あと色々間違ってたらすまない。

#参考
時の羅針盤＠blog
http://compassoftime.blogspot.jp/2010/02/c-copy-gc.html
一般教養としてのGarbage Collection
http://www.is.s.u-tokyo.ac.jp/vu/jugyo/processor/process/soft/compilerresume/gc/gc.html
コンパイラ組み込み関数
https://msdn.microsoft.com/ja-jp/library/26td21ds.aspx
_AddressOfReturnAddress組み込み関数
https://msdn.microsoft.com/ja-jp/library/s975zw7k.aspx
enscriptでコマンドラインから綺麗にソースコードを印刷する

# 目的
コマンドラインからバシバシソースコードを印刷したり，PDFに変換したい，けど`a2ps`だとあんまり綺麗にならない．という時に`enscript`を使いましょう．

# 環境
- OS: Ubuntu 16.04LTS, Ubuntu 17.04, CentOS6, CentOS7 等で実行可能

# インストール

- Ubuntu/Debian

```shell-session
$ sudo apt install enscript
```

- CentOS/RHEL

```shell-session
$ sudo yum install enscript
```

# 使い方

## そのままデフォルトプリンタに印刷

```shell-session
$ enscript test.c
```

## PDF出力

```shell-session
$ enscript test.c -o test.ps
$ ps2pdf test.ps
```

## HTML出力

```shell-session
$ enscript test.c -Whtml
```


# おすすめオプション
- C言語ハイライト，カラー，行番号表示，1行ごとに色分け

```shell-session
$ enscript --pretty-print=c --color --line-numbers -H1 test.c -o test.ps
```

- C言語ハイライト，カラー，行番号表示，1行ごとに色分け，2段組，横向き

```shell-session
$ enscript --pretty-print=c --color --line-numbers -H1 --columns=2 --landscape test.c -o test.ps
```

# その他

## 対応言語

`--pretty-print`で指定できる言語の一覧は，`--help-pretty-print`オプションで表示できる．

```shell-session
$ enscript --help-pretty-print | grep Name
Name: ada
Name: asm
Name: awk
Name: bash
Name: c
Name: changelog
Name: cpp
Name: csh
Name: delphi
Name: diff
Name: diffs
Name: diffu
Name: dylan
Name: eiffel
Name: elisp
 Name: erlang
Name: f90
Name: forth
Name: fortran
Name: fortran_pp
Name: haskell
Name: html
Name: icon
Name: idl
Name: inf
Name: java
Name: javascript
Name: ksh
Name: lua
Name: m4
Name: mail
Name: makefile
Name: matlab
Name: nroff
Name: oberon2
Name: objc
Name: octave
Name: outline
Name: oz
Name: pascal
Name: perl
Name: postscript
Name: pyrex
Name: python
Name: rfc
Name: ruby
Name: scheme
Name: sh
Name: skill
Name: Smalltalk
Name: sml
Name: sql
Name: states
Name: synopsys
Name: tcl
Name: tcsh
Name: tex
Name: vba
Name: verilog
Name: vhdl
Name: vrml
Name: wmlscript
Name: zsh
```
webpack + Babel 環境で依存パッケージによっては ES6 未対応ブラウザで JS が動作しなくなる問題

# 状況

iOS 9 や IE などの ES6 未対応のブラウザで、`const` や Arrow function といった ES6 の構文が解釈できずに JavaScript が動作しない問題が発生した。

具体的には、あるプロジェクトで [re-bulma](https://github.com/bokuweb/re-bulma) を使っていて、このパッケージを import していると、ES6 未対応ブラウザで以下のように ES6 の構文が解釈できず、エラーを吐かれる。

```
[Error] SyntaxError: Unexpected keyword 'const'. Const declarations are not supported in strict mode.
```

今回のプロジェクトでは、webpack の設定で Babel に `node_modules` 下のディレクトリは対象外 (exclude) とするようにしているため、例えば依存パッケージが ES6+ で書かれていても、ES5 向けにはトランスパイルしない。
その ES6+ で書かれた依存パッケージだけ exclude しない (トランスパイル対象とする) という解決策がひとつあるが、理想的ではない。


# 原因

re-bulma の `package.json` は、エントリーポイントを指定している部分を抜粋すると、以下のようになっている。

```package.json
{
  ...
  "main": "lib/index.js",
  "module": "lib-es/index.js"
  ...
}
```

https://github.com/bokuweb/re-bulma/blob/master/package.json

`lib-es/index.js` は ES6 向け、`lib/index.js` は ES5 向けにトランスパイルされてビルドされたものになっている。
ここで、webpack が依存解決時に `lib/index.js` ではなく `lib-es/index.js` を参照していることが原因であった。

# 解決法

webpack では、依存パッケージを解決するとき、[`resolve.mainFields`](https://webpack.js.org/configuration/resolve/#resolve-mainfields) の値を参照する。
このデフォルト値は `["browser", "module", "main"]` となっているため[^1]、ES5 をサポートしたい場合、`module` フィールドの優先度を `main` フィールドよりも下げる必要がある[^2]。

今回は以下のように設定した。

```webpack.config.js
const config = {
  // ...
  resolve: {
    extensions: ['.js', '.jsx'],
    modules: [
      pathLib.resolve(__dirname, './app'),
      pathLib.resolve(__dirname, './node_modules'),
    ],
    mainFields: ['browser', 'main'],
  },
  // ...
}

module.exports = config
```

[^1]: https://github.com/webpack/webpack/blob/master/lib/WebpackOptionsDefaulter.js#L93-L98
[^2]: 今回の場合は `main` フィールドが ES5 向けだったため優先度を上げたが、そうでない場合は優先度を変える必要がある。

# 参考

- [Will/does Webpack support "module" field? · Issue #1979 · webpack/webpack](https://github.com/webpack/webpack/issues/1979)
govmomiを使って仮想インスタンスの情報を取得してみた

今までは`pyvmomi`を使って情報を取得したりしていましたが、試しに`govmomi`も使ってみたくなったので仮想インスタンスの簡単な情報を取得するプログラムを書いてみたので備忘録として残しておきます。
ちなみに、goは勉強し始めたばかりです...。

# govmomi

## GitHub

https://github.com/vmware/govmomi

## ドキュメント

https://godoc.org/github.com/vmware/govmomi

# govmomiインストール

(1) govmomiをインストールします。

```
$ go get -v github.com/vmware/govmomi
```

# govmomiを使って情報を取得

以下のソースでは、仮想インスタンスの `Name` `CPU数` `Memory容量` `Guest` を表示します。

```go
package main

import (
	"context"
	"fmt"
	"net/url"
	"os"
	"text/tabwriter"

	"github.com/vmware/govmomi"
	"github.com/vmware/govmomi/find"
	"github.com/vmware/govmomi/property"
	"github.com/vmware/govmomi/vim25/mo"
	"github.com/vmware/govmomi/vim25/types"
)

const (
	URL      = "https://vCenterIP/sdk"       // ESXi or vCenter URL
	UserName = "administrator@vsphere.local" // ログインユーザー
	Password = "password"                    // ログインパスワード
	Insecure = true                          // 自己証明書の許可 `true`
)

func exit(err error) {
	fmt.Fprintf(os.Stderr, "Error: %s\n", err)
	os.Exit(1)
}

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// 接続先のURLをパース
	u, err := url.Parse(URL)
	if err != nil {
		exit(err)
	}

	// ログインユーザーとパスワードをセット
	u.User = url.UserPassword(UserName, Password)

	// ログイン
	c, err := govmomi.NewClient(ctx, u, Insecure)
	if err != nil {
		exit(err)
	}
	f := find.NewFinder(c.Client, true)

	// データセンターを検索
	dc, err := f.DefaultDatacenter(ctx)
	if err != nil {
		exit(err)
	}

	// 見つけたデータセンターのローカルコールを使う
	f.SetDatacenter(dc)

	// データセンター内の仮装インスタンスリストを取得
	vms, err := f.VirtualMachineList(ctx, "*")
	if err != nil {
		exit(err)
	}

	// 参照リストに変換する
	var refs []types.ManagedObjectReference
	for _, vm := range vms {
		refs = append(refs, vm.Reference())
	}

	// 指定したプロパティの取得
	pc := property.DefaultCollector(c.Client)
	var vmt []mo.VirtualMachine
	err = pc.Retrieve(ctx, refs, []string{"config"}, &vmt) // ここでは `config` プロパティを指定
	if err != nil {
		exit(err)
	}

	// 仮想インスタンス情報を出力
	tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0)
	fmt.Fprintf(tw, "Name:\tCPU:\tMemory(MB):\tGuest:\n")
	for _, vm := range vmt {
		fmt.Fprintf(tw, "%s\t", vm.Config.Name)
		fmt.Fprintf(tw, "%d\t", vm.Config.Hardware.NumCPU)
		fmt.Fprintf(tw, "%d\t", vm.Config.Hardware.MemoryMB)
		fmt.Fprintf(tw, "%s\t", vm.Config.GuestFullName)
		fmt.Fprintf(tw, "\n")
	}
	tw.Flush()
}
```

# 実行例

実行してみます。

```
$ go run get_vm_info.go
Name:           CPU:  Memory(MB):  Guest:
MTA             1     2048         CentOS 7 (64-bit)
Windows7        1     1024         Microsoft Windows 7 (32-bit)
vCenter         2     8192         Microsoft Windows Server 2012 (64-bit)
```

動いた :-)
pyvmomiだと時間がかかる処理でも、goで作り直してあげれば実行処理が効率化されることを期待！！
MacVim-Kaoriya で powerline がズレる

# 症状

MacVim-Kaoriya で powerline を使おうとするとこんなふうにズレて悲しい。
![before.png](https://qiita-image-store.s3.amazonaws.com/0/110491/48e9e3b2-78ae-d76b-45e0-8e9eb7ef72c8.png)

# 原因

/Applications/MacVim.app/Contents/Resources/vim/vimrc で

```
set ambiwidth=double
```

と設定されたことにより、powerline 用の追加文字が 2 文字幅として扱われてしまった。

# 直し方

~/.vimrc に

```
set ambiwidth=single
```

を加える。
![after.png](https://qiita-image-store.s3.amazonaws.com/0/110491/9f47ad10-5ef0-cf08-bdca-977e89ddfb26.png)
Androidのroot化の手順（Xiaomi mi 5）

デバイス概要

- 2016年発売
- RAM 3GB
- AnTuTu 140000超え
- コードネームは `gemini`

必要なもの

- ADB使えるPC
- Xiaomi端末のアンロックにはWindows用ソフトウェアを起動する必要がある
    - Wineで代用できなくはない・・・らしい

手順

- ブートローダーをアンロックする（最初からアンロックされている場合あり）
    - Xiaomiに申請する
    - その後Windows機を使ってアンロック
    - Windows機が無くてもできるっぽい http://en.miui.com/thread-276268-1-1.html
- TWRPもしくはCWMなどのカスタムリカバリをダウンロード
    - `twrp xiaomi mi5` とかで検索すれば出る
    - ここでダウンロードしたファイルを `recovery.img` とする
- SuperSUをダウンロード（supersu.zip）
- Developer Modeを有効化
- USB接続方式をカメラ（PTPに）
- 電源を切る
- ボリュームダウンボタンを押しながら起動
- FASTBOOTの画面になるので、下記コマンドを打つ

`sudo fastboot boot path/to/recovery.img`

- これでTWRPの画面に行ける
- あとは `Install Zip` からSuperSuを焼き、「wipe Dalvic cache」をすればOK
    - ここでロムとGappsを焼けば、カスタムロムが入る
    - LineageOSは https://download.lineageos.org/gemini から
Vagrantのインストール手順書（Windows 10, CentOS 7.2, Vagrant 1.9.5, VirtualBox 5.1.22)

# Vagrant インストール手順書 (2017/05/21 更新)
## ※環境、バージョン合わせてくださいね
## 環境
- Windows 10 Pro 64bit
- Hyper-Vを無効にしておくこと
- BIOSでVTを有効にしておくこと

## VirtualBoxのインストール
- [VirtualBox 5.1.22](https://www.virtualbox.org/wiki/Downloads)

## Vagrantのインストール
- [Vagrant 1.9.5](https://www.vagrantup.com/downloads.html)

## コマンドプロンプトを開く
- コマンドプロンプトを管理者権限で実行
- コマンドは以下のようになる

~~~
$ vagrant -v
Vagrant 1.9.5
$ cd C:\HashiCorp\Vagrant
$ mkdir centos72
$ cd centos72
$ vagrant box add centos72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
$ vagrant init centos72
$ dir
. .. .vagrant Vagrantfile
~~~

- **C:\HashiCorp\Vagrant\centos72\Vagrantfile** が生成されたことを確認。

- 共有フォルダ設定のため、Vagrantfileの46行目

~~~
  # config.vm.synced_folder "../data", "/vagrant_data"
~~~

を次のように書き換える

~~~
  config.vm.synced_folder "C:/Users/admin/Documents/workspaces", "/home/vagrant/workspaces"
~~~

- ローカルIPの設定のため、Vagrantfileの35行目のコメントを外す

~~~
  config.vm.network "private_network", ip: "192.168.33.10"
~~~

- Vagrantを立ち上げ、SSH接続

~~~
$ vagrant up
$ vagrant ssh
~~~

- 接続し、共有フォルダが見えることを確認

~~~
$ cd workspaces
$ ls
~~~

- その後、プログラムなどは共有フォルダのworkspacesの中に**s-fujimoto**など自分の名前のフォルダを作成し、そこで行うこと。

~~~
例　C:\Users\admin\Documents\workspaces\s-fujimoto
~~~

## その他
- ※vagrant sshできない場合はPuTTYなどからSSH接続する
![vagrant-putty.png](https://qiita-image-store.s3.amazonaws.com/0/63863/046382ea-7f83-2cb9-c30d-9aba302d702f.png)
![vagrant-putty2.png](https://qiita-image-store.s3.amazonaws.com/0/63863/376d333d-f5d7-f544-6bff-5c1c05f132d1.png)

- login as : vagrant
- password : vagrant


## 参考文献
- [VagrantでCentOS7.2の環境を用意する](http://qiita.com/haessal/items/a8c48fed3087102be8cd)

## Vagrant コマンド Tips
~~~
vagrant up：仮想マシンの起動
vagrant halt： 仮想マシンの終了
vagrant status： 仮想マシンの状態確認
vagrant suspend： 仮想マシンの一時停止
vagrant reload： 仮想マシンの再起動
vagrant destroy： 仮想マシンの削除
~~~