OmniAICreator/Qiita-1.07M huggingface dataset:
Boto3で特定のタグが付与されたインスタンスを停止する


以前作成した特定のインスタンスをBoto3でstop処理をパワーアップさせてみました。

前提として
EC2にenvタグを付与しておき値はdevとして設定したインスタンスを仕込んでおきます。

Filtersの処理が上手く出来なかったですが、なんとか出来ました。
記念にブログアップ。次はLambdaと連携してみる。

```py
# -*- coding: utf-8 -*-

# import
import boto3
from boto3.session import Session

ec2 = boto3.client('ec2')
dev_list = []

# def
def get_list():
  instance_list = ec2.describe_instances(
    Filters=[{'Name': 'tag:env', 'Values': ['dev']}]
  )
  for Reservations in instance_list['Reservations']:
    for dev_instances in Reservations['Instances']:
      dev_list.append(dev_instances["InstanceId"])
      return dev_list

def ec2_stop(dev_list):
  for instance_id in dev_list:
    response = ec2.stop_instances(
      InstanceIds=[
        instance_id
      ]
    )

# Main
if __name__ == "__main__":
  get_list()
  ec2_stop(dev_list)
```

https://github.com/handa3/study/blob/master/aws/ec2/dev_stop.py
PHP Manual 読書会(4回目)(定数)

PHPに慣れる為に週1ぐらいで更新していきます。PHP Manualを読んで実験して行きます。

前回: [PHP Manual 読書会(3回目)(変数)](http://qiita.com/amesho/items/21efc18d6efafb5c758d)

## [構文](http://php.net/manual/ja/language.constants.syntax.php)

定数の定義の仕方は2つあって、

+ define() 関数
+ const(5.3以降)
    + スカラ以外のデータが扱えるのは5.6以降です

最近の環境ならconstで問題ないのではないかと思います。

```php
<?php

// 従来型の定数
define("HOGE", "ニャーン");

echo HOGE . PHP_EOL;


// PHP 5.3.0 以降
const HOGE2 = "にゃーん";

echo HOGE2 . PHP_EOL;
```

+ 改行コードについて面白そうな記事があったのでメモ
  + http://qiita.com/suin/items/cbbbe8844fd734fa20e2

また、`PHP 5.6 以降では、定数をスカラー式として定義できるようになりました。`とあるので

```php
<?php

const HOGE = "ニャーン";
const HOGE2 =  HOGE. "にゃーん";

echo HOGE2 . PHP_EOL;
```

こういうことができます。

そして、`array の定数も指定できるようになりました`とあるので


```php
<?php

const HOGES = array('hoge','hoge','hoge');

print_r(HOGES);
```

配列も定義出来ます。

また、`定数の名前を動的に得る必要がある場合、定数の値を読むために関数 constant() を使用することも可能`とあるので、

```php
<?php

const HOGE = "にゃーん";

echo constant("HOGE") . PHP_EOL;
```

このように変数名から取得することも可能です。

定義された定数の一覧も取得可能で

```php
<?php
const HOGE = "にゃーん";
print_r(get_defined_constants(true));
```

こうやって一覧を出せます。


知りたくなる定数が定義されているかどうかは、

` ある定数が設定されているかどうかを知るには、 defined() 関数を使用してください`

にあるように、defined関数を使えば知ることが出来ます。


```php
<?php

const HOGE = "にゃーん";

echo defined("HOGE") . PHP_EOL;
```

## [自動的に定義される定数](http://php.net/manual/ja/language.constants.predefined.php)

これらが、定義されているようです。
ただ、FUNCTION以降はこの書き方だと出ません。
てっきりデフォルトがでるかと思ったのですが違う用です。

```php
<?php

echo __FILE__ . PHP_EOL;
echo __LINE__ . PHP_EOL;
echo __DIR__ . PHP_EOL;
echo __FUNCTION__ . PHP_EOL;
echo __CLASS__ . PHP_EOL;
echo __TRAIT__ . PHP_EOL;
echo __METHOD__ . PHP_EOL;
echo __NAMESPACE__ . PHP_EOL;
```
オープンリゾルバの確認方法

#あなたの背後にもいるかも知れない
外部からの再帰的名前解決要求を受け付ける「オープンリゾルバ」。DoSの主役がMirai等ボットネットそのものに移る前は、オープンリゾルバを経由したDNSクエリによってISPへの大々的なサービス妨害（DNS amp attack）が行われていたという。国内ではISPの自主的な取り組みも功を奏して、攻撃の発信源としてのオープンリゾルバは減少傾向にあると言われているものの、世界的に見れば依然としてDDoS発信源としての影響力は看過できない。ルーターやVPSの名前解決サービス設定の不備によって、あなたのネットワークにもオープンリゾルバが隠れているかも知れない。草の根的にオープンリゾルバを減らす取り組みは未だ必要とされている。
##確認方法
任意のアドレスについてCLIから確認することもできるが、ここでは自組織・自宅のルーターやそれらが参照するDNSサーバーの確認方法を述べるにとどめる。
###手軽に利用できるサービス
JPNICの紹介にもいくつか名前が挙がっている。ここではJPCERT/CC提供のサイトopenresolver.jpでブラウザでの操作を通してオープンリゾルバ診断を行ってみよう。ボタンを押すだけの非常に簡単な構成となっている。オープンリゾルバでなければ、次のような診断結果が得られる（WiFi経由・スマホより）
![tmp_19853-P_20170531_204210_1-1505202478.jpg](https://qiita-image-store.s3.amazonaws.com/0/164400/817ef588-8639-6072-f330-c6c75dea54bd.jpeg)
###コマンドラインからの確認も可能
先ほどのサイトに向けてwgetやcurlを打てば、コマンドライン経由で診断結果を取得できる。

```bash:やり過ぎるとインシデント扱いになるので注意が必要。
$ wget -QO - \
http://www.openresolver.jp/cli/check.html

$ curl --location-trusted \
http://www.openresolver.jp/cli/check.html
```


[OPEN]の文字列が返された場合には注意が必要だ。ルーター(接続元IP)の場合は自組織のネットワーク管理者やルーターの配布元に、DNSの場合はプロバイダに相談することをお勧めする。DoSの踏み台を増やさないためにも、自らが踏み台となってしまわないためにも、一度確認しておこう。

補足
既にQiita上に上がっている情報。
後でRefをたします。
英語でプログラミングのブログを書くならどのサービスが良いの？ ( 結論 : Medium )

「ぷろぐらみんぐのぶろぐ」 (語呂が悪い)

# Medium ( ミディアム )

https://medium.com/

## 長所

### 投稿のインターフェイスが優れている

- 投稿フィールドとプレビュー画面が一体化している (プレビューと投稿フォームを行き来する必要がない、目を左右させる必要もない)
- コードブロックが使える
- 画像のアップロードのラグがない ( 一瞬でクリップボードからペーストされる。おそらく投稿ボタンを押した時に一気にアップロードされるか、裏側で何かやっているはず )


![image](https://qiita-image-store.s3.amazonaws.com/0/89618/891c38fd-c10c-2a48-91ca-60ab1ae88bea.png)

### シェアボタンやいいねボタンが付いてる

モチベーションを上げるための仕組みは揃っている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a4860984-e7e3-a910-579a-320c35941b3e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/54dc385f-62fb-8b08-41ea-01624b91a266.png)

### プラットフォームなので人目につきやすい

ストーリーにタグを付けることが出来る。
読まれる可能性が高い。

### Googleにキャッシュされやすそう

まだ数週間なので、あくまでも予測

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7c348205-65fa-9556-f560-6288447d6ca6.png)

### 他の人のプログラミングの記事が目につきやすい

プログラミング関係のトップページで

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/63911b49-11be-90bc-5791-bf6954c1412e.png)


## 短所

- 複数アカウントの切り替えが出来ない(プライベートでMediumアカウントを使っていると、切り替えが面倒)
 - Publication (Facebook ページみたいなやつ) を作ることで解決

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1cc4ceea-b285-af19-0d86-73b54f38b2ce.png)


# GitHub Pages

## 長所

