OmniAICreator/Qiita-1.07M huggingface dataset:
Windows(host)からCentOS(guest)へsshログイン

hostからvirtualbox上のguestへsshでパスワードを入力してログインする方法を書きます。

##環境
- host: Windows 10 (Git Bashを使用)
- guest: CentOS 7
- virtualbox

#ネットワーク設定
###1.virtualboxでの作業
- `ネットワーク->アダプター2以降->ホストオンリーアダプター`を選択
- `メニューバー->ファイル->環境設定->ネットワーク->ホストオンリーアダプター`から、
IPv4アドレスを書き留めておく
- `ネットワーク->高度->ポートフォワーディング`でsshのポートを設定しておく

###2.CentOSでの作業
- `nmtui`でデフォルトでは`enp0s8`という名前のネットワークを編集する
- 書き留めておいたIPv4アドレスに末尾に0を付け加えるなりして、IPv4アドレスを設定
- IPv6は`ignore`とする
- `Automatically connect`にチェックを入れる
これで設定は完了！

###3.ネットワーク確認
- `$ ip a`で`enp0s8`のIPv4アドレスが出力されているか確認
- `$ ping IPv4address`でネットワークが疎通できているか確認

#ログイン実行

```:Git_Bash
ssh -p ssh_port_number　[user@***.***.***.*** | user@localhost]
```

これでパスワードの入力を求められたら成功です。
初めてログインするときは警告がでますが、`yes`とすればパスワードの入力を求められます。

