OmniAICreator/Qiita-1.07M huggingface dataset:
AWS ELBの正常稼働インスタンス数をチェックするrubyプラグイン

AWSでELB配下に複数のAPサーバを配置しているシーンで確認したいのがActiveなAPサーバ数。
正常稼働APサーバのしきい値以下になった際にアラートするようなNagiosプラグインをRubyで実装したので共有します。

動作確認をした環境情報

- Ruby 2.3.3
- aws-sdkのgemは2.8.0 （gem install aws-sdk -v2.8.0） 


Rubyで書いたプラグインファイルはこちら。

/usr/local/nagios/etc/plugins/check_aws_elb_instances.rb

```
#!/usr/bin/ruby
require 'aws-sdk'

class MonitoringAwsElb
  def initialize options = {}
    # nagiosユーザのIAMを利用してください
    @client = Aws::ElasticLoadBalancing::Client.new(
      access_key_id: 'XXXXX',
      secret_access_key: 'XXXXX',
      region: options[:region]
    )
    @name = options[:name]
    @count = options[:count]
  end

  def run
    response = @client.describe_instance_health(load_balancer_name: @name)
    in_services = response.instance_states.select{|instance| instance.state == 'InService'}.size
    puts "In Service servers are #{in_services} instances."
    if in_services >= @count
      exit(0)
    else
      exit(2)
    end
  end
end
MonitoringAwsElb.new(name: ARGV[2], region: ARGV[3], count: ARGV[4].to_i).run
```

Nagiosプラグイン作成時のポイントは、終了コードの定義だけです。Nagiosでは以下のように定義されています。

- 0:OK
- 1:WARNING
- 2:CRITICAL
- 3:UNKNOWN

今回は、0と2のみを利用しています。


あと、プラグインに渡す引数の情報は以下の通り。

- ARGV[2]　：　ELBのname、
- ARGV[３]　：　ELBのregion
- ARGV[４]　：　正常に稼働とみなすActiveなAPサーバ数


プラグインができたので、あとは実際に監視しているホスト／サービスに設定を組み込みます。

まずはコマンドの定義。

```
define command {
    command_name    check_elb_instances
    command_line    /usr/local/nagios/etc/plugins/check_aws_elb_instances.rb -H '$HOSTADDRESS$' '$ARG1$' '$ARG2$' '$ARG3$'
}
```

続いて監視対象サービスの設定。

```
define service {
        use                     generic-service
        host_name               www.example.net
        service_description     AWS ELB
        check_command           check_elb_instances!sample-app-elb!ap-northeast-1!10
```

ここのcheck_commandのところで、今回作成したプラグインに渡す引数を定義します。
今回の例では、**ap-northeast-1 で稼働する sample-app-elb という名前のELBに紐づくIn-Service状態のAPサーバが10台未満になったらアラートする設定** をしています。

たったこれだけです。
日頃からRubyのコードを書いている人にとってはとても簡単ですね。

Nagiosのプラグイン作成はとても簡単ですので、サービスの信頼性を高めたい方は独自の監視機構を実装してみてはいかがでしょうか。
[JAWS-UG 磐田] EC2からS3へコンテンツアップロード

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 EC2編 #4
### EC2からS3へコンテンツアップロードします。
#### **◆コンソールを使用してEC2からS3へコンテンツアップロードするには**
　※EC2 Systems Managerからコマンドを実行してみよう。
- - -
**１．**[Amazon EC2コンソール](https://ap-northeast-1.console.aws.amazon.com/ec2)を開きます。
　※リンク先をクリックすると、東京リージョンのコンソールに接続します。
- - -
**２．**ナビゲーションペインで[マネージドインスタンス]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/403ab01d-20e3-56cf-fa0c-50ffe2f3fa85.png)
- - -
**３．**EC2サーバを選択し、[コマンドの実行]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/2294713f-89e7-039d-1ff9-6cf8bb222621.png)
- - -
**４．**コマンドのドキュメントから[AWS-RunShellScript]を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/7b51bb9d-e2a0-6a54-8865-ccb2ffc1e3ce.png)
- - -
**５．**Commandsに実行したいコマンドを入力し、[実行]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/d29eec51-7838-704c-9b13-91c2c7a12064.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/8cbcd60e-317f-d2af-8f12-ab4cc65943b5.png)
　※ブラウザ画面の右下にあります。
- - -
**６．**実行した結果が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/3cfa87ec-8ea5-75fc-9693-6864d9433021.png)
- - -
**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/walkthrough-console.html
Go言語で標準入出力をスタブする方法

#Pipeを駆使してスタブする

結論をここに載せておきます。
https://play.golang.org/p/JtIHncxhGw


##こんな感じの関数をテストしたい！って時です。
https://golang.org/pkg/bufio/#example_Scanner_lines

```go:lines.go
//標準入力を行番号付きで標準出力に出力する。refer to https://golang.org/pkg/bufio/#example_Scanner_lines
func hoge() {
	i := 0
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		i++
		fmt.Println(i, scanner.Text()) // Println will add back the final '\n'
	}
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "reading standard input:", err)
	}
}
```


##こんな感じで書きます。
入力、出力、エラー出力をそれぞれパイプで乗っ取って、対象を実行した後、元に戻して終了。

```go:lines_test.go
func TestHoge() {
	strout, _ := StubIO("私が標準入力だ\nガハハ", func() {
		hoge()
	})
	fmt.Println("キャプチャした標準出力")
	fmt.Println(strout)
}

// StubIO stubs Stdin Stdout Stderr in 'fn'.return Stdout and Stderr
func StubIO(inbuf string, fn func()) (string, string) {
	inr, inw, _ := os.Pipe()
	outr, outw, _ := os.Pipe()
	errr, errw, _ := os.Pipe()
	orgStdin := os.Stdin
	orgStdout := os.Stdout
	orgStderr := os.Stderr
	inw.Write([]byte(inbuf))
	inw.Close()
	os.Stdin = inr
	os.Stdout = outw
	os.Stderr = errw
	fn()
	os.Stdin = orgStdin
	os.Stdout = orgStdout
	os.Stderr = orgStderr
	outw.Close()
	outbuf, _ := ioutil.ReadAll(outr)
	errw.Close()
	errbuf, _ := ioutil.ReadAll(errr)

	return string(outbuf), string(errbuf)

}

```

##コピペする前に
既にライブラリ化しましたので、ご自由に使ってください。

```go:"github.com/nak1114/goutil/assert"

import(
    "github.com/nak1114/goutil/assert"
)

func TestHoge() {
	strout, _ := assert.StubIO("私が標準入力だ\nガハハ", func() {
		hoge()
	})
	fmt.Println("キャプチャした標準出力")
	fmt.Println(strout)
}

```


#Go言語はテスト関連が弱いですね。

自前主義ではないのだけど、Rubyで言うところのWebmockやFakeFSやTimeCopも見当たらないし、その他のスタブもあまり見かけませんね。

Webmock -> Mockサーバ立てろ
FakeFS -> 仮想環境でテストしろ

までは解るのですが、TimeCopはどうしろと。dockerの時間機能をゴニョゴニョするくらいしか思いつかないです。

とりあえず、私が必要と感じたものは逐次"github.com/nak1114/goutil"に追加していこうかなと思っています。

##テストフレームワークは結構好き
テスト対象と同じDirにテストを置いておくのは、行き来がしやすくて便利だと思いました。

##誰かアサーション作って！
テストレポートがいい加減になるからアサーションは提供しないよってのは、作りたくないだけですよね。これも自前で比較関数作るのダルいんだけど、私のググり力が足りないので既存のが見つからないんだよなぁ。Gospelも覗いてみたけどちょっと違う。
excel アドイン向けマクロ(4)ハイパーリンクを削除するマクロ EXCEL VBA for Addin "Delete Hyperlink""

```DeleteHyperLink.Bas
Private Sub DeleteHyperLink()
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet
Dim Hlinks As Hyperlink
Dim rng As Range
For Each rng In Selection
Set rng = Selection
If rng.Hyperlinks.Count <> 0 Then
rng.Hyperlinks(1).Delete
End If
Next
End Sub
```

このマクロ自体はさがせばどこかにあるかもしれませんが、
rng.Hyperlinks(1).Delete
と(1)になるのがよくわからない。
複数選択した場合、SelectionのままFor Eachにできるんですね。

使い方を書いていなかったけど、マクロアドインに登録してQATに登録すると、
選択した範囲のハイパーリンクを削除します。
突然式にハイパーリンクがつくようになった時に使えます。
使用頻度が低い時は別にQATに登録しなくても、ALT+F11でVBEを開き、アドインのプロシージャを選択して起動してもいいかもしれません。
グループ毎に最も多く現れるデータを抽出する

次のような例で悩んだのでメモしておきます．

# 前提

日付（`date`），ID（`id`），値（`value`）のあるデータフレーム（`df`）を想定します．同じ日付データが複数あり，更にそれに対して付与されるID，値も異なるとします．

