OmniAICreator/Qiita-1.07M huggingface dataset:
nnablaをDockerでGPU込みで環境構築する方法が書いてないので自分でやってみた前編

SONYからNNablaがリリースされたそうです！　細かい説明はぶっ飛ばして早速使ってみましょう！

## 環境

* Ubuntu 16.04
* GTX-1070
* Anaconda

## まずはpipを使って直にインストール

まずはpipを使って直接仮想環境にインストールしてみます。cuDNNのバージョンが6.0と__TensorFlowの対応しているバージョン5.2と違う__ため、GPU使わない方です。

## インストール

```bash
$ conda create --name py27_nnabla python=2.7
```

とりあえずcondaで環境を作って、pipでインストールできるそうなので試してみます。python3系列は未対応らしいので、python2.7で。

```bash
$ pip install nnabla
```

そんなに時間かからず終わりました。最初の一歩であるimportコードを試してみましょう。

```bash
$ python -c "import nnabla"
2017-06-28 22:14:29,602 [nnabla][INFO]: Initializing CPU extension...
```

[NNablaのサイト](https://nnabla.readthedocs.io/en/latest/python/install_on_linux.html)によるとこれでインストールされているらしいので、Exampleを実行してみます。

[nnablaのリポジトリ](https://github.com/sony/nnabla)からgit cloneなり、zipダウンロードなりします。

nnabla/examples/vision/mnistのディレクトリ内でexampleコードを実行します。

```bash
python classification.py
```
当然それなりに時間がかかります。

……

Mnistって真面目にやると１時間じゃ終わらないはずなのだけど、そこのところどうなのだろう？

……

動くことは確認したのでkeyboard interruptしました。

今回の本題はDockerです。

## Dockerで環境構築

Dockerの実行方法は……

```
Run A Docker Image hosted on DockerHub

TODO.

Build Docker Image from source

TODO.
```

ぐぬぬ

幸いなことにDockerfileは公開されているのでこちらからなんとかしましょう。

## 実行方法が公開されていないけど、NNablaのDockerファイルをビルドして利用してみよう！

nnabla/dockerに移動して

```
$ sudo bash ./docker-build develop-ubuntu16.04
```
今回はdevelop-ubuntu16.04でやってみました。

案の定時間がかかりますが今回は待ちます。少なくとも数十分は見積もったほうがよいでしょう。

イメージのビルドが終わったら実行してみます。

```bash
$ docker run -it nbla:develop-ubuntu16.04
```

rootでログインするので、何かしらやってみましょう。例えば、importの実行

```bash
$ python -c "import nnabla"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named nnabla
```

ダメじゃねーか！

Dockerfileを読んでみたところどうも、__READMEに書いてあるとおりに実行してもNNablaはインストールされない__らしいことがわかりました。それでは本末転倒なので自力でなんとかします。

後編へ続く
フォルダとフォルダの合成

フォルダの合成(フォルダ1+フォルダ2→フォルダ2)
①フリーソフトありますか。
②他のOSはどのようにしますか。シェルですか
入力---------------------------------------------
フォルダ1
￥1￥A￥texta(内容あ)
￥1￥B

フォルダ2
￥2￥A￥texta(内容い)
￥2￥A￥textb(内容う)
マウス操作----------------------------------------
フォルダ「AB」を囲んで、フォルダ「2」に貼り付ける。
フォルダすべての項目に上書き
ファイルコピーして置き換え
結果----------------------------------------------
フォルダ2
￥2￥A￥texta(内容あ)
￥2￥A￥textb(内容う)
￥2￥B
RxJavaでretryWhenを使ってエラーをキャッチして別のエラーを流す

https://speakerdeck.com/yuyakaido/droidkaigi-2017?slide=86

この辺の話に近い。


```kotlin
Observable.create<Int> { emitter ->
    emitter.onNext(1)
    emitter.onNext(2)
    emitter.onError(HogeException())
    emitter.onComplete()
}.retryWhen { observable ->
    observable.flatMap { e ->
        val exception = if (e is HogeException) FooException() else e
        Observable.error<Int>(exception)
    }
}.subscribe({
    println(it)
}, { e ->
    println(e.javaClass.simpleName)
}, {})

class HogeException : RuntimeException()
class FooException : RuntimeException()
```

こんな感じでHogeExceptionが流れてきたら、FooExceptionにExceptionを変更して流す。
MySQLのJSON型でdefault値が設定できなかったので。 with Laravel

## 概要
LaravelのプロジェクトでJSON型を使おうとしたら
Default値が設定できなかったので
アプリケーション側でなんとかした。

## 内容

**migrationファイル(一部省略)**

```php:2017_01_01_0123456_create_yakisoba_table.php

class CreateYakisobaTable extends Migration
{
    public function up()
    {
        Schema::create('yakisobas', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->json('meta');
        });
    }
}
```

もちろんこれは適当なものです。
`meta` フィールドに `JSON` を設定しています。

それで、Modelをいつものように利用しようとします。 (一部省略)

```php:YakisobaController.php

public function yakisoba()
{
    Yakisoba::create([
        'name' => 'ペヤング',
    ]);
}
```

すると

```
General error: 1364 Field 'meta' doesn't have a default value ...
```

デフォルト値が設定されていないので `meta` がnullだとMySQL側でエラーになりました。

`$table->json('meta')->nullable();`として
nullを許可すればいいのですが、極力nullはDBに入れないようにしてくれと。

そこでModelにて以下のように設定します。 (一部省略)

```php:Yakisoba.php
class Yakisoba extends Model
{
    protected $attributes = [
        'meta' => '{}',
    ];
}
```

これでデフォルト値が実質アプリケーション側で設定できました。

ただし、これでは `mata` を `'{}'` の文字列として扱うことになるため、

```php:Yakisoba.php
class Yakisoba extends Model
{
    protected $attributes = [
        'meta' => '{}',
    ];

    // 追加
    protected $casts = [
        'meta' => 'array',
    ];
}
```

としてあげると、デフォルトで `$yakisoba->meta` が `[]` の配列として
扱われていい感じですねヾ( ﾟдﾟ)人( ﾟдﾟ)ﾉﾞ
require と require_relative って何が違うの？

#はじめに
自作関数を記述したファイルをrequireメソッドで別ファイルから実行しようとしたところ、
Atomのauto_runnerを利用して実行すると以下のようなエラーが出るのに、コマンドラインから実行すると正常終了する。。。
ということでrequireとrequire_relativeの違いを調べてみました。

```
:/Ruby24-x64/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- ./setVar.rb (LoadError)
	from C:/Ruby24-x64/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from ディレクトリ名/test.rb:4:in `<main>'
```


#require メソッド
$LOAD_PATHに指定されているディレクトリから相対パスで該当のファイルを探しに行く
※$LOAD_PATHについては<a href="https://docs.ruby-lang.org/ja/search/type:variable/query:%24LOAD_PATH/">こちら</a>


#require_relative メソッド
実行したいファイル(ここではtest.rb)のディレクトリからの相対パスで該当のファイルを探しに行く

<br>
要はAtomのカレントディレクトリを指定していたので上手くいかなかったんですね。
でも「どうしてもrequireを使いたい！」という場合は、$LOAD_PATHにカレントディレクトリを指定しましょう。

LOAD_PATHの追加についてはこちらの記事を参考にしました
参考：<a href="http://d.hatena.ne.jp/littlebuddha/20081020/1224483302">require がロードするファイルを探すパスに追加をする</a>
git-ftp使ってみた

無料のレンタルサーバーで簡易なホームページを公開しています。
(基本イベント告知のみなのでWordPressとか使う予定ナシ）

そのレンタルサーバーへはFTPコマンドでアップロードしています。
が、これが実に面倒くさい。

なので今回、`git-ftp`を使ってみようと思います。
使ってる途中いろいろあったので備忘録として。

# Homebrewのインストール

自分でびっくりしたけどHomebrew入れてなかった＼(^o^)／
[公式サイト](https://brew.sh/index_ja.html)を見ながら入れました。
[公式サイト](https://brew.sh/index_ja.html)によると、下記コマンドを打てばいいようです。
ただ、URLが変わることもあるようなので、公式サイトのコマンドをコピペすべきだと思います。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# git-ftpのインストール

```
$ brew install git-ftp
```

これでインストールができたので、次は設定。

```
$ git config git-ftp.[任意で好きな名前].url [FTPサーバ]
$ git config git-ftp.[任意で好きな名前].user [ユーザー名]
$ git config git-ftp.[任意で好きな名前].password [パスワード]
```

設定ができたら初期化。

```
$ git ftp init -s [任意で好きな名前]
```

これで完了です。
サーバーへFTPする場合は下記コマンドで。

```
$ git ftp push -s [任意で好きな名前]
```

☆注意点
git pushをしてしまうと、ftpできなくなります。
(commitがないと判断されるっぽい)
ftp→pushの順がいいです。
Python3 の curses 覚書き

curses の類は一度触ってみたいと思って5年くらい経っちゃったから
勉強中の Python3 でいろいろ試そうと思った。試している。
その覚書き。

# 参考にしてるとこ

https://docs.python.jp/3/howto/curses.html
https://docs.python.jp/3/library/curses.html
https://torina.top/detail/437/

# やりたいこと

## カーソル関連

### カーソル消したい

```py3:
import curses;
screen = curses.initscr()
curses.curs_set( 0 ) # 0:透明 1:フツー 2:濃い でも1と2の違いがよくわからなかった
```
### カーソルを目的の位置に移動させたい

```py3:
import curses;
screen = curses.initscr()
screen.move( y, x )
screen.refresh()
```

### カーソルが今どこか知りたい

```py3:
import curses;
screen = curses.initscr()
y, x = curses.getsyx()
```

## 表示関連

### 端末を光らせたい

```py3:
import curses;
screen = curses.initscr()
curses.flash() # ピカッ！
```

## キー関連

### キー入力を1文字ずつ受け取りたい

```py3:
import curses;
screen = curses.initscr()
curses.cbreak()
```

# 今よくわかっていないこと

特になし
Line NotifyとDropbox APIで、サーバレス監視カメラ(サーバ編)

# 買い物カメラ

　買い物から帰ってきたら、「ついでに牛乳買ってきてほしかった」と言われちゃうのはよくある事故で、うちではこれを減らすため、買ってこないといけないものは、冷蔵庫に貼ったホワイトボードに書いておいて、買ってきたら消すことにしています。

　この内容、外出先で見たいよね、ということで、冷蔵庫の買い物メモをLINEに投稿してくれる便利カメラを作りました。

　市販の監視カメラ的なものを使って作ることも考えたのですが、それだと
* スマホからまともに見れなかったりするし:disappointed_relieved:
* パスワードを家族みんなに覚えてもらうとか、ありえなくない？:sweat:
* 外出先でブラウザ立ち上げてカメラ見るとかタルいよね？時代はPUSH型:stuck_out_tongue_winking_eye:

ということで、Raspberry Piで作ったカメラから[LINE NOTIFY](https://notify-bot.line.me/ja/)経由でLINEに投稿させることにしました。家族グループにLINE NOTIFYを追加してあるので、買い物メモが更新されるたびにLINEに画像が届きます。

![2017-06-28 08.47.31.png](https://qiita-image-store.s3.amazonaws.com/0/30743/b1665f86-1ee2-c368-a9f7-545f33e5d3ba.png)

# LINE NOTIFYに画像を投稿させるメリット

プログラムからLINEにメッセージを送ることができる[LINE NOTIFY](https://notify-bot.line.me/ja/)は、URLをつけると画像を添付することができます。

![If_Maker_Event__reizouko___then_send_message_-_IFTTT.png](https://qiita-image-store.s3.amazonaws.com/0/30743/813111fc-de52-5720-40da-295c5c053baa.png)

こうして投稿された画像は、LINE側でキャッシュしてくれるので、投稿後サーバ上のファイルを削除したとしても、LINEアプリ上では引き続き見ることができるのです。

インターネット上に監視カメラ的なものを公開すると、誰が見るかわからない(ので認証の仕組みを作らないといけない＝作る方も使う方も面倒くさい:dizzy_face:)という問題が発生しますが、速やかにファイルを削除することで、余計な人に見られる危険性を最低限にすることができます。削除する前に見られてしまう可能性はゼロじゃないですが、家庭の買い物メモには十分でしょう。

# Dropbox APIで画像を公開する

とはいえインターネット上にWEBサーバを公開するとなると、ファイルを盗み見られるリスクだけでなく、WEBサーバに対する攻撃も懸念されます。

Dropboxには、保存したファイルをインターネット上で見られるようにシェアする機能がついています。特定のユーザーだけ共有とか、無認証で誰でも見られるようにするなど幾つかパターンがあります。

通常のシェア機能だと、取得できるURLは一度クッションページを挟むので、LINEに投稿する用途にはうまく使うことができません。

![Screenshot_2017_6_28_17_42.png](https://qiita-image-store.s3.amazonaws.com/0/30743/e4dbfdc7-5819-7e30-fc21-2fc47dc3cab2.png)

けれども、時間を区切ってファイルを公開する[get_temporary_link](https://www.dropbox.com/developers/documentation/http/documentation#files-get_temporary_link) APIで取得したURLだけは、画像を直接表示してくれるので、これなら、LINEに画像を投稿する用途に使うことができます。このURLは４時間で自動的に無効になるのもいい感じです:grinning:

[dropbox api gem](https://github.com/Jesus/dropbox_api) を使えば、Rubyから実行するのも簡単。

```
    client = DropboxApi::Client.new(access_token)
    file = IO.read(filename)
    upload_filename = Time.now.strftime('/%Y%m%d_%H%M%S.jpg')
    client.upload(upload_filename, file)
    client.get_temporary_link(upload_filename).link
```

# まとめ

LINE NOTIFYとDropbox APIを組み合わせることで、インターネット上に公開するコードを書くことなく、限られたユーザーだけがカメラの映像を見ることができる仕組みを構築することができました。

カメラ側の詳細はまたそのうちに。

![2017-06-28 17.47.57.jpg](https://qiita-image-store.s3.amazonaws.com/0/30743/d9a38012-a2c5-d325-caf5-1df54daea61b.jpeg)
Go - irisとgorilla/sessionsでセッション管理してみる

[iris](https://github.com/kataras/iris)についてるセッション管理ライブラリを使うと、どうもロック関連がおかしくて途中で止まってしまうので、[gorilla/session](https://github.com/gorilla/sessions)を使ってみる。

カウンターつくってみた。/upにアクセスすると1アップして、/clにアクセスするとクリアされる。

## コード

```main.go
package main

import (
	"github.com/kataras/iris"
	"github.com/kataras/iris/context"
	"github.com/gorilla/sessions"
	"fmt"
)

var store = sessions.NewCookieStore([]byte("hoge"))
var sess_name = "sess"

func main() {
	app := iris.New()
	app.Get("/", topPage)
	app.Get("up", upPage)
	app.Get("cl", clearPage)
	app.Run(iris.Addr(":8080"))
}

func topPage (ctx context.Context) {
	f := getFlash(ctx)
	cnt := fmt.Sprintf(
		"<h2>count is %d</h2>",
		getCount(ctx),
	)
	html := `<br><a href="/up">Count Up</a>
	<br><a href="/cl">Count Clear</a>`
	ctx.HTML(f + cnt + html)
}

func upPage (ctx context.Context) {
	countUp(ctx)
	addFlash(ctx, "count up")
	ctx.Redirect("/")
}

func clearPage (ctx context.Context) {
	sessClear(ctx)
	addFlash(ctx,"session clear")
	ctx.Redirect("/")
}
```

```session.go
package main

import (
	"github.com/kataras/iris/context"
	"fmt"
)

func getCount(ctx context.Context) int {
	sess, _ := store.Get(ctx.Request(), sess_name)
	cnt := 0
	if v, ok := sess.Values["cnt"]; ok {
		if c, ok := v.(int); ok {
			cnt = c
		}
	}
	return cnt
}

func countUp(ctx context.Context) {
	sess, _ := store.Get(ctx.Request(), sess_name)
	cnt := 1
	if v, ok := sess.Values["cnt"]; ok {
		if c, ok := v.(int); ok {
			cnt = c + 1
		}
	}
	sess.Values["cnt"] = cnt
	sess.Save(ctx.Request(), ctx.ResponseWriter())
}

func sessClear(ctx context.Context) {
	sess, _ := store.Get(ctx.Request(), sess_name)
	sess.Values = make(map[interface{}]interface{})
	sess.Save(ctx.Request(), ctx.ResponseWriter())
}

func getFlash(ctx context.Context) string {
	sess, _ := store.Get(ctx.Request(), sess_name)
	f := sess.Flashes()
	sess.Save(ctx.Request(), ctx.ResponseWriter())
	if len(f) > 0 {
		return fmt.Sprintf(
			`<p style="color:#090;padding:5px;">%s</p>`,
			f[0],
		)
	}
	return ""
}

func addFlash(ctx context.Context, msg string) {
	sess, _ := store.Get(ctx.Request(), sess_name)
	sess.AddFlash(msg)
	sess.Save(ctx.Request(), ctx.ResponseWriter())
}
```

## 画面

![session.png](https://qiita-image-store.s3.amazonaws.com/0/147049/75b460ec-99b4-9250-9c19-24ffbf7726ee.png)
C++を使ってRubyのメソッドを書く(その1)

###目次
C++を使ってRubyのメソッドを書く(その1) <- ここ
[C++を使ってRubyのメソッドを書く(その2)](https://qiita.com/ki073/items/d1b56e0a54da25536546) ベンチマーク


SWIGを使うことで、C++で書いた関数をRubyのメソッドとして簡単に呼び出すことができます。文字列や配列もC++の関数に手を加えることなく使えるようになります。

###必要なファイル
関数の本体です。C++で書かれた普通の関数です。

```c++:test.hpp
#include <string>
#include <vector>
using namespace std;

int twicefold(int x);
double twicefold(double x);
vector<int> twicefold(vector<int> ary);
vector<double> twicefold(vector<double> ary);

class Test{
public:
    static int sum(vector<int> ary);
    static double sum(vector<double> ary);
    static int length(string str);
    static vector<int> length(vector<string> str_ary);
};
```

```c++:test.cpp
#include "test.hpp"
using namespace std;

int twicefold(int x){
	return(x*2);
}

double twicefold(double x){
	return(x*2.0);
}

vector<int> twicefold(vector<int> ary){
	size_t ary_size=ary.size();
	vector<int> twice_result(ary_size);
	for(int i=0; i<ary_size; i++){
		twice_result[i]=ary[i]*2;
	}
	return(twice_result);
}

vector<double> twicefold(vector<double> ary){
	size_t ary_size=ary.size();
	vector<double> twice_result(ary_size);
	for(int i=0; i<ary_size; i++){
		twice_result[i]=ary[i]*2.0;
	}
	return(twice_result);
}

int Test::sum(vector<int> ary){
    int total=0;
    for (int i=0; i<ary.size(); i++){
        total+=ary[i];
    }
    return(total);
}

double Test::sum(vector<double> ary){
    double total=0.0;
    for (int i=0; i<ary.size(); i++){
        total+=ary[i];
    }
    return(total);
}

int Test::length(string str){
	return(str.length());
}

vector<int> Test::length(vector<string> str_ary){
	size_t ary_size=str_ary.size();
	vector<int> lengths(ary_size);
	for(int i=0; i<ary_size; i++){
		lengths[i]=Test::length(str_ary[i]);
	}
	return(lengths);
}
```

オーバーロードになっているものがいくつかありますが、引数のクラスに応じて適切な関数が呼ばれます。

次にSWIG用のファイルです。

```test.i
%module testF
%{
#include "test.hpp"
%}

%include <std_string.i>
%include <std_vector.i>
%template(StringVector) std::vector<std::string>;
%template(IntVector) std::vector<int>;
%template(FloatVector) std::vector<double>;
%include test.hpp
```
引数や戻り値にvectorを使う時には上記のように%templateを追加してください。括弧内の名称はクラス名になります。
%include test.hppを%templateの後に移動しました。これにより引数や返値が自然な形で使えるようになりました。

```ruby:extconf.rb
require 'mkmf'
create_makefile("testF")
```
(2020.9.21) $libs += " -lstdc++ "を削除しました。不要な行でした。

以上のファイルを同じフォルダに入れておきます。

###ライブラリファイルを作成

```command
swig -c++ -ruby test.i
ruby extconf.rb
make
```

1行目のコマンドでwarningが出ますが、正常にオーバーロードができているようです。
ここまでで、testF.bundle(OSにより拡張子は異なる)のファイルができます。

###テスト用のプログラム

```test.rb
require "./testF"

p TestF::twicefold(2)
p TestF::twicefold(3.2)
p TestF::twicefold([1,2,3])
p TestF::twicefold([2.1,3.2,4.3])

p TestF::Test.sum([1,2,3])
p TestF::Test.sum([2.1, 3.2, 4.3])

p TestF::Test.length("12345")
p TestF::Test.length(["12345", "678"])
````

CentOS 8.2 Ruby 2.6.6
macOS 10.13.6 Ruby 2.7.1
SWIG 4.0.2
Ruby 2.7ではswigのバージョン4.0.2以降が必要です。
BigQuery の PublicDataset `nyc-tlc` で遊んだメモ

# データセットの対象期間
```
SELECT
  MIN( pickup_datetime ) as pickup_datetime_min,
  MAX( pickup_datetime ) as pickup_datetime_max
FROM
  `nyc-tlc.yellow.trips`
LIMIT
  1000
```

![スクリーンショット 2017-06-29 10.01.38.png](https://qiita-image-store.s3.amazonaws.com/0/54176/8f3d1fba-6ff0-97e3-88ce-60326b769002.png)

# 緯度/経度について１度刻みで乗車位置をカウント
```緯度
SELECT cast( pickup_latitude / 1 as INT64) * 1 as mid , count(1) as cnt FROM `nyc-tlc.yellow.trips` group by mid order by cnt desc

```

```経度
SELECT cast(pickup_longitude / 1 as INT64) * 1 as mid , count(1) as cnt FROM `nyc-tlc.yellow.trips` group by mid order by cnt desc
```

# NY周辺の緯度経度0.1刻みの乗車位置カウント集計

```
select 
     concat(CAST(pickup_latitude_floor as STRING), ', ',CAST(pickup_longitude_floor as STRING)) as location,
     pickup_latitude_floor,
     pickup_longitude_floor,
     cnt
  from (
select
    cast(cast( pickup_latitude * 1000 as INT64) as FLOAT64) / 1000 as pickup_latitude_floor,
  cast(cast( pickup_longitude * 1000 as INT64) as FLOAT64) / 1000 as pickup_longitude_floor,
    count(1) as cnt
from (
SELECT
  *
FROM
  `nyc-tlc.yellow.trips`
WHERE
  pickup_longitude >= -75
  AND pickup_longitude <= -73
  AND pickup_latitude >= 40
  AND pickup_latitude <= 42)
group by pickup_latitude_floor, pickup_longitude_floor
order by pickup_latitude_floor, pickup_longitude_floor )
```
Laravelの Illuminate\Support\Collection と foreach の速度の比較

前から気になっていたのでやってみた。

`array_map` より `foreach` の方が速いという話を聞いたことがあるので、まあ `foreach` の方が速いんだろうとは思うものの、どの程度速いのか知りたかった。

というのもLaravelの `collect()` ヘルパーが強力過ぎて、もう普通のArrayは使いたくないとまで思ってしまったからだ。

# 検証方法

次のテストコードを使って計測する。

LaravelのBooting時間とか諸々ツッコミどころはあります。

```php:tests/SpeedTest.php
<?php

use Tests\TestCase;

class SpeedTest extends TestCase
{
    public function testCollection()
    {
        collect(range(1, 1500000))->map(function ($value) {
            return $value * 2;
        })->filter(function ($value) {
            return $value > 10000;
        });
    }

    public function testForeach()
    {
        $double_me = [];
        foreach (range(1, 1500000) as $value) {
            $double_me[] = $value * 2;
        }
        $filter_me = [];
        foreach ($double_me as $key => $value) {
            if ($value > 10000) {
                $filter_me[$key] = $value;
            }
        }
    }
}
```

やっていることは、

1から1500000までの範囲に対し、2倍して10000より大きい要素を取得

である。間違っていたらすみませんm(_ _)m

# 結果

Collectionの方

```
vagrant@homestead:~/Code/Laravel$ php vendor/bin/phpunit tests/SpeedTest.php --filter=Collection
PHPUnit 4.8.35 by Sebastian Bergmann and contributors.

.

Time: 1.28 seconds, Memory: 262.02MB
```

foreachの方

```
vagrant@homestead:~/Code/Laravel$ php vendor/bin/phpunit tests/SpeedTest.php --filter=Foreach                                                                             
PHPUnit 4.8.35 by Sebastian Bergmann and contributors.

.

Time: 1.06 seconds, Memory: 178.00MB
```

やはり若干foreachの方が速い。

しかもforeachは変数を2つ使っているにも拘わらず、メモリ消費量がかなり少なかった。
内部でどう処理されているかは知らない。

# 所感

まあこんな大量の範囲を扱うコードは現実にはほぼ使わないだろうから、ほとんど気にすることは無いのでは。

それよりも可読性の方が大切と考える。

foreachは一旦変数に入れるから、変数のスコープをcollect()より気にしてしまう。
【メモ】Laravelマイグレーションで外部キー制約をつけるときに気をつけること

Laravelで外部キー制約をつけたテーブルのマイグレーションファイルをマイグレートする時に外部キー制約がつけられないエラーが発生。

```PHP
SQLSTATE[HY000]:General error: 1215 Cannot add foreign key constraint
```

確認するポイント
・innoDBになているか
・数値の場合外部キーにunsigned()がついているか

```PHP
$table->integer('purpose_id')->unsigned();
$table->foreign('purpose_id')
      ->references('id')
      ->on('purpose_masters')
      ->onDelete('cascade');
```
・数値でない場合、Eloquentモデルクラスに```$incrementing = false;```が設定されているか
・外部キー制約をつける際に既に参照先のテーブル、カラムが作られているか
 (マイグレーションを行う場合、マイグレーションファイルが作られた順番にマイグレーションが行われる。そのため、参照先のテーブルより先に外部キー制約の記述をしたマイグレーションファイルを作成してしまうと上記のようなエラーが発生してしまう)←ここでずっと引っかかってた(泣)

以上。
Ubuntu 14.04でlinux-headerのせいでi-nodeがいっぱいになった



linux-headerが複数インストールされたのが原因でi-nodeを使い切ってしまい、ファイルが作成できない状態となった。apt-getを実行すると "No space left on device." のエラー表示。

linux-headerをすべてアンインストールした上で、apt-getのデータベースの修復を行った。

インストールされているlinux-headerをすべてアンインストール

```
dpkg -l | grep linux-header | grep '^ii' | awk '{print $2'} | sort | xargs sudo dpkg --remove
```

パッケージの依存関係修正

```
sudo apt-get install -f
```
laravel5.3をローカルからサーバーにデプロイするbashスクリプト

ssh接続でアップロードしてインストールします
環境はubuntu16.04で、webサーバーはapacheです
このスクリプトはlaravelのルートディレクトリに保存してそのディレクトリに移動してから実行します
DIR_NAME,APACHE_USER,SSH_USERを書き換えて
`$./deploy.sh upload`
でアップロード
`$./deploy.sh install`
でインストールします

```
#!/bin/sh
DIR_NAME="service_name"
APACHE_USER="www-data"
SSH_USER="ubuntu"
case $1 in
  "")
    echo "./deploy.sh upload then install"
    ;;
  "upload")
    #アップロード先のファルダを作成
    ssh ${SSH_USER} mkdir -p /var/www/${DIR_NAME}_uploaded
    #高速にアップロードするために、ローカルで圧縮してからサーバーにアップロードしてサーバー側で展開する
    tar cvf - . | ssh ${SSH_USER} tar xvf - -C /var/www/${DIR_NAME}_uploaded
    ;;
  "install")
    #デバッグモードをオフにしてファイルやフォルダの権限を設定
    ssh -t ${SSH_USER} "\
    sudo sed -i -e "s/APP_DEBUG=true/APP_DEBUG=false/g" /var/www/${DIR_NAME}_uploaded/.env \
    && sudo chown -R ${SSH_USER}:${APACHE_USER} /var/www/${DIR_NAME}_uploaded \
    && sudo chmod -R 750 /var/www/${DIR_NAME}_uploaded \
    && sudo chmod -R 770 /var/www/${DIR_NAME}_uploaded/storage/ /var/www/${DIR_NAME}_uploaded/bootstrap/cache/ \
    "
    #アップロードしたバージョンと現在稼働中のバージョンが存在しバックアップが存在すればバックアップを削除
    ssh ${SSH_USER} "\
    [ -d /var/www/${DIR_NAME}_uploaded ] \
    && [ -d /var/www/${DIR_NAME} ] \
    && rm -rf /var/www/${DIR_NAME}_backup \
    "
    #アップロードしたバージョンと現在稼働中のバージョンが存在すればバックアップに
    ssh ${SSH_USER} "\
    [ -d /var/www/${DIR_NAME}_uploaded ] \
    && [ -d /var/www/${DIR_NAME} ] \
    && mv /var/www/${DIR_NAME} /var/www/${DIR_NAME}_backup \
    "
    #アップロードしたバージョンが存在すれば稼働させる
    ssh ${SSH_USER} "\
    [ -d /var/www/${DIR_NAME}_uploaded ] \
    && mv /var/www/${DIR_NAME}_uploaded /var/www/${DIR_NAME} \
    "
    ;;
esac

```
Railsで複数マスター・スレーブ構成のDB接続をサポートするReplidog


[Replidog](https://github.com/jemiam/replidog)はRailsでの複数DB接続をサポートするツールです。

* 複数マスタ・スレーブ(テーブル単位の分割)対応
* Read/Writeの自動振り分け
* Rails 3.2, 4,0, 4,1, 4.2, 5,0, 5.1
* マルチスレッド対応(pumaでも使える)

## なぜつくったか

Rails 4.0以上で複数マスタ・スレーブでRead/Writeの自動振り分けをしたかったからです。

Rails 4.0以上で複数DBをサポートするライブラリとしては以下が有名です。

* [Ocutopus](https://github.com/thiagopradi/octopus)
* [SwitchPoint](https://github.com/eagletmt/switch_point)

Octpusはどちらかというとシャーディングに特化したツールで、複数マスタ・スレーブをサポートしてません。一方SwitchPointは複数マスタ・スレーブを扱えますが、Read/Writeの自動振り分けに対応していません。

複数マスタ・スレーブとRead/Writeの自動振り分け両方をサポートしているライブラリとして[Replicat](https://github.com/r7kamura/replicat)がありますが、試してみたところ複数マスタ・スレーブがうまく動かなかったのと、レプリケーションのやり方に難があったので断念しました。

ただReplicatの設定ファイルの書き方がよかったのと、ソースコードがシンプルでいじりやすそうだったのでReplicatを改良することにしました。当初は完成したらReplicatにプルリクエストをしようと思ってましたが、基本的なデータ構造をざっくり変更することになり使い方も変わったので、独自ライブラリとしてリリースすることにしました。名前はReplicatをもじってReplidogとしました。

## インストール

```
gem install replidog
```

bundlerで使うならGemfileに

```
gem "replidog"
```

## 使い方

Replicatとほぼ同じです。

```ruby
# app/models/recipe.rb
class Recipe < ActiveRecord::Base
  establish_connection :production_recipe
end

# config/database.yml
production:
  <<: *production
  host: 192.168.24.1
  replications:
    slave1:
      <<: *slave
      host: 192.168.24.2
    slave2:
      <<: *slave
      host: 192.168.24.3
    slave3:
      <<: *slave
      host: 192.168.24.4

production_recipe:
  <<: *production
  host: 192.168.24.5
  replications:
    slave1:
      <<: *slave
      host: 192.168.24.6
    slave2:
      <<: *slave
      host: 192.168.24.7
    slave3:
      <<: *slave
      host: 192.168.24.8
```

`replicatoins`の部分がスレーブ接続の設定です。

`production`は従来通り自動的にActiveRecord::Baseのサブクラス全てで使われますが、もうひとつのマスタ`production_recipe`は明示的に`establish_connectoin`で宣言する必要があります。

モデルのDB接続メソッド呼び出し時にselect系のものはスレーブへ、それ以外はマスターへ自動的に振り分けられます。トランザクションの中ではselect系も含めて全てマスターに振り分けられます。

また自動振り分けせずに明示的にコネクションを切り替えることも可能です。詳しくは[README](https://github.com/jemiam/replidog#usage)をご覧ください。

`production_recipe`で複数のモデルを扱いたいときは抽象クラスをつくって継承させます。

```ruby
# app/models/recipe_table.rb
class RecipeTable < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :production_recipe
end

# app/models/recipe.rb
class Recipe < RecipeTable
end
```


## コネクション運用・クエリキャッシュ

Replidogでは以下のARのメソッドを書き換えて全てのマスタ・スレーブ接続に対して実行するようにしています。そのため既存のRailsのmiddlewareやUnicorn等のAPPサーバーの設定を変更することなく導入できます。

clear_xxx_connections
* ActiveRecord::Base.clear_active_connections
* ActiveRecord::Base.clear_reloadable_connections
* ActiveRecord::Base.clear_all_connections

クエリキャッシュ
* ActiveRecord::Base.connection.enable_query_cache!
* ActiveRecord::Base.connection.disable_query_cache!
* ActiveRecord::Base.connection.clear_query_cache!

## 運用実績

[Taptrip](https://play.google.com/store/apps/details?id=com.taptrip&hl=ja)というアプリのバックエンドで以下の組み合わせでの運用実績があります。

* Rails 3.2, 4.2
* Ruby 2.2
* Mysql 5.6
Swift3の標準出入力

### Swift3の標準入出力の自分用メモです。paiza.ioで動作確認済みです。ご自由に利用ください。

# 標準入力をString型に代入
```
var str = readLine()!
print(str)
// abc を入力すると
// abc が出力される
```
Swiftでは標準入力をString型で受け取ります。

# 標準入力をInt形に代入
```
var num = Int(readLine()!)!
print(num)
// 28 を入力すると
// 28 が出力される
```
String型で受けてから、Int型に変換しています。

分かりやすく書くとこうなります。

```
var str = readLine()!
var num = Int(str)!
print(num)
```

# スペース区切りの標準入力をString型の配列に代入して、全要素を出力
```
import Foundation
var str = readLine()!.components(separatedBy:" ")
for i in str {
    print(i)
}
// abc de を入力すると
// abc
// de
// が出力される
// 配列strには["abc", "de"]が入っている
```
String型で受けてから、components(separatedBy:" ")を使って、
"abc"と"de"を要素に持つString型の配列を作っています。

区切り文字は、separatedBy: のあとに""で挟んで指定します。
例えば、/ で区切りたいときは、`componenents(separatedBy:"/")` と書きます。

# スペース区切りの標準入力をInt型の配列に代入して、全要素を出力
```
import Foundation
var str = readLine()!.components(separatedBy:" ")
var num = [Int]()
for i in str {
    num.append(Int(i)!)
    print(i)
}
// 29 18 を入力すると
// 29
// 18
// が出力される
// 配列numには[29, 18]が入っている
```

`var num = [Int]()`で要素を持たないInt型の配列が作れます。
`num.append(5)`と書くと、配列の末尾に、5 が追加されます。
今回は、配列strの各要素をInt型に変換してから追加しています。
pythonでログ出力を単体テストする


こんにちはsekitakaです。

普段何気なくログを出力していますが、ログが確かに出力されていることをテストしたいことがたまにあります。
この記事では「ログが出力されている」ことをテストする方法を紹介します。

# テスト方法
## testfixtures
ログが出力されていることをテストするにはtestfixturesというパッケージを利用します。

```
pip install testfixtures
```

## 使用例
次の例ではput_logという関数がINFOレベルで`foo`というログを出力することをテストしています。

```python
# coding=utf-8
from testfixtures import LogCapture
import logging
from unittest import TestCase
import unittest

logger = logging.getLogger()
def put_log(message):
    logger.info(message)

class Test(TestCase):
    def test_put_log(self):
        with LogCapture() as l:
            put_log("foo")
            l.check(
                ("root","INFO","foo")
            )

if __name__ == '__main__':
    unittest.main
```

## 応用
`LogCapture()`の引数によってloggerの名前や、キャプチャするログレベルのフィルタリングなどができます。
また `log_str = str(l)` とすることで、以下のような形式のログの全文を文字列として取得できるので、正規表現マッチングなどのアサーションによってテストするのも良いかもしれません。

```python
root INFO
  foo
```

しかしどこまでテストするのかいつも悩ましい
【翻訳】scikit-learn 0.18 User Guide 1.15. アイソトニック回帰

http://scikit-learn.org/0.18/modules/isotonic.html を google翻訳した

[scikit-learn 0.18 ユーザーガイド 1. 教師付き学習](http://qiita.com/nazoking@github/items/267f2371757516f8c168#1-%E6%95%99%E5%B8%AB%E4%BB%98%E3%81%8D%E5%AD%A6%E7%BF%92) より

----

# 1.15. アイソトニック回帰

[IsotonicRegression]() クラスは、非減少関数をデータに適合させます。 それは以下の問題を解決します：

```math
minimize \sum_i w_i (y_i - \hat{y}_i)^2
```

```math
subject\ to\ \hat{y}_{min} = \hat{y}_1 \le \hat{y}_2 ... \le \hat{y}_n = \hat{y}_{max}
```

各 $w_i$ は厳密に正であり、各 $y_i$ は任意の実数である。 これは、平均二乗誤差に関して最も近似しない非減少要素からなるベクトルを生成する。 実際には、この要素のリストは区分的線形である関数を形成する。

![](http://scikit-learn.org/0.18/_images/sphx_glr_plot_isotonic_regression_0011.png)

----

[scikit-learn 0.18 ユーザーガイド 1. 教師付き学習](http://qiita.com/nazoking@github/items/267f2371757516f8c168#1-%E6%95%99%E5%B8%AB%E4%BB%98%E3%81%8D%E5%AD%A6%E7%BF%92) より

©2010 - 2016、scikit-learn developers（BSDライセンス）。
【翻訳】scikit-learn 0.18 User Guide 4.8. 予測対象（y） を変換する

http://scikit-learn.org/0.18/modules/preprocessing_targets.html を google 翻訳した。
[scikit-learn 0.18 ユーザーガイド 4. データセット変換](http://qiita.com/nazoking@github/items/267f2371757516f8c168#4-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E5%A4%89%E6%8F%9B) より

-----

# 4.8. 予測対象（y） を変換する

## 4.8.1. ラベルの二値化

[LabelBinarizer](http://scikit-learn.org/0.18/modules/generated/sklearn.preprocessing.LabelBinarizer.html#sklearn.preprocessing.LabelBinarizer) は、マルチクラスラベルのリストからラベルインジケータ行列を作成するのに役立つユーティリティクラスです:

```pycon
>>> from sklearn import preprocessing
>>> lb = preprocessing.LabelBinarizer()
>>> lb.fit([1, 2, 6, 4, 2])
LabelBinarizer(neg_label=0, pos_label=1, sparse_output=False)
>>> lb.classes_
array([1, 2, 4, 6])
>>> lb.transform([1, 6])
array([[1, 0, 0, 0],
       [0, 0, 0, 1]])
```

インスタンスごとに複数のラベルを使用する場合は、 [MultiLabelBinarizer](http://scikit-learn.org/0.18/modules/generated/sklearn.preprocessing.MultiLabelBinarizer.html#sklearn.preprocessing.MultiLabelBinarizer) を使用します。

```pycon
>>> lb = preprocessing.MultiLabelBinarizer()
>>> lb.fit_transform([(1, 2), (3,)])
array([[1, 1, 0],
       [0, 0, 1]])
>>> lb.classes_
array([1, 2, 3])
```

## 4.8.2. ラベルのエンコーディング

[LabelEncoder](http://scikit-learn.org/0.18/modules/generated/sklearn.preprocessing.LabelEncoder.html#sklearn.preprocessing.LabelEncoder) は、 0 と n_classes-1 の間の値のみを含むようにラベルを正規化するためのユーティリティクラスです。 これは時には効率的なCythonルーチンを書くのに便利です。 LabelEncoderは次のように使用できます：

```pycon
>>> from sklearn import preprocessing
>>> le = preprocessing.LabelEncoder()
>>> le.fit([1, 2, 2, 6])
LabelEncoder()
>>> le.classes_
array([1, 2, 6])
>>> le.transform([1, 1, 2, 6])
array([0, 0, 1, 2])
>>> le.inverse_transform([0, 0, 1, 2])
array([1, 1, 2, 6])
```

非数値ラベルを数値ラベルに変換するためにも使用できます（ハッシュ可能で比較可能な場合）。

```pycon
>>> le = preprocessing.LabelEncoder()
>>> le.fit(["paris", "paris", "tokyo", "amsterdam"])
LabelEncoder()
>>> list(le.classes_)
['amsterdam', 'paris', 'tokyo']
>>> le.transform(["tokyo", "tokyo", "paris"])
array([2, 2, 1])
>>> list(le.inverse_transform([2, 2, 1]))
['tokyo', 'tokyo', 'paris']
```

----

[scikit-learn 0.18 ユーザーガイド 4. データセット変換](http://qiita.com/nazoking@github/items/267f2371757516f8c168#4-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E5%A4%89%E6%8F%9B) より

©2010 - 2016、scikit-learn developers（BSDライセンス）。
Webページの背景画像の読み込みの遅延を抑制しよう

# はじめに

通常CSSファイルと，画像ファイル（png，jpg，gif等)は別々に用意したものを参照します。これらは個々の通信が発生するため画面に表示する画像の表示が遅いと感じることが少なくありません。

画像ファイルの読み込み回数を減らすことで性能の向上を狙うのであればCSSスプライトを採用する手もありますが，以下をすべて満たすような場合は本ページを参考にしていただいた方がいいかもしれません。

- 画面の背景に画像ファイルを使ってる。
- 画面遷移前と後が同じレイアウトである。
- 画面遷移時に一瞬画面が消えるのを避けたい。

業務アプリケーションの画面でよくあるパターンだと思います。

# 方法

background-imageプロパティのurl関数の引数を data URL scheme で指定します。
data URL scheme は次のように指定します。

    data:[<mediatype>][;base64],<data>

- &lt;mediatype&gt;はメディアタイプを指定。pngファイルならimage/png，jpgファイルならimage/jpg，gifファイルならimage/gifとする。
- &lt;data&gt;はBase64符号化したテキストデータ。

### バイナリーファイルをBase64符号化する方法

ターミナルを起動して，base64コマンドを実行します。

```bash
$ base64 myfile.png
```

Cygwinから実行する場合は -w 0 オプションを指定してください。

```bash
$ base64 -w 0 myfile.png 
```

### 例

```css
.myselector {
  background-image: url("data:image/png;base64,SGVsbG8gV29ybGQuCg==");
}
```

# メリット

- CSSファイルの読み込みと同時に画像が読み込まれるイメージで使用できるため，描画のちらつきを押さえることができる。

# デメリット

- Base64符号化したデータのサイズがバイナリーに比べて約33%増加する。
- 画像に変更を加える度にBase64符号化が必要になるため，保守運用性が低下する。

# 注意

- 保守運用性が低下するためまずは業務アプリケーションを提供して，エンドユーザーに使ってもらってどう感じるかによって data URL scheme の適用の検討をしていただくことがオススメ。
- 読み込むCSSファイルを指定するlinkタグはheadタグ内に配置すること。
- CSSスプライトを併用するメリットはない。

# 参考情報

- [RFC2397 The "data" URL scheme](https://tools.ietf.org/html/rfc2397)
CoreOSのメモリ不足解消のためにswap領域を設定する

# CoreOSのメモリ不足解消のためにswap設定をする
VPSでCoreOSを動かしているとわりとすぐメモリ不足に陥ります。
その解決策のひとつとしてswapを設定する手順メモ。

## swapファイルの作成と有効化
1. swapファイルの作成
    ここでは1024MBのファイルを作成します。

    ```
    # dd if=/dev/zero of=/swapfile bs=1M count=1024
    ```
1. mkswapでスワップ領域を作成

    ```
    # mkswap /swapfile
    ```
1. swaponでスワップ領域を有効にする

    ```
    # swapon /swapfile
    ``` 

## systemdのサービスとして追加
1. 下記の内容でファイルを作成

    ```/etc/systemd/system/swap.service
    [Unit]
    Description=Turn on swap
    
    [Service]
Type=oneshot
Environment="SWAPFILE=/swapfile"
RemainAfterExit=true
ExecStartPre=/usr/sbin/losetup -f ${SWAPFILE}
ExecStart=/usr/bin/sh -c "/sbin/swapon $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"
ExecStop=/usr/bin/sh -c "/sbin/swapoff $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"
ExecStopPost=/usr/bin/sh -c "/usr/sbin/losetup -d $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"

    [Install]
WantedBy=multi-user.target
    ```

1. サービスの有効化

    ```
# systemctl enable --now /etc/systemd/system/swap.service
    ```

## 確認
下記コマンドで追加されていることを確認

```
# free -h
             total       used       free     shared    buffers     cached
Mem:          2.0G       1.9G       100M        66M        23M       264M
-/+ buffers/cache:       1.6G       388M
Swap:         1.0G       308M       715M

```
Swap:の項目があればOKです。

## 参考サイト
* [CoreOSでswapを追加する](http://qiita.com/ikaro1192/items/c6c2104970842b4a4428)

* [AmazonAWSで、MySQL がよく落ちる？ そんな時はSWAP領域をチェック！](http://qiita.com/madaran0805/items/ae0532a7436e1c684e72)

* [Adding swap in CoreOS Container Linux](https://coreos.com/os/docs/latest/adding-swap.html)
ggplot2でRug Plotを加える

ggplot2でRug Plotを加える
================

まだ試してなかったのでメモ。

rug plotとは
------------

2次元で描写したplotを，1次元へ簡便に周辺化したもの，みたいな感じです。例えば，

``` r
library(ggplot2)

df <- data.frame(
  x <- rnorm(100, 5, 1),
  y <- rnorm(100, 5, 1),
  type <- sample(LETTERS[1:2], 100, replace = TRUE)
)

g <- ggplot(df, aes(x, y)) +
  geom_point()
g
```

![unnamed-chunk-1-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/a08face7-d724-5953-8e7a-ac16ae5c862f.png)

というよくある散布図に，`geom_rug()`を加えるとこんな感じになります:

``` r
g + geom_rug()
```

![unnamed-chunk-2-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/8af760a6-9246-5352-7794-3f28870cefdb.png)


詳しい解説・使い方は，ggplot2の公式ドキュメントを参照してください:

[Rug plots in the margins — geom\_rug • ggplot2](http://ggplot2.tidyverse.org/reference/geom_rug.html)


色々試してみる
--------------

ちょっといじってみます。

### rugの配置

`side=`で設定し，`"trbl"`の文字列の組み合わせで指定します。tがTop，rがRightという感じで，表示させたい文字列を準備して指定します:

``` r
g + geom_rug(sides = "trb")
```

![unnamed-chunk-3-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/71727bd6-63ee-e0e9-af24-c27fc648a5b4.png)

### 色・透明度の指定

あんまり使えるかどうかは微妙ですが，色の指定もできます:

``` r
g + geom_rug(aes(color = type))
```

![unnamed-chunk-4-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/07fc2d62-547d-d5d2-455f-e0099ddc580c.png)

あと，透明度(alpha)もできます:

``` r
g + geom_rug(alpha = 0.2)
```

![unnamed-chunk-5-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/17e33751-a37a-3a34-f1e9-e83fda97b3e7.png)

これら以外にもいくつかありますが省略します。気になったら調べてみてください。

使いドコロと留意点
------------------

このような散布図などで，周辺化したものをぱぱっと出したい時にはちょうどいいと思います。でも，データセットが大きい場合，正直あまり意味がないでしょう。

**Enjoy!**
Dockerでsupervisorctlを使おうとしたら「unix:///var/run/supervisor.sock refused connection」となる

もともとsupervisordを使っていたDockerコンテナを、新しいサーバに移行したらsupervisorctlが使えなくなった...

「docker exec -it hoge supervisorctl status」を実行すると

```
unix:///var/run/supervisor.sock refused connection
```
と出る！
(supervisordは起動しているようだが、supervisorctlが使えないので、supervisordを使って稼働させているプロセスの停止などができなくなっている...)

正常に稼働していたDocker、supervisordのバージョンは以下

>Docker : 1.9.1, build a34a1d5
>supervisord : 3.0

上記のエラーが発生したDocker、supervisordのバージョンは以下
>Docker : 1.9.1, build a34a1d5
>supervisord : 3.0

`unix:///var/run/supervisor.sock refused connection`が発生するバージョンは
>Docker : 17.03.1-ce, build c6d412e
>supervisord : 3.0 (変えてない)

## 試したこと

調べつつ以下を試した

### Docker起動時、tmpfsオプションを指定する

```
--tmpfs /var/run/
```

Docker起動時オプションで上記を設定してみた → エラー解消せず...

### unixソケットではなくinetソケットを使ってみる

supervisord.conf を以下の感じで修正してみた

```
[inet_http_server]
port=127.0.0.1:9001
	
[supervisorctl]
serverurl=http://127.0.0.1:9001
```

→ エラー解消せず...

### supervisordの設定の「/var/run」を「/dev/shm」 に変更する

こんな感じでconfファイルの全ての記載を/dev/shmに変更
```
sed -i "s/\/var\/run/\/dev\/shm/g" /etc/supervisor/supervisord.conf
```
→ supervisorctl使えるようになりました

```
docker exec -it hoge supervisorctl status
cron                          RUNNING    pid 9, uptime 0:05:12
laravelqueue:hogequeue        RUNNING    pid 78, uptime 0:00:09
php-fpm                       RUNNING    pid 10, uptime 0:05:12
```

## 参考

- [Overlayfs does not work with unix domain sockets](https://github.com/moby/moby/issues/12080)
- [[クラウド]Dockerコンテナ上でsupervisorctlが上手く動作しないことがある](http://d.hatena.ne.jp/sekom/20150523/p1)
- [Supervisor socket error issue](https://stackoverflow.com/questions/18859063/supervisor-socket-error-issue)
keybaseを使って暗号化通信を行う

* [keybase](https://keybase.io/)
![スクリーンショット 2017-06-28 18.46.02.png](https://qiita-image-store.s3.amazonaws.com/0/58788/abe8869d-a577-7db7-8aa1-f93e89ae8524.png "スクリーンショット 2017-06-28 18.46.02.png")



# 目的
* 特定のユーザと暗号化された通信でファイルのやり取りを行う

# 概要

* 作成するアカウントはSNSのアカウントと関連付けされていて、ユーザの身元が確かであることがある程度保証される仕組み

# 設定
* アプリケーションをインストールする
	* かわいい...!

![スクリーンショット 2017-06-28 18.41.55.png](https://qiita-image-store.s3.amazonaws.com/0/58788/0744f544-d089-18df-4c5d-cd3dc08c3f1d.png "スクリーンショット 2017-06-28 18.41.55.png")


* Twitterアカウントを使用

![スクリーンショット 2017-06-28 11.04.31.png](https://qiita-image-store.s3.amazonaws.com/0/58788/e79c7686-a3db-df42-8412-8446d1a9e22c.png "スクリーンショット 2017-06-28 11.04.31.png")

* Twitterアカウントの検索
![スクリーンショット 2017-06-28 11.04.57.png](https://qiita-image-store.s3.amazonaws.com/0/58788/bb47ce81-33b3-1e64-3362-20883b0f307e.png "スクリーンショット 2017-06-28 11.04.57.png")

* 認証のためのTweet
![スクリーンショット 2017-06-28 11.05.23.png](https://qiita-image-store.s3.amazonaws.com/0/58788/de2d2b73-a991-e9e9-c51b-21af6932271e.png "スクリーンショット 2017-06-28 11.05.23.png")

* 正常にTweetされると認証完了
![スクリーンショット 2017-06-28 11.11.12.png](https://qiita-image-store.s3.amazonaws.com/0/58788/2dec8f19-3889-0a20-98e5-768a25529d93.png "スクリーンショット 2017-06-28 11.11.12.png")
* Githubやその他のサービスも同様に承認作業が必要
![スクリーンショット 2017-06-28 11.11.23.png](https://qiita-image-store.s3.amazonaws.com/0/58788/236e5dd3-817d-17be-29e5-f2206b6536c5.png "スクリーンショット 2017-06-28 11.11.23.png")

# 暗号化
* 通知する相手を選択
![スクリーンショット 2017-06-28 18.49.17.png](https://qiita-image-store.s3.amazonaws.com/0/58788/f6638492-eb99-d34e-8032-0de001c92507.png "スクリーンショット 2017-06-28 18.49.17.png")

* Encrypt
![スクリーンショット 2017-06-28 18.52.10.png](https://qiita-image-store.s3.amazonaws.com/0/58788/dfaf8ea6-ddcb-db15-1ac5-65fa21d10bb8.png "スクリーンショット 2017-06-28 18.52.10.png")

* Decrypt
![スクリーンショット 2017-06-28 18.54.33.png](https://qiita-image-store.s3.amazonaws.com/0/58788/505295f9-d27e-aff0-a487-29c114045e16.png "スクリーンショット 2017-06-28 18.54.33.png")
* 
![スクリーンショット 2017-06-28 18.55.24.png](https://qiita-image-store.s3.amazonaws.com/0/58788/1dadc33a-f85c-ac2f-1dc8-51d54ac1a9eb.png "スクリーンショット 2017-06-28 18.55.24.png")

# その他
* チャット機能があるので、そこでのやり取りはファイルを含め、全て暗号化される。素敵です！
Warning: You need to have Ruby and Sass installed and in your PATH for this task to work. More info: https://github.com/gruntjs/grunt-contrib-sass Use --force to continue.

You need to install Ruby and Sass as:

For Ruby use command

sudo apt-get install ruby-full

And for Sass use command

sudo gem install sass

ruby2.0 package is installed
sudo apt-get install ruby2.0 ruby2.0-dev
S3 x goofys で "socket: too many open files#012" 

goofys を利用して S3 サーバをマウントして運用しているサーバにてある日突然エラーとなり、マウント失敗するようになった。 それに伴いシステム上からはS3上のファイルを閲覧できなくなってしまいました。


```:/var/log/messages
Jun 28 16:19:03 ip-10-0-0-12 /usr/local/bin/goofys[4007]: s3.ERROR code=RequestError msg=send request failed, err=Head https://s3-ap-northeast-1.amazonaws.com/pcloud/members: dial tcp: lookup s3-ap-northeast-1.amazonaws.com on 10.0.0.2:53: dial udp 10.0.0.2:53: socket: too many open files#012
Jun 28 16:19:06 ip-10-0-0-12 /usr/local/bin/goofys[4007]: s3.ERROR code=RequestError msg=send request failed, err=Get https://s3-ap-northeast-1.amazonaws.com/pcloud?delimiter=%2F&max-keys=1&prefix=hoge%2Ffuga%2Fpiyo%2FJBSM2YQ14P%2Fpdf%2F20170628%2FSKM_C364e16110812232.pdf%2F: dial tcp: lookup s3-ap-northeast-1.amazonaws.com on 10.0.0.2:53: dial udp 10.0.0.2:53: socket: too many open files#012
```
調べたところ
> プロセスが開けるファイルディスクリプタの上限に達してしまうと発生するエラー

という事が判明しました。今回はAWSのS3との接点となっている**goofys**のプロセスのファイルディスクリプタの上限値を超えてしまったものだと思われます。

## システムのファイルディスクリプタ上限値を確認する
```
$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15205
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024      ## ここがファイルディスクリプタ上限値
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
```
1024 が上限値のようだ。システム上からこの数値を上回るアクセスが発生したのだろうか。

## 制限値を上げる
```:/etc/security/limits.conf
# 以下ファイル末尾にでも追記

* soft nofile 65536
* hard nofile 65536
```
参考サイト等あわせて**65536**に設定。（今までの64倍）

## goofysプロセスのファイルディスクリプタ上限値を確認
```:/proc/(goofysプロセスID)/limits
Limit                     Soft Limit           Hard Limit           Units     

省略

Max open files            1024                 4096                 files     
```
1024 のまま変更されていない。

> limits.conf は PAM 認証のモジュールである pam_limits.so の設定ファイルで、ログインの際に読み込まれるファイルです。

という事なので goofys に適用させる為に**一度S3をアンマウントしてから再度 goofys コマンドにて接続を試みみます。**

```:アンマウント
$ sudo kill -9 (goofysプロセスID)
$ sudo umount /your/goofys/mount/dir
```

```:マウント
$ sudo /usr/local/bin/goofys hoge /your/goofys/mount/dir/ -o rw,allow_other,--uid=48,--gid=100,--dir-mode=0775
```
## goofys プロセスのファイルディスクリプタ上限値を確認
```:/proc/(goofysプロセスID)/limits
Limit                     Soft Limit           Hard Limit           Units

省略

Max open files            65536                65536                files     
```
無事に**65536**に変更されている事が確認できました。

# 参考
- [Linux サーバでの「Too many open files」対策について](http://d.hatena.ne.jp/akishin999/20130213/1360711554)
AWS体験ハンズオンまとめ

+ [1つのパブリックサブネットを持つVPC]を作成

+ サブネットを追加作成
> パブリックサブネット
 プライベートサブネット
 プライベートサブネット

+ パブリックサブネットのルートテーブルを変更
+ EC2インスタンスの作成
> セキュリティグループ（ファイアウォール）を設定
+ Elastic IPの割り当て
+ WordPressのセットアップ
+ RDSセキュリティグループを作成
+ DBサブネットグループを作成
+ RDSインスタンスを作成
+ WebサーバのAMIを作成
+ ELBを作成
> ELB用のセキュリティグループを新規に作
> WebサーバにはELBからのみアクセスを許可するよう、セキュリティグループを
変更
+ RDSをMulti-AZ構成に変更
デフォルト値としてキー自身を返すハッシュ

恒等写像とも言えるだろうか。

```.rb
#初期化時にデフォルト値を定義する
hash = Hash.new{|h, k| h[k] = k}

#初期化時以外にデフォルト値のブロックを設定する場合
hash.default_proc = ->(h, k){h[k] = k}

p hash[1]
=> 1

p hash[:a]
=> :a
```

### 応用

上のままだとほとんど何もしないハッシュになるが、「特定の値のみ変換して残りの値は変換しないハッシュ」などといったものが定義できる。

```.rb
old_departments = ["機械工学科", "電気工学科", "電子制御工学科", "工業化学科"]
rename = {
      "電気工学科" => "電気電子工学科",
      "工業化学科" => "物質工学科"
  }
rename.default_proc = ->(h, k){ h[k] = k }
p new_departments = old_departments.map{|f| rename[f] }
=> ["機械工学科", "電気電子工学科", "電子制御工学科", "物質工学科"]
```

規則性のない大量のキーをベタで変換するような場合には簡潔に書けると思う。
ただ書いていてswitch使ったほうがよくねとも思い始めてきた。小ネタとして。
自己学習メモ_API

作成したい：LINEのテヒョンbot
韓国でしか握手会をやらないなら、毎日会えるようにすればよいのでは？から
始めたのでモチベーションはまぁまぁ。

▼済
LINEのbot用にアカウント作成⇒OK
(Google DriveをWebサーバーとして使用。Google Apps Scriptで記述)
docomoAPI連携で会話可能にする⇒OK
Microsoft Translator Text API連携でdocomoAPIから返された返事を韓国語に変換⇒OK
YoutubeAPIで「○○歌って」で○○を検索し、評価高い動画探す⇒OK

▼やりたいこと
~~１．「韓国語話して」~~
~~翻訳API~~
~~docomoAPIで受け取った返事を翻訳し、それを返事として返す~~
~~⇒Microsoft Translator API(30日で無料期間終わる？)~~
「韓国語でお話しよ」⇒その後の会話を韓国語にする
※問題：韓国語でお話しよ、でフラグ立ててもキープできていない。jaに戻ってる。
（言語のパターンは増やすかどうかびみょう）
「さっきの意味なに？」⇒日本語で表示

２．「歌って」
~~youtubeAPI~~
~~BTSの動画を探してくる~~
https://developers.google.com/youtube/v3/docs/search/list?hl=ja
~~⇒「"○○"歌って」で○○を検索してBTS以外も聴きたい~~
or　音楽App起動(バックグラウンド再生したらいいな)
http://blog.thetheorier.com/entry/defoappurlscheme-ios10

３．「"○○"検索して」
Google検索の結果を返す


４．「お腹空いた」
ぐるなびAPI
あんまりいらないかも
APIの利用期間は90日？(期限が切れる30日前から延長可)

５．定期的にテヒョナからメッセージを送る
LINE notifyを使用すればいい？

６．現在位置送信
Google Maps JavaScript API使用
UrlShorterを使用して、短縮URLを作成
短縮URLを設定して返せばOKと思われる

=============================================================
もらった案
７．Google Calendar連携
http://libro.tuyano.com/index3?id=660002

８．Google Docs連携

http://ailaby.com/docomo_talk/
http://dotinstall.com/lessons/basic_google_apps_script


https://nijipi.com/it-news/post-938/
Custom PropTypes Validator


prop-typesが提供しているものでも十分だが、もっと細かいTypecheckingが必要な場合がある。
custom validatorを作ってみよう。

## custom validatorを作るための原則

* validatorはpropertyのリスト、検証したいproperty名、コンポーネント名を引数として持つ関数だ。
* validatorは検証したpropertyが有効な場合は何も返さないが、間違った場合はErrorのインスタンスを返さなければならない。

## 今度作りたいcustom validatorは

propertyが必須で、値が文字列である。
文字列の長さは80文字以内でなければならない。

```javascript
const customPropType = (props, propName, componentName) => {
  if (props[propName]) {
    const value = props[propName];
    if (typeof value !== 'string' || value.lenght > 80) {
      return new Error(
        `${propName} in ${componentName} is longer than 80 characters`,
      )
    }
  }
};
```

動作には問題ないが、eslintエラーが出る。

```vim
propType "title" is not required, but has no corresponding defaultProp declaration. (react/require-default-props)
```

そもそも検証の対象になるpropertyは必須だった。
isRequiredを付けるか、defaultPropで指定しないと解決できない。
isRequiredを付けると、eslintエラーは消えたが、browserのほうでエラーが表示された。
custom validatorを作る場合は、isRequiredについても別途に実装しなければならないようだ。
Reactのガイドにはcustom validatorについて上記のような一般的な例を紹介しているだけで、isRequiredは言及されてない。

同じ悩みを持っている人はどこにもいる。
案外に重要な話だ。すぐ解決できない場合はぐぐってみよう。
ぐぐっても解決できない場合は、githubのissuesやwikiとかで探してみよう。（stackoverflowよりマシだ。）
次はreactのgithub issuesから見つけたものだ。
結構よかったので、紹介する。

* https://github.com/facebook/react/issues/9125

```javascript
// This is a factory function (also called a higher-order function)
function createCustomPropType(isRequired) {
  // The factory returns a custom prop type
  return function(props, propName, componentName) {
    const prop = props[propName];
    if (prop == null) {
      // Prop is missing
      if (isRequired) {
        // Prop is required but wasn't specified. Throw an error.
        throw new Error();
      }
      // Prop is optional. Do nothing.
    } else {
      // Put your validation logic here...
    }
  }
}

// Using the factory, create two different versions of your prop type
const customPropType = createCustomPropType(false);
customPropType.isRequired = createCustomPropType(true);

// Now this will work:
MyComponent.propTypes = {
  optional: customPropType,
  required: customPropType.isRequired,
};
```

custom validatorとして、factory functionを作っている。
propertyが必須なので、optionalは意味がない。
注目するのはrequiredのところだ。
早速、必要なvalidationを入れて確認した。
動作には問題ない。
しかし、いくつかeslintエラーが出たので次のように修正した。

```javascript
function createCustomPropType(isRequired) {
  return (props, propName, componentName) => {
    const prop = props[propName];
    if (prop == null) {
      if (isRequired) {
        return new Error(
          `The prop \`${propName}\` is marked as required in \`${componentName}\`, but its value is \`undefined\`.`,
        );
      }
    } else if (typeof prop !== 'string' || prop.length > 80) {
      return new Error(
        `${propName} in ${componentName} is longer than 80 characters`,
      );
    }
    return null;
  };
}

const customPropType = createCustomPropType(false);
customPropType.isRequired = createCustomPropType(true);

MyComponent.propTypes = {
  required: customPropType.isRequired,
};
```

検証しているpropertyが文字列ではない場合、そして文字列の長さが80を超えるとbrowserでエラーが表示される。
isRequiredを付けた場合は、該当propertyが存在しないとbrowserでエラーが表示される。
かなりいい感じ〜\:+1:
ターミナルからECHONET Lite家電を制御する

#概要
macOSのターミナルからECHONET Lite家電を制御する

#環境
macOS : macOS Sierra (version: 10.12.5)

対象家電：空気清浄機

#実行コマンド
以下を実行することで空気清浄機をONにする

```bash
$ echo "0x10,0x81,0x00,0x00,0x05,0xFF,0x01,0x01,0x35,0x01,0x61,0x01,0x80,0x01,0x30" | xxd -p -r | nc -u 192.168.2.166 3610
```

※　192.168.2.166は空気清浄機のIPアドレスにする
Mobile Native Popupを使ってみた

## UnityPlayerでネイティブなダイアログを出すために。
幾つか有料無料のアセットがあるのですが、なんとなくこれをチョイス。
Unity 5での動作が不明なままなのがちょっと怖いですが、Assetストアにて評価・人気ともに高いため思い切ってみました（5.6.1f1で動作確認済）。
ひとまずiOSのみ動作確認し、手軽に使える感じでしたので、記事にしてみました。
いずれAndroidもやる予定です。

## 導入
ダウンロードページは[ここ](https://www.assetstore.unity3d.com/jp/#!/content/18479)です。
無料アセットなので普通に選んでインストールしてしまえばOKです。

```
using TheNextFlow.UnityPlugins;
```
必要なusing文はこれだけです。

## 関数
iOS/Android共用のクラス MobileNativePopups と、iOS専用のクラス IosNativePopups 、Android専用のクラス AndroidNativePopups の三つがあり、それら全てに OpenAlertDialog関数があります。
AndroidNativePopupsクラスのみ、他にも関数があるようです。

```
  // １ボタンのダイアログ　
  public static void OpenAlertDialog(
    string title,    // タイトル部分の文字列
    string message,  // 本文の文字列
    string cancel,   // ボタンの文字列
    Action onCancel  // ボタン押下後のコールバック
  );
```
ラムダ式で書けるのでちょっとした事で出すときも楽かと。サンプルから抜粋。

```
  MobileNativePopups.OpenAlertDialog(
    "Hello!",
    "Welcome to Mobile Native Popups",
    "Cancel",
    () => { Debug.Log("Cancel was pressed"); }
  );
```
MobileNativePopupsクラスの残り二つもとても単純です。引数が増えていくだけなので特に何も考えなくても問題無いかと思います。

```
  // ２ボタン
  public static void OpenAlertDialog(
    string title,
    string message,
    string ok,
    string cancel,
    Action onOk,
    Action onCancel
  );

  // ３ボタン
  public static void OpenAlertDialog(
    string title,
    string message,
    string ok,
    string neutral,
    string cancel,
    Action onOk,
    Action onNeutral,
    Action onCancel
  );
```
iOS専用で、４ボタン以上の処理も可能です。

```
public static void OpenAlertDialog(
  string title,
  string message,
  string[] button_name,
  CompletionHandler completion
);
```
使用するときはクラス名が違うのでご注意。
サンプルでは下記の様に記述していました。

```
#if UNITY_IOS
  IosNativePopups.OpenAlertDialog(
    "Hello!", 
    "Welcome to Mobile Native Popups",
    "Cancel",
    new String[] {
      "First Button",
      "Second Button",
      "Third Button"
    },
    ( buttonIndex ) => {
      switch ( buttonIndex ) {
        case 0:
          Debug.Log( "Cancel was pressed" );
          break;
        case 1:
          Debug.Log( "First button was pressed" );
          break;
        case 2:
          Debug.Log( "Second button was pressed" );
          break;
        default:
          Debug.Log( "Third button was pressed" );
          break;
      }
    }
  );
#endif
```