OmniAICreator/Qiita-1.07M huggingface dataset:
Unicornにおける DB connection poolの設定

## tl;dr
今まで、railsにおいて、mysqlのconnection pool数は、
unicorn worker数 +1(console用) としてたけど、実際のところは1~2が良さそう.
理由は、poolingはprocess毎に行われるため.

※ 間違ってたら、指摘して頂ければ泣いて喜びます！

## DB connecitonって？
アプリケーションとMySQLをつなぐ、SQL実行のための通信路

- アプリケーションからMySQLへの接続要求
- 接続要求に含まれる、パスワード・ユーザー名を元に、サーバープロセスを作成
- サーバープロセスが、アプリケーションとの通信を行う

このサーバープロセスと、アプリケーション間の通信路を、コネクションという.
1 サーバープロセスの生成には、大体 0.05秒くらいの時間がかかるとのこと.

## connection poolingとは
DBとのconnectionを確立したオブジェクトを、使い回す手法のこと.
使い回すことによって、DB接続や、オブジェクト生成のオーバーヘッドを削減する.
それにより、web/dbの負荷を両方を下げる.
なお pooling の設定は、マルチプロセスサーバーと、
マルチスレッドサーバーでそれぞれ異なるため注意すること.

## rails/unicornにおけるコネクションプールの設定
unicornの各プロセスは、それぞれ異なるコネクションを必要とする.
コネクションオブジェクトは、unicorn processのfork時に
それぞれのprocess毎に準備されるが、実際に接続されるのはqueryの実行時となる.

pool数を2、unicornのworker数を3としたとき、作られるコネクションの数は最大6となる.
なお、通常の利用であれば、1processで必要とされるコネクションの数は1である.
(thread等を利用していない場合を除く)
よって、ゾンビコネクションを作らないためにも、1~2のコネクション数が推奨される.


## 参考文献
https://devcenter.heroku.com/articles/concurrency-and-database-connections
http://www.oracle.com/technetwork/jp/articles/chapter5-1-101584-ja.htmle
UICollectionView で 無限スクロール

まだ未解決。
Windows の Kobito では下書きや非公開でアップロードできないらしくて公開されてしまった。