```r
require(tidyverse)
require(lubridate)

set.seed(1)

iter <- 5　# 適当な値

date <- ymd(rep(20170101:20170110, each = iter)) # 日付
id <- sample(1:2, iter * 10, replace = TRUE)     # ID
value <- rnorm(iter * 10)                        # 値

df <- tibble(date, id, value) #データフレーム

df
#> # A tibble: 50 × 3
#>          date    id       value
#>        <date> <int>       <dbl>
#> 1  2017-01-01     1 -0.05612874
#> 2  2017-01-01     1 -0.15579551
#> 3  2017-01-01     2 -1.47075238
#> 4  2017-01-01     2 -0.47815006
#> 5  2017-01-01     1  0.41794156
#> 6  2017-01-02     2  1.35867955
#> 7  2017-01-02     2 -0.10278773
#> 8  2017-01-02     2  0.38767161
#> 9  2017-01-02     2 -0.05380504
#> 10 2017-01-02     1 -1.37705956
#> # ... with 40 more rows
```

# やりたいこと
日付毎に最も多く現れるIDのデータだけを残したいとします．
非常に強引ですが，次のように書くことで抽出できます．

```r
df %>% 
  group_by(date, id) %>% # 日付，IDでグループ化
  count() %>%  # グループ毎の個数をカウント，列"n"ができる
  top_n(1, n) %>%  # n列について，1番大きな値だけを抽出する
  ungroup() %>% 
  right_join(., df, by = c("date", "id")) %>% #日付，IDで結合（右側のdfを残す）
  na.omit() %>% 
  select(-n)　# 余分なn列を消す
#> # A tibble: 34 × 3
#>          date    id       value
#>        <date> <int>       <dbl>
#> 1  2017-01-01     1 -0.05612874
#> 2  2017-01-01     1 -0.15579551
#> 3  2017-01-01     1  0.41794156
#> 4  2017-01-02     2  1.35867955
#> 5  2017-01-02     2 -0.10278773
#> 6  2017-01-02     2  0.38767161
#> 7  2017-01-02     2 -0.05380504
#> 8  2017-01-03     1 -0.41499456
#> 9  2017-01-03     1 -0.39428995
#> 10 2017-01-03     1  1.10002537
#> # ... with 24 more rows
```

もっとよいやり方があると思うのですが，わかりませんでした．
お分かりになる方はご教示いただければ幸いです．
ReactのonClickで、イベントがバインドされた要素自身を捕捉する

# 背景
Rails5.1からwebpackが導入されそうなので、
今のうちからwebpack&Reactで遊んでいる。
（webpacker gemを使っているが、簡単便利過ぎてRails5.1が待ち遠しい。）

# 本題
ReactでonClickイベントをハンドルする際に
クリックされた要素の取得で少し困って調べたので備忘メモ

```
<div onClick={this.handleClick}>
  hoge
  <div>
    fuga　　#これをクリックする
  </div>
</div>
```

こんなDOMに対して、クリックされた要素を取るとき、
・クリックされた子要素を取得するには`e.target`
・イベントバインドされている要素を取得するには`e.currentTarget`
を使う。

```
handleClick(e) {
  console.log(e.target)　　# <div>fuga</div>
  console.log(e.curretTarget) # <div>hoge<div>fuga</div></div>
}
```

それだけ。
[JAWS-UG 磐田] S3バケットのWebサイト公開設定

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 S3編 #2
### S3バケットのWebサイト公開設定をします。
#### **◆新コンソールを使用してS3バケットのWebサイト公開設定するには**
**１．**[Amazon S3コンソール](https://console.aws.amazon.com/s3)を開きます。
　※新コンソール（下記画面）になっていない場合は、[オプトイン](https://goo.gl/Ahe9zz)してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/4c4f10b4-3080-954d-c0a3-9874e97d941b.png)
- - -
**２．**Webサイト公開するS3バケットをダブルクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/287c7a41-21dc-c77a-1c02-1cf998ca4e97.png)
- - -
**３．**[プロパティ]タブ => [Static website hosting]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/3866a7e5-4299-b502-7c63-db9e7f061fcc.png)
- - -
**４．**[このバケットを使用してウェブサイトをホストする]を選択し、インデックスドキュメントとエラードキュメントを入力後 [保存]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/14f06274-9828-d87b-50c7-7bc15748a58c.png)
- - -
**３．**[アクセス権限]タブ => [バケットポリシー]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/3b3df014-5485-3abf-0943-eaf4e5d3d646.png)
- - -
**３．**[バケットポリシーエディター]にバケットポリシーを入力し、[保存]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/dbc22980-f83e-68ab-8105-8b8fa607a85c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/d5f6bcca-2ec9-21d1-fd77-70aa863daa8d.png)
　※ブラウザ画面右上にあります。
- - -
**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/static-website-hosting.html
[AWS編]意外と難しいSingle-AZ運用

# 概要
- AWS上でEC2、RDSの組み合わせでMulti-AZ構成で立ててみたが、いざリクエストを投げると思った性能が出ない場合があると思います。
- 筆者の組織でもアプリの作りの問題も(大いに)あるのですが、EC2を異なるAZ間で配置した場合にEC2-RDS間での性能が出ない。。。
- Single-AZ構成にならざるをえなかったのですが、どうしてもDBレプリケーションは組みたくない、でも冗長化したい！！というか、launchが迫った時点で発覚して冗長化構成組んでるよって言っちゃってた。。。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/159589/f5d02684-07d5-7c04-41b6-ff4aa16ef4b9.png)

# 対策案
- DNSフェールオーバー
- ELB経路切替

これくらいかなー
両方ともRDSのAZが切り替わったことを検知して、上位のアプリサーバ(EC2)をA系からC系とかに切りかえる方法をとった。

