OmniAICreator/Qiita-1.07M huggingface dataset:
Zabbix3.0をインストールしてみる

# 環境
AWSのEC2に作ってみる。
LAMP環境を構築、Zabbixサーバをインストールしていく。
L：RHEL7.3
A：Apache　#バージョン未指定
M：MariaDB10.2　#MySQLから変えてみる
P：PHP5.6　#最新7.はZabbix未対応のようなので
バージョンは以下を参考に。
[http://www.zabbix.jp/documents/requirements](http://www.zabbix.jp/documents/requirements)
yumを使っていく。

# やってみる
##1.リポジトリを登録
・準備
`sudo su -`
`yum -y update`
・Zabbix
`rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm`
・EPEL
`rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/7/x86_64/e/epel-release-7-9.noarch.rpm`
・IUS
`rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/7/x86_64/ius-release-1.0-15.ius.el7.noarch.rpm`
・MariaDB

```/etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/rhel7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

##2.パッケージインストール
・PHP5.6で(Apacheも）
`yum install -y php56u`

・Zabbixサーバ
`yum install -y zabbix-web-mysql zabbix-web-japanese zabbix-agent zabbix-get`
※以前のバージョンから必要なパッケージが変更されている。zabbix zabbix-serverパッケージは指定不要。

・MariaDB
`yum -y install MariaDB-server MariaDB-client`

##3.初期設定
・MariaDB
MySQLサンプル設定ファイルをMariaDB設定ファイルへコピーして編集する
`ls -l /etc/my.cnf`
`ls -l /usr/share/mysql/my-*.cnf`
`cp -p /usr/share/mysql/my-large.cnf /etc/my.cnf.d/server.cnf`

```/etc/my.cnf.d/server.cnf
[client]
default-character-set = utf8    ###### 追加 
[mysqld]
character-set-server = utf8     ###### 追加
```
##4.MariaDB起動
・MariaDB
`systemctl enable mariadb`
`systemctl start mariadb`
`systemctl status mariadb`

##5.MariaDB初期設定
対話型ツールを使い、ルートユーザパスワード設定、デフォルトのテストDBの削除などを実行する
`mysql_secure_installation`

```
Enter current password for root (enter for none):   ###### Enter
Set root password? [Y/n] y   ###### y
New password:　######　パスワード入力
Re-enter new password:　###### パスワード入力
Remove anonymous users? [Y/n] y　　###### y
Disallow root login remotely? [Y/n] y　###### y
Remove test database and access to it? [Y/n] y　###### y
Reload privilege tables now? [Y/n] y　###### y
```

##6.データベース作成
`mysql -u root -p`
`mysql> CREATE USER zabbix;`
`mysql> CREATE DATABASE zabbix;`
`mysql> GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY 'DBパスワード';`
`mysql> FLUSH PRIVILEGES;`
`mysql> exit`

##7.テーブル作成と初期データを投入
`cd /usr/share/doc/zabbix-server-mysql-3.0.10/`
`zcat create.sql.gz | mysql -u root -p zabbix`

##8.設定ファイル編集いろいろ
・Zabbixサーバ

```/etc/zabbix/zabbix_server.conf
DBパスワードを設定
 DBName=zabbix
 DBUser=zabbix
 DBPassword=DBパスワード
```

・PHP設定ファイル
タイムゾーンを日本へ
`sed -i -e "s/;date.timezone =/date.timezone = Asia\/Tokyo/g" /etc/php.ini`

・Apache設定ファイル
タイムゾーンを日本へ

```/etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Tokyo   ###### 追記
```

・SELinuxを無効化
`getenforce`
`setenforce 0`

```vim:/etc/selinux/config
SELINUX=permissive
```

##9.起動
Apache
`systemctl enable httpd`
`systemctl start httpd`
Zabbix agent
`systemctl enable zabbix-agent`
`systemctl start zabbix-agent`
Zabbix server
`systemctl enable zabbix-server`
`systemctl start zabbix-server`

##10.完了！
http:// zabbixサーバアドレス /zabbix
で初期セットアップGUIへログインできます
ID:Admin
PW:zabbix

参考：
MariaDB
[https://downloads.mariadb.org/mariadb/repositories/](https://downloads.mariadb.org/mariadb/repositories/)
ExpressからJadeに渡したObjectをeachで使用する

ExpressのテンプレートエンジンをJadeで使用した際につまったので記載。 
 
違いがわからないので、ご指摘いただければありがたいです。  


##詰まったところ
jadeを学習にあたって、以下の記事を参考にさせていただいた。  

https://gist.github.com/japboy/5402844
http://qiita.com/sasaplus1/items/189560f80cf337d40fdf

each構文を使用する際に、jadeファイルの中で連想配列を書くのではなく、Expressから連想配列を渡した際にeach構文がコンパイルエラーになった。  

###index.js
```javascript
/*jade練習用のオブジェクト */
var package = {
  title: '最高にクールなホームページ',
  description: '最高にクールなホームページです。見ないと損です。',
  keywords: [
    '最高',
    'クール',
    '世界一',
    '天才'
  ],
  robots: [
    'INDEX',
    'FOLLOW',
    'NOODP',
    'NOYDIR',
    'NOARCHIVE'
  ]
};


/*jade練習用のページ */
router.get('/practicejade', function(req, res, next) {
  res.render('practicejade',{package:package});
});
```
###practice.jade(修正前)
以下は、コンパイルエラーとなる。  

```jade
doctype html
html
  head
    meta(charset='UTF-8')
    title 最高にクールなホームページ
    link(rel='stylesheet', href='./css/app.css')
  body
    h1 最高にクールなホームページ
    p 最高にクールなホームページへようこそ。
    ul
      each val,key in #{package}
        li= key + ':' + val
```

下記のように修正すると問題なく参照できた。  

```jade
doctype html
html
  head
    meta(charset='UTF-8')
    title 最高にクールなホームページ
    link(rel='stylesheet', href='./css/app.css')
  body
    h1 最高にクールなホームページ
    p 最高にクールなホームページへようこそ。
    ul
    //inに直接オブジェクトを記載すると、コンパイルエラーになる。
      一旦、変数として定義してあげると問題ない。
      each val,key in #{package}
        li= key + ':' + val
  
    -var hoge = package
      each val,key in hoge
        li= key + ':' + val

```
[小ネタ]最近のコンピュータではINT32_MAX回のループでも意外と回ると気づいた話

32ビット整数の最大値って、とてつもなく大きい印象があったのですが。
そして、そんなすごい回数のループなんて、全然終わらない、という印象があったのですが。

家にある、数年前のCore i5のパソコンで、なんとなくやってみました。
最適化などのオプションは何もつけてません。

```c
#include <stdio.h>
int main() {
    int i;
    long long s = 0;
    for(i=0;i<0x7FFFFFFF;i++) s += i;
    printf("%lld\n", s);
}
```

```
$ time ./a.out 
2305843005992468481

real    0m5.063s
user    0m5.062s
sys     0m0.000s
```

もちろん、ループの中が重くなれば、どうなるかは想像に難くないですが。
例えば、以下のように、少し重くするだけで、

```c
#include <stdio.h>
int main() {
    int i;
    long long s = 0;
    for(i=0;i<0x7FFFFFFF;i++) if(i%2) s /= i;
    printf("%lld\n", s);
}
```

```
$ time ./a.out 
0

real    0m14.842s
user    0m14.780s
sys     0m0.007s
```

と、時間も増えてしまいました。

さて。0〜INT32_MAX-1の間で、平方根が整数になるものを力技で求めてみましょう。
(普通は、こんな効率悪い計算せずに、整数を2乗することで求めるかと思いますが)

```c
#include <stdio.h>
#include <math.h>
#include <float.h>
int main() {
    int i;
    for(i=0;i<0x7FFFFFFF;i++) {
        double d = sqrt(i);
        if(fabs(d - (int)d) < DBL_EPSILON) printf("%d\n", i);
    }
}
```

```
$ time ./a.out
(略)

real    0m30.276s
user    0m30.049s
sys     0m0.070s
```

意外と、できるものですなぁ。

例えばこれを、競技プログラミングなどで使うには、ただの足し算で5秒というのは、あまりに遅すぎるでしょう。
けれど、こんな無茶苦茶な力技でも、たまに動かす処理や、夜の間に終わればいい処理に使うなら、それなりに現実的な時間で動きました。
とはいえ、ループの中が重くなると、一気に重くなることは目に見えているので、利用できる場面は果たして存在するのか、というくらい少ない気はしますが。
PostCSSでCSSを変換

# PostCSSってなんなん
[PostCSS](https://github.com/postcss/postcss)はcssパーサでノードツリーを操作するAPIを提供しています。cssに対する変更を加えません。変更はpluginが行います。やりたいことに合わせてpluginを組み合わせて使います。

## PostCSS Plugins
pluginは以下に記載があります。

[PostCSS plugins](https://github.com/postcss/postcss/blob/master/docs/plugins.md)

# 使ってみる
今回は、gulpからPostCSSとpluginの[Autoprefixer](https://github.com/postcss/autoprefixer)を使ってみます。
このpluginはvender prefixを自動で付与してくれるものになります。

## 環境

| 項目 | version |
| :-- | :-- |
| node | 8.2.1 |
| gulp | 3.9.1 |
| gulp-postcss | 7.0.0 |
| autoprefixer | 7.1.2 |

## install
gulpは導入済みで記載しています。

```
npm install --save-dev gulp-postcss autoprefixer
```

## gulpコード

``` js
'use strict';

var gulp = require('gulp'),
    postcss = require('gulp-postcss');

// apply PostCSS plugins
gulp.task('css', function() {
  return gulp.src('css/test.css')
    .pipe(postcss([
      require('autoprefixer')({})
    ]))
    .pipe(gulp.dest('dest/css/test.css'));
});
```

## 変更前CSS
Codepenで公開されている内容のcssの一部を抜き出したものを使います。
[もとのコード](https://codepen.io/Lewitje/pen/BNNJjo)

``` css
.bg-bubbles {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
}
.bg-bubbles li {
  position: absolute;
  list-style: none;
  display: block;
  width: 40px;
  height: 40px;
  background-color: rgba(255, 255, 255, 0.15);
  bottom: -160px;
  border-radius:50%;
  animation: square 25s infinite;
  transition-timing-function: linear;
}
```
※border-radiusだけ足してみました。

## 変更後css

``` css
.bg-bubbles {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
}
.bg-bubbles li {
  position: absolute;
  list-style: none;
  display: block;
  width: 40px;
  height: 40px;
  background-color: rgba(255, 255, 255, 0.15);
  bottom: -160px;
  border-radius:50%;
  -webkit-animation: square 25s infinite;
          animation: square 25s infinite;
  -webkit-transition-timing-function: linear;
          transition-timing-function: linear;
}
```

# 参考
[PostCSSとは何か](http://sssslide.com/speakerdeck.com/jmblog/postcss-tohahe-ka)
VBoxLinuxAdditions.run を実行して Could not find the X.Org or XFree86 Window System, skipping. になった時の対応方法

*環境*

- VirtualBox : 5.1.26 r117224 (Qt5.6.2)
- インストールするVirtualBox Guest Additions : 5.1.26 r117224
- ホストOS : macOS Sierra Virsion 10.12.5
- ゲストOS : CentOS Linux 7.3.1611(Core)

### 事象
VirtuaBoxをアップデートしました。
なので Guest Additions を今一度インストールした時のことでした。

```shell-session
$ sudo sh mnt/cdrom/VBoxLinuxAdditions.run 
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.26 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Removing installed version 5.1.22 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Starting the VirtualBox Guest Additions.

Could not find the X.Org or XFree86 Window System, skipping.
```

最後の `Could not find the X.Org or XFree86 Window System, skipping.` は何だろう？
[前回インストールした時](http://ponsuke-tarou.hatenablog.com/entry/2017/07/23/175358#マウントしてインストールします)には出力されていませんでした・・・何だろう？

### 原因 : X Windowがインストールされていないから
X Window ってなに？
> 本来はキーボードだけでぺちぺち操作するUNIX系のOS（Linuxとか）を、マウスをぐりぐりして操作するWindowsっぽい使い勝手にしてくれるやつ（のひとつ）
> [X Window Systemとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word13660.html)

### 対応 : 「無いから飛ばしたよ」と言っているだけでエラーではないので気にしない
> I also got the error you mention ("Cannot find the X.Org or XFree86 Window System, skipping) but that's just a warning. That's why it says "skipping". It simply skipped installing the parts of the guest additions that deal with X. The rest was installed correctly.
> [centos - Installing VBox Guest Additions when there is no X-server - Unix &amp; Linux Stack Exchange](https://unix.stackexchange.com/questions/206505/installing-vbox-guest-additions-when-there-is-no-x-server)
Alpine Linux で日本語が文字化けしないようにNotoSansCJKjpを入れる

## 問題

Alpine上のブラウザでキャプチャとか取る時に、日本語フォント部分が文字化けしちゃっている。こんな感じで。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/84144/6a9e7d01-8534-7572-2114-158f37305733.png)

## 環境

```bash
/ # cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.6.0
PRETTY_NAME="Alpine Linux v3.6"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
```

## 解決

デフォルトで日本語フォントが何も無いようなので、何か入れる必要があります。

とりあえずこれを流しといたら直るかもしれません。

```bash
apk update \
  && apk add --no-cache curl fontconfig \
  && curl -O https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \
  && mkdir -p /usr/share/fonts/NotoSansCJKjp \
  && unzip NotoSansCJKjp-hinted.zip -d /usr/share/fonts/NotoSansCJKjp/ \
  && rm NotoSansCJKjp-hinted.zip \
  && fc-cache -fv \
```

`fontconfig`というパッケージを入れると`fc-list`や`fc-cache`といったコマンドが使えるようになります。あまり良くわかってないですが、こんなことができます。

- `fc-list` 利用可能なフォント一覧を表示
- `fc-cache -fv` 利用可能なフォントを更新

フォントは`/usr/share/fonts/<好きなディレクトリ名>/...`な感じで置いておけば大丈夫そうです。今は、`/usr/share/fonts/NotoSansCJKjp/*.otf`となるように配置しました。

`fc-cache -fv`でフォント情報を更新します。

```bash:
/usr/share/fonts/NotoSansCJKjp: caching, new cache contents: 9 fonts, 0 dirs
```

上記を流した結果はこんな感じになりました。日本語になってる！！

![1.png](https://qiita-image-store.s3.amazonaws.com/0/84144/d056e3f2-08a3-75d9-aa7e-c4e57675925c.png)

## 試してないけど思ったこと

Mac上のローカルなdockerでalpineイメージを使う場合は、`-v ~/Library/Fonts:/usr/share/fonts/Fonts`とかすると全部持っていけるので、こっちの方がいいかも。ローカルでは。

## 効かない時

CSSがいじれる環境なら最低限`font-family: sans-serif`（もしくは、ダイレクトに`font-family: 'Noto Sans CJK JP'`）と設定する必要があります。自作Webアプリケーションとかの場合に、この指定をしておくといいかなと思います。
mintty * tmux で、開発サーバにssh接続した際に自動的に背景色を変える

# コマンドを実行するホストを間違ってしまったときの恐怖。。。

今接続しているのって開発サーバだっけ？ステージングサーバだっけ？本番だっけ？
ターミナルを複数起動しているときってドキドキしませんか？僕はします。

きちんと接続先ホストや実行するコマンドを確認すれば問題ないんですがやっぱり不安です。
僕は普段mintty * tmuxで作業するのでウィンドウ名を自動的に切り替えることで誤操作をなくそうとしていました。

- [tmuxで「ssh接続時」「ssh切断時」に対象windowを指定した上で、自動でwindow名を変更する](http://qiita.com/shima_6_you/items/5a2a11f0acf9400649cb)

ただこの方法だと以下の問題が有り正直使いにくいです。
1. ウィンドウ名がそんなに目立たない
![image_20170730_050355.jpg](https://qiita-image-store.s3.amazonaws.com/0/154029/130c0e31-16de-eb3f-fa40-cbcc49a6fbdb.jpeg)
2. 同一ウィンドウで複数ペインを起動している場合にわけがわからない
左側は本番環境。右側はローカル環境ですがウィンドウ名は「本番環境」となっています。
![image_20170730_050525.jpg](https://qiita-image-store.s3.amazonaws.com/0/154029/d95687f4-01ec-5c28-b4a0-3c5df84217b8.jpeg)

# ウインドウ名ではなくもっと目立って、ペイン単位の何かの情報を変更しよう

背景色を変えてみようと思います。ドキュメントにもしっかりやり方が載っていますね。
http://man.openbsd.org/OpenBSD-current/man1/tmux.1#select-pane
> The colour is one of: black, red, green, yellow, blue, magenta, cyan, white, aixterm bright variants (if supported: brightred, brightgreen, and so on), colour0 to colour255 from the 256-colour set, default, or a hexadecimal RGB string such as ‘#ffffff’, which chooses the closest match from the default 256-colour set.

こんな感じでかんたんに背景色が変更できます。
`tmux select-pane -P 'bg=Red'`
各々の環境の文字色に合わせて見やすい色を探すことをオススメします。

# sshで接続したときに自動的に背景色を変える

- [tmuxで「ssh接続時」「ssh切断時」に対象windowを指定した上で、自動でwindow名を変更する](http://qiita.com/shima_6_you/items/5a2a11f0acf9400649cb)
を応用してみます。

```sh:~/.bashrc
function ssh() {
    # tmux起動時
    if [[ -n $(printenv TMUX) ]] ; then
        # 現在のペインIDを退避
        local pane_id=$(tmux display -p '#{pane_id}')
        # 接続先ホスト名に応じて背景色を切り替え
        if [[ `echo $1 | grep '\.production\.'` ]] ; then
            tmux select-pane -P 'bg=colour52,fg=white'
        elif [[ `echo $1 | grep '\.staging\.'` ]] ; then
            tmux select-pane -P 'bg=colour58,fg=white'
        elif [[ `echo $1 | grep '\.dev\.'` ]] ; then
            tmux select-pane -P 'bg=colour95,fg=white'
        fi

        # 通常通りssh続行
        command ssh $@

        # デフォルトの背景色に戻す
        tmux select-pane -t $pane_id -P 'default'
    else
        command ssh $@
    fi
}
```

sshで接続する際のホスト名に、開発環境の場合は`.dev.`、ステージング環境の場合は`.staging.`、本番環境の場合は`.production.`という文字列を含むようにしているのでそれに合わせてif文で処理を分けます。
いろいろ試した結果こんな色に落ち着きました。指定している色の値は↑のコードをご確認ください。

![image_20170801_001141.jpg](https://qiita-image-store.s3.amazonaws.com/0/154029/14da03f4-42d1-658c-a2b9-eb6bb0a6ea9a.jpeg)
モーダルで表示したUIWebView上のアラートが閉じたときにUIWebViewも道連れにされた話

## 環境
Swift2.3, Xcode8.2, iOS 10。

## 起こった現象

* `baseViewController`上で`UIWebView`を保持する`modalViewController`をモーダル表示
* `UIWebView`で開いたwebページ上のfileタグを押下
* `UIAlertController`がモーダルで表示される
* いずれかの項目を選択し、`UIAlertController`が閉じる際に`modalViewController`も閉じ、`baseViewController`が再び表示される。

## 起こる原因と回避方法

>The presenting view controller is responsible for dismissing the view controller it presented. If you call this method on the presented view controller itself, UIKit asks the presenting view controller to handle the dismissal.

>If you present several view controllers in succession, thus building a stack of presented view controllers, calling this method on a view controller lower in the stack dismisses its immediate child view controller and all view controllers above that child on the stack. When this happens, only the top-most view is dismissed in an animated fashion; any intermediate view controllers are simply removed from the stack. The top-most view is dismissed using its modal transition style, which may differ from the styles used by other view controllers lower in the stack.

>If you want to retain a reference to the view controller's presented view controller, get the value in the presentedViewController property before calling this method.

[AppleのAPIリファレンス](https://developer.apple.com/reference/uikit/uiviewcontroller/1621505-dismissviewcontrolleranimated)より引用。
`UIAlertController`の`dismissViewControllerAnimated`が呼ばれた際に、
`modalViewController`の`dismissViewControllerAnimated`も呼ばれるのが原因ぽい。**二重にモーダル表示していれば、`UIWebView`の有無関係なしに起こる**はず。
`UIAlertController`の`dismissViewControllerAnimated`では`modalViewController`の処理が走らないようにするため、リファレンスの言うとおりに**`modalViewController`自身がモーダルを表示している場合のみ**閉じる処理が走るようにする。

```
override func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
    if nil != self.presentedViewController {
        super.dismissViewControllerAnimated(flag, completion: completion)
    }
}
```

## 閉じるボタンが効かなくなった
```
// 閉じる
@objc private func close() {
    self.dismissViewControllerAnimated(true, completion: nil)
}
```
モーダルの閉じるボタンをこんなコードで実装していたら、効かなくなってしまったので、フラグで制御して改善した。


## できあがったコード
```swift:WebViewController.swift
final class WebViewController: UIViewController {
    
    // 閉じるボタンが押されたフラグ
    private var closeBtnFlag: Bool = false
    
    @IBOutlet private weak var webView: UIWebView!
    
    /*
     中略
     */
    
    // 自身の上に重なって開いたモーダルなviewControllerが閉じた際、自身まで一緒に閉じるのを避ける
    override func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
        if self.closeBtnFlag || nil != self.presentedViewController {
            super.dismissViewControllerAnimated(flag, completion: completion)
            self.closeBtnFlag = false
        }
    }
    
    // 閉じる
    @objc private func close() {
        // フラグを立てて閉じる
        self.closeBtnFlag = true
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}
```

## 参考
http://stackoverflow.com/questions/25942676/ios-8-sdk-modal-uiwebview-and-camera-image-picker
機械学習論文読みメモ_83


[REINFORCEMENT LEARNING WITH UNSUPERVISED AUXILIARY TASKS](https://arxiv.org/abs/1611.05397)
Deep reinforcement learningにおいてagentは累積利得の最大化を直接行う手法が高性能を収めてきた。
しかしながら探索する環境は非常に多様であるため効率的な探索は難しい。
本論では、累積利得最大化以外にも、擬似的な利得関数も最大化する手法を提案する。
このようなタスクは、教師なし学習のように、外部から与えられる利得がなくとも発展させられるような特徴を共有している。
そうして得られる特徴表現の上に、さらに外部的に与えられる利得関数へfocusできるようなメカニズムを提案する。
これにより、素早く与えられたタスクに適応できるようになる。

[Deep Variational Inference Without Pixel-Wise Reconstruction](https://arxiv.org/abs/1611.05209)
Variational autoencoderは最近において一般的な生成モデルとなっている。
このモデルは従来、事後分布を柔軟かつ高精度に近似するために用いられてきた。
しかしながら、性能に制約を与えてしまうpixel wiseの再構成を行う必要性を回避するために研究はあまりされてこなかった。
本論ではこれに対して、real-valued non-volume preserving transformations (NVP)を用いる事で潜在変数に対するデータの条件付き確率をexactに計算する事を可能にした。
Real NVPはヤコビアンが簡単に計算できるような可逆な非線形変換を用いる事でデータに対する条件付き確率を正確に計算する事を可能にする。

[Weakly Supervised Top-down Salient Object Detection](https://arxiv.org/abs/1611.05345)
Objecti detectionのようなタスクに対して、ある特定の場所でピークを持つような確率分布を学習するモデルとしてTop-down saliencyモデルがある。
Top-down saliencyモデルは画像内で探している物体に近いものを探し出す手法の一つである。
こうしたモデルはピクセルレベルでアノテーションされたデータを利用した教師あり学習として構築される。
本論ではある場所に物体が存在するかどうかを示す２値ラベルを予測するような弱教師あり学習フレームワークを提案する。
この手法は、backtracking strategyを用いたtop down saliencyの生成過程において、画像内の各領域が確率的にCNN画像分類器の判断へ影響を与える。
またパッシブに与えられた刺激（情報？）ベースに予測する高速なbottom-up saliency情報を利用する事で、top-down taskに対応した最適なsaliency mapを生成可能にする。
機械学習論文読みメモ_85


[Building Deep Networks on Grassmann Manifolds](https://arxiv.org/abs/1611.05742)
Grassmann manifoldは少ないサンプルの画像や動画の認識タスクにおいて、そのデータ表現の手法として用いられる。
本論ではこの多様体表現上におけるdeep neural net構造を提案する。
この構造では、grassmannian inputに対して、それをより望ましい特徴表現に変える層、それをさらに正規化する層、Grassmannian contextに対応したmodel complexityを低減させる層、そして最後の出力されたGrassmaninan表現を通常のユークリッド表現に変える層、を持つ。
このモデルは多様体に対応したstochastic gradient descentを用い、また行列に一般化した誤差伝搬を利用することで構造的なデータにも対応可能になる。

[PolyNet: A Pursuit of Structural Diversity in Very Deep Networks](https://arxiv.org/abs/1611.05725)
CNNにおいてその幅と深さを増やしていく事は性能向上へ有効である。
しかし深さを増やしすぎると勾配情報の逓減と学習の困難化、幅を増やすと二次関数的にモデルサイズが増加するなどの問題がある。
本論ではこの問題を回避するために新たな軸としてstructrual diversityに基づいたモデル拡張を提案する。
ここでは、polyinceptionと呼ばれるモジュールを導入する。
この構造は単独で、あるいは他の構造の代替としてネットワークは入れ込む事ができる。
polyinceptionを用いる事で、計算コストを抑えつつも表現力を向上させる事ができる。

[Combinatorial Energy Learning for Image Segmentation](https://arxiv.org/abs/1506.04304)
画像に条件付けられたセグメンテーションのconditional energyをモデル化するニューラルネットによるsegmentation手法を提案する。
Combinatorial energy learning for image segmentation (CELIS)は、dense image segmentation問題の持つ組み合わせ問題的な側面にフォーカスを当てる。
提案モデルは、エネルギー関数をモデル化し、このエネルギー関数をsupervoxel agglomeration空間において局所最適化を行う。
本モデルはグラフベースの従来手法よりも高性能になった。
機械学習論文読みメモ_84


[Stochastic Gradient Descent in Continuous Time](https://arxiv.org/abs/1611.05545)
連続時間モデルにおけるstochastic gradient descent手法を扱う。
従来はbatch optimizationなどの最適化手法が用いられるが、長い期間において観測が得られるlarge dataの設定においては適用が難しい。
Stochastic gradient descentを利用する場合には、stochastic differential equationを満たすような更新則を用いてオンラインのパラメータ更新を行う。
この手法は自然な連続時間動的モデルに関する目的関数に対して局所最適に収束する事を示した。
この証明には長い期間におけるパラメータ発展をポアソン過程を用いて記述し、そのergodicityを利用する。

[AutoScaler: Scale-Attention Networks for Visual Correspondence](https://arxiv.org/abs/1611.05837)
局所特徴間の関係を発見する事はcomputer visionにおいて重要である。
より大きなスケールのコンテクストにおいて特徴を捉える事で判別性能の改善が期待できるが、それら特徴の空間的な位置の把握が難しくなる弊害がある。
本論で提案するAutoScalerはこのトレードオフを最適化するためのscale attentionネットワークである。
こんもネットワークは共有された重みを用いてマルチスケールの特徴抽出を行い、最適な形で組み合わせる。
このネットワークを利用する事で異なったスケールの入力に対して適応的なreceiptive fieldを用いる事ができる。

[LEARNING TO REINFORCEMENT LEARN](https://arxiv.org/abs/1611.05763)
強化学習は人間を超える性能を出す事に成功したが、そのためには大量の訓練データが必要になる。
その解決策の一つとして異なったドメインに対して高速に適応する技術の考案が考えられる。
このための手法として本論ではdeep meta-reinforcement learningを提案する。
従来手法では、RNNを教師あり学習のコンテクストで利用する事でメタ学習と共に利用できる事を示した。
この方法は、RNNに対して複数のタスクを逐次的に与えていくタスクを考え、ただし補助入力として過去の入力に対する望ましい出力情報も同時に与える、という設定で通常の誤差伝搬を用いて学習を行う。
得られるモデルは重み更新に依存せずRNNのダイナミクスそのものに基いて新たなタスクに高速で適用可能になる。
これらは教師あり学習であるが、本論ではこれを強化学習のコンテクストへ拡張した。
この設定では、過去の入出力を補助入力として与える代わりに、メタ強化学習モデルを与え、その過去の行動とそれに対する利得を補助入力として与える。この利得情報はメタ強化学習モデル自身にも与えられ学習に用いられる。
得られるモデルは、教師あり学習の場合と同様、RNNのダイナミクスに基いて新たなタスクへの高速な適応が可能になる。
これは実質RNNが強化学習を中に実装している事になり、また面白い事に、このRNNを学習するために用いられたメタ強化学習モデルと比較して異なった構造を持つ強化学習スキームがRNN内に学習される事が分かった。
機械学習論文読みメモ_88


[Variational Information Maximization for Feature Selection](http://papers.nips.cc/paper/6443-variational-information-maximization-for-feature-selection.pdf), NIPS2016
特徴選択問題は機械学習領域の古典的な問題である。
従来手法では、対象ラベルと入力特徴subset間の相互情報量を最大化するように特徴選択を行う手法などがある。
実際には、相互情報量を厳密に計算する事は難しいため、近似的な手法が主に用いられてきた。
しかしそのために置かれる仮定は、非現実的である。
本論では、より柔軟性が高く一般的な仮説を変分推論の枠組みで置くことで、相互情報量の下界を計算可能にした。
この手法は特徴選択問題に対する新たなアプローチを開拓し、例えば、特定のグラフモデルに関しては適切な提案分布を用いる事で最適である事を示せた。

[Learning User Perveived Clusters with Feature-Level Supervision](http://papers.nips.cc/paper/6259-learning-user-perceived-clusters-with-feature-level-supervision.pdf), NIPS2016
Semi-supervised clustering問題では、ユーザーから与えられる情報を援用する事で、その情報も考慮したデータのクラスタリング結果を獲得する問題である。
従来こうした設定では、ユーザー情報はinstanceレベルで与えられるため、featureレベルの情報を扱うものは少なく、また偏ったサンプルへ情報が与えられる事によるsampling biasの影響がある。
本論ではfeatureレベルの情報を扱うための手法を提案し、preveption vectorを用いる事で広い範囲んもapplicationへ適用可能な形え与えられた情報を表現する。
この情報と従来のinstaneベースの情報を組み合わせてクラスタリングを可能にするPerception Embedded clusteringを提案する。

[Deep Learning without Poor Local Minima](http://papers.nips.cc/paper/6111-deep-learning-without-poor-local-minima.pdf), NIPS2016
本論では、1987年と2015年に発表された予想の証明、及びopen problemに対する部分的な答えを与える。
Squared loss functionを持ついかなる幅、深さを持つ線形ネットワークに対して、そのネットワークは非凸、あるいは凹であり、全ての局所解は全所解であり、全所解でない極値は鞍点であり、三層より大きなネットワークではHessianが負値を持たないような鞍点が存在するが、三層以下の場合はそれが存在しない事を示した。
また非線形ネットワークに関しても、最近の研究において用いられているindependence assumptionを用いた線形ネットワークへのreductionにより同様の事を導く事が可能である。
以上の結果から、deep learningモデルは理論的にどれくらい学習が困難か？という問いに対して答える事ができる。
それは、従来の機械学習モデルよりは非凸、凹性のため難しいが、悪い局所解が存在しないためそこまで難しい訳ではないという事である。
しかしながら、上記の理論的見地を持ってしても、未だ実際と理論の差は大きい。
機械学習論文読みメモ_87


[Interpretable Distribution Features with Maximum Testing Power](https://arxiv.org/abs/1605.06796), NIPS2016
確率分布に対するsemimetricsを２つ提案する。
空間的、あるいは周波数的な位置に基いて評価される解析的関数の期待値の差の和を用いてこれらは計算される。
特徴量は分布間の分類しやすさを最大化するように選ばれる。
この分類しやすさは検定力の下界を用いて評価される。
結果として、２つの分布が局所的にどのようにどこで違っているかを理解しやすく、かつparsimoniousである。
統計力の指標は経験的にサンプルサイズが増加するほど収束し、その質を担保できる。

[Domain Separation Networks](https://arxiv.org/abs/1608.06019), NIPS2016
データ収集及びそのラベルコストは、機械学習の新たなデータ、タスクへの適用を妨げる。
この問題を軽減する手法の一つとして自動的にラベル情報が生成可能な人工データの利用が考えられる。
しかしながらこうした手法は人工データと実際データとの差異を上手く埋める事が出来ないでいる。
この問題への対処としてdomain adaptationがダジであると言われている。
従来手法は主に他領域から対象領域への写像を考えたり、領域間の重要でない差異に関しては不変な特徴を学習する、といった手法が取られている。
しかしこうした手法は個々の領域独自の特徴を無視してしまう。
本論では、個々の領域独自の特徴を明らかにする事で、領域間で不変な特徴を効率良く学習できるを仮説を立てた。
Private-shared component analysisを考え方を援用する事で、提案手法は陽に各ドメイン固有の特徴空間とドメイン間で共有される特徴空間を切り分ける事を可能にした。

[Stochastic Online AUC Maximization](https://papers.nips.cc/paper/6065-stochastic-online-auc-maximization)
AUCはimbalanceな分類データに関する分類モデルの評価指標として用いられてきた。
このAUCを最大化するような大規模データに対するオンライン学習手法は重要である。
従来手法は、対照的な２クラスのサンプルペアを用いた目的関数を設定する事で学習を行い、そのためspace, time complexity共にスケールしづらかった。
本論ではまず、AUC最大化問題が等価なconvex-concave saddle problemとして記述できる事を示した。
そしてこのsaddle表現に基づいたonline stochastic algorithmを提案する。
機械学習論文読みメモ_86


[Swapout: Learning an ensemble of deep architectures](https://arxiv.org/abs/1605.06465), NIPS2016
swapoutと呼ばれる、resnetよりも高性能なモデルを提案する。
swapoutはresnet, dropout, stochastic depthなどを含めたrichな構造セットからサンプリングを行う。
swapoutは正則化の機能として見た時に、dropoutのようなニューロン間のco-adaptationを防ぐ役割だけでなく、層間のco-adaptationを防ぐ効果がある。
これはswapoutが暗に層間のパラメータを関連付ける事ができる事に起因している。
またアンサンブル手法として捉えた時、従来手法よりも豊富な構造パターンを利用する事が可能になるため、表現力が向上している。
提案手法では従来のdropoutなどと繋がっており、かつそれ以外の豊富な構造も探索していく事が可能である。

[Fast and Provably Good Seedings for k-Means](https://papers.nips.cc/paper/6478-fast-and-provably-good-seedings-for-k-means). NIPS2016
kmeansにおけるseeding、つまりクラスタ中心の初期位置の決定は、性能向上のために重要である。
最近のsotaであるkmeans++によるseedingはしかしながら逐次処理に拠っており、またｋ個のクラスタ全てに対して計算が必要な事から大規模データには向いていない。
最近の研究によりMCMCを用いる事によりkmeans++のためのseedingを良く近似できる事がわかってきた。
しかしこの手法はデータの分布を仮定する必要がある。
そこで本論ではデータ分布を仮定する事なく良いクラスタリング結果を保証できるようなseeding手法を提案する。
本手法は計算コストと結果の精度に関するトレードオフを描き出す事ができる。

[Unsupervised Domain Adaptation with Residual Transfer Networks](https://arxiv.org/pdf/1602.04433.pdf), nips2016
推論対象となるデータに対するラベルが得られていない場合において、ラベル得られているドメインのデータからdomain adaptationを利用した学習を行う事が効果的である。
本論では新たな手法として、ラベルのあるデータとないデータを同時に利用し、適応的な分類器と転移可能な特徴を同時に学習する。
従来の２つのドメイン間でのshared-classifier仮定を緩め、代わりにresidual functionを用いる事で２つのドメイン間の差異を表現する。
提案モデルでは、対象ドメインのデータを利用しresidual functionによって陽に対象ドメインに適応した分類器を学習する。
Feature adaptationは各層の特徴をテンソル積により組み合わせて表現し、それをRKHSへ埋め込み其の上でマッチングを行う事で実現した。
PHPでechoやprintの内容を出力せず変数に格納したい件

どうも私です。
表題の件、普段ならそんなことしない（したくない）のですが、やらざるを得ない時があるのです…。

# 出力制御関数を使う

流れとしては出力制御関数で一度内容を蓄積（バッファ）させて解放する際にその蓄積した内容を変数で受け取っている感じです。
実際ソースを実行してみましょう。

```PHP:echo_buffer.php
<?php