参考
[Showing cells in demands in UICollectionView with vertical infinite scroll](http://stackoverflow.com/questions/28246394/showing-cells-in-demands-in-uicollectionview-with-vertical-infinite-scroll)

```swift

class CollectionSampleViewController: UICollectionViewController {

    private let reuseIdentifier1 = "Cell"
    private var numberOfItemsPerSection = 9    

    override func viewDidLoad() {
       super.viewDidLoad()        
    }

    override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
    }

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
       return 1
    }

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       return numberOfItemsPerSection
    }    

    override func scrollViewDidScroll(scrollView: UIScrollView) {
       let offsetY = scrollView.contentOffset.y
       let contentHeight = scrollView.contentSize.height

       if offsetY > contentHeight - scrollView.frame.size.height {            
          numberOfItemsPerSection += 6
          self.collectionView.reloadData()
       }
    }   
}
```


上のコードを説明すると 
1. ``numberOfItemsInSection`` の値を変化させた後で 
2. ``collectionView.reloadData()`` を呼び出す。
3. ``reloadData`` で再読み込み

``reloadData`` は見えているアイテムを再読み込みさせる。またデータ数が減っている場合はオフセット（スクロール位置）値も調整する。

しかしこれだとセル数が爆発的に増えていくからあかんのでは？

改善案としては、
1. セルデータの基準とする値を保持しておく
2. スクロールが下・上までいった段階で、その基準値を増減させる。
3. indexPath に加算調整したセルデータを読むようにするとかかな?

出来るか知らんけど。
OpenSSL で SMTP,POP3,IMAPの接続・ログインテスト



自分用メモ


## ログ

* サーバ上でログを監視ながらやる


## SMTP


```
$ openssl s_client -connect smtp.example.com:587 -starttls smtp -ign_eof
```



## POP3




## IMAP

```
openssl s_client -connect imap.gmail.com:993
```

```
? login [ユーザ名] [パスワード]
```
postfix, sasl メモ



自分用メモ

## Postfix + SASL公式ドキュメント

* [Postfix SASL Howto](http://www.postfix.org/SASL_README.html)


## 新規ユーザ作成

SASL独自データベースを利用する場合

```
# saslpasswd2 -c -u example.com user_name
```

ユーザ削除

```
saslpasswd2 -d -u example.com user_name
```


## ユーザをリスト


```
# sasldblistusers2
```


## 認証テスト

```
testsaslauthd -u ユーザ名 -p パスワード -s smtp
```



## 利用できる認証方法を知る

```
saslauthd -v
```


## 認証方式

Kerberos，GSSAPI，DIGEST-MD5

## 認証機構

使いそうなやつ

* pam
* shadow
* sasldb
* ldap
* kerveros4,5


## SASL認証の設定ファイル

### smtpd.conf

* auxprop: SASL独自のデータベース。sasldbを利用。
* saslauthd: UNIXユーザ認証共有でPAMやshadowを利用

他にもあるが割愛

### mech_list 認証方式

* PLAIN: 平文。SSLをつかう前提
* LOGIN: 平文。各社互換性なし
* CRAM-MD5: digest
* DIGEST-MD5: CRAM-MD5より安全なdigest


## postfixの設定ファイル

* /etc/postfix/main.cf



## 関連用語

* postfix, mta
Letsencrypt を postfix, dovecotで使う



自分用メモ



## letsencrypt

* インストール方法は以下公式マニュアルを読む
 * http://letsencrypt.readthedocs.org/en/latest/using.html#letsencrypt-auto
* nginx プラグインは、まだexperimental
 * 参考: [User Guide — Let's Encrypt 0.2.0.dev0 documentation](http://letsencrypt.readthedocs.org/en/latest/using.html#nginx)
* 証明書は3ヶ月ごとに更新される。更新の自動化する必要あり
 * [User Guide — Let's Encrypt 0.2.0.dev0 documentation](http://letsencrypt.readthedocs.org/en/latest/using.html#renewal)
* Python 2.7が必要。CentOS6は、Python 2.6なので、別途Python 2.7のインストールが必要
 * 参考: [Redhat / CentOS 6.x users need python 2.7 - Server - Let's Encrypt Community Support](https://community.letsencrypt.org/t/redhat-centos-6-x-users-need-python-2-7/2190)
* サブドメインを追加する時は、-d で追加していく
 * [Tutorial on ejabberd, postfix, dovecot and or nginx with letsencrypt - Let's Encrypt Community Support](https://community.letsencrypt.org/t/tutorial-on-ejabberd-postfix-dovecot-and-or-nginx-with-letsencrypt/7320)


* インストール場所
 * /etc/letsencrypt/live/example.com/fullchain.pem

## postfix & dovecot


* [Simple Guide: Using Lets Encrypt SSL certs with Dovecot - Server - Let's Encrypt Community Support](https://community.letsencrypt.org/t/simple-guide-using-lets-encrypt-ssl-certs-with-dovecot/2921)

* [Tutorial on ejabberd, postfix, dovecot and or nginx with letsencrypt - Let's Encrypt Community Support](https://community.letsencrypt.org/t/tutorial-on-ejabberd-postfix-dovecot-and-or-nginx-with-letsencrypt/7320)
* [Use on non-web servers? - Server - Let's Encrypt Community Support](https://community.letsencrypt.org/t/use-on-non-web-servers/425)


## postfix


```
ln -s /etc/letsencrypt/live/domain.tld/privkey.pem /etc/postfix/ssl.key
ln -s /etc/letsencrypt/live/domain.tld/fullchain.pem /etc/postfix/ssl.cert
```

edit both configs so they point to key and cert
doveadm reload && /etc/init.d/postfix restart


## dovecot


```txt:/etc/dovecot/conf.d/10-ssl.conf
ssl_cert = </etc/letsencrypt/live/YOURSITE/fullchain.pem
ssl_key = </etc/letsencrypt/live/YOURSITE/privkey.pem
```


## letsencrypt-auto script


```bash:encrypt.sh
/tmp/git/letsencrypt/letsencrypt-auto certonly --webroot /var/www/example.jp/www -d example.jp -d www.example.jp -d mail.example.jp
```

## renew SSL


```bash:renew-letsencrypt.sh
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/opt/rh/python27/root/usr
/lib64
#/etc/init.d/httpd stop
cd /tmp/git/letsencrypt && ./letsencrypt-auto certonly --renew-by-default -d example.jp -d www.example.jp -d mail.example.jp
/etc/init.d/httpd restart
```
Grenning > デッドドロップ / dead drop > スパイが情報を受け渡しする秘密の場所のこと

@ テスト駆動開発による組み込みプログラミング by James Grenning

> デッドドロップ
> スパイが情報を受け渡しする秘密の場所のこと

http://eow.alc.co.jp/search?q=dead+drop&ref=sa
技術英語 > Remember they have significantly [less advanced technology] than ours. They only achieved warp drive last year. / inferior technology

Star Trek movie > 叛乱

発展中の文明を連邦のメンバーとして取り入れることについて、カウンセラートロイからピカードへ

> Remember they have <font color=red>significantly less advanced technology</font> than ours. They only achieved warp drive last year.

字幕は「彼らの技術水準は低くてワープ航法も去年やっと」

<hr>
関連して思いついたのは inferior technology

http://www.ask.com/government-politics/examples-inferior-technology-3c3594b010d29122

> QUICK ANSWER
An example of <font color=red>inferior technology</font> is any technology that has fewer features or capabilities than others still on the market.

<hr>

「枯れた技術の水平思考」はどう英訳するのだろうか。
Lateral thinking of old technology だろうか？
apt-fileコマンドに感動した

## 参考

* [Node-RED on Docker - Part3: docker buildエラー修正とnodesDirの設定 - Qiita](http://qiita.com/masato/items/3f268b1c7c68969c9af4)

> apt-fileを使ってパッケージを検索
> 
> apt-fileコマンドでunicode/ucsdet.hを検索します。必要なヘッダはlibicu-devパッケージをインストールすると良いみたいです。

## インストール

```bash:
apt-get install -y apt-file
apt-file update
```

```bash:
$ apt-file search ucsdet
icu-doc: /usr/share/doc/icu-doc/html/ucsdet_8h.html
icu-doc: /usr/share/doc/icu-doc/html/ucsdet_8h_source.html
libicu-dev: /usr/include/x86_64-linux-gnu/unicode/ucsdet.h
```

都度ググっていたのでこれは便利
rbenvでrubyをインストールできない

##環境
OSX ElCapitan(10.11.2)

##はまったとこ
rbenvでruby2.2.2をインストール...できない

```zsh:
$ rbenv install 2.2.2
 Downloading ruby-2.2.2.tar.bz2...
 -> https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.bz2
 Installing ruby-2.2.2...
 
 BUILD FAILED (OS X 10.11.2 using ruby-build 20151230)
 
 Inspect or clean up the working tree at /var/folders/v6/hwyn6rq15p73fn962_y21hkc0000gn/T/ruby-build.20160106042805.26781
Results logged to /var/folders/v6/hwyn6rq15p73fn962_y21hkc0000gn/T/ruby-build.20160106042805.26781.log
Last 10 log lines:
/var/folders/v6/hwyn6rq15p73fn962_y21hkc0000gn/T/ruby-build.20160106042805.26781 ~/rails_projects/TwitterRanking
/var/folders/v6/hwyn6rq15p73fn962_y21hkc0000gn/T/ruby-build.20160106042805.26781/ruby-2.2.2 /var/folders/v6/hwyn6rq15p73fn962_y21hkc0000gn/T/ruby-build.20160106042805.26781 ~/rails_projects/TwitterRanking
config.guess already exists
config.sub already exists
checking build system type... x86_64-apple-darwin15.2.0
checking host system type... x86_64-apple-darwin15.2.0
checking target system type... x86_64-apple-darwin15.2.0
./configure: line 3696: /usr/bin/gcc-4.2: No such file or directory
configure: error: clang version 3.0 or later is required
make: *** No targets specified and no makefile found.  Stop.
```

最後のあたりを見ると、/usr/bin/gcc-4.2がないのと、
clangが3.0以上じゃないとダメ？みたいな？よくわからなくてつらい...
とりあえず

```zsh
$ clang -v
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.2.0
Thread model: posix
```

あるし、、
んじゃあもう一つの方の``./configure: line 3696: /usr/bin/gcc-4.2: No such file or directory``ってのは、、、

```zsh:
$ ls /usr/bin
```
でわかるけど、確かにgcc-4.2はない。ではどうすれば？てことでググると、
http://stackoverflow.com/questions/12256616/os-x-mountain-lion-gcc-4-2-no-such-file-or-directory
こんなstackoverflowを発見。
``sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2``
こんな感じでシンボリックリンクを貼れば直るらしい、

```zsh:
$ sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2
Password:
ln: /usr/bin/gcc-4.2: Operation not permitted
```

rootless.....

う〜〜ん詰み、、、ってとこで、coa00@githubさんの
http://qiita.com/coa00@github/items/b50d06980187b0685349
こんな記事を発見、、これの通りに、``~/.zshenv``に
``export CC=/usr/bin/gcc``
ってのを追加、、、、

####通った、、、、

おわり
SSH 経由の sudo で TERM が unknown になって php が標準エラーに変なメッセージを吐く

とある Apache のインプロセスの `mod_php` から `sudo` して `php` コマンドを実行するシステムがあるのですが、ある日、突然 `php` コマンドの標準エラーに、

```
No entry for terminal type "unknown";
using dumb terminal settings.
```

なんてものが出力されるようになりました。

## 原因

PHP は CentOS 6 の `php-5.3.3-46.el6_6.x86_64` を使っていたのですが、`TERM` が変な値だと標準エラーにメッセージが出力されました。

```
$ TERM=unknown php -v
No entry for terminal type "unknown";
using dumb terminal settings.
PHP 5.3.3 (cli) (built: Jul  9 2015 17:39:00)
```

通常、ほとんどの環境変数は `sudo` されたプロセスには引き継がれません。が、`TERM` などの一部の環境変数はデフォで引き継がれます。

```
$ TERM=hoge sudo -u ore env | grep TERM
TERM=hoge
```

つまり、元プロセスである Apache の `TERM` 環境変数が `unknown` となっていることが原因でした。

```
$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=unknown
```

Apache を再起動してみたところ `xterm` になりました。

```
$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=xterm
```

`xterm` なら変なメッセージは表示されませんでした。

```
$ TERM=xterm php -v
PHP 5.3.3 (cli) (built: Jul  9 2015 17:39:00) 
```

サーバのリブート直後だと `TERM=linux` でした。

```
$ sudo reboot
...
$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=linux
```

`linux` でも大丈夫でした。

```
$ TERM=linux php -v
TERM=linux php -v
PHP 5.3.3 (cli) (built: Jul  9 2015 17:39:00) 
```

つまり、普通に Apache を起動したり再起動したりする分には、この問題は発生しないはずです。

## もっと根本的な原因

そもそも、なぜ `TERM=unknown` なんてことになっていたのか、その原因を探ったところ、SSH 経由で `sudo` すると `TERM=unknown` になることがわかりました。

```
$ ssh localhost sudo env | grep TERM
TERM=unknown
```

さらに、`service` コマンドを使っていても環境変数 `TERM` はサービスに引き継がれます。

- [「/etc/init.d/xxx start」と「service xxx start」の違い](http://qiita.com/ngyuki/items/fdeae87cee5d60f6698e)

つまり、SSH 経由で `sudo` してサービスを再起動したことが原因でした。

```
$ ssh localhost sudo service httpd restart
Stopping httpd: [  OK  ]
Starting httpd: [  OK  ]

$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=unknown
```

Ansible から Apache を再起動すると SSH 経由の `sudo` 経由になるので、それが原因だったのかもしれません。

```
$ ansible-playbook ore-no-playbook.yml -t apache

 :
 :
 :

$ sudo cat /proc/$(sudo cat /var/run/httpd/httpd.pid)/environ | tr '\0' '\n' | grep TERM
TERM=unknown
```

## 解決方法

とりあえず `/etc/sysconfig/httpd` に次の通りに追記することにしました。

```
TERM=linux
```

（なぜか export しなくても大丈夫・・なぜ？）

## さいごに

PHP をソースからビルドしている別の環境だと発生しなかったので、PHP で有効になっている拡張とかによってことなるのかもしれません。

なお、この問題が発生したのは CentOS 6 でしたが、CentOS 7 なら端末の環境変数なんてサービスには関係ないはずなので（systemd で起動しているから）、このような問題は発生しないはずです。
FaceRigでおっさんがLive2D美少女になってAnzuで愛想ふりまく（背筋が凍りそうな）話


すいません、@GOROmanさんの偉業( http://www.moguravr.com/facerig-jikkyou/ で紹介されているこれ http://live.nicovideo.jp/watch/lv247739522 )を見て、ちょっとやってみたくなりました。

あと、たまたまFaceRigやLive2Dがセールで安くなっていたのもあります。

ここにサンプル画像を貼ろうかとも思いましたが、おっさんとアバターの落差がすごくてやめました。
https://twitter.com/ocaokgbu/status/684412424317841412

## 環境

主にFaceRigが環境を決めてます。Graphic Boardはここまでの性能は要らないかとおもいますがとりあえず自分の環境書いておきます。

- OS : Windows 10 Home version 1511 (64bit)
- CPU : Intel Core i7-6700HQ 2.6GHz
- Graphic Board : NVIDIA GeForce GTX 970M
- ブラウザ : Firefox 43.0.3 (2016.1.6現在最新)
- カメラ：ノートPC内蔵のもの

## FaceRigって何？

http://store.steampowered.com/app/274920/?l=japanese

Skypeなどのビデオチャットでアバターを使うとき、自分の表情をアバターに演じてもらえるソフトです。リップシンクもします。アバターを美少女にして、ボイスチェンジャーも駆使したりすれば、、、いろいろできるわけです。

ゲームソフトウェアのストアであるSteamから購入してダウンロードしました。

## Live2Dって何？

Live2Dは一枚の絵から表情のついたアバターを制作するツールです。作成されたアバターはFaceRigで使えます。で、絵が美少女ならば、、、
ゲームソフトウェアのストアであるSteamからFaceRigとセットでモジュールを購入しました。
http://store.steampowered.com/app/420680/

## Anzuって何？

WebRTCの技術を使ったブラウザ向けのリアルタイム動画配信サービスです。Githubのアカウントさえあれば簡単に利用できます。

https://anzu.shiguredo.jp/

# ではやってみます

1. FaceRigを起動し、`Action` をクリック
2. Live2Dで制作されたアバターを選択
3. 動作確認
    a. 口ぱくしてみる
    b. 目玉ぐりぐりうごかしてみる。（ふつうの日本人だと半眼になってしまいがち）
4. `Switch to Advanced` のメニューをクリック
5.  `Toggle BroadCast` のメニューをクリック
6.  FireFoxを起動して`https://anzu.shiguredo.jp/`にアクセス
7.  Githubアカウントでログイン
8.  ダッシュボードから `簡単配信` の`配信ページを開く` をクリック
9.  共有するカメラで`FaceRig Virtual Camera`を選択
10.  すると画面におっさんではなく美少女が、、、、
11.  画面の下のほうに配信のためのURLが表示されるので、それをコピペしてツイートすればみなさんが眼福にあずかれる、、、といいですね

## TIPS

というほどのことはないですが、WebRTCは受信側の回線が遅いとパケットロスなどで画質に影響があるようなので、もともとの画像サイズをおさえるためにアバターに余計な背景をつけずに小さな画面で配信するとよいかもです。
pythonでdllinjection


#きっかけ
c言語でDLLInjectionの記事があったので、それを元にpythonで実行できるものを作ろうとした。

http://inaz2.hatenablog.com/entry/2015/08/08/223643

#既にあった
こちらhttps://github.com/psychomario/pyinject

#使ってみる
## 環境
windows7 pro service pack 1 (64bit)
python2.7
notepad(64bit)
gcc 4.8.3

```cmd
dir dllInjection
dllinject.py//gitのからDLしたもの
use.py//下記で作成
spy.dll//後に説明

```

## spy.dll
こちらの記事のものを流用
http://inaz2.hatenablog.com/entry/2015/08/08/223643

```spy.c
#include <windows.h>
#pragma comment(lib, "user32")

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	char filename[MAX_PATH];
	switch (fdwReason) {
		case DLL_PROCESS_ATTACH:
			GetModuleFileName(NULL, filename, sizeof(filename));
			MessageBox(NULL, filename, "Hello from", MB_SYSTEMMODAL);
			break;
	}
	return TRUE;
}
```
このdllを作る。

```cygwin
gcc -c spy.c //spy.o
gcc -shared -o spy.dll spy.o //spy.dll
```
 
## use.py
次にgitからDLしたdllinject.pyを使うためのコードを書く。(consoleでもいいレベル...)

```use.py
import sys
import dllinject
pid = int(sys.argv[1])
proc=dllinject.Process(pid=pid)
proc.inject("C:\\Users\\'hoge'\\Desktop\\dllInjection\\spy.dll")
proc.terminate()
```

## 実行

```cmd
>C:¥Windows¥notepad.exe
>tasklist
...
notepad.exe  1988 Console  1  9,384K
...
>python use.py 1988
```

![cmd.png](https://qiita-image-store.s3.amazonaws.com/0/82224/6a842dba-1191-d1dc-1853-ba2d343ffa4a.png "cmd")

![result.png](https://qiita-image-store.s3.amazonaws.com/0/82224/940169fb-1d12-eb0b-cff5-155007d0b1f5.png "result.png")


##注意点
DLLInjectionを成立させるためには、起動プロセスとDLLの種類が一致しないと成立しないです。
私の環境だとwow64+32bit dllでもだめでした。
http://furuya02.hatenablog.com/entry/20120114/1326484897

|プロセス|DLLの種類|結果|
|:---|:--|:--:|
|32bit|32bit|◯|
|32bit|64bit|ERROR_BAD_EXE_FORMAT|
|64bit|32bit|ERROR_BAD_EXE_FORMAT|
|64bit|64bit|◯|
Perl6 Cookbook ディレクトリ内のすべてのファイルを処理する

こんばんは :whale2:

Perl6でディレクトリの中身を取得する方法です。

## Perl5 だと

[9.5. Processing All Files in a Directory](http://docstore.mik.ua/orelly/perl/cookbook/ch09_06.htm)

`opendir` 関数でディレクトリをオープンして `readdir` 関数で中身を取得したりできましたよね。

```pl
use v5.18;

# カレントディレクトリ直下のファイル一覧を出力
my $dirname = '.';

opendir(my $dir, $dirname) or die "can't opendir $dirname: $!";
while (defined( my $file = readdir( $dir ) )) {
  next if $file =~ /^\.\.?$/;     # skip . and ..
  say "$dirname/$file";
}
closedir($dir);
```

## Perl6 では

`dir` [^path] を使って下記のように書けます。

```pl
use v6;

for dir() -> $fileobj {
  # dir() が返すのは IO::Path 型なので、Strに変換
  say $fileobj.Str ;
}

# または Hyper method call operator (>>) で dir() の結果を Str に
for dir()>>.Str -> $file {
  say $file ;
}
```



### フィルタリング

`dir` の結果はデフォルトでは`.`と`..`が除かれています。[^filter] 
`dir` は `test` パラメータに条件を指定することで、走査結果をフィルタすることができるので、`.`と`..`も含めるのなら `*` を指定したりします。

```pl
use v6;

dir( test => * )>>.Str.map({.say}) ;
```


`dir` をメソッドで使うなら下記のような感じに。

```pl
use v6;

# カレントディレクトリから、拡張子が .pl か .pl6 のファイル (大文字小文字区別しない) を探す
for '.'.IO.dir(  test => rx/ '.' :i pl6? $/ )>>.Str -> $file {
  say $file ;
}
```

### 再帰的に探す

サブディレクトリの中身も全部走査してみる。[^find]

```pl
use v6;

my sub ふぁいんど ( IO::Path $dirname ) {
  $dirname.Str.say;

  for $dirname.dir -> $file {
    # ディレクトリで、かつシンボリックリンクでは無かったら
    # さらにそのディレクトリの中をしらべる
    if $file.d and not $file.l {
      ふぁいんど( $file );
    }
    else {
      $file.Str.say;
    }
  }
}


ふぁいんど( '.'.IO );
```

おわりです。


## 参考と注釈

* [Input/Output - Perl 6 Documentation](http://doc.perl6.org/language/io#Getting_a_directory_listing)
* [class IO::Path - Perl 6 Documentation](http://doc.perl6.org/type/IO%3A%3APath)
* [Perl6でのファイル操作 - Qiita](http://qiita.com/syohex/items/0a7782920968ab105ba0)

[^path]: IO::Path 
[^filter]:  `dir( test => none('.', '..') )` なんですって
[^find]: ~~それならfindコマンドでいいよね~~
PhpStormでlaravel5.2を使う

#対象

- All Productライセンスが出たのでPhpStormを思わず今回購入した自分
- PhpStormの使い方に慣れていない方
- IDEの恩恵をしっかり味わいたい

#プロジェクト作成
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/dd9ff4d8-b441-d5ba-fe53-4e0864390c7b.png)

1. 左ペインから【Composer Project】を選択し、**Location**にプロジェクト保存先を入力
2. 【composer.phar】について、今回は、【Download composer.phar from getcomposer.org】を選択
3. 【Filter packages】に**laravel/laravel**を入力しリストから**laravel/laravel**を選び【Version to install】を**v5.2.0**を選択

#Laravel用のIDEプラグイン導入
メニューバーより【File】-【Settings】-【Plugins】を辿る
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/76c9ec46-f43f-11f7-9931-825c94407b54.png)

【Browse repositories...】を選択後、検索欄に**laravel**と入力し【Laravel Plugin】をインストール
*今回はすでにインストール済みのため、Installボタンが表示されていません*

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/8aca572f-c44d-bec1-f3fc-145e4f6b6ff5.png)

インストール後、Restartのダイアログが出るため、従う。

#Composerの使用
Terminalから使用してもいいのだけれども、IDEの恩恵に預からねばと思いに付いている機能を使用

![2-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/68ea2dc0-8024-b804-37d3-cab836b84eec.png)

##Laravel補完の設定 [ barryvdh/laravel-ide-helpe ]

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/876c395c-d8e1-a5d0-66cc-75db5dd9258e.png)

1. Composerの使用で表示される画面の検索欄に**barryvdh/laravel-ide-helpe**を入力し【Innstall to Version】を**v2.1.2**を選択
*今回はすでにインストールしているので【Innstall to Version】は、表示されていません*
2. config/app.phpの【providers】に以下を追加

```diff:config/app.php
    'providers' => [
+        Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
    ],
```

###ide-helper:generateの準備
1. 今回は、sqliteを使用するので【config/database.php】を変更
2. databaseフォルダ内に**database.sqlite**を作成 ( Terminalでtouchが使えるならば**touch database/database.sqlite**で作成できる )
3. Terminalで**php artisan ide-helper:generate**を実行

```diff:config/database.php
- 'default' => env('DB_CONNECTION', 'mysql'),
+ 'default' => env('DB_CONNECTION', 'sqlite'), 
```

##デバッガー関係[ barryvdh/laravel-debugbar ]
1. Composerの使用同様に**barryvdh/laravel-debugbar**をインストール
2. config/app.phpの【providers】と【aliases】に以下を追加
3. Terminalで**php artisan serve**を実行し以下の画面のように表示が追加されていれば成功

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/3b918960-d0c6-72f8-3b4a-bbf401a03161.png)


```diff:config/app.php
    'providers' => [
+        Barryvdh\Debugbar\ServiceProvider::class,
    ],

    'aliases' => [
+        'Debugbar'  => Barryvdh\Debugbar\Facade::class,
    ],

```

追加後に以下を実行することでヘルパーが正しく動作するようになる
```
php artisan ide-helper:generate
php artisan ide-helper:meta
```


#最後にお願い
laravelとPhpStormをもっと知りたいので、ツッコミや入れとくべきものがありましたらコメントお願いします。

#参考
- [PhpStormでLaravel5](http://twintail0x2b8.hatenablog.com/entry/2015/03/29/220510)
- [ララ帳](https://laravel10.wordpress.com/2015/03/22/laravel-ide-helper/)
- [PhpStormでLaravel5快適開発　おさらい](http://blog.comnect.jp.net/blog/119)
- [GitHub : Laravel Debugbar](https://github.com/barryvdh/laravel-debugbar)
- [GitHub : Laravel 5 IDE Helper Generator](https://github.com/barryvdh/laravel-ide-helper)
SELECT権限だけでmysqldumpできることがある

[公式サイト](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html)には、最低限`SELECT`, `SHOW VIEW`, `TRIGGER`, `LOCK TABLES`が必要と記載されています。
しかし特定の`InnoDB`データベースを`mysqldump`する場合、最低限`SELECT`権限だけで対応できます。

| MySQL権限|解説|
|:-----------|:-----------|
|`SHOW VIEW`|対象データベースにビューがなければOK|
|`TRIGGER`|対象データベースにトリガーがなければOK <br> 存在してもdump不要なら`--skip-triggers`オプションでOK |
|`LOCK TABLES`|対象データベースが`InnoDB`なら`--single-transaction`オプションでOK|


###コマンド例

```bash
mysqldump -uyouruser yourdatabase --single-transaction
```
そのほかに必要なオプションは適宜追加してください。
(追加権限が必要なオプションもあります)

###サーバにある全てのデータベースをdumpしたい
追加でロック権限が必要です。MySQL 5.6まではSYSTEM系データベースは`MyISAM`なので。
SYSTEM系データベースの整合性を保証しなくてよいならロック不要のようです。

###ビュー定義は必要ないが、ビューを含むデータベースをdumpしたい
ビューはテーブルに近い扱いなので`--ignore-table=table1.viewname1 --ignore-table=table2.viewname2`
というオプションで無視する方法があります。
UnityEngine.Loggerを使ってみる

# UnityEngine.Logger #
Unity5.3からUnityEngine.LoggerというAPIが追加され各所で話題になっています。

各所で話題のUnityEngine.Loggerさん。
![conflict.png](https://qiita-image-store.s3.amazonaws.com/0/77177/50c09a31-ae0f-bf79-43e0-ec7745fa44d0.png)
要は他のライブラリのLoggerクラスと衝突してんじゃねーかって話題です。
因みに解決方法ですけど他のライブラリのコードの方にこんな感じでusingディレクティブ入れてあげればめんどいけど衝突回避できます。

```csharp
using Logger = Library.Logger;
```

で、まぁ、そんなLoggerさん使ってみたら結構便利なんじゃない？とか思って使ってみます。


今回使ったプロジェクトはこちら
自由にお使いください
https://github.com/Marimoiro/UnityEngineLoggerSample

# コンストラクタ #
コンストラクタは以下の形で宣言されています。

```sharp
public Logger(ILogHandler logHandler);
```
http://docs.unity3d.com/ScriptReference/Logger-ctor.html



# デフォルトのlogger #
いきなりILogHandlerってなんやねんって話ですが、一応UnityEngine.Debug.loggerというunityコンソールに出す用のloggerが定義されていますのでそれで試してみます。
こんな感じ

```csharp
using System;
using UnityEngine;
using System.Collections;

public class DefaultLoggerSample : MonoBehaviour
{

    ILogger logger;
    void Awake()
    {
        logger = new Logger(Debug.logger);
    }

    public void OnClick()
    {
        logger.Log("Default Loggerに流してみる");   
    }
}
```

こうして作成したあとは、Debug.Logとかの代わりにlogger.Logとかできます。

# CustomLogger 

じゃあ、他に何かないの？と言われたら自分で作れってことです。

ILogHandlerはこんな感じで宣言されています。

```csharp
    public interface ILogHandler
    {
        void LogException(Exception exception, Object context);
        void LogFormat(LogType logType, Object context, string format, params object[] args);
    }
```
要するに普通のフォーマットのログメソッドと例外メソッド作れって言われますね。

というわけでILogHandlerを実装したクラスを作って先ほどと同じようにやってます。

```csharp
using System;
using UnityEngine;
using System.Collections;
using Object = UnityEngine.Object;

public class CustomLoggerSample : MonoBehaviour
{

    ILogger logger;
    void Awake()
    {
        logger = new Logger(new FaceLogHandler());
    }

    public void OnClick()
    {
        logger.Log("顔文字ロガー！");
    }

    public void OnError()
    {
        logger.LogException(new Exception("エラー起こしちゃった"));
    }
}

public class FaceLogHandler : ILogHandler
{
    public void LogFormat(LogType logType, Object context, string format, params object[] args)
    {
        Debug.logger.LogFormat(logType, "(・∀・)" + context, format, args);
    }

    public void LogException(Exception exception, Object context)
    {
        Debug.logger.LogException(new Exception("(´・ω・｀)", exception), context);
    }
}

```

で、これをuguiボタンにぺたぺたはっつけて実行してみるとこんな感じになります。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/77177/3b62a052-c6b9-9237-ed6a-337a815f0671.png)

こんな感じで可愛い感じのロガーが作れました。

# いろいろ

* Debug.loggerはgetアクセサだけのプロパティなのでDebug.Logの挙動をこの方法では変えられないみたい・・・悲しい

* Loggerクラスには他にもこんなプロパティがあります
 * logEnabled・・・ログの有効/無効　これでDebug.Logを***完全に非表示***にできます
 * filterLogType・・・ログの有効レベルを切り替えられる　指定したレベル以上を表示みたいでフラグを|で足せないみたい。Unityの人|あんますきじゃないのかな？(Editorだと見るけど)
* このカスタムロガーだけど何かイベント起こった時にメール投げるとかいろいろ使いではありそう。なんかいい方法あれば教えて下さい
Elixir+Phoenix開発Tips


Tipsというか、開発しててハマったりわかりにくかった点をいくつかあげてみたいと思います。

# モデルのPrimaryKeyをデフォルトから変更する

mixコマンドで `mix phoenix.gen.model User users name:string age:integer` のようにモデルを生成して `mix ecto.migrate` を実行するとテーブルのPrimaryKeyはidで作られてしまいます。

これを別名のカラムにしたいときは以下の様にします。

1, `mix phoenix.gen.model` でモデル作成

```bash:command
$ mix phoenix.gen.model User users name:string age:integer
```

2, 作成された priv/repo/migrations/xxx_create_user.exs と web/models/user.ex を編集する

```elixir:xxx_create_user.exs
defmodule Sample.Repo.Migrations.CreateUser do
  use Ecto.Migration

  def change do
    create table(:users, primary_key: false) do
      add :user_id, :string, primary_key: true
      add :name, :string
      add :age, :integer

      timestamps
    end
  end
end
```

```elixir:user.ex
defmodule Sample.User do
  use Sample.Web, :model
  
  @primary_key {:user_id, :string, []}
  schema "users" do
    field :name, :string
    field :age, :integer

    timestamps
  end
  
  @required_fields ~w(user_id name age)
  @optional_fields ~w()
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end
```

3, `mix ecto.migrate` を実行

# preflightリクエスト対策

preflightリクエストとはクロスドメインアクセスが可能か確認するリクエストを送ることです。
詳細は[こちらの記事](http://dev.classmethod.jp/etc/about-cors/)などを参考に。

超ざっくり言えばOPTIONSメソッドでアクセスが来たらこの対応が必要と思っていただければ^^;

1, [Corsica](https://github.com/whatyouhide/corsica/) を追加する

depsに以下を追記して `mix deps.get`

```elixir:mix.exs
defp deps do
  [{:corsica, "~> 0.4"}]
end
```

2, lib/xxx(プロジェクト名)/endpoint.ex に以下を追記

```elixir:endpoint.ex
# originsに許可するホストを、allow_headersにアクセス時に許可するヘッダーを追加する
plug Corsica, [origins: ["http://localhost:8080"], allow_headers: ["accept", "content-type", "hogefuga", "origin"]]
```

# ファイルアップロードの上限値を上げる

lib/xxx(プロジェクト名)/endpoint.ex を編集する

```elixir:endpoint.ex
plug Plug.Parsers,
  parsers: [:urlencoded, :multipart, :json],
  pass: ["*/*"],
  json_decoder: Poison,
  length: 104_758_600 # ここが上限値
```

# Erlangの関数を使うとき・・・

Erlangの関数やライブラリを使うとき、文字は文字列ではなく文字リストで扱うことが多いです。
つまり `"ほげ"` ではなく `'ほげ'` ですね。

引数に渡す文字や、返り値の文字に注意してください。これをつい忘れているとハマります・・・

---

とりあえずはこんなところです。
また出てきて知見が溜まったら書きます。
Agda 事始め

# はじめに
知り合いの元プログラマが一年に１つずつ新しい言語を触ってみると良い、とのたまってくれたので、新しい言語にチャレンジしようと思います、てなわけでAgdaをチョイス。
ちなみに去年（まで）はマイナーな項書き換え言語とMaxima で記号処理と数値代入を、Haskell を趣味で勉強してました。

[本家](http://wiki.portal.chalmers.se/agda/pmwiki.php)
[wikipedia](https://en.wikipedia.org/wiki/Agda_(programming_language))

理由は特に無いが、趣味で圏論とHaskellをやっているのでその延長で。
文法似ているのでとっつきやすいかなというだけ、あとはちょっと触ってみたいコンテンツがあったので、[ここ](http://people.inf.elte.hu/divip/AgdaTutorial/Index.html#general-information)とか[ここ](http://ie.u-ryukyu.ac.jp/%7Ekono/lecture/software/Agda/)とか。

# 定理証明（支援）
別にソフトウェア開発をしているわけでもないのだが、Haskell のいうところの[It’s a truism within the Haskell community that once code compiles, it’s more likely to work correctly than in other languages.](http://book.realworldhaskell.org/read/types-and-functions.html)を"ちゃんと"するといわゆる定理証明システムになる（らしい）。

もちろん[Coq](https://coq.inria.fr) も候補にあったがなんとなく敬遠してしまった、なんとなく。
[誰も書かないCoq入門以前の話](http://d.hatena.ne.jp/m-hiyama/20141207/1417948454)を見ちゃって気後れしてしまったのもある、なんかややこしそう。。。
あと最近出たらしい[Lean](https://leanprover.github.io)もかっこよかったのだけど、まぁ又の機会に。
しかし公式ページとロゴがかっこいい、量化子か。

やや教材が少ない気がするのが気がかりだが。

# 導入
[オフィシャル](http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Main.MacOSX)に則ってさくっとAgda 本体とAquamacsを導入、問題は普段vim を（カッコつけて）使っているので使えるかなぁという点だけ、まぁずっと入力モードのvim と思ったら良いのかな？
実は保存とか終了とかも知らないので不安だったけど、なんとかなるでしょう。

## Emacs
大文字のC がコントロールキーだということや終了の方法(C-x C-c)くらいしか知らなかったのでM ってなんやねん？となって愉快だった。
困ったら[ここ](http://people.inf.elte.hu/divip/AgdaTutorial/Emacs_Usage.html#1)を見たりしてる。

## Standard Library
Standard Library を導入するのがやや困った、最終的には出来たけど。
まずは[Standard Library](http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Libraries.StandardLibrary)の通りにやってみる、ここで

> Insert the path DIR/src.

とあるので最初カレントディレクトリ(.)を消したうえでDIR/src だけ指してたが、こうすると自分が書いたファイルをDIR/srcに探しに行ってしまうので(.) とDIR/src にしなきゃいけませんでしたね、よく考えりゃアホなことをしてしまっていた。

## Unicode
どうもなれないのがUnicode の多用、いい意味でなのだけどタイプが多くなるのがなぁ。。。

# 動かしてみる
どうもペアノの公理をためしてみるのが試金石みたい、ちと古いかもだけど[Hello, Peano](http://learnyouanagda.liamoc.net/pages/peano.html)のように

```Recursive.agda

module Recursive where

open import Enumerated using (Bool; true; false)

{-
Peano rep.
0 ~ zero
1 ~ suc (zero)

n+1 ~ suc n
-}

data ℕ : Set where
  zero : ℕ
  suc : ℕ → ℕ  
```

おきまりのC-c C-d でsuc (suc zero) などの型を見てみてちゃんとℕ になってることを見る、が今のところだからどうした？という域を出ないな、、、
inventoryファイルでグループ外ホストを指定する。


`ansible-playbook`実行時のinventoryファイルでグループ外のホストを対象する方法です。


inventoryファイルは以下のものを使用します。

```
# http://docs.ansible.com/ansible/intro_inventory.html
mail.example.com #これ。playbookのhostsでallを指定すれば対象になるが…。

[webservers] #いつも使う
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com
```

グループ外のホストを指定するには、playbookのhostsでそのままホストを指定します。

```site.yml
- name: Ansible-Sample-TDD
  hosts: mail.example.com #そのままホストを指定する。
  user: root
  roles:
    - nginx
    - mariadb
```

`--list-tasks`を付けて実行してみると、対象になっています。

```
$ ansible-playbook site.yml -i hosts --list-hosts

playbook: site.yml

  play #1 (Ansible-Sample-TDD): host count=1
    mail.example.com
```

なお、この場合でも(当然ながら)Inventoryファイル指定を外すと実行できません。

```
$ ansible-playbook site.yml  --list-hosts
ERROR: Unable to find an inventory file, specify one with -i ?
```

----

[Ansible » Docs » Patterns](http://docs.ansible.com/ansible/intro_patterns.html)に(微妙に)書いてあるのだけど、自作gemの修正で気になったのでメモでした。
Swiftはじめたい...その１


# はじめに
+ 2016年 いよいよSwiftをはじめるぞ！…と、ろくにドキュメントも見ないで始めます。

# 手順１、Playgroundを作ります。

+ xcodeでPlaygroundというのを使えばSwift単体で試せるらしいということでPlaygroundというのを新規作成します。
+ xcodeのメニューから、File > Playground...を選びます。

 ![playground.png](https://qiita-image-store.s3.amazonaws.com/0/51116/0b7978ff-f313-0c6a-a537-883858ec3306.png "playground.png")


+ NameはデフォルトのMyPlaygroundのままです。
+ Platformは特に意味はないですがOS Xにしてみました。

+ [Next]ボタンを押すとプロジェクトファイルを保存する画面がでてきますので好きな場所に保存してください。

# 手順２、Playgroundができました。

+ Hello Playgroundなソースが最初から入っている画面がでてきました。

![playground01.png](https://qiita-image-store.s3.amazonaws.com/0/51116/9299b91b-8954-b39f-be9f-0481914ba67b.png "playground01.png")


# 手順３、実行してみる。

+ 画面の左下の[△]をクリックするとコンソール画面がでます。
+ 画面の左下の再生ボタンをクリックすると実行（？）状態になるようです。
+ ソースコードをちょっと足したら実行結果が見えました。
+ 各変数の値も右側に出るみたいです。

![playground02.png](https://qiita-image-store.s3.amazonaws.com/0/51116/eaa545bd-dd5e-3c8a-e351-3c51ba48a324.png "playground02.png")


# まずはここまで

+ ここまででSwift言語を試せる状態ができたようです。
+ これでSwiftを始めますよ！
Code Climateの結果をSlackに通知する

SlackとCode ClimateにIntegrationを設定して、SlackにCode Climateの結果を通知するようにする。

[Code ClimateをPythonリポジトリに適用する - Qiita](http://qiita.com/vmmhypervisor/items/b642b22f6a78f1f8668d)
でCode Climate連携を設定したリポジトリが対象。


# SlackとCode ClimateのIntegration設定
Code Climate公式に設定手順がある。
[Slack Integration · Code Climate Platform](https://docs.codeclimate.com/docs/slack-integration)

>1. In Slack, click the **"Team Settings"** arrow in the upper-left hand corner of the screen and select **Configure Integrations**.

上記の最初の手順はSlackのUIが変更になったのか、微妙に違った。
Configure Integrationsではなく、`Apps & Custom Integrations`だった。

![00_slack.png](https://qiita-image-store.s3.amazonaws.com/0/107537/3b3cd67b-ada3-71fc-e1f6-5860bb9704d2.png)

後は手順通りに設定して、連携テストまで実施すると、
以下の通りCode Climateのアイコンでメッセージが表示される。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/107537/791c397b-2ca1-c082-68d7-57b7aabc871a.png)


# Code Climateの結果通知を確認
本題。
前述のSlack Integrationの説明によると

>By using our Slack integration, Code Climate will automatically post notifications directly to your Slack room. Notifications will be posted whenever important events occur during our analysis (e.g., your code or test coverage gets better or worse). Here are some examples of notifications we'll post in Slack:

>- An area of your codebase increases from a D or F to any other grade. For example, from a D to an A.
- An area of your codebase decreases to a D or F from any other grade. For example, from a B to an F.
- New code is added to your codebase and its initial grade is a D or F.
- Test coverage improves or declines.

コード評価(GPA)またはコードカバレッジが大きく増減すると通知される。

Pythonでは現状ではコードカバレッジ集計は対応していないため、GPAに変化があった場合のみ通知される。
GPAの値を意図的に変化させて、どう通知されるかを見てみる。

## 実験
### 実験：D評価のファイルをA評価にしてみる
>- An area of your codebase increases from a D or F to any other grade. For example, from a D to an A.

上記の通知条件を試してみる。

- 元のスコア
 - ![GPA.png](https://qiita-image-store.s3.amazonaws.com/0/107537/573105a5-3526-72d8-181c-8ad0fd2d3726.png)

上記の評価となっているリポジトリの中から、D評価のファイル(writer.py)
![02_before.png](https://qiita-image-store.s3.amazonaws.com/0/107537/39a8c526-5984-5151-de43-c431efdb8052.png)
の中身をA評価になるように書き換える(リファクタリングではなく、何もしないコード、ファイル名は不変)。


- ファイル置き換え後のGPA
 - ![03.png](https://qiita-image-store.s3.amazonaws.com/0/107537/2550fc9d-b3bc-843b-6b2f-c32c0a1cf9cd.png)

#### 結果
このとき、Slackには通知されなかった。


### 実験：A評価のファイルをD評価にしてみる
>- An area of your codebase decreases to a D or F from any other grade. For example, from a B to an F.

上記の通知条件を試してみる。
前述で差し替えたファイル(writer.py)を元に戻す(スコアAのファイルをスコアDのファイルに戻す)。

>- New code is added to your codebase and its initial grade is a D or F.

ついでに上記の通知条件も試す。
スコアDのファイル(codeclimatetest.py)を新規追加する。

2ファイルの修正/追加をコミットする。

#### 結果
今度はSlackのチャンネルに通知された。

![04_slack.png](https://qiita-image-store.s3.amazonaws.com/0/107537/b99c6384-9d11-b161-1992-8d214b8848e6.png)

`Compare`をクリックすると、Code Climateのページに飛べて、コミット間での変化点を示してくれる。

![05_codeclimate.png](https://qiita-image-store.s3.amazonaws.com/0/107537/24a7304c-2538-7221-adac-5cd249db1682.png)
boot2dockerのイメージからdocker-machineへmigrateする

boot2dockerのバージョンを上げてDockerfileをビルドしようとした際、Network Time outが発生し、ビルドが失敗したので、調べたところ、boot2dockerは非推奨になったようで、これからは`docker-machine`を使ってねとのこと...
移り変わりが早いことで

## 参考
http://qiita.com/kohey18/items/b7e48ad70f97680041e5

せっかくboot2dockerを最新にし、イメージを作成したのに、1からイメージを作り直すのもあれだったので、利用できないかなと調べたところ、どうやらboot2dockerのイメージを利用できるらしい

## Migrate from Boot2Docker to Docker Machine
https://docs.docker.com/machine/migrate-to-machine/

```console:docer-machine-create
$ docker-machine create -d virtualbox --virtualbox-import-boot2docker-vm boot2docker-vm docker-vm
```

### 再起動

`docker-vm`という名前でVirtualBoxImageが作成されているので、再起動

```console:docker-machine-restart
$ docker-machine restart docker-vm
```

### 環境変数を設定
以下、出力結果の通り、`eval $(docker-machine env docker-vm)`で設定出来るようになったぽい

```console:docker-machine-env
$ docker-machine env docker-vm
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.xx.xx:xxxx"
export DOCKER_CERT_PATH="docker-vm cert path"
export DOCKER_MACHINE_NAME="docker-vm"
# Run this command to configure your shell:
# eval $(docker-machie env docker-vm)
```

### 再度ビルド

```console:docker-build
$ docker build -t my_docker:0.0.1 .
```

これでNetwork time outにならずにビルドが出来るようになった
bashのワイルドカード展開は該当するファイルが無いと*が展開されずに残る

タイトルの通り。

```bash
$ ls
a.tsv  b.tsv
$ echo *.tsv
a.tsv b.tsv
$ echo *.txt
*.txt
```

最後のコマンド実行例を見ると、確かに該当するファイルが無い場合**`*.txt`という文字列1つ**がechoコマンドに渡されていることが分かる。
多分これは多くの人には嬉しくない挙動だろう。

さらに補足しておくと、ワイルドカード展開に限らずパス名展開の場合は全て、該当するファイルが無い場合パターン文字列が展開されずに残ってしまう。

```bash
$ ls
a.tsv  b.tsv
$ echo ?.tsv
a.tsv b.tsv
$ echo ?.txt
?.txt
$ echo [a-z].tsv
a.tsv b.tsv
$ echo [a-z].txt
[a-z].txt
```

echoコマンドが実際はrmコマンドだったらと考えると、場合によっては良くないことが起こりそうである。

# 対処法

* 該当するファイルが無いパス名展開を「0個の文字列」として展開してほしい場合、`shopt -s nullglob`を.bashrcなどに書いておく
* 該当するファイルが無いパス名展開をエラーにしてほしい場合、`shopt -s failglob`を.bashrcなどに書いておく

`shopt -s nullglob`の場合こうなる。

```bash
$ ls
a.tsv  b.tsv
$ shopt -s nullglob
$ echo *.txt
 
```

エラーにはならず、`*.txt`の部分が存在しなかったのと同じ（この場合`echo`が実行されたのと同じ）意味になる。
解除は`shopt -u nullglob`。

`shopt -s failglob`の場合こうなる。

```bash
$ ls
a.tsv  b.tsv
$ shopt -s failglob
$ echo *.txt
-bash: no match: *.txt
```

エラーになり、コマンドは実行されない。
解除は`shopt -u failglob`。
なお、[List of shell options [Bash Hackers Wiki]](http://wiki.bash-hackers.org/internals/shell_options#failglob)によれば、`shopt -s failglob`はbash 3.0-alpha以降でのみ使える。

# zshの場合はどうなるの？
こうなる。

||bash|zsh|
|---|---|---|
|パターン文字列を残す|デフォルト|`setopt NO_NOMATCH`|
|0個の文字列として展開|`shopt -s nullglob`|`setopt NULL_GLOB`|
|エラーにする|`shopt -s failglob`|デフォルト|

`setopt NO_NOMATCH`の解除は`unsetopt NO_NOMATCH`。
`setopt NULL_GLOB`の解除は`unsetopt NULL_GLOB`。

# まとめ
`shopt -s (null|fail)glob`を使うかzshに乗り換えるかしておくと事故らずに済みます。

# 2016/01/19追記: `shopt -s (null|fail)glob`が起こすバグについて

`shopt -s nullglob`または`shopt -s failglob`を使うと、一部の環境でタブ補完が動かなくなってしまう。
対象となる環境は、bashにzsh並みの高度な補完機能を提供するパッケージである[bash-completion](https://bash-completion.alioth.debian.org/)をインストールしている環境。
対象となる環境では、failglobを有効にした状態でタブ補完を行うと次のようなエラーメッセージが出力されてタブ補完は実行できない。（nullglobを有効にしている場合はこのエラーメッセージすら出ない）

```
bash: no match: words[0]=${!ref}${COMP_WORDS[i]}
```

このバグはbash-completionの最新の開発版（master）では修正されているのだが、残念なことにこのバグが修正されている安定版は存在しない。
最新の安定版（2.1）でもこのバグは存在しており、結果としてbash-completionがインストールされている環境では`shopt -s nullglob`または`shopt -s failglob`はタブ補完機能を無効にしてしまう。

この問題を解決するには次のどちらかの方法を行えばよい。

* [Install bash-completion:master for \`shopt -s failglob\` with TAB-completion.](https://gist.github.com/richardkmichael/acff67dd8ac1abf74e60)を参考にbash-completionの最新の開発版をソースコードからインストールする
* [bash - nullglob disables pathname tab-completion - Stack Overflow](http://stackoverflow.com/questions/29907892/nullglob-disables-pathname-tab-completion)を参考に問題を起こしている箇所にパッチを当てる

例として、後者の方法をUbuntu 14.04 LTSで行う方法を載せておく。

```bash
sudoedit /usr/share/bash-completion/bash_completion
```

```diff
--- /usr/share/bash-completion/bash_completion
+++ /usr/share/bash-completion/bash_completion
@@ -278,7 +278,7 @@
             done
             # Append word to current word
             ref="$2[$j]"
-            eval $2[$j]=\${!ref}\${COMP_WORDS[i]}
+            eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}"
             # Remove optional whitespace + word from line copy
             line=${line#*"${COMP_WORDS[i]}"}
             # Indicate new cword
```
OpenGrokでLook and Feelをconfigする


自分でset upしたOpenGrokと、他の人が作ったやつとを同時に見てる時に、混乱しないように背景色とかfaviconを変えて簡単に見分けられるようにしたかった。

README.txtを読む限り、**source.war** を作りなおせばいろんなことができるっぽい。

ちょっと手がかかりそうなので他の方法はないかと探してみると、CHANGES.txtに、v0.3から look and feelをcustomizeできるように実装されている、とある。


> 
February 2006 update 0.3
-------------------------------------------------
New Features:
   Support for Subversion.
   A cscope like GUI for search.
   A GUI wizard for creating or updating search index.
   New option that supports webapps with different context URLs.
   Better display of matched context
   **A new CSS style sheet with offwhite theme.**
> 
> 
December 2005 update: 0.2.1
-------------------------------------------------
New Features:
   Now runs on Microsoft Windows
   **a new CSS theme (polished)**
   Interim support for PHP and OpenSolaris Assembler code.
   Single distributable file to keep things simple



その実装のcommit message:

https://java.net/projects/opengrok/sources/opengrok-git/revision/c0550b01024b910b8c1468811c0ea663b10b1372
 
> Create webapp as part of the normal build step
> 
The webapp will also include the various configurations, so the user may
select the look'n'feel without rebuilding the application. By default the
webapp will use the look'n'feel (css-files and icons) located in the folder
named default. You may alter the content in this directory, or specify the
look'n'feel to use by using the -L option and create a configuration file
to OpenGrok.
> 
ex:
java -jar opengrok.jar -R configuration.xml -W configuration.xml \
-U localhost:2424 -L offwhite -n
> 
will read the current configuration, set the look'n'feel to "offwhite" and
store the new configuration. The -U option I specified here was to update
the webapplicaton that listens to configuration changes on localhost:2424



これ従ってそのままcommand打ってみたら動いた。

```sudo java -jar lib/opengrok.jar -R /var/opengrok/etc/configuration.xml -W /var/opengrok/etc/configuration.xml -U localhost:2424 -L polished
```


これだとfaviconを変えるとかできなくて自由度は低いのだけど、まあ楽なのでこれで良いか。。。

<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/5512039849/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=5512039849&linkCode=as2&tag=fkrw2960-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=5512039849&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=fkrw2960-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=fkrw2960-22&l=as2&o=9&a=5512039849" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
iptablesで特定のIPの通信を遮断する

状況次第にでは一切の通信ができなくなりますので、注意して実行してください。


#作業前のiptablesを確認
```linux:command
iptables -L
```


#iptablesで特定のIPの通信を遮断する(localhost->OUT)
以下のサーバ **へ** の通信を止める
192.168.10.8
192.168.10.9
10.*.*.*

eht0から特定セグメントへの通信を遮断する。

```linux:command
iptables -A OUTPUT -d 192.168.10.8/32 -o eth0 -j DROP
iptables -A OUTPUT -d 192.168.10.9/32 -o eth0 -j DROP
iptables -A OUTPUT -d 10.0.0.0/8 -o eth0 -j DROP
```

#iptablesで特定のIPからの通信を遮断する(OUT->localhost)
以下のサーバ **から** の通信を止める
192.168.10.8
192.168.10.9
10.*.*.*

特定セグメントからの通信を遮断する。

```linux:command
iptables -A INPUT -s 192.168.10.8/32 -j DROP
iptables -A INPUT -s 192.168.10.9/32 -j DROP
iptables -A INPUT -s 10.0.0.0/8 -j DROP
```


#作業後のiptablesを確認
```linux:command
iptables -L
```


#全設定削除
iptablesが真っ白になる
（環境次第では一切の通信ができなくなりますので擬似環境で十分に実施をしてから実行してください）

```linux:command
iptables -F
```


#再読み込み
/etc/sysconfig/iptables の設定も踏まえ再読み込みをする。

```linux:command
/etc/init.d/iptables restart
```
goxでクロスコンパイル実行時に `Stderror go build runtime: <os>/<arch> must be bootstrapped using make.bash`



俺です。
これは辛い

```
orenomac$  gox --osarch "linux/amd64 darwin/amd64"
Number of parallel builds: 7

-->     linux/amd64: github.com/gamisan9999/mysqlfailgover
-->    darwin/amd64: github.com/gamisan9999/mysqlfailgover

1 errors occurred:
--> linux/amd64 error: exit status 1
Stderr: go build runtime: linux/amd64 must be bootstrapped using make.bash
```

[ここに神が](http://deeeet.com/writing/2014/05/19/gox/)
wordpressでタグに紐づく記事数を取得する方法


wordpress初心者なのでメモ代わりに書く


## 参考にしたサイト

* [WordPress 記事数を取得する最もシンプルな方法](http://designhack.slashlab.net/how-to-get-total-number-of-posts-in-wordpress/)


## SQL

```mysql:
SELECT 
    t.name as タグ名,t.slug as スラグ, tt.count as 記事数
FROM
    wp_terms AS t
        INNER JOIN
    wp_term_taxonomy AS tt ON t.term_id = tt.term_id
WHERE
    tt.taxonomy = 'post_tag'
```

```
+-----------------------------------------------------+----------+-------+
| タグ名                                               | スラグ    | 記事数 |
+-----------------------------------------------------+----------+-------+
| タグ名1                                              | slug1    |    24 |
| タグ名2                                              | slug2    |    45 |
| タグ名3                                              | slug3    |    43 |
.
.
.

```


参考記事を元にquerylog漁ってたらとれた。
Rustでssh

## 前提
| 項目 | 説明 |
|----|-------------------------|
| OS | MacOSX Yosemite 10.11.2 |
| Rust | 1.5.0 |
| 検証日時 | 2016.01.05              |


## Crate
[ssh2-rs](http://alexcrichton.com/ssh2-rs/ssh2/index.html)を使う
https://github.com/alexcrichton/ssh2-rs

## リモートホストでlsコマンドを叩くコード例
```rust
extern crate ssh2;
use ssh2::Session;
use std::io::prelude::*;
use std::net::TcpStream;
use std::env;

static USERNAME: &'static str = "username";
static REMOTE_ADDRESS: &'static str = "127.0.0.1:22";

fn main() {
    let tcp = TcpStream::connect(REMOTE_ADDRESS).unwrap();
    let mut session = Session::new().unwrap();
    session.handshake(&tcp).unwrap();
    let privatekey_filepath = env::home_dir().unwrap().join(".ssh/id_rsa");
    session.userauth_pubkey_file(USERNAME, None, privatekey_filepath.as_path(), None).unwrap();

    assert!(session.authenticated());

    let mut chan = session.channel_session().unwrap();
    chan.exec("ls").unwrap();
    let mut s = String::new();
    chan.read_to_string(&mut s).unwrap();
    println!("{}", s);
}
```

## scpのコード例
```rust
extern crate ssh2;
use ssh2::Session;
use std::io::prelude::*;
use std::net::TcpStream;
use std::env;
use std::path::Path;

static USERNAME: &'static str = "username";
static REMOTE_ADDRESS: &'static str = "127.0.0.1:22";
static REMOTE_FILE: &'static str = "/path/to/remote";
static NEW_REMOTE_FILE: &'static str = "/path/to/remote.new";

fn main() {
    let tcp = TcpStream::connect(REMOTE_ADDRESS).unwrap();
    let mut session = Session::new().unwrap();
    session.handshake(&tcp).unwrap();
    let privatekey_filepath = env::home_dir().unwrap().join(".ssh/id_rsa");
    session.userauth_pubkey_file(USERNAME, None, privatekey_filepath.as_path(), None).unwrap();

    let (mut remote_file, stat) = session.scp_recv(Path::new(REMOTE_FILE))
                                         .unwrap();
    println!("remote file stat: {}", stat.size());

    let mut contents = Vec::new();
    remote_file.read_to_end(&mut contents).unwrap();

    let mut new_remote_file = session.scp_send(Path::new(NEW_REMOTE_FILE),
                                               0o644,
                                               stat.size(),
                                               None)
                                     .unwrap();
    new_remote_file.write_all(&contents).unwrap();
}
```

## 注意点
`TcpStream`や`Session`をつくって認証するところを`lib.rs`に切り出して共通化(モジュール作って`get_session`的な関数に)しようとしたが、TCPのライフサイクルが関数内しか保持できないため、叶わぬ夢になってしまった。
良い方法をご存知の方いれば教えていただきたく。

[2016.01.06追記]

> TCPのライフサイクルが関数内しか保持できないため、叶わぬ夢になってしまった。

ここは私の理解不足で、`TcpStream`をもった変数(サンプル内の`tcp`にあたるもの)の寿命を考慮できていないことが原因でした。
underscoreコードリーディング（difference）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##differenceとは


###[underscorejs.orgのdifference](http://underscorejs.org/#difference)

こんな説明。
>####_.difference(array, *others) 
Similar to without, but returns the values from array that are not present in the other arrays.

```javascript

_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
=> [1, 3, 4]

```

------------- 
withoutに似ているが、arrayの中でothersの配列に入っていない値を返します。



###[underscore.difference](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L571)
コード的にはこのあたり。

```javascript

  // Take the difference between one array and a number of other arrays.
  // Only the elements present in just the first array will remain.
  _.difference = function(array) {
    var rest = flatten(arguments, true, true, 1);
    return _.filter(array, function(value){
      return !_.contains(rest, value);
    });
  };

```


第一引数のarray以外の値をflattenを用いてrestという変数に格納する。
_.filterをarrayに用いる。filterする条件は、arrayの値valueがrestに含まれていないもののみにフィルタリングする。
これで、例に挙げられているとおりarrayの中でothers(rest)に含まれていないもののみが抽出できる。