セキュリティ面の設定は[こちら](https://wiki.centos.org/HowTos/Network/SecuringSSH?highlight=%28network%29%7C%28ssh%29#head-269bff20ef58d0317e9e222927e738872730f713)を参考にしてください。

#参考
- http://qiita.com/sango/items/816136188387221f05b3
- https://wiki.centos.org/HowTos/Network/SecuringSSH?highlight=%28network%29%7C%28ssh%29#head-269bff20ef58d0317e9e222927e738872730f713
Jupyterでpivottableを使う

##1. Jupyter内でインタラクティブに集計したい
linux環境でJupyterを動かしていて、データを探索的に集計したいときにデータをcsvに出力してローカルのExcelでPivotを使うのは結構面倒なので、できるだけJupyter内でやりたい

調べてみると、[pivottablejs](http://nicolas.kruchten.com/pivottable/examples/)を使えばいいと分かった

そもそもライブラリ名にあるように内部的にはJavascriptで動いているっぽいが、pipで入れると
Jupyterで使えるっぽい


##2. pivottalbejsを入れる
まずはpipで入れる

```bash
pip install pivottablejs
pip install jupyter #jupyterが入ってなければ
pip install seaborn #サンプルデータを使いたいので
```


##3. pivottablejsをJupyterで使う
問題なく入れば、Jupyterを開いて適当にどんな感じか見てみる

```python
import pivottablejs
import seaborn
df_titanic = seaborn.load_dataset("titanic")
pivottablejs.pivot_ui(df_titanic)

```

pivot_ui(DataFrame)のメソッドで起動する

![スクリーンショット 2017-04-02 05.33.17.png](https://qiita-image-store.s3.amazonaws.com/0/55225/69b86f0c-fcbd-977e-21f4-451f0779ca84.png)


出力セルにpivottableが出てくる。これで集計できるっぽい

試しに、タイタニックの生存/死亡を親に対する子供の割合別に集計してみる

![スクリーンショット 2017-04-02 05.37.09.png](https://qiita-image-store.s3.amazonaws.com/0/55225/34dfa0d4-06d1-6949-5e66-1699277283f5.png)

おぉ！！簡単にドラッグ＆ドロップでできる！！

基本的には、公式でどんな機能があるかを確認した方がいいけど、備忘録も兼ねて使える機能を整理しておく

| 機能       |       概要 |
|:-----------------|:------------------|
| Table             | 通常のテーブル |
| TableBarchart             | セル内に棒グラフが表示される |
| Heatmap             | ヒートマップ |
| Row　Heatmap           | 行基準でヒートマップ |
| Col　Heatmap           | 列基準でヒートマップ |
| Line chart           | 線グラフ |
| Bar chart           | 棒グラフ|
| Stacked Bar chart           | 積み上げ棒グラフ|
| Area chart           | 面グラフ|
| Scatter chart           | 散布図|
| Treemap           | Treemap|
| Export tsv           | Tsv形式の出力|


おしまい
Welcartのデータ構造

# はじめに
WordpressのECサイト化プラグイン「Welcart」を扱った案件をやることになりました。
その上でいろんなことを整理しています。
間違っている点などあれば、是非ご指摘頂ければうれしいです。

システムを考える上ではデータ構造が最も大事だと思うので整理しました（DOA:データ中心アプローチとも呼ばれます。）

# ER
本家にERが置いてないので、A5ERを使ってERを起こしてみました。
ちょっとFKの場所がおかしい等ありますが、ちょっとA5に慣れていないのでご容赦を...

左側が、WordPress自体のテーブルで、
右側が、welcartをインストールすることで作成されるwelcartのためのテーブルです。
![screenshot_2017_3_26 (3).png](https://qiita-image-store.s3.amazonaws.com/0/39308/21921186-b2db-9182-c97f-248940e177d3.png)

# 商品マスタ
商品マスタといっても、あくまでもWordPressのプラグインですので、**商品は内部的には記事(wp_posts)と同じ扱い**です。
記事テーブル(wp_posts)に存在しない属性については、基本的には記事メタテーブル(wp_postmeta)に格納されています。
![Screenshot_6.png](https://qiita-image-store.s3.amazonaws.com/0/39308/79565b89-a6a4-2e07-1d14-5ba26605cd60.png)
Powershellでクロージャー使用例


![](https://www.powershellgallery.com/Content/Images/packageDefaultIcon.png)


非常に長いパラメータセットになりがちなので、データとコードをオブジェクトにラップする　
メッセージ作成スクリプトの再利用単純化

```ps1
function Get-MessageObject
{
   param
   (
      [String]$MsgType,
      [String]$Message,
      [String]$CurrentDay,
      [String]$CurrentTime,
      [String]$DayOfWeek
   )
   $Properties = @{
                    'MessageType' = $MsgType
                    'Message'    = $Message
                    'CurrentDay'    = $CurrentDay
                    'CurrentTime'    = $CurrentTime
                    'DayOfWeek'  = $DayOfWeek
                  }
   New-Object -TypeName psobject -Property $Properties
}

function New-MessageGenerator
{
   param
   (
      [String]$MsgType
   )
   $Day = (Get-Date).ToLongDateString()   
   $Time = (Get-Date).ToLongTimeString()
   $DayOfWeek = (Get-Date).DayOfWeek
   {
      param
      (
         [String]$Message
      )
      Get-MessageObject -MsgType $MsgType -Message $Message -CurrentDay $Day -CurrentTime $Time -DayOfWeek $DayOfWeek
   }.GetNewClosure()
}

$function:global:getInfoMsg = New-MessageGenerator -MsgType 'Information'
$function:global:getWarnMsg = New-MessageGenerator -MsgType 'Warning'
$function:global:getErrorMsg = New-MessageGenerator -MsgType 'Error'
$function:global:getExceptionMsg = New-MessageGenerator -MsgType 'Exception'

getInfoMsg -Message 'This is a Information.'
getWarnMsg -Message 'This is a Warning.'
getErrorMsg -Message 'This is a Error.'
getExceptionMsg -Message 'This is a Exception.'
```
Welcartでカスタムフィールドを扱う方法

# はじめに
WordpressのECサイト化プラグイン「Welcart」を扱った案件で必要になったカスタマイズ方法についてまとめておきます。

# カスタムフィールドを扱う方法
Welcartでのカスタムフィールドを扱う方法には公式サイトに記載があります。

1. カスタムフィールドの表示をする。  
少しわかりづらいところにあるのですが、まずはカスタムフィールドを表示するようにします。
右上に[表示オプション]を押下し、カスタムフィールドにチェックを入れます。
![Screenshot_3.png](https://qiita-image-store.s3.amazonaws.com/0/39308/77d81236-484d-f0ed-a71b-2da7f23b9800.png)
2. カスタムフィールドを設定します。  
カスタムフィールドの名前は「wccs_」から始める必要があるのに注意します。
![Screenshot_4.png](https://qiita-image-store.s3.amazonaws.com/0/39308/b4a0a67a-4350-4957-40e0-b27fc25f356c.png)
  
上記の設定をすると、以下のように表示されます。
![Screenshot_5.png](https://qiita-image-store.s3.amazonaws.com/0/39308/191df686-554e-2561-d104-61e64065ea0a.png)


# 表示されるファイルの場所
商品詳細ページ:welcart/wp-content/themes/welcart_default/wc_templates/wc_item_single.php  
カスタムフィールド出力する関数があるファイル:wp-content/plugins/usc-e-shop/functions/template_func.php

以下カスタムフィールド出力している関数

```php:template_func.php
function usces_get_item_custom( $post_id, $type = 'list', $out = '' ){
	global $usces;
	$cfields = $usces->get_post_custom($post_id);
	switch( $type ){
		case 'list':
			$list = '';
			$html = '<ul class="item_custom_field">'."\n";
			foreach( $cfields as $key => $value ){
				if( 'wccs_' == substr($key, 0, 5) ){
					$list .= '<li>' . esc_html(substr($key, 5)) . ' : ' . nl2br(esc_html($value[0])) . '</li>'."\n";
				}
			}
			if(empty($list)){
				$html = '';
			}else{
				$html .= $list . '</ul>'."\n";
			}
			break;

		case 'table':
			$list = '';
			$html = '<table class="item_custom_field">'."\n";
			foreach($cfields as $key => $value){
				if( 'wccs_' == substr($key, 0, 5) ){
					$list .= '<tr><th>' . esc_html(substr($key, 5)) . '</th><td>' . nl2br(esc_html($value[0])) . '</td></tr>'."\n";
				}
			}
			if(empty($list)){
				$html = '';
			}else{
				$html .= $list . '</table>'."\n";
			}
			break;

		case 'notag':
			$list = '';
			foreach($cfields as $key => $value){
				if( 'wccs_' == substr($key, 0, 5) ){
					$list .= esc_html(substr($key, 5)) . ' : ' . nl2br(esc_html($value[0])) . "\r\n";
				}
			}
			if(empty($list)){
				$html = '';
			}else{
				$html = $list;
			}
			break;
	}
	$html = apply_filters( 'usces_filter_item_custom', $html, $post_id, $type );
	
	if( 'return' == $out){
		return $html;
	}else{
		echo $html;
	}
}
```

# 個人的な意見...。
今回welcartのプログラムを眺めているのですが、、、  
ifの中で代入していたり、、、  
引数で'return'という文字列を渡し、その文字列があるかどうかで、値を返すかどうかを決めているのは、  
ちょっとプログラム設計的にどうなんだ。。。っていう感じがします...

# 参考リンク
*i.　カスタムフィールド  @  Welcart オンライン・マニュアル|ECサイト構築プラグイン*
https://www.welcart.com/documents/manual-2/%E6%96%B0%E8%A6%8F%E5%95%86%E5%93%81%E8%BF%BD%E5%8A%A0/i-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89
はじめてのGo(2017年版)

#動作環境
go version1.8

#前提

とりあえずこっから手動でインストール

http://golang-jp.org/

yumでいれる場合は下記のコマンド

```
$ sudo yum install -y golang
```

バージョン確認

```
$ go version
```

#Hello Go World!

##GOPATHの設定

###1.
さて、Go初学者にとって最初の壁は**GOPATH**といっても過言ではないでしょう。
ここは作業ディレクトリに作る、と考えていいと思います。

**追記2017/04/02**
コメントでGOPATHについてのわかりやすい説明があったので、こちらに追記します。
@tenntenn さんありがとうございます。

>GOPATH はインポートパスを解決するために、使われる環境変数ですね。
標準パッケージ以外は、importの後ろに書いたインポートパスから実際のコードを探すために使います。
たとえば、import "hoge/fuga" と書くと、GOPATH以下の$GOPATH/src/hoge/fuga以下を見に行くようになります。

>また、go getというコマンドを使うと指定したインポートパスからライブラリなどをダウンロードしてインストールしてくれます。
その際に、インストールする先もGOPATH以下になります。
なお、GOPATHは複数指定できますので、複数指定してあったら、先頭のパスにインストールされます。
go installはダウンロードせずに、インストールだけをするコマンドなので、同様にGOPATH以下にインストールされます。
main関数があるものであれば、$GOPATH/bin以下にインストールされます。

そして、goファイルをbuildしたときのexeファイルをPATH=~として設定しますが、基本的には、$GOPATHの直下に/binフォルダを作り、そこを指定します。
これらの設定を.bash_profileに書き込みます。





```
$ vi ~/.bash_profile
export GOPATH=/user/go
export PATH=$PATH:$GOPATH/bin

```

書き込んだら

```
$ source ~/.bash_profile
```

で設定を読み込みます。

###2.ディレクトリの作成
作ったGOPATHの直下にテンプレートのディレクトリを作成します。

```
$ cd $GOPATH
$ mkdir src pkg bin

```

###3.githubディレクトリの作成
そして、importするさいにgithubを使う？ので、githubをその下のディレクトリに作成します。

**追記2017/04/02**
こちらも謎が解決したので引用します。
@tenntenn さんありがとうございます。

>GoではGitHubを使うわけではなく、多くのライブラリがGitHub上で公開されており、上記のようにインポートパスを解決するためgithub.comというディレクトリができるわけです。


```
$mkdir src/github.com
$mkdir src/github.com/"githubアカウント名"
```

###4.プロジェクトフォルダの作成
やっとここの下にプロジェクトフォルダを作成できます。
まだファイルではないので、注意してください。

```
mkdir "githubアカウント名"/helloGo
```

###5. goファイルを作ります。

```
$ vim helloGo/helloGo.go
```

```helloGo.go
package main

import "fmt"

func main(){
	fmt.Printf("Hello,Go World")
}
```

ファイルが出来たら、下記コマンドでビルドします。

```
$ go install github.com/"githubアカウント名"/helloGo
```
エラーが出なかったら、これで実行ファイルができています。
生成場所は、**1で書いたPATH**の指定先です。
ここで書いてるとおりだと、$GOPATH/binにあるので、ここまで飛びます。

```
$ cd $GOPATH/bin
```

ここにhelloGoがあるので、実行してみましょう。

```
$ helloGo

Hello,Go World
```

お疲れ様でしたm(_ _)m

#おまけ：gogland IDEの設定
最近intelijからでたgoglandというIDEが良いという噂で、無料で使えるので、これを導入しました。
ただ、最初の設定がよくわからずハマったので、その対応を書いていきます。（初心者向け）

##GOPATHの設定
上で書いたところと同じパスを設定します。
メニューから、
Gogland-EAP->Preference->Go->GOPATH

※GOROOTは設定しなくてもいけるっぽい

##作業ディレクトリの編集
デフォルトだと、ホームフォルダ直下に``GoglandProjects``というフォルダが作られていて、そこにファイルが格納されるようになってるので、これを上と同じ設定にします。

Gogland-EAP->Preference->Go->ProjectStructure
ここの右側のPATHのリストで、+マークを押すと、新たなパスを追加できます。ここで、**4.プロジェクトフォルダの作成**と同じディレクトリを指定します。

以上です。これでうまくbuildできるはず。

#参考

http://qiita.com/ttsuzo/items/45eb4fc269986df9122c
【Xamarin.Forms】【Android】Activityの結果をdependency serviceでハンドルする方法

## Activity（アクティビティ）の結果を dependency service の中でハンドルしたい

Xamarin.Forms の Android 側で音声認識やカメラ等を利用する場合、**dependency service からそれ用のアクティビティを起動し、その処理結果のハンドルまで行う**ということをしたくなったりします。

処理結果のハンドルは、MainActivity.cs 内で OnActivityResult をオーバーライドした処理を実装することでも可能です。ですが、なるべくであれば **MainActivity に個別の処理を実装することを避け、dependency service の中だけで処理を完結させる**方が、「あるべきものがあるべき場所にある」という感じになります。

それを実現するための実装方法を書きます。

## デフォルトの MainActivity への追加実装

プロジェクト作成直後の標準の MainActivity.cs には、以下のように実装を追加します。
~~2行足すだけです。~~ 2行だけでは足りません。すみませんでした。。。
MainActivityの外から参照できるようなイベントハンドラのプロパティを用意し、OnActivityResult でそれを呼びます。

#### 1. usingの追加

```csharp:MainActivity.cs
using Android.Preferences;
using Android.Content;  // なければ追加
```

#### 2. アクティビティ用のイベントハンドラをプロパティとして宣言

これを宣言することで、dependency service 内にアクティビティのイベントハンドラの実体を実装できるようになります。

```csharp:MainActivity.cs
public event EventHandler<PreferenceManager.ActivityResultEventArgs> ActivityResult = delegate {};
```

#### 3. OnActivityResult でイベントハンドラを呼ぶ

```csharp:MainActivity.cs
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
	base.OnActivityResult(requestCode, resultCode, data);

	// resultEventArgsの第1引数(Handled)は、ハンドル後に特に使う用事がなければtrueでもfalseでも問題なさそう
	var resultEventArgs = new PreferenceManager.ActivityResultEventArgs(true, requestCode, resultCode, data);
	ActivityResult(this, resultEventArgs);
}
```

## dependency service 側の実装

#### 1. usingの追加

```csharp:MainActivity.cs
using Android.Preferences;
```

#### 2. MainActivityのインスタンスを持っておくためのフィールドの宣言

これは必ずやらないといけないわけではないですが、MainActivityを保持しておくと便利なので、それ用のフィールドを用意します。

```csharp:SomeDependencyService.cs
private MainActivity mainActivity;
```

#### 3. アクティビティ用イベントハンドラの実体の作成

```csharp:SomeDependencyService.cs
private void HandleActivityResult(object sender, PreferenceManager.ActivityResultEventArgs args)
{
	// SOME_REQUEST_CODEは、アクティビティ呼び出しのときに渡した任意のリクエストコード。
	if (args.RequestCode == SOME_REQUEST_CODE)
	{
		if (args.ResultCode == Result.Ok)
		{
			// アクティビティの処理が成功した場合の処理をここに実装する。
			// 必要となる情報は大体 args.Data から取得できる。
		}
	}
}
```

#### 4. コンストラクタへの処理の追加

コンストラクタに、「MainActivity のインスタンス取得処理」と「イベントハンドラの処理の実体の紐付け」を実装します。

```csharp:SomeDependencyService.cs
public SomeDependencyService()
{
	（省略）

	mainActivity = Forms.Context as MainActivity;
	mainActivity.ActivityResult += HandleActivityResult;

	（省略）
}
```

#### 5. アクティビティの開始処理

```csharp:SomeDependencyService.cs
// someIntentは、アクティビティ呼び出しのための任意のインテント。
// SOME_REQUEST_CODEは任意のint値。
mainActivity.StartActivityForResult(someIntent, SOME_REQUEST_CODE);
```

## サンプルアプリ

上記の実装方法で動かしているアプリです。Xamarin.Formsで音声認識を行っています。
https://github.com/microwavePC/VoiceRecognitionSample
入れておくと便利なツール

#入れておくと便利なツール
入れておくと便利だなぁと思った汎用的なツールを列挙していきます。
常に編集していきます。（makeとか基本に入っているものは除く）

##dig
ドメイン情報をDNSサーバーから取得するツール
nslookupの高級版といった方がいいかな？
これがないと始まらない。

```lang:
yum -y install bind-utils
```

##htop
topの高級版。メモリなどバーで見れたり、ソート出来たり、検索できたり。意外と便利。
epelなのでepelレポジトリ入れてない場合は

```lang:
yum install epel-release
```

```lang:
vi /etc/yum.repos.d/epel.repo
[epel]
enabled=1 → enabled=0
```

してから

```lang:
yum --enablerepo=epel install htop
```


##mailx
shell失敗・成功時などで気軽にメール送りたい時に入れておくと便利だと思います。

```lang:
echo "testmsg" |mail -s "test mail" メールアドレス
```
で簡単に送れます。

```lang:
yum install mailx
```

##nmap
ポートスキャン

```lang:
yum install nmap
```

##whois
ドメイン情報を参照します。
epelなのでepelレポジトリ入れてない場合は

```lang:
yum install epel-release
```

```lang:
vi /etc/yum.repos.d/epel.repo
[epel]
enabled=1 → enabled=0
```

してから

```lang:
yum --enablerepo=epel install jwhois
```
SassからPostCSSへ移行（Vue.js）

## 現在
今Sassでスタイルを書いてますが、今後はPostCSSへの移行も検討するかなと思い、
簡単に移行方法をまとめました。

```html
<style lang="sass" src="./sample.scss"></style>
```

## 変更後
lang="sass"を消します。

```html
<style src="./sample.scss"></style>
```

移行を最小限にするため、一旦Sassライクに書けるprecssを使います。

```zsh
$ yarn add precss --dev
```

vue-loaderのオプションでprecssを読み込みます。

```js:webpack.config.js
module: {
  rules: [
    {
      test: /\.vue$/,
      use: [{
        loader: 'vue-loader',
        options: {
          postcss: [
            require('precss')()
          ]
        }
      }]
    }
  ]
}
```

これでオッケーです

precssを使ってしまうとSassのままで良いじゃんと思ってしまいますが、
PostCSSを使うと、速度アップやカスタマイズによる効率化も期待できるみたいなので、検討してみるのも良いのではないでしょうか。

## おまけ
CSSのLint設定をPostCSSのstylelintを使って設定してみます。

```zsh
$ yarn add stylelint --dev
$ yarn add stylelint-config-standard --dev
$ yarn add stylelint-webpack-plugin --dev
```

webpack.configに以下を設定します。

```js:webpack.config.js
const StyleLint = require('stylelint-webpack-plugin')

module: {
  rules: [
    {
      test: /\.vue$/,
      use: [{
        loader: 'vue-loader',
        options: {
          postcss: [
            require('precss')(),
            require('stylelint')()
          ]
        }
      }]
    }
  ],
  plugins: [
    new StyleLint()
  ],
}
```

`.stylelintrc`を用意して下さい。
ESLintなどを使ってる方は馴染みがあると思いますが、こちらでLintのルールを設定します。
今はどうゆうルールにするか考えてないので、一旦以下にしておきます。

```js:.stylelintrc
{
  "extends": "stylelint-config-standard",
  "rules": {
  }
}
```

以上で設定は完了です。
例えば、以下のようなインデントがおかしいスタイルを書いたりすると、、

```css:sample.scss
.sample {
    width: 100%;  // インデントがおかしい
}
```

webpackでビルドした時に、以下のようにコンソール上で指摘してくれます。

```zsh
src/components/Sample/sample.scss
  2:5   ✖  Expected indentation of 2 spaces   indentation 
```
VirtualBoxで構築したUbuntu上で、adbコマンド(shell/logcat)が失敗する問題の対処法

# Environment

- Vagrant
- VirtualBox
- ホストOS: macOS Sierra 10.12.4
- ゲストOS: Ubuntu 14.04

# Problem

VagrantとVirtualBoxでUbuntu環境を構築し、Android端末をつないで、Ubuntu上で`adb`の`shell`や`logcat`コマンドを実行すると、結果が返ってこない(hanging)する場合があった。

# Solution

stackoverflowで同様の問題があがっており、解決法も書いてあった。
[adb can list devices but adb shell/logcat doesn't work](https://stackoverflow.com/questions/19041653/adb-can-list-devices-but-adb-shell-logcat-doesnt-work/23142099#23142099)

> I had the exact same problem with adb shell hanging. I am running an Ubuntu 12.04 VM guest on an Ubuntu host. The problem for me was the USB Compatibility setting for the VM was set to 1.1, it needs to be at least 2.0. To change the setting power down the VM and choose the "Edit virtual machine settings" in the VMPlayer startup menu. Then select the "USB Controller" device and change "USB Compatibility" to USB 2.0.


要は、VMのUSBコントローラの設定を`2.0`以上に上げればよいということ。

## 具体的な手順

### 1. VirtualBoxのゲストOSを電源オフ状態にする

```
$ vagrant halt
```

### 2. 最新の`VirtualBox`と`Oracle VM VirtualBox Extension Pack`をインストールする

以下のサイトからダウンロードして、インストールする。
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp#extpack

### 3. VirtualBoxの設定でUSBコントーラを2.0にする

1. VirtualBox > 設定 > ポート > USB
2. USB 2.0 (EHCI)コントローラーにチェック

![スクリーンショット 2017-04-02 0.34.27.png](https://qiita-image-store.s3.amazonaws.com/0/9875/12c653c5-5b9b-e44f-ca76-a5551057bf77.png)

### 4. Vagrantを起動する

```
$ vagrant up
```
iTunes Connect から発行したプロモコードをQRコードで読み取る

iOSのプロモコードをQRコードで読み取れるようにするサイトを
つくってみたのでメモ。

# アウトプット
できたサイトがこちら
[Promo2QR / プロモーションコード簡単入力](https://shtnkgm.github.io/Promo2QR/)

![スクリーンショット 2017-04-02 0.37.57.png](https://qiita-image-store.s3.amazonaws.com/0/113553/f1a80f6f-e4f1-0ace-a08e-a2baacd1596c.png)


**BEFORE**
AppStore開いて、プロモコード入力の画面に移動して、ポチポチ入力して...
**AFTER**
QRコード読み取り⇒数タップで秒速インストール

# なぜ作ったか
 - iOSアプリの最終動作確認にプロモーションコードを使うことがあるが、　　
コードを間違えたり毎回入力するのが面倒だったから

 - JQueryのプチ勉強
 - マテリアルデザインのCSSフレームワークを使ってみたかった

# 技術的なメモ
 - [github pages](https://pages.github.com/)で公開しているので費用は0円
 - CSSフレームワークは[Material Design Lite](https://getmdl.io/)を利用、最低限おしゃれな感じにした
 - QRコードの生成は[Google Chart API](https://developers.google.com/chart/)を利用
 - プロモコードを読み取れるようにするにはリンクを以下の形式にする  
https://phobos.apple.com/WebObjects/MZFinance.woa/wa/freeProductCodeWizard?code=[プロモコード]

# 参考にしたサイト
 - [2016年新機能! GitHubのmasterブランチをWebページとして公開する手順](http://qiita.com/tonkotsuboy_com/items/f98667b89228b98bc096)
 - [マテリアルデザインをWEBで再現できるコンポーネント「Material Design Lite」を試してみる](https://creatorclip.info/2015/07/material-design-lite/)
 - [Google Chart APIを使ってQRコードを作る](http://www.atmarkit.co.jp/ait/articles/1602/26/news037.html)
 - [URL for redeeming Mac App Store promo codes](http://stackoverflow.com/questions/8623275/url-for-redeeming-mac-app-store-promo-codes)

# その他メモ
 - プロモーションコードの有効性チェックまでやりたかったが、実現方法が不明  
fastlaneのcodeサービスで昔はできてたが今はできなくなったっぽい
 - iPhoneでプロモコードのコピペが難なくデキる人はそんなに恩恵がないかも
オフラインリアルタイムどう書く E13 の ruby による実装例

問題：http://nabetani.sakura.ne.jp/hena/orde13hextet/
実装リンク集：http://qiita.com/Nabetani/items/50cd05989b6e2812f879

なんかわかりにくい計算になってしまった。

```ruby
def xy(ch)
  shift=[0,1,1,2,2]
  %w(a f j o s x).each_cons(2).with_index(0) do |(b, e),y|
    return shift[y]+ch.ord - b.ord+y*1i if (b...e)===ch
  end
  raise "unexpected"
end

def neis(a)
  me=xy("l")
  "gkpqmh".chars.map do |ch|
    xy(ch) - me + a
  end
end

def normalize(sig)
  Array.new(6){ |ix| sig.map{ |x| x.rotate(ix) }.sort }.min
end

def solve( src )
  poses = src.chars.map{ |x| xy(x) }
  neimap = poses.map{ |me|
    neis(me).each.with_index(0).inject([]){ |acc, (n,ix)|
      acc + [poses.include?(n) ? 1 : 0]
    }
  }
  case normalize( neimap ).join.to_i(2)
  when 288297; "B"
  when 308016; "D"
  when 295497; "I"
  when 280872; "J"
  when 279144; "L"
  when 271656; "N"
  when 845361; "O"
  when 283176; "S"
  when 279594; "Y"
  when 295569; "Z"
  else; "-"
  end
end

if $0==__FILE__
  DATA.all? do |line|
    num, src, expected = line.split(/\s+/)
    actual = solve( src )
    ok = actual==expected
    p [ ok ? "ok" : "**NG**", num, src, expected, actual ]
    ok
  end.tap{ |all_ok| puts( all_ok ? "everythin is okay" : "SOMETHING WRONG") }
end

__END__
0 glmq  B
1 fhoq  -
2 lmpr  N
3 glmp  Y
```

いつもどおり、テストケースの大半は省略。

`case`〜`when` がややマジカルだけど、現物合わせでこんな感じ。
マス目の近傍の情報を収集して正規化すれば行けるよね、という実装。

会場で示したものは配列を使っていたけど、複素数に変更してみた。スッキリするね。

この計算で本当に正しいの？　証明できる？　と言われるとちょっと自信がないみたいなことを会場では言ったけど、証明可能だと思う。
連番アニメーションをjQueryで制御する

背景をスプライトシートにすると

200px*200pxが30コマあった場合に

1frame
background-position: 0px 0px;
3frame
background-position: -400px 0px;

みたいにする。

setIntervalとか使って制御って、js使ってる範囲だと若干処理が面倒くさい。

jqueryのanimateは値が滑らかなので、stepで値に四捨五入をかます。

```js:qiita.js
$("#TARGET").animate({zIndex:1},{
      duration:4000,
      step:function(now){
        var counter = Math.round(now*29);
        var retu = 0;
        if(counter > 80-1){//折り返しが発生してる場合はこんな感じ。
          retu = 2;
        }else if(counter > 40-1){
          retu = 1;
        }
        $("#TARGET").css({"background-position":"-"+(200*counter)+"px -"+(200*retu)+"px"})
      },
      //終わったら
      complete:function(){//ここは初期値にしちゃってる。
        $("#TARGET").css({"background-position":"0px 0px"})
      }
    })

```

こんな感じです。
OpenCVのcvtColorによるRGB画像のグレースケール変換の計算式の中身を調べてみた


# 背景
OpenCVには、画像の色空間を変換するcvtColorという関数があります。そして、cvtColor関数にはカラー画像をグレースケールに変換する機能があります。そのグレースケール変換処理に関して、実際にどういう計算式なのか調べてみました。この記事は、そのメモです。

# やったこと

8bit3チャンネル(Mat3bクラス)のRGB画像からグレースケールに変換する処理を抜粋してみた。
実装されている計算式と、ドキュメントに記載されている式を浮動小数で実装した場合との違いを見てみた。

# 実行環境

- windows 8.1（64ビット）
- Microsoft Visual Studio Community 2015
- OpenCV 3.2.0



# ドキュメントに記載されている式

OpenCV 3.2.0のウェブページ（ http://docs.opencv.org/3.2.0/de/d25/imgproc_color_conversions.html ）を見るとRGBからグレースケールへの変換式は以下のように記述されています。


```math
Y ← 0.299 \times R + 0.587 \times G + 0.114 \times B
```
Yはグレースケールの輝度値です。

# 実装されている式

実際には、固定小数として計算していて式は以下です。

```math
Y ← ( 4899 \times R + 9617 \times G + 1868 \times B + 8192 ) >> 14
```
14ビット右シフトしているのは、16384で割り算するのと同じです。
+8192しているのは、+0.5していることと同じで、四捨五入の効果だと思います。

# 実装の抜粋

グレースケール値の算出式を抜粋してみました。
OpenCVの実装では、parallel_forなどの高速化がなされていますが、
高速化部分は無視して、単純に算出している式だけ取り出してみました。

```cpp
Mat1b cvtColor2(const Mat3b& src)
{
	int db = 1868;
	int dg = 9617;
	int dr = 4899;

	const int yuv_shift = 14;
	int b = 0, g = 0, r = (1 << (yuv_shift - 1));
	int tab[256 * 3];
	for (int i = 0; i < 256; i++, b += db, g += dg, r += dr)
	{
		tab[i] = b;
		tab[i + 256] = g;
		tab[i + 512] = r;
	}

	Mat1b dst = Mat1b::zeros(src.size());
		
	for (int j = 0; j < dst.rows; ++j)
	{
		for (int i = 0; i < dst.cols; ++i)
		{
			dst(j, i) = uchar((tab[src(j, i)[0]] + tab[src(j, i)[1] + 256] + tab[src(j, i)[2] + 512]) >> 14);
		}
	}
	return dst;
}
```
一応、上記の関数を使ってグレースケール化してみます。

```cpp
#include "opencv2\opencv.hpp"
using namespace cv;

int main(int argc, char* argv[])
{
	Mat3b src = imread("fruits.jpg");
	Mat1b dst = cvtColor2(src);
	imwrite("gray.png", dst);
}
```
下の画像が入力画像 fruits.jpgです。

![fruits.jpg](https://qiita-image-store.s3.amazonaws.com/0/122887/a024dffd-cf45-38d8-77ee-b3c1cc4e7117.jpeg)


そして、下の画像がグレースケール結果です。

![gray.png](https://qiita-image-store.s3.amazonaws.com/0/122887/908eea19-cba9-00ea-b5a3-5f95131d3e6f.png)



# 公式と実装されている式との差について

一応、公式を浮動小数で実装した場合と数値が一致するのか調べてみました。
とりあえず入力値(256 * 256 * 256通りのRGB値)を全部試してみて差の絶対値の平均を算出してみました。算出する関数は以下です。

```cpp
void calcDif()
{
	int db = 1868;
	int dg = 9617;
	int dr = 4899;

	const int yuv_shift = 14;
	int b = 0, g = 0, r = (1 << (yuv_shift - 1));
	int tab[256 * 3];
	for (int i = 0; i < 256; i++, b += db, g += dg, r += dr)
	{
		tab[i] = b;
		tab[i + 256] = g;
		tab[i + 512] = r;
	}
	int sum = 0;
	for (int rid = 0; rid < 256; ++rid) {
		for (int gid = 0; gid < 256; ++gid) {
			for (int bid = 0; bid < 256; ++bid) {
				int val1 = (tab[bid] + tab[gid + 256] + tab[rid + 512]) >> 14;
				int val2 = int(0.299 * (double)rid + 0.587 * (double)gid + 0.114 * (double)bid + 0.5);
				sum += abs(val1 - val2);
			}
		}
	}
	double num = 256 * 256 * 256;
	cout << "mean error : " << sum / num << endl;
}
```
結果は、mean_error : 0.00183302 となりました。
差はかなり小さいように思いました。
【初心者投稿-14】友達からMacを借りました！

#昨日までのおさらい
3月末まで13日間、主に平日の夜1時間程度を使いながら、学習を進めてました！

感想としては、「俺頭悪くね？」です。
次から次へと出てくる要素やルールに頭がパンク寸前。

html,cssは入力した内容が反映されて楽しかったけど、phpは全然頭に入ってこないですね…
「いつ使うの?これ！」って感じに…

友達にも、「だったらhtmlを一回やり切れば？」と言われたので、それも方向に入れていきます。

#Macを手に入れました！
友達が使っていないMacを借りて、**人生初Mac**！
今までDJかエンジニアか大学生(イケイケ)でしか見たことなかった自分がMacを使えるなんて…！

二本指でマウスパッド？をいじくっているだけで感動ｗ

今までのwindows人生からついに卒業か…
まずはセットアップをせねば

#学習の記録
* Progate12日目
* 今日の勉強時間：60分(その他Macをいじくる)
* 総学習時間：13時間
* 今日嬉しかったこと：Macゲット！まだまだアップデートが必要だけど、今日寝る前にいろいろやって明日からサクサク使っていきます！
Pepper NAOqi OS 2.5.5 SLAM機能を試してみた

# はじめに
2017/4/4にリリース予定のNAOqi OS 2.5.5に搭載される新機能である「SLAM機能」を使ってみたのでまとめます。

#なぜSLAMなのか
２０１７年2月の１ヶ月間、シリコンバレーに行ってきました。
アメリカでロボットといえば、アマゾンの倉庫ロボットや、ショッピングセンターの警備ロボットなど、移動を伴うロボットが当たり前になっています。
感性に訴えかけるロボットは日本独特の文化といえますが、Pepperも移動をすることによって、活用できるシーンが大幅に広がるのではないかと思い、SLAMの機能を試してみました。

[倉庫ロボット youtube](https://www.youtube.com/watch?v=UtBa9yVZBJM)
[警備ロボット youtube](https://www.youtube.com/watch?v=7ZJQDQ6ySZ0)





#SLAM機能とは
__SLAM__ (Simultaneous Localization and Mapping) とは、__自己位置推定__と__環境地図作成__を同時に行うことを言います。Pepperでは、ざっくり言うと自身が移動できる場所を探索しその地図を作成します。また、特定した移動可能な範囲で指定した方向に移動します。
これによりPepperが特定のエリアを徘徊させることができるので、移動しながら展示物の説明など、これまで以上に動きのある作業を行うことができるのではないでしょうか。Pepperのもつポテンシャルを大いに引き出すことのできる機能とも言えるかもしれません。




#__使用するセンサー__


![image](https://qiita-image-store.s3.amazonaws.com/0/97065/8e7e3312-a0bf-3be7-a794-fdcc99e7d982.png)
実際に、SLAMの探索でPepperがどのセンサーを使って地図作成をしているのか、検証してみました。

Pepperには、様々なセンサーが取り付けられています。今回は、以下の地図作成時に使用されるであろうセンサーに絞って、一つ一つ隠していきました。

| 部位    |       センサー名 |    数    |
|:-----------------|------------------:|:------------------:|
| おでこ・口            |          RGBカメラ |        2        |
| 目          |         3Dセンサー |    1       |
| 脚部             |          レーザーセンサー |        6         |
| 脚部            |            ソナーセンサー |      2       |
| 脚部          |         赤外線センサー |    2       |


#__結果__
PepperがSLAMの地図作成で使っていたのは、
___ソナーセンサー___と__レーザーセンサー__でした。
ちなみに、この二つのセンサーを隠したまま、Pepperを起動(Wake up)すると、「あれっ、僕の足の調子が悪くて動けないですぅぅ」的なことを発して再起動を求められます。
正常に起動さした後に、センサーを隠すことで、検証が始められました。
もちろん、Pepper側からすると周りは障害物だらけと認識するので、その後、一歩も動かず__"レーザーセンサー"__のみを使った地図作成を行なっていました。


![FullSizeRender 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/97065/22823099-cda7-3eaf-f984-9f3d6a704f65.jpeg)

スラムの詳細は。SOFTBANK ROBOTICS DOCUMENTATIONの以下に記載されています。
[NAO qi APIs ALNavigation¶] (http://doc.aldebaran.com/2-5/naoqi/motion/alnavigation.html#alnavigation-exploration)



次の記事で、実際に実装したところについて書いていきます。
[Pepper NAOqi OS 2.5.5 SLAM機能を試す〜その２〜](http://qiita.com/Nariki1998/private/2403066865e59e982239)
コルーチンでfor文のiを使用してオブジェクトを動的に位置設定したい件

# どういうこと？
例えばギャラリー画面で、N×Mのレイアウトでゲームオブジェクトの生成→配置を行いたい場合、同期処理じゃイけてないから、コルーチンで処理したい。
わけあって、以下のような処理のイメージ。

```csharp:イメージ
private void Start{ StartCoroutine(Initialize()); }
private IEnumerator Initialize() {
	for (int j = 0; j < 2; j++) {
		for (int i = 0; i < 3; i++) {
			hoge.registInstantiate((obj) => {
				GameObject go = obj as GameObject;
				go.transform.localPosition = new Vector3(i*10f-300f, 100-j*140f, 0f);
				...
			});
		}
	}
	yield return 0;
	hoge.StartInstantiate();	//registInstantiateで登録したアクションを一気に動かす
}
```

ただこれだと、実際にアクションを動かすタイミングだとiとかjが最後に更新された値(i=3, j=2)として処理されてしまう……困った。

# 対応策

- iを一時変数に代入し、その値を使用する
- メソッドをかませる

# 具体的に
前提：***Unity5.4.0p3***
## ケース1：iを一時変数に代入し、その値を使用する

```csharp:テストコード
private void Start{ StartCoroutine(testFor()); }
private IEnumerator testFor() {
	System.Action[] actions = new System.Action[6];
	for (int j = 0; j < 2; j++) {
		for (int i = 0; i < 3; i++) {
			int tmp_i = i;

			actions[j*3 + i] = () =>
			{
				Debug.Log("i = " + i + ", tmp_i = " + tmp_i);
			};
		}
	}
	yield return 0;

	for(int k=0; k<actions.Length; k++) { actions[k](); }
	yield break;
}
```

```csharp:結果[NG]
i = 3, tmp_i = 2
i = 3, tmp_i = 2
i = 3, tmp_i = 2
i = 3, tmp_i = 2
i = 3, tmp_i = 2
i = 3, tmp_i = 2
```

## ケース2：iを一時変数に代入し、その値を使用する＋メソッドをかませる

```csharp:テストコード
private void Start{ StartCoroutine(testFor()); }
private IEnumerator testFor() {
	System.Action[] actions = new System.Action[6];
	for (int j = 0; j < 2; j++) {
		for (int i = 0; i < 3; i++) {
			int tmp_i = i;

			actions[j*3 + i] = log(i, tmp_i);
		}
	}
	yield return 0;

	for(int k=0; k<actions.Length; k++) { actions[k](); }
	yield break;
}
private System.Action log(int i, int tmp_i) {
	System.Action action = () =>
	{
		Debug.Log("i = " + i + ", tmp_i = " + tmp_i);
	};
	return action;
}
```

```csharp:結果[OK]
i = 0, tmp_i = 0
i = 1, tmp_i = 1
i = 2, tmp_i = 2
i = 0, tmp_i = 0
i = 1, tmp_i = 1
i = 2, tmp_i = 2
```

ただ、参考記事にあるように、Unity5.5系からだとケース1で解決できることを確認済。

```csharp:ケース1をUnity5.5.2p4で動かした結果[OK]
i = 3, tmp_i = 0
i = 3, tmp_i = 1
i = 3, tmp_i = 2
i = 3, tmp_i = 0
i = 3, tmp_i = 1
i = 3, tmp_i = 2
```

# 参考にさせていただきました記事
http://qiita.com/RyotaMurohoshi/items/b246ea0f87117ea7f93f

－以上－
【入門】ESP8266 (ESP-WROOM-02) で単にLチカしても詰まらないのでナイトライダーしてみた【初心者向け】

ハードウェア界隈やIoT界隈での「Hello World!」をLチカと言うそうです。
多分、LEDチカチカの略です。

最近、[ESP8266](http://amzn.to/2zoZ2aj)にはまってしまい、色々作っています。
この記事は初期の頃に単にLチカしても詰まらないし、GPIOも一杯あるし使ってみたいなということで、ナイトライダーしてみた記録です。
※GPIO・・・プログラムで出力入力が切り替えられる端子の事。こんなに簡単 ⇒ ` pinMode(ピン番号, OUTPUT) `

*私は一ヶ月前までIoTとかラズパイとかArduinoとか、やってみたいけど難しそう。。。ソフトは分かるけど、ハードは良くわからん。。。と思っていた人なので、同じように思っていて踏み出せない方に、なんだこれなら簡単そうとか思っていただけると幸いです。*

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「行くぜ、キット！」<br><br>赤色LED買えばよかった。<a href="https://twitter.com/hashtag/ESP8266?src=hash">#ESP8266</a> <a href="https://twitter.com/hashtag/knightrider?src=hash">#knightrider</a> <a href="https://t.co/liBq7LVBbh">pic.twitter.com/liBq7LVBbh</a></p>&mdash; Yukito (@yukitter) <a href="https://twitter.com/yukitter/status/844533980644880384">2017年3月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

##パーツ
ESP8266は[NodeMcu Lua ESP8266 CH340](http://amzn.to/2zoZ2aj)という開発ボードを使っています。
中国から届くのに時間がかかりますが、￥480と激安です。
ピンヘッダも取り付け済みなので、ハンダ付け不要です。

##回路図 っぽいもの
![Lチカ-ナイトライダー回路図.png](https://qiita-image-store.s3.amazonaws.com/0/157770/ab0fa4b1-f92e-5fba-1c31-1889ff0b703d.png)

- GPIOがプログラムでON/OFFや強弱できる3.3Vの＋側になります。
- GNDが－側です。
- LEDには極性があります。接続の向きに注意
- LEDにGPIOを直結するとLEDが壊れます（LEDの仕様にもよる）
- LEDの前に抵抗や定電流ダイオードを入れてください
- 抵抗値は本来、計算式で求めますが、とりあえず点灯するだけなら1KΩとかでOK
- いきなりはんだ付けとかすると大変なので[ブレッドボード](http://amzn.to/2ntPVvU)や[ジャンパ線](http://amzn.to/2ntR2LR)で組むのをオススメ
- 「HiLetgo NEW NodeMcu Lua ESP8266 CH340」は、ボード幅が広めなので、↑のリンクの**片側6列あるブレッドボード**が使いやすいです

##開発環境
以下を参考に整備しました。
**ArduinoのIDE（統合開発環境）をインストールする**
https://okuzawats.com/install-arduino-ide-20150202/

**IDEダウンロード**
https://www.arduino.cc/en/Main/Donate

**ESP-WROOM-02開発ボードをArduino IDEで開発する方法**
http://trac.switch-science.com/wiki/esp_dev_arduino_ide
*（※これを見つけるのにちょっと苦労）*

##ソース
```c:Blink3.ino

int led[] = {16, 5, 4, 0, 14};
int ledSize = sizeof(led) / sizeof(led[0]);

int pos     = 0;
int before1 = 0;
int before2 = 0;
int before3 = 0;
int before4 = 0;

int acc = 1;

void setup() {
  for (int n=0 ; n < ledSize ; n++ ) {
    pinMode(led[n], OUTPUT);  // 指定のピンを出力に設定
  }
}

void loop() {
    analogWrite(led[before4],   0);
    analogWrite(led[before3],  10);
    analogWrite(led[before2],  30);
    analogWrite(led[before1], 100);
    analogWrite(led[pos],     255);

    before4 = before3;
    before3 = before2;
    before2 = before1;
    before1 = pos;
    pos += acc;

    if (pos==0 || pos==ledSize-1) { acc = -acc; }

    delay(200);
}

```

- analogWriteで出力を0～255の間で制御できます。
- 単にON/OFFするなら、digitalWriteを使います。
    - `digitalWrite(btn, HIGH);`
    - `digitalWrite(btn, LOW);`
vue-cli (vuex) で PlantUML エディターを作ってみた

## 背景 (目的)

- [vue-cli を調べてみて](http://qiita.com/kkeisuke/items/0dd5bfdb2c8b457c4a6d)、是非使ってみたかった。
- 昨今の状態管理ライブラリやフレームワークには敷居が高いイメージがあった。[Vuex](https://vuex.vuejs.org/ja/) は簡単そう。
	- https://www.slideshare.net/dena_tech/vuejs-denatechcon-72603570
- 仕事で UML を書く際に、ローカルで PlantUML サーバー起動させたり、Graphviz をインストールするのが嫌だった。([heroku で PlantUML サーバーを立てた件](http://qiita.com/kkeisuke/items/b3ef9b60c551dc7268f8)は別途まとめます。2017/05/27 記事公開しました。)
- http://sujoyu.github.io/plantuml-previewer これを利用させて貰っていたのですが、svg が欲しくなったため。


## 成果物

https://github.com/kkeisuke/plantuml-editor

[PlantUML Editor](https://plantuml-editor.kkeisuke.com/) - PlantUML online demo client -

![PlantUML Editor](https://qiita-image-store.s3.amazonaws.com/0/61513/bb289d58-7e56-2bd8-959a-1063c9440595.png)
2017/08/09 キャプチャ差し替えました。

## 要求/要件定義

【2017/08/09】追記
はてなブログにまとめています。
http://kkeisuke.hatenablog.com/entry/2017/08/07/160845

## モジュール

vue-cli 関連以外のモジュールは以下のとおりです。

- [bootstrap](https://www.npmjs.com/package/bootstrap)
- [plantuml-encoder](https://www.npmjs.com/package/plantuml-encoder)
- ~~[vue2-ace](https://www.npmjs.com/package/vue2-ace)~~
- [brace](https://www.npmjs.com/package/brace)

Vue に関係ないところはすべて上記で補えたので、Vue の学習に専念できました。
vue2-ace はとてもシンプルで、既存ライブラリを Vue の Component としてラップする場合の参考にもなりました。(いつかもう少し拡張したものを自作したい。)

【2017/04/13】追記
vue2-ace と Vuex の同期が難しかったので、brace を使って Component　を作り直しました。

## 感想

- webpack に慣れるのに時間が掛かりました。bootstrap が jquery に依存しており、スコープ解決が出来ない。
  - [bootstrap 4](https://getbootstrap.com/docs/4.0/getting-started/webpack/#importing-javascript) のドキュメントを参考に以前よりスマートに解決できました。（2017/11/18 追記）

```main.js
// App.vue でも可
import 'bootstrap'
```

```build/webpack.base.conf.js
plugins: [
  ...
  new webpack.ProvidePlugin({
    jQuery: 'jquery',
    $: 'jquery',
    'window.jQuery': 'jquery',
    'window.$': 'jquery'
  })
  ...
]
```

- Vue と Vuex についてほぼハマるところはありませんでした(Angular1.x 系の経験あり)。ただ、Component から Store に直接 commit できちゃうのがちょっと気になりました。
- GitHub Pages 用に `config/index.js` を少し編集してプロダクション用のビルド先を `docs` に変えています。
  - 2017/10/01 時点では Netlify で運用中


## 参考

### Vue

- [Vue のライフサイクル](https://jp.vuejs.org/images/lifecycle.png)
- [Vuex の概念](https://vuex.vuejs.org/ja/images/vuex.png)
- [Vue/Vuex のサンプルコード](https://github.com/vuejs/vuex)
- [vue-devtools](https://github.com/vuejs/vue-devtools)
	- AngularJS Batarang を常用しているので、同じように使えて便利でした。

### PlantUML

- [PlantUML Cheat Sheet](http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)

## Todo

- ~~履歴管理~~
	- ~~IndexedDB [Dexie.js](https://github.com/dfahlander/Dexie.js)~~~ 完了 2017/04/13
- [electron-vue](http://qiita.com/SatoTakumi/items/fd79672d7eb8a9b4a0bb)
- ~~テンプレート選択~~ 完了 2017/07/14
	- [この記事](http://blogs.itmedia.co.jp/hiranabe/2014/06/koredake-modeling-at-redajp.html)を参考にしてます。
デレマスで機械学習（データ取得編）

先日、話題の[couseraの機械学習](https://www.coursera.org/specializations/machine-learning)のコースを修了したので、実践で試すため[アイドルマスターシンデレラガールズ](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A4%E3%83%89%E3%83%AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC_%E3%82%B7%E3%83%B3%E3%83%87%E3%83%AC%E3%83%A9%E3%82%AC%E3%83%BC%E3%83%AB%E3%82%BA)のプロフィールデータを使って３つのタイプ（Cu,Co,Pa）の予測に挑戦してみます。
#データの取得
まずは学習に使用するデータの取得です。
[ポケモンapi](https://pokeapi.co/)のデレマス版がないか探したのですが、良さそうなのがなかったので、普通に[デレマスのwiki](https://imascg-slstage-wiki.gamerch.com/)からデータを取得しました。

スクレイピングのやり方は以下のページ等を参考にしました。
http://qiita.com/Azunyan/items/9b3d16428d2bcc7c9406

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib2
import csv
from bs4 import BeautifulSoup

# アクセスするURL
url = "https://imascg-slstage-wiki.gamerch.com/%E3%82%A2%E3%82%A4%E3%83%89%E3%83%AB%E4%B8%80%E8%A6%A7"
# URLを読み込み
html = urllib2.urlopen(url)
# htmlをBeautifulSoupで扱う
soup = BeautifulSoup(html, "html.parser")
#１つ目のテーブル内容を全取得
table = soup.findAll("table")[0]
#tableを１行ごとに分解
rows = table.findAll("tr")

csvFile = open("aimasudata.csv", 'wt')
writer = csv.writer(csvFile)
for row in rows:
    csvRow = []
    for cell in row.findAll(['td', 'th']):
        csvRow.append(cell.get_text().encode('utf-8'))
    writer.writerow(csvRow)
```

#結果
こんな感じ
<img width="961" alt="スクリーンショット 2017-04-01 23.10.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/153318/394b64b1-5932-82b0-fd20-275d8be6810d.png">


#メモ
- htmlのタグの見方がわからずsoup.findAllの取得先探すのに時間がかかった。とりあえず表のデータを取得する場合はtableを指定し、それが同じページ内の何番目の表かを把握すれば良い
- 日本語のデータに対してcell.get_text()を使うとアスキーコードは使えんとか言われるので、utf-8へのエンコードが必要
2行同じ内容で続いたら削除するワンライナー

テキストファイルに２行同じ内容が続いたら、その２行とも削除するワンライナーです。

```
perl -e 'while(<>){chop; if($a eq ""){$a = $_}elsif($a ne $_){print $a,"\n";$a=$_;}else{$a=""}} if($a ne ""){print $a,"\n"}'
```

たとえば、下記のテキストが与えられたとします。

```
A
A
B
C
C
C
D
D
D
D
E
```
以下の結果を得ます。

```
B
C
E
```

B と E は１行しか無いので残ります。
C は３つ続いているので、最初の２つが削除されて、１つ残ります。


これが必要になった状況はこんな感じでした。
２つのファイル b0.txt と b1.txt がありました。

``` b0.txt
A	
C	789
```
``` b1.txt
A	123
B	456
C	789
```

最初のカラムだけに着目して、b1.txt では B が追加されたことを知る必要がありました。
あてずっぽうなので、もっといいやり方があったかもしれませんが、とりあえず…

```
diff b0.txt b1.txt  | awk '($2!~/^$/){print $2}' 
```

といった処理をして、以下の結果を得ました。

```
A
A
B
```

両方のファイルに現れた A は連続して２回出現するので、それを削除できれば、一方のファイルにしか現れない B を特定できると考えた次第です。

しかし、この例なら、両方のファイルから、まず、１カラム目だけ抜き出して diff とればいいだけですね(汗) 実際はいろいろといじくり回した後の結果だったので、最適な手順をとれなかったといったところでしょうか。




**【補足】 下記スクリプトは最初に投稿したものです**
　
nakataSynsuke さんのご指摘のとおり、下記の記述から文字列比較の部分を修正したのが、現在、冒頭にあげているスクリプトになっています。

```
perl -e 'while(<>){chop; if($a =~ /^$/){$a = $_}elsif($a !~ $_){print $a,"\n";$a=$_;}else{$a=""}} if($a!~/^$/){print $a,"\n"}' 
```
レイマーチングの距離関数のlength関数を数学的な距離関数に置き換えてみた話

[「ロマンティック数学ナイトボーイズ」](https://connpass.com/event/50636/)の発表した記事を書きます。

# 記事
* [ちょっと距離についてまとめてみた。](http://qiita.com/muripo_life/items/f122526a38bb75ba02f2)
* [GLSLレイマーチング研究_距離関数について勉強してみた15(Heartの関数を作ってみた)](http://qiita.com/muripo_life/items/a4e674ec842630618927)
* [GLSLレイマーチング研究_距離関数について勉強してみた16(Heartの関数を作ってみた_その2)](http://qiita.com/muripo_life/items/f24408ca1d06eb0658e3)

# やったこと
レイマーチングの距離関数のlength関数を数学的な距離関数に置き換えてみた

## glslでの、lenghtの定義
[GLSLレイマーチング研究_距離関数について勉強してみた01(距離関数と球)](http://qiita.com/muripo_life/items/eb7ec78b08dc39beddd0)

```c++
lenght(p) = sqrt(p.x*p.x+p.y*p.y+p.z*p.z) - r
```

# このlenght関数を以下の距離関数で置き換え見る。

## ハミング距離
```c++
float lengthHamming(vec3 p){
	// カメラの位置を変化させる
	p = vec3(p.x*sin(time),p.y*sin(time),p.z*sin(time));
	if(p==vec3(0.0, 0.0, 0.0)){
		return 2.0;
	}else{
		return 3.0;
	}
}
```
## マンハッタン距離
```c++
float lengthManhattan(vec3 p){
		return abs(p.x)+abs(p.y)+abs(p.z);
}
```

## チェビチェフ距離
```c++
float lengthChebyshev(vec3 p){
		return max(max(abs(p.x), abs(p.y)), abs(p.z));
}
```

## L^2ノルム(実装できず)
```c++
// L^2ノルムのプログラミングでの実装
float normLebegueTwo(vec3 p){
	float split      = 10.0;
	float threeSplit = split * split * split;
	float sumLeght   = 0.0;
	vec3 splitXYZ    = vec3(p.x/split, p.y/split, p.z/split);
	for(int i=0; i < 1000; i++){
		sumLeght += length(p) * splitXYZ.x * splitXYZ.y * splitXYZ.z;
	}
	return sumLeght - 1.0;
}
```

# で、ハートの変化をみる
## ユークリッド距離
![motion01.gif](https://qiita-image-store.s3.amazonaws.com/0/102634/9b6f0d5e-866d-0ac2-4006-789a6ecc888f.gif)

## ハミング距離
![motion02.gif](https://qiita-image-store.s3.amazonaws.com/0/102634/ef12e2bf-25bf-a8df-acfe-9e0abcc3d802.gif)

## マンハッタン距離
![motion03.gif](https://qiita-image-store.s3.amazonaws.com/0/102634/f8de2b4c-c0ed-6a0b-1a2a-c95caee2aa29.gif)

## チェビチェフ距離
![motion04.gif](https://qiita-image-store.s3.amazonaws.com/0/102634/a5ef53fc-0e6d-a359-ad8b-9c0e8ef8f7ac.gif)

## ハートの形は、距離ごとに変化します…
* ハミング距離恋愛は、なんかヌメってしている
* マンハッタン距離恋愛は、なんか怪しい
* チェビシェフ距離恋愛は、初心者マーク？
* $L^2$ノルム恋愛は、僕のPCでは実装できない

[ソース](https://github.com/3d-math-pro/RomanticMathNightBoy/tree/master/x_distance_love)
Djangoの導入からサーバー起動まで


## Djangoとは
Pythonで実装されたWebアプリケーションフレームワーク。
簡単に複雑なデータベース主体の Web サイトを構築できる。

## 環境
- CentOS
- Python 3.5.2
- Django 1.10

## Djangoをインストール
Pythonのパッケージ管理システムであるpipを用いて導入する。
Python 3.4以降のバージョンにはデフォルトでインストールされているが
未インストールの場合はインスコしてください。

pipでDjangoをインストールする。
`$ pip install django==1.10`

`$ pip list`
でDjangoが表示されていればインストール完了。

## Djangoを動かしてみる
### プロジェクトの作成
まずはプロジェクトを作成する。
`$ django-admin startproject testProject`

コマンドを実行したディレクトリに、testProject というディレクトリができる。

### サーバーを起動する
testProjectディレクトリに移動する。
`$ cd testProject`

サーバーを起動する。
引数に、ipアドレスとポート番号を指定する。
引数を指定しない場合、127.0.0.1の8000番が指定される。

`$ python manage.py runserver [ipアドレス:ポート番号]`

```
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin,
 auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

April 01, 2017 - 12:43:16
Django version 1.10, using settings 'firstDjango.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

デフォルトの場合は`http://127.0.0.1:8000/`
にアクセスし、以下の画面が表示されればサーバーの起動に成功している。

![djangotest.PNG](https://qiita-image-store.s3.amazonaws.com/0/151404/ece78c85-1c11-a6bd-4b03-17e077f8ca0a.png)

アクセスできない場合は、IPアドレスの設定を確認する。

CTRL + C でサーバーを終了。

サーバー起動時にコマンドラインに表示される
You have 13 unapplied... というmigrationsに関するエラーを消すには
サーバーを終了してから
`$ python manage.py migrate`
で消すことができる。

以上、導入からテストサーバーの起動まで。
メールの送信ができない！550-5.7.1 this message does not meet IPv6 sending guidelines regarding PTR（postfix）

#はじめに
postfixでメールサーバーを構築し、送信テストを行ったら送信できたりできなかったり、送信できても迷惑メールBoxに入ったり、入らなかったり。。。。。
送信できなかった時は、自分自身にメールが返ってきていました。。。
送信できる時とできない時がある。
迷惑メールに行く時といかない時がある。
原因がわかったので、解決方法をまとめます！

送信できなかった時に返ってきたメールは下記のような感じです。
**5.7.1.エラー**っぽいですが。。。。

```
# less /home/test/Mailbox ※該当箇所のみ記載
Status: 5.7.1
Remote-MTA: dns; gmail-smtp-in.l.google.com
Diagnostic-Code: smtp; 550-5.7.1 [2406:da14:f9e:2700:ac0a:aa1d:af29:fb6d] Our
    system has detected that 550-5.7.1 this message does not meet IPv6 sending
    guidelines regarding PTR 550-5.7.1 records and authentication. Please
    review 550-5.7.1  https://support.google.com/mail/?p=IPv6AuthError for more
    information 550 5.7.1 . 36si6344033pgx.243 - gsmtp
```

#原因
**postfixがIPv6で送信しようとしたが、IPv6の設定をしてなかった。。。。**
####postfixは、デフォルトでIPv6を優先して使用しようとします！！####
該当箇所は下記の通りです！
現状の設定を確認しましょう！！

```
# vi /etc/postfix/main.cf ※該当箇所のみ記載

１１９行目　inet_protocols = all　←★使用するプロトコルが「全て」になっていました。このままだと、IPv6を優先して送信しようとします。
```

**このままの設定で、IPv4しか持っていないサーバーで送信しようとすると、「はじめに」で述べたような事象が発生します！！**




#解決策
##解決策①（サーバーにIPv4しかない場合）
**使用するプロトコルをIPv4に変更する！**

```
●設定変更
# vi /etc/postfix/main.cf ※該当箇所のみ記載

１１９行目　inet_protocols = ipv4　←★使用するプロトコルを「IPv4」に変更。


●設定反映
# systemctl restart postfix
```

ちなみに、「ipv4」を大文字で「IPv4」と書くと、postfixの構文エラーになります。


##解決策②（サーバーがIPv4, IPv6のどちらにも対応している場合）
**使用している送信アドレスにAAAAレコードを設定する！（DNSサーバー内）**
一応設定内容も下記に記載します。

```
# vi /etc/postfix/main.cf ※該当箇所のみ記載

１１９行目　inet_protocols = all　
```

###AAAAレコード設定方法（Route53）###
**ドメイン取得済み、IPv6を設定済みであることが前提です。**

1.AWSコンソールにログイン


2−1.レコードの登録
>[サービス]→[Route53]→[Hosted Zone]→[取得済みのドメインを押下]
<img width="1278" alt="スクリーンショット 2017-03-26 12.22.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/168635/6c438eba-9eaf-c170-451b-2ea29d8a7358.png">

2−2.レコードの登録
>[Create Record Set]→[Name: 送信アドレス（未記入でも可）]→[Type: AAAA - IPv6 address]→[Value: IPv6アドレス ]→[Create]
<img width="1280" alt="スクリーンショット 2017-04-01 22.44.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/168635/c9e9e725-29ba-4d9b-a07c-0aa15ec4880f.png">
>登録後は下記のように、表示されます。
<img width="1280" alt="スクリーンショット 2017-04-01 22.49.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/168635/42b3c6d8-a261-ff59-86d5-424bd91b4e2a.png">


3.浸透の確認（登録されたか確認）
> 下記コマンドを実行します。

```
# dig smtp.perfectakahashi.com aaaa

; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3.2 <<>> smtp.perfectakahashi.com aaaa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25230
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;smtp.perfectakahashi.com.	IN	AAAA

;; ANSWER SECTION:
smtp.perfectakahashi.com. 60	IN	AAAA	2406:da14:f9e:2700:ac0a:aa1d:af29:fb6d ←★ここを確認！設定したIPv6が表示されることを確認。

;; Query time: 128 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: 土  4月 01 22:53:45 JST 2017
;; MSG SIZE  rcvd: 81
```

これで設定は完了です！
メールを送信してみてください！


####AWSでIPv6を設定する方法は、下記URLを参考にしてください。####
[【手順】iOSのAPIサーバーに必要なIPv6をEC2に設定してみた（VPC)](http://qiita.com/takahashi-kazuki/items/30887e3d9f396813e700)
ちょっと距離についてまとめてみた。

[「ロマンティック数学ナイトボーイズ」](https://connpass.com/event/50636/)の発表をするにあたって、距離空間の記事を書こうと思います。

# 距離ってなによ？
GLSLやレイマーチングなど、3D数学をされていると、図形の形を表す数式の方程式だと思います。

だた、今回は、数学における距離を話そうと思います。

## 数学がおける距離とは
集合 $X$ 上で定義された $2$ 変数の実数値関数 $d: X × X → R$が、
任意の $x,y,z ∈ X$ に対して

1. 非負性（正定値性） : $d(x, y) ≥ 0$<br>
2. $x = y \Longleftrightarrow d(x, y) = 0$<br>
3. 対称性 : $d(x, y) = d(y, x)$<br>
4. 三角不等式 : $d(x, y) + d(y, z) ≥ d(x, z)$<br>

を満たすとき、$d$ は $X$ 上の距離関数であるといい、対 $(X, d)$ を距離空間と呼ぶ。

# 何のことかわかりませんね?
これって所謂、データの大きさを決めているんですよね。

# 例えば、
ベクトル $(1,2,3)$ と $(4,5,6)$ を比べてみましょう。

この二つのベクトルの数値の決め方は、いくつかあるわけです。

## ユークリッド距離で計る.
$\sqrt{1^2+2^2+3^2} = \sqrt{14}$ と $\sqrt{4^2+5^2+6^2} = \sqrt{77}$ですね。

## ハミング距離で計る
$ |1|+|2|+|3| = 6$ と $|4|+|5|+|6|=15$ ですね。

この時の、大小関係は、どっちの距離で測っても大小関係は変わりませんが、扱う対象によって大きさや基準が変わる可能あります。

# 有名な距離

## ハミング距離
$d(x_1,x_2):=n−\sum \delta(x_1i,x_2i) $
<a href="http://ibisforest.org/index.php?Hamming%E8%B7%9D%E9%9B%A2">詳しくはここ</a>

## マンハッタン距離
$d(x_1,x_2):=\sum|x_{1i}−x_{2i}| $
<a href="http://ibisforest.org/index.php?Manhattan%E8%B7%9D%E9%9B%A2">詳しくはここ</a>

## チェビシェフ距離
$d(x_1,x_2):=\max(|x_{1i}−x_{2i}|)$
<a href="https://ja.wikipedia.org/wiki/%E3%83%81%E3%82%A7%E3%83%93%E3%82%B7%E3%82%A7%E3%83%95%E8%B7%9D%E9%9B%A2">詳しくはここ</a>

# 距離の拡張でノルムという概念がある.
## [ノルム](https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%AB%E3%83%A0) の定義
$K$ を実数体 $R$ または複素数体 $C$（あるいは絶対値を備えた任意の位相体）とし、$K$ 上のベクトル空間 $V$ を考える。

このとき任意の $a ∈ K$ と任意の $u, v ∈V$ に対して、

1. 独立性: $ ‖v‖ = 0 ⇔ v = 0 $
1. 斉次性: $ ‖av‖ = |a|‖v‖ $
1. 劣加法性: $ ‖u + v‖ ≤ ‖u‖ + ‖v‖ $

を満たすような関数 $ ‖•‖: V → R; x → ‖x‖ $ を V のノルムと呼ぶ。

## ノルムって結局
距離の特徴をまとめ直したものです。

[ノルムの意味とL1，L2，L∞ノルム](http://mathtrain.jp/lpnorm)

## 有名なノルム
$L^2$ノルム
$ \|f\|_{{p,X}}:=\left(\int _{X}|f(x)|^{2}\,{\mathrm  d}x\right)^{{1/2}} $

# ちなみに
この距離とかノルムのから線形代数の話を大学では、[関数解析](https://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E8%A7%A3%E6%9E%90%E5%AD%A6)という講義で習います。

# 早い話これってIT業界でなんの役にたつの?
## 統計処理
[マハラノビス距離](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%8F%E3%83%A9%E3%83%8E%E3%83%93%E3%82%B9%E8%B7%9D%E9%9B%A2)という統計処理の距離があります。

$d({\vec{x}},{\vec{y}})={\sqrt{\sum_{{i=1}}^{p}{(x_{i}-y_{i})^{2}\over\sigma_{i}^{2}}}}$

## 機械学習
ニューラルネットワークの普遍性定理の証明に、ハーン・バナッハの定理、リースの表現定理、フーリエ変換など関数解析の定理が使われいるそう。

ニューラルネットワークの根底の理論は関数解析の土台の元に形成されています。

参考：[ニューラルネットワークが任意の関数を表現できることの視覚的証明](https://nnadl-ja.github.io/nnadl_site_ja/chap4.html)
論文:[Approximation by Superpositions of a Sigmoidal Function](http://www.dartmouth.edu/~gvc/Cybenko_MCSS.pdf)

以上で、理論的な内容は終わろうと思います。
MDNの『HTML text fundamentals』の概要

# このページについて
[MDN(Mozilla Developer Network)](https://developer.mozilla.org/en-US/)の技術情報ページを和訳し、要点をまとめたものです。

* 英文のページを読んで理解すること
* 基礎をおさらいすること

を目的にした自己学習のページです。

厳密な和訳ではなく、全文を網羅したものでもありませんが、
掲載内容について間違いがありましたら、ご指摘いただけると幸いです。

気づいたことや感想は、「memo:」としてコメントしています。

# 対象ページ
MDN &gt; Learn web development &gt; HTML &gt; Introduction to HTML &gt; [HTML text fundamentals](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/HTML_text_fundamentals) 

以下、概要。
 
# HTMLテキストの基礎
## 見出しと段落
* 見出しと段落で構造化されたテキストは読みやすい
* 段落はp要素、見出しはheading要素で囲まれる
* heading要素はh1からh6まであり、h1が大見出し、h2が中見出し、h3が小見出しといったレベル分けがされている

### 階層構造について
以下を意識するとよい

* h1要素はページに1つ
* 階層構造を守る。h3要素の下にh2要素を使わない
* h6要素まであるが、必要でない限り、3階層以上の見出しは使わない

### なぜ、構造化が必要なのか？
構造化がされていないと、コンテンツ全体が大きなひとかたまり（改行のない文字の羅列）に見えてしまうため

#### 構造化のメリット
* ユーザーが見出しを読んで、必要なコンテンツかどうかを判断できる（数秒で見つからないとユーザーは離脱する）
* 検索エンジンが見出しを重要語句とみなす（SEO対策）
* 視覚障害者がスクリーンリーダーで聞く場合に、必要な情報を早く見つけることができる
* タグで囲うことで、CSSやJavaScriptのターゲットにできる


### なぜ、意味が必要なのか？
* 信号機で赤が「止まれ」を意味するのと同様、正しい要素を使うことで、コンテンツに正しい意味、機能、見た目を与えることができる
    * h1要素は「ページ上で最も高いレベルの見出し」という意味を持っている
    * CSSでspanタグをh1と同じ見た目にしても、特別な意味をなさない
* 役割にあったHTML要素を使うようにする


## リスト
### 番号なしリスト（unordered list）
買い物リストのような順不同のリストに使われる

```html
<ul>
  <li>milk</li>
  <li>eggs</li>
  <li>bread</li>
  <li>hummus</li>
</ul>
```

### 番号順リスト（ordered list）
順番が必要なリストに使われる

```html
<ol>
  <li>Drive to the end of the road</li>
  <li>Turn right</li>
  <li>Go straight across the first two roundabouts</li>
  <li>Turn left at the third roundabout</li>
  <li>The school is on your right, 300 meters up the road</li>
</ol>
```

### リストの入れ子
li要素の中に、ul要素やol要素を入れることで、リストを入れ子にすることができる

## 強調と重要
### 強調（Emphasis）
語句を強調する場合は、emタグを使う

見た目上、斜体になるが、斜体にするためにこの要素を使ってはいけない。CSSでルールを定義するか、後述のi要素を使うこと。

### 重要（Strong importance）
重要の意味づけをする場合は、strongタグを使う

見た目上、太字になるが、太字にするためにこの要素を使ってはいけない。CSSでルールを定義するか、後述のb要素を使うこと。


### 斜体、太字、下線（Italic, bold, underline）
bタグ（太字）、iタグ（斜体）、uタグ（下線）は、かつてCSSがサポートされていなかった時代に、装飾のための要素として使用されてきた。しかし、近年、意味を重視するようになってからは、使われなくなった。

HTML5で、これらの要素は定義し直され、意味のある役割を持つようになった。

#### i要素
* 斜体で記されるもの
    * 外国語
    * 分類学上の呼称
    * 技術用語
    * 考え

#### b要素
* 太字で記されるもの
    * キーワード
    * 製品名
    * リード文

#### u要素
* 下線で記されるもの
    * 固有名詞
    * スペルミス
Vagrantの上にDocker乗せて動かしてみた

Vue.js + LaravelのSPAを作ろうと思い、ローカル環境をVagrant+Dockerで作ってみました。

[こちら](https://github.com/TsukasaGR/vagrant-docker-nginx-mysql)にサンプルを置いています。

最初はAnsibleも入れてみたんですが、そもそも細かい設定は全てDockerに任せてるのでいらないよなぁと思い、Vagrantfileに寄せてしまいました。

Vagrantfileのシェルはもう少しきれいにしたいなぁとも思いましたが1ファイルで十分な量だなと思ったのでシェルファイルを別出しはしていません。

ちょこちょことつまづきながらだったんですが、[こちら](http://qiita.com/TsukasaGR/items/f67c02e9f5b7bfd2d118)に一番時間が掛かりました。。