function output(string $t) {
	echo $t;
}

echo "Hallo " . output('World!') . "\r\n";

ob_start();
output('World!');
$text = ob_get_clean();

echo "Hallo {$text}\r\n";
```

結果：

```
World!Hallo 
Hallo World!
```

後の「Hallo World!」は正しく「Hallo World!」になってますが
最初の「Hallo World!」は「World!Hallo 」になっちゃいましたね。
echo "Hall よりも先にoutput関数内にある echo $t; が先に実行されちゃってるのが原因です。
output関数の書いてある位置を後ろに持ってきても上記の理由で結果は同じ事になります。

# で、コレの使いどころは…？

ここからはWordPressの話になりますが、テンプレートの作成でPHPタグまみれにしたくなかったので一度変数に受け取ってヒアドキュメントで出力しようと考えたわけですがWordPressの[wp_head](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_head)関数はechoしまくられてるため上記の現象が発生してしまいます。

これでは思い通りの表示にはならないのでさっきの出力制御関数を上手く使ってやり過ごすことが出来たわけです。
簡単なコードを書いてみました。（PHP 7以上）

```PHP:get_buffer.php
<?php
/*
Copyright 2017 STS2657(STSynthe)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
function get_buffer(callable $func_name, array $args = [null]):string {
    ob_start();
    call_user_func_array($func_name, $args);
    return ob_get_clean();
}
```

追記：コメントより指摘があったので修正

以上のコードをfunctions.phpに記載しておくなどして、wp_headの内容が欲しい所でget_buffer('wp_head');の返り値を受け取れます。

# 参考文献
- [How do I capture the result of an echo() into a variable in PHP? - Stack Overflow](https://stackoverflow.com/questions/4060545/how-do-i-capture-the-result-of-an-echo-into-a-variable-in-php)
JavaScript で改行コードを含むすべての文字にマッチさせる

改行コードを含むすべての文字にマッチさせたい場合、
単純に`[\s\S]`で出来ます。
JavaScriptでは、`[^]`でも同じことが出来ます。

```JavaScript
string = "1234\nabcd\n \f\n\r\t\v\n";
result = string.replace(/./g, ".");
console.log(`1\n${result}`);

result = string.replace(/[\s\S]/g, ".");
console.log(`2\n${result}`);

result = string.replace(/[^]/g, ".");
console.log(`3\n${result}`);
```

出力

```text
1
....
....
..

..
2
.................
3
.................
```

`[^]`は、空文字以外とマッチという事なのでしょうか?
Electronを使ったアプリのインストールが失敗への対処法

Electronで作られたアプリが最近増えてきてますが、
インストールに失敗して原因がよくわからなかったときに
色々調べて対処したことを備忘録として書き残します

# 対象

- Electron製アプリを使ってるor使おうと思ってる
- Electronアプリを作ろうと思ってる
- ATOM使っててBoostnote使おうとしたらインストール失敗した方

以上に該当する方向けです。

# 事の発端

## Boostnote使おうと思ったらインストールできねえ

最近、巷で地味に話題に上ってきているBoostnoteですが、
ちなみに[*Boostnoteなんぞやって方はこちらへ*](http://niisi.hatenablog.jp/entry/2016/01/12/220000)
わたしもせっかくなので使ってみたいなと思い、
インストールしようとしたところ
<font color="red">installation has failed</font>
というエラーが出てインストールできませんでした
![6a4800dc-baab-11e5-9707-fb7377a1f6fb.png](https://qiita-image-store.s3.amazonaws.com/0/43608/938e21d8-6df0-35ac-da01-de2bfaab8ed1.png)


##ログを見ても原因不明

長いエラーログを読んでも原因そのものが
特に記載されてなく、write error.とざっくりしていて、
別に権限も問題なく、
管理者権限を付けて起動しても同様のエラーでした。

# こうなったらGoogle先生ですよ

とりあえず

> installation has failed

で検索をし、参考記事を探しました

- [Windows8.1 でインストール時に「Intarasion has failed」 のエラーが出ました。 · Issue #34 · BoostIO/boost-app-discussions ](https://github.com/BoostIO/boost-app-discussions/issues/34)

あったにはあったんですけど、エラー内容も似てたので・・・
でも質問で終わってまして、解決には至りませんでした。

# しらみつぶしに見ていくと・・・

- [Having Windows installation problems? - FAQ - Atom Discussion] (https://discuss.atom.io/t/having-windows-installation-problems/26498)

Atomのインストールエラーに関する記事を見つけまして、
どうやら

> If neither of the above works, please file an Issue on https://github.com/atom/atom111 and include in your post the contents of **<font color="red">%USERPROFILE%\appdata\local\atom\squirrelsetup.log.</font>**
 If it is too large, you can use https://gist.github.com48 to post it and then include a link.

お？なにやら興味深い一文が・・・
要はセットアップログでかすぎると問題になってね？
ということと認識し、該当のフォルダを見てみることに
そこには１６MBに膨れ上がったログがあるではありませんか！！！
Atomを多用するのでそれでどんどん増えてしまったみたいなんですよね。
なのでこれを中身一通り削除しました。
そうすると無事にインストールできましたとさ。
めでたしめでたし。


# 次にやること

これでBoostnoteが使えるようになったので
あとは同期をDropboxなんかで出来るようにして環境構築していきたいと思ってます。

**参考**

- [複数端末でBoostnoteデータを同期するオレオレ手順](http://qiita.com/ozawan/items/a80f2cb0c376572daa4c)

# あとがき

Electron製のアプリは便利ですからねー
ぜひぜひ皆さんも使ってみてもらえればと思います。
それでは～
CentOS7にDockerをインストールする

CoreOSというDockerに特化した軽量化されたOSもありますが、普段はCentOSを使うことが多いので簡単に手順を残します。
https://docs.docker.com/engine/installation/linux/docker-ce/centos/
公式に乗っている手順です。


現在Dockerがインストールされていたら削除する

```
$ sudo yum remove docker docker-common docker-selinux docker-engine
```

必要なパッケージインストール

```
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```

レポジトリ追加

```
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

yumのパッケージインデックスを更新(DockerのINSTALLやUPGRADEの前に一回実行することが推奨されている)

```
$ sudo yum makecache fast
```

インストール可能バージョンを調べる

```
$ yum list docker-ce.x86_64 --showduplicates | sort -r
```

インストール

```
バージョン指定
$ sudo yum install docker-ce-17.06.0.ce-1.el7.centos
最新バージョン
$ sudo yum install docker-ce
```

起動

```
$ sudo systemctl start docker
```

確認

```
$ sudo docker run hello-world
```

いちいちsudoを書かなくてもようにする(セキュリティー面を考慮してやるかやらないかの方針決めが必要)

```
dockerグループはすでにあるはずだけど念の為
$ sudo groupadd docker
現在のユーザーをdockerグループに入れる
$ sudo usermod -aG docker $USER
```

確認

```
再ログイン後(仮想環境であれば、再起動が必要な場合もある)
$ docker run hello-world
```

OS起動時にDockerを自動起動に

```
$ sudo systemctl enable docker
```
CentOS7のlocaleを日本にする

CentOS7の設定をやった時に調べたのでメモ

## 環境
|OS・ミドルウェア|バージョン|
|:--------------|---------|
|OS|CentOS Linux release 7.3.1611 (Core)|
|VirtualBox|5.1.26|
|Vagrant|1.9.7|

## 手順

1. 現在の設定を確認する

    ```shell-session
    # localectl
       System Locale: LANG=en_US.UTF-8
           VC Keymap: us
          X11 Layout: n/a
    #date
    Sat Jul 29 14:19:28 UTC 2017
    ```

2. 日本語のロケールがあるかどうか確認する

    ```shell-session
    # localectl list-locales | grep -i ja
    ```

3. 日本語のロケールがない場合は以下を実行する

    ```shell-session
    # yum -y reinstall glibc-common
    ```

4. 日本のlocaleを設定する

    ```shell-session
    # localectl set-locale LANG=ja_JP.UTF-8
    # source /etc/locale.conf
    ```

5. 変更されたことを確認する

    ```shell-session
    # localectl
       System Locale: LANG=ja_JP.UTF-8
           VC Keymap: us
          X11 Layout: n/a
    ```
超ざっくり！Dagger2の導入方法

# DIについて
は、色んな記事が出てると思うので割愛！
超ざっくり言うと、クラスの外からインスタンスを注入して結合度を下げる手法！
インタフェースを用意して、そこに注入してあげるとテストもしやすくなる奴です。

マサカリ大歓迎です！！！
何か認識間違っていたり、足りなかったりしていたら教えてください・・・！

# 詰まったところ
先にAndroidで導入する際に詰まった点を紹介します。

#### 何に詰まったのか
Gradleで依存の指定方法が足りなかった＆現段階で必要のない依存の指定をしていた。
#### どう間違えたのか
[Dagger2公式#How do I get it?](https://google.github.io/dagger//android.html#how-do-i-get-it)
ここに書かれている依存だけ書いてしまって、Javaの依存を書いてなかった。

# 導入方法
公式より、 [GithubのReadMe](https://github.com/google/dagger#java-gradle)を見た方が早かった。。

app配下のgradleに以下のコードを追加してsyncします。

```groovy
dependencies {
    ...
    compile 'com.google.dagger:dagger:2.14.1'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
}
```

で、インスタンスを外部から注入できるようになります。
外部の知識（WebAPIなど）や、インフラ層（repository）等を切り分けたい時はこれだけで十分です。
dagger.androidってどんな時に使えるのかまだ調べてないので、良ければ教えて頂きたくm(_ _)m

# ざっくりと注入の仕方
Moduleを作って、ComponentにInjectする対象を定義して、 `@Inject` を指定するだけ。
フィールドとコンストラクタインジェクションに対応しています。

ModuleはいわゆるDIコンテナ、と捉えていい（はず）です。
インスタンスの生成を別に切り出して、一つの場所で管理するって考え方なので。

#### まずは、Moduleを作ります。

```java
// suffixにModuleを付けるのがお作法。
@Module
public class InfrastructureModule {
    // prefixに provide を付けるのがお作法。
    @singleton
    @provide
    public RepositoryInterafce provideXYZRepository() {
        return new XYZRepository();
    }
}
```

こんな感じに書きます。
`@Singleton`を指定すると、Daggerが勝手にシングルトンとして生成を扱ってくれます。

#### 次にComponentを作ります。
Componentは、作った任意のModuleをどこに注入するのかを定義するインタフェースです。
こう書きます。

```java
// suffixにComponentを付けるのがお作法。
// singletonなインスタンスを扱うので @Singleton を指定する。じゃないとビルドでエラー吐く。
@Singleton
@Component(Modules = {InfrastructureModule.class})
public class InfrastructureComponent {
    // メソッド名はinjectとするのがお作法。お作法だらけだけど慣れれば脳筋プレイできる！ｗ
    void inject(FugaHoge fugaHoge);
    void inject(FooBar fooBar);
}
```

#### あとは `@Inject` を付けてフィールドなりコンストラクタなりに注入します。

```java
public class FugaHoge {
  
   // フィールドインジェクションしてみる
   @Inject RepositoryInterface repository;

   public FugaHoge() {
        // Rebuild走らせておくと、prefix:Daggerの、コンポーネント実体が自動生成される。
        // コンストラクタ内でinjectさせる。
        DaggerInfrastructureComponent.create().inject(this);
   }
}
```

こうするだけで、 `repository` にインスタンスが注入されます。

おわり。
Kotlinのdata classに配列を入れるとtoString()に配列の中身が全部表示されて困る話

Kotlinのdata classはとても便利だけど，微妙にかゆいところに手が届かないときもあるね，という話．

#TL;DR (長い! 3行で!)
- data classにbyte配列を格納したい
- でもtoString()に配列の中身が全部表示されて，logcat1行文のバッファにすら入り切らん
- 配列を格納するだけの別classを作って入れ子にしてやるといい感じ

#はじめに
Kotlinのdata classで撮影した写真のJPEG Bufferと保存先File名やMeta Dataなど一式を格納するようなコンテナクラス↓を作って，Kotlinのdata classはラクでいいなぁと思ってました．

```kotlin:PhotoData.kt
data class PhotoData(val filepath: String, val jpeg: ByteArray, val meta: String) {
}
```

しかし，保存ThreadでPhotoData#toString()を使ってLog出力をしたところ，
![default_log.png](https://qiita-image-store.s3.amazonaws.com/0/129035/1a5842df-ca0b-dcda-2ad6-3ad81c3f4cff.png)
のように，byteひとつひとつがIntに変換されて，全要素が表示されるようになっていて，配列の終端かlogcatの1行文のバッファがなくなるかまで表示されてしまいます．
JPEGデータが同一なのか別モノなのか，が知りたいだけなのに，さすがにコレでは困るのでなんとかしよう，というお話です．

#やりたいこと
data class にbyte配列などを格納したときでも，配列全部を表示するのでなく，配列が同一のものなのか別モノなのか，が分かる程度にtoString()でヨロシクlog出力したい．

#Kotlinのdata classがJavaにどう変換されているか?
というわけで，data classで自動生成されているtoString()がJAVA変換後にどういうCodeになっているかを見てみます．

↓ のサイトを参考に，KotlinのCodeをJAVAに変換してみます．
http://tech.actindi.net/2016/12/15/kotlin.html

```kotlin:PhotoData.kt
data class PhotoData(val filepath: String, val jpegBuffer: ByteArray) {
}
```
このdata class内に自動生成されるtoString()のCodeはJAVAに変換後，↓ のようになります．

```java:PhotoData.java
public final class PhotoData
{
    public String toString()
    {
        return (new StringBuilder())
                .append("PhotoData(fileFullPath=")
                .append(fileFullPath)
                .append(", jpegBuffer=")
                .append(Arrays.toString(jpegBuffer))
                .append(")")
                .toString();
    }
}
```
このなかの
```Arrays.toString(jpegBuffer)```
が配列全出しの要因のようですね．

Array#toString()の仕様を調べると，↓ のようになっていて，byteひとつひとつをStringBuilder使って文字列に詰めています．

```java:Arrays.java
public static String toString(byte[] array) {
    if (array == null) {
        return "null";
    }
    if (array.length == 0) {
        return "[]";
    }
    StringBuilder sb = new StringBuilder(array.length * 6);
    sb.append('[');
    sb.append(array[0]);
    for (int i = 1; i < array.length; i++) {
        sb.append(", ");
        sb.append(array[i]);
    }
    sb.append(']');
    return sb.toString();
}
```
byte配列かArraysか何かに細工して挙動変えられないかなーと思ってたのですが，無理そうですね．
(じつはできるぜ！ みたいなのあったら知りたいです！)

# ByteArrayを格納するためだけのclassを作る

byte配列を素のままdata classに格納するとArrays#toString()が使われてしまうので，いっそ配列だけを格納するclassを別に作って入れ子にして，そのclassのtoString()をoverrideしてやれば，byte配列がそのまま出力されることを回避できるはず．

↓ こんな感じ

```kotlin:PhotoData.kt
class ByteBuffer(val buffer: ByteArray) {
    override fun toString(): String {
        return "${buffer.hashCode()}"
    }
}

data class PhotoData(val fileFullPath: String, val jpeg: ByteBuffer) {
}
```
この構成で実際にlog catに出力させてみると，
![modified.png](https://qiita-image-store.s3.amazonaws.com/0/129035/bd2eca96-8400-6493-5481-bca712d6b5dc.png)

```
PhotoData(
    fileFullPath=/storage/emulated/0/2017-07-29_151933.JPG,
    jpeg=164835622
)
```
ってな感じの出力になって，同じ配列かどうか判定ができる程度のいい感じのlog catになっています．

#まとめ
data classに長い配列を入れた時でも，log catが荒らされることが無いようにすることができました．
Kotlinのdata classはとても便利なのにArrayを入れたときのtoString()の標準挙動だけは残念な感じですね．

他にもっといい方法がありそうなきがするなーと思いつつ．

---///
レジンコーティング

自身の作業の備忘録的な記録

<strong>material</strong>
木片：厚さ1-2mm、形状多数
レジン：UVレジン液 5g（Can Do）

<strong>tools</strong>
・UVライト：9W（SANTI）
・ドリル：ピンバイスドリル（tama工房）
・コットン：COTTON PUFFS（イオン）
・除光液：マイルドエナメルリムーバー PK（KOSE）

<strong>procedure</strong>
1.木片をレジンに浸す。
2.木片の表面からレジンを拭き取り湿った状態にする。
3.15分UV照射を行う。




<details><summary><strong>log</strong></summary>
2016/10/02:UVライトは3Wでは出力不十分で硬化しない。9W品を再購入する。
2017/01/06:木片に未加工の状態でレジンを乗せて硬化させると、レジンと木片の間に気泡が発生する（気泡のサイズはまばら）
2017/07/29:照射時間は15~20分程度とする。硬化処理後に微小な気泡ができる現象が再発。部屋の湿度、レジン硬化時間時間が影響か？
</details>
NexusのSnapshotsリポジトリのアーティファクトをデプロイする方法

NexusのSnapshotsやReleasesリポジトリに登録されるアーティファクトには、
ダウンロード用にURLが付与される。

このURLを用いて、curlやwgetなどでサーバにアーティファクトをデプロイする上で、
Snapshotsリポジトリに関しては1点問題がある。

**Snapshotsリポジトリに登録されるアーティファクトのURLには、
末尾のファイル名に、日付から開始する乱数が付与されるため、
アーティファクトの登録前はURLが分からない。**
これは事前にダウンロードする先のURL指定をデプロイのためのスクリプトで
書けない（自動化出来ない）ことを意味する。

以下、NexusのAPIを使う方法で解決できる。

```
$ wget -O ＜ダウンロード後の資材名＞ --content-disposition --no-check-certificate ¥
--user ＜Nexusログインユーザ＞ --password ＜Nexusログインパスワード＞ ¥
https://＜URL＞/service/local/artifact/maven/content?r=＜repository id＞¥
\&g=＜groupID＞\&a=＜アーティファクトID＞\&v=＜Version＞\&p=＜packaging＞
```

例

```
$ wget -O sample.war --content-disposition --no-check-certificate --user hoge ¥
--password hoge https://x.x.x.x/nexus/service/local/artifact/maven/content?¥
r=snapshots\&g=sampleproject-webapp\&a=sample\&v=1.0.0-SNAPSHOT\&p=war
```
 
※上記コマンドで、Snapshotsリポジトリにある最新版のWarが取得可能となる
※なお、Releasesも上記のフォーマットに従い、repository id以降を適宜変更すれば、適用可能となる
※参考URL
<a href="https://support.sonatype.com/hc/en-us/articles/213465488-How-can-I-retrieve-a-snapshot-if-I-don-t-know-the-exact-filename-">https://support.sonatype.com/hc/en-us/articles/213465488-How-can-I-retrieve-a-snapshot-if-I-don-t-know-the-exact-filename-</a>
Lua で、定義した関数中のグローバル変数を、あとからローカル変数に差し替える方法

# この文書の目的
関数を定義したあとに、その関数にて使用しているグローバル変数をローカルな変数に置きかえる方法を示します。具体的には、

```lua:global_inc.lua
count=0 -- グローバル変数
function glooba_inc()
    count=count+1 -- グローバル変数 count に対して +1
    print("count="..count)
end
```

という関数を、プログラムにより、以下のローカルな変数を使う関数へと変更します。

```lua:local_inc.lua
local count=0; function local_inc()
    count=count+1 -- グローバル変数 count に対して +1
    print("count="..count)
end
```
# 動作確認した Lua のバージョン
Lua-5.3.4。メタテーブルおよび load 関数を有する、最近の Lua であれば動作すると思います。

# しくみ
load 関数を用いると、その関数（正確にはチャンク）の実行に使用する環境を指定できます。環境を差し替えることにより、関数中の変数が何を指すのかを、後から差し替えることができます（上の関数の例では、count という変数）。

load 関数では、チャンクとしてプログラムを格納した文字列もしくはコンパイル済みのバイナリ列（VM のバイトコード）を指定できます（バイナリ列の場合、第 3 引数（=mode）に "b" という文字列を指定する必要があります）。

関数のコンパイル済みのバイナリ列ですが、string.dump 関数を用いることにより得られます。本文章では、これらの関数を活用することにより、関数中のグローバル変数を、ローカル変数に差し替えることを実現します。

# 具体的な方法
一連のコードにより、具体的な方法を示します。

```lua:ex_global_to_local.txt
> -- global_inc() は既に定義してあるものとする
> globa_inc_bin=string.dump(globa_inc) -- VM のバイトコード列を取得

> localEnv={} -- ローカルな環境用のテーブル
> localEnv.count=100 -- 差し替えたい変数を初期値と共に定義
> setmetatable(localEnv,{__index=_ENV}) -- 差し替えたい変数以外は _ENV を使用

> local_inc=load(global_inc_bin,nil,"b",localEnv) -- global_inc から local_inc を生成

> count -- global_inc() で使用している変数の値を確認
0

> local_inc()
count=101
> local_inc()
count=102

> count -- global_inc() で使用している変数の値を確認（変化していない）
0
```

# まとめ
コンパイル済みのバイナリ列（バイトコード）に変換することにより、実行時の環境を差し替えることが可能となりました。結果として、関数定義時にはグローバル変数として書かれていたコードを、ローカル変数を使用するものへと差し替えることができました。

上の例では global_inc() から local_inc() を生成した訳ですが、ローカルな環境を都度生成すれば、同様の方法で local_inc2() や local_inc3() など、それぞれ独立した変数を抱える関数を生成することもできます。

追記：
この方法を応用した「[Lua で、self.name と書かなくても name だけでメンバ変数やメソッドにアクセスできるようにする方法（または self を使わないオブジェクト指向プログラミング）](http://qiita.com/iigura/items/5c01deb025269b03980e)」を書きました。こちらもあわせてご覧になっていただければ幸いです。
Open Source Routing Machine (OSRM) 利用で道路経路探索

こんにちは。
[Open Source Routing Machine](https://github.com/Project-OSRM/osrm-backend) (OSRM) を使って道路経路探索を試してみました[^1]。インストールには [HomeBrew](https://ja.wikipedia.org/wiki/Homebrew_(パッケージ管理システム)) を使いました。

複数経路候補を探索し、その結果から [simplestyle](http://qiita.com/kkdd/items/46906cb1110488828d9e) の GeoJSON ファイルを作りました（jq コマンド利用）。表示には http://geojson.io を利用しました。

[^1]: 探索を試すだけならば、http://map.project-osrm.org/ や [Leaflet Routing Machine](http://www.liedman.net/leaflet-routing-machine/) のサイトで試せます。

![map.png](https://qiita-image-store.s3.amazonaws.com/0/54617/1b6ca788-5f8a-5b69-6875-94043560fbe6.png)

```console
$ brew install jq osrm-backend
$ mkdir osrm && cd osrm
$ find /usr/local/Cellar/osrm-backend -name profiles | head -n 1 | xargs ln -s
$ wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf
$ osrm-extract berlin-latest.osm.pbf
$ osrm-partition berlin-latest.osrm
$ osrm-customize berlin-latest.osrm
$ osrm-routed --algorithm=MLD berlin-latest.osrm &
$ curl 'http://localhost:5000/route/v1/driving/13.246353470716485,52.43405136831916;13.39309242380466,52.56433207398476?alternatives=3&geometries=geojson' | jq 'def hexdec(i): "0123456789abcdef"[i:i+1]; {"type": "FeatureCollection", "features": [[.routes[].geometry] | [., keys] | transpose[] | {"geometry": .[0], "type": "Feature", "properties": {"stroke-width": 2, "stroke": ("#" + hexdec(15-.[1]*2) + hexdec(.[1]*2) + hexdec(.[1]*2))}}]}' > routes.json
```
WindowsAzure.Storageをアップデートしたら、VS2017で.NET 4.6.2のプロジェクトがデプロイできなくなった

# 経緯

とあるプロジェクトで、半年ほど前に作成したASP.NET MVCのプロジェクトを改修してデプロイしたら
下記のようなエラーを吐いて、Webページが正常に開けなくなってしまいました。

> System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

web.configを見ると確かにSystem.RuntimeのDependencyが書かれていました。

```xml
<dependentAssembly>
    <assemblyIdentity name="System.Runtime" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
```

しかも、よく調べると このライブラリは.Net Frameworkではなく、.NET Standard。
差分を見ると、今回の改修で混入したことは間違いありません。

# 根本の原因はNugetのバグらしい

根本原因については、NugetのGitHubにIssueが挙がっていました。
[PackageRef project opt-in technique #4488](https://github.com/NuGet/Home/issues/4488)

どうやらNugetで依存する.Net Standardライブラリを取ってくるときに、ライブラリの場所が分からなくなってしまうらしい。
Visual Studio 2017で.NET Core プロジェクトが project.jsonではなく、 MSBuild/csproj 形式に移行されたことが原因かもしれないですね。
（勉強不足で変なことを言っていたら申し訳ありません。）

# なぜ .Net Standardライブラリが降臨したのか

修正前のプロジェクトでは、WindowsAzure.Storageの8.0.1を参照していました。
https://www.nuget.org/packages/WindowsAzure.Storage/8.0.1

今回の改修では、ついでにストレージクライアントも最新の8.1.0に上げようとしていました。
https://www.nuget.org/packages/WindowsAzure.Storage/8.1.0

両者のdependenciesを比較するとMicrosoft.Data.Services.Clientが **(>= 5.7.0)** から **(>= 5.8.2)** に変わっています。
さらに5.8.2のdependenciesをみると

> **.NETStandard 1.1**
> Microsoft.Data.OData (= 5.8.2)
> System.ComponentModel.EventBasedAsync (>= 4.0.11)
> System.Dynamic.Runtime (>= 4.0.0)
> System.Linq.Queryable (>= 4.0.0)
> System.Net.Requests (>= 4.0.11)

とあり、.NET Standrdライブラリが参照に追加されていました。これが理由でした。

参考
https://www.nuget.org/packages/Microsoft.Data.Services.Client/5.8.2

# やっぱりライブラリのアップデートは慎重に

NuGetのGitHubに対策は書いてありますが、csprojファイルを手動で書き換えなければならず、正直言って時間が経ったり、担当者が変わったりしたら忘れさられてしまいそうです。

今回のプロジェクトでは、そもそもWindowsAzure.Storageのアップデートは必須ではないため、バージョンを戻すという選択をしました。

やっぱりライブラリのアップデートは慎重に行うべきですね。
number_to_currencyをdecoraterの中で使う方法。

##number_to_currencyをdecoraterの中で使う方法。
ファイルの中に
**include ActionView::Helpers::NumberHelper**
を読みこませる必要がある。

```
class WatasanDecorator < Draper::Decorator
  delegate_all
  include ActionView::Helpers::NumberHelper

    def money_total
      number_to_currency(object.user_money_total)
    end
end

```
Material Design Liteのdrawerナビゲーションで現在地を表現する

[Material Design Lite](https://getmdl.io/) の drawer ナビゲーションで現在地を表現するために、mdl-navigation__link--current クラスが利用できる。

![MDL.png](https://qiita-image-store.s3.amazonaws.com/0/35988/8a23cda8-2dc4-b586-f748-bad396d843e5.png)

現時点 (2017-08-18) において、[ドキュメント](https://getmdl.io/components/index.html#layout-section)には書かれていない。
Elixirで遠隔PCに侵入#4風「Observerでスーパーバイザのプロセス構成を見る」

[前回](http://qiita.com/piacere/items/d66a12b3c889ca1d6ab1)は、プロセスがエラーでダウンしても、スーパーバイザが自動でリカバリーしてくれる様を見ました :kissing_smiling_eyes:

その中で、以下4つの疑問が出てきました

- 気軽にプロセスを再起動したけど、負荷とか大丈夫なの？
- 負荷は大丈夫だとしても、プロセスが処理していた状態やデータとかどうなるの？
- 地味に、cdサーバと一緒にpwdサーバもダウンしてるけど、障害切り分けとして、マズくない？
- 「strategy: :one_for_one」というコードの説明が無かったけど、これ一体、何？

今回は、1つ目の疑問を検証する前段として、スーパーバイザのプロセス構成を確認します :palm_tree:

---

:stars: :stars: <b>【お知らせ】今回の連載の更に先を、今月末8/24（金）開催の「fukuoka.ex #2」でセッション・LTします</b> :stars: :stars:

今連載で扱っているGenServerとスーパーバイザを活用した、ElixirとPhoenixにおける耐障害性について、連載内容に無い応用や、より詳しい内容でセッションします

https://techjin.connpass.com/event/63493/
[![image.png](https://connpass-tokyo.s3.amazonaws.com/thumbs/cb/13/cb130a03343bc310b07244c308b940db.png)](https://techjin.connpass.com/event/63493/)

---

# スーパーバイザのモジュール化

まず、前回はiexで手打ちしてたスーパーバイザ起動等をモジュール化しておきます

```elixir:lib/pass_supervisor.ex
import Supervisor.Spec

defmodule PassSupervisor do
	def start_link() do
		servers = [ worker( PassGenServer, [ 0, [ name: :server_process ] ] ) ]
		Supervisor.start_link( servers, strategy: :one_for_one )
	end

	def cat( parameter ) do
		GenServer.call( server_process, { :cat, parameter } )
	end

	def pwd() do
		GenServer.call( server_process, :pwd )
	end
end
```

スーパーバイザ経由でサーバプロセスを起動します（念のため、クライアント呼出の確認も）

```elixir
iex> PassSupervisor.start_link()
--- PassGenServer.start_link( 1, [name: :servers_process] ) ---
{:ok, #PID<0.1980.1>}
iex> PassSupervisor.pwd()
"/code/pass"
iex> PassSupervisor.cat( "a.txt" )
"I'm a.txt"
```

# スーパーバイザのプロセス構成をObserverで見る

Erlangから受け継いだモニターツール「Observer」をiex内から起動し、スーパーバイザプロセスとサーバプロセスが起動していることを確認します

```
# iex -S mix
iex> :observer.start
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/866d87eb-7fc1-3006-4640-02a16ea351f5.png)

「Processes」タブを選択し、スーパーバイザ起動時に表示された「PID<0.1980.1>」を探します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/d9af3bb8-8385-5caf-8a14-92b41a135a4a.png)

ダブルクリックすると、スーパーバイザのプロセス詳細が表示され、「Links」枠にこのスーパーバイザと連なっているプロセスへのリンクがあるため、スーパーバイザの次に振られたであろうPIDをクリックします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/27859b31-d95f-8f74-d7f8-80e05c09e5b6.png)

GenServerのプロセス名なので、アタリでした :yum:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/dc681d70-1c8d-9137-7014-2ef9fab75fb3.png)

「Dictionary」タブを見ると、GenServerで起動したモジュール名も見れます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/593bffa4-bd7c-cbde-d6db-96a3eef10bab.png)

スーパーバイザと、その配下のGenServerのプロセス構成が、これで確認できました :golf:

それでは実際に、プロセス起動やスーパーバイザでの再起動における負荷を確認します

（[次回](http://qiita.com/piacere/items/294b45e8f2f1ee4c2f8f)に続く）