OmniAICreator/Qiita-1.07M huggingface dataset:
SELinux 覚書

# SELinux の有効化
1. /etc/selinux/config の SELINUX の値を enforcing に書き換える。
2. sestatus で設定の記述に誤りがないかを確認する。
3. fixfiles on boot を実行する。
4. OS を再起動する。

*Note:*
標準で AppArmor や TOMOYOLinux 等の
アクセス制限機能が有効になっている場合は、
それらを無効化しなければならない。

# 設定ファイル
```sh:/etc/selinux/config
SELINUX={enforcing | permissive | disabled}
SELINUXTYPE=使用するポリシーセット
```

## SELINUXTYPE
既定値は targeted 。
targeted ポリシーセットは、攻撃対象として
狙われやすいアプリケーションのみを SELinux の制御下に置く。

*Note:*
存在しないポリシーセットを指定するとカーネルパニックが発生する。
カーネルパニックが発生した場合は、
起動時に grub オプションへ selinux=0 を指定することで
SELinux を Disabled 状態で起動することができる。

# セキュリティポリシーの構成
## TE ファイル
セキュリティポリシーの本体。
セキュリティコンテキストの定義やアクセス許可を記述する。

## FC ファイル
定義したセキュリティコンテキストをデフォルトで
どのファイル(パス)へ付与するかを記述する。

## IF ファイル
他のドメインがモジュール内で定義したセキュリティコンテキストを
使用する為のインターフェイスを記述する。

# コマンド
## getenforce
SELinux の状態を確認する。

### Enforcing
SELinux が有効になっており、実際のアクセス制限を行う状態。
セキュリティポリシーに従ってシステムコールの実行可否を
判断 / 制御し、アクセス拒否した際のログを出力する。

### Permissive
SELinux は有効になっているが、実際のアクセス制限は行わない状態。
セキュリティポリシーに従ってシステムコールの実行可否を
判断するが制御は行わず、アクセス拒否のログだけを出力する。

### Disabled
SELinux が無効になっている状態。
アクセス制限 / ログ出力 / 新規ファイルやプロセスに対して
セキュリティポリシーを適用しない。

## setenforce{0 | 1}
SELinux の状態を変更する。

0=Permissive
1=Enforcing

## sestatus
設定ファイルの設定を含めた状態を確認する。
設定ファイルの記述に誤りがないかを確認することができる。

### Current mode
現在の状態を表す。

### Mode from config file
設定ファイルで設定された状態を表す。

## sesearch
システムに適用されているセキュリティポリシーを検索する。
TE ファイルを読み解くことなくアクセス権限を知ることができる。

## semanage fcontext -l
FC ファイルの定義内容を確認する。

## ls -Z
ファイルのセキュリティコンテキストを確認する。

## ps -Z
プロセスのセキュリティコンテキストを確認する。

## id -Z
ログインユーザのセキュリティコンテキストを確認する。

## chcon
一時的にセキュリティコンテキストを付与する。
chcon で付与したセキュリティコンテキストは
SELinux を有効化する際に初期化される。

## restorecon
システムを起動したまま SELinux の有効化を実行する。
Kobito(Mac)が強制終了で落ちるようになった時の対処法


## 解決策
関連ファイル全消し＋再インストールで復活
`find / -name *kobito*`で出てくるやつを片っ端から`sudo rm -rf`してやる。

##自分のケース
- /Users/[ユーザー名]/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.qiita.kobito.sfl
- /Users/[ユーザー名]/Library/Application Support/Firefox/Profiles/sz5bdtjd.default/ScrapBook/data/20140821104009/kobito-654d3c233875ff71a5dea08bf4b14971.png
- /Users/[ユーザー名]/Library/Application Support/Google/Chrome/Default/Local Storage/http_kobito.qiita.com_0.localstorage
- /Users/[ユーザー名]/Library/Application Support/Google/Chrome/Default/Local Storage/http_kobito.qiita.com_0.localstorage-journal
- こんな感じでたくさんあった。
[Swift] UITableViewCellのaccessoryViewのtintColorを変更する

# Problem

UITableViewCellのaccessoryViewのtintColorを変更したい

# Solution

## アイコンの取得

以下のサイトから、`ic_navigate_next`のpng画像をダウンロードし、ios用のアイコンセットを`Assets.xcassets`にドラッグ&ドロップする
https://www.google.com/design/icons/#ic_navigate_next

## 実装

```swift
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    let disclosureImage = UIImage(named: "ic_navigate_next")!.imageWithRenderingMode(.AlwaysTemplate)
    let disclosureView = UIImageView(image: disclosureImage)
    disclosureView.tintColor = UIColor.redColor()
    cell.accessoryView = disclosureView
    return cell
  }
```

## 結果