# 各案詳細
- DNSフェールオーバー
![スクリーンショット 2017-03-08 22.55.21.png](https://qiita-image-store.s3.amazonaws.com/0/159589/52016bb2-d19a-5e08-5516-50466521736f.png)

- ELB経路切替
![スクリーンショット 2017-03-08 22.57.38.png](https://qiita-image-store.s3.amazonaws.com/0/159589/567dfbe6-7a60-2382-abf8-c5e3b1c4746c.png)

# やってみた
DNSフェールオーバー
- やっぱ伝播(最近は問題にならないらしいけど)がきになる。
- しかもIoTサービスで数s単位でデータを吸い上げる仕組みだったので、待てない！
- ボツ

ELB経路切替
- 当初はLambdaでRDSのイベントを拾ったりして検証してみたけど3000sタイムアウトでやっぱり拾えたり拾えなかったり。。。。
- なので以下の案に切り替えてみた。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/159589/ddf95c54-5508-ee64-b5d4-63a70789a6eb.png)

これだと数minくらいのダウンタイムでなんとかしのげるようになった。

# まとめ
- この仕組み自体アンチパターンだし、そもそもクラウドに行く理由ないよねって思ってます。
- アプリを早く改修してもらわないと(涙)
- 【緩募】もっといいやり方あったら教えてください！！
「30日でできる！ OS自作入門」をMac向けに環境構築する

## tl;dr
https://github.com/tatsumack/30nichideosjisaku のREADMEを読んで環境構築する

## 背景
「30日でできる！ OS自作入門」はWindowsでの開発が前提で書かれているが、先人たちのおかげでMacでも環境構築ができる。
https://github.com/sandai/30nichideosjisaku

がしかし、14日目の「高解像度にしよう(1)」のharib11dを動かしたところ、画面が真っ暗になり、小一時間ハマった。
同様の症状が出ていた記事(http://lv4.hateblo.jp/entry/2012/06/17/165640) を発見したが、同じようにVRAMの番地を変更してもダメ。
エミュレータのバグを疑って、Q.appではなく、homebrewからqemuをインストールして動かしたところ、表示されるようになった。

後に続く人たちが同じハマり方をしないように、オリジナルのレポジトリからforkして、qemuを使うようにMakefileを変更した。
https://github.com/tatsumack/30nichideosjisaku/blob/master/z_tools/qemu/Makefile

El Capitan 10.11.2では動くことを確認したが、Sierraではまだ確認できていないので気が向いたら確認する。

## 追記 (2018/03/22)
macOS Sierra(10.12.5)、qemu(2.5.0)で動かしたところ、harib11dで真っ黒画面になっていた。
`asmhead.nas`で指定しているVRAMのアドレスを`0xfd000000`に変更したところ表示されるようになった。

``` asmhead.nas
MOV    DWORD [VRAM],0xfd000000
```
## 追記 (2019/01/19)

qemu 3.1.0で`-localtime`オプションが廃止されたので、qemuに渡すオプションを修正。
また、必要なツール群をレポジトリに抱き込むようにして、レポジトリをcloneすればだいたい動くようにした。

## 参考
http://qiita.com/chojuku/items/fea8adbb63410590e123
http://d.hatena.ne.jp/sandai/20120728/p2
Wordpress の save_post に頼らない便利なフックのかけ方

Wordpress において記事の登録や更新時の処理にフックをかけるときは以下のような方法をよく取ります。

```php
function my_hook( $post_id ) {

}
add_action( 'save_post', 'my_hook', 10 );
```

あなたが運営または構築中の Wordpress のサイトに「英語 (english)」というポストタイプがあるとします。

そしてそのポストタイプがペンディングとして登録・更新された場合にのみ処理を実行したい場合、以下のような方法が一番簡単です。

```php
function my_hook( $post_id, $post ) {
    if ( 'english' !== $post->post_type || 'pending' !== $post->post_status ) {
        return false;
    }
}
add_action( 'save_post', 'my_hook', 10, 2 );
```

以上で上げた条件以外は return をします。

※add_action では戻り値の判定はしないので、単純に return; だけでもいいです

実はこれをもっと簡単に記述できます。

それが以下です。

```php
function my_hook( $post_id ) {

}
add_action( 'pending_english', 'my_hook', 10 );
```

アクション名を `{status}_{post_type}` とすることで、フックの実行をそのステータスとポストタイプに限定できるのです。

実は[公式ドキュメント](http://wpdocs.osdn.jp/%E6%8A%95%E7%A8%BF%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%81%AE%E9%81%B7%E7%A7%BB)に記載があります。

```
投稿ステータスの遷移について三種類のアクションフックがあります：

transition_post_status/en
{old_status}_to_{new_status} – old_status は以前の、new_status は新しいステータス。
{status}_{post_type} – status は新しいステータス、post_type は投稿タイプ。
```

save_post で済ましてしまう人が多いですが、これらを利用するのが正しい記述方法でしょう。
[Unity] ガラスのような地面を作るための研究

三つの方法が見つけた

# Unity 自身のreflection probe
reflection probeの原理は設定した位置から上、下、左、右、前、後ろを撮影してSkyboxみたいなテクスチャーを作る、そしてもののテクスチャーに合わせる。
効果はこのように
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/1be77ecb-192e-ab2c-5c98-5eb280681a48.png)

参考に
[Unity5でReflection Probeを使った反射を試してみた](http://icoc-dev.hatenablog.com/entry/2015/11/16/102718)

Staticのものしか反射しないらしい、そして実際に使うと位置の設定が難しい、カメラの位置も影響する、使いにくい。

#Screen space reflection
はじめ探した時点では、他の人が自分で作っていたものしかないが、今ではStandard Assetもう提供している、どっちも試したが、やはりUnity自分のSSRが一番いい。でもこの方法ははっきりしない影しかできないから、水やタイルなどの影がほしい場合は使える。

SSRの効果は以下：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/c3a8adf7-2a6a-0d52-27c2-4890c26ef795.png)
見た通り、まだ変なところがあるが...

詳しくは
[Unity で Screen Space Reflection の実装をしてみた](http://tips.hecomi.com/entry/2016/04/04/022550)

#Realtime Reflections
完璧な影ができる、効果は以下：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/e0fd986f-5b99-76a7-1b40-81ce7f3544d0.png)

[Realtime Reflections](https://www.assetstore.unity3d.com/jp/#!/content/21730)

#最後に
本題に戻るが、以上の方法はすべて透明と併用できない、調べたところで、透明と影は元々併用できないので、とても難しい、まだ深く研究する必要がある。
Rxでエラー発生時にX秒後にN回リトライする


Rxでの処理内で何かしらのエラーが発生した場合に一定時間待機してから一定回数リトライし、それでもエラーの場合はエラーを流すといった処理をします。

毎回書き方を忘れてしまうので下記に残します。

下記の`retryWhenError()`メソッドをrxの`retryWhen`の引数にいれればOKです。

```kotlin
private fun retryWhenError(): Function<Observable<out Throwable>, Observable<Any>> {
    return Function { observable ->
        observable.zipWith(Observable.range(0, N + 1),
                BiFunction<Throwable, Int, Pair<Throwable, Int>> { throwable, integer ->
                    Pair(throwable, integer)
                })
                .flatMap<Any> { throwableIntegerPair ->
                    if (throwableIntegerPair.second < N) {
                        Observable.timer(X, TimeUnit.SECONDS)
                    } else {
                        Observable.error(throwableIntegerPair.first)
                    }
                }
    }
}

```
別のAWSアカウントにDNS権限移譲を行う方法

#概要
とあるアカウントのRoute53でドメインを設定し、サブドメインを別のAWSアカウントで管理したいシーンというのはよくあると思います。
例)Aアカウントは自社のアカウントで、Bアカウントは開発委託先に割り当てて、サブドメインはBアカウントで管理したい場合など

# やりたいこと
- Aアカウントでsample.comというドメインが管理されているとします。
- Bアカウントでb-company.sample.com というサブドメインを管理したい。

# 事前
- AアカウントのRoute53のHosted Zoneにsample.comというドメインが登録されていること


![スクリーンショット 2017-03-08 22.22.26.png](https://qiita-image-store.s3.amazonaws.com/0/159589/a31e3c3b-c59f-5e5c-dc81-dc81201d6ed7.png)


# 手順
①Bアカウントにb-company.sample.comという名前でHosted Zoneを作成する
②Aアカウントに上記①で作ったb-company.sample.comのNSレコードを作成し、値にBアカウントのNSレコードの値を入れる。
これで、Bアカウント側でwww.b-company.sample.comなど***.b-company.sample.comのレコードを作成できる。

# 詳細
①Bアカウントにb-company.sample.comという名前でHosted Zoneを作成する

![スクリーンショット 2017-03-08 22.28.39.png](https://qiita-image-store.s3.amazonaws.com/0/159589/5a3d4faa-e788-9586-ac0b-0dceb1b8604d.png)

②Aアカウントに上記①で作ったb-company.sample.comのNSレコードを作成し、値にBアカウントのNSレコードの値を入れる
![スクリーンショット 2017-03-08 22.32.25.png](https://qiita-image-store.s3.amazonaws.com/0/159589/15dd3e81-4623-5fdf-2d12-157bd2bb22e2.png)


# まとめ
意外と簡単にできるので、DNSの権限移譲を考えている方は試してみてください。
Windows GUIプログラミング入門8.1 Visual Studio 2017インストール

# ■はじめに
Visual Studio 2017をインストールします。それだけです。

# ■インストール

ダウンロードサイトで`Visual Studio 2017 Community`を選択します。

<i class="fa fa-cloud-download" style="font-size:1em;"></i> [Downloads | Visual Studio Official Site](https://www.visualstudio.com/ja/downloads/)

「ワークロード」タブ
![vs01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/33c53c1f-1a0b-9db4-5fe4-779df265cbb7.png)

![vs02.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4048289e-ede9-c3c1-68ed-299382dbf449.png)

![vs03.png](https://qiita-image-store.s3.amazonaws.com/0/142879/cd9f3492-8121-d7dc-95fc-f6bd8cbb049c.png)

「個別のコンポーネント」タブ
![vs04.png](https://qiita-image-store.s3.amazonaws.com/0/142879/16a6e0ae-72d4-5f26-09d6-2ccd38b1443e.png)

「言語パック」タブ
![vs05.png](https://qiita-image-store.s3.amazonaws.com/0/142879/ea6715a0-a213-e043-8f46-00636cb0e339.png)

「ワークロード」タブで「.NETデスクトップ開発」のチェックボックスを選択し、「インストール」ボタンを押します。
![vs06.png](https://qiita-image-store.s3.amazonaws.com/0/142879/de93eb23-8c83-87a6-8401-865660c033fe.png)

インストールが完了するまで待ちます。
![vs07.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4ccc7244-c759-d8c3-8a9d-a78406fffbe1.png)

再起動を促されたら再起動します。
![vs08.png](https://qiita-image-store.s3.amazonaws.com/0/142879/aedfc0e1-f078-fb87-e764-6a4e665a52ab.png)

Visual Studio 2017がインストールされました。旧バージョンと共存できるようです。
![vs09.png](https://qiita-image-store.s3.amazonaws.com/0/142879/b71430c2-83db-c422-d18e-a7537a6b84fe.png)

Windows8以降ならスタートにピン留めしておきましょう。
![vs09_2.png](https://qiita-image-store.s3.amazonaws.com/0/142879/23c8c8e6-c651-1767-9881-c671c77122b3.png)

起動してみます。サインインします。
![vs10.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4fa38977-fb48-7145-4c6c-fd0fd0d2c6cd.png)

「新しいプロジェクト」の「その他のプロジェクトテンプレート」リンクをクリックします。
![vs11.png](https://qiita-image-store.s3.amazonaws.com/0/142879/7535e1eb-a83f-3823-78bf-8f59b1d88a3d.png)

作れるプロジェクトを確認します。
![vs12.png](https://qiita-image-store.s3.amazonaws.com/0/142879/98b4557f-81b8-6c65-3e80-28d12fe82266.png)

次回からはVisual Studio 2017を使って作っていきます。

おしまい

---

[＜＜ 最初の記事](http://qiita.com/Kosen-amai/items/f9e3df2aa80363f5af5b "Windows GUIプログラミング入門1 メッセージボックス表示") 　 [＜ 前の記事](http://qiita.com/Kosen-amai/items/c06f4c89f636b781795a "Windows GUIプログラミング入門8 画像、ボタン") 　 [次の記事 ＞](http://qiita.com/Kosen-amai/items/2c03e1342fb6f042effc "Windows GUIプログラミング入門9 ラベル、テキスト、選択系")
[MySQL]オートインクリメント確認・変更

オートインクリメントの確認と変更方法
頻繁にやることではなく、忘れやすいのでメモ

### オートインクリメント確認
<pre>SHOW TABLE STATUS LIKE 'テーブル名';</pre>
または
<pre>SHOW TABLE STATUS where name = 'テーブル名';</pre>

### オートインクリメント変更
<pre>ALTER TABLE `テーブル名` AUTO_INCREMENT = @new_autoincriment;</pre>
<code>@new_autoincriment</code>はint型

#### Tips
書き込み権限のあるユーザーで実行可能です
Powershellでプレミアムフライデー（ワンライナーっぽく）を求める



二番煎じ（一番煎じは右記：[プレミアムフライデーを求める処理を作った - Qiita](http://qiita.com/akrmsd/items/d4523275b38916ffe964)）


# 直近のプレミアムフライデー

今日以降の直近のプレミアムフライデーを求めるやつ。
なお、今日が2017/2/1未満だと何も出力されない。

## v2,v3用

```.ps1
Get-Date |
    ?{$_ -ge (Get-Date 2017/2/1)} |
    %{$_.AddMonths(1)} |
    %{$_.Date.AddDays(- $_.Day)} |
    %{$last = $_; $_} |
    %{1*[System.DayOfWeek]::Friday - 1*$_.DayOfWeek} |
    %{if ($_ -le 0) {$last.AddDays($_)} else {$last.AddDays($_ - 7)}}
```

## v4以降

```.ps1
Get-Date |
    ?{$_ -ge (Get-Date 2017/2/1)} |
    %{$_.AddMonths(1)} |
    %{$_.Date.AddDays(- $_.Day)} -pv last |
    %{[System.DayOfWeek]::Friday - $_.DayOfWeek} |
    %{if ($_ -le 0) {$last.AddDays($_)} else {$last.AddDays($_ - 7)}}
```

# 2017年のプレミアムフライデー列挙

年月を流し込むと、その月のプレミアムフライデーが返ってくる。

```.ps1
1..12 |
    %{"2017/${_}"} |
    Get-Date |
    ?{$_ -ge (Get-Date 2017/2/1)} |
    %{$_.AddMonths(1)} |
    %{$_.Date.AddDays(- $_.Day)} |
    %{$last = $_; $_} |
    %{1*[System.DayOfWeek]::Friday - 1*$_.DayOfWeek} |
    %{if ($_ -le 0) {$last.AddDays($_)} else {$last.AddDays($_ - 7)}}
```

手元の環境での戻り値

```
2017年2月24日 0:00:00
2017年3月31日 0:00:00
2017年4月28日 0:00:00
2017年5月26日 0:00:00
2017年6月30日 0:00:00
2017年7月28日 0:00:00
2017年8月25日 0:00:00
2017年9月29日 0:00:00
2017年10月27日 0:00:00
2017年11月24日 0:00:00
2017年12月29日 0:00:00
```


# 以上

おわり
nowで構築するSlack自動招待(slackin)

いつの間にかheroku deployからnow推奨になっていたのでメモ。

# slackin？
slackの招待を自動化する子。メアドを入れた人へ招待メールを送る
https://github.com/rauchg/slackin

# now？
いわゆるクラウドデプロイ環境。パスワードの代わりにメールのリンクをクリックするとログインできます。
ここでアカウントを先に作っておく。loginを押して出てくる入力欄にメールアドレスを入れると、メールが送られるのでクリックして認証する。
https://zeit.co/

# 事前準備
## npmでデプロイ環境を整える
```
$ npm install -g now
```

## Slack tokenを取得する
ここで生成する。
https://api.slack.com/custom-integrations/legacy-tokens

# デプロイ
slack apiとslackのチーム名を入れて下記を実行

```
$ now -e SLACK_API_TOKEN="<token>" -e SLACK_SUBDOMAIN="<team-name>" now-examples/slackin
```

途中でnowで使っているメールアドレスを聞かれるので入力。入力したメールアドレスへメールが届くので、リンクをクリックして認証。

```
$ now -e SLACK_API_TOKEN="<token>" -e SLACK_SUBDOMAIN="<team-name>" now-examples/slackin
> Enter your email: now-no-mailadress@example.com
> Please follow the link sent to now-no-mailadress@example.com to log in.
> Verify that the provided security code in the email matches Gentle Sea Turtle.

✔ Confirmed email address!

> Didn't find directory. Searching on GitHub...
> Deploying GitHub repository "now-examples/slackin"
> Using Node.js 7.6.0 (default)
> Ready! https://now-examples-slackin-xxxxxxxxxx.now.sh (copied to clipboard) [3s]
> Initializing…
> Building
> ▲ npm install
> ⧗ Installing:
>  ‣ slackin@^0.13.0
> ✓ Installed 144 modules [3s]
> ▲ npm start
> > now-examples-slackin@1.0.0 start /home/nowuser/src
> > slackin --coc "$SLACK_COC" --channels "$SLACK_CHANNELS" $SLACK_SUBDOMAIN $SLACK_API_TOKEN
> Wed Mar 08 2017 13:07:05 GMT+0000 (GMT) – fetching
> Wed Mar 08 2017 13:07:05 GMT+0000 (GMT) – listening on 0.0.0.0:3000
> WARN: no logo configured
> Wed Mar 08 2017 13:07:06 GMT+0000 (GMT) – online 1, total 1
> Wed Mar 08 2017 13:07:06 GMT+0000 (GMT) – ready
> Deployment complete!
```
`https://now-examples-slackin-xxxxxxxxxx.now.sh`にあたるurlをクリックすれば、slackinのページを利用可能です。

### 参照リンク
Slack APIのTokenの取得・場所
http://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb
列挙型Monthを確認してみた

#目的
　列挙型MonthのAPIを見る機会がありました。 ＞[Month＠Java8API](https://docs.oracle.com/javase/jp/8/docs/api/java/time/Month.html)
　ところが「**Monthの数値表現の取得にordinal()を使用しないでください。かわりにgetValue()を使用してください。**」と書かれていました。
　というわけで、確認してみようと思いました。

# 確認
##コード

``` MonthTest.java
import java.time.Month;

public class MonthTest {
    public static void main(String[] args) {
        MonthTest test = new MonthTest();
        test.execute();
    }

    private void execute() {
        Month[] months = Month.values();
        System.out.println(String.format("%9s: %8s / %8s", "Name", "ordinal", "getValue"));
        for(Month month : months) {
            System.out.println(String.format("%9s: %8d / %8d", month, month.ordinal(), month.getValue()));
        }
    }
}
```

##出力結果
```
     Name:  ordinal / getValue
  JANUARY:        0 /        1
 FEBRUARY:        1 /        2
    MARCH:        2 /        3
    APRIL:        3 /        4
      MAY:        4 /        5
     JUNE:        5 /        6
     JULY:        6 /        7
   AUGUST:        7 /        8
SEPTEMBER:        8 /        9
  OCTOBER:        9 /       10
 NOVEMBER:       10 /       11
 DECEMBER:       11 /       12
```

#まとめ
getValueは１から始まることが分かった。
昔は月は０始まりでインクリメントして使ってたけど、getValueを使えば意識をしないで使える。
年と日が１始まりなのに、月だけ０始まりだった違和感が解消されるかも。
Gitコマンドメモ

最近は仕事でGitを使うようになりました。
コマンドがいっぱいあるし、感覚的にしかわかってないので、メモがてら勉強しようと思います。

## pullはするべきじゃない？？
個人的にはとてもお馴染みの、ローカルにリモートのソースを取ってきて、ソースをアップデートしてくれるコマンドです。
しかし、ネット上でよく「git pullは使うべきではない」という旨の記事を見かけます！
何故でしょうか？難しすぎてわからなかったです笑（<a href= "http://hokaccha.hatenablog.com/entry/20120404/1333507076">ここが詳しそう！</a>）
そもそもgit pullは以下のコマンドの組み合わせです。
    - git fetch
    - git merge

git fetchは追跡ブランチにリモートブランチの情報を同期します。
追跡ブランチというのは、ローカルにあります。
リモートブランチの内容を同期するだけのブランチです。

続くgit mergeで追跡ブランチ名の情報をローカルのブランチに反映します。
この時に何かが起こるみたいです。

ちょっとわからないけど、この二つのコマンド使えば良いのかもしれないですね！笑


## merge と rebaseの違い
今日の本題です。
今日の業務ないで、ちょっと問題になったコマンドたち。
結局どう違うのかというと、

   - merge
   ブランチを合流させるのに使います。

   - rebase
   ブランチの派生場所を付け替えるのに使います。

### ２種類のmerge
mergeをするタイミングって２パターンありますよね。

    1. ブランチを切り分けた元の部分が、変更されていない時。(fast-forward）
    2. ブランチを切り分けた元の部分が、変更されている時。

1番の時は単純ですが、２番はコンフリクトが起きる可能性がありますね。
さらに、違うのは１番はマージしたコミットが残りません。
逆に、２番はマージしたコミットが残ります。

１番の時でもマージコミットを残したければ、以下のコマンドを使うことで実現できます。
git merge —no-ff マージするブランチ名


## rebase
先ほど、rebaseはブランチの派生場所を付け替えるのに使う。と書きました。
以下のようなリポジトリがあるとします。

```
--A----B-----C
　　　　|_X_Y
```
現在、masterブランチはCがある方です。
YのあるブランチはmasterブランチのAから派生しています。

これをrebaseすると

```
git rebase master
```

```
--A----B-----C
　　　　　　　　　　　　　　　　　　　　　　　 |_X_Y
```
YのあるブランチはmasterブランチのCから派生していることになります。

rebaseをすると、コミットIDが変わってしまいます。
つまり、全く新しいコミットになってしまうのです。
だから、勝手にリモートのブランチをrebaseしちゃうと他の人がそのブランチにコミットできなくなってしまいます。
チーム開発の時は使わないようにしましょう。
[JAWS-UG 磐田] S3新コンソールを使用するには？

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 S3編 #0
### S3新コンソールに切り替え（オプトイン）します。
**１．**[Amazon S3コンソール](https://console.aws.amazon.com/s3)を開きます。

　※下記画面が表示された場合は、[バケットの作成]をクリックしてバケットを作成してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/687aa512-a983-9dfe-a04d-64d6698942da.png)
・[**バケット名**]に名前を入力して、作成をクリックします。
　※この名前は、Amazon S3 にある既存のすべてのバケット名と異なる必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/747ba763-dd79-109c-1125-fa9e97b12de0.png)
- - -
**２．**バケットを選択して、[プロパティ]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/d0776a43-3b9d-74d9-6e84-5e5d0e34a8d6.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/5e8719be-ed50-63fc-ac52-f7904994a2e4.png)
　※ブラウザ画面の右上にあります。
- - -
**３．**ストレージ管理機能を選択して、[オプトイン]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/839da388-73c8-0128-a7d1-4c35d68900f8.png)
- - -
　※新コンソールに切り替わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/06e90d65-5094-c055-ce99-a21b0e67862d.png)
- - -
**４．**１．でバケット作成した場合は、バケットを選択して[バケットを削除する]をクリックします。
　※新コンソールに切り替えるためにバケットを作成したので、一度削除します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/2f105d83-9e2e-6a79-fba4-7697680f0a78.png)
　※バケットの名前を入力して、[確認]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/abfadbf5-a604-c96e-9d93-53bfa85dfed1.png)
- - -
**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/what-is-s3.html
【手順】teratermのショートカット作成方法

# はじめに
teratermでSSH接続するサーバーが増えると、パスワードやユーザー名、鍵の管理が複雑になりますよね。「簡単にログインしたい！」という方向けに、teratermのショートカット作成方法をまとめます。　　
**※簡単にログインできちゃうので、本番環境に入る際等は、違う環境に入らないように、本気で気を付けてください！！！**


# 手順
1.ショートカットの作成
> デスクトップで[右クリック]→[新規作成]→[ショートカット]
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/e4e51e56-b449-f731-4c3e-efa5c835b687.jpeg)


2.リンク先の指定
> 下記内容を記載し、[次へ]押下。
> "teratermのexeファイルのパス" 接続先IPアドレス:ポート 認証方法 ユーザー名 パスワード 鍵のファイルパス

```
例
"C:\Program Files (x86)\teraterm\ttermpro.exe" 192.168.10.1:22 /auth=publickey /user=root /passwd=takahashi123! /keyfile=C:\Users\takahashi.kazuki\Desktop\ssh_keys\takahashi_key.pem
```

![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/170ceefe-1f7f-7541-327e-d7c08e8cf879.jpeg)

### 認証方法
パスワード認証：　/auth=passwd
公開鍵認証　　：　/auth=publickey


3.ショートカットの名前設定
> ショートカットの名前を入力し、[完了]押下。
![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/37bcf184-0b38-75ab-36c2-8d16cc86809b.jpeg)


4.完了！
![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/466ca77b-3447-f8f7-eec0-e779afcbbdc6.jpeg)


5.接続！
> 作成したショートカットをクリックすると・・・・接続！！
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/168635/612a77e2-451a-ba8d-392e-c4198582977e.jpeg)

ログイン簡単！
[Unity] 光の研究：Light Shaft、Volumetric Lighting

Light Shaft或いはVolumetric Lightingは下の図のような表現のこと：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/17e58686-48e9-6079-54d9-2e9a2d076584.png)

特にサーチライトの表現をしたい場合はこれを欠かせない。
詳しは以下：
[UnityでLight Shaftを表現する](https://blog.negativemind.com/2015/05/19/light-shaft-on-unity/)

他はVolumetric Lighting同じのものだが、
こっちの方は、光が揺れるの設定もできるから、使いやすい。
[How to get Volumetric Lighting in Unity 5 - Tutorial](https://www.youtube.com/watch?v=H5v_X1k02U0)

注意点としてdirectional lightとspot lightしか使えないが、まあ…元々この時だけ使いたいから問題ない。
[Visual Studio Code] 拡張機能のコントリビュート方法メモ

VSCodeのなにかの拡張機能にPRを投げたいときの手順メモ（主に5番について）

1. Gitのリポジトリをforkする
2. ローカルにcloneする
3. ローカルの拡張機能のディレクトリをワークスペースとして、VSCodeを起動する
4. 必要な修正を加える。
5. プラグインの実行確認を行う。

[Your First Visual Studio Code Extension - Hello World](https://code.visualstudio.com/docs/extensions/example-hello-world)
上記のような `Yeomen` で作成されたプラグインは `vsc-extension-quickstart.md` のようなファイルがあると思われるので確認する。(消されてるならスキップ）

![1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/48af47d1-ae06-4824-746a-9b9fa24d888d.png)

`Ctrl+Shift+D` or `Cmd+Shift+D` でデバッグ画面を表示して `Launch Extension` を実行する。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/599061e8-e640-31fa-8f41-1d7d1065bd8b.png)

すると別ウィンドウで `拡張機能開発ホスト` が立ち上がるので、その画面で動作確認を行なう。

6. 可能ならテストを追加する。
7. PRを投げる。

以上です。
[JAWS-UG 磐田] S3バケットの作成

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 S3編 #1
### S3のバケットを作成します。
#### **◆新コンソールを使用してS3バケットを作成するには**
**１．**[Amazon S3コンソール](https://console.aws.amazon.com/s3)を開きます。
　※新コンソール（下記画面）になっていない場合は、[オプトイン](https://goo.gl/Ahe9zz)してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/40bb3d51-9a9a-3cf5-7f52-7605683829fa.png)
- - -
**２．**[バケットを作成する]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/64038709-c223-ad73-6055-3ee8d0bb2536.png)
- - -
**３．**バケット作成ウイザードから[バケット名]の入力とリージョンを選択して、[作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/f2b111bc-f640-9df1-40da-b7821690f50d.png)
- - -
**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/create-bucket.html
[Unity] Animatorシステムを使う時の注意点

Unityのアニメーションでは以下のようにGUIのState Machineを使える：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/848fc309-a96a-faee-8000-80a1aeeb7f58.png)

初めてこれを知った時、アニメの制御はすべてこのシステムだけにして、スクリプトは完全に入力を反応するにしたいが、いくつの理由でそれを叶わない：

# 即時性がない
上の図のAttackをtrueにする
```csharp
anim.SetTrigger("Attack");
AnimatorStateInfo info = anim.GetCurrentAnimatorStateInfo(0);
```
StateはAttackのStateに変わるはずだが、でもAnimatorStateInfoの値は元のStateのまま、Blendingなどいろいろな理由ですぐに変えない。なので即時性が必要な判断は出来ない。

例えば、”ジャンプする時に何かできない、同じく何かをやる時ジャンプができない”を実現する場合は、入力でジャンプを押したのに、実際はまだジャンプの状態に入ってないから他のことはまだできる、そしてそのことをやっている時、ジャンプしっちまった。

# 無効なに入力を取り消さない
一度trueにしたtriggerは設定したStateに変わるとfalseに戻る。でも、言わばそのStateに変わる前にずっとtrueのまま、それは問題になる。

例えば、ジャンプする時に攻撃ができない場合は、ジャンプのstateでAttackを押した、ジャンプのstateはAttackのStateに変えないから何も起こらないが、着地後Idleに戻るから、Attackのstateに変える、そしてこの時AttackのTriggerはtrueのままだから、攻撃しっちゃう。

# 最後に
Unityのアニメーションシステムはまだ完全理解し切れていないが、今理解している範囲ではやはりまだスクリプトに頼るしかない。
Linuxのファイルシステムまとめ

# Linuxファイルシステムとは
ファイルシステムとは、ハードディスクやUSBメモリ、CD、DVDなどのデータにアクセスするための仕組みです。

# Linuxの主なファイルシステム
## ext2(second extended filesystem)
初期のLinuxのファイルシステムを拡張したもの。


## ext3(third extended filesystem)
Linuxの主流のファイルシステム。


## ext4(fourth extended filesystem)
ext3の後継ファイルシステム。
拡張機能を使っていない場合に限り、ext3としてマウント可能。


## tmpfs
メモリ上に保存する、一時ファイルのための仕組み。
/tmp配下は、ハードディスクで永続的に保存してあるのではなく、メモリ上に保存されているだけである。
したがって、サーバーの再起動をするとデータは消える。


## UnionFS
複数のディレクトリを重ねて、1つのディレクトリとして扱うことができるファイルシステム。
書き込み可能なディレクトリを、読み取り専用のディレクトリに重ねることで、仮想的にディレクトリの内容を変更することも可能。


## ISO-9660
ISOで標準化されたCD-ROMのファイルシステム。
Linux以外のOSもCD-ROMを読み込むことが可能。


## NFS
UNIXで利用される分散ファイルシステム及びそのプロトコル。


## XFS
Linuxで広く用いられているファイルシステムであるext2ファイルシステムの欠点とも言われる巨大なファイルの扱いや障害対策を補うことのできるファイルシステム。
ジャーナリング機能（更新履歴、通信記録等の情報を記録する）を持つファイルシステム。  
上記機能を持つことで、ファイルシステムが破損した際に高速に修復可能。  
64ビットファイルシステムを採用し、最大1800TB(テラバイト)のディスクスペース、最大900TBのファイルも扱うことができる。
あいうえお.json　その2

どこかの誰かが楽できますように。

```json:aiueo.json
{
	"あ":{
	  "me":"a",
	  "child":{"0":{"あ":"a"},"1":{"い":"i"},"2":{"う":"u"},"3":{"え":"e"},"4":{"お":"o"}}
	},
	"か":{
	  "me":"ka",
	  "child":{"0":{"か":"ka"},"1":{"き":"ki"},"2":{"く":"ku"},"3":{"け":"ke"},"4":{"こ":"ko"},"5":{"が":"ka"},"6":{"ぎ":"ki"},"7":{"ぐ":"ku"},"8":{"げ":"ke"},"9":{"ご":"ko"}}
	},
	"さ":{
	  "me":"sa",
	  "child":{"0":{"さ":"sa"},"1":{"し":"shi"},"2":{"す":"su"},"3":{"せ":"se"},"4":{"そ":"so"},"5":{"ざ":"sa"},"6":{"じ":"shi"},"7":{"ず":"su"},"8":{"ぜ":"se"},"9":{"ぞ":"so"}}
	},
	"た":{
	  "me":"ta",
	  "child":{"0":{"た":"ta"},"1":{"ち":"chi"},"2":{"つ":"tsu"},"3":{"て":"te"},"4":{"と":"to"},"5":{"だ":"ta"},"6":{"ぢ":"chi"},"7":{"づ":"tsu"},"8":{"で":"te"},"9":{"ど":"to"}}
	},
	"な":{
	  "me":"na",
	  "child":{"0":{"な":"na"},"1":{"に":"ni"},"2":{"ぬ":"nu"},"3":{"ね":"ne"},"4":{"の":"no"}}
	},
	"は":{
	  "me":"ha",
	  "child":{"0":{"は":"ha"},"1":{"ひ":"hi"},"2":{"ふ":"hu"},"3":{"へ":"he"},"4":{"ほ":"ho"},"5":{"ば":"ha"},"6":{"び":"hi"},"7":{"ぶ":"hu"},"8":{"べ":"he"},"9":{"ぼ":"ho"},"10":{"ぱ":"ha"},"11":{"ぴ":"hi"},"12":{"ぷ":"hu"},"13":{"ぺ":"he"},"14":{"ぽ":"ho"}}
	},
	"ま":{
	  "me":"ma",
	  "child":{"0":{"ま":"ma"},"1":{"み":"mi"},"2":{"む":"mu"},"3":{"め":"me"},"4":{"も":"mo"}}
	},
	"や":{
	  "me":"ya",
	  "child":{"0":{"や":"ya"},"1":{"ゆ":"yu"},"2":{"よ":"yo"}}
	},
	"ら":{
	  "me":"ra",
	  "child":{"0":{"ら":"ra"},"1":{"り":"ri"},"2":{"る":"ru"},"3":{"れ":"re"},"4":{"ろ":"ro"}}
	},
	"わ":{
	  "me":"wa",
	  "child":{"0":{"わ":"wa"},"1":{"を":"wo"},"2":{"ん":"n"}}
	}
}
```
俺も次のプレミアムフライデーがいつか調べるの作った

みんな作っているのを見て、あれば安心かと思い自分用の物を作った。

```go:main.go
package main 

import ( 
	"fmt" 
	"time" 
) 

func main() {
	pf := time.Now()
	 
	for { 
		if pf.Day() != 13 || pf.Weekday() != time.Friday { 
			pf = pf.Add(24 * time.Hour)
			continue 
		}
		break
	} 
	fmt.Printf("気をつけろ！次の出動日は %s だぜ！\n", pf.Format("2006年01月02日")) 
}
```

これで安心！
みんなと違っても気にしない。
centos7 ネットワーク設定

# centos7　ネットワーク設定

デバイスを確認
nmcli d 

インターフェイスを有効化
nmcli c m eth0 connection.autoconnect yes

IPアドレス、サブネットマスクを変更
nmcli c modify eth0 ipv4.addresses 172.16.0.100/24 
※デバイスを確認して「eth0」を変更する

デフォルトゲートウェイを設定
nmcli c modify eth0 ipv4.gateway 172.16.0.1 

DNS設定
nmcli c modify eth0 ipv4.dns 172.16.0.1 

IPを固定割り当てに設定 (DHCP は "auto"に変更)
nmcli c modify eth0 ipv4.method manual 

インターフェースを再起動して設定を反映
nmcli c down eth0; nmcli c up eth0 
※デバイスを確認して「eth0」を変更する

設定確認
nmcli d show eth0 

接続確認
ip addr

ネットワーク再起動
systemctl restart network

ファイル確認
less /etc/sysconfig/network-scripts/ifcfg-eth0
※ifcfg-eth0はデバイスで確認する。
[Unity] root motion による物理(RigidBody)とナビナビゲーション(Navigation)

# はじめに
移動の速度をアニメションに合わせる時、よく使われるのはroot motion。
言わば、アニメションの移動量を実際の移動量にする方法。
設定はまず
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/cdd3d015-14f9-2dda-6b83-14258c75cc61.png)
そして3Dモデルのセッティングのところでroot nodeを指定、そこはモデルデータ自体原点になるジョイントが必要。
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/500d36cf-45bc-54cd-f6e0-141456fb03a9.png)
指定した後、animationsタッグの方はこうなる：
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/193068c1-f66c-7e08-edda-c32e9e2b4ec8.png)
ここで”XZ方向だけ合わせるか、回転を合わせないか”など設定できる。
（PS:　この方法ではY方向の移動がうまくできない、もし誰が分かれば教えていただけると助かる）

# 物理(RigidBody)と併用する時
root motionを使うとRigidBody、物理の部分は変になっちゃう。いろいろ検索したけど、徹底的な解決方法が見つけなくて、自分で適当に弄って方法を発見した。それはスクリプトを使うこと。
root motionの移動はスクリプトに通じても可能、以下のように：

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveControl : MonoBehaviour
{
    void OnAnimatorMove()
    {
        transform.position = GetComponent<Animator>().rootPosition;
    }
}
```
![image](https://qiita-image-store.s3.amazonaws.com/0/124698/b54e0ebd-852b-b1f2-ef2c-0fc3a264d85a.png)

# ナビナビゲーション(Navigation)と併用する時
root motionを使うと自分で前を進めるので、向きだけ変えればいい。なので、ナビナビゲーションの次に位置を分かれば、その位置に向かえば完成。
以下の例は左クリックの位置を目的地に設定する：

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveControl : MonoBehaviour
{
    private UnityEngine.AI.NavMeshAgent agent;

    private void Awake()
    {
        //まず自動の移動をキャンセルする
        agent = GetComponent<UnityEngine.AI.NavMeshAgent>();
        agent.updatePosition = false;
        agent.updateRotation = false;
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(camRay, out hit, Mathf.Infinity))
            {
                //エージェントの目的地を設定
                agent.destination = hit.point;
            }
        }

        //向きをエージェントの次の位置に向かう
        transform.LookAt(agent.steeringTarget);
        //エージェントの現在の位置を更新
        agent.nextPosition = transform.position;
    }
    void OnAnimatorMove()
    {
        transform.position = GetComponent<Animator>().rootPosition;
    }
}
```
自然数1〜100のカードから1枚抜いたときに3の倍数であって5の倍数でない確率をRで求めてみる

[RubyとPythonで求めてみた](http://qiita.com/nekotricolor/items/34e24dfbc6f9e08ab206)のでRでもやってみる。

# 解き方
標本空間S={1, 2, 3, ..., 98, 99, 100}として、3の倍数であることを事象A、5の倍数であることを事象Bとすると、求める確率は：

```math
\frac{n(A \cup B) - n(B)}{n(S)}
```

# Rで書く

和集合はunion(x,y)で計算可能。積集合はintersect。
seq(a, b, l)でa〜bの公差lの等差数列が作成できる。

```r
> a <- c(seq(3,100,3))
> a
[1]  3  6  9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75
[26] 78 81 84 87 90 93 96 99
> b <- c(seq(5,100,5))
> b
[1]   5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95
[20] 100
> e1 <- union(a,b)
> e1
[1]   3   6   9  12  15  18  21  24  27  30  33  36  39  42  45  48  51  54  57
[20]  60  63  66  69  72  75  78  81  84  87  90  93  96  99   5  10  20  25  35
[39]  40  50  55  65  70  80  85  95 100
> (length(e1)-length(b))/100
[1] 0.27
```

# ベン図

ついでにRでベン図も描いてみる。
VennDiagramというパッケージをインストール。

```r
> install.packages("VennDiagram", repos="http://cran.ism.ac.jp/")
```

まずはシンプルにやってみる。trial.tiffというファイルに画像を保存。

```r
> library(VennDiagram)
> venn.diagram(list(A=seq(3,100,3), B=seq(5,100,5)), filename="trial.tiff")
```

できた図はこんな感じ。数字は個数。
![trial_wo_color.png](https://qiita-image-store.s3.amazonaws.com/0/101824/de08a26a-02c0-91a2-03ab-2f67b8cdcc02.png)

色をつけてみる。fillが塗りつぶし（5は水色、6はピンク）、ltyが縁取り線（0で線なし）、alphaは透過率です。

```r
venn.diagram(list(A=seq(3,100,3), B=seq(5,100,5)), fill=c(5,6), lty=0, aplha=0.4, filename="trial2.tiff")
```

![trial_w_color.png](https://qiita-image-store.s3.amazonaws.com/0/101824/54155a9c-481b-7543-e9a8-74c23042222f.png)

# 参考
- [Rによるベン図の描き方 - バイオインフォマティクス入門](http://bio-info.biz/tips/r_venn_diagram.html)
- [集合解析 その3 - 干からびたウェット教授の独習でアール R](http://datator.exblog.jp/23252423/)
- [Venn diagram proportional and color shading with semi-transparency - Stack Overflow](http://stackoverflow.com/questions/8713994/venn-diagram-proportional-and-color-shading-with-semi-transparency)
- [Rによるデータマイニング入門（書籍）](https://www.amazon.co.jp/dp/B01IGW56D4/)
MacOS El CapitanへのErlangとElixirのインストールの覚書

# Erlangのインストール

まずソースを取ってくるところから。

本稿はerlenvを使います。
(.bash_envは.bash_profileから呼び出してます)

```
git clone https://github.com/talentdeficit/erlenv.git $HOME/.erlenv
echo 'export PATH="$HOME/.erlenv/bin:$PATH"' >> ~/.bash_env
echo 'eval "$(erlenv init -)"' >> ~/.bash_env
```

適当な作業スペースにダウンロード。今回は19.2が対象。

```
mkdir $HOME/workspace/erlang_src
cd $HOME/workspace/erlang_src
wget http://www.erlang.org/download/otp_src_19.2.tar.gz
# or curl -L -O URL
tar xvzf otp_src_19.2.tar.gz
cd opt_src_19.2
```

不要なパッケージをスキップする設定（らしい）
参考 https://github.com/bosky101/erlang-workshop

```
touch lib/wx/SKIP
touch lib/odbc/SKIP
touch lib/eldap/SKIP
touch lib/odbc/SKIP
touch lib/ic/java_src/SKIP
touch lib/wx/SKIP
touch lib/gs/SKIP
touch lib/jinterface/SKIP
touch lib/megaco/SKIP
touch lib/diameter
```

オプションはこのページを参考
http://qiita.com/voluntas/items/a39cf3ec1a385e612f2a

```
./configure --prefix=$HOME/.erlenv/releases/19.2 --enable-smp-support --enable-threads --enable-darwin-64bit --enable-vm-probes --enable-kernel-poll --enable-sharing-preserving  --enable-hipe --with-dynamic-trace=dtrace --without-javac --enable-dirty-schedulers --disable-native-libs --disable-sctp --with-ssl=/usr/local/opt/openssl --without-wx --without-javac
make -j 4
make install
```

途中で
fop is missing.
とか出たら
brew install fop

うまくインストールできたら以下のコマンドで確認

```
erlenv global 19.2
erlenv rehash
erl
```

# Elixirのインストール

Elixirのインストールは
http://qiita.com/ucmsky/items/0f816a8bafcf3189056f
に書いてるのでそのまんまで。
Vim で JSON を書く環境を整える

まず jsonlint を入れる

```
brew install jsonlint
```

.vimrc に以下の情報を追記

```vim
NeoBundle 'leshill/vim-json'  " デフォルトの syntax highlight が気に食わないので

autocmd BufNewFile,BufRead *.json set filetype=json

" syntastic の設定に下記を追記。
" 保存時に jsonlint でチェックするようにする
let g:syntastic_json_checkers=['jsonlint']
```

vim を起動し直して、

```
:NeoBundleInstall
```
puma-devを使ってRailsの開発サーバーをhttps対応にする

ローカルのサーバーをhttpsにしないと困るケースが増えてきていると思います。

- LINEログインなど外部の連携サービスがhttpsを強制するケース
- iOSがATSによりhttpsを強制するケース
- ブラウザでカメラを使うケース

自分で証明書を作る方法もあるでしょうが、大抵面倒です。Railsアプリケーションの場合は、puma-devを使うことで簡単に実現できます。

# そもそもpuma-devとは

rack/railsのアプリを簡単に立ち上げたり、アイドルになったら止めたり、`localhost:3000`等ではなく`.dev`ドメインでアクセスできるようにするツールです。

同様のツールにpowというものもありますが、ActionCableとの相性やhttpsのサポートなどを考えると最近アクティブなpuma-devのほうがより良いと思います。

[puma/puma-dev: A tool to manage rack apps in development with puma](https://github.com/puma/puma-dev)

個人的にはdevドメインでアクセスできるようになるのと、httpsが使えるのが便利で使っています。

(※puma-devはLinuxでも使えるようですが、僕がmacOSでしか試していないのでLinuxではこの記事と異なるかもしれません）

## .devドメイン

例えば`rails new railsapp`のような感じでアプリケーションを作ってpuma-dev用の設定をすれば、http://railsapp.dev というURLでローカルのサーバーにアクセスできるようになります。`rails s`はしません。

通常の`rails s`だと複数のアプリケーションを立ち上げるときにポートを変えて立ち上げなければならず（`rails s -p 3001`など）、アクセスするときもlocalhost:3001等になってしまい、覚えておくのが大変です。

URLがプロジェクト名に対応しているとわかりやすくなります。`http://facebook.dev/`とか`http://twitter.dev/`だったとしたら良いですよね。

## LANからアクセス

powと同じように`xip.io`ドメインがサポートされています。LAN内の別の端末から`http://railsapp.192.168.1.1.xip.io`のようにIPを含めたURLでもアクセスできるようになります。

実機スマートフォンからの確認等に便利です。

## 本題のhttps対応

~~実はpuma-devを使うということ以外何も要りません。URLをhttpsにするだけです。~~

~~puma-devを使えば特に何もしなくてもローカルの開発サーバーがhttps対応になります。先ほどの例で言えば`https://railsapp.dev`という感じです。~~

~~面倒だったhttps対応がpuma-devで簡単に実現できました。~~

### （追記）

Macでも一手間かけないとhttps接続に警告がでることを指摘してもらいました。 @jnchito Thanks!

まず、証明書をMacにインストールします。ファイルは↓にある`cert.pem`です。

```場所
~/Library/Application Support/io.puma.dev/cert.pem
```

次に、その証明書を「常に信頼」にしておきます。

![スクリーンショット 2017-03-09 8.07.22.png](https://qiita-image-store.s3.amazonaws.com/0/19098/9c6bb2a4-a33a-e516-8043-c50ed391df99.png)

これでMacでのhttps対応はOKとなります。

### 追記2

僕のうろ覚えもあって、https対応のところは証明書を信頼するだけじゃないかもしれません、スイマセン。ブラウザ側で許可する必要があるという話もあるし、他にも必要なステップがあるかもしれません。そしたら適宜コメントで補足してくれるとありがたいです。

@jnchito さんが色々試してくれたので↑でうまくいかない人はコメントを参考にしてください。

## (余談)iOS端末からhttpsでアクセスする

`xip.io`ドメインを使ってiPhone実機からアクセスできることは先程書きました。当然これをhttpsにできるわけですが、その際証明書の警告が出ます。オレオレ証明書を使うときと同様です。

この場合、puma-devと一緒にインストールされた証明書ファイルをiOSデバイスにインストールしてあげることで警告無くアクセスできるようになります。

```場所
~/Library/Application Support/io.puma.dev/cert.pem
```

AirDrop経由などで送ると良いです。
バックスラッシュ記法とハッシュオブジェクト

<h2>Ruby　バックスラッシュ記法</h2>
<table>
  <tr>
    <th>記法</th>
    <th>意味</th>
  </tr>
  <tr>
    <td>\n</td>
    <td>改行</td>
  </tr>
  <tr>
    <td>\t</td>
    <td>タブ</td>
  </tr>
  <tr>
    <td>\b</td>
    <td>バックスペース</td>
  </tr>
  <tr>
    <td>\\</td>
    <td>バックスラッシュ</td>
  </tr>
<p>※バックスラッシュ記法が適用されるのは文字を""で囲んだときのみ。''で囲うとバックスラッシュ記法は解釈されずにただの文字として出力されてしまう。</p>
</table>

<h2>chompメソッド</h2>
<p>chompメソッドは<strong>文字列の末尾の改行文字を取り除いた新しい文字列を返してくれるメソッド</strong></p>

```sample.rb

string = "改行します\n\n"

puts string       #改行される
puts string.chomp #改行されない
```


<h2>ハッシュオブジェクト</h2>
<p>ハッシュオブジェクト(ハッシュ)は、1つの変数で<strong>複数のデータを持つことのできるオブジェクト</strong>。</p>
<p>ハッシュオブジェクトは、自身の中に<strong>データ</strong>とそれに対応する<strong>キー</strong>のセットを所持することができる。</p>
<h5>ハッシュオブジェクトの生成</h5>

```sample.rb
hash = {}
```
Android端末使いが価格メリットに気づいてDocomo系白ロムからau系白ロムに乗り換えた話

# なぜやりたいか
ここ3年くらい、docomo系のMVNOで過ごしている。そして今回、端末の買い替えを検討していたが、docomo系の白ロム端末とau系の白ロム端末を比較すると、大きな価格差があることに気付いた。ムスビーにて2017年3月時点でのXperia X performanceのSS品の価格を調査したところ、docomoであれば64500円からだが、auでは37800円からと、**27000円**もの差がある。
37800円はdocomoであればどれくらいの時期の端末に相当するのか調査したところ、Xperia Z3のS品が39800円からという感じのようなので、auの2016年6月24日発売端末が、docomoの2014年10月23日発売端末よりも市場価格が安いということになる。つまり、docomo系であれば**発売後2年4ヵ月**経過後の端末を購入する価格で、au系であれば**発売後8ヵ月**の端末を購入できるということになる。

幸い、昨今はau系のSIMを販売するMVNOも増えてきた。私が利用しているIIJ mioも、typeAという形でdocomo系と同額(900円から)での提供をしている。もしau系でも利用に問題がないのであれば、こちらにしようと思うのは当然だろう。

# au系への乗り換えに必要なこと
docomo系であれば、端末を用意してdocomo系SIMを刺せばよかったが、auの場合はSIMロック解除も必要だということが分かった。

## SIMロック解除
調べた感じでは以下の三つの方法があるようだ。

- auショップにてSIMロック解除
- 端末に海外版のイメージを焼いて、国外のSIMロックコード発行業者に申し込んでSIMロック解除後、auのイメージを焼き直す
- SIM下駄と呼ばれる認証回避用の冶具を使う

個人的には興味はあるが、一番上以外はかなり怪しい手段のように思うので検討しない。SIMロック解除は、私のように中古で端末を購入する人間はauショップでの手続きが必要なので、3000円かかる。また、購入後すぐにSIMロック解除できるわけではなく、製品購入後180日間はロック解除を受け付けてもらえないようだ。

## 端末購入手段
端末購入手段はいくつかあるが、一つのポイントはIMEI番号が分かる場所のほうが良いということだと思う。
IMEI番号は、端末ごとの識別番号だという認識だ。これが分かると、auのサイトで、ネットワーク制限の状況とSIMロック解除ができるようになる日の検索が行える。

ネットワーク利用制限携帯電話機照会
https://au-cs0.kddi.com/FtHome

SIMロック解除の可否判定
https://au-cs0.kddi.com/au-support/sui/SUI001W001/SUI0010001BL.do

amazonなどは、安価だし安心感もあるが、一括販売でありIMEI番号が分からないケースが多い。つまり、いつSIMロックが解除できるかわからないので、購入しても180日近くauのSIMを使えないという可能性が高い。もちろんwifiルーター等で運用している人は問題ないのだろうが、私の場合はそれだと困る。180日もあればおそらく価格も下がるし。

IMEI番号が分かれば、上記サイトでいつSIMロック解除できるようになるのかわかるので、すぐにでも解除可能な端末が見つかる可能性がある。そういった端末は誰かが購入した後しばらく使用していた可能性が高く、新品同様品でこの条件を満たすものはほぼないと思った方がいいだろう。

## ネットワーク利用制限の考え方
ネットワーク利用制限状況は、○と△と×の3種類がある。

○は、端末購入者が一括で支払いを行った、もしくは分割の支払いが終了しているため、今後auのネットワーク利用制限がかからないことを意味する。
△は、端末購入者が分割で購入を行い、支払いが終了していないため、もし購入者が支払いを完遂しなかった場合にはauのネットワーク利用制限がかかることを意味する。
×は、端末利用者が支払いをしなかった等でauのネットワークの利用ができないことを意味する。

○が安全なのは間違いないだろうが、△もそこまでリスクはないのではないかと推測している。多くのユーザーは、端末を分割で購入する。そして、なにがしかの理由で端末を手放す場合にはそのまま店舗で売却する。この場合は支払いが終わっていないので△となるのだろう。
このユーザーはおそらく善良な一ユーザーなので、支払いは完遂すると思われる。つまり、△はごく普通のユーザーが端末を売却したケースが多いと推測できる。
そもそも支払いを完遂しなかった場合は、当然ユーザーはブラックリストに載るので、今後は端末購入ができないという制約を受ける。もちろん踏み倒し前提で大量に端末を集めて売りさばいたのちに行方をくらます人もいるだろうが、多数ではないと推測する。
△という文字づらからは、何か問題のある端末なのかと思ってしまうが、上記のように、普通のユースケースで売却された端末だと思うとそこまで怖くないのではないか。

# まとめ
au系端末は、docomo系端末と比較して、27000円程度の安値で購入できる。
しかし、その端末をSIM利用するためには端末購入者が購入後180日を経過していて、自身で3000円支払いをしてSIMロック解除をする必要がある。
いつSIMロック解除ができるかは、端末のIMEI番号から調査可能である。
SS品やS品と呼ばれるような端末は最近購入したものだろうから、基本的にはAランク以下の端末のほうがSIMロック解除までの期間が短いだろう。

別に新品じゃなくていいよという人であれば、au系端末に切り替えることで、24000円程度得をする可能性がある。

# 追記
4月末にauショップで3240円支払って無事SIMロック解除できました。
vue-loaderでsourceのsrcsetで指定したファイルも自動でrequireする

vue-loaderではデフォルトでsourceタグのsrcset属性で指定したファイルを自動でrequireしてくれない

```html:
<template>
  <picture>
    <source media="(min-width: 768px)" srcset="~@/assets/large.jpg" />
    <img src="~@/assets/home/default.jpg">
  </picture>
<template>
```

vue-loaderのoptionsで以下のようにrequireするタグの属性を追加できる
https://vue-loader.vuejs.org/en/options.html

```js:
{
  test: /\.vue$/,
  loader: 'vue-loader',
  options: {
    transformToRequire: {
      source: 'srcset', // keyにタグ名、値に属性名、配列で複数渡せる
    }
  }
}
```

imgのsrcset属性は値にパス以外も入ってくるので、このやり方ではたぶんできません。
画像内で特定画像を探すにはvisgrepがしっくりきた

画像内で特定の画像が含まれていたらその座標をコマンドラインで知りたい。
と、調べていったらxautomationのvisgrepがマッチした話。

画像でいうと以下の形

|元画像|探索画像|
|---|---|
|![abc.png](https://qiita-image-store.s3.amazonaws.com/0/104300/169a0970-b0f6-777b-0e9b-9d8a8f290746.png)|![c.png](https://qiita-image-store.s3.amazonaws.com/0/104300/b04d3781-c966-f1b2-d640-1304d14ccc95.png)|



あらすじ
最初に思いついたのは、opencv でテンプレートマッチングだったけど、大げさなので除外した。
次に、imagemagick の compareにsubimage-searchオプションがあり、ごにょごにょ探したら出来た。

```
compare -subimage-search -metric AE                    abc.jpg c.jpg miff:-  2>/dev/null |        convert - -delete 0 txt:- | sed -n '/#FFFFFF/s/:.*//p'
350,397
```

が、、5分は重すぎた。metricを rmse に変えても重い。

調べていくと、xautomation の自動化ツールに含まれる visgrep が見つかった。

visgrep

```
visgrep abc.png c.png
347,408 -1
```

受付画像がpngのみになってしまうが、1秒未満で結果がでた。
これでスクリーンキャプチャした画像から画面を判断できるようになった。

めでたし。

---

xautomation ダウンロード
[xautomation](https://www.hoopajoo.net/projects/xautomation.html)

visgrepのみコンパイル

```
./configure 
make visgrep
```
[C++]2重ループ内にcontinueがあるconstexpr関数をgccでコンパイルすると死ぬ

C++14で連立方程式をコンパイル時に解くコードを書いていた時に、偶然コンパイラの奇妙な振る舞いを見つけた。
最終的に、そのコードは以下のようなところにまで還元された。

```cpp:prog.cc
#include <iostream>

constexpr int foo(){
    for(int i = 0; i < 1; i++){
        if(i == 0) continue;
        for(int j = 0; j < 1; j++);
    }
    return 334;
}

int main(){
    constexpr int a = foo();
    std::cout << a << "\n";
    return 0;
}
```

foo()は2重ループとcontinue文を含んでいるが、実際には常に334を返すだけのconstexprな関数だ。
それを使って`constexpr int a = foo();`と宣言することにより、aの値はコンパイルの時点で334に確定する。...はずだった。

実際[clang](http://melpon.org/wandbox/permlink/oekGfJwjuVIi6OPs)や[6.2.0までのgcc](http://melpon.org/wandbox/permlink/rNYpC5Jc2nL0feRK)でこれは正しくコンパイルできる。
ところが、[gcc 7.0.1](http://melpon.org/wandbox/permlink/uxTRwj2G2736pMgL)では

```
prog.cc: In function 'int main()':
prog.cc:12:26:   in constexpr expansion of 'foo()'
prog.cc:6:9: error: constexpr loop iteration count exceeds limit of 262144 (use -fconstexpr-loop-limit= to increase the limit)
         for(int j = 0; j < 1; j++);
         ^~~
```
というコンパイルエラーが出てしまい、またgcc 6.3.0に至っては何も言わずに黙り込んでしまう。なぜかfoo()内のループが無限ループ化してしまっているようだ。
ちなみにこのfoo()内の`if(i == 0) continue;`か`for(int j = 0; j < 1; j++);`のどちらかを取り除くとgcc 6.3.0, gcc 7.0.1でもうまくコンパイルでき、またmain()内のaのconstexprを取り除いてもうまくいく。

おそらくgccのバグだと思う。近いうちに報告してみようか...？