- Github のサービスなのでサービス継続性が極めて高そう (簡単にはサービス終了しなさそう

## 短所

- プラットフォームではなく、ホスティングしてくれるだけのサービスなので、基本的には1からサイトを構築する必要がある
- Github上のファイル追加・編集インターフェイスで画像のペーストが出来ない
- Google Site Map 登録とか、シェアボタン設置とか、やらなければいけないことが多そう

# WordPress

## 長所

- 簡単に始められる

## 短所

- Macで画像をペーストするモジュールが、有料プランでないと使えない

# Qiita

## 長所

- エンジニア向けのサービスだけあって、markdown でサクサク書ける

## 短所

- あくまで日本向けのサービスなので、英語で記事を書くと、日本ユーザーにとってはノイズになりそう
  - ルールとして「日本語」が強制されているわけではないと思うけど

# はてなブログ

## 長所

- 日本で markdown が書ける唯一の一般向けブログと言って良い
- アカウント１個で複数ブログが運用できるので「日本語ブログ2個」「海外用ブログ1個」とかいう使い分けが出来る
  - 1アカウント4個目からは有料プランの加入が必要

## 短所

− プラットフォームだが、海外にリーチできるわけではない
- 英語記事を日本のサービスで書くのはちょっと
  - 検索でたどり着いたユーザーが、読めない言語のプラットフォームに放り込まれてしまう


# Blogger

## 長所

- Googleが買収したサービスなので、サービス継続性が高そう、簡単にはサービス終了しなさそう

## 短所

- Googleのサービスだが、Googleにインデックスされやすいわけではない
  - 記事を書いたのにググってもヒットしないページとかたくさんある
- 投稿のインターフェイスがとにかくレガシー
  - 画像のペーストは出来ない

# Stack Overflow Documentation (BETA)

[Documentation Tour - Stack Overflow](https://stackoverflow.com/tour/documentation)

まだよく分かっていない。

ブログ的な感じではなさそう。

# Facebook


Markdownに対応するような対応しないようなよく分からない感じ。

[Markdown formatting on Facebook? Is it real? – Suzanne Yada – Medium](https://medium.com/@suzanneyada/markdown-formatting-on-facebook-is-it-real-52eaf4495127)

こんなに小さなウィンドウでは長い記事を書くことは出来ない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ff2343c5-52a3-8cae-5f99-84741db941f7.png)

# 感想

海外に以下の条件を満たす、Qiita的なサービスはないのかもしれない

- プラットフォームである
- ブログ的に書ける
- エンジニアリングに特化されている

プログラミングについて書く時は、もうみんな自前でサービス立ててしまってる感じだろうか。









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Pythonで module 'XXX' has no attribute 'XXX' が出た時の解決方法 

#Pythonで module 'XXX' has no attribute 'XXX' が出た時の解決方法 

プログラムを実行するとエラーが出た。

```
Traceback (most recent call last):
  File "xxx.py", line 1, in <module>
    import xxx
  File "/Users/tonosamart/xxx.py", line 4, in <module>
    def zzz(arg: xxx.yyy):
AttributeError: module 'yyy' has no attribute 'xxx'
```
なんかよくわかんないけど、import失敗してる感じ？

↓

importの指定と同じファイル名のプログラムがあると、そっちを読みに行ってしまうのが原因＞＜
他の言語と違い、ファイル名＝クラス名にできないのめんどい

はまったのでメモ
動画を早送りして任意フレームから開始し任意間隔で画面キャプチャを保存するOpenCV

# 環境
- Python 3.5.2
- OpenCV 3.1.0

# コード

```python:slicemovie.py
# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture('Video_001.avi')

frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 総フレーム数とFPSを確認
print("FRAME_COUNT: ",  frame_count)
print("FPS: ", fps )

# 20分ぐらいのところまで早送り
start_pos = fps * (60 * 20)

# フレームポジションをファイル名にして、1秒4枚ぐらいの気持ちで画像保存
print("-- start")
for idx in range(start_pos, frame_count, round(fps/4)):
	cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
	current_pos = str(int(cap.get(cv2.CAP_PROP_POS_FRAMES)))
	cv2.imwrite("pict/" + current_pos +".jpg", cap.read()[1])
print("-- done.")

cap.release()
```
結果
<img width="311" alt="result.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/121307/63e72790-b9cc-0173-3c8a-ac13f4d6c907.png">


# （おまけ）結果を横に適宜三枚繋いで一枚の画像を作る
 [‘Boring parking, active background’](http://bmc.iut-auvergne.com/?page_id=24) ってタイトル、なんだかいいですよね。
　
![out.jpg](https://qiita-image-store.s3.amazonaws.com/0/121307/9de4ca94-66d8-2657-184a-80c07e178d00.jpeg)


```python:concatenate.py
# -*- coding: utf-8 -*-
import cv2
import numpy as np

print ("start.")

img1= cv2.imread("30000.jpg")
img2= cv2.imread("30666.jpg")
img3= cv2.imread("32544.jpg")

vis = np.concatenate((img1, img2, img3), axis=1)
cv2.imwrite('out.jpg', vis)

print ("done.")
```
擬似相関の数値例を再現（機械学習プロフェッショナルシリーズ）

機械学習プロフェッショナルシリーズの「統計的因果探索」を読んでいて出てきた擬似相関の数値例を再現する部分をPythonでやります（本の1.3章 図1.4あたり)。見かけ上の相関関係からは、背景のデータ生成モデルを理解できない場合があるという例。

- モデル共通
    - zが平均0、分散1の正規分布に従う
    - $e_x$と$e_y$は和に使った後の変数$x, y$が分散1になるようなノイズ(平均は0)
- モデル1
    - $x = 0.3z + e_x$
    - $y = 0.7x + 0.3z + e_y$
- モデル2
    - $x = 0.7y + 0.3z + e_x$
    - $y = 0.3z + e_y$
- モデル3
    - $x = 0.89z + e_x$
    - $y = 0.89z + e_y$

```python
# -*- coding: utf-8 -*-
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


def gendata(N=100, verbose=False):
    # Model 1
    z1 = np.random.normal(0.0, 1.0, N)
    ex1 = np.random.normal(0.0, np.sqrt(1-0.3**2), N)
    ey1 = np.random.normal(0.0, np.sqrt(1-0.7**2-0.3**), N)
    x1 = 0.3 * z1 + ex1
    y1 = 0.7 * x1 + 0.3 * z1 + ey1

    if verbose:
        print("model 1")
        print(np.std(x1))
        print(np.std(y1))

    # Model 2
    z2 = np.random.normal(0.0, 1.0, N)
    ex2 = np.random.normal(0.0, np.sqrt(1-0.7**2-0.3**), N)
    ey2 = np.random.normal(0.0, np.sqrt(1-0.3**2), N)
    y2 = 0.3 * z2 + ey2
    x2 = 0.7 * y2 + 0.3 * z2 + ex2

    if verbose:
        print("model 2")
        print(np.std(x2))
        print(np.std(y2))

    # Model 3
    z3 = np.random.normal(0.0, 1.0, N)
    ex3 = np.random.normal(0.0, np.sqrt(1.0-0.89**2), N)
    ey3 = np.random.normal(0.0, np.sqrt(1.0-0.89**2), N)
    x3 = 0.89 * z3 + ex3
    y3 = 0.89 * z3 + ey3

    if verbose:
        print("model 3")
        print(np.std(x3))
        print(np.std(y3))

    return x1, y1, x2, y2, x3, y3

if __name__ == '__main__':
    for n in [10, 100, 1000, 10000]:
        x1, y1, x2, y2, x3, y3 = gendata(n)
        plt.figure(figsize=(12, 4))
        plt.subplot(1, 3, 1)
        plt.xlim(-5, 5)
        plt.ylim(-5, 5)
        plt.plot(x1, y1, "ro")
        plt.subplot(1, 3, 2)
        plt.xlim(-5, 5)
        plt.ylim(-5, 5)
        plt.plot(x2, y2, "ro")
        plt.subplot(1, 3, 3)
        plt.xlim(-5, 5)
        plt.ylim(-5, 5)
        plt.plot(x3, y3, "ro")
        plt.savefig("N{}.png".format(n))
```

![N10.png](https://qiita-image-store.s3.amazonaws.com/0/7181/2ec6d5ef-fb81-7912-7655-ae6c1f6983f7.png)

![N100.png](https://qiita-image-store.s3.amazonaws.com/0/7181/1419f58e-81d2-290f-b7a2-619681065072.png)

![N1000.png](https://qiita-image-store.s3.amazonaws.com/0/7181/b0af321f-31f6-1261-0526-03e9594d8200.png)

![N10000.png](https://qiita-image-store.s3.amazonaws.com/0/7181/63934354-dd82-1ccc-54fb-a70a686c18a4.png)
bashで0,1,2,...,Nの数値がランダムに入ったリストを生成する

# 目的

* bashで0,1,2,...,Nの数値がランダムに入ったリストを生成する

# 方法

```bash:test.sh
# 0～Nの普通のリスト生成 (例ではN=9とする)
$ list=(`seq 0 9`)
$ echo ${list[@]}
0 1 2 3 4 5 6 7 8 9

# bashで0,1,2,...,Nの数値がランダムに入ったリストを生成
$ list=(`seq 0 9 | shuf`)
$ echo ${list[@]}
3 1 5 0 6 4 8 9 2 7
```
ZooKeeper 基本の仕組み

## ZooKeeper サーバーはどのようにして Leader を決めているのか？
公式ドキュメントによると、アルゴリズムはTCPをベースにしたものがデフォルトになっているらしい。
実際に選出される Leader は特に早いもの勝ちという訳ではなく、ZooKeeper アンサンブルが構築された時点（5台構成なら、３台が起動した時点）でその３台の中からランダムに選出がされている模様。（実際にはここでTCPベースのアルゴリズムに依存しているのかもしれないが）
> Election implementation to use. A value of "0" corresponds to the  original UDP-based version, "1" corresponds to the non-authenticated UDP-based version of fast leader election, "2" corresponds to the authenticated UDP-based version of fast leader election, and "3" corresponds to TCP-based version of fast leader election. Currently, algorithm 3 is the default
The implementations of leader election 0, 1, and 2 are now deprecated . We have the intention of removing them in the next release, at which point only the FastLeaderElection will be available. 

## ZooKeeper のサーバ間はどのようなやりとりがされているのか？

- ZooKeeper は1台 Leader と呼ばれるサーバーがおり、残りが Follower として動作している。

ServerA(Follower)
ServerB(Follower)
ServerC(Leader)

- 基本的に通信は Leader と Follower の間でのみ行われ、Follower 間での通信は発生しない。

ServerA(Follower)「Leader とだけやり取りします」
ServerB(Follower)「Leader とだけやり取りします」
ServerC(Leader)「全 Follower とやり取りするよ」

- Follower 間の通信は Leader を探すときと Leader を選出する時に発生する。

ServerA(Follower)「Leader は誰ですか?」
ServerB(Follower)「俺じゃないよ」
ServerC(Leader)「僕が Leader だよ」

## ZooKeeper のクライアントはどのサーバーに接続するのか？
- 接続先はランダムに決定する（はず）。
- 特にどのサーバーが現在の Leader なのかは、クライアント側としては関係ない。

クライアント「どのサーバにお願いしようかな。A～Cの誰でもいいや。」

## ZooKeeper のサーバー間はどのようにしてデータを同期しているのか？
1. クライアント側から何らかのデータ更新要求を受けた ZooKeeper サーバーはそれをまず Leader へ報告する。
（Leader が直接要求を受けた場合はそのまま処理を継続）
2. Leader は報告を受けた順に（ひとつずつ）処理するが、まず 全 Follower に対してデータ更新の提案(proposal)を行う。
3. Leader は過半数以上の Follower (5台構成なら3台以上）から同意（agreement)を得られれば、そのデータ更新作業を commit する。
4. そのため、ある別々のクライアントからのデータ参照要求が同時にあったとしても、サーバーによって異なる結果を返すことはない。

ServerA(Follower)「Leader！クライアントからデータの更新依頼がありました！」
ServerC(Leader)「ちょっと待ってくれ、一つずつしか処理できんから」
ServerC(Leader)「みんな！このデータ更新するよー」
ServerA(Follower)「了解です！」
ServerB(Follower)「承知しました！」
ServerC(Leader)「よーしコミットするよ！」
クライアント「どのサーバーに聞いても同じ回答くれるから助かるよ」
PostProcessBuildでRubyを使う


# 概要
Xcode APIではできない処理などC#だけで処理をするには難しい場合があるかと思います。
パッケージが豊富なRubyでそれが解決できないかと、今まで自分が使ってきたことをまとめたいと思います。
（C#側でもできることもあると思いますので、ご容赦下さい。。）

## 環境
* Unity 5.5.1f1
* Mac (10.12.5)

## 注意
* Windowsは、下記の手段で実行ができないです。
* PostProcessBuildでエラーが発生してもUnityでは`Build Successful`となるようなので、ログは毎回確認する必要があります。

## 諸々のコードは以下にあります。
https://github.com/rinsyan0518/PostProcessRubyRunner

* これ（↑）の`Assets/PostProcessRubyRunner`をコピー
* プロジェクトディレクトリに`PostProcessRuby`のディレクトリを作成
* `PostProcessRuby`配下にrubyのコードを書けば動きます（拡張子`.rb`は付けて下さい）

# 実装

複数のRubyのコードが順に実行されるような実装にしています。
重複したコードが増えてしまいますが、必要なくなった時（例えば、UnityのPlayer Settingsで設定できるようになったなど）に対象のファイルの削除で済むので楽です。

## PostProcessBuild

* PATHに`rbenv`と`/usr/local/bin`を追加
* Ruby側で使用する必要な引数を与える
* Rubyのコードを順次実行するスクリプトを実行する

``` Assets/PostProcessRubyRunner/Editor/RubyRunner.cs
[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
{
    var proc = new System.Diagnostics.Process();
    var current = Directory.GetCurrentDirectory();

    var args = new string[] {
        path,
        buildTarget.ToString(),
        Debug.isDebugBuild.ToString(),
        PlayerSettings.productName
    };

    proc.StartInfo.FileName = Path.Combine(current, kScriptPath);
    proc.StartInfo.Arguments = string.Join(" ", args);
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.RedirectStandardInput = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.UseShellExecute = false;

    var homePath = proc.StartInfo.EnvironmentVariables["HOME"];
    var rbenvDir = string.Format("{0}/.rbenv/shims:{0}/.rbenv/bin", homePath);
    var newPath =
        string.Format("{0}:/usr/local/sbin:/usr/local/bin:{1}",
            rbenvDir,
            proc.StartInfo.EnvironmentVariables["PATH"]);
    proc.StartInfo.EnvironmentVariables["PATH"] = newPath;

    proc.Start();

    var so = proc.StandardOutput.ReadToEnd();
    if (!string.IsNullOrEmpty(so))
        Debug.Log(so);

    var se = proc.StandardError.ReadToEnd();
    if (!string.IsNullOrEmpty(se))
        Debug.LogError(se);

    proc.WaitForExit();
}
```


## PostProcessBuildで実行するシェルスクリプト
ディレクトリ内のrubyファイルをそれぞれ実行します。
実行するファイルの先頭に数字を振っておく(00_xxx)みたいにしておけば実行順序を制御できます。
（私は直接Unityと関係ない.metaファイルができてしまうのが好きでないので、、プロジェクトディレクトリ配下にディレクトリを作っています）

※実行するスクリプトには実行権限を付けて下さい。
※Unity Projectのディレクトリがカレントディレクトリになります。

``` Assets/PostProcessRubyRunner/Editor/ruby_runner
#!/bin/bash
for script in `/bin/ls -1 ./PostProcessRuby | grep .rb$`; do
    echo "%%%%%% Start $script %%%%%%"
    "ruby ./PostProcessRuby/$script" "$@"
    echo "%%%%%%  End  $script %%%%%%"
done
```

## とりあえずhello, world
``` PostProcessRuby/00_hello_world.rb
#!/usr/bin/env ruby

p ARGV
p "hello, world"
```

# おわり
これでRuby側でファイルのコピーをしたりすることができます。
出来る限りUnity以外のところでファイルが変更されるのは嬉しくないですが、どうしようもないときってありますよね。。

次はiOSやAndroid用に書いていこうと思います。
Javaの双方向mapのライブラリ

mapをkey・value双方向から参照したい場合に以下のライブラリが使える。

## GuavaのBiMap
```xml
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>22.0</version>
</dependency>
```

```java
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

Map<String, String> m = new HashMap<>();
m.put("a", "あ");
m.put("i", "い");
m.put("u", "う");

BiMap<String, String> bimap = HashBiMap.create(m);
System.out.println(bimap.get("a"));//あ
System.out.println(bimap.inverse().get("あ"));//a
```

## Apache Commons CollectionsのBidiMap
```xml
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>
```

```java
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;

BidiMap<String, String> bidimap = new DualHashBidiMap<>(m);
System.out.println(bidimap.get("a"));//あ
System.out.println(bidimap.inverseBidiMap().get("あ"));//a
```
【Python】sys.pathに追加したディレクトリからimportする処理でPEP8に違反した際の対処

利用しているPythonのバージョンは3.6です。

もし間違った記述等があれば、コメントで指摘していただけるとうれしいです。

# PEP8の違反内容

このようなディレクトリ構成で、```scripts/execute.py```から```lib```配下の自作モジュールを読み込みたいとします。

```bash
.
├──scripts
│   └── execute.py
└──lib
    └── my_module.py
```

当初、```execute.py```を次のように記述し、```sys.path```にファイルを追加することで対処しようとしました。

```python
import pandas as pd
import sys
sys.path.append('../lib')
import my_module

# (以下略)
```

ところが、これはPythonのコーディング規約である[PEP8](https://www.python.org/dev/peps/pep-0008/)（[日本語訳](https://pep8-ja.readthedocs.io/ja/latest/#)）に違反しているため、flake8等を利用している場合は次のツッコミが入ります。

```
E402 module level import not at top of file
```

[日本語訳の該当箇所](https://pep8-ja.readthedocs.io/ja/latest/#import)を引用しておきましょう。

> import文 は常にファイルの先頭、つまり モジュールコメントや docstring の直後、そしてモジュールのグローバル変数や定数定義の前に置くようにします。

# 環境変数PYTHONPATHを設定して解決

ちょうど、[Stackoverflowに同じ趣旨の質問がありました](https://stackoverflow.com/questions/36827962/pep8-import-not-at-top-of-file-with-sys-path)。

この中に、いくつかの方法が回答されており、環境変数```PYTHONPATH```にディレクトリを追加する方法が本質的な解決方法のように思えました。（以下のリンクが紹介されていました）

* [Permanently add a directory to PYTHONPATH](https://stackoverflow.com/questions/3402168/permanently-add-a-directory-to-pythonpath)


（他にも、以下のような方法も紹介されていましたが、正直私には小狡いハックにしか見えません。）

* パスの読み込み処理を記述した```pathmagic.py```というファイルを用意し、それをimportする方法
* try~except文で囲む方法

また、日本語の質問サイトであるteratailにも[似た質問の回答がありました](https://teratail.com/questions/65319)。Sphinxのコミッターの清水川さんの回答なので信憑性は高そうです。

> sys.path をスクリプト内で調整することはあまり推奨されません。
色々なところで使いたいライブラリを置いているディレクトリが固定で、そのライブラリをimportしたいのであれば、環境変数 PYTHONPATH を設定する方法があります。 

というわけで、PYTHONPATHに```lib```ディレクトリを追加して対処しました。毎回利用する場合は```bash_profile```にでも書いておきます。

```bash
export PYTHONPATH="${PYTHONPATH}:/libディレクトリのフルパス/lib"
```

これにより、```execute.py```から```sys.path```関連の記述を削除できました。

```python
import pandas as pd

import my_module

# (以下略)
```

# 環境変数PYTHONPATHについて

本題とはずれるのですが、ここで「ライブラリ名と自作のモジュール名がバッティングした場合はどうなるの？」ということが気になって調べてみました。

こういうときは公式ドキュメントを読みましょう。[公式のPythonチュートリアルの中に以下のような記述](https://docs.python.jp/3/tutorial/modules.html#the-module-search-path)があります。

> spam という名前のモジュールをインポートするとき、インタープリターはまずその名前のビルトインモジュールを探します。見つからなかった場合は、 spam.py という名前のファイルを sys.path にあるディレクトリのリストから探します。 sys.path は以下の場所に初期化されます:
>
> *    入力されたスクリプトのあるディレクトリ (あるいはファイルが指定されなかったときはカレントディレクトリ)。
* PYTHONPATH (ディレクトリ名のリスト。シェル変数の PATH と同じ構文)。
* インストールごとのデフォルト。


どうやら、PYTHONPATHにあるもののほうが優先されるようです。実際に試してもそのような挙動でした。
AndroidのForeground ServiceはDozeモードの影響を受けないのか？

初投稿させていただきます。

今更ながらAndroid 6.0から登場したDozeモードへの疑問です。

公式ドキュメントでは、Foreground ServiceはApp Standbyに関する項目でしか触れられていません。

https://developer.android.com/training/monitoring-device-state/doze-standby.html?hl=ja

なので、Dozeモードのホワイトリストに登録されていないアプリはForeground Serviceであっても下記条件でDozeモードに移行し、通信が制限さりたりAlarmManagerが無視されると言ったことが起こるはずです。

- 端末を電源と接続しない
- 静止状態にする
- 画面をオフにする

しかし、実際にForeground ServiceでGPSを取得し定期的にサーバへ送信するようなアプリを作って端末を数時間放置してみると問題なく動作をし続けるようです。

問題なく動作し続けるのでこれと言って問題はないのですが、気になって仕方がありません。

調べてみると2015年にGoogle+のコメントでAndroidフレームワークのエンジニアがポロッと下記のようなことを言っているのを見つけてしまいました。

Apps that have been running foreground services (with the associated notification) are not restricted by doze. 

https://plus.google.com/+AndroidDevelopers/posts/94jCkmG4jff

え？Foreground ServiceはDozeモードの制限を受けないだってーー？公式ドキュメントには一言もそんなこと…。

このコメントは信じていいのでしょうかね・・・。

同じように気になっていて調べたよという方！いらっしゃいましたらコメントください！

**2017/06/06追記**

再度実験を行った結果、Foreground ServiceもDozeモードの影響を受けることがわかりました。
また、実験した端末ではDozeモードのホワイトリストへ手動で登録した場合でもDozeモードに移行してしまうことを確認しました。
Dozeモードの実装は各メーカー毎に手が加えられているため機種ごとに動作が異なる可能性があるようです。

■確認端末
- aquos u shv37　Android6.0 

ちなみにFreetelの端末もDozeモードの動作に不具合があるというような口コミがありました。

http://bbs.kakaku.com/bbs/J0000018900/SortID=19941897/

最初に述べていた数時間放置しても問題なく動作し続けていたという報告ですが、担当者に確認したところ充電状態にあったとのことです。
そのためDozeモードが発動しなかったと推測されます。
AWSへの接続

AWSへのSSH接続

・現状
AWS　EC2契約を行いました。インスタンスは正常に起動。
セキュリティ　SSHを許可。
キーペアを作成。pemファイルをダウンロード。

・状況と疑問
AWSで作成したpemをロードし、秘密鍵を作成。
それを使用し、AWSヘルプを参照しながら、puttyでSSH接続をおこなおうとしたところ、
ユーザ名を入力後、「Server refused our key」というメッセージが
Puttyで表示されSSH接続できませんでした。

秘密鍵の作成手順は
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/putty.html
を参照。
できたppkファイルをputty側で接続時に設定したのですが、上記のとおり
メッセージがでて、SSH接続は成功していません。

SSH接続を試した時のホスト名、ポート番号は間違っていません。
どの部分を確認したらよいでしょうか？
Scikit-learn を手軽にupdate する。

以下の情報は、2017/5/31 時点の情報です。あなたがこの記事を読むときには、もっとよい方法があるかと思いますので、参考情報にとどめてください。

Windows環境で使っているscikit-learnのバージョンが古くなっていて
[scikit-learn / General examples]
(http://scikit-learn.org/stable/auto_examples/index.html)
の例題の中に動かないのがあるのに気づいた。


(1) PIP
pip install scikit-learn
自分のWindowsには、Cythonを使ってソースからbuildできる環境を作っていないので
このやりかたは、先送りにした。

(2) PyPI
[PyPI](https://pypi.python.org/pypi)でscikit-learn を探す。
https://pypi.python.org/pypi/scikit-learn
https://pypi.python.org/pypi/scikit-learn/0.18.1
使用しているOSの種類、
Windowsが32bitか64bitの種類の違い、Pythonが2.7系統か3.5系統かの違いによって利用できるダウンロードするファイルの種類が違ってくる。
scikit-learn-0.18.1.win32-py2.7.exe (md5)


```
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sklearn
>>> sklearn.__version__
'0.18.1'
>>> 
```
無料鯖(Ubuntu)でDocker使用のMastodonを1.4.1に上げようとしたら死んだ話  


### 読むのが手間な方への結論  
- storage driverがoverlay2の場合、permission変更に時間がかかって死ぬ

### 前提
こんにちはこんにちは！  
Google Compute Engineの無料枠( vCPU 0.2 / 0.6GB / SWAP 2GB / Ubuntu 16.10 )を使って、Mastodonの(ほぼ)お一人鯖を運用しています。  
先日、1.4rcが先行リリースされ、1.4rc3あたりが出たときにアップデートをかけようとしました。  
アップデート自体は[こちらのスクリプト](https://github.com/tootsuite/mastodon/pull/2396)を利用して、特にコマンドに困ることもなく、多少時間がかかりつつも完了したのですが・・・

### 問題  
アップデート完了後、自鯖にアクセスしようとすると出るわ出るわ・・  


```math
\def\textlarge#1{%
  {\rm\Large #1}
}
```
$\textlarge{500}$
$\textlarge{502}$
$\textlarge{504}$

sidekiqの画面すら見れず、たまに見れたと思えば再試行が200以上・・・(無料枠では致命傷です。)  

でも、再試行が完了すれば安定するかな、と思っていましたが、翌日も翌々日も何度アップデートを行っても不安定なまま。
どうやら内部処理が溜まっているのはわかったんですが、解消法がわからず土日を潰しました。

### 解決への道  
そんな中、助けを求めてGitHubのIssueの読めない英語を追っかけていました。
そして見つけたこのIssue...

[Permission update on docker entrypoint takes a long time](https://github.com/tootsuite/mastodon/issues/3194)
~~(実際のところ、かなり前から読んでいたのですがイマイチ解消法がわからず待っていました)~~

冒頭にも書いたとおり、原因はどうやらstorage driverというもののようです。
v1.4以降では、docker内のファイル操作について、rootではなく別ユーザーが操作するようになっています。  
docker内での操作では全てpermission変更が必要になり、 `chown` の処理に時間がかかってしまうのです。  
さらに！ OSが Ubuntu(14以降) の場合には overlay2 というstorage driver がデフォルトなのですが、こいつが他のものよりも格段に遅いのです。  
そのため、いつまでたっても処理が終わらず、不安定になってしまっていました。  

### 解決策  
これから1.4.1にアップデートされる方もいるかと思いますが、自鯖がdockerで動いている場合には、まずstorage driver を確認しましょう。  
確認方法は下記コマンドです。

``` bash
$ docker info
```
すると、下記のように出てくると思います。

```bash 
$ docker info
Containers: 5
 Running: 5
 Paused: 0
 Stopped: 0
Images: 15
Server Version: 17.03.1-ce
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 46
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
(略)
```
この **`Storage Driver`** が **`overlay2`** になっている場合には、注意が必要です。(もしかしたら一般的なスペックの場合には問題にならないかもしれません。)  
Ubuntu の場合には、下記コマンドを叩いて、`aufs`に変更するか、別の storage driver に変更することをおすすめします。  
まず、`aufs`が利用可能かどうか確認します。

```bash
$ cat /proc/filesystems | grep aufs
```
このとき、 `nodev   aufs` と出てきたら、下記操作は必要ありません。
 もし出てこなかった場合、次のコマンドを叩いて `aufs`を有効にします。

```bash 
$ sudo apt-get update
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
$ sudo modprobe aufs
$ cat /proc/filesystems | grep aufs
```
`nodev   aufs` と出てきたら、`/etc/docker/daemon.json` を変更します。


```bash:/etc/docker/daemon.json
{
  "storage-driver": "aufs"
}
```
そして、dockerを再起動します。

```bash
$ service docker restart
``` 
確認します。

```bash
$ docker info
```  

無事に **`Storage Driver`** が **`aufs`** になっていることを確認できたら、必ず$\textlarge{リブート}$しましょう。  
リブート後にMastodonが安定して動作していることが確認できたら、僕は報われます。
【Monthly 2017/05】Cの実行ファイルを逆アセンブルして動きを確認してみる

# はじめに
「C言語？　ああ、あれねポインタのやつね。参照的なあれでしょ？　うん。知ってる知ってる」
上記は私のC言語に対する印象です。かなりひどい。
これは何とかしなくちゃいけないよね？ってことで今回の内容になります。

環境：
Ubuntu 14.04
gcc version 4.8.4
objdump(binUtils for Ubuntu) 2.24
x64

# 確認

以下のC言語のメソッドに関して確認していきます。

```c:plus.c
int plus(int num1, int num2) {
    return num1 + num2;
}
```

上記のファイルから`gcc -c plus.c`で実行ファイル`plus.o`を生成します。
次に`objdump -d plus.o`で以下の逆アセンブル結果が得られます。

```:アセンブリ
0000000000000000 <plus>:
   0:	55                   	push   %rbp
   1:	48 89 e5             	mov    %rsp,%rbp
   4:	89 7d fc             	mov    %edi,-0x4(%rbp)
   7:	89 75 f8             	mov    %esi,-0x8(%rbp)
   a:	8b 45 f8             	mov    -0x8(%rbp),%eax
   d:	8b 55 fc             	mov    -0x4(%rbp),%edx
  10:	01 d0                	add    %edx,%eax
  12:	5d                   	pop    %rbp
  13:	c3                   	retq   
```
## 解説
`push   %rbp`
まず一行目で呼び出し元のベースポインタ(rbp)をスタックにプッシュします。
最後に呼び出し元に戻れるように退避させておく感じです。

`mov    %rsp,%rbp`
二行目でベースポインタ(rbp)の値をスタックポインタ(rsp)の値に初期化します。
呼び出し元のベースポインタ(rbp)が入っているアドレスですね。このメソッドのスタックはここが基準になります。

`mov    %edi,-0x4(%rbp)`
ベースポインタからint型の32bit(4byte)分離れたアドレスにデスティネーションレジスタ(edi)の値を保存します。
第一引数をローカル変数としての領域に格納しています。

`mov    %esi,-0x8(%rbp)`
デスティネーションレジスタ(edi)の値を格納したアドレスから、さらにint型の32bit(4byte)分離れたアドレスにソースレジスタ(esi)の値を格納します。
第二引数をローカル変数としての領域に格納しています。

`mov    -0x8(%rbp),%eax`
アキュムレータ(eax)に第一引数の値を格納しています。

`mov    -0x4(%rbp),%edx`
データレジスタ(edx)に第二引数の値を格納しています。

`add    %edx,%eax`
ついに足しました。今回は一度しか加算がないのでeaxに対してedxを加算していますが、複数の数を加算する場合はedxに加算していき、最後にeaxに加算されるようです。
最後にeaxに加算されるのはeaxが戻り値となるためです。

`pop    %rbp`
呼び出し元のベースポインタの値をスタックから取り出して、呼び出し元に戻る準備をします。

`retq`
呼び出し元に戻ります。

# 最後に
今回の目的は、ほぼほぼWeb系の学習してこなかった自分の知見を広げる為のものなので、かなり低レベルな内容です(言語的にも内容的にも)。
いや、ほんとはポインタの動作なんかも確認したかったけど時間が・・・

何はともあれ、とっつきにくいイメージのあったアセンブリに多少なりとも簡単に親しむことができたので、自分の書いたコードがアセンブリでどう表現されるのか知りたい人はgccとobjdumpの組み合わせがおすすめです。


## P.S.
よく考えたら全然C言語の勉強になってないっすね。
Emmetでラクしよう。

##htmlの記述ができる。
```
「!」+「tab」
```

##複製して記述したい時は「*」を利用します。
 「ul>li*3>a」

```
<ul>
    <li><a href=""></a></li>
    <li><a href=""></a></li>
    <li><a href=""></a></li>
</ul>
```


参考
[HTML/CSSを爆速コーディング Emmet入門 第2回 Emmetの省略記法を使って、HTMLを素早く入力する](https://blogs.adobe.com/creativestation/web-learning-emmet-abbreviations-for-html)
ブラウザ上でニューラルネットを実行できるWebDNNをElectronで使えるか試してみた

~~ポエムです．~~

東京大学 原田・牛久研究室が 2017年5月28日に
ブラウザ向けニューラルネットワーク高速実行フレームワーク_WebDNN_
というものを公開しました．

[公式サイト](https://mil-tokyo.github.io/webdnn/ja/)を要約すると，

* モデルのパラメータをブラウザ上でも計算が可能なように最適化
* モデルを再度自分でパラメータ調整すると言ったことが不要
* ブラウザなどで対応が進められているWebGPUやWebAssemblyなどを利用し高速な処理を可能にする

といったことが出来るフレームワークになっています．

今までにも_Keras.js_を使うことでKerasで学習済みのモデルをブラウザ上で利用することが出来ました．
Keras.jsは [javascriptでchainerモデルを利用するためのKeras.js](http://qiita.com/Hiroshiba/items/cb1659a4a8243bc72236) という記事とそれに対する
さすが日本人。Chainer好きすぎでしょ。
ということでご存じの方が多いかと思います．

その既存のフレームワークとの差分としては

* モデルのパラメータの最適化
* ChainerなどのKerasに限らないDeepLearningのフレームワークで学習したモデルが使用できる

また，公式サイトのベンチにあるように Keras.js の GPU モードと WebDNN の　WebAssembly バックエンドと同等の速度で実行できるという高速なモデル評価が出来るという点であると考えられます．

この WebDNN を使うことで今までに研究や趣味で作ってきた学習済みモデルを使って新たなサービスを生み出せるのではないかと非常に楽しみです．

さて，このようなサービスを提供するとなるとWebサーバーなどを借りたり，そのページを作ったりしなければならないなど少しめんどうな事が出てきます．
またブラウザ上で実行するには WebDNN に関係ない部分の制限も気になってきたりします（カメラとかローカルのファイルへのアクセスとかその他諸々）．

そういう場合に一つのパッケージで配布という手段があり，そこで役に立つのが Electron です．
Electron に採用されているエンジンは Chromium で，Electron　v.1.6.10 では 56.0.2924.87です．
なので Electron では WebAssembly バックエンドで WebDNN を使うことが可能ということがわかります．


```js
const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow

const path = require('path')
const url = require('url')

let mainWindow

function createWindow () {

  mainWindow = new BrowserWindow({width: 800, height: 600})
  mainWindow.loadURL("https://mil-tokyo.github.io/webdnn/ja/")

  mainWindow.on('closed', function () {
    mainWindow = null
  })
}

app.on('ready', createWindow)

app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', function () {
  if (mainWindow === null) {
    createWindow()
  }
})
```

こんな感じで実際にアクセスして試してみると実行できていることが確認できるかと思います．

確認ができたので今後自分でモデルを学習してそれを使ったアプリケーションを作っていきたいと思います．

現在進めているのはOpenJTalkみたいなTTS（OpenJTalkはHMM音声合成）をDNN音声合成でGUI付きで動かすものです．
出来たらそこでの知見の共有をしたいなと思います．
【Unity5.6/VR】VideoPlayerと全天球による映像

##準備するもの
- 新規プロジェクト
- 360°カメラで撮影した動画(importしておいてください)
- [CardboardSDKForUnity.unitypackage](https://github.com/jkammerl/cardboard-unity/blob/master/CardboardSDKForUnity.unitypackage)
- [全天球](https://www.dropbox.com/s/wi3srjxbie1ncdf/Sphere_for_360Camera.fbx?dl=0)
 
全天球は、[こちら](http://psychic-vr-lab.com/blog/unity/360%E5%BA%A6%E3%82%AB%E3%83%A1%E3%83%A9theta%E3%81%A7%E6%92%AE%E3%81%A3%E3%81%9F%E5%86%99%E7%9C%9F%E3%82%92unity%E3%81%A7%E4%BD%BF%E3%81%86/)を参考にさせていただきました。


##今回やること
- VR用カメラの設置
    - 視点ポインターの追加
- 動画を天球に貼り付ける

##手順
###1.VR用カメラの設置
![スクリーンショット 2017-05-31 19.08.20.png](https://qiita-image-store.s3.amazonaws.com/0/183114/7f45d4b2-e137-ebe3-c348-6be449d53b54.png)
※CardboardSDKのカメラを使用するため、デフォルトのカメラは削除します。

![スクリーンショット 2017-05-31 19.11.46.png](https://qiita-image-store.s3.amazonaws.com/0/183114/8c1178bc-6abb-c2df-e829-ae1ec8ad1357.png)
Import Package > Custom Package > CardboardSDKForUnity.unitypackageを選択

メインカメラの設置
![スクリーンショット 2017-05-31 19.19.10.png](https://qiita-image-store.s3.amazonaws.com/0/183114/b7ebb9c2-bcef-e189-ed81-bb2917a946cd.png)

Cardboard > Prefabs内のCardboardMain.prefabをsceneに追加


####視点ポインターの追加
![スクリーンショット 2017-05-31 19.30.48.png](https://qiita-image-store.s3.amazonaws.com/0/183114/ed4cb715-13a4-ab72-0915-307839a1568e.png)

Cardboard > UI内のCardboardReticleをHeadにD&Dする

実行するとデフォルトで白色のポインターが表示されます。![スクリーンショット 2017-05-31 19.34.16.png](https://qiita-image-store.s3.amazonaws.com/0/183114/93347f3b-e7de-1c31-7248-b2b4185498d3.png)


####2.動画を天球に貼り付ける
![スクリーンショット 2017-05-31 19.45.49.png](https://qiita-image-store.s3.amazonaws.com/0/183114/71d59b38-c1bf-ec48-74f2-6c2527e925f3.png)

Import > New Assetを選択し、天球を追加する

天球をsceneに追加後、Sphereのinspectorでサイズなどを調整する
（カメラを天球の真中に配置するのも忘れずに！）
![スクリーンショット 2017-05-31 19.56.18.png](https://qiita-image-store.s3.amazonaws.com/0/183114/83464629-604d-306e-a6b0-136fcf58e74a.png)


**天球の影があるのは不自然なので**、Shader > Unlit > Textureを選択![スクリーンショット 2017-05-31 19.58.48.png](https://qiita-image-store.s3.amazonaws.com/0/183114/518b5ede-fdf8-2c9d-af50-227a9f017536.png)

#####VideoPlayerをsceneに追加
![スクリーンショット 2017-05-31 20.12.00.png](https://qiita-image-store.s3.amazonaws.com/0/183114/b432f0b5-6077-0011-f20a-f0ab5d2f9a07.png)

VideoPlayerのinspectorにおいて、以下の設定を行う
-Video Clip -> import済みの360°動画を選択
![スクリーンショット 2017-05-31 20.20.26.png](https://qiita-image-store.s3.amazonaws.com/0/183114/067091b6-abd4-6037-c578-cb3ac37c9c01.png)


-Render Mode -> Material Override
![スクリーンショット 2017-05-31 20.16.50.png](https://qiita-image-store.s3.amazonaws.com/0/183114/ae212014-3e7e-ae80-8fcb-0ae419d99e26.png)
-Renderer -> Sphere
![スクリーンショット 2017-05-31 20.18.50.png](https://qiita-image-store.s3.amazonaws.com/0/183114/5e498f14-33ab-622b-f502-1f2d0c7a5798.png)
-Audio Output -> Direct
![スクリーンショット 2017-05-31 20.21.28.png](https://qiita-image-store.s3.amazonaws.com/0/183114/27d2ccfd-ccf2-4d9e-bbb1-1246fa56b6ef.png)

ここまでできたら実行してみましょう！

[次は、オブジェクトに視点を合わせた際の処理（視点検知）](https://qiita.com/UCH1DA/items/f182f933f2ff63c7db0c)をやります。
pyenv, rbenv の shims のオーバーヘッド

[Rubyist が pyenv を使うときに知っておいてほしいこと](http://qiita.com/methane/items/5afdabd513a18049c34f) で、 「pyenv を Python をビルドするためだけに利用する方法」について紹介しました。

そこで「シェルを軽量化し、 shims も利用しないようにする事ができます。」と書いたのですが、具体的にコマンドを shims 経由で起動するオーバーヘッドについて紹介しておきます。

```
$ type python3
python3 は /Users/inada-n/pyenv/shims/python3 です

$ pyenv shell 3.6.1
$ python3 -VV
Python 3.6.1 (default, May 18 2017, 16:23:51)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

$ time python3 -S -c 42

real	0m0.099s
user	0m0.043s
sys	0m0.048s

$ time python3 -S -c 42

real	0m0.105s
user	0m0.044s
sys	0m0.051s

$ export PATH=$PYENV_ROOT/versions/3.6.1/bin:$PATH
$ python3 -VV
Python 3.6.1 (default, May 18 2017, 16:23:51)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]

$ time python3 -S -c 42

real	0m0.023s
user	0m0.013s
sys	0m0.010s

$ time python3 -S -c 42

real	0m0.025s
user	0m0.014s
sys	0m0.010s
```

mac での python 自体の起動速度は 20ms 強 (Linuxだともっと早いのですが…) ですが、 shims を通すだけで 100ms 強に遅くなります。
この違いが気になるか気にならないかは人によると思いますが、気になる人は pyenv を使うときに shims を使わない運用を試してみるといいと思います。
wiresharkの使い方(IPアドレスやMACアドレスを名前で表示する方法)

#1 はじめに
wiresharekで表示するIPアドレスやMACアドレスを名前で表示する方法を示します。

#2 環境
- Windows7
- wireshark 2.2.5


#3 構成
下記構成で採取したtcpdumpのIPアドレスとMACアドレスを名前で表示するようにします。

```
    master1 -------------------------------------------- master2
     IP=192.168.0.10                                  IP=192.168.0.20
     MAC=00:0c:29:18:5c:90                            MAC=00:0c:29:a5:64:c8

```

#4 デフォルトの状態確認
とくに設定をしなければ、IPアドレス、MACアドレスをそのまま表示してしまう。
![wireshark1.png](https://qiita-image-store.s3.amazonaws.com/0/146813/a15d487a-2105-9f75-e083-88e064cd1a5f.png)

#5 IPアドレスを名前で表示する方法
##5.1 hostsファイルの作成
windowdsの下記フォルダにhostsという名前のファイルを作成する。拡張子はつけません。
![wireshark5.png](https://qiita-image-store.s3.amazonaws.com/0/146813/c03cc501-753f-0c2d-9462-38c21278fcbd.png)

##5.2 hostsファイルの中身作成
![wireshark6.png](https://qiita-image-store.s3.amazonaws.com/0/146813/904d1213-1741-ac3d-ce3b-2df8ecd2d143.png)

##5.3 wiresharkの設定変更
4の画面上で「編集(E)」-> 「設定(p)」の順でクリックする。または、Ctrl + Shift + Pを押下する。
下記画面がポップアップするので、「Resolve network (IP) address」にチェックを入れて、「OK」を押す。
![wireshark2.png](https://qiita-image-store.s3.amazonaws.com/0/146813/8e9d9e71-99e1-e91a-e9e2-dfcf0673ab2e.png)

##5.4 wiresharkの再起動
wiresharkを再起動すると、以下のようにIPアドレスが名前で表示されるようになる。
![wireshark7.png](https://qiita-image-store.s3.amazonaws.com/0/146813/fdc9e94f-6cac-55e2-1de3-da81e9f57dc7.png)

#6 MACアドレスを名前で表示する方法
##6.1 ethersファイルの作成
windowdsの下記フォルダにethersという名前のファイルを作成する。拡張子はつけません。
![wireshark9.png](https://qiita-image-store.s3.amazonaws.com/0/146813/41a2fdb4-cee5-5457-788c-8640b55e7505.png)

##6.2 ethersファイルの中身作成
![wireshark10.png](https://qiita-image-store.s3.amazonaws.com/0/146813/e9629aba-d948-0913-55ee-491997dea273.png)

##6.3 wiresharkの設定変更
4の画面上で「編集(E)」-> 「設定(p)」の順でクリックする。または、Ctrl + Shift + Pを押下する。
下記画面がポップアップするので、「Resolve MAC address」にチェックを入れて、「OK」を押す。
![wireshark1.png](https://qiita-image-store.s3.amazonaws.com/0/146813/fac3a2a5-eca4-c064-b25a-26e80a21f3b4.png)

##6.4 wiresharkの再起動
wiresharkを再起動すると、以下のようにMACアドレスが名前で表示されるようになる。
![wireshark1.png](https://qiita-image-store.s3.amazonaws.com/0/146813/3e763434-9942-0fd0-9017-bd8f5ae9219a.png)


#x 参考情報
[WiresharkでキャプチャしたパケットのIPを、任意の名前に変更する方法](http://troushoo.blog.fc2.com/blog-entry-102.html)
Arch Linux に tensorflow をインストールする

インストール方法

```bash
sudo pacman -S python-numpy
sudo pacman -S python-tensorflow
```


テストプログラム

```py3:tensorflow_test.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	tensorflow_test.py
#
#					Mar/20/2018
#
# ------------------------------------------------------------------
import sys
import tensorflow as tf
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
data_out = sess.run(hello)
#
print(data_out)
print(data_out.decode('utf-8'))
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./tensorflow_test.py
```

このプログラムを実行すると警告がでる
そこで、次のように環境変数を設定して実行すれば、
export TF_CPP_MIN_LOG_LEVEL=2
警告が出なくなる

次のバージョンで確認しました。

```text
$ uname -a
Linux iwata 4.15.10-1-ARCH #1 SMP PREEMPT Thu Mar 15 12:24:34 UTC 2018 x86_64 GNU/Linux
$ python --version
Python 3.6.4
```
nodejsでAerospikeにレコード追加する場合のリトライ処理

#nodejsでAerospikeにレコードを追加する

```
client.put(key, rec, function (error) {
  if (error) {
    console.log('error: %s', error.message)
    //TODO: retry
  } else {
    console.log('Record written to database successfully.')
  } 
})
```

#エラーになった時リトライする

```
function retryPutItemToDataStore(client, key, record, retryTimes, retryDelay, callback) {
        let retryCount = 0
        function retry() {
            client.put(key, record, function (error) {
                ++retryCount
                if (error) {
                    if (retryCount >= retryTimes) {
                        logger.error('Putitem Error: %s [%d]\n%s', error.message, error.code, error.stack)
                        callback(err)
                    } else {
                        setTimeout(run, retryDelay);
                    }
                } else {
                    //success, send the record out
                    callback(null, record)
                }
            })
        }
        retry()
    }
```

#レコードの追加処理は下記に変換する

```
client.put(key, rec, function (error) {
    if (error) {
        console.log('error: %s', error.message)
        //retry
        retryPutItemToDataStore(client, key, record, 5, 1000, function(err, data) {
    　　　　if (err) {
           　　　　//5回リトライしてもエラーの場合
           　　　　process.exit(-1)
           } else {
                 logger.info('Record written to database successfully.')
           }
        })
    } else {
        console.log('Record written to database successfully.')
   } 
})
```
蟻本をpythonで: プライオリティキューの自力実装

クラスを使う練習もかねてとりあえず思いつく方法で書いてみたものの、これは本当にO(log n)なんだろうか (計算時間をちゃんと見ろという話)。一応小さい順にはでてくるようにはなっているはず。

python標準のリスト操作をちらほら使っているのでそこでO(n)になってたりすると残念なことに。

```py

def heapsort_one_step(heaplist,child_pos):
    if child_pos == 0:
        return heaplist,0,-1
    child = heaplist[child_pos]
    parent_pos = (child_pos-1)//2
    parent = heaplist[parent_pos]
    if parent > child:
        heaplist[child_pos], heaplist[parent_pos] = parent,child
        return heaplist,parent_pos,1
    else:

        return heaplist,parent_pos,-1

def heapsort(heaplist):
    a = 1
    child_pos = len(heaplist)-1
    while a != -1:
        heaplist,child_pos,a = heapsort_one_step(heaplist,child_pos)
    return heaplist


def reconstruct_heap_one_step(heaplist,parent_pos):

    if len(heaplist) == 2:
        heaplist = [min(heaplist),max(heaplist)]
        return heaplist, parent_pos, -1
        
    if 2*parent_pos+2 > len(heaplist)-1:
        return heaplist, parent_pos,-1
    
    child1 = heaplist[2*parent_pos + 1]
    child2 = heaplist[2*parent_pos + 2]

    if child1 > child2:
        minchild = child2
        child_pos = 2*parent_pos + 2
    else:
        minchild = child1
        child_pos = 2*parent_pos + 1

    if heaplist[parent_pos] > minchild:
        heaplist[child_pos], heaplist[parent_pos] = heaplist[parent_pos],heaplist[child_pos]
        return heaplist, child_pos,1
    else:
        return heaplist,child_pos,-1

def reconstruct_heap(heaplist):
    a = 1
    parent_pos = 0
    while a != -1:
        heaplist, parent_pos, a = reconstruct_heap_one_step(heaplist,parent_pos)
    return heaplist
        

class Heapq:

    def __init__(self,data = []):
        self.data = data

    def push(self,x):
        self.data.append(x)
        self.data = heapsort(self.data)
        print(self.data)

    def top(self):
        return self.data[0]

        
    def pop(self):
        if len(self.data) !=0:
            popval= self.data[0]
            self.data[0] = self.data[-1]
            self.data = self.data[:-1]
            self.data = reconstruct_heap(self.data)
            return popval
        else:
            print("Queue is empty.")

        


queue = []
x = Heapq(queue)

import random

for i in range(10):
    x.push(random.randint(0,100))

print(x.data)


for i in range(10):
    print(x.pop())

```

絶対にもっと簡潔な書き方がある気がする。

追記) なぜか\_\_init\_\__に入れてしまっていたデフォルト変数が潜在的に非常に危険だった模様(コメント参照)。


Virtual Box + Ubuntu + Anacondaでpython3.6へ移行。
React Native勉強メモ　〜導入編〜

## はじめに
Android JavaエンジニアがReact Nativeの勉強をした際のメモ。

バージョン：React Native 0.44

## Reactとは
コンポーネント志向でViewを扱うJavaScriptのフレームワーク。
プロパティに応じてViewを変える。
JSXでXml + CSSっぽくレイアウトを記述できる。
状態の変化があったときに仮想DOMを書き換えてから、実際のDOMを差分だけ更新する。
ReactではView層のみ扱う。fluxアーキテクチャで状態を管理するReduxを併用すると良い。

## React Nativeとは
Reactでモバイルアプリを作れるようにするフレームワーク。
JavaScriptランタイムからネイティブコードのUIを動かす。

## Reduxとは
facebookが提唱するfluxパターンの実装の１つ。
fluxはデータの流れを１方向に強制してわかりやすくする。
https://app.codegrid.net/entry/react-ex-1

Reduxの説明はこちらがわかりやすい。
  - Redux入門【ダイジェスト版】10分で理解するReduxの基礎
http://qiita.com/kiita312/items/49a1f03445b19cf407b7
チュートリアルの和訳とまとめ
  - Redux. From twitter hype to production
http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9
こちらのアニメーションがとてもわかりやすい

## 環境構築
- React Native  
公式ページのGetting Startedに従ってインストール
https://facebook.github.io/react-native/docs/getting-started.html
- Redux  
http://redux.js.org/
- react-recux  
ReactとReduxをつなぐ。 
https://github.com/reactjs/react-redux
- Nuclide  
Facebook製のAtomプラグイン
https://nuclide.io/docs/quick-start/getting-started/
- Chrome  
DevToolでデバッグ 
- Xcode, Android Studio  
シミュレータ/エミュレータ, ネイティブコード編集, アイコン設定、リリースビルドなどなど何かと要る。

## 仮想デバイス準備
- iOSシミュレータ

```
react-native run-ios
```

Cmd + Dでデバッグメニュー
Cmd + Rでリロード

- Androidエミュレータ

```
react-native run-android
```

Cmd + Mでデバッグメニュー表示。
（実機は端末を振るとデバッグメニュー）
R,R("R"2連打)でリロード

コマンドラインからAndroidエミュレータを起動する。

```
$ android list avd
$ emulator -avd <エミュレータ名>
```

なんかエラーでた。

```
ERROR:./android/qt/qt_setup.cpp:28:Qt library not found at ../emulator/lib64/qt/lib
Could not launch '../emulator/qemu/darwin-x86_64/qemu-system-x86_64': No such file or di
```

こちらに従って./bashrcに書く。
http://www.wazalab.com/2017/04/08/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%8B%E3%82%89android-emulator%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

./bash_profileにこれを書いとく。

```
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

## デバッグ手順
https://nuclide.io/docs/platforms/react-native/#debugging

0. Command Line Paletteで"Nuclide React Native: Start Packager"を実行
1. react-native run-ios
2. Nuclide React Native: Start Debuggingを実行
3. シミュレータ/エミュレータのデバッグメニューから"Enable JS Remotely"を選択
4. Chromeで⌘⌥Jを押し、DevToolでデバッグ開始。

## 署名付きリリースビルド
- Android
コマンドラインからビルド
https://facebook.github.io/react-native/docs/signed-apk-android.html

- iOS
Xcodeでビルド
https://facebook.github.io/react-native/docs/running-on-device.html

## 入門向けチュートリアル
以下でそれぞれの基礎を体験しながら学ぶ。

- React 公式チュートリアル
https://facebook.github.io/react/tutorial/tutorial.html
まずは基本となるReact自体の練習から。
ブラウザで動く３並べ(=tit-tat-toe)を例として、Reactの基本を学べる。
ベースになるソースコードが用意されており、手順に沿ってそれに加筆・修正していく。
以下のようなReactの肝となる機能を体験できるので、React Nativeだけやりたい人にもオススメ。
  - propsで表示内容を決める。
  - クリックイベントでstateを変える。
  - 操作履歴を保存してタイムトラベル。


- React Native 公式チュートリアル
https://facebook.github.io/react-native/releases/next/docs/tutorial.html
React自体の説明は少なめで、React Native向けのコンポーネントの使い方を学ぶ。
"The Basics"で簡単なリスト表示までの例。
"Guides"で画面遷移やネイティブコードとの連携、デバッグやビルドの仕方が解説されている。
- Redux 公式サンプル
http://redux.js.org/docs/basics/ExampleTodoList.html
ToDoリストを作って、データの追加から反映する流れを学ぶ。

## おわりに
開発環境と心の準備ができました。

実践編につづく。
[PHPUnit] assertだけのテストから一歩先に進む

今まで、基本的にassertくらいしか使ったことなかった。

プログラム内部の動きまで確かめるテストコードに出会ったので
忘れないように調べたことを書いておく。

なので対象としては、プログラムをしっかり設計した後、それが
正しく動くかまでテストしたい中級者向けだと思われる。

## メソッド(fuga)の呼び出し回数を確かめる

```php
$hoge = $this->createMock(Hoge::class);

$hoge
    ->expects($this->once()) //1回呼ばれることを保証.複数回は、$this->exactly(n)
    ->method('fuga');

//$hogeを扱うオブジェクト
$operator = new Operator;

//内部的にHogeを一回のみ使う
$operator->execute();
```

### createMockについて(phpunit5.4 ~)

指定したもの(クラス or インターフェース)のオブジェクトを作成する
→ 元クラスの __construct() や __clone() は実行されない

下記メソッドの設定と異なるオブジェクトを取得する場合は
`getMockBuilder($type)`を使う

```php
    /**
     * Returns a test double for the specified class.
     *
     * @param string $originalClassName
     *
     * @return PHPUnit_Framework_MockObject_MockObject
     *
     * @throws PHPUnit_Framework_Exception
     *
     * @since Method available since Release 5.4.0
     */
    protected function createMock($originalClassName)
    {
        return $this->getMockBuilder($originalClassName)
                    ->disableOriginalConstructor()
                    ->disableOriginalClone()
                    ->disableArgumentCloning()
                    ->disallowMockingUnknownTypes()
                    ->getMock();
    }
```

## メソッドの返り値をモックする

```php
$hoge = $this->createMock(Hoge::class);

$hoge
    ->method('fuga')
    ->will($this->returnValue('fugasValue'));

```

## 引数が必要なメソッドに値をセットして実行できるようにする

```php
$hoge = $this->createMock(Hoge::class);

$hoge
    ->method('fuga')
    ->with($this->equalTo('someValue')) // なんでもいい場合は、$this->anything()
    ->will($this->returnValue('fugasValue'));

```

## オブジェクトの操作編

## オブジェクトのprivateプロパティ値を取得する。(getter, setterが無いときなど)

```php

namespace App\ValueObject;

class String
{
    public $length  = 5;
}
```

```php
use App\ValueObject\String;

//*** test function内

// ReflectionProperty クラスのインスタンスを作成
$prop = new ReflectionProperty(String::class, 'length');

// String のインスタンスを作成
$obj= new String();

var_dump($prop->getValue($obj)); // 5

//*** test function内

```

## 同様にprivateなメソッドを動かしたいとき

```php
<?php

namespace App\Tests\Utility;

trait InvokePrivateMethodBehavior
{
    /**
     * @param object $object     privateメソッドを実行するクラス
     * @param string $methodName
     * @param null   $param      実行するメソッドにパラメータが必要な場合は指定
     *
     * @return mixed
     */
    function invokePrivateMethod($object, $methodName, $param=null)
    {
        $reflection = new \ReflectionClass($object);
        $method = $reflection->getMethod($methodName);
        $method->setAccessible(true);
        $res = $method->invoke($object, $param);

        return $res;
    }
}
```

## ユースケース

今担当しているプロジェクトでは、データの通り道が一本に抽象化されているので
処理に関わるオブジェクトが正しい回数呼ばれているか確かめていたりする。

ほかにも、バリデータが予想した回数呼ばれているかの確認にもモックは利用されている。

## ひとこと

phpのhttpクライアントで有名なGuzzleさんは、デフォでモックの仕組みを用意していて優秀ですね。
assertだけでもいいのでテストは書いて、よいプロダクトライフを過ごしましょう!
Swiftではenumから文字列とれるのに

Swift から Objective-C にコードを移植しているときに思ったことを...（ついでに解決策も

# Swiftで文字列取得
Swift では、`enum`で指定した`case`の文字列が取れます

```swift
enum BloodType: String {
    case A
    case B
    case O
    case AB
}

BloodType.AB.rawValue // "AB"
```

あまり使わないかもしれないですが、自分は Json をパースする時などに使ってました（[Jsonのenum文字列使用例](#json_key_example)に例を書いておきます）

そこで、これの Objective-C版もお願いとなり移植することに...

# Objective-Cで文字列取得
とりあえず、移植してみる

```objc
typedef enum {
    A,
    B,
    O,
    AB
}BloodType;

BloodType.AB.rawValue // rawValueないよね....
```

ということで、取れなくて困りました
どうしようかと考えた結果、enumからindex（何番目のcaseか）はとれるので文字列を配列に入れておいて取り出すしかないかなと...

```objc
#define BloodTypeArray @"A", @"B", @"O", @"AB", nil

+ (NSString*) BloodTypeToString:(BloodType)value
{
	return [[[NSArray alloc] initWithObjects:BloodTypeArray] objectAtIndex:value];
}

// Usage
[[クラス名] BloodTypeToString:AB]; // @"AB"
```

配列を描くのが少し面倒ですが、1回書いてしまえば、使うのは簡単です:ok_hand:

<a name="json_key_example"></a>
# Jsonのenum文字列使用例
Jsonでも使用例が言葉にするのが難しかったので、例を書いてしまおうとw

```example.json
{
    "name":"taro",
    "blood":"AB",
    "sex":"man",
    "age":"30",
    "parent_name":{
        "father":"takeshi",
        "mother":"yuko"
    }
}
```

このようなJsonを解析する場合、2つenumを作るのが良いのかなと

```objc
enum Example:String {
    case name
    case blood
    case sex
    case age
    case parent_name
}

enum Parent_name:String {
    case father
    case mother
}

// Usage
let json = // Jsonを解析したDictionary
let parent_name = json[Example.parent_name.rawValue] as? Dictionary
let father = parent_name[Parent_name.father.rawValue] as? String
```

こんな感じで使えます！
jsonの階層をいちいち思い出さなくても良いのと、`Key`となる文字列を最初に宣言できる、`Key`の追加があっても階層がわかりやすいのでどこに足すかが一目瞭然。
JavaでClockとLocalDateTimeからOffsetDateTimeを生成する


タイトルそのままだが、手もとにLocalDateTimeとClockのオブジェクトがあったときに、どうやってOffsetDateTimeに変換するか。

一発でできそうな気もするけど、調べた感じどうにもならそうだったので、ZonedDateTimeを経由した。

```
ZonedDateTime zonedDateTime = LocalDateTime.now().atZone(clock.getZone());
OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime();
```