![スクリーンショット 2015-11-19 3.29.34.png](https://qiita-image-store.s3.amazonaws.com/0/9875/bd4793f1-31ac-1090-6d7d-cc85a48522ef.png)


# 参考

- [UITableViewCell accessory not being tinted](http://stackoverflow.com/questions/27955447/uitableviewcell-accessory-not-being-tinted)
- [UIImageViewに設定している画像の色を変える](http://qiita.com/katsuhisaishii/items/d7792a2d30125781f147)
Perl6 Cookbook 数値に位取りのcommaを挿入する

数字の3桁ごとに区切りのcomma[^comma]を入れましょう。

Perl6の環境構築についてはこちら。
[Perl6導入とHello, world! - Qiita](http://qiita.com/B73W56H84/items/2153e6211ed617b4605d)

##### Perl5

```pl
use v5.18;

## Perl Cookbook では以下のように書いてありました。
# sub commify {
#     my $text = reverse $_[0];
#     $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
#     return scalar reverse $text;
# }

sub commify ($) {
  return ''.reverse        # 最後にもう一度反転。
  (                        # リストコンテキストとして評価されないように空文字と結合。

    (reverse $_[0]) =~ s{  # さて、入力文字列をひっくり返したものを正規表現で置換していきます。
      (\d\d\d)(?=\d)       # \d は 0から9 を表していて、?= は先読み表明です。
                           # つまり、先に\dが来る3連続の\dを記録します。
      (?!\d*\.)            # ?! は先読み否定。小数点以下は無視なのです。
    }
    {$1,}xgr               # 記録した3連続の\dのあとにcomma(,)を挿入します。
    );                     # x: 正規表現の途中に↑のようにコメント入れる
                           # g: 文字列の中で可能な限り繰り返し
                           # r: 非破壊置換。元の文字列はそのままで置換後の文字列を返す。
}

say commify 1234.5678; #=> 1,234.5678
say commify 42.195;    #=> 42.195
say commify -65536;    #=> -65,536
say commify -2880.11;  #=> -2,880.11
```

##### Perl6

```pl
use v6;

sub commify($s) {
  return $s.subst:
    /<[1..9]><[0..9]>+/,
    *.flip.comb(/<{ '.**1..3' }>/).join(',').flip;
}

say commify 1234.5678; #=> 1,234.5678
say commify 42.195;    #=> 42.195
say commify -65536;    #=> -65,536
say commify -2880.11;  #=> -2,880.11
```

おわりです。

# 参考や注釈

* [2.17. Putting Commas in Numbers](http://docstore.mik.ua/orelly/perl/cookbook/ch02_18.htm)
* [perlreref - Perl の正規表現のリファレンス](http://perldoc.jp/docs/perl/5.18.1/perlreref.pod)
* [Perl6 Regexes](http://doc.perl6.org/language/regexes)
* [General quantifier: ** min..max](http://doc.perl6.org/language/regexes#General_quantifier%3A_**_min..max)
* [Perl6 class Str](http://doc.perl6.org/type/Str)
* [Commatizing numbers - Rosetta Code](http://rosettacode.org/wiki/Commatizing_numbers#Perl_6)


[^comma]: カンマとかコンマとか読まれますが発音は`[kɑ́mə]`です。~~やめて、私のために争わないで~~
Scheme (R7RS+SRFI) でマイナンバーのチェックデジットを計算する

流行っているようで Gauche 版も登場していたので、よりポータブルに R7RS で書きました。 SRFI-1 と SRFI-13 もサポートしている処理系でないと動かないので、Gauche と Sagittarius くらいしかなくて結局それほどポータブルというわけでもなかったりするのですが。

```scheme:mynumber.scm

(import (scheme base)
        (scheme write)
        (scheme char)
        (srfi 1)
        (srfi 13))

(define (mynumber-assert p)
  (unless (string? p)
    (error "string required, but" p))
  (unless (= (string-length p) 12)
    (error "string of length 12 required, but" p))
  (unless (string-every digit-value p)
    (error "every elements of string must be digit, but" p)))  

(define (mynumber-checkdigit p)
  (let ((d (- 11
              (modulo (fold (lambda(pn qn a) (+ a (* pn qn)))
                            0
                            (map digit-value (string->list p))
                            '(6 5 4 3 2 7 6 5 4 3 2))
                      11))))
    (if (< 9 d) 0 d)))

(define (mynumber-validate? p)
  (mynumber-assert p)
  (= (digit-value (string-ref p 11))
     (mynumber-checkdigit p)))

;; test case
(for-each (lambda (x)
            (display x)
            (display " : ")
            (display (mynumber-validate? x))
            (newline))
          '("123456789010"
            "123456789011"
            "123456789012"
            "123456789013"
            "123456789014"
            "123456789015"
            "123456789016"
            "123456789017"
            "123456789018"
            "123456789019"
            "023456789013"))
```

入力が文字列ではなく数値で与えられる場合も考えてみました。 こちらは R7RS の範囲内だけで書いたのでより多くの処理系でそのまま使えます。 Gauche, Sagittarius, Larceny, Chibi, Foment で動作することを確認できています。

```scheme:mynumber.scm
(import (scheme base)
        (scheme write))

(define (mynumber-validate? p)
  (unless (integer? p) (error "integer required" p))
  (let ((check-digit (modulo p 10)))
    (do ((r (quotient p 10) (quotient r 10))
         (c 0 (+ c (* (modulo r 10) (vector-ref '#(2 3 4 5 6 7 2 3 4 5 6) i))))
         (i 0 (+ i 1)))
        ((= i 11)
         (unless (= r 0) (error "number is too large" p))
         (let ((d (- 11 (modulo c 11))))
           (= (if (< 9 d) 0 d) check-digit))))))

;; test case
(for-each (lambda (x)
            (display x)
            (display " : ")
            (display (mynumber-validate? x))
            (newline))
          '(123456789010
            123456789011
            123456789012
            123456789013
            123456789014
            123456789015
            123456789016
            123456789017
            123456789018
            123456789019
            23456789013))
```
Raspberrypi2でDockerを使いたい


最初はCentOSのイメージを使ってみたが，dockerは動かないようだったので，違うイメージでやってみました．
一般的なOSをインストールしたい人は[Raspberrypi2のRaspbian or CentOSインストール手順とssh接続(Mac使用)](http://qiita.com/shu920921/items/c0c47067fd696b2b77af)を参照してもらいたいです．

詳しいインストール方法は参照記事で確認お願いします．

## イメージのダウンロード

Hypriot Docker Imageをダウンロードした

[ダウンロード](http://downloads.hypriot.com/hypriot-rpi-20151115-132854.img.zip)(ここ押すとダウンロード始まる)

## SDカード書き込む

```diskutil unmountDisk /dev/disk2```

```sudo dd bs=1m if=hypriot-rpi-20151115-132854.img of=/dev/disk2```

20分くらいかかる．

ここまででPCの作業終了

## 起動
デフォルトのパスワードは以下

|id|pass|
|:--:|:---:|
|root|hypriot|

起動した直後でもsshはできる．

## ユーザ追加
rootでのログインは気がひけるのでuserを追加

追加方法はRaspbianと一緒

```adduser username```

この後パスワードを聞かれるので答えればいい．
パスワード以外も色々聞かれるけど，とりあえずは`enter`で大丈夫

参考までにユーザ削除は

```userdel -r username``` です．

なんで順序が逆なんだろうか．．．

追加ユーザのsshの許可はcentosと一緒です．

## 動かしてみる
[Raspberry PiでDockerコンテナを動かす](https://blog.knjcode.com/using-docker-on-raspberry-pi/)と同じチュートリアルです．

```docker run -d -p 80:80 hypriot/rpi-busybox-httpd```

起動後に`http://ipアドレス:80`でブラウザでアクセスしてみてください
Raspberry Piの画面がでてくるんじゃないでしょうか

dockerコマンドなどは普通に使える見たいですね
とりあえず今回は以上です！ 

## 参考サイト
[Raspberry PiでDockerコンテナを動かす](https://blog.knjcode.com/using-docker-on-raspberry-pi/)
Nodeでワンライナー

Nodeで標準入力を処理するワンライナーがしたいなと思ったので、やってみました。Node5.0.0使用。

# 基本
```sh
$ echo 'test' | node -e "var c='';process.stdin.on('readable',()=>{c+=process.stdin.read()});process.stdin.on('end',()=>{console.log('c='+c)})"
c=test
null
```

な、長い…
ですが、stdinの`readable`イベントと`end`イベントをなんとかすればワンライナーできることがわかりました。

# CSVの1カラム目を切り出す
下記のCSVファイルの1カラム目を切り出したい。

```text:test.csv
col11,col21
col12,col22
```

```sh
$ cat test.csv | node -e "var c='';process.stdin.on('readable',()=>{c+=process.stdin.read()});process.stdin.on('end',()=>{c.split('\n').forEach((e)=>{e.split(',').forEach((e,i)=>{if(i==0){console.log(e)}})})})"
col11
col12
null
```

Nodeでワンライナーするコツは、自分が今どの括弧の中にいるのかというのを常に把握し続けることだと理解しました。ふえええ…
「最強のSSH踏み台設定」でHostName使いたい

&lt;ins>
今だったら(OpenSSH 7.3以降なら) `ProxyJump` オプションや、コマンドラインオプションの `-J` を使うのがオススメ。

例えば、踏み台サーバーが複数あるとき(bastion1,bastion2)に、その奥のhostAに繋ぎたい時、とかでも↓みたいなコマンドで一発

```
ssh -J bastion1,bastion2 hostA
```

&lt;/ins>

以下古い記事
---

# 背景

kawazさんの「[最強のSSH踏み台設定](http://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8)」が凄く素敵で、早速設定してみたのだけど、どうやら `HostName` を設定すると上手くいかないっぽい。

DHCPとか名前解決がちゃんとしている環境だと別に `HostName` は設定しなくても問題ないのだけど、IPベースだけど別名つけてsshしたい時がある。

例えば、

```sshconfig:.ssh/config
Host hostA
  Port 10022
  HostName 192.168.0.50
Host hostA+*
  Port 10022
  HostName 192.168.0.50

Host *+*
  ProxyCommand ssh -E /dev/null -W "$(<<<"%h" cut -d+ -f1)":%p "$(<<<"%h" cut -d+ -f2-)"

# `sed` だと最長/最短マッチがわかりづらかったので `cut` に変えてます。
```

みたいな設定を書いて、

```shell-session
$ ssh hostA+fumidai.example.com
```

で、 `fumidai.example.com` を踏み台にしつつ、その先で `192.168.0.50` に繋ぎたいみたいなケース。

この設定だと `ProxyCommand` の `"%h"` が `192.168.0.50+fumidai.example.com` ではなく、ただの `192.168.0.50` になってしまい踏み台の情報が欠損してちゃんと動かない。

あと、ホストの設定を書くときに、経路も含めて全部 `Host` に指定しないといけないのが個人的に、ぐぬぬという感じ。
特にノートパソコンみたいに持ち運びの多いマシンだと、踏み台が必要な時と必要じゃない時とで経路が複数ありうるので、できる限り `*` でサボりたい。

怠惰はプログラマのたしなみ。

ということで、ちょこっと書き換えてみた。

# .ssh/config

変更後のはこんな。

```sshconfig:.ssh/config
Host hostA
  Port 10022
  HostName 192.168.0.50
Host hostA+*
  Port 10022
  HostName 192.168.0.50_%h

Host *+*
  ProxyCommand ssh -E /dev/null -W "$(<<<"%h" cut -d+ -f1 | cut -d_ -f1)":%p "$(<<<"%h" cut -d+ -f2-)"
```

変更点としては、 `HostName` の末尾に `_%h` を加えたのと、 `ProxyCommand` に `| cut -d_ -f1` を加えてます。

アイデアとしては、 `HostName` の設定にIPアドレスだけを書くと、 `%h` が上書きされてしまうので、 `Host` の `+*` の部分(e.g. `+fumidai.example.com`)をIPアドレスの末尾にくっつけたい。
ところが、 `HostName` の定義部で使えるのは `Host` 全体を表す `%h` だけで、かつ、シェルを解釈してくれないので、 `ProxyCommand` でやっているような `sed` や `cut` での加工ができない。

そこで、 `HostName` の定義では、適当なデリミタを挟みつつ、単に `%h` を後ろに足して、その上で `ProxyCommand` でホスト別名を削る、という感じです。

デリミタにはアンダースコアを使っていますが、単にホスト名に使えない文字だから使っているだけなので、`+` 同様、ホスト名の定義と混ざりづらければなんでもokです。
(最初は `#` を使ってみてたのですが、vimのシンタックスハイライトが死ぬので `_` にしてます。意味合い的には「後ろのホスト別名を読み飛ばす」という気分なので `#` を使いのですが……。)

結果、

```shell-session
$ ssh hostA+fumidai.example.com
```

を実行したときには、 `ProxyCommand` は

```bash
# %h=192.168.0.50_hostA+fumidai.example.com / %p=10022
ProxyCommand ssh -E /dev/null \
  -W "$(<<<"192.168.0.50_hostA+fumidai.example.com" cut -d+ -f1 | cut -d_ -f1)":10022 \
  "$(<<<"192.168.0.50_hostA+fumidai.example.com" cut -d+ -f2-)"
# ↓
ProxyCommand ssh -E /dev/null \
  -W "$(<<<"192.168.0.50_hostA" cut -d_ -f1)":10022 "fumidai.example.com"
# ↓
ProxyCommand ssh -E /dev/null -W "192.168.0.50":10022 "fumidai.example.com"
```

となって、めでたく `fumidai.exmaple.com` を踏み台にしつつ、 `192.168.0.50` (=`hostA`) に繋ぐことができるようになりました。
`+` で切り分けたあとで、 `_(ホスト別名)` 部分を切り取るので、多段の途中だったり、経路中に何度もホスト別名が出てきてもokです。

また副産物として、経路によらず、ホスト別名ごとの設定をまとめて書くことができる様になりました。
踏み台が複数あって環境によって変えないといけない、という時でも、この一つの設定で `ssh hostA+some-fumidai.example.com` でも `ssh hostA+another-fumidai.example.com` でも、あるいは `ssh hostA+hostA+hostA+example.com` でも、いけるようになります。
最後のは完全ネタですが、なんにせよ経路の自由度が増えるのは、なにかと便利です。

ということで、 EoQ
MacにSSH接続を試みると"Connection refused"。


# 概要

表題ままです。
MacにSSH接続を試みた際に、 "Connection refused" と表示されて繋がらない場合の対策を綴ります。

※検証環境は OS X Yosemite です。


# 手順

`システム環境設定` -> `共有` -> `リモートログイン` にチェックを入れるだけ。

![ss_236.png](https://qiita-image-store.s3.amazonaws.com/0/97611/7d398e99-106a-6741-616e-dd5b1301645b.png)


とっても簡単ね！
動的リンク (dynamic link)とは

# はじめに
動的リンクについて簡単にまとめてみました

# 動的リンクとは
https://e-words.jp/w/%E5%8B%95%E7%9A%84%E3%83%AA%E3%83%B3%E3%82%AF.html

* 動的リンクとは、プログラムの実行に必要なライブラリやモジュールなどを、実行時にリンク（連結）して起動すること。
* 例えばprintfなどを使ったC言語のプログラムを実行するときは、LinuxのGlibc(標準Cライブラリ)などの共有ライブラリが実行時に動的にリンクされる

# 実行ファイルの中身を見てみた

~~~bash
readelf -a a.out 
ELF ヘッダ:
  マジック:  7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  クラス:                            ELF32
  データ:                            2 の補数、リトルエンディアン
(中略)
セクションヘッダ:
  [番] 名前              タイプ          アドレス Off    サイズ ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        08048154 000154 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            08048168 000168 000020 00   A  0   0  4
  [ 3] .note.gnu.build-i NOTE            08048188 000188 000024 00   A  0   0  4
  [ 4] .gnu.hash         GNU_HASH        080481ac 0001ac 000020 04   A  5   0  4
  [ 5] .dynsym           DYNSYM          080481cc 0001cc 000040 10   A  6   1  4
(中略)
プログラムヘッダ:
  タイプ       オフセット 仮想Addr   物理Addr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
  INTERP         0x000154 0x08048154 0x08048154 0x00013 0x00013 R   0x1
      [要求されるプログラムインタプリタ: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x00590 0x00590 R E 0x1000
  LOAD           0x000f08 0x08049f08 0x08049f08 0x00110 0x00114 RW  0x1000
  DYNAMIC        0x000f14 0x08049f14 0x08049f14 0x000e8 0x000e8 RW  0x4
オフセット 0xf14 にある動的セクションは 24 個のエントリから構成されています:
 タグ        タイプ                       名前/値
 0x00000001 (NEEDED)                     共有ライブラリ: [libc.so.6]
 0x0000000c (INIT)                       0x8048294
 0x0000000d (FINI)                       0x8048494
 0x00000019 (INIT_ARRAY)                 0x8049f08
 0x0000001b (INIT_ARRAYSZ)               4 (バイト)
(中略)
再配置セクション '.rel.plt' (オフセット 0x284) は 2 個のエントリから構成されています:
 オフセット 情報    型              シンボル値 シンボル名
0804a00c  00000107 R_386_JUMP_SLOT   00000000   __gmon_start__
0804a010  00000207 R_386_JUMP_SLOT   00000000   __libc_start_main
~~~

## interpセクション
* 動的リンカが指定されている(/lib/ld-linux.so.2)。**通称ld.so**。リンク時に共有ライブラリなどがある場合、リンカによって書き込まれる。

## 動的リンクの流れ
* execveされてカーネルがメモリに実行ファイルをロード。カーネルがINTREPセクションを発見するとそのパスに書かれている動的リンカをメモリにロードする。上だと(/lib/ld-linux.so.2)。
* そしてカーネルは処理をこの動的リンカに受け渡して動的リンカが起動
* 動的リンカはカーネルから渡された情報(実行ファイルなど)を元に実行ファイルのDYNAMICセクションを探してDYNAMICセクションのTYPEがNEEDEDの共有ライブラリ(上記のlibc.so.6)をメモリに読み込む。
* 共有ライブラリを検索する場所は環境変数、デフォルト検索パスなど(コマンドラインでコンパイルした時に-Lを指定したパス)
* そして共有ライブラリのDYNAMICセクションにも共有ライブラリがリンクされていたら再帰的にメモリにロードしてすべての共有ライブラリをメモリに配置する

## 実行ファイルと共有ライブラリ
* 対象：実行ファイル(ELF)
  - **カーネル(ローダー)**がメモリに配置する。
* 対象：実行ファイルで使用される共有ライブラリ
  - **動的リンカ(ダイナミックリンカローダ)**がメモリに配置する
2次元Kernel密度推定

#2次元Kernel密度推定：kde2d( )

##データの作成と可視化
2次元標本データを手作業で作成します。気持ちとしては犯罪が起こった場所のx,y座標を取得しているつもりです。

```
> x <- c(1,2,2,2,2,3,4,4,5,5,6,6,7,8,8,8,9,11,13,15,15,16,16,18,21,28)
> y <- c(4,1,2,8,12,7,4,7,3,5,13,14,5,1,3,7,15,9,1,11,14,3,4,1,4,11)
> plot(x,y)
```


![スクリーンショット 2015-11-19 1.06.50.png](https://qiita-image-store.s3.amazonaws.com/0/72840/234f3ad9-62cb-ebf0-347d-99f23f1aaaee.png)


##2次元Kernel密度推定の実行
MASSライブラリのkde2d関数を実行して密度推定を行います。バンド幅は良いものを探さないといけないが、今回はそれを補助するバンド幅決定関数:bandwidth.nrdを使用します。

```
> d = kde2d(x,y,c(bandwidth.nrd(x), bandwidth.nrd(y)),n=80)
> image(d)
```

![スクリーンショット 2015-11-19 1.09.38.png](https://qiita-image-store.s3.amazonaws.com/0/72840/89633da3-0ade-eab6-f33e-4dce00988ac8.png)


##おまけ

contour関数を使えば等高線が書けます。
max関数を使えば最大密度の値が求まります。

```
contour(d)
> max(d$z)
[1] 0.005004014

```


![スクリーンショット 2015-11-19 1.10.00.png](https://qiita-image-store.s3.amazonaws.com/0/72840/a34dadfb-7f1c-8480-5a6a-e450fbbd4287.png)

[参照 http://bio-info.biz/tips/r_kde2d.html ]
Raspbianでdockerを使う@2015年11月版

最初はUbuntuMateとかArchLinuxを使ってみてたんですが、Mathematicaのライセンスの都合もあってraspbian上でdockerを走らせたかった。

[Downloads · Docker Pirates ARMed with explosive stuff](http://blog.hypriot.com/downloads/ "Downloads · Docker Pirates ARMed with explosive stuff")

こちらのページの上から2段目の表のdebをraspbianに食わせるだけの簡単なお仕事。
どこからともなくdocker同梱版raspbianのimgを拾ってきたりする必要はもうないんですね…

---
追記
docker 1.8.3(13.10.2015)のdebまでは食わせるだけでいいみたいだけど、1.9.0_2(08.11.2015)以降はカーネルにoverlayfsを要求する都合上ただのraspbianじゃ動かないっぽい。
mbind（std::bindのメタ関数版）

mbind はstd::bindと同じようなことをメタ関数などのテンプレートテンプレート名に対して行うもので、型を引数に取りコンパイル時に評価される式である。作って1年以上放置していたが、最近少し直したので記事にした。（Hatena Blogからの再掲です。）

### class template： mymd::mbind
```cpp
namespace mymd {
    // mbindの主要インタフェース（他のメンバーは省略）
    template <template <typename...> class M, typename... binder>
    class mbind {
    public:
        template <typename... V>
            using apply = 各プレースホルダにV...を代入してできる型;
    };
}
```

### 概要
クラステンプレート M に対し、型引数を部分的に束縛(bind)する。
mbind\<F, binder...> の binder... の中にプレースホルダ(\_x_, \_xrr_, \_xrcv_ 等)が含まれていれば、その位置に apply\<V...> を使って任意の型を代入することができる。

### テンプレート引数
M -- 複数の型を引数に取るクラステンプレート
binder... -- 束縛対象の型もしくはプレースホルダ(\_x_, \_xrr_, \_xrcv_ 等)の列

### メンバーテンプレート
apply -- apply\<V...> が型を定義する。V... に入れられる型の数は、mbind のテンプレート引数 binder... に含まれるプレースホルダの数に等しい。V... にプレースホルダが含まれていない場合は M\<T...> になる（M\<T...>::type ではない）。ここで T... は binder... の中のプレースホルダを順に V... の元に置き換えたものである。ひとつ以上のプレースホルダが V... に含まれている場合は mbind 型となり、続けて apply が可能となる。

### 例
メタ関数の例として\<type_traits\> の std::is_convertible をとる。

```cpp
#include <type_traits>
using mymd::_x_;
using b = mymd::mbind<std::is_convertible, int, _x_>;           // 第1引数をintに束縛する
static_assert(b::apply<double>::value, "not convertible!!");    // intからdoubleへの変換は可能
static_assert(!b::apply<int*>::value, "not convertible!!");     // intからint*への変換は不可能
```
次はtuple の例。

```cpp
#include <tuple>
// 完成型は5要素のtuple
using tuple5 = std::tuple<char, std::string, int, char, int>;
using mymd::_x_;
// 3つの型を束縛（2つはプレースホルダ）
using bind_3_5 = mymd::mbind<std::tuple, char, _x_, int, _x_, int>;
// 残り２つの型を指定する
using bind_5_5 = bind_3_5::apply<std::string, char>;
static_assert(std::is_same<bind_5_5, tuple5>::value, "!=");
```

### 定義済みプレースホルダ
apply でプレースホルダに対して任意の型を代入したとき、プレースホルダの種類によって以下のように変換される。
mymd::\_x\_ -- 基本のプレースホルダ。型変換せずそのまま代入される。
mymd::\_xrr\_ -- std::remove_reference<型>::type が代入される。
mymd::\_xrcv\_ -- std::remove_cv\<型>::type が代入される。
mymd::\_xrcvr\_ -- std::remove_cv\<std::remove_reference<型>::type>::type が代入される。
mymd::\_xdecay\_ -- std::decay<型>::type が代入される。

これらはプレースホルダ生成型である mymd::\_pX_ から定義されている。\_pX_ にメタ関数の列 convert... を与えて \_pX_\<convert...> を作れば、型 T に対してconvert0\<convert1\<convert2\<... \<T>>...> が評価されるようになっている。たとえば \_xrcvr_ は \_pX_\<std::remove_cv, std::remove_reference> と定義されている。
convert\<T> か convert\<T>::type かは勝手に判断している。（再考の余地あり？）

### 論理 or、論理 and、論理 not
mbind そのものはインスタンスを作る意味はあまりないが、インスタンスに対する operator ||, operator &&, operator ! が定義されているので、論理 or、論理 and、論理 notを作るときはインスタンス化するとやりやすい。これを型に対する式で表そうとすると相当ややこしくなってしまう。

### モジュール
hppファイル：　https://github.com/mYmd/miscellaneous/blob/master/mbind.hpp
サンプル：　https://github.com/mYmd/miscellaneous/blob/master/test_mbind.cpp
[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ ：　http://melpon.org/wandbox/permlink/6GFinX4byC5j6bCZ
1次元Kernel密度推定

#1次元Kernel密度推定：density( )

##データの取得と確認
イエローストーン国立公園にあるOld Faithful間欠泉の噴出時間
のデータを解析します。

データセットの取得
feに噴出時間データのみを抜き出す

```
> head(faithful)
  eruptions waiting
1     3.600      79
2     1.800      54
3     3.333      74
4     2.283      62
5     4.533      85
6     2.883      55
> fe <- faithful$eruption

```

度数分布, Histgramを確認

```
> stem(fe)
  The decimal point is 1 digit(s) to the left of the |
  16 | 070355555588
  18 | 000022233333335577777777888822335777888
  20 | 00002223378800035778
  22 | 0002335578023578
  24 | 00228
  26 | 23
  28 | 080
  30 | 7
  32 | 2337
  34 | 250077
  36 | 0000823577
  38 | 2333335582225577
  40 | 0000003357788888002233555577778
  42 | 03335555778800233333555577778
  44 |002222335557780000000023333357778888
  46 | 0000233357700000023578
  48 | 00000022335800333
  50 | 0370
```

```
hist(fe, freq=FALSE)

```

![スクリーンショット 2015-11-19 0.49.00.png](https://qiita-image-store.s3.amazonaws.com/0/72840/fca6c507-f6f3-a930-89c3-5ed18999fc91.png)

##Kernel密度推定
観測データのヒストグラムからKernel密度推定を行う。
ここではRにあるdensity関数を用いる。

```
> fe.d <- density(fe)
> hist(fe, freq = FALSE)
> lines(fe.d)
```
![スクリーンショット 2015-11-19 0.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/72840/f7b75621-f941-2ad5-d165-d82c8c6fe678.png)


Kernel推定の窓を変えると推定が変化する。
窓(bw=band width)を広げるほど大雑把な推定になり、窓を狭めるほどブレの大きい推定になる。

```
> fe.d <- density(fe)
> fe.d1 <- density(fe, bw = 0.1)
> fe.d2 <- density(fe, bw = 1)
> hist(fe, freq = FALSE)
> lines(fe.d)
> lines(fe.d1)
> lines(fe.d2)
> 
```

![スクリーンショット 2015-11-19 0.52.43.png](https://qiita-image-store.s3.amazonaws.com/0/72840/9a5afe9c-643b-1e58-36b6-9f20093fdb29.png)

[参照 http://d.hatena.ne.jp/tsutatsutatsuta/20120928/1348801089 ]
Sublime TextでJavaのプロパティファイルを操作できるようにする

# 概要
Sublime Text 3でJavaのプロパティファイルを操作できるようにする

Before
![ascii_properties.png](https://qiita-image-store.s3.amazonaws.com/0/12759/b9982514-2d3e-ea2d-a190-df18b962657b.png)

After
![native_properties.png](https://qiita-image-store.s3.amazonaws.com/0/12759/af6f1909-bd79-7e1f-353f-1580a619a178.png)

# 設定
Package Controllで"JavaPropertiesEditor"パッケージをインストールする。
これでプロパティファイルをEclipse等を開かなくてもさくっと修正できる。

Package Controllそのものの使い方はこちらを参照。
http://futago-life.com/sublime-text3-wiki/first-step/install/package-control
Macで簡易的にPHPを動かす方法

# ***成長したら、Docker使おう。でも今はローカルでいい***

MacOSXでPHPを動かすにはとLAMP環境作る必要がとか思ってMANPとか入れようかと思ったのですが、よくよく考えたらそういうの元々あったなとググりました。

そう、結局MacにはApacheもPHPもpythonもrubyもあるのです。

なので、細かいバージョン違いを吸収する必要がないテスト環境であれば、別にターミナルから動かせばよいのです。ということでPHPを簡単に動かす方法を書きます。

##前提条件
　ターミナルを起動しておくこと
　chromeをターミナルから以下のコマンドで起動する。
  ```open /Applications/Google\ Chrome.app/ --args --disable-web-security```
  ※ただし、完全に終了した状態で起動しないと意味が無い。
　※参考　【解説付き】chromeでXMLHttpRequestをローカルのファイルで行う方法（http://qiita.com/growsic/items/a919a7e2a665557d9cf4）

##phpmoduleのApacheへの組み込み
httpd.confを操作する。ターミナルを起動し、
```sudo vi /private/etc/apache2/httpd.conf```
と入力する。そうすると、phpの拡張モジュール一覧が表示されているので、169行目あたりに書いてある、
```#LoadModule php5_module libexec/apache2/libphp5.so```
の#を削除して、
```LoadModule php5_module libexec/apache2/libphp5.so```
と設定して、上書き保存する。

※viを起動した際は、最初に行番号を表示させると便利なので、```:set　number```と入れて、行番号を表示させて、```169G```と入れると該当の行に一発で飛ぶ。また、入力時には"i"と入力しINSERT状態にする。終了する際は上書きする場合は```wq!```と入れEnterキーを入れる。

##Apacheの起動
```sudo apachectl start```を叩く。この時Adminパスワードを要求されるので素直に入力する。

再起動の場合は```sudo apachectl restart```と入れる。

起動したことを確認すべく、Chromeのアドレスバーにlocalhostと入力する。そうしたら「It works!」と表示されることを確認する。

###PHP動作確認
MacのwebServerは以下のディレクトリを参照している。
```/Library/WebServer/Documents/```
そのため、このディレクトリに、

```PHP:test.php
<?php
  phpinfo();
?>
```

を記載した、test.phpを配置する。この際、ATOMやvi等のエディタで直接作ってそのまま保存することは出来ないので注意。何故かと言うと、ディレクトリの変更であるため、Administratorパスワードを要求されるからだ。

該当ディレクトリにtest.phpを配置したら、localhost/test.phpと入力してみるといいだろう。PHPのバージョンなどが表示されたら成功だ。

###いざPHPをテストする。
~/Document/等の直下にhtmlやjsファイルを置いて、サーバとの通信テストを行う。この時、JSのhttpサービス利用すると思うが、ディレクトリの指定は相対パスよりも絶対パスのほうが確実だろう。

Macで絶対パスを調べる方法は非常に簡単だ。対象ファイルをターミナルにDrug & Dropすれば良い。これで絶対パスがわかる。

期待通りのメッセージなどが返ってくることを確認したら成功だ。
DBを使うようなサービス（JSONだけとか）ならこれで十分である。

もし、これ以上の事をやるなら素直にHeroku等を利用したほうが早い。

###PHP5.4以降だと・・・
ターミナルを起動して、php -v と打って5.4とか7.0.2とか出てきたら、このやり方よりもずっと簡単です。

``$ cd hogehoge``

と入れてphpのサーバのルートディレクトリとしたいディレクトリに移動します。

``$ php -S localhost:8000``

といれると内蔵サーバが起動します。

ブラウザに

``localhost:8000``

と入れてくれればPHPのWelcomページが見えるはずです。

※ご指摘いただきましたので追記しました。ありがとうございました。
gvim(kaoriya)でneobundleがうまく動かなかったときのメモ

# 環境

* OS : Windows10, 7
* [GVim](http://www.kaoriya.net/software/vim/) : vim74-kaoriya-win64-20150628
* [NeoBundle](https://github.com/Shougo/neobundle.vim) : versionわからず

# 事象

1. NeoBundleを%userprofile%/.vim/bundle/配下にclone
1. 公式[README.md](https://github.com/Shougo/neobundle.vim/blob/master/README.md)を参考に、_vimrcにConfigure bundlesの設定を追記
1. GVim起動すると、NeoBundleInstallが実行されるも、すぐにエラーが発生してしまう

# 結論

* NeoBundleの置き場を変更した
    * %userprofile%/.vim/bundle/配下 ⇒ vim74-kaoriya-win64/vim74/bundle/配下
    * _vimrc記載のneobundleのパスを上記に合わせて修正

以上
Ansibleを使ってbundle installがしたい


## やったこと

`bash -lc`を追加し、`sudo_user`にrbenvをインストールしたユーザを指定した


```yaml:
- name: Install Bundler
  sudo_user: your_rbenv_user
  command: bash -lc "gem install bundler"
```

## 参考

[ruby - Install Bundler gem using Ansible - Stack Overflow](http://stackoverflow.com/questions/22115936/install-bundler-gem-using-ansible)
Ruby on RailsのデータベースをPostgreSQLに設定する。

ググッた情報でやっても
`rake db:create`で
`FATAL:  Ident authentication failed for user "username"`
がでてうまくいかなかったのでメモ

# 環境
Amazon-EC2
CentOS
Rails 4.2.4

# やったこと
## PostgreSQLのインストール
```
$ sudo yum -y install postgresql94
$ sudo yum -y install postgresql94-devel
$ sudo yum -y install postgresql94-server
$ psql --version
psql (9.4.5)
```
## 初期化からの起動
```
$ sudo /etc/init.d/postgresql94 initdb
$ sudo /etc/init.d/postgresql94 start
```

## PostgreSQLアカウントの設定
```
$ sudo -u postgres psql
postgres=# alter role postgres with password 'hogehoge';
postgres=# alter role [user_name] with password '[password]';
```

## データベースの作成
```
postgres=# create database [database_name] owner [user_name];
```

## アクセス権限の設定
`$ vim /var/lib/pgsql94/data/pg_hba.conf`

`local all all peer`を
`local all all md5`に変更

# Railの設定
## アプリの作成
` $ rails new myapp -d postgresql`

## config/database.ymlの設定
```
default: &default
  adapter: postgresql
  encoding: utf8
  pool: 5
  username: [username]
  password: [password] 

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
```

## データベース作成
`rake db:create`

以上の手順で出来たんですが、これであっているのか分からないので何か気づいたらコメントお願いします。
リソース確認コマンド

# CPU
## `$ top`
## `$ sar -u`
* %user ユーザプロセスの割合 
* %nice nice値(優先度)つきプロセスの割合
* %system システムプロセス(カーネル)の割合
* %iowait I/O待ち時間の割合
* %steal バーチャルマシンに使用された時間の割合
* %idle アイドル時間の割合

# ディスクI/O
## `$ sar -b 1`
* tps I/O転送リクエスト数/秒
* rtps デバイス読み込みリクエスト数/秒
* wtps デバイス書き込みリクエスト数/秒
* bread/s デバイスからの読み取りブロック数/秒
* bwrtn/s デバイスへの書き込みブロック数/秒


## `$ iostat 1`
* tps　I/O転送リクエスト数/秒
* Blk_read/s　デバイスからの読み取りブロック数/秒
* Blk_wrtn/s　デバイスへの書き込みブロック数/秒
* Blk_read　デバイスからの読み取りブロック数
* Blk_wrtn　デバイスへの書き込みブロック数

# ネットワークI/O
## `$ sar -n DEV`
* IFACE ネットワークインタフェース名
* rxpck/s 受信パケット数/秒
* txpck/s 送信パケット数/秒
* rxbyt/s 受信バイト数/秒
* txbyt/s 送信バイト数/秒
* rxcmp/s 圧縮パケットの受信バイト数/秒
* txcmp/s 圧縮パケットの送信バイト数/秒
* rxmcst/s マルチキャストパケットの受信パケット数/秒

## `$ sar -n EDEV`
* IFACE ネットワークインタフェース名
* rxerr/s エラーパケット受信数/秒
* txerr/s 送信時のエラーパケット発生数/秒
* coll/s コリジョン発生数/秒
* rxdrop/s バッファ不足で破棄された受信パケット数/秒
* txdrop/s バッファ不足で破棄された送信パケット数/秒
* txcarr/s 受信時のキャリアエラー数/秒
* rxfram/s 受信時のフレームエラー数/秒
* rxfifo/s 受信パケットのFIFOオーバーラン数/秒
* txfifo/s 送信パケットのFIFOオーバーラン数/秒

## `$ netstat -i`
## `$ netstat -s`

# メモリ
## `free -m`
## `sar -r`
kbmemfree 空きメモリ(KB)
kbmemused 使用メモリ(KB)
%memused 使用メモリ(%)
kbbuffers バッファキャッシュサイズ(KB)
kbcached ページキャッシュサイズ(KB)
kbcommit 調査中 
%commit 調査中
Hyper-V上にNAS構築・データ移行のすすめ。

# きっかけ
仮想マシンサーバとして24時間起動させているPCがあったんですが、ディスクもCPUも使用率が低く、遊ばせておくのも勿体ないのでバックアップサーバーも兼用させてみました。
まぁ、今までもバックアップを保存していたんですが、以下のような問題を色々と抱えていました。。。
・HDDの電源が切れると再起動するまで見えなくなる(HDD見失い病と言うらしい・・・)
・常時電源ONにする設定がWindowsの更新でたまに消える
・ディスクの利用効率が悪い
見えなくなってデータが消えるのが一番怖いので、とりあえず耐障害性のあるRAID5とかRAID6にしたかったんですが、一気に同じ容量のHDD買うなんて無理です。

そこで気になるのが「Beyond RAID」とか「Synology Hybrid RAID」。異なる容量のHDDを上手いこと組み合わせ、RAID5やRAID6相当の信頼性で動作するとの事。

**でもめっちゃ高い。。。**

というわけで調べてみたら、Linuxであれば簡単に似たようなことが出来るという事のようです。

# 効果
仕組みとしては、パーティションを区切ってソフトウェアRAIDを構築し、LVMで束ねるという事でした。
やり方や詳細な仕組みは[参考元](#参考元)だけで充分だと思うので、結論だけでいうと、
・容量の異なるHDD(2～4[TB]x6つ)でRAID5相当のNASを構築できた。
・LVMでパーティションを1つに出来たのでディスクの利用効率が上がった。
・Hyper-VのHDDパススルー接続機能で仮想→物理サーバー化出来る(かも)
・めっちゃ早い！ **(完全に想定外！)**

# はまった点
* partedでファイルシステムをext4に変更すると上手くフォーマットされない
 →デフォルト(ext2)のままだと上手くいく模様。
* ネットワークが不安定
 →クライアントHyper-Vが有効な状態で、VirutalBoxのクライアントPCを作成・起動していたから？
 →ホストOSとNICを共有していたから？
 念のためUSBのNICを追加し、Hyper-Vのクライアント専用と設定。
* Windows10 Build 10586にアップデートしたら起動しない
→アップデートで権限の設定が初期化された模様。Hyper-Vマネージャ上で物理HDDを削除・再度追加で解決。
* RAID5のくせに性能が出ない(ホストから仮想マシンへのファイルコピーで書き込みが80～120[MB/s]くらい)
 →当初「Hyper-V上の仮想マシンなのでやむなし？」と思っていたが、NICがボトルネックだった。

#  何故Hyper-Vか
はまった点の最後ですが、「RAID5のなのにちょっと遅いなぁ～」とか「ホストPCー別の物理PC間だともう少し早いからネットワークじゃないしなぁ～」とか思ってたらネットワークでした・・・
Hyper-Vだと内部ネットワークのリンク速度が10Gbpsなので、それなりの速度でアクセス出来るようになるみたいです。
参考までにベンチマーク結果を乗せておきます。

* 一番最近買った4[TB]のHDD(WDのgreen？)
 ![L.PNG](https://qiita-image-store.s3.amazonaws.com/0/44704/70011dc9-3822-b127-8367-c647aa6cac30.png)


* USBのNIC経由でネットワークドライブを設定
![F.PNG](https://qiita-image-store.s3.amazonaws.com/0/44704/6d95fc48-ee9d-d823-0cff-871037a4bb32.png)


* 内部ネットワークの仮想NIC経由でネットワークドライブを設定
![F2.PNG](https://qiita-image-store.s3.amazonaws.com/0/44704/f150ad45-d4ad-149b-6ae7-0f5b5e686481.png)

というわけで、HDD6つくらい使えばSSD位の速度でアクセス出来るので、Hyper-Vを使うのがお勧めです。

# 参考元
具体的な手順や仕組みは以下のサイトを参考としてください。
[mdadm と LVM で作る、全手動 BeyondRAID もどき](http://ruzia.hateblo.jp/entry/2014/01/04/203603)
クロージャについて


Swiftの勉強をしようと思って、本を眺めてたら出てきた言葉「クロージャ」について調べてみたのでメモ。

##クロージャとは
無名関数、ラムダ式などとも呼ばれている。
無名関数という名前の通り、関数名を記述しない書き方ができる。

##文法
クロージャの文法は以下の通り。

```
{ (引数) -> 戻り値型 in
	処理
}
```

##Try
試してみた。

```Swift
var lastYear = 2013
var japanCarOfTheYear = { (year: Int) -> String in
    lastYear++
    if year == 2014 {
        return "マツダ デミオ"
    } else {
        return "フォルクスワーゲン ゴルフ"
    }
}
// "フォルクスワーゲン ゴルフ\n"
print(japanCarOfTheYear(lastYear))
// "マツダ デミオ\n"
print(japanCarOfTheYear(lastYear))
```

##まとめ
ちょっとした導出など、再利用することのない処理であれば関数として定義せずに書けることがわかった。
babelify v7.2.* で 'sourceType: module' エラーを回避

## 現象

gulpでbabelify v7.2.0をinstallしてトランスパイルしたら以下の様なエラーが発生した。

```bash
$ gulp
[18:24:05] Using gulpfile ~/hoge/gulpfile.js
[18:24:05] Starting 'browserify'...
[18:24:05] Finished 'browserify' after 25 ms
[18:24:05] Starting 'default'...
[18:24:05] Finished 'default' after 11 μs
Error : 'import' and 'export' may appear only with 'sourceType: module'
```

gulpfileは以下のとおり。

```js
var gulp       = require('gulp'),
    browserify = require('browserify'),
    babelify   = require('babelify'),
    source     = require('vinyl-source-stream');

gulp.task('browserify', function() {
  browserify('src/index.js', { debug: true })
    .transform(babelify)
    .bundle()
    .on("error", function(err) {
      console.log("Error : " + err.message);
    })
    .pipe(source('bundle.js'))
    .pipe(gulp.dest('./'))
});

gulp.task('default', ['browserify']);
```

## 解決策

browserifyのtransformの第2引数にpresetsを指定する。

`.transform(babelify, {presets: ['es2015']})`

Babel6.0.0からの仕様でpresetsを指定する形式になったらしい。babelifyはBabelのラッパーみたいなもののようで。

これを踏まえてpresetsをinstallし、browserifyのタスクは以下のように書くと良い。

```bash
$ npm install --save-dev babel-preset-es2015
```

```js
gulp.task('browserify', function() {
  browserify('src/index.js', { debug: true })
    .transform(babelify, {presets: ['es2015']})
    .bundle()
    .on("error", function (err) { console.log("Error : " + err.message); })
```

## 所感

最近はあるバージョンから突然トランスパイルなどが動かなくなる時があるが、だいたいGitHubかNPMパッケージとかに書いてあるので真っ先に見ると良さそう。

https://github.com/babel/babelify
Faradayのログをきれいに出す

Faradayのログをきれいにしたり、通信時間などをログ出力する方法
※ Rails または ActiveSupportが必要
検索用キーワード: faraday change custom format log output url time elapsed

# デフォルトのログ出力はあまりきれいではない

例えば以下のような感じ

```
I, [2015-03-23T18:25:52.041359 #10667]  INFO -- : post http://localhost:3000/
D, [2015-03-23T18:25:52.041475 #10667] DEBUG -- request: User-Agent: "Faraday v0.9.1"
Content-Type: "application/x-www-form-urlencoded"
I, [2015-03-23T18:25:52.366326 #10667]  INFO -- Status: 200
D, [2015-03-23T18:25:52.366479 #10667] DEBUG -- response: x-frame-options: "SAMEORIGIN"
x-xss-protection: "1; mode=block"
x-content-type-options: "nosniff"
content-type: "text/html; charset=utf-8"
etag: "W/\"505a83f220c02df2f85c3810cd9ceb38\""
cache-control: "max-age=0, private, must-revalidate"
x-request-id: "c4eb0384-12d5-43ae-8755-d516f02959c6"
x-runtime: "0.301850"
server: "WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08)"
date: "Tue, 24 Mar 2015 01:25:52 GMT"
content-length: "7"
connection: "close"
set-cookie: "request_method=POST; path=/"
```

[ログのサンプル参照元](https://github.com/tbreier/faraday_test/blob/master/README.md)

通常のデフォルトのログ出力の設定はconnectionを作成するところなどで、以下のように設定する

```rb
Faraday.new(:url => base_url) do |faraday|
  ...
  faraday.response :logger 
  ...
```

# ログ出力を整形する

### faraday_middlewareを追加

```rb:Gemfile
gem 'faraday_middleware'
```

gemの場合

```rb:mygem.gemspec
spec.add_dependency "faraday_middleware"
```

```rb:lib/mygem.rb
require "faraday_middleware"
```

### faraday初期化時のオプション

connection(session)作成箇所やdefault optionsを指定している箇所で

```rb
Faraday.new(:url => base_url) do |faraday|
  ...
  # faraday.response :logger 
  faraday.use FaradayMiddleware::Instrumentation
  ...
```

### ログ出力設定 Active Support Instrumentation

Railsの場合、initializerなどで

```rb:config/initializers/faraday_logger.rb
if Rails.env.development?
  ActiveSupport::Notifications.subscribe('request.faraday') do |name, starts, ends, _, env|
    url = env[:url]
    http_method = env[:method].to_s.upcase
    duration = ends - starts
    Rails.logger.debug "#{http_method} '#{url}' takes #{duration} seconds"
  end
end
```

gemのテストなどでは`spec/support/faraday.rb`などに置けば良い

[Active Support Instrumentation — Ruby on Rails Guides](http://edgeguides.rubyonrails.org/active_support_instrumentation.html)
[FaradayMiddleware::Instrumentation](https://github.com/lostisland/faraday_middleware/blob/master/lib/faraday_middleware/instrumentation.rb)

### ログ出力の例

```
GET 'http://example.com/foo?abc=123' takes 0.100123 seconds
POST 'http://example.com/bar' takes 0.500086 seconds
```

使えそうな情報

```
> env.keys
[:method, :body, :url, :request, :request_headers, :ssl, :response, :response_headers, :status]

> env[:method]
:get
> env[:url].class
URI::HTTP
> env[:request_headers]
{"User-Agent"=>"Mozilla/5.0 ..."}
> env[:body]
"<HTML><HEAD><TITLE>..."
> env[:status] # env[:response].status
200
> env[:response_headers] # env[:response].headers
{"date"=>"Fri, 06 Feb 2015 14:13:31 GMT", "set-cookie"=>...}
```
Scheme(Gauche)でマイナンバーのチェックデジットを計算する

# TL;DR
何やら流行っていそうだったので。

途中で少しダルくなって命名がテキトーですが。。。

```calculateMyNumber.scm
(use gauche.sequence)

;; マイナンバーのチェック計算
;; dataPair = ("11桁の数値文字列" . チェックデジット)
(define (calculateMyNumber dataPair)
  ;; チェックデジットの判定
  (define (judgeDigit modValue checkDigit)
    (cond ((= modValue 0) (= checkDigit 0))
          ((= modValue 1) (= checkDigit 0))
          (else           (= checkDigit (- 11 modValue))) ))
  ;; Pn * Qn を返す
  (define (getPn*Qn pn n)
          (if (< 6 n)
              (* pn (- n 5))
              (* pn (+ n 1))))
  (judgeDigit (mod (fold + 0 (map-with-index (lambda (n x) (getPn*Qn (digit->integer x) (+ n 1)))
                                             (reverse (string->list (car dataPair)))))
                   11)
              (string->number (cdr dataPair))))

;; 妥当な形式か(数値文字列か、桁数は正しいか)？
(define (validMyNumber? value)
  (if (string? value)
      (if (= (string-length value) 12)
          (string->number value)
          #f)
      #f))

(define (verifiMyNumber numberString)
  (if (validMyNumber? numberString)
      (calculateMyNumber ((lambda (value)
                                  (cons (substring value  0 11)
                                        (substring value 11 12)))
                          numberString))
      #f))

(for-each (lambda (x) (print x " : " (verifiMyNumber x)))
          '("123456789010"
            "123456789011"
            "123456789012"
            "123456789013"
            "123456789014"
            "123456789015"
            "123456789016"
            "123456789017"
            "123456789018"
            "123456789019"
            "023456789013"))
```
```結果.txt
123456789010 : #f
123456789011 : #f
123456789012 : #f
123456789013 : #f
123456789014 : #f
123456789015 : #f
123456789016 : #f
123456789017 : #f
123456789018 : #t
123456789019 : #f
023456789013 : #t
```
もっとサラリとしたコードが書きたい。

* 修正
    - 合計を計算するのに名前付きletでループする必要なんてなかったんや
        - 少し気持ちがスッキリした。
    - せっかくだからGaucheの便利な `map-with-index` を選ぶぜ
    - インデントしてみると合計の余りを出すための 11 がなんかシュール
* さらに修正
    - もちっとコードを整理 
        - 無名関数呼び出しにしたり、名前を変えたり、見た目を調整したり
手順そのものをテスト項目にするのはやめよう（ていうか、やめて...）

よく、エクセルのテスト仕様書で、テストの項目が下記のようにあったりしますが、

1. Aをする
2. Bをする
3. Cをする

実は、AとBは、Cを実行するための事前処理にすぎなくて、本当にテストしたい（する価値がある）のは3番だけというのが、しばしばあって... 

（ひどい例として、FTPのクライアントソフトの使い方がテスト項目としてあげられていたことも。意味があったのは、指定されたユーザのアクセス権限に関するものだけ）

これの問題点は、

* 上から順番にやらないと、テスト実行の条件を満たせない
* 各項目が、前の項目にどこまで依存しているかが曖昧
* 何をテストしているのかも曖昧

と、わけがわからなくなる罠を自然発生させる気がする。
もろもろの背景を知らないと、まともにテストできないようなテスト仕様書の温床でしょうか。

テストする側としては、項目が手順に近い方が作業的には楽なのですが、仕様と手順をひとつにまとめていることの弊害でしょうか。

テストしたい事象・対象と、手順・入力値・期待する結果の組（テストケース）の区別ができていないというか、なんというか。
ShinobiLayer: SoftLayerでワークロードごとに最適なプロセッサーを見つける方法

http://www.softlayer.com/intel-processor
より以下のリンクを選択します。ただし、言語は英語にしておかないと表示されないので注意して下さい。
![processor01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/488d8385-4c74-a2ce-e989-b669d17b5608.jpeg)

以下のような画面が出てくるので、Business Applications/High-Performance Computing/Business Analysis/Web & IT Infrastructureからワークロードを選択します。ポイントは、このワークロードによって、ベンチマーク指標値やプロセッサー世代などが変わるので、性能がLOW/MIDDLE/HIGHのどれなのかによって、選ぶべきプロセッサーを見つけられることです。

| ワークロード種類 | ベンチマーク指標|
|:-----------|:------------|
| Business Applications      |  SPECint*_rate_base2006 Score |
| High-Performance Computing | Intel® Optimized MP LINPACK Rmax (GFLOPS) Score |
| Business Analytics      |  SPECfp*_rate_base2006 Score |
|  Web & IT Infrastructure      |  SPECint*_rate_base2006 Score |

![processor02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/5a7a3d17-68c5-3910-3812-fdb2c4c7158b.jpeg)
UnityでLoadLevel等を実行するとマテリアルが真っ黒になる現象の解決法


## 使用ツール及びアセットとモデル（一応明記）
Unity 5.2.2f1（64bit版）
PMDEditor_0139
MMD4Mecanim_Beta_20150821
Standard Assets
UniRx
UnityVS
alva式『比那名居天子』と『緋想の剣』
バトーキン島

## 発生した現象
あるシーンから別のシーンへ切り替える為にApplication.LoadLevel(SceneName)等のシーン切り替えをしようとすると
![2015-1118-21_58_26.png](C:\Users\meronmks\Pictures\capture\2015-1118-21_58_26.png)
こんな風に切り替え先のモデルのテクスチャが真っ黒になってしまう。

## 解決方法
「Window」→「Lighting」でLightingウインドウを呼び出し
![2015-1118-23_26_31.png](C:\Users\meronmks\Pictures\capture\2015-1118-23_26_31.png)

「Lightmaps」タブを選択しAutoの左横にあるチェックを外し、右の「Build」ボタンで現時点でのLightmapをBuild
![2015-1118-23_28_58.png](C:\Users\meronmks\Pictures\capture\2015-1118-23_28_58.png)

Lightmap SnapshotにBuildされ生成されたLightmapが自動で選択された状態になるので、この状態で再びApplication.LoadLevel(SceneName)等のシーン切り替えをしようとすると
![2015-1118-23_16_23.png](C:\Users\meronmks\Pictures\capture\2015-1118-23_16_23.png)

このように正常にテクスチャの描画が行われる。
めでたしめでたし。
VMware PlayerでゲストOS（CentOS7）に複数のNICを認識させる

VMWare Playerの設定で「ネットワークアダプタ」を追加したにも関わらず、ゲストOS（CentOS7）ではNICが追加されていない、ということが起きた際の対処方法を述べる。

# 環境
+ ハードウェア
NICは1000Base-Tが1つのみ。

+ ソフトウェア
VMWare Player 7.1.0
ホストOS：Windows 7 (64bit）
ゲストOS：CentOS 7(1503）

# 手順
要は、ゲストOSが保存されているフォルダ（例えば C:\Users\ユーザ名\Documents\Virtual Machines\VM名 ）へ移動して、vmxファイルをテキストエディタで開いて編集すればよい。

以下に、実際に進めた手順を述べる。

仮想マシン作成時のハードウェア設定では、
　・ネットワークアダプタ　ブリッジ（自動）
　・ネットワークアダプタ2　ホストオンリー
のように設定した。この場合、vmxファイルのethernet[0-1]は次のようになっていた。

```:修正前
ethernet0.present = "TRUE"
ethernet0.virtualDev = "e1000"
ethernet0.wakeOnPcktRcv = "FALSE"
ethernet0.addressType = "generated"
ethernet0.linkStatePropagation.enable = "TRUE"
ethernet1.present = "TRUE"
ethernet1.vnet = "VMnet1"
ethernet1.connectionType = "hostonly"
ethernet1.wakeOnPcktRcv = "FALSE"
ethernet1.addressType = "generated"
```

この状態でOSインストールし、deviceを確認すると以下の通り。
Ethernet（en）が1つしかない。

```
[root@host01 ~]# nmcli device 
DEVICE       TYPE      STATE      CONNECTION  
virbr0       bridge    connected  virbr0      
eno16777736  ethernet  connected  eno16777736 
virbr0-nic   tap       connected  virbr0-nic  
lo           loopback  unmanaged  --
```

そのため一旦ゲストOSを落とし、vmxファイルを以下のように修正。
　・ethernet1.vnet行を削除
　・ethernet1.virtualDev = "e1000" を追加
補足：ethernet1.virtualDevの値（今回は"e1000"）については、ethernet0と同じにすれば良い。


```:修正後
ethernet0.present = "TRUE"
ethernet0.virtualDev = "e1000"
ethernet0.wakeOnPcktRcv = "FALSE"
ethernet0.addressType = "generated"
ethernet0.linkStatePropagation.enable = "TRUE"
ethernet1.present = "TRUE"
ethernet1.virtualDev = "e1000"
ethernet1.connectionType = "hostonly"
ethernet1.wakeOnPcktRcv = "FALSE"
ethernet1.addressType = "generated"
```

変更後、ゲストOSを立ち上げて確認。

```
[root@host01 ~]# nmcli device 
デバイス     タイプ    状態      接続        
virbr0       bridge    接続済み  virbr0      
eno16777736  ethernet  接続済み  eno16777736 
eno33554960  ethernet  接続済み  有線接続 1  
virbr0-nic   tap       接続済み  virbr0-nic  
lo           loopback  管理無し  -- 

[root@host01 ~]# export LANG=C

[root@host01 ~]# nmcli device 
DEVICE       TYPE      STATE      CONNECTION  
virbr0       bridge    connected  virbr0      
eno16777736  ethernet  connected  eno16777736 
eno33554960  ethernet  connected  ???? 1  
virbr0-nic   tap       connected  virbr0-nic  
lo           loopback  unmanaged  --   


```

eno33554960が追加された。ただ、接続（CONNECTION）列が「優先接続 1（???? 1）」となってしまったことと、/etc/sysconfig/network-scrips/ifcfg-eno33554960が作られていないことを確認。
nmtuiでeno33554960のプロファイル名を編集して接続（CONNECTION）を修正。このnmtuiの保存の際、/etc/sysconfig/network-script/ifcfg-eno33554960も生成されて一段落。

IPアドレスを確認すると、ホストオンリーネットワーク（192.168.238.X/24）に無事接続できていることも確認。

```
[root@host01 ~]# ip a s eno33554960
3: eno33554960: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:9d:1a:14 brd ff:ff:ff:ff:ff:ff
    inet 192.168.238.129/24 brd 192.168.238.255 scope global dynamic eno33554960
       valid_lft 1541sec preferred_lft 1541sec
    inet6 fe80::20c:29ff:fe9d:1a14/64 scope link 
       valid_lft forever preferred_lft forever
```
PHP-FPM + Nginx 構成でデプロイ時(symlink利用)にPHPファイルが更新されない時

Capistrano3 を利用して、PHPのコンテンツを更新していたのだが、どうもPHPファイルだけ更新が反映されない。php-fpm を reload してみたら更新された。これは、どういうことやねんということで調べる。
ファイルを直接上書きすると、更新される。Capistrano では symlink により current ディレクトリが切り替わる仕組みとなっているため（capistrano deploy のデフォルトの挙動) この動きが何か怪しそうだ。

## 犯人はOpCache と Nginx の設定

もともとの `fastcgi_param` の設定は以下になっていた

```
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
```

どうやら、opcache は symlink にあるブツの変更を反映しない(?)
設定をいかにすることで解消可能

```
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

```

## 参考になった記事

- http://www.sobstel.org/blog/php-opcache-refresh-symlinks-nginx-php-fpm/
PHPMD実行時に好きなルールのみ適用する

# PHPMD is 何？
PHPの潜在的なバグを発見してくれるツール。
詳しくは例えば以下を参照のこと。

- 公式ページ：[PHPMD - PHP Mess Detector](http://phpmd.org/)
- [PHPMDでコードの混乱を探知！ - Qiita](http://qiita.com/syossan27/items/d2f8c3b9fdfaaf5ff43f)

# この記事を読んでわかること
- PHPMDで独自ルールセットの作り方
  - `phpmd 対象ファイル text 既存ルール1 既存ルール2 ...`とかだと、複数の詳細なルールで構成されている既存ルールを全て適用する/しないになるが、紹介する方法だと、どの詳細なルールを当てるかを指定できます。✌('ω')✌
  - 公式ページの[ルールセットの作り方](http://phpmd.org/documentation/creating-a-ruleset.html)の劣化版
- 独自ルールセットの実行方法
    - PHPMDがインストールされていることが前提です。

# 独自ルールセットの作り方
公式ページの[ルールセットの作り方](http://phpmd.org/documentation/creating-a-ruleset.html)を参考につくっていく。やり方は次の通り。

1. テンプレートファイルをコピペして任意の場所に独自ルールセットのxmlファイルを作る
    - 名前はなんでもよいですが、説明のため以降ではruleset.xmlとします
2. テンプレートに利用したいルールを書いていく
3. コマンドラインでPHPMDを実行する際に、ルールセットを読み込む


## テンプレートファイルをコピペして任意の場所にruleset.xmlを作る
以下のテンプレートをコピペして作ってください。

### テンプレート
```ruleset.xml
<?xml version="1.0"?>
<ruleset name="My first PHPMD rule set"
         xmlns="http://pmd.sf.net/ruleset/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
                     http://pmd.sf.net/ruleset_xml_schema.xsd"
         xsi:noNamespaceSchemaLocation="
                     http://pmd.sf.net/ruleset_xml_schema.xsd">
    <description>
        My custom rule set that checks my code...
    </description>
    <!-- ここから利用したいルールを書く -->
</ruleset>
```
## テンプレートに利用したいルールを書いていく
必要なルールを追記していきます。詳しいルールは[公式ページのルール一覧](http://phpmd.org/rules/index.html)を参照してください。
各ルール（以下、便宜上親ルールと呼ぶ）はいくつかの詳細なルール（以下、子ルール）からなります。`rule`で適用したい親ルールの項目を選択し、`exclude`で除外したい子ルールを指定します。

```ruleset.xml
    <!-- ここから利用したいルールを書く -->
    <!-- Import the entire unused code rule set -->
    <rule ref="rulesets/unusedcode.xml" /> <!-- 親ルールを指定すると含まれる子ルール全てが適用される -->
    <!-- Import the entire cyclomatic complexity rule -->
    <rule ref="rulesets/codesize.xml/CyclomaticComplexity" /> <!-- 子ルールの循環的複雑度チェックだけいれたい -->
    <!-- Import entire naming rule set and exclude rules -->
    <rule ref="rulesets/naming.xml">
        <exclude name="ShortVariable" /> <!-- 短い変数が使いたいので子ルールの一部を除外 -->
    </rule>
```

rulesetは常にインストールディレクトリをルートとして読み出されるようで、ruleset.xmlのpathにかかわらず`<rule ref="rulesets/hoge />`と指定しても大丈夫みたいです。

### 参考：rulesetの実体はどこにある？
composerでグローバルにインストールしている場合

```zsh
tree ~/.composer/vendor/phpmd/phpmd/src/main/resources/
/Users/User/.composer/vendor/phpmd/phpmd/src/main/resources/
└── rulesets
    ├── cleancode.xml
    ├── codesize.xml
    ├── controversial.xml
    ├── design.xml
    ├── naming.xml
    └── unusedcode.xml
```

## コマンドラインでPHPMDを実行する際に、ルールセットを読み込む
次のようなコマンドで検査対象に対して独自ルールセットを適用したPHPMDを実行します。（rulesetはデフォルトのルールセットと同じ場所に置きました。）

```zsh
phpmd file text ruleset.xml
```
ただし`file`は検査対象のファイル。`text`はアラートを出す際にテキスト形式で出力することを意味します（他に`xml`やらが指定できます）。なお、デフォルトでは標準出力に表示されます。

たったこれだけ！君も今すぐPHPMDでコードチェック！！！
自動化したくなったら次の記事も参照ください。

- [PHPの低品質なコードをコミット前に自動的に検査する - Qiita](http://qiita.com/kadoyau/items/eb4e7bc86588e6f33d16)
「Docker のいらないイメージを削除する」 Docker イメージがあるって

Docker は気軽にイメージを作って気軽にコンテナを動かせる。

あまりにも楽にできるので、気軽にやりすぎると、ときどきディスクを使い果たしてしまう。
そんな時はさすがにいらないイメージや、使わない中間コンテナを削除する。

# よく挙げられてるやつ

## コンテナの削除

```console
$ docker ps -aq | xargs docker rm
```

## イメージの削除

```console
$ docker images -aq | xargs docker rmi
```

## 宙ぶらりんのボリュームの削除

```console
$ docker volume ls -qf dangling=true | xargs docker volume rm
```

# 面倒

毎度これを打っていたので、次第に面倒になって、ホストの cron に仕掛けようかと思った。
しかし「ホストマシンの cron に仕掛ければいいじゃん」みたいなのは、なんだか Docker らしくない解決方法に感じる。

なので、この削除の処理をさらに Docker コンテナとして実行したいと思った。

誰しも同じようなことを考えるもので、既にそれを spotify が作っていたらしい。

# [spotify/docker-gc](https://hub.docker.com/r/spotify/docker-gc/~/dockerfile/)

```console
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker martin/docker-cleanup-volumes
```

これを実行するだけ。
やばい。楽。


自分は Jenkins 経由でこれを各 Docker Host で実行している。


# sock をマウントしてるけど？

UNIX Socket 経由でホストの Docker と通信できるので、いろいろ応用ができそうだ。
自分が知らなかっただけで、
どうやら Docker で Docker を管理したり、 Docker ホスト内全体の文脈に影響を与えたりするケースでは典型的な手法らしい。

後に自分が知ったうちでは、他にも次のイメージがその仕組みを使っていた。

[gliderlabs/registrator](https://github.com/gliderlabs/registrator) ... Docker のコンテナを Consul に自動で追加する
[gliderlabs/resolvable](https://github.com/gliderlabs/resolvable) ... Docker のホストレベル DNS 解決
[gliderlabs/connectable](https://github.com/gliderlabs/connectable) ... Proxy で Docker Host をつなぐ

たぶん他にもたくさんある。

ちょっと感動した話。

# なお

当然ではあるけど、やはりこれも Docker イメージである以上は、
ディスクフルになってからでは docker pull するスペースもなく、この方法では失敗する。
ディスクフルを起こすまえにちゃんと監視をして、定期的に削除したほうが良い。

# Volume Only Container 利用時の注意点 (2016 年 4 月 12 日追記)

[超軽量 Docker Image true (125 bytes) と sleeping-beauty (129 bytes)](http://qiita.com/kitsuyui/items/ba6eb17e6bbe97aa6b04) にも記載したが、
このコマンドは無慈悲にも停止中の全コンテナを消そうとするので、注意しなくてはならない。

`tianon/true` のような、『起動して成功してすぐに止まる』コンテナが犠牲になる。
Volume Only Container や Data Only Container (単にデータコンテナとも) でよくある話だと思う。
このような場合は、 

- 自動削除 (`docker-gc`) をそもそもしない
- Docker ホストに直接置く
- データコンテナは終了させずに何らかのコマンドで常に起動しておく  (上記の記事中にあるとおり sleeping-beauty を使うなど)

などの手段を講じるとよいだろう。