OmniAICreator/Qiita-1.07M huggingface dataset:
mongodumpとmongorestoreを使ったRocket.Chatのバックアップとリストア

対象 : Ubuntu Server 16.04.1 LTS上にsnapでインストールしたRocket.Chat

~~[本家のドキュメント](https://rocket.chat/docs/installation/manual-installation/ubuntu/snaps)には`/var/snap/rocketchat-server/common`のバックアップ方法が記載されていますが、~~ ファイルアップロードとCustom Emoji Filesystemのファイル保存先ストレージ種類が`GridFS`の場合、MongoDBのバックアップで可能なようです。
今のところ問題なくバックアップ＆リストアができています。

**2017/05/19 追記**
[本家のドキュメント](https://rocket.chat/docs/installation/manual-installation/ubuntu/snaps)が更新されており、 `sudo snap run rocketchat-server.backupdb` でバックアップが可能になりましたが、これを使用する場合、 `sudo` が必要です。また、[このコマンドの中身](https://github.com/RocketChat/Rocket.Chat/blob/develop/.snapcraft/resources/rcbackup#L5)では本記事と同様に mongodump を使用してバックアップしているようです。
**2018/06/14 追記**
リストアも `sudo snap run rocketchat-server.restoredb` コマンドがありますが、[本家コマンド](https://github.com/RocketChat/Rocket.Chat/blob/develop/.snapcraft/resources/restoredb#L62)は `--noIndexRestore` オプションが付いているのに今日気づきました。

本家に記載されている方法でのリストアで、アプリとDBでバージョンが異なる場合、どのように動作するか未確認です。
以下に記載する方法では新しいバージョンのRocket.Chatに古いバージョンのDBをリストアした場合、Rocket.Chat起動時にDBマイグレーションが行われます。その場合、Rocket.Chat管理メニューの`ログ表示`にログが出力されます。
Rocket.Chatは頻繁にバージョンが上がっているので、私はこの方法でバックアップ＆リストアを行っています。

以下、MongoDBがデフォルトで外部からの接続ができないため、Rocket.Chatインストールサーバー上での作業となります。

## mongodb-org-toolsのインストール

**2017/05/19 追記**
**内蔵の mongodump, mongorestore を使用できたので、インストール不要です。**

mongodump, mongorestoreを使用するためにインストールします。
参考：https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-ubuntu/

```sh
# 公開鍵インポート
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
# リストファイル作成
echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
sudo apt-get update
# インストール
sudo apt-get install mongodb-org-tools
```

## バックアップ
※以下では一応サービス停止していますが、私の運用環境ではサービスを止めず、深夜人のアクセスがなさそうな所で実行しています。
**2018/06/14 追記**
[本家のドキュメント](https://rocket.chat/docs/installation/manual-installation/ubuntu/snaps/#how-do-i-backup-my-snap-data)に記載されている手順ではサービス止めてました。

Rocket.Chatサービス停止

    sudo systemctl stop snap.rocketchat-server.rocketchat-server.service

バックアップ

```sh
mongodump -d parties

# 内蔵mongodumpを使用する際は以下（2017/05/19 追記）
/snap/rocketchat-server/current/bin/mongodump -d parties
```

カレントディレクトリに`dump/parties`ができます。
出力場所を指定したい場合、`-o`でディレクトリを指定してください。
参考：https://docs.mongodb.com/v3.2/reference/program/mongodump/#options

Rocket.Chatサービス開始

    sudo systemctl start snap.rocketchat-server.rocketchat-server.service

## リストア
Rocket.Chatサービス停止

    sudo systemctl stop snap.rocketchat-server.rocketchat-server.service

リストア

```sh
mongorestore -d parties /path-to-dump-directory/dump/parties/ --drop

# 内蔵mongorestoreを使用する際は以下（2017/05/19 追記）
/snap/rocketchat-server/current/bin/mongorestore -d parties /path-to-dump-directory/dump/parties/ --drop

```

参考：https://docs.mongodb.com/v3.2/reference/program/mongorestore/#options

Rocket.Chatサービス開始

    sudo systemctl start snap.rocketchat-server.rocketchat-server.service

サービス開始後、Rocket.Chat管理メニューの`ログ表示`を見て、問題がないことを確認します。
The Misuse of Android Unix Domain Sockets and Security Implications


[The Misuse of Android Unix Domain Sockets and Security Implications](http://dl.acm.org/citation.cfm?doid=2976749.2978297)
Shao et al. CCS'16

# Introduction

Besides Android-specific IPC mechanisms, i.e.,  Intents, Binder and Messenger, traditional/native Linux IPCs, such as signals, Netlink sockets, and Unix domain sockets, are heavily used by native layer of the Android runtime.

> Exposed Linux IPC channels, if not properly protected, could be abused by adversaries to exploit vulnerabilities within privileged system daemons and the kernel.

> In addition to the Android system, apps also have access to the Linux IPCs implemented within Android. Among them, Unix domain sockets are the only one apps can easily make use of: signals are not capable of carrying data and not suitable for bidirectional communications; Netlink sockets are geared for communications across the kernel space and the user space.

Android SDK provides Java APIs for using Unix domain sockets. Meanwhile, NDK provides native APIs for accessing low-level Linux features, including Unix domain sockets. Developers use Unix domain sockets to communicate with native processes/threads from apps since Android IPCs do not support that.

> SInspector first identifies ones that use Unix domain sockets based on API signatures and permissions. SInspector then filters out apps that use Unix domain sockets seccurely and thus are not vulnerable. We develop several techniques to achieve this, such as socket address analysis and authentication check detection. For system daemons, SInspector collects runtime information to assist static analysis. SInspector reports potentially vulnerable apps and system daemons for manual examination.

# Background

Android apps are isolated and run in their own processes. However, Unix domain sockets cannot achieve the same guarantees as Android IPCs.

> In particular, according to our analysis, Android APIs for using Unix domain sockets expose unprotected socket channels by default.

## Unix Domain Sockets

> A Unix domain socket is a data communications endpoint for exchanging data between processes executing within the same host operating system.

> Unix domain sockets differ from Internet sockets in that (1) rather than using an underlying network protocol, all communication occurs entirely within the operating system kernel; and (2) servers listen on addresses in Unix domain socket namespaces, instead of IP addresses with port numbers.

Android framework provides both Java and native APIs for Unix domain sockets. By default, these APIs use ABSTRACT namespace, which is less secure yet more reliable than FILESYSTEM sockets.

> All Unix domain socket addresses are publicly accessible from file `/proc/net/unix/`.
ラズパイでシステムの状況をツイッターにつぶやこう (1)

## 作った理由
最近なんでもツイッターにつぶやくのが癖になってるので、じゃあ宅鯖のラズパイの状況つぶやいたらいいんじゃね？ってなった。

## 具体的な動作
Linux（ラズパイ）のCPU使用率、本体温度、プロセス数、メモリ使用量をツイッターでつぶやく

## じゃあ実際のコード
説明するのも無意味ですし、とりあえずぱぱっと作ったシェルスクリプトをどうぞ

```bash:test.sh
cpu=`vmstat|tail -n1|sed 's/[\t ]\+/\n/g'|tail -n5|head -n2|sed -e ':loop; N; $!b loop; ;s/\n/+/g'|bc`
total=`cat /proc/meminfo |/bin/grep "MemTotal"|/bin/grep -o -e '[0-9]'|sed -e ':loop; N; $!b loop; ;s/\n//g'`
free=`free|head -n3|tail -n1|/bin/grep -o -e '[0-9]*$'`
temp=`cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2`
disk=`df -h -t ext4|/bin/grep -o '\([0-9]\)%'|sed -e 's/%//g'`
ps=`ps ax|/bin/grep -v 'VSZ|grep'|wc -l`

```
システム情報の見方を検索しながら、無理やり変数にぶち込んでます。僕は~~**変態**~~ワンライナーなのでsed,grep,head,tailを無双してます。もちろんコピペじゃなくて僕が考えましたよ。

とりあえずここまで来たのでツイート部分は明日。

追記：第二回を投稿しました。
http://qiita.com/onokatio/items/466665fcf6b0f2d12aea
Railsチュートリアル内の「テスト内ではcookiesメソッドにシンボルを使用できない」という問題

# はじめに

[Ruby on Rails チュートリアル日本語訳版(第4版)](https://railstutorial.jp/)の第9章にて、「テスト内では `cookies` メソッドにシンボルが使用できない」問題があるとの記述がありました。


> 実はもう１つ地味な問題があります (筆者はこれで何時間も躓いてしまいました...)。テスト内ではcookiesメソッドにシンボルを使用できない、という問題です。そのため、
>
> ```rb
> cookies[:remember_token]
> ```
>
> 上のコードは常にnilになってしまいます。 ありがたいことに、文字列キーならcookiesで使用できるので、
> 
> ```rb
> cookies['remember_token']
> ```
> 
> 上のように書けば期待どおりに値が返されます。
>
> Ruby on Railsチュートリアル日本語訳版第4版 9.3.1 [Remember me] ボックスをテストする より引用
> https://railstutorial.jp/chapters/advanced_login?version=5.0#sec-testing_the_remember_me_box

これがなぜなのか調べてみました。

# cookies メソッドは何者なのか？

## Rails上では何のオブジェクトなのか？

まず、 `web-console` で見てみます。

```diff
class StaticPagesController < ApplicationController

  def home
+   console
  end
```

![web-console.png](https://qiita-image-store.s3.amazonaws.com/0/15187/4a14a45f-3fc8-dd82-0e65-83eaf6f23aa7.png)


`ActionDispatch::Cookies::CookieJar` のインスタンスです。
String、Symbolの両方のキーでvalueにアクセスができます。

## ユニットテスト上では何のオブジェクトなのか？

次に、ユニットテストで `binding.pry` をして調べてみます。

```diff
  test "login with remembering" do
    log_in_as(@user, remember_me: '1')
+   binding.pry
    assert_equal cookies['remember_token'], assigns(:user).remember_token
  end
```

```sh
$ rails test test/integration/users_login_test.rb
Run options: --seed 11138

# Running:


From: test/integration/users_login_test.rb @ line 43 UsersLoginTest#test_login_with_remembering:

    40: test "login with remembering" do
    41:   log_in_as(@user, remember_me: '1')
    42:   binding.pry
 => 43:   assert_equal cookies['remember_token'], assigns(:user).remember_token
    44: end

[1] pry(#<UsersLoginTest>)> cookies.class
=> Rack::Test::CookieJar
[2] pry(#<UsersLoginTest>)> cookies['remember_token']
=> "xosbwurfBfRnYu5Y5XBjpA"
[3] pry(#<UsersLoginTest>)> cookies[:remember_token]
=> nil
```

こちらは `Rack::Test::CookieJar` のインスタンスです。
チュートリアルの通り、Symbolではvalueにアクセスができません。

# ActionDispatch::Cookies::CookieJar を調べる

https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/cookies.rb#L315L317

```rb
def [](name)
  @cookies[name.to_s]
end
```

`[]` メソッドをオーバーライドして、引数 `name` を `to_s`して必ずStringに直すようにすることで
String、Symbol両方でvalueにアクセスできるようになってるんですね。

# Rack::Test::CookieJar を調べる

一方、こちらはどうでしょうか？

https://github.com/brynary/rack-test/blob/master/lib/rack/test/cookie_jar.rb#L108-L112

```rb
def [](name)
  cookies = hash_for(nil)
  # TODO: Should be case insensitive
  cookies[name] && cookies[name].value
end
```

こちらも `[]` メソッドをオーバーライドしてますが、引数 `name` を `to_s` していません。

## まとめ

* railsとrack-testで `[]` メソッドのオーバーライドの仕方が異なるため、使える引数の種類が異なってしまっている。
* rack-testでも、 `name.to_s` とすれば動きそう。
* どっちのやり方が正しいかわからないが、イメージ的にrailsが親切すぎる？

## 感想

* こういう内容こそ、チュートリアル内で深掘りして欲しいと思いました。
GitBucketを使っててコミットコメントにissue番号を入れたのにissueにコミットが紐づかない

GitBucket のバージョンは 4.8

![gitbucket.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/37a3a8cb-6151-f1f9-06ae-f961b0b2c1e2.jpeg)

コミット→issueへのリンクはできてるけど、

![gitbucket.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/b339c7ad-4848-6754-5c12-5b1eeedc3d29.jpeg)

issue→コミットへのリンクができていない。

みたいなことがあって悩んでた。

原因は、 `git config` の `user.email` に設定しているメールアドレスに該当するユーザーが GitBucket 上に存在しないからだった。

コミットをもとに関連する issue にコメントを登録する実装は次のようになっている。

```java:IssuesService.scala
  def createIssueComment(owner: String, repository: String, commit: CommitInfo)(implicit s: Session) = {
    StringUtil.extractIssueId(commit.fullMessage).foreach { issueId =>
      if(getIssue(owner, repository, issueId).isDefined){
        getAccountByMailAddress(commit.committerEmailAddress).foreach { account =>
          createComment(owner, repository, account.userName, issueId.toInt, commit.fullMessage + " " + commit.id, "commit")
        }
      }
    }
  }
```

[GitHub で見る](https://github.com/gitbucket/gitbucket/blob/4.8/src/main/scala/gitbucket/core/service/IssuesService.scala#L434)

一番内側のループで、コミット時のメールアドレスに該当する Gitbucket 上のアカウントでループしている。
`getAccountByMailAddress(commit.committerEmailAddress)`

なので、 `user.email` に設定しているアドレスに該当するユーザーが GitBucket 上に存在しない場合は、ここのループが空振りして issue にコメントが登録されない。

`user.email` を設定しなおした後は、

![gitbucket.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/e9dec8c6-5142-0aa9-6930-b68eb0893491.jpeg)

![gitbucket.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/94ce1eeb-4b61-8137-88d7-70d280ce3bb7.jpeg)

ちゃんと相互に紐づいてる。
GETのプルダウンメニューで選択した項目にselectedをつけたい場合

プルダウンメニューによって表示の切り替えを行う場合、
切り替わった後の画面で同じプルダウンメニューを表示するなら、
選択した項目を選択状態にしてあげるのが適切です。

```index.html
<form id="fileSelectForm" class="fileSelectForm" action="" method="get">
	<select id="file_select" name="file_select">
	<option value="2017_01">2017年01月</option>
	<option value="2016_12">2016年12月</option>
	<option value="2016_11">2016年11月</option>
	<option value="2016_10">2016年10月</option>
	</select>
</form>
```

optionにselectedをつける事で選択状態となりますが、
POSTではなく、GETの場合にはjavascriptで切り替えてあげます。

```index.html
	<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha256-/SIrNqv8h6QGKDuNoLGA4iret+kyesCkHGzVUUV0shc=" crossorigin="anonymous"></script>
	<script>
	/**
	*  GETパラメータを配列にして返す
	*  @return     パラメータのObject
	* http://qiita.com/Evolutor_web/items/c9b940f752883676b35d
	*/
	function getUrlVars(){
		var vars = {};
		var param = location.search.substring(1).split('&');
		for(var i = 0; i < param.length; i++) {
			var keySearch = param[i].search(/=/);
			var key = '';
			if(keySearch != -1) key = param[i].slice(0, keySearch);
			var val = param[i].slice(param[i].indexOf('=', 0) + 1);
			if(key != '') vars[key] = decodeURI(val);
		}
		return vars;
	}
	$(function(){
		var val = getUrlVars();
		var file_select = val.file_select;
		if(file_select){
			var now_select = $("#file_select").find("option[value=\"" + file_select + "\"]");
			$(now_select).prop('selected',true);
		}
	});
	$(function(){
		$("#fileSelectForm").change(function(){
			$(this).submit();
		});
	});
	</script>
```

GETパラメータの取得については、以下記事を参考にしています。、
http://qiita.com/Evolutor_web/items/c9b940f752883676b35d

GETパラメータを取得して、valueと同じだったら、それにselectedをつけるというものです。
```getUrlVars()``` でクエリーが配列で取得されるので、
```val.file_select``` でパラメーターを指定し、もしパラメーターがあれば、
```$(now_select).prop('selected',true)``` でselectedを付与してあげます。

意外と使う事が多いかもしれません。
SQL Server ストアドプロシージャ

## ストアドプロシージャとは
- ストアドプロシージャ(以下SP)とは、データベースに対する一連の処理手順を一つのプログラムにまとめ、データベース管理システムに保存したもの。クライアントから引数を渡してそれに基づいて処理を行ったり、クライアントに処理結果を返したりすることもできる

## SPを使うメリット
- 作成されたSPはすぐに実行できる形式に変換されてデータベースサーバに保存されるため、クライアントから呼び出し命令を送信するだけで処理が実行できる
- 通常のようにSQL文を一つずつ送るのに比べて、ネットワークのトラフィックを削減できる
- サーバ上で構文解析や機械語への変換を前もって終わらせておくため、処理時間の軽減にもつながる

## SP作成方法

![create_sp.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/97a2aeeb-93a4-1f13-b653-71846fd663fd.png)

⓪ 予め、以下のものを用意しておく

- DB:sampleDB
- Table:SampleDBName
    - param:sampleID, sampleName

① 新しいクエリを選択すると、右ペインにクエリエディタが表示される
② 以下のSQL文をクエリエディタに記述する

```ruby:SQL
CREATE PROCEDURE SampleProcedure AS
  SELECT sampleID, sampleName
  FROM SampleTableName

```

③ SPを登録したいDBを選択する
④ 実行ボタンを選択すると、SPが作成される

## 作成したSPの格納先確認方法
![check_sp.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/6a69781b-7dcf-38f6-783b-3dc85b47ddba.png)

- DBのプログラミングの中にある

## ソースの確認
![call_sp.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/966b54e7-f6d8-365c-d049-6eaf922c07f7.png)

- クエリエディタで以下のSQL文を実行する
    - 接頭語のdboは削除する

```ruby:SQL
EXEC sp_helptext プロシージャ名

```
高速な画像処理用言語 Halideについて調査中

　先に[CPUかGPUか専用回路か](http://qiita.com/nonbiri15/items/bbc97f92cb108646bc0b)の記事にHalideについてのメモを追記しましたが、調査中のリンクが増えてきたので、別記事といたしました。

　ソフトウェアによる画像処理の記述には、改良の余地がかなりあることを次の記事から知りました。
画像処理においてはメモリアクセスがボトルネックになることが多いので、配列全体に対する演算を２回行ったときには、そのため、効果的に書かれたライブラリ(もしくは専用言語)との間で圧倒的な差が生じるということです。

- qiita [Halideによる画像処理まとめ](https://qiita.com/fukushima1981/items/fa3537234e19baffc761)
- qiita [Halide入門とOpenCVとの比較](http://qiita.com/fukushima1981/items/193c4ae03b2ea3b4f98e)

>例えば入力画像を二乗して20を足すコードを書くとします．
計算の結果，
OpenCVは73 ms
Halideは9.8ms
と圧倒的な違いがありました．

 
- github atinfinity/lab [Halide](https://github.com/atinfinity/lab/wiki/Halide)


- [Halide a language for image processing and computational photography](http://halide-lang.org/)


- [Halide事始め](http://nebuta.hatenablog.com/entry/2013/08/04/135932)


- [「Halide」高速な画像処理作成ためのC++組み込み型プログラミング言語](http://derivecv.tumblr.com/post/70538301269)


- [Halide, Darkroom – 画像処理並列化のためのソフトウェア](https://tech.d-itlab.co.jp/programming/567/)


- [Halide: A Language and Compiler for Optimizing Parallelism,
Locality, and Recomputation in Image Processing Pipelines](http://groups.csail.mit.edu/commit/papers/2013/halide-pldi13.pdf) pdf

---
OpenCV がHalide対応でさらに高速化されたようです。

[OpenCV Change Logs（意訳）](https://github.com/atinfinity/lab/wiki/OpenCV-Change-Logs%EF%BC%88%E6%84%8F%E8%A8%B3%EF%BC%89#3.3)　から引用

> August, 2017

>高速化されメインリポジトリに移動したdnnモジュール，Halide対応，複数の最適化，その他の改善を含んだOpenCV 3.3がリリースされました．


---

### github https://github.com/fixstars/Halide-elements
Hammerspoonで macOS Sierra + Xcode に emacs ライクなキーバインドを設定した

macOS Sierra になってから、これまで使えていた Karabiner が使えなくて非常に困った。
もともと Karabiner は Xcode で emacs ライクなキーバインドを実現するために使用していたが、
代替として Hammerspoon に移行できたのでその設定内容を記載。

# 動作確認環境

* macOS Sierra 10.12.2
* Hammerspoon 0.9.48

# 主な設定内容

* C-x C-s で上書き保存(⌘+s)
* C-x C-f で Open Quickly (⌘+shift+o)
* C-space で set-mark 的なもの
* 設定は Xcode 操作時のみ有効

# 設定ファイル
Hammerspoon の導入などは省略します。
設定ファイルの全文は Github で管理しているのでそちらを参照。

https://github.com/ryuta46/home/blob/master/init.lua

ちなみに、今は使っていませんが Karabinerの設定ファイルも同じリポジトリにあります。

https://github.com/ryuta46/home/blob/master/private.xml

設定内容をかいつまんで記載します。

## C-x C-s で上書き保存(⌘+s)
C-x トリガで commandMode:enable() 関数を呼び出し、

```
-- command mode
hs.hotkey.new({'ctrl'}, 'x', function() commandMode:enable() end),
```

関数内で hs.eventtap.new にてキーダウンイベントを監視します。
登録した 2ストローク目のキー(例えば C-s)と一致した場合に該当する関数(例えば ⌘-sを発行)を呼び出します。

```
obj.enable = function(self)
    info(self.name.." start")
    self.commandWatcher:start()
end
```
```
obj.commandWatcher = hs.eventtap.new( {hs.eventtap.event.types.keyDown},
    function(tapEvent)
        for k,v in pairs(obj.commandTable) do
            if v.key == hs.keycodes.map[tapEvent:getKeyCode()] and isEqualTable(v.modifiers, tapEvent:getFlags()) then
                info(obj.name.." end")
                obj.commandWatcher:stop()
                if v.func then
                    v.func()
                end
                return true
            end
        end

        if obj.othersFunc then
            return othersFunc(tapEvent)
        end
    end)
return obj
```

このあたりの書き方は下記のページなどを参照させていただき、クラスっぽい記載にしました。
http://www.ie.u-ryukyu.ac.jp/~e085739/lua.hajime.4.html


## C-space で set-mark 的なもの

上記の C-x C-s の場合と同じような記載にしましたが、
登録されている 2ストローク目のキー以外のキーが押された場合に shift を強制的に押されたような動作をするようにしました。
これにより、C-space C-f C-f などと押したときに、shift を押しながらカーソル移動したのと同じような動作をさせるようにしています。

```
function(tapEvent) -- force shift on
    flags = tapEvent:getFlags()
    flags.shift = true
    tapEvent:setFlags(flags)
    return false
end
```

ちなみにXcode でもデフォルトで C-@ でset mark できますが、選択範囲をわかりやすくしたかったのと、OSのクリップボードと共有させたかったので上記のような設定をしています。

## 設定は Xcode 操作時のみ有効

下記コードにより ウィンドウの切り替えを監視し、Xcode フォーカス時にのみ設定が有効になるようにしています。

```
hs.window.filter.new('Xcode')
    :subscribe(hs.window.filter.windowFocused,function() enableAll(xcodeBindings) end)
    :subscribe(hs.window.filter.windowUnfocused,function()
        disableAll(xcodeBindings)
        markMode:disable()
        commandMode:disable()
    end)
```

# 最後に

Xcode だけで emacs キーバインドができれば全て解決ですが、それまではこれでしのぎます。
API仕様を見た感じHammerspoon はもっといろいろなことができそうなので、今後も触っていこうかと思います。
http://www.hammerspoon.org/docs/
Parse Serverの死活管理と設定変更したらすぐ自動で反映されるようにする


# 目的
自前でParse Serverを運用しているが、変なクエリでAPI叩くとすぐ落ちるので自動で再起動したい。
Parse Serverのconfigを変更するとParse Serverが再起動して適用されるようにしたい。
手早くParse Serverのインスタンスを追加したい。
モニタリングしたい。

# 事前準備

```
npm install -g parse-server parse-dashboard pm2
```

# configのサンプル
https://github.com/KoheiKanagu/parse_settings_example

# 使い方

## `parse-configs/parse_example.json`を参考にして、キーなどを設定したjsonを作る。
参考: https://github.com/parse-community/parse-server#configuration

## `parse-dashboard-config.json`を書き換える。
参考: https://github.com/parse-community/parse-dashboard

## `pm2_config.json`を書き換える。
参考: http://pm2.keymetrics.io/docs/usage/application-declaration/

```json
"watch_options": {
    "usePolling": true
}
```

をしないと、`parse-configs/parse_example.json`のようにディレクトリの中にあるようなファイルをwatchできない？
`parse-dashboard-config.json`は`usePolling: false`でもwatchできる。

## 起動とかのよく使うコマンド

```
pm2 start pm2_config.json
pm2 delete all
pm2 restart all
pm2 kill
```

# MongoDB
pm2でMongoDBもモニタリングしたければ、

```
pm2 install pm2-mongodb
```

参考: https://github.com/pm2-hive/pm2-mongodb

MongoDBのポートなどがデフォルトなら何も設定しなくてもいい。
VRTK 3.0.1 と SteamVR Plugin 1.2.0 をセットアップ（するだけ）

UnityでVRコンテンツを作るときに便利なアセット『VRTK』のセットアップ方法をメモしておきます。

##いちばんシンプルだと思われる設定方法
VRTKの「Getting Started」ページの記載に沿って進めます。
https://vrtoolkit.readme.io/docs/getting-started

今回はSteamVR用にセットアップします。（私がViveしか持ってないため）
・・・その出来上がりがこちら。
![text4620-2-1-3-8-1.png](https://qiita-image-store.s3.amazonaws.com/0/30693/a3b08ff6-c7c4-44b8-4826-396ed604df2f.png)

スクリーンキャプチャの番号に沿って説明します。

##①「SteamVR Plugin 1.2.0」をインポートします。
アセットストアからで大丈夫です。
https://www.assetstore.unity3d.com/jp/#!/content/32647

##②「VRTK 3.0.1」をインポートします。
こちらは最新版である3.0.1をGitHubから持ってきます。
https://github.com/thestonefox/VRTK
アセットストアのバージョンは3.0.0で、SteamVR Plugin 1.2.0と一緒に使うとエラーが出ます。

##③空のGameObjectを作成し、インポートしたVRTKより「VRTK_SDKManager」をaddします。（⑥）
VRTK_SDKManagerのある場所：Assets > VRTK > Scripts >Utilities

##④同じくインポートしたVRTKより「VRSimulatorCameraRig」をHierarchy上にドラック＆ドロップ
VRSimulatorCameraRigのある場所：Assets > VRTK > Prefab

##⑤インポートしたSteamVRより「[CameraRig]」をHierarchy上にドラック＆ドロップ
[CameraRig]のある場所：Assets > SteamVR > Prefab

##⑥GameObjectに設定した「VRTK_SDK_Manager」をInspector上で開きます。
ここからは③で設定をしたVRTK_SDK_Manager上の操作になります。

##⑦SDK Selection上の「System SDK」「Boundaries SDK」「Headset SDK」「Controller SDK」にSteam VRを設定します。
他の項目は初期値のままで大丈夫です。（画面とキャプチャが違っていても次の手順で設定されるので大丈夫！）

##⑧「Auto Populate Linked Objects」ボタンを元気よくクリック！
自動でイイ感じに設定をしてくれます。

##⑨Hierarchy上に戻り「Main Camera」を選択、削除または無効にします。
Main Cameraが生きていると、何故か実行時にこちらがHMD上で有効となり慌てます。（コントローラが遠くに・・）

##以上！

- 床代わりにPlaneを置いてますが、手順的には不要なので割愛してます。
- セットアップで引っ掛かったところは②と⑨の２点でした。
- ②のVRTKのバージョンについてはスグにアセットストアにも反映されることでしょう。
Elastic Beanstalk (Docker)で環境変数の有無によって処理をする

# What

Solution Stack: `64bit Amazon Linux 2016.09 v2.2.2 running Docker 1.11.2`の場合

# Why

環境別（本番、開発等）で環境変数の有無によってElastic Beanstalk上のホストで処理をしたい。例えば本番環境でのみ`newrelic`をインストールするとか。

# How

コンテナホスト（EC2）上では直接Elastic Beanstalkの環境変数が見れないので`get-config`を使う。

```yaml:.ebextensionsnewrelic.config
packages: 
  yum: 
    newrelic-sysmond: [] 
  rpm: 
    newrelic: http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
container_commands: 
  "01": 
    command: /opt/elasticbeanstalk/bin/get-config environment | jq -e -r '.NEWRELIC_KEY' && usermod -a -G docker newrelic || echo 'NEWRELIC_KEY not found'
  "02": 
    command: /opt/elasticbeanstalk/bin/get-config environment | jq -e -r '.NEWRELIC_KEY' && nrsysmond-config --set license_key=$NEWRELIC_KEY || echo 'NEWRELIC_KEY not found'
  "03": 
    command: /opt/elasticbeanstalk/bin/get-config environment | jq -e -r '.NEWRELIC_KEY' && /etc/init.d/newrelic-sysmond start || echo 'NEWRELIC_KEY not found'
```

この場合、`NEWRELIC_KEY`が存在する場合のみ設定がされる。
forループで10カウントするごとに処理を実行する

1000回カウントするforループで10カウントするごとに処理を実行するプログラムならスラスラと書けるかもしれない。

しかし、ループ0回時も実行することとし、100回ループするごとに1プラスした回数で実行しなければならないとなると少々考え込んでしまう。

まず、考えなければいけないのはループ何回目で処理を実行するかということだ。

上記の要件から以下のカウント数の時に処理を実行することになる。
`0,10,20,30.....90,101,111,121.......,979,989,999`

考えたのは下のようなモノだが、カウンターを二つ置き、ifの連発なので他に簡単な方法はないものか？と思う。

```c++:forループで10カウントするごとに処理実行する

	int countSet = 1000;
	int counter0 = 0;
	int counter1 = 0;

	for (int i = 0; i < countSet; i++) {

		if (counter1 == 10 || i == 0) {//ループ0回目とカウンター10回目で処理を実行する条件文
			cout << i << "-";
			cout << counter1 << endl;//ここで要求された処理の実行
		}

		if (counter1 == 10) {
			counter1 = 0;//10回ごとにカウンター1をリセット
		}

		if (counter0 == 91) {
			counter1 = 0;//ループ91回目でカウンター1をリセット
		}

		if (counter0 == 101) {
			counter0 = 0;//ループ101回目でカウンターゼロをリセット
		}

		counter0++;
		counter1++;
	}
```
Docker for Macで容量が増え続けてしまう

# 原因

Docker for Macを利用開始してから、ディスク容量がガッツリと減っていることに気付いた。
色々なイメージをダウンロードしすぎたかなと思って、不要なイメージを`docker rmi hogehoge`など実行しても容量が開放されない。

色々と調べてみたところ、下記のファイルのサイズがやたらと大きい。

```
~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
```

このファイルは、ダウンロードしたイメージが一式格納されているVMの実体ファイルのようだ。
  ※qcow2は、「qemu」という仮想マシンのファイル。
  ※インストール直後の初期状態だとファイルサイズは1.1Gだった(Docker Ver.1.12.6)。

「イメージの削除」は、VM内のファイルの削除ということになるので、VMの実体ファイルは縮小されないのだろう。

# 解決策

検索してみると、同様の症状の人が多い。
解決策としては、以下のいずれかのようだ。

* 解決策1：Docker for Macのリセットをする。
* 解決策2：qemuをインストールして、イメージをshrinkさせる(非常に有用な参考記事：https://gendosu.jp/archives/3009)


解決策1は、ダウンロードしたイメージや作成したコンテナが全て消えてしまう。
永続化データなどは、全てバックアップしてから実施しないといけない。

解決策2は、必要なイメージやコンテナを保持したまま実施できる。
詳細は、上記リンク先を確認してもらうとして、簡単な概要だけここにメモしておく。

## 解決策2の概要

実施前に、不要なイメージやコンテナは削除しておいた方が良い。

``` shell
# qemuのインストール(MacPorts)
% sudo port install qemu

## Docker for Macの本体のVMにログイン
% cd ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux
% screen tty

## /var/tempfileに0書き出しすることで、仮想ディスク内で削除されているファイル群を削除。
## 上記リンク先では、ddでサイズ指定（例えば、Docker.qcow2の現在のファイルサイズの半分くらい）をして消しているようだ。
vm> dd if=/dev/zero of=/var/tempfile
vm> rm /var/tempfile
```

ここまで来たら、Docker for Macを停止して、仮想ディスクファイルをshrink

``` shell
% qemu-img convert -O qcow2 Docker.qcow2 Docker.qcow2.new
% rm Docker.qcow2
% mv Docker.qcow2.new Docker.qcow2
```
Docker for Macを起動して完了。

都合により上記ゼロ埋め後の削除は実施しなかったが、qemu-imgによりshrinkだけで5.9Gが4.9Gに減った。

# 余談

上記のことから、下記の環境をDocker for Macで全て構築すると、不要にディスク容量を圧迫し、そのメンテナンスに手間がかかってしまう。

Docker for macを使うことで、Virtual Boxを利用しなくて済むので喜んでいたけど、「継続して利用したい環境」、「気軽に試す環境」などのように、ある程度の固まり毎にVagrantでDocker環境を分割した方が良いのかもしれない。
npmの更新方法

npmパッケージを作成した後、別のlinuxからupdateする方法のメもです。

## package.jsonの更新
ソフトウエアの他に、package.jsonの中のバージョン情報を更新します。

## githubにソースコードを展開します。

## npm adduser
使用しているlinuxにnpmのユーザ情報を更新します。
npmサーバーに登録しているuser name, password, URLを入力します。

## npm publish
このコマンドでnpmのサーバーの情報が更新されます。
ggplot2で分割したグラフ毎に統計値を書き込む

`facet_wrap()`で分割したグラフ毎に異なる統計値、例えば平均値を書き込むことを目標とする。

# 用いるデータ

`mpg`を使い、排気量(displ)と高速燃費(hwy)の間で散布図を描き、駆動方式(drv)でグラフを分割するとする。

```r
library(ggplot2)
p <- ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  facet_wrap(~drv) +
  theme_bw() +
  theme(panel.grid = element_blank())
p
```

![Rplot001.png](https://qiita-image-store.s3.amazonaws.com/0/109348/3fc4e926-b384-ca13-d889-95254141aa10.png)

そして、各駆動方式別に平均値を書き込みたい、とする。

これには`annotate()`を使う。`annotate()`は分割されたグラフに使う場合、分割された枚数と同じ長さのベクトルを与えると、それぞれに対応した値を書き込む。
したがって…

# 集計し、文字列ベクトルにする

まずはデータを集計し、文字列ベクトルにする。このとき、グラフを分割する方法に対応するように集計する。つまり`drv`で分割するのであれば`drv`でgroupを作って集計する。

```r
library(dplyr)
a <- mpg %>%
  group_by(drv) %>%
  summarize(average = mean(hwy)) %>%
  apply(1, function(x){paste("average:", sprintf("%.1f", as.double(x[2])))})
```

# plotする

あとは文字列ベクトルを`annotate()`に与える。

```r
p + annotate("text", label = a, x = 7, y = 40, adj = "right")
```

![Rplot002.png](https://qiita-image-store.s3.amazonaws.com/0/109348/9053f61c-15e3-2b56-4994-bd4f3222db14.png)

# 表形式で書き込みたい場合

```r
## function ----
svp <- function(t){ # 飽和水蒸気圧計算 Alduchov and Eskridge(1996)
  ifelse(t > 0,
         6.1094 * exp(17.625 * t / (243.04 + t)),
         6.1121 * exp(22.587 * t / (273.86 + t)))
}
vpd <- function(t, RH){ #飽差（VPD：水蒸気分圧差）
  svp(t) * (1 - RH/100)
}

## data ----
start <- as.POSIXct("2017/1/1", tz = "UTC")
end <- as.POSIXct("2017/1/4", tz = "UTC")
Time <- seq(start, end, by = "10 min") # 時間
Temp <- sin(seq(0, 3*pi, len = length(Time)) + runif(length(Time))*0.1) * 7 + 10 # 気温
RH <- cos(seq(0, 3*2*pi, len = length(Time)) + runif(length(Time))*0.2) * 5 + 60    # 相対湿度
VPD <- vpd(Temp, RH) # 飽差(VPD)


# テキスト用にデータを集計
tmp <- filter(ondo, day >= start, day <= end) %>%
tmp <- cbind(round(tmp[,2:10],1))

# 日付ごとにラベルを生成
df <- data.frame(Time, day = as.Date(Time), Temp, RH, VPD)
df <- df[-nrow(df),]
df_summary <- df %>% group_by(day) %>%
  summarize(tmax = max(Temp), tmean = mean(Temp), tmin = min(Temp),
            rmax = max(RH),   rmean = mean(RH),   rmin = min(RH),
            dmax = max(VPD),  dmean = mean(VPD),  dmin = min(VPD))
df_summary <- df_summary[,-1]
lab <- apply(df_summary, MARGIN = 1,
             function(x){
               x <- sprintf("%5.1f", x)
               paste(
                 "最高　",  "平均　", "最低\n",
                 "相対湿度 ", x[4], " ", x[5], " ", x[6], "\n",
                 "気温 ",     x[1], " ", x[2], " ", x[3], "\n",
                 "飽差 ",     x[7], " ", x[8], " ", x[9],  sep = ""
               )})

gather(df, key = param, value = val, -Time, -day) %>%
  ggplot(aes(x = as.POSIXlt(Time)$hour + as.POSIXlt(Time)$min/60, y = val, col = param)) +
  geom_line() +
  scale_y_continuous(limits = c(0,100)) +
  annotate("text", label = lab, x = 24, y = 90, family = "Osaka-Mono", adj = "right") +
  facet_wrap(~day) +
  theme_bw()
```

![Rplot003.png](https://qiita-image-store.s3.amazonaws.com/0/109348/8e86fe2f-7901-218e-4c2b-5c9646d65776.png)

`annotation_custom()`でなんとかならないかと思ったけどよくわからず結局文字列ベクトルに押し込めるという力技で解決してしまった…。
縦に揃えたい場合は`sprintf()`で整形して等幅フォントを使うのがポイント。
Angularでチェックボックスの表示を反転させる

angularでチェックボックスを使用する際、`ng-model`を使用してバインドさせる値と、チェックボックスのチェック状態を反転させたいことがあります。つまりこういうことですね。

バインドしている値が`true` => **チェックされていない**
バインドしている値が`false` => **チェックされている**

これは、`ng-true-value`と`ng-false-value`を使用することで達成できます。
以下がコードの例です。

```html
<input type="checkbox" ng-model="checked" ng-true-value="false" ng-false-value="true">
```

参考: [input[checkbox]](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D)
引用元: [AngularJS: Reverse Checkbox State](http://stackoverflow.com/questions/13925462/angularjs-reverse-checkbox-state)
safariでblurに対してoverflow:hiddenが効かない

safariで子要素にblurをかけている際にoverflow:hiddenが効かなかったのでメモ。

[Sample](https://jsfiddle.net/t4y3/7jrn0tmr/)
<iframe width="100%" height="300" src="//jsfiddle.net/t4y3/7jrn0tmr/embedded/html,css,result/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>


`.wrap`要素にoverflow: hidden, `.pct`に対してblurをかけていますが、
safariではうまく動作していません。
そこで、`.hack`要素に`transform: translate(0)`を指定することで解決できます。

```css
.wrap {
  width: 100px;
  height: 100px;
  margin: 10px;
  overflow: hidden;
}

.pct {
  -webkit-filter: blur(4px);
  -ms-filter: blur(4px);
  filter: blur(4px);
}

.pct.hack {
  -webkit-transform: translate(0);
  -ms-transform: translate(0);
  transform: translate(0);
}
```
管理画面をカスタマイズしようとして$current_screen使ったら、 : Trying to get property of non-object inって言われた件

```php
//function.php
if($current_screen->post_type == 'xxx') {
…
}
```

前使ったときは大丈夫だったじゃん・・・
なんなん・・・と思って調べたら、こういう感じに書けばいいらしい。

```php
//function.php
if(isset($current_screen) && $current_screen->post_type == 'xxx') {
…
}
```

参考：https://wordpress.org/support/topic/fix-for-undefined-current_screen/
CUDA 8.0 インストール時にハマったこと

#はじめに
* CUDA のインストールにとても苦労したので、そのメモを残しておく。残念ながら、完全な手順を記載することは難しく、走り書きになってしまったことをご了承いただきたい。

#環境
* Ubuntu 16.10
* GTX970
* CUDA 8.0

#手順
1. BIOS のセキュリティ設定（UEFI）をOFF
2. GRUB、X.org をOFF
3. nouveau を OFF
4. gcc を Ver. 4に
    * [gtx1070搭載PCにubuntu16.04,cuda,chainerを導入](http://t-nkb.hatenablog.com/entry/2016/09/23/224742)
5. python3 をインストール
    * [python3と科学計算ライブラリ周りをUbuntuにインストール(virtualenv+pip)](http://qiita.com/jooex/items/61a9169f2f88580d15ff)
6. CUDA ダウンロード＆インストール
    * [CUDA Toolkit 8.0](https://developer.nvidia.com/cuda-downloads)

#参考
* [Ubuntu16.04にCUDA8.0とChainerをインストールする](http://qiita.com/IshitaTakeshi/items/3efce820986f4560765d)
* [How to install NVIDIA.run?](http://askubuntu.com/questions/149206/how-to-install-nvidia-run)
* [Install Nvidia Drivers in Ubuntu 15.04](http://www.allaboutlinux.eu/remove-nouveau-and-install-nvidia-driver-in-ubuntu-15-04/)
* [UbuntuにCUDAを入れようとしたらハマった](http://qiita.com/bohemian916/items/a48e6496b04bbbf09fb3)
* [Ubuntu 16.04 kernel 4.4.0-21 not loading nvidia/vboxdrv modules anymore (Required key not available)](http://askubuntu.com/questions/761886/ubuntu-16-04-kernel-4-4-0-21-not-loading-nvidia-vboxdrv-modules-anymore-require)
* [Why do I get “Required key not available” when install 3rd party kernel modules or after a kernel upgrade?](http://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules)
teeでリターンコード拾えない問題

*ERROR*

*それはITエンジニアにとっての恐怖の象徴。*

*漆黒のコンソール画面に浮かび上がるその５文字は*
*一人のエンジニアの帰宅時間を*
*いともたやすくえげつない時刻に設定する*

*しかし、*

*我々ITエンジニアは知っている*

*「エラーが出てしまったこと」*

*よりもずっと怖いことがある*

*それは*

***「エラーが出るはずの場所でエラーが出ないこと」***

である。



#問題のtee

hoge.shでエラーが起きても拾えませんでした。。。

```bash:
./hoge.sh 2>&1 | tee -a hoge.log

RC=$?
if [ RC -ne 0 ]; then
  #エラー処理
fi

#正常だったときの後続処理

```


#するまでも無い解説

tee は受け取った標準入力を、
そのまま標準出力として画面に出しつつ、ファイルにも出すコマンドです。
コンソール画面を確認しつつ、ログファイルにも出力するため
ぼくが所属していたプロジェクトではあらゆる箇所で使われてました。

$?は直前のコマンドのリターンコードを返します。
このbashを書いた人は、

./hoge.sh

のコマンドのリターンコードを見たかったんだと思います。

が、$?がひろうのはあくまで「直前」のコマンドなので、このままでは
**「tee」コマンドのリターンコード**を拾っちゃいます。

うそのような本当の話ですが、
このような書き方が蔓延した半年後くらいに発見されたので、
広範囲にテストやり直しになったことがありました。*死ねばいいのに*



#解決策１：リダイレクトを使う
コンソールには出なくなるけど、ログにはキッチリ残るし
ちゃんとエラー拾えるようになります。

bashになれないとこの細かい記号が覚えられないので


```bash:
./hoge.sh >> hoge.log 2>&1

RC=$?
if [ RC -ne 0 ]; then
  #エラー処理
fi

#正常だったときの後続処理

```

#解決策２：$PIPESTATUS使う(bash系のみ）

個人的にはこっちが好きです。

```bash:
#!/bin/bash
./hoge.sh 2>&1 | tee -a hoge.log

RC=${PIPESTATUS[0]}
if [ RC -ne 0 ]; then
  #エラー処理
fi

#正常だったときの後続処理

```

PIPESTATUSは直前のパイプ含むコマンド郡のリターンコードを
配列で返します。

echo ${PIPESTATUS[@]}

とかやると全部表示されるのが分かります。


#ぼやき

どうやって単体テストを通したの？
レビュワーは何をレビューしたの？
なんで半年も発見されなかったの？
[Windows]コマンドプロンプトから新しいコマンドプロンプトを開く

たまに必要になるんです。


##コマンド

```bat
start [option] [command]
```

##実行例

```bat
c:\> start
```
引数なし。
新しいコマンドプロンプトが表示され、もとのコマンドプロンプトのカレントディレクトリ（`c:\>`）の状態。

```bat
c:\> start dir
```
新しいコマンドプロンプトが表示され、`c:\`のディレクトリ一覧を表示。

```bat
c:\> start cd /d d:\
```
新しいコマンドプロンプトが表示され、`d:\`に移動した状態。

```bat
c:\> start explorer .
```
新しいコマンドプロンプトが**表示されない**。（win10）
エクスプローラが起動。

```bat
c:\> start cmd /k explorer .
```
新しいコマンドプロンプトが表示される。（もとのコマンドプロンプトのカレントディレクトリ）
エクスプローラが起動。


##参考
https://www.k-tanaka.net/cmd/start.php
javascriptでバイナリを扱う

15年ほど前の作られたシステムからデータを取得してブラウザ上で表示しようとしたらデータがバイナリでした・・・。
サーバー上で毎回テキストにするのも負荷が・・・、ちょくちょく更新されるしのでキャッシュサーバーを導入するとキャッシュの削除とか面倒です・・・・。

結局javascriptでやればいいじゃないか！ってことに。

## Ajaxで取得

データはAjaxで取得するしかなさそうです。そして、jQueryだとdataTypeにバイナリがないので自力で取得します。試さなかったけどarraybufferを指定すれば使えたりするかも？
また、クロスドメインにはCORSで対応しました。


```js

let createCORSRequest =  (method, url) => {
    let xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr) {
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest !== "undefined") {
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
};

let binArray = [];
let xhr = createCORSRequest('GET', 'https:/www.xxxxx.xyz/hoge/piyo/');
xhr.responseType = 'arraybuffer';
xhr.onload = (e) => {
    binArray = new Uint8Array(this.response);
};
```

これでbinArrayの中は**8 ビット符号なし整数値の配列**になります。
後はこれを好きなように料理すればいいだけです。

## 処理例

```js
let p = 0;
let binArray=[];
let readShort = () => {
    let d1 = binArray[p];
    let d2 = binArray[++p];
    ++p;
    let ret = d1 | (d2 << 8);
    if (0x8000 & ret) {
        ret = -((ret ^ 0xffff) + 1);
    }
    return ret;
};

let readLong = () => {
    let d1 = binArray[p];
    let d2 = binArray[++p];
    let d3 = binArray[++p];
    let d4 = binArray[++p];
    ++p;
    let ret = d1 | (d2 << 8) | (d3 << 16) | (d4 << 24);
    if (0x80000000 & ret) {
        ret = -((ret ^ 0xffffffff) + 1);
    }
    return ret;
};

let xhr = createCORSRequest('GET', 'https:/www.xxxxx.xyz/hoge/piyo/');
xhr.responseType = 'arraybuffer';
xhr.onload = (e) => {
    binArray = new Uint8Array(this.response);
    let hoge = readSort();
    let piyo = readLong();
};
```
Android Studio の VM Options について



遅まきながら Qiita デビュー。
初めてなので、軽く書いてみます。

今回は、今使っている Android Studio の VM Options について。

Android Studio を起動していると、PC のメモリを激しく消耗していくような気がします。メモリの使用量をいちいち気にしたくはありませんが、性能に余裕のない PC を使っているなど、メモリ消費をコントロールしたい方は VM Options が使えます。

Help → Edit Custom VM Options

![Screen Shot 2017-01-18 at 22.19.14.png](https://qiita-image-store.s3.amazonaws.com/0/58847/9715ffd7-32bc-4ee8-bc02-9015b48b9be7.png "Screen Shot 2017-01-18 at 22.19.14.png")

私は MacBook Pro の 16GB を使っていますが、同時に Gradle Daemon や Google Chrome などメモリ消費の大きいアプリを使うため、できれば 3GB 程度には押さえたいと考えています。

今のところ、私は次のような設定にしています。

```
# custom Android Studio VM options, see http://tools.android.com/tech-docs/configuration
-Xms768m
-Xmx1536m
-XX:MaxMetaspaceSize=350m
```

![Screen Shot 2017-01-19 at 21.43.53.png](https://qiita-image-store.s3.amazonaws.com/0/58847/3de6dddc-73e0-99e4-406e-21d26d2d32a3.png "Screen Shot 2017-01-19 at 21.43.53.png")



ちなみに Android Studio 2.2 のデフォルト設定がどうなっているのかを調べてみました。

```
$ jps -lvm
19970  -Dfile.encoding=UTF-8 -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 
-da -Djna.nosys=true -Djna.boot.library.path=  -Djna.debug_load=true -Djna.debug_load.jna=true -Dsun.io.useCanonCaches=false 
-Djava.net.preferIPv4Stack=true -Xverify:none -Xbootclasspath/a:../lib/boot.jar -Xms256m -Xmx1280m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=240m -XX:+UseCompressedOops 
-Djb.vmOptionsFile=/Applications/Android Studio.app/Contents/bin/studio.vmoptions,/Users/kosuke/Library/Preferences/AndroidStudio2.2/studio.vmoptions -Didea.java.redist=Bundled 
-Didea.home.path=/Applications/Android Studio.app/Contents -Didea.executable=studio 
-Didea.platform.prefix=AndroidStudio -Didea.paths.selector=AndroidStudio2.2
```

- Xms ... ヒープメモリの初期サイズ
- Xmx ... ヒープメモリの最大使用量
- XX:MaxMetaspaceSize ... Metaspace領域（旧 Permanent領域）の最大サイズ

デフォルトでは
`-Xms256m -Xmx1280m -XX:MaxPermSize=350m`
となっているため、Android Studio のメモリ消費量を小さくしたければ、この値よりも小さくしなければ意味はない。

私の設定では、どうせ Android Studio のメモリ消費量は大きくなるので、ヒープメモリの初期サイズ（Xms）を大きめに。最大使用量は、微増程度にした。XX:MaxMetaspaceSize はデフォルト値と同じだが、今後デフォルト値が変化することも考慮して、今のデフォルト値で固定した。

よい Android Studio ライフを！

---

__参考：__
Configure Android Studio | Android Studio
https://developer.android.com/studio/intro/studio-config.html

Java8のHotSpotVMからPermanent領域が消えた理由とその影響 | ギークを目指して
http://equj65.net/tech/java8hotspot/


__謝辞：__
最初に投稿した記事がだいぶん見当ハズレになっていましたが、@kimukou さんからのご指摘があり、もう一度改めて調べなおして、正確になるように努めました。
この場を借りて、ありがとうございます！
SpatiaLite を Java / JDBC で利用

こんにちは。
SpatiaLite 使用例として、"[Language bindings: Java / JDBC ]
(http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/java.html)" (SpatiaLite Cookbook) を見つけたので、そのソースを動かしてみました（SpatialiteSample.java と SpatialiteThreads.java）。

準備として下記をインストールしました（homebrew 利用）。

```console
$ brew install sqlite libspatialite
$ brew cask install java
$ wget https://bitbucket.org/xerial/sqlite-jdbc/downloads/sqlite-jdbc-3.16.1.jar
```

実行は、

```console
$ javac -classpath ".:sqlite-jdbc-3.16.1.jar" SpatialiteSample.java
$ java -classpath ".:sqlite-jdbc-3.16.1.jar" SpatialiteSample
SQLite version: 3.16.1
SpatiaLite version: 4.3.0a
target CPU: x86_64-apple-darwin15.6.0
> Inserted 100000 entities of type POINT SRID=4326
> Inserted 100000 entities of type LINESTRING SRID=4326
> Inserted 100000 entities of type POLYGON SRID=4326
$ 
$ ls -ld spatialite-test.sqlite
$ javac -classpath ".:sqlite-jdbc-3.16.1.jar" SpatialiteThreads.java 
$ java -classpath ".:sqlite-jdbc-3.16.1.jar" SpatialiteThreads
start: Slot #0    Thread #0
start: Slot #2    Thread #2
start: Slot #1    Thread #1
...
    stop: Slot #25    Thread #991
    stop: Slot #19    Thread #997
    stop: Slot #57    Thread #1000
$ 
```


もしも sqlite + spatialite の動作に問題がある場合は、まずは下記のようにチェックすると良いようです。

```console
$ SQLITE3_VERSION=`brew info sqlite | grep /usr/local/Cellar/sqlite | awk '{print $1}'`
$ SQLITE3=${SQLITE3_VERSION}/bin/sqlite3
$ echo $SQLITE3
$ $SQLITE3 -version
$ ( \
echo "SELECT load_extension('mod_spatialite');"  \
echo "SELECT sqlite_version();"  \
echo "SELECT spatialite_version();"  \
echo "SELECT spatialite_target_cpu();" \
) | $SQLITE3
$ 
```
Redux先輩ミーリマシン説

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/YassineElouafi2">@YassineElouafi2</a> Redux seen as a mealy machine: reducers compute next state, while Sagas compute next Effect</p>&mdash; Yassine Elouafi (@YassineElouafi2) <a href="https://twitter.com/YassineElouafi2/status/702078607812861952">2016年2月23日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ここ数日、Reduxとはなんぞやということについてさんっざん検索して調べまわっていました。ふと[ミーリ・マシン](https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%BC%E3%83%AA%E3%83%BB%E3%83%9E%E3%82%B7%E3%83%B3)っぽいなと思って"Redux Mealy Machine"でググり、Redux-sagaの中の人のこのツイートにたどり着いて、ようやくストンと腑に落ちました。[参考1](http://qiita.com/inamiy/items/293869e223d44848f9c9)。[参考２](http://qiita.com/shinout/items/4a7f67275c3ad887d98d)

ReduxでReducerの中で作用を使うなとかActionCreatorを純粋にしろとか言われてどうすりゃいいんだよウッセーなお前はおれのかーちゃんかよって思った人は多いでしょう。Reduxが何なのか理解できていないと、Reduxが要求する制限や規則は単に窮屈で複雑、難解なだけです。でもReduxが何を表現しているのかがわかったら、あのような厄介な規則もとたんに前向きに受け入れられるようになりました。

Reduxとは何か。**Reduxはミーリ・マシンだ**。アプリケーションから状態遷移の部分のみを切り離して抽象化した、有限状態機械だ。Actionとは入力記号$\rm Σ$であり、Reducerとは状態遷移関数$\rm S × Σ → S$だ。Reduxは状態遷移のみを取り扱う純粋な機械であり、現実世界との相互作用とは独立してその状態遷移をテストできる。

Reduxだけでは計算は進んでいかない。Redux-Sagaは`select`と`take`で$\rm S$と$\rm Σ$を取り出し、$\rm S × Σ$から現実世界との相互作用$\rm Λ$を計算する出力関数$\rm S × Σ → Λ$として振る舞う。それからSagaは作用$\rm Λ$を現実世界に作用させ、その結果に応じて$\rm Σ$を`put`で再びReduxの中に投げ入れることで、ミーリ・マシンたるReduxを駆動する役目を持つ。

# まとめ

React/Reduxは難しいので[Elm](http://elm-lang.org/)を使おう！
Makefile でファイルの依存関係をグラフ化する

## 本文

git リポジトリの Makefile をグラフ化するこんな画像になります。
（非常に横に長い画像です）

![deps.png](https://qiita-image-store.s3.amazonaws.com/0/12745/3c709501-bc71-08c6-6721-1abe419c75b0.png)

以下の Makefile を任意のプロジェクトに置き、後は Makefile のフォーマットに従ってファイル同士の依存関係を記述するだけです。

```
.PHONY: help
help:  # シャープコメントが付いている Make タスク一覧を出力する
	@cat $(MAKEFILE_LIST) \
	| grep -E '^[^:# ]+:.*?# .*$$' \
	| sort \
	| awk 'BEGIN {FS = ":.*?# "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

.PHONY: clean
clean:  # 生成ファイルの削除
	@rm -f deps.dot deps.png deps-serialized.txt

deps.dot: Makefile  # 依存グラフの dot ファイル
	@echo 'digraph deps {' > deps.dot
	@cat $(MAKEFILE_LIST) \
	| grep -E '^[^:# ]+:' \
	| grep -vE '^(\.PHONY|help|deps\.(dot|png)|deps-serialized\.txt):' \
	| sed -E 's/#.*$$//' \
	| sed -E 's/\\/\\\\/g' \
	| sed -E 's/"//g' \
	| awk 'BEGIN{FS="[ \t]*:?[ \t]*"} { for(i=2;i<=NF;i++){ if ($$i!="") print "\"" $$1 "\" -> \"" $$i "\"" } }' \
	>> deps.dot
	@echo '}' >> deps.dot

deps.png: deps.dot  # 依存グラフを可視化した画像
	@dot -Tpng deps.dot -o deps.png

deps-serialized.txt: deps.dot  # 依存グラフを直列化したリスト
	@cat deps.dot \
	| grep -- '->' \
	| awk -F'->' '{print $$2,$$1}' \
	| tsort \
	| tr -d '"' \
	> deps-serialized.txt
```

Make を使わないプロジェクトでも、ファイル同士の依存関係を管理するためだけに Makefile を使ってもいいかもしれません。

make, Graphviz の dot, tsort コマンドなどが必要です。


## 後はどうでもいい話

今日の仕事でファイル名の連番プレフィクスで順序を管理されているファイルの順序を入れ替える作業があった。
20_xxx というファイルの後だが、21_yyy の前というファイルを作らねばならなかった。まさか 20.5_zzz というファイルを作るわけにもいかないので、既存ファイルをリネームしたが、これがファイルのリネームにセンシティブなシステム/プログラムだと頭を抱えることになっただろう。イケてない。

振り返ると日頃から順序、少し拡張して依存関係 (非閉路有向グラフ) の扱いが雑だ。しっかり考えれば難しい問題ではないのに、手間を惜しんで行き当たりばったりの対応をしている。ベストプラクティスを探そうと思って書いたのが今晩。

ちなみに、順序関係を番号で管理するイケてないやり方に対する揶揄で「BASIC の行番号かよ」というフレーズをどこかで聞いたが、とても気に入ってる。


## ファイルの順序/依存関係を管理する

ファイル名で順序を管理しようとすると番号が足りなくなる。
リネームすると困る場合だと最悪死ぬ。
（脇にそれますが、みなさん RDB で順序を管理しようとする時、どうやってますか？　番号振り直ししか思いつかなくて困ってます……）

順序/依存関係の変更で既存ファイルに影響を与えたくないので、順序/依存関係を扱うファイルを用意しようと考えた。（行毎にファイル名を書いた file_list.txt みたいなファイル）

単純な順序ならこれでいいかもしれないが、大抵はグラフで表現したくなる（気がする）。依存関係といえば Makefile だという発想が自分の中のイメージだったので、なんとかして Makefile を利用しようということになった。

それに Makefile なら Make 使わなさそうなプロジェクトにポンと置いてもとりあえず make 叩いてくれそうな気がする。


## グラフ化する

Graphviz で。


## 直列化する

トポロジカルソート実装しなくても tsort というまんまのコマンドがある。普段中々使わないから忘れられがち。


## まとめ

というわけで Makefile にシェルスクリプト書いて、変換を書ければ出来上がり。

```
a: b c
b: d
c: d
```

みたいに、Make ターゲットの実行部分を書かず、依存関係だけを Makefile で管理することもできるので気に入っている。

可視化とメンテしやすさが同時に手に入ってウマウマ。
macos 修飾キーの位置をアプリなしで変更

キーの位置を変更するのに、以前はわざわざアプリを入れていました。
しかし、下記に記載する修飾キーの位置変更だけであれば不要だったようです。

## 位置変更が可能なキー一覧

- Control
- Shift 
- Option
- Command

![スクリーンショット 2017-01-18 21.12.27.png](https://qiita-image-store.s3.amazonaws.com/0/8405/441d04ca-6059-6055-618e-9f9ad1558c77.png)

## システム環境設定で変更できる

1. システム環境設定
2. キーボード
3. 修飾キー

で設定画面へアクセスできます。

<img width="668" alt="スクリーンショット 2017-01-18 15.05.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/8405/18f3e11d-fddc-6fea-475c-c101a8ab3d25.png">

右下に「修飾キー」

<img width="668" alt="スクリーンショット 2017-01-18 15.05.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/8405/90ed0a36-d670-0b79-cd21-5f63d7389531.png">

開いたウィンドウで変更可能

<img width="671" alt="スクリーンショット 2017-01-18 15.06.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/8405/d1a21411-def2-fd5c-0a1d-1b1d94b2282b.png">

内蔵キーボードはもちろん、外部接続キーボードも変更可能です。
Cygwin環境作成、その4.5（閑話）

# なぜCygwinを使うのか
そもそもなぜCygwinなのだろうか。

といえばやはりbash、grep、find、sedなどのツールを使えるところにあります。でもほかにも似たようなことができるツール（競合）があるよね。僕はなぜCygwinを選ぶのだろう。
# これまでの遍歴
きっとこれまでの半生に答えがあるかもしれない。WindowsにXの画面を表示するようになった自らの経緯を振り返ってみた。
### 1999～2000年
仕事でLinuxサーバーを扱いはじめる。当初Windowsからつなぐのにコマンドプロンプト＋telnet→途中からHummingbird社の商用Xサーバーを使うようになった。今で言うブラックだったの1年で辞める。
### 2000～2004年
会社を移る。引き続きWindowsからLinuxを使うという環境。ただXサーバーは無くコマンドプロンプト＋telnetであった。
### 2004～2005年
ある時CygwinというフリーウェアにXサーバーの機能があることを知る。情報も少ない中頑張ってインストール。管理者権限不要なのも良かった。当時はfluxboxという軽量WMをビルドしてつかっていた。調子に乗ってあれこれビルドしていたのが懐かしい。Enlightenmentをソースからビルドしようとしたがどうしてもできなかったのも今となってはいい思い出。
### 2005～2012年
会社を移りLinuxにつなぐこともなくなった。
### 2012～2015年
同社にて調査系の仕事が増え、Windowsのコマンドでは対応できなくなる。各種分析・データ処理にRubyを使っていたが、もっと身軽に行いたくgrep、sedなどを使うことにする。当初Linuxサーバーにファイルを送り行っていたが、面倒になりckw＋nyaos＋MSYSという体制を組んだ。
### 2015～現在
会社を移る。Web系ゆえLAMP環境は必須、ばんばんLinuxつかう環境になる。Vagrantも使いまくり。手元であれこれするために久々にCygwinを使い始める。xfce4などWMも最初からインストールでき、apt-cygというインストールマネージャーもある、という至れり尽くせりぶりに隔世の感。
# 競合ツールとの比較
## Bash on Ubuntu on Windows
まだまだ情報がすくないです。マイクロソフト製とのことで、IEと同じくVer5くらいになるまで使えないのではないかという固定観念もあります。
## MSYS2
Cygwinよりも使いやすいと人気ですが意外と情報が少ないのです。以前使ったときにホームディレクトリが変な場所に作られたのが気持ち悪くって敬遠しています。またchocolatey使おうとあるのですが、ポータブル環境が良いです。
## 仮想環境上でのLinux
愛機がメモリ２GB、HDD100GBと非力なので厳しいです。起動も遅いです。また記憶があやふやですが、共有フォルダに向けてシンボリックリンクを張れなかったような。
## Docker
僕の目指す目的で使えるんでしょうか。どうなのでしょうか。興味ありますが勉強する時間がなく手を付けられていません。
## キーワード検索ヒット件数比較
仮想マシン以外の選択肢について、Googleでの検索したところ以下の通り。Cygwinの圧勝となっています。

１．Cygwin→ 4,160,000件
２．MSYS2→136,000件
３．”Bash on Windows”→179,000件（ダブルクォートで囲ったもの）
# 結論
あれこれ理屈こねてますが個人的好みでCygwinです。
Alfredの有料版を購入して覚えたこと・知ったこと


今更ながらAlfredの有料版を購入。
せっかくなので使い方を調べて知らなかった便利そうなものをまとめました。

## ファイル検索

- 先頭に`'`を入れてファイル検索
![Kobito.uE23j5.png](https://qiita-image-store.s3.amazonaws.com/0/25228/6192cd96-1321-ff1b-5fcd-d135d8a46ef4.png "Kobito.uE23j5.png")

## ディレクトリ検索
- 先頭に'~'を入れてユーザーディレクトリから検索
![Kobito.VXg9rW.png](https://qiita-image-store.s3.amazonaws.com/0/25228/9549f8b8-3648-5fd7-de49-6628d0741bc6.png "Kobito.VXg9rW.png")

## ファイルのバッファ
- `⌥↑`でバッファに追加
- `⌥←`で最後のアイテムをバッファから除く
- `⌥→`で全てのバッファアイテムに対してアクションを実行
- `⌥backspace`で全て削除
- 細かい設定は"Preferences" => "Features" => "File Search" から可能

![Kobito.aDgiwA.png](https://qiita-image-store.s3.amazonaws.com/0/25228/dfbf0110-ebe2-e3e6-7723-d7c4fe13bc04.png "Kobito.aDgiwA.png")

## その他
- `↑`で履歴を表示
- `→`でアクションの一覧
- ⌘Yでクイックルック

![Kobito.9PIejl.png](https://qiita-image-store.s3.amazonaws.com/0/25228/7d806aab-1693-307e-c004-27b0ca69732a.png "Kobito.9PIejl.png")


## 辞書

- 辞書の設定が可能
- デフォルトでは`define`で検索する

![Kobito.tK6Mde.png](https://qiita-image-store.s3.amazonaws.com/0/25228/9016b02f-d306-e334-27e7-aeb008692425.png "Kobito.tK6Mde.png")


## クリップボード履歴

- 細かい設定は"Preferences" => "Features" => "Clipboard" から

![Kobito.XX02oY.png](https://qiita-image-store.s3.amazonaws.com/0/25228/491ca867-4bf7-6fcc-b1b0-f0eda7133987.png "Kobito.XX02oY.png")

## スニペットの登録

- スニペットも登録できる

![Kobito.n425Rg.png](https://qiita-image-store.s3.amazonaws.com/0/25228/a1a0feec-007f-17b0-bc59-d3cb8c82481d.png "Kobito.n425Rg.png")

- "Automaically expand snippets by keyword"をオンにすれば、キーワードを入力すると自動でトリガーしてくれる
![Kobito.RJaSEn.png](https://qiita-image-store.s3.amazonaws.com/0/25228/c573e715-0578-c1a6-3779-faf618127189.png "Kobito.RJaSEn.png")

## Workflows

ワークフローもすごく便利。使い方やおすすめのワークフローは下記のリンクでだいたい十分。

- [開発におすすめの Alfred Workflows ○○選](http://qiita.com/DriftwoodJP/items/6bee03df0a0da499320a)

入れたもの貼っておく。

![Kobito.2MDvcm.png](https://qiita-image-store.s3.amazonaws.com/0/25228/786b967f-6e52-4c67-0b0a-e38d6ba3cc1f.png "Kobito.2MDvcm.png")


## その他参考リンク

AlfredのWorkflowsやThemeをさがしたければこちらへ。

- [Packal](http://www.packal.org/)


Alfredの使い方が分からなければこちらへ。

- [Alfred Help and Support](https://www.alfredapp.com/help/)