OmniAICreator/Qiita-1.07M huggingface dataset:
吐き出されるヘッダ情報をどうにかする - PHP初心者の覚え書き①

# 前提

僕はもともと印刷屋で数年働いていたのですが、その後縁あってWEB屋に転職して現在に至る者です。
WEBの知識は大学生時代にGeocitiesやTripodでWEBスペースをレンタルしてそこにメモ帳でゴリゴリ書いたhtmlをアップする、という程度しか無かったのです。
なので転職してすぐの頃は「Wordpressって何」「いや、そもそもPHPって何」というところからスタートしました。また、転職した職場が教育体制が一切できていないところだったので僕のような無知な人間がいきなりWEBの保守を担当させられる、なんてこともザラでした。
なので僕はPHPに関する知識のベースが一切無い人間なのです。

…という前提があり、PHPを基礎からちゃんと学んでいない僕が現場の仕事をこなしていく上でぶつかった壁や学んだ事を覚え書きとして纏めていきたいと思います。
※なので、ちゃんと学んでいる人からすれば当たり前の事しか書いていないと思われますので、本文中におかしな点がありましたら「いや、それは間違っているぞ！」と突っ込みを入れていただけると助かります。

# 今回ぶつかった壁

UTF-8のサーバーに置かれた、Shift JISで書かれたPHPをブラウザで見ると盛大に文字化けする。
※もちろんPHPは僕が書いたものではなく、5年以上前に在籍していた人が残したものです。

# 環境

今回は以下の環境で実施しています。

|OS|Apache|PHP|
|:---:|:---:|:---:|
|CentOS 6.3|2.2|5.6|
|UTF-8|;default_charset = "iso-8859-1"|default-character-set=utf8|

※VirtualHostで運用。

# やったこと

## 1.Apacheの設定でデフォルトの文字コードを無効にしてみる。

```bash:/etc/httpd/conf/httpd.conf
AddDefaultCharset UTF-8
↓　↓
AddDefaultCharset off
```
⇒変化なし

## 2.Virtual Hostの文字コードを以下の様にしてみる。

```bash:/etc/httpd/conf.d/virtualhost.conf
<VirtualHost *:80>
AddDefaultCharset off
</VirtualHost>
```
⇒変化なし

## 3.metaタグをいじってみる。

```html:/var/www/html/index.php
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift-jis">
</head>
```

```bash
curl -I http://example.com/index.php
(中略)
Content-Type: text/html; charset=UTF-8
```

⇒変化なし

## 4.header属性をいじる。

```php:/var/www/html/index.php
<?php
header("Content-Type: text/html; charset=Shift-JIS");
?>
```


```bash
curl -I http://example.com/index.php
(中略)
Content-Type: text/html; charset=Shift-JIS
```

ｷﾏｼﾀﾜｧ*・゜ﾟ・*:.｡..｡.:*・゜(n'∀')ηﾟ・*:.｡..｡.:*・゜ﾟ・* 

# 結論

PHPはプログラムでヘッダー情報を吐き出しているため、ヘッダー情報を変更したければhtmlではなくプログラム部分のヘッダー属性をいじらないとダメ。
bitcoindを0.13.0にアップグレードする

# 環境

* MacBook Pro (Retina 13-inch、Early 2015)
* Mac OSX El Capitan (10.11.3)
* bitcoind v0.12.1 -> v0.13.0
* openassets-ruby v0.4.6
* ruby 2.2.2 (rvm利用)
* 実行日 = 2016-09-30

## 注意
不安な方は、どこかにビットコインを移しておくと良いでしょう。
（移さなくて問題ありませんが、何かトラブったときのために。。）

# 更新作業

まず、v0.13.0をダウンロードしてきます。

https://bitcoin.org/bin/bitcoin-core-0.13.0/

ここでは、ソースコード「bitcoin-0.13.0.tar.gz」をダウンロードして、
実行ファイルをコンパイルから作成しています。

```zsh
# 解凍
% tar zxvf bitcoin-0.13.0.tar.gz
% cd bitcoin-0.13.0/

# Makefile作成
% ./configure

# コンパイル&オブジェクトリンケージ
% make

# オブジェクト置き換え
% make install
```

幾つかwarningが表示されますが、コンパイルは成功します。

# 動作確認

更新直後は、インデックス再構成のためリクエストは受け付けないようです。

```zsh
[ 16-09-30 19:41 ] ~/bitcoin-0.13.0
osada@mbp16a% bitcoin-cli -testnet getinfo
error code: -28
error message:
Rewinding blocks...
```

しばらくすると、応答があります。

```zsh
[ 16-09-30 19:41 ] ~/bitcoin-0.13.0
osada@mbp16a% bitcoin-cli -testnet getinfo
{
  "version": 130000,
  "protocolversion": 70014,
  "walletversion": 60000,
  "balance": 0.00000000,
  "blocks": 829553,
  "timeoffset": 0,
  "connections": 1,
  "proxy": "",
  "difficulty": 1,
  "testnet": true,
  "keypoololdest": 1463718812,
  "keypoolsize": 101,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": "Warning: unknown new rules activated (versionbit 28)"
}
```

また、しばらくすると、段階的にUTXOが表示されるようになります。（全部は表示されません）

```zsh
[ 16-09-30 19:45 ] ~/bitcoin-0.13.0
osada@mbp16a% bitcoin-cli -testnet getbalance 
0.00001200
```

最終的には、ちゃんと全部表示されます。

```zsh
[ 16-09-30 19:50 ] ~/bitcoin-0.13.0
osada@mbp16a% bitcoin-cli -testnet getbalance
2.44580834
```

# その他

何かエラーが出ているようなので、あとで調査します。
速報：Vagrant 1.8.6がリリース。SSH公開鍵バグも修正される


Vagrantの最新バージョンが1.8.6になりました。

[Vagrant by HashiCorp](https://www.vagrantup.com/)

この中で重要なのは、1.8.5で大きな問題となった **「vagrant up/sshのときにAuthentication failure. Retrying...メッセージが止まらない」バグが解消された** ことです。

GitHub Issueでの議論とパッチ報告: [Authentication failure after inserting new key with Vagrant 1.8.5. [PATCH] · Issue #7610 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/issues/7610)

## 具体例

[Vagrant vagrant upしたときに"Authentication failure. Retrying..."警告がでてvagrant sshできない状態からの脱出 - Qiita](http://qiita.com/jshimazu/items/9db49ce64478e82d511e)より引用。

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
```

## 1.8.6における修正

[vagrant/CHANGELOG.md at v1.8.6 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/blob/v1.8.6/CHANGELOG.md)

> guests/linux: Fix SSH key permissions [GH-7610, GH-7611]

## 対処

迷わず、Vagrantの最新版(1.8.6)にアップグレードしましょう！

### バイナリを直接インストールする場合
下記からダウンロードすれば、最新版が入ります。

[Download - Vagrant by HashiCorp](https://www.vagrantup.com/downloads.html)

### Mac: Homebrew Caskを使う場合

    brew cask install vagrant --force

### Windows: Chocolateyを使う場合

    choco upgrade vagrant -y

## 注意

ただ、これでも問題が発生する・新たに問題が出現する場合には、バージョン1.8.4にダウングレードすることも検討しましょう。
Quantum Chemistry - Classical Harmonic Oscillator 2: Energy

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Classical Harmonic Oscillator 2: Energy
https://www.youtube.com/watch?v=3LxM2VAMVsQ&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=44


- 緑の式 
  - V(x): potential energy function
  - パラボラ形状
  - k: spring constant
      - kが大きいと、パラボラの幅が小さくなる
- 紫の式  
  - x: r - r0
       - r0 (r [nought](http://eow.alc.co.jp/search?q=nought)) 
       - r0はenergyが最小となるbond length
- ピンクの式
  - x()の時間変化
  - omega: angular velosity
- 黄色の式
  - omegaの式
- 緑の式
  - Total energy
  - はkinetic energy Tとpotential energy Vの合計
- 紫の式
  - 緑の式に
  - kinetic energy Tの式と
  - potential energy Vの式を
  - 代入した
- ピンクの式
  - 速度v(t)の式
  - 速度はx(t)の1回微分
  - 左上のピンクの式を微分すると得られる
- 黄色の式
  - 左中段紫の式にv(t)とx(t)を入れた
- 水色の式
  - 黄色の式を整理
- オレンジの式
  - 水色の式においてmA^2{omega}^2を計算
  - 左上段の黄色の式を代入して整理
- 緑の式
  - 水色の式とオレンジの式から整理
  - sin二乗とcos二乗の和は1となる
- 右側ピンクの式
  - 左下緑の式から整理した
  - Total energyはspring constant kと
  - 振幅Aの二乗から求められる
- 黄色の文字
  - ピンクの式に時間依存がない
  - つまりはenergyは保存されていることを示す
- 水色の文字
  - Total energyは保存されている
  - Tが増えるとVが減り、その反対もある
     - (補足) [vice versa](http://ejje.weblio.jp/content/vice+versa)
[Node.js]ちょっとしたフロントエンドの実験でhttpsが突如必要になった時に超絶簡単にデバッグ環境を用意できるパッケージを作った

# 動機

最近、フロントエンドで一部のAPIがhttpsである状態じゃないとアクセスできなかったりする。
MediaStreamなどを使う場合などだ。少しWebRTCの実験したいだけなのに、自己署名証明書作成したり、それを既存のサーバーの設定に組み込んだりすごくめんどくさい。

理想的には、既に普段のデバッグ用のhttpサーバーが立っているので、全てのhttpsリクエストをそこに投げて、そのまま返してくれればいいはずだ。(つまり、ただのプロキシ)

# 作った

すごく簡単なhttpsのリクエストを既存の別のポートで開いているhttpサーバーに投げるだけのnpmパッケージを作った。
面倒な自己署名証明書の作成も**いらない**、自動的にインストール時に作成される。

**注) インストール前にopensslがお使いの環境にインストールされているか確認してください**
(Macだと出荷時に含まれている。。？)

```bash
$ npm install hss -g
```

これでインストールは完了。使う準備はできました。

もし、80番ポートにhttpサーバーが開いていて、`https://localhost:9000`でアクセスしたいとすると、以下のようなコマンドで実行すると可能。

```bash
$ hss -p 9000 -t 80
```

受け取るパラメーターはたったの二つ。

* port(エイリアス`p`)・・・httpsサーバーがどこのポートを監視するか。
* targetPort(エイリアス`t`)・・・httpサーバーがどこに開かれているか。

# 信頼

もちろん、勝手に証明書作っているので実際にはこの証明書を信頼しないと、正当なhttpsとして動作しない。
その際は、hssのフォルダ内のkeysフォルダに`server_crt.pem`が含まれているのでこれをキーチェーンアクセスに登録する。(Windowsは頑張ってください)

```bash
$ where hss
```
と実行すれば、おそらくhssのフォルダがわかるはず。

```
/Users/XXX/.nvm/versions/node/v.YYY/bin/hss
```
のようなファイルパスで表示されるので、必要な証明書の位置は
```
/Users/XXX/.nvm/versions/node/v.YYY/lib/node_modules/hss/keys/server_crt.pem
```
になります。

**僕の環境はnvmで行なっているのでファイルパスが上記の通りですが、類似の方法で、大体の場所はわかるはずです。**

これを`Keychain access`に登録すれば、ブラウザからこの証明書が信頼されます。

Mac環境でのSSL証明書の信頼に関しては以下の記事を参考にすると分かりやすそうです。
http://qiita.com/suin/items/be87a7a581f30b38c5f7


# 仕組み

## 証明書の生成

package.json内にscriptの中にpostinstallを設置、同梱したシェルスクリプトを実行するようにした。
最初は、そもそもパッケージにする時に、何か自己署名証明書を入れればいいと思っていたが、それを信頼すると見ず知らずのうちによくわからない脆弱性を抱えかねないのでこれはやめた。

## 本体の部分

単にhttpsできたリクエストをそのままhttpに書き換えて送っているだけ。ほぼどこかのページに載ってたスクリプトのまま。


# 疑問

```
hss & hs
```
とすれば、同時にサーバーが立つようになるはずだったが(hsはhttp-serverをnpmで入れれば使える)、`Ctrl + C`でプロセスを終了すると、片方が実行されたままになってしまう。どうにかいい方法はないだろうか。。。
pillow を使って from PIL import Image した時に Symbol not found: _PyUnicodeUCS2_AsLatin1String とか出る時の対応

またエラー引きそうなので、自分用のメモも含めて。

# 環境

Homebrewでインストールしたpyenv上で動かしています。

python2.7.12
Pillow2.7.0

# 事象

importでコケる

```
>>> from PIL import Image
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site-packages/PIL/Image.py", line 63, in <module>
    from PIL import _imaging as core
ImportError: dlopen(/usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site-packages/PIL/_imaging.so, 2): Symbol not found: _PyUnicodeUCS2_AsLatin1String
  Referenced from: /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site-packages/PIL/_imaging.so
  Expected in: flat namespace
 in /usr/local/var/pyenv/versions/2.7.12/lib/python2.7/site-packages/PIL/_imaging.so
```

# 対処

これで直った

```
$ pip freeze | pip install --ignore-installed --no-use-wheel -r /dev/stdin
```

ここに詳しく書いてある
[Import Error on El Capitain · Issue \#1753 · python\-pillow/Pillow](https://github.com/python-pillow/Pillow/issues/1753)
AsciiDocでドキュメントを書いてみた（２）

[AsciiDocでドキュメントを書いてみた（１）](http://qiita.com/kouta_hara/items/ff62bb3b9431d8cc6c5d)の続き。
RedPenプラグインを快適に使うための設定についてなど。

# Redpenの指摘・ルールの調整例
前回の記事では「わりと厳しいredpen」として紹介しましたが、今回は「日本武道館」に関するwikipediaの記事を例に指摘の内容と、それぞれに対するルールの調整例について見ていきたいと思います。

## 指摘例１（parenthesized sentences）
括弧内の文字列が長い・括弧がネストされている等の場合に怒られます。
Asciidocプラグインのデフォルトではネストは許可されず、長さは３文字までとなっています。
流石に厳しいような気がするので、ネストを１階層まで許可、長さは２０文字くらいまで許可してみました。
![parenthesized1.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/cf2ba321-3abd-40f1-bcee-32718ec6a525.jpeg)
括弧内の文字数が多すぎると怒られる。

![parenthesized2.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/49322b25-672b-5c6f-6ea7-f69456f518b3.jpeg)
括弧が指定数以上の深さまでネストされていると怒られる

![parenthesized3.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/36e1eb3e-3e49-b9ae-0eb7-7d652a9bdd4a.jpeg)
redpenの設定から、２階層目までのネストを許可・括弧内は20文字まで許可するよう設定。

## 指摘例２（WordNumber）
１文に存在する単語数が指定値より多い場合にも、赤ペン先生のチェックが入ります。
デフォルトの設定は30ですが、文書全体の傾向を確認しつつ、適切な値を設定しましょう。
今回は思い切って40へ変更してみます。
![wordnumber1.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/07ad8bed-24fe-ae8a-bb92-2713f0c2683e.jpeg)
１文の単語数が最大値を超えてしまい、怒られている。

![wordnumber2.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/89dd43b1-a5f5-988b-19bd-fd8b82df70c2.jpeg)
１文に存在出来る単語数を30から40へ変更してみる。

## 例外ワードの設定
Redpen指摘の例外としたいワードがある場合、例えば「全日本」という単語は１文中に何度登場しても良いとしたい場合には、list=への記述、またはdect=へ指定した辞書ファイルへ記述します。
※.辞書ファイルは.idea/redpen下へ配置

なお、list=へ記述する場合には","（カンマ）区切り、辞書ファイルへ記述する場合には改行区切りで複数単語を指定できます。
![list1.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/97e7ca37-21bb-ebc1-99c8-3a1c406572e5.jpeg)
重複ワードの例外として「全日本」を追加した例

このように、ひとつづつのルールに対して対応する条件（や例外）を設定する事で、「本来指摘されるべき」指摘が明確となり、より効率的な文書校正が可能となります。
最初は少し大変ですが、RedPenの設定画面から設定のインポート・エクスポートもできますので、一度作成してしまえば同じテーマの文章であれば使い回しが出来るので便利かと思います。

是非、色々試してみてください。
SoftLayerのFortigate Security Applianceで利用できる機能一覧

#はじめに

SoftLayerではファイアウォール、リバースプロキシ、IPS/IDSの機能を持つコンポーネントとして、Fortinet社のセキュリティ製品である[Fortigateアプライアンス](http://www.fortinet.co.jp/products/fortigate/)を利用できます。

SoftLayerから提供されているモデルはFortigate 300Cというモデルなのですが、ライセンス上全ての機能が利用できるわけではなく、一部の機能に制限があるようです。

そこで、SoftLayerからFortigate Securiy Applianceを購入した場合にどの機能が利用できて、どの機能は制限されているのか確認してみました。

#SoftLayerにチケットで聞いてみた

SoftLayerに問い合わせたところ、デフォルトで利用できる機能は以下になります。

- [VDOM](http://www.fortinet.co.jp/products/fortigate/management_feature1.html)のadministratorアクセス権
- Public VLAN上の全サーバーの保護(Fortigate 1台につき1VLAN)
- HTTPS, SSHによる管理用途での接続
- SSL-VPN, IPSec-VPNの終端
- HAオプションの有効化(オーダー時にHAを選択していた場合は初期設定で有効)
- NAT(PublicからPublicのみ)
- IPv4、IPv6のサポート
- Public Network上のIPSec VPN

これだけ？と思ったあなたに朗報です！

SoftLayerではチケット経由で以下の4つのAdd-onを月額料金で購入する事ができ、自分のニーズに合致した追加機能を選択して利用する事が可能です。

- [Fortiguard AV Service](http://www.fortinet.co.jp/products/fortiguard/antivirus.html): $99 /月
 - アンチウイルス機能の提供

- [Fortiguard NGFW Service](http://www.fortinet.co.jp/solutions/ngfw.html): $99 /月
 - New Generation Firewall機能の提供
 - ステートフルインスペクションF/W, IPS, Application Control機能を利用可能

- [Fortiguard Web Filtering Service](http://www.fortinet.co.jp/support/fortiguard_services/web_filtering.html): $139 /月
 - Webアクセスポリシーの適用
 - 有害なWebサイトへのアクセスをブロック
- Bundle (上記3セット): $199 /月

#まとめ

SoftLayerから購入できるFortigate Security Applianceはデフォルトの機能はF/W, VPN, NAT機能くらいしかありませんが、Add-onの購入により、アンチウイルス、NGFW、IPS、Webフィルタリングなどの機能を追加で利用できる事がわかりました。

また、SoftLayerのどのコンポーネントが何の機能を利用できるかは[ここ](https://knowledgelayer.softlayer.com/learning/softlayer-design-decision-tool)も参考にしてください。
UnityでAndroid向けアプリ開発(導入編・時間が無い人向き)



#①JDKをダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Accept License Agreement にチェックを入れてMacOSXの欄をクリック
<img width="544" alt="スクリーンショット 2016-10-03 10.37.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/136558/64a1429b-f2a6-77d6-be75-30d41cb54fc2.png">

インストーラをダブルクリック


#②android studioのダウンロード
https://developer.android.com/studio/index.html
からダウンロード

ディレクトリを聞かれますが特に無ければ[OK]をクリック
standardかcustomか聞かれますが特に無ければstandardを選択
いくつかダウンロードされるのでしばらく待機→終了後[Finish]


#③android studioのセットアップ
![スクリーンショット 2016-10-03 10.57.09.png](https://qiita-image-store.s3.amazonaws.com/0/136558/1ca8f7eb-65cb-9e5d-4a51-22fd52c2c796.png)
android studioのトップ画面のconfigureをクリック。
![スクリーンショット 2016-10-03 10.57.18.png](https://qiita-image-store.s3.amazonaws.com/0/136558/86fb04d4-288b-aa72-d574-a07634f8b6d3.png)
SDK managerを選択しクリック。


使用を想定しているandroidのバージョンを選択し[OK]をクリック。
ダウンロードする内容を確認されるので[OK]をクリック。
ダウンロード終了後[Finish]をクリック。

#④android製品のセットアップ
###(1)USBドライバダウンロード
XPERIA Z4の場合、接続するとインストールするか聞いてくれる。
その後、ファイルの転送(MTP)を選択するとインストールされる
HUAWEI mediapad m8.0の場合、公式サイトからDLする。

###(2)USBデバッグをオンにする
製品の設定/端末情報/ビルド番号を7回ほどタップ
製品の設定に戻ると開発者向けオプションが追加されているので
開発者向けオプション/USBデバッグにチェック



#⑤Unity
unity/preference/external ToolのAndroidのSDKとJDKのディレクトリを入力
(SDK)→/Users/〇〇(PCユーザー名)/Library/Android/sdk
(JDK)→/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home

その後、file/BuildSettingでandroid選択。player Settingsをクリック。
<img width="664" alt="スクリーンショット 2016-10-03 11.21.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/136558/5b37009e-61a4-43dc-b5ca-6eb3ce324c05.png">
other settingsのbundle identiferを任意の名前に変更。
<img width="336" alt="スクリーンショット 2016-10-03 11.23.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/136558/3f776a38-9f89-1c48-3184-5e5187664b0b.png">


Build&Runをクリック。動作すればOK
僕の場合、一発で動作しませんでしたが再起動すれば出来ました。
mochaでes2017のコードをテストするときは es_staging オプションを忘れずに

#起きた事象

`es2017` の `Object.values` とか、もうみんな使うよねということで、テストも書いてみたところ、なんかテストコードが失敗します。

**`TypeError: Object.values is not a function`**

Babel使って動かすと、該当コードは普通に動きます。なんでだろう...

#環境

以下のようなpackage.jsonになっているものとします（必要そうな箇所だけ抜粋しています）。

```json
{
  "dependencies": {
    "babel-cli": "^6.14.0",
    "node-es6": "^0.3.1"
  },
  "devDependencies": {
    "babel-preset-es2015": "^6.14.0",
    "babel-preset-es2016": "^6.11.3",
    "babel-preset-es2017": "^6.16.0",
    "babel-preset-power-assert": "^1.0.0",
    "babel-register": "^6.16.3",
    "mocha": "^3.0.2",
    "power-assert": "^1.4.1",
    "sinon": "^1.17.6"
  }
}
```

[espower-babel](https://github.com/power-assert-js/espower-babel)は非推奨なので、[migrate-espower-babel-to-babel-preset-power-assert](https://github.com/power-assert-js/migrate-espower-babel-to-babel-preset-power-assert)を使って移行するか、最初から[babel-preset-power-assert](https://raw.githubusercontent.com/power-assert-js/power-assert-js-logo/master/banner/banner-official-fullcolor.png)を使いましょう。

`.babelrc`には`es2017`のプリセットを設定しているものとします。

```json
{
  "presets": [
    "es2015",
    "es2017"
  ],
  "env": {
    "development": {
      "presets": [
        "power-assert"
      ]
    }
  }
}
```

`test/mocha.opts` で`babel-register`を使ってコンパイルするように指定します。

```
--compilers js:babel-register
```

特に悪いところはなさそうなんだけどなー

#ヘルプはちゃんと読もう

試しに `mocha --help` してみました。

```
--compilers <ext>:<module>,...  use the given module(s) to compile files
--debug-brk                     enable node's debugger breaking on the first line
--globals <names>               allow the given comma-delimited global [names]
--es_staging                    enable all staged features
```

なんだこの `es_staging` って、めっちゃ怪しい...

`mocha.opts` に追加してみました。

```
--compilers js:babel-register
--es_staging
```

#解決

`npm test` で実行してみたら、無事 `Object.values()`が通過してテストが成功するようになりました。
めでたし、めでたし。
複数ブランチ開発でmaster以外のブランチに効率的にGitHub Pull Requestを作成する方法

# 背景

GitおよびGitHubを利用したプロジェクトにおいて、開発プロセスにPull Requestを利用しているプロジェクトは非常に多いと思います。

そして、GitHubは開発者がPull Requestを作成することを楽にするために、pushされたブランチに対して、 `Compare & Pull Request` というリンクを作成してくれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/61705/ea55daa0-3726-f6e0-d385-6e9e5044dcde.png)

ここをクリックした時に表示されるのは、 `Default Branch` に対しての差分表示及びPull Request作成画面です。masterブランチのように、`Default Branch`にPull Requestを送る時には最高のボタンになりますが、`Default Branch`以外のブランチで開発しており、masterブランチから該当ブランチへの差分が非常に大きい時は、作業効率を低下させるボタンになってしまいます。
というのも、

1. ボタンをクリック後、GitHubが差分を計算し、それが最終的にブラウザで表示されるまで、長時間待たされます。大きなレポジトリだと10秒以上待たされることも。。。
2. 長時間待たされた結果、自分が`Pull Request`を送りたくない`Default Branch`との差分を見ることになります。例えば、`another-master`ブランチや`develop`ブランチ、特定の大型リリース向けのブランチ、安定運用中のメンテナンスブランチなどにPull Requestを送りたい時に、以下のような`master`との差分を見ても困りますよね。
![image](https://qiita-image-store.s3.amazonaws.com/0/61705/c8ed5759-ee5d-bc68-909e-66aeddb23553.png)
3. そして、自分の出したいPull Requestを作成するためには、上記画面から`base`ブランチを目的のブランチに変更する必要があります。

複数ブランチ開発において、開発サイクルの中心にあるようなPull Request作成が非効率になるのは健全ではないですし、ストレスもたまってしまうので、効率的な手法を紹介したいと思います。

# 準備物
gitに加えて、[hub](https://github.com/github/hub)をインストールしておく必要があります。Macの方は、Homebrewでインストールするのが楽です。

```
brew install hub
```

# hub pull-request を利用する方法
作業ブランチから`git push`を行った後に、作業ブランチで以下のコマンドを打つだけです。

```
hub pull-request -b <base> -m <message>
```

ここで、`<base>`は、Pull Requestのマージ先のブランチです。

Pull Requestの作成を自動化したい、サクッとPull Requestを作りたいなどの場合において、この手法は非常に有用です。
しかし、ブラウザでのPull Request作成に慣れている人間にとっては、GitHub上での、開発効率化の為の各種恩恵が受けられなくなるデメリットがあります。例えば、`Pull Request Templates`や、人・チーム・Issueなどへの補完機能が利用できなくなります。

# hub compare を利用する方法
そこで、`hub compare`を利用する手法がオススメできます。
以下のコマンドを打つと、`START`で示されたブランチを`base`として、`END`で示されたブランチへの差分がブラウザ上で見れます。

```
hub compare [-u] [USER] [<START>...]<END>
```

例えば、以下のようなコマンドを打てば、ブラウザが立ち上がり、目的の `Compare & Pull Request` ページにいきなりたどり着くことができます。

```
hub compare another-master...feature/hoge
```

とはいえ、毎回これを打つのも大変です。
おすすめとしては、以下のような`git alias`を登録することです。

```
git config --global alias.pr-to '! f() { hub compare $1...$(git rev-parse --abbrev-ref HEAD); }; f'
```

これにより、マージ先のブランチを指定するだけで、現在のブランチを元に`Compare & Pull Request`ページを開くことのできるエイリアス（といっても独自関数に近い）が利用可能になります。

```
hub pr-to <base>
```

これで、ブラウザをポチポチする必要はなくなり、push直後に目的のPull Request作成ページを開くことができるようになります。

```
git push origin feature/hoge
hub pr-to another-master
```

# References
https://git-scm.com/
https://github.com/github/hub
AWS　セキュリティグループの使い方考察

#AWSのセキュリティグループの使い方考察

##基本
デフォルトでは、以下のような設定になっている。
インバウンド：すべて拒否
アウトバウンド：すべて許可

※俺からは好きにするが、お前たちは俺に触るな！！！ってことが書かれている。

##指定方法

インバウンド/アウトバウンド共に
・プロトコル
・ポート範囲
・送信元/送信先（IP or SG）

##面倒にしたくない。
アウトバウンドはデフォルトのすべて許可でも良いのではないか？
インバウンドで制御するからいいじゃないか？
※いや、それじゃいかんだろうといつか思うかもしれない。

##パーツを作っとくのがスマートかもしれない。
同じ役割のEC2ごとにSGを作っていくのもいいかもしれないが、
SG（セキュリティグループ）で送信元を指定できるので、
事前にパーツを作っておくのが楽なのでは？

例えば）
あるシステムで、サーバとクライアントがあるとき、
サーバ用SGとクライアント用SGを作っておく。

サーバ用SGにはクライアントからのインバウンド通信を。
クライアント用SGにはサーバからのインバウンド通信を。

EC2にはSGを複数つけられるので、システム毎にSGをつけていく。
（上限はあるのであまり細かくするのは良くない。）

イメージとしてはウィルス対策、監視、ログなど
必要な通信が書かれているSGをアタッチしていくだけなので、
管理がシンプルになると思われ。

他にこんな方法もあるよ！というかたは、
やさしく、そっとコメントいただけるとうれしいです。
オンラインジャッジでの並列実行


|シリーズ：掃き出し法について|URL|
|:--|:--|
|問題：十文字に反転して色を揃えて！(最短手数の最大化)|https://codeiq.jp/q/2972|
|single/OpenMP|https://qiita.com/cielavenir/items/2fa1f1149132de579a46|
|std::async|https://qiita.com/cielavenir/items/61b329936ef6508a5938|
|番外編：オンラインジャッジで並列実行は使えるか？|https://qiita.com/cielavenir/items/ade2b7c0b5a63b2687f0|
|問題：裏表ちわーわ(解の存在判定)|http://yukicoder.me/problems/no/460<br>https://www.codeeval.com/public_sc/191/|
|解説|https://qiita.com/cielavenir/items/c6b15ff4e28fb5f492ec|

2記事に渡って、OpenMPとC++11標準での並列実行について扱った。

- さて、C++11標準の並列実行があるならば、オンラインジャッジで使ってみたくなる。
- しかし、ideone(CodeIQ)、paiza.io、Codeforcesでは通用するが、AtCoder(のコードテスト)やyukicoderでは通用しなかった。
- これは、Linuxではasync機能は`-lpthread`オプションに依存するためである。コンパイルオプションをこちらから変更することはできず、また、libpthread.soはdlopen()できるものではないらしいので、どうすることもできない。

## 標準でできる言語
- Go言語のgoroutineおよびD言語のstd.parallelismは、コンパイルオプションによらずいつでも行うことができる並列化方法である。
- しかし、ベンチマークを取ったところ、GoやDはC++の2〜3倍ほど遅いので、オンラインジャッジのCPUが良くて4コアと思われることを考えると、C++をやめる理由にはならなそうである。

|[フィズバズ・エクストリーム問題](http://togetter.com/li/840836)のナイーブ解|MacBookAir Core i7 2x2cores|
|:--|:--|
|[C (OpenMP)](https://github.com/cielavenir/codeiq_solutions/blob/master/kawazoe/tyama_codeiq1560_openmp.c)|22.8s (CPU 83.8s)|
|[C++ (async)](https://github.com/cielavenir/codeiq_solutions/blob/master/kawazoe/tyama_codeiq1560_async.cpp)|26.6s (CPU 83.6s)|
|[Go](https://github.com/cielavenir/codeiq_solutions/blob/master/kawazoe/tyama_codeiq1560_naive.go)|30.3s (CPU 95.7s)|
|[D](https://github.com/cielavenir/codeiq_solutions/blob/master/kawazoe/tyama_codeiq1560_naive.d)|104.4s (CPU 196.7s)|

Dはかなり厳しいが、Goは奮闘している。

Goでの答案を、[ABC033D 三角形の分類](https://abc033.contest.atcoder.jp/tasks/abc033_d)で試したくなるもの。
実際に試したところ、残念ながらTLEに終わったが、1.5倍ほど高速化されていることが明らかになった。

- single https://abc033.contest.atcoder.jp/submissions/910523
- parallel https://abc033.contest.atcoder.jp/submissions/910521
  - コードテストの`cat /proc/cpuinfo|grep processor`によると、コア数は2であるようだ。

問題によるが、最終手段として使ってみるのもありかも、しれない。
macの容量が足りなくなったら


以下のコマンドで容量が大きいフォルダを検索
いらないものは捨てる

```
sudo du -g -x -d 5 / | awk '$1 >= 5{print}'
```


以下のディレクトリの容量が大きい場合はiphone, ipadなどのバックアップで不要なものを削除
[http://weekly.ascii.jp/elem/000/000/246/246682/](http://weekly.ascii.jp/elem/000/000/246/246682/)

```
~/Library/Application Support/MobileSync
```
Gitでテストコミットをさせるワンライナー

Gitの動作確認とかがうまく行っているかテストするため用。良く忘れてしまうので独立。


乱数をファイルに書いて追加、コミット、プッシュ。

```zsh
sh -c 'echo $RANDOM > random.txt; git add -A; git commit -m "test commit"; git push --all'
```

git-add-all-git-commit-git-push-allを使った場合。

```zsh
echo $RANDOM > random.txt; ga -m "test commit"
```

> git add --all; git commit -m 'first commit'; git push --all を打つのに疲れたので関数化した
> http://qiita.com/yousan/items/b820373d4d2ac1e691a7


元ネタ
> サーバの/etcを自動的にgitとかにコミットプッシュしてくれるetckeeperを使う
> http://qiita.com/yousan/items/91dfc187f8345d299068
Git のマージ メモ

# マージ (merge) とは？

* 加えた修正を統合する作業
* 自分の変更を加えたブランチを、元のブランチにマージすることによって、修正を流し込む。
* 変更を持ってるブランチと、変更を流し込まれるブランチを指定して行う。
    * `git` コマンドや SourceTree の場合は、流し込む先のブランチに移動してから、取り込みたい変更を持っているブランチを指定して行う。

![WS000074 - コピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/334e657f-5f37-cc65-3e1d-fcd08d10299e.jpeg)


# 競合 (conflict)

* ほとんどの場合、Git は自動的にコミットを合成 (?) してくれるが、自動的にできない場合、競合が起きる。
* マージする両方のブランチの同じ個所に修正があると、競合を起こす場合がある。
* この場合は、手動でどうすべきかを指定する。


## 競合の例

* 修正前

```c:original
int main(int argc, char **argv)
{
    printf("foo");
    return 0;
}
```

* `master` ブランチ
    * `"foo"` を `"bar"` に書き換えた。

```c:master
int main(int argc, char **argv)
{
    printf("bar");
    return 0;
}
```

* `develop` ブランチ
    * `"foo"` を `"baz"` に書き換えた。

```c:develop
int main(int argc, char **argv)
{
    printf("baz");
    return 0;
}
```

* これを、`master` ブランチに移動して、 `develop` ブランチをマージする

```c:merge
int main(int argc, char **argv)
{
<<<<<<< HEAD
    printf("bar");
=======
    printf("baz");
>>>>>>> develop
    return 0;
}
```

* 競合した部分を修正してコミットする

```c:merge
int main(int argc, char **argv)
{
    printf("foo bar baz");
    return 0;
}
```


# 参考資料

* [The git merge Command](https://www.atlassian.com/ja/git/tutorial/git-branches#!merge)
* [Git - ブランチとマージの基本](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC)
* [3. ブランチをマージする【チュートリアル1 ブランチを使ってみよう】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/stepup/stepup2_4.html)
*.tf 内で AWS アカウント ID を自動参照(取得)する aws_caller_identity Data Source

## 結論

[aws_caller_identity](https://www.terraform.io/docs/providers/aws/d/caller_identity.html) を使います。

```hcl
data "aws_caller_identity" "self" { }

output "account_id" {
  value = "${data.aws_caller_identity.self.account_id}"
}
```

## 経緯

Terraform で AWS の各構成を組んでいる時、たまに **自身(もしくは別)アカウントID** を参照したくなる時があります。

例:

- [sns_topic_policy](https://www.terraform.io/docs/providers/aws/r/sns_topic_policy.html)
    - 「自身のアカウントからの Subscription を許可する」というポリシーを追加する時はアカウントIDが必要
- [aws_vpc_peering_connection](https://www.terraform.io/docs/providers/aws/r/vpc_peering.html)
    - VPC ピア接続の際に、接続先である相手のアカウントIDが必要

こういったケースでは、これまではアカウントIDを [variable](https://www.terraform.io/docs/configuration/variables.html) として定義したり:

```hcl
variable "peer_to_account_id" {
  type    = "string"
  default = "123456789012"
}

# 参照する時は `${var.peer_to_account_id}`
```

それすらも必要無いと直接書き込んだり:

```hcl
resource "aws_vpc_peering_connection" "foo" {
    peer_owner_id = "123456789012"

    # ...
}
```

環境変数から読むという技もありますが、とりあえずアカウントIDをハードコーディングすることがほとんどだったと思います。

## `aws_caller_identity` の登場

ハードコーディングで構わないと思いつつも、どうにかいい感じに Terraform が AWS アカウント ID を取得してくれないかなーという願いを叶えるために、 Terraform version 0.7.1 から [aws_caller_identity](https://www.terraform.io/docs/providers/aws/d/caller_identity.html) が実装されました。

### Usage

```hcl
data "aws_caller_identity" "self" { }
```

上記のように data ソースを定義しておくだけで、各リソースで

```hcl
${data.aws_caller_identity.self.account_id}
```

を使ってアカウントID を参照(取得)することができます。

### Usage (別アカウント)

他のアカウントIDも欲しいよーという場合は、事前に `provider "aws"` で対象のアカウントの認証情報をセットしておくと:

```hcl
provider "aws" {
  access_key = "XXXXXXXXXX"
  secret_key = "YYYYYYYYYY"
  region     = "ap-northeast-1"
  alias      = "consumer"
}

data "aws_caller_identity" "peer_owner" {
  provider = "aws.consumer" # <= ここ追加
}

# ${data.aws_caller_identity.peer_owner.account_id}
```

他アカウントIDを参照することができます。

## 参考資料

- [AWS: aws_caller_identity - Terraform by HashiCorp](https://www.terraform.io/docs/providers/aws/d/caller_identity.html)
- [Get AccountID/OwnerID using IAM Credentials on AWS Provider · Issue #6588 · hashicorp/terraform](https://github.com/hashicorp/terraform/issues/6588#issuecomment-246197431)
モバイルSuicaの利用データを取得する

近距離電車交通費を費用計上したいため、モバイルSuicaのデータを取得したい。モバイルSuicaのサイトには[最高100件まで](https://www.jreast.co.jp/mobilesuica/use/sf/chk_account.html)、と表記されていて絶望的な気分になったんだけど、ログインして実際に使ってみると違った。

- https://www.mobilesuica.com/

からログインすることで利用履歴を確認できるのだけど、

- 一回のクエリで日付指定しつつ、その日以前の最大100件を取得できる。 
- 最大26週さかのぼれる

というわけで、半年分のデータは取得することができる。

データの出力形式としては、PDF での出力(plain な行をパースする)と HTML Table に出力(というかみたまんま)できる。なぜ CSV がないのだろう、それは要求仕様になかったからさ…、というのはおいておいて、これをどうにかして扱える形式にする必要がある。

というわけで何も考えずに Google Chrome で Table の範囲を選択して Google Spreadsheet にペーストしたところ、うまく表形式で入力できた。

![msuica.PNG](https://qiita-image-store.s3.amazonaws.com/0/5330/8fb33e2f-c9e4-dd29-33d0-845a6c824bef.png)

が、↓になる。(Windows 環境で確認、Mac はわからない)

![spread.PNG](https://qiita-image-store.s3.amazonaws.com/0/5330/29e80719-b8eb-ab53-ce62-1e494c37a645.png)

種別の欄が「入」なのが電車利用でそれを抽出する。また、差額の欄が電車賃になっている。このデータで問題ないのか会計士の先生に確認したところ、問題ないとのこと。

というわけでモバイルSuicaを使っていて、費用計上なりなんなりをしたいみなさんは、半年分しか取得できないことを考慮の上、早めにスプレッドシートに記録しておいたほうが良い。
[PostGIS] 都道府県のポリゴンから最大面積を持つポリゴンのみ抽出し、簡素化して表示パフォーマンスを向上させる

日本地図の地形データをそのままPolygonで表示すると
ポイントデータが多すぎてパフォーマンスがでないことがあります。

見た目を損なわない程度に簡素化する方法として2つの手法が考えられました。

1. 離島が多い地域はポリゴン情報が多数になる（長崎とか）ので、最大面積（本島）のみのデータでもよいと考え、本島のみのポリゴンにしてしまう
2. ポリゴンそのものを簡素化する。ST_SimplifyPreserveTopology関数を利用して、見た目に問題がない程度にポリゴンを簡素化する

データ構造 (今回のサンプルです）
SRIDは4326です。


| state_id | polygon |
|-----------------:|:------------------|
| 1 | 0106000020E61000000F0000000103 |
| 2 | 0106000020E61000006A0000000103 |
| 3 | 0106000020E6100000A30000000103 |
|4 | 0106000020E6100000650000000103 |

```
SELECT
  state_id
  -- ここでポリゴンの簡素化を実施する (簡素化の値は目視で確認しながら調整）
  , ST_SimplifyPreserveTopology(polygon,0.005) AS polygon
FROM
(
  SELECT
    state_id
    , polygon
    -- WINDOW関数を利用して、都道府県ごとのどのポリゴンが最大値かを判定
    , CASE WHEN area = MAX(area) OVER(PARTITION BY state_id) THEN TRUE ELSE FALSE END AS is_max 
  FROM
  (
    -- 各ポリゴンごとの面積を取得する
    SELECT
      -- 都道府県ID単位で集計できるようにIdを選択
      state_id
      -- DUMPは idとポリゴンの配列になっているため、ポリゴンだけ取得し、ST_AREAで面積取得
      , ST_AREA(Geography((ST_DUMP(polygon)).geom)) AS area
      -- 最終的にこのデータを利用するためSELECTに含める
      , (ST_DUMP(polygon)).geom AS polygon
    FROM
      state
  ) AS area_base
) AS max_area
WHERE
  -- 最大領域だけのデータにフィルタする
  is_max = TRUE
```
特定のProvisioning profileを削除する

Xcodeでプロビジョニングプロファイルを更新して追加する場合、これまでのプロビジョニングプロファイルとファイル名が異なり、同じidentifierのプロファイルが一覧に出ることがあります。

プロファイル自体は
`~/Library/MobileDevice/Provisioning Profiles/`
に配置されているのですが、ファイル名からidentifierが分からないため

http://qiita.com/noppefoxwolf/items/cca1dca314db376c2310

にあるように、全てのプロファイルを一気に消している方も多いかと思います。

Xcode>Preference>Accounts>AppleIDs>View Details...>Provisioning Profiles
から、指定のidentifierのプロファイルを右クリックすると、Show in Finderを選ぶことができます。

# 追記
Xcode9.3からはプロファイルがquick lookで概要を見ることが出来るようになりました。
`~/Library/MobileDevice/Provisioning Profiles/`から不要なプロファイルを選択して消せるようになったとおもいます。
Vue.js 2 アップデートメモ

__Migration from Vue 1.x__
Vueの1.xからの移行ガイド(英語)
https://vuejs.org/guide/migration.html

####_[Vue warn]: Failed to mount component: template or render function not defined. (found in root instance)_

:sob:

```js
new Vue({
  el: '#VueApp',
  components: {
    App
  }
})
```

:satisfied::two_hearts:


```js
new Vue({
  render(h) {
    return h(App)
  }
}).$mount('#VueApp')
```


#__コンポーネント名を必ず設定__
####_[Vue warn.]: found in anonymous component - use the "name" option for better debugging messages._

:sob:

```js:component
export default {
  data() {
    return {
      text: 'Hello Vue'
    }
  }
}
```

:satisfied::two_hearts:


```js:component
export default {
  name: 'helloText' // コンポーネント名設定する
  data() {
    return {
      text: 'Hello Vue'
    }
  }
}
```

#__コンポーネントにはルート要素が必要__   
####_[ERROR] template syntax error Component template should contain exactly one root element_

https://vuejs.org/guide/migration.html#Fragment-Instances-deprecated

:sob:

```html
<template>
  <div class="div1"><div>
  <div class="div2"><div>
</template>
```

:satisfied::two_hearts:

```html
<template>
  <div class="divRoot">
    <div class="div1"><div>
    <div class="div2"><div>
  </div>
</template>

or

<template>
  <div>
    <div class="div1"><div>
    <div class="div2"><div>
  </div>
</template>
```

#__v-elが使えなくなったのでrefを使用する__
####_[Vue warn]: Failed to resolve directive: el_

https://vuejs.org/guide/migration.html#v-el-and-v-ref-deprecated

:sob:

```html
<div class="HelpItem"
     v-el:help-item>
</div>
```

```js
this.$els.helpItem
```

:satisfied::two_hearts:

```html
<div class="HelpItem"
     ref="helpItem">
</div>
```

```js
this.$refs.helpItem
```

#__Filter Argument Syntax__

https://vuejs.org/guide/migration.html#Filter-Argument-Syntax

####_[Vue warn]: Failed to resolve filter: omit 100_

:sob:

```html
<div>{{ post.text | omit 100 }}</div>
```

:satisfied::two_hearts:

```html
<div>{{ post.text | omit(100) }}</div>
```

#__$eval__

####_this.$eval is not a function_

https://vuejs.org/guide/migration.html#Filters-Outside-Text-Interpolations-deprecated

:sob:

```js
data() {
  return {
    helpSearch: '',
    formatItems: [
      {
        title: 'Hello Vue',
        excerpt: 'xxxxxxxxxxxxxxxxxx'
      }
      {
        title: 'Hello Vue2',
        excerpt: 'xxxxxxxxxxxxxxxxxx'
      }
    ],
  }
}
computed: {
  filteredItems() {
    return this.$eval('formatItems | filterBy helpSearch | limit 7')
  }
}
```

:satisfied::two_hearts:

```js
data() {
  return {
    helpSearch: '',
    formatItems: [
      {
        title: 'Hello Vue',
        excerpt: 'xxxxxxxxxxxxxxxxxx'
      }
      {
        title: 'Hello Vue2',
        excerpt: 'xxxxxxxxxxxxxxxxxx'
      }
    ]
  }
}
computed: {
  filteredItems() {
    return this.formatItems.filter((item) => {
      const searchRegex = new RegExp(this.helpSearch, 'i')
      return (
        searchRegex.test(item.title) ||
        searchRegex.test(item.excerpt)
      )
    })
  }
}
```
「FRPを使いはじめて3年が過ぎました。」を発表してきました

[第一回スタートアップiOS/Android勉強会](http://connpass.com/event/40239/)の主催であるLang-8社のiOSアプリ開発担当として「FRPを使いはじめて3年が過ぎました。」というタイトルで発表してきました。

スライド: [FRPを使いはじめて3年が過ぎました。 // Speaker Deck](https://speakerdeck.com/rizumita/frpwoshi-ihazimete3nian-gaguo-gimasita)
スライド中で出てくるアプリのソースコード: [Tasks - GitHub](https://github.com/rizumita/tasks)

発表内容
---

FRP/MVVMを利用しはじめたのはおそらくiOS界隈では早い方ではないかと思います。RAC2から使っています。使い込んできましたが、ふとアプリ全体を眺めるとFRPライブラリに依存するのは怖くなりました。ですのでアーキテクチャにVIPERを採用してFRP/MVVMの利用をやめた、という内容です。
その他、RxSwiftをがっつり使って簡易なアプリを作成してみた（前述のソースコード）が、エラー型が明示できないのでクソだ、使うならReactiveCocoaだと思った、などです。

びびったこと
---

私がFRPとMVVMの世界に連れ込んだ方が参加されていたり、[画面遷移をVC外で管理するパターンの参考資料 - Qiita](http://qiita.com/yoching/items/e24197a38cccbba880c1)が発表されるなど、「ケンカ売ってんの？」と思われても仕方がない内容でしたw。

意外だったこと
---

FRP/MVVM花盛りの現在、賛同してくださる方はいらっしゃらないのでは？と思っていたのですが、意外にも同じように感じているとおっしゃってくださる方が現れました。VIPERにも興味を持ってくださる方もいて、嬉しかったです。

問題点
---

APIアクセスなどの複雑な非同期処理を記述するにはFRPが最適なので今のところ完全には排除できない状態です。Actorモデルフレームワークがあれば使ってみたいと思ってはいるのですが、良いフレームワークが無いようです。

今後の発表予定
---

次回開催は11月の予定です。次回はiOSとAndroidを分けて開催する予定です（Androidの発表を聞くのも楽しかったのですが…）。
VIPERに興味を持たれている方がいらっしゃるようなので、VIPERの紹介や実際の実装方法について発表したいと考えています。
またそれ以降の回ではFunctional/ReactiveなDDD設計の書籍を読みはじめたので、Swiftでの実装を考えてうまくまとまれば発表したいと思います。
次回開催でも多くの方の参加をお待ちしております。発表者も募集しますのでよろしくお願いします。

お知らせ
---

Lang-8社ではiOSやAndroidのプログラマなどの求人を行っております。
詳しくは[株式会社Lang-8の採用/求人一覧 - Wantedly](https://www.wantedly.com/companies/lang-8/projects)をごらんください。
PHPでの小数点以下の切り上げ・切り捨て処理まとめと-0になる現象について

PHPで小数点以下の数値を処理する際、使用するメソッドによってそれぞれ処理の方法が異なるため、きちんと仕様を確認して利用する必要があります。備忘録として以下にまとめます。

## round()：小数点以下の四捨五入
引数で指定した桁数から小数点第◯位を四捨五入した値を返します。

```
round(3.56, 2); // 小数点第二位を四捨五入　3.6
round(3.56, 2); // 小数点第一位を四捨五入　4
```

## floor()：小数点以下切り捨て
引数の値以下で、計算上の整数と等しい、最大の (正の無限大にもっとも近い) double値を返します。小数点以下切り捨てです。

```
floor(1.34); // 1.0
```

## ceil()：小数点以下の数値切り上げ
引数の値以上で、計算上の整数と等しい、最小の (負の無限大にもっとも近い) double値を返します。小数点以下の数値切り上げです。

```
ceil(1.34); // 2.0
```

# 浮動小数点の精度

これらの関数の処理を踏まえて、以下のコードで出力される数字は何なのか考えてみましょう。

```php 
$num = (0.1 + 0.7) * 10;
echo floor($num); // ??
```

上記のコードで出力されるのは、8...**ではなく、7です。**
普通に考えて`(0.1+0.7)=0.8*10=8`だと思うのですが、なぜこうなってしまうのか。その答えはPHP公式ドキュメントに記載されています。

PHP: 浮動小数点数 - Manual
http://jp2.php.net/manual/ja/language.types.float.php

> さらに、十進数では正確な小数で表せる有理数、たとえば 0.1 や 0.7 は、 二進数の浮動小数点数としては正確に表現できません。 これは、仮数部をいくら大きくしても同じです。 したがって、それを内部的な二進数表現に変換する際には、どうしても多少精度が落ちてしまいます。 その結果、不思議な結果を引き起こすことがあります。たとえば、 floor((0.1+0.7)*10) の結果はたいてい 7 となるでしょう。おそらくは 8 を想定していらっしゃるでしょうが、そのようにはなりません。 これは、(この計算結果の) 内部的な値が 7.9999999999999991118... のようになっているからです。

0.1と書いたとしても、正確にその精度を表現することが難しいためこのようなことが起きてしまうそうです。
この問題の対応策としては下記の記事が参考になります。

PHPの少数演算における切り上げ切捨て問題
http://www.psi-net.co.jp/blog/?p=277

# `round()`で出した値が`-0`になる件

この少数演算において、`round()`の結果が`-0`となっている不思議な箇所を見つけました。
具体的にどのような値を四捨五入しているのか調べてみたところ、下記のようになっていました。

```php
round(-0.1429, 0); // -0
```

この`round()`について調べたところ、負の値を四捨五入すると、負の値に近くなり、正の値を四捨五入すると、正の値に近くなることがわかりました。

どういうことかといいますと、例えば`-0.5`や`0.5`をround()すると、それぞれ`-1`、`1`という結果になります。

```php
//四捨五入
echo round(0.5); // => 1
echo round(-0.5); // => -1
```

この時、裏側でどういう処理が行われてるのかというと、絶対値の`0.5`を四捨五入して、その結果にマイナスをつけた`-0.5`を返しています。

つまり、下記のような`-0.1`というような少数を四捨五入しようとすると、`0.1`を四捨五入した結果`0`となり、`0`にマイナスをつけた`-0`が返される……ということでした。

```php
round(-0.1429, 0); // -0
```

マイナスの値が来たときにどのような挙動をするのかは、下記のページのグラフが参考になりました。

浮動小数点数の丸め処理を見比べてみる
http://d.hatena.ne.jp/hnw/20111029


参考記事
http://fdays.blogspot.jp/2010/05/php_3907.html
http://news.mynavi.jp/articles/2012/10/12/qa_php/002.html
大容量のJSONをサーバに送信するとエラーになる問題の対策

#概要

画像をbase64にしてJSONに変換してサーバに送信し、MySQLにぶち込む。
エラーが出る。

# 413 Request Entity Too Large

413 Request Entity Too Largeとか

```

2016/10/03 08:48:09 [warn] 8080#0: *1 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000001, client: 10.0.2.2, server: local.vm, request: "POST / HTTP/1.1", host: "local.vm:8080", referrer: "http://local.vm:8080/"
2016/10/03 08:48:10 [error] 8080#0: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 10.0.2.2, server: local.vm, request: "POST / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "local.vm:8080", referrer: "http://local.vm:8080/"

```

##対策

やばいのかもしれんが、nginxのconfにこれを書く。

```

# upload max size
client_max_body_size 20m;
client_body_buffer_size 20m;

```


# それでも500とか502が出る

アプリ側のエラーメッセージに以下のようなものが。

```

Error while sending QUERY packet.

```

MySQLに送るデータの容量がでかいとこういうエラーが出るそうな。

##対策

やばいのかもしれんが、my.cnfにこれを書く。

```

[mysqld]
max_allowed_packet=16MB

```

MySQLへのぶっこみに関しては、アプリで制御できるはずなので、こっちはあんまり怖くないかも。
Swimatインストールしてみた


# 経緯
Swiftの開発中、スペースが欲しいとか、いらないとか、
コードレビュー中発生すると、お互いモヤモヤしてしまいます。
そこで、個人的にSwift用コードフォーマッタ[Swimat](https://github.com/Jintin/Swimat)を導入することにしました。

## インストール
```
git clone https://github.com/Jintin/Swimat.git
```

## ビルド
SwimatプロジェクトをXcodeで開き、ビルドします。
そして、下のような画面が出るので、「Load Bundle」を選択します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/bad63b47-26eb-93a2-942b-8c8a1ffa1692.png" width="320px">



## 使う
`[Edit]-[Swimat]-[Format]`で使えます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/120969/b0f23aff-1a3c-cfda-7c44-d0fb7da104f0.png" width="320px">


`Command+Option+Shift+L`でもフォーマットできます。
僕が使っていたフォーマッターはフォーマットする箇所を選択しなければいけませんでしたが、
Swimatを使用すると、`Command+Option+Shift+L`だけでファイル内全てフォーマットすることができます。

## 補足1
Alcatrazからでもインストール可能でした。
`[Window]-[PackageManager]`より追加できます。

## 補足2
フォーマットするときはデフォルトでインデントはTabに設定されているので、
お好みのスペースを設定することでより使いやすくなります！

### 参考
* http://qiita.com/masuhara/items/95185be077d3fc29a00f
* http://qiita.com/tattn/items/238b2b813be16f830bd4
* https://github.com/Jintin/Swimat
* http://qiita.com/edo_m18/items/dd0bdc8e27b1c44607b6
iTunes Connectの売上とトレンドを自動取得する（Reporter編）

今までiTunes Connectの売り上げとトレンドを自動取得するのにAutoingestion Toolというのを使っていましたが、Appleの通知によると2016年11月一杯で使えなくなるようです。

代わりに**Reporter**というツールを使うようにとのことで、これを使用して売り上げとトレンドを自動取得します。

# Reporter

ドキュメントはここにあります。

Overview - Reporter and Autoingestion User Guide https://help.apple.com/itc/appsreporterguide/#/itcbe21ac7db

[Setup](https://help.apple.com/itc/appsreporterguide/#/itc0f2481229)のページにダウンロードリンクがあるので、クリックしてReport.zipを取得し、解凍してください。

# 1. 準備

## アプリケーション用パスワードの設定（2段階認証を設定している場合）

2段階認証を設定しているユーザは、アプリケーション用にパスワードを設定してください。

1. https://appleid.apple.com/ 
にログインします。
2. セキュリティの項目に「App用パスワード」があるので、パスワードを生成してください。ラベルを指定すれば、自動でパスワードが生成されます。

![スクリーンショット 2016-10-03 6.40.01.png](https://qiita-image-store.s3.amazonaws.com/0/38775/705cd61c-5a4d-632f-d320-25f003bed05e.png)

## Reporter.propertiesに設定

解凍したファイルに含まれるReporter.propertiesのUserIdとPasswordの欄を入力してください。2段階認証を設定しているユーザの場合は、前のステップで取得したパスワードを入力してください。

## 2. VendorIDの取得

売り上げとトレンドデータを取得するためには、VendorIDが必要です。次のコマンドで取得できます。

```bash:
$ java -jar Reporter.jar p=Reporter.properties Sales.getVendors
```

このような感じで返って来ます。

```xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Vendors>
    <Vendor>12345678</Vendor>
</Vendors>
```

## 3. 売り上げとトレンドの取得

最後にレポートを取得します。次のコマンドで取得できます。`12345678`の所には先ほど取得したVendorIDを入れてください。

```bash:
java -jar Reporter.jar p=Reporter.properties Sales.getReport 12345678, Sales, Summary, Daily, 20161001
```

細かいオプションについてはドキュメントを参照してください。

getReport - Reporter and Autoingestion User Guide https://help.apple.com/itc/appsreporterguide/#/itcbd9ed14ac

```xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Output>
    <Message>Successfully downloaded S_D_12345678_20161001.txt.gz</Message> 
</Output>
```

のようなレスポンスが返って来たら、同フォルダにS_D_12345678_20161001.txt.gzというファイルがダウンロードされているはずです。

#  データの見方

ダウンロードしたデータはtsv形式になっています。

内容についてはAutoingestion Toolのときと一緒のようですので、こちらのドキュメントを参照してください。
[iTunes Connect Sales and Trends Guide Apps v14\-1\.pages](chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/index.html)

表の見方についてハマった箇所について、以前[この記事](http://qiita.com/yosan/items/b820b7b59d33259a7e90)で書きましたが、こちらにも転載しておきます。

#### Product Type Identifierの見方
新規、アップデートなどの種類が記号で示されています。

* 上記ドキュメントのAppendix Eにタイプが記載されています。iOSなら1から始まるのが新規、7から始まるのがアップデートを意味しているようです。
* 記載のないパラメータについてはここで質問されていました（https://forums.developer.apple.com/thread/24203）。下記の通りです。

| Product Type Identifier | Type |
|:--:|:--|
| 3 | Redownload of iPhone-only, or iOS and tvOS app (excluding iPad-only) |
| F3 | Redownload of Mac app |
| 3T | Redownload of iPad-only app |
| 3F | Redownload of Universal app (excluding tvOS) |

* iTunes Connectの「タイムゾーン」で、デフォルトの「UTC」ではなく「現地標準時」を選択すると、このUnitと数値が一致する模様です。


# 雑感

* 以前はID/パスワードを設定ファイルに直打ちする必要があったが、現在はアプリケーション用パスワードを発行できるようになったので嬉しい。（実は以前から使えた？？）
* できることはAutoingestion Toolとできることはあまり変わっていない印象。
* ドキュメントが読みやすくなった。以前はオプションの組み合わせによってはエラーになることがあり、どうしてエラーなのかよくわからなかった。
技術英語 > The [drawbacks] are that the duplication would waste space for redundant information ... / with painful reluctance

@ Code Complete (No. 13939 / 36077)

> The <font color=red>drawbacks</font> are that the duplication would waste space for redundant information ...

http://ejje.weblio.jp/content/drawback
> 欠点、不利益、障害、故障、控除、(輸入品再輸出の時の)払い戻し税

if文の代わりにtableを使って以下のようなグループを扱うことに関しての文章。

- 0から17歳
- 66歳以上

何をduplicateするかというのは

> One straightforward way to make age work as a key into the rates table is to duplicate the under-18 rates for each of the ages 0 through 17 ...

意訳「年齢を率の表のキーとして使う率直な方法は、0歳から17歳のそれぞれに対して18歳未満の率をduplicateすること」

<hr>
関連して気になったのは

draw : 引っ張る
back: 後ろ

「後髪を引かれる」というのは何か。

http://eow.alc.co.jp/search?q=%E5%BE%8C%E3%82%8D%E9%AB%AA%E3%82%92%E5%BC%95%E3%81%8B%E3%82%8C%E3%82%8B
> 
後ろ髪を引かれる思いで
with painful reluctance

意訳「めっちゃやりたくない」

関連 http://qiita.com/7of9/items/d4297de2efb911dce678
> painstakingly slow
micro:bitとchibi:bit(テスト版)を比較

イギリスでBBCが100万個を子供たちに無料配布するBBC micro:bitとスイッチサイエンスさんの互換機chibi:bit(テスト版)が入手出来たので比較。
#外観

![] (http://asondemita.net/tmp/img/micro-chibi.jpg)

- 大きさは一緒
- 入出力ピン(0,1,2,3V,GND)のピッチも一緒
-  電源コネクターも一緒
- CPUも一緒
- 技適がアウトなのでbluetoothモジュールが違う
- スイッチの位置は一緒だが形状が異なる

#操作感

- A,Bボタンのストロークがスイッチサイエンスさんの方が深くカチッと押した感がある

#プログラミングテスト

- これからの子供たちは、キーボードとマウスを触る前に、親から中古のスマホをもらって、そこでプログラミングをするのが初体験になる時代が来ると思っています
- 加速度を検出するとLEDがスマイルマークが表示されるプログラミンをあえてiphoneからやってみました

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/58ehn_iywwY/0.jpg)](http://www.youtube.com/watch?v=58ehn_iywwY)

#あとがき

-遊べば遊ぶほど、このデバイスの面白さ＆凄さが判ってきました。という事で、しばらくQiitaに合間をみてmicro:bit(chibi:bit)のネタを投稿していきたいと思います。
-(2016/12/10追記)スイッチサイエンスさん、もうすぐ製品版を発売するそうです。
iTunesのメディア情報をパースする



## iTunesのメディア情報のファイルについて

iTunesの曲(トラック)やプレイリストのデータは、plistのファイルに書き込まれています。

ファイルのパスは、通常だと
/Users/[user_name]/Music/iTunes/iTunes Media 
に保存されています。

詳細は、以下のページの
iTunes メディアライブラリを管理およびバックアップする内の
「iTunes Media」フォルダを探すの項目を参照してください。

https://support.apple.com/ja-jp/HT201625

ファイル名は、Itunes Music Library.xmlです。
ファイルの内容は、以下のURLのようになっています
https://gist.githubusercontent.com/suzuki-mar/c3bdb7de7ebad9667a838c0cba10f927/raw/f20c491afe0e9ad9126f32033092ad1e56824ec4/iTunes%2520Music%2520Library.xml


## メディア情報のパース方法について
パースには、plistファイルをパースするGemのplistを使用すると大変簡単に行うことができます。

そのGemを使用することで、257231行のファイルでも2秒弱でパースすることができます。

GitHubのページ
https://github.com/bleything/plist

サンプルコードをGistにあげましたので、そちらも参照してください。
https://gist.github.com/suzuki-mar/c3bdb7de7ebad9667a838c0cba10f927
Swiftでのユニットテストで日本語を使う

[もっと日本語でSwiftプログラミングを - Qiita](http://qiita.com/codelynx/items/9af94d8f9f24cee339e2)を拝読して、先日ユニットテストで日本語を使うと良いというツイートを見かけたことを思い出しました。

実際に日本語を使ったテストを書いてみます。

まずテストしたい関数を用意します。以下のようなカリー化のための関数です。二つの引数を取る関数をカリー化します。

```swift
func curry<A, B, C>(_ f: @escaping (A, B) -> C) -> (A) -> (B) -> C {
    
    return { (a: A) -> (B) -> C in
        { (b: B) -> C in
            f(a, b)
        }
    }
    
}
```

以下のようなテストを書いてみました。クラス名が「カリー化関数のテスト」で、テスト項目が「test_加算演算子をカリー化できる」です。

```swift
class カリー化関数curryのテスト: XCTestCase {
    
    func test_加算演算子をカリー化できる() {
        XCTAssertEqual(3, curry(+)(1)(2))
    }
    
}
```

実際に書いてみると、テストの記述がわかりやすくなったと感じました。テストが複雑になるにしたがってさらに効果がます可能性があります。

次に少し複雑な条件を書いてみました。（ちょっと詳細すぎる気はしますが実験としてご容赦を。）

```swift
func test_加算演算子をカリー化してIntを部分的用した関数がInt->Intタイプになる()
```

とても分かりやすいですね。私の英語力では、カリー化した加算演算子はcurriedAddOperatorかなと思いましたが、Intを部分的用して以下が書けない。英語で書けたとしても読む時に一瞬では理解できない可能性があります。良さそう。

ただしこの記述では「->」があるため`Consecutive declarations on a line must be separated by ';'`というエラーでコンパイルできません。あたりまえですね。ですので以下のように書き換えてみました。

```swift
func test_加算演算子をカリー化してIntを部分的用した関数がInt→Intタイプの関数になる()
```

つまり「->」を「→」で代替しました。しかしこれでも`Expected declaration`というエラーでコンパイルできません。「⇒」「⇨」「☞」でも駄目。しかたないので

```swift
func test_加算演算子をカリー化してIntを部分的用した関数がInt_Intタイプの関数になる()
```

にしました。

利用できない文字はあるものの、日本語でテストを記述するのは日本人にはとても良いかもしれません。実装では日本語を利用しづらいことが多いですが、テストではもっと日本語を使っても良さそうだと思いました。
c#

# REPL
まずはインタラクティブシェルで基本操作をつかむといい

http://stackoverflow.com/questions/29867973/c-sharp-interactive-window-in-visual-studio-2015-ctp-6

# タイプチェック

ref:https://msdn.microsoft.com/ja-jp/library/58918ffs.aspx

System.Type 型として型を確認できる。

```
System.Type type = typeof(int);

```

# ADO.net
MSのコネクションプールの説明
https://msdn.microsoft.com/ja-jp/library/8xx3tyca(v=vs.110).aspx
接続文字列まとめ
http://www.dofactory.com/reference/connection-strings
自習書
https://msdn.microsoft.com/ja-jp/data/gg615417
code example
https://msdn.microsoft.com/en-us/library/dw70f090(v=vs.110).aspx


## DB接続設定
デフォルト　https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.110).aspx
poolの指定　http://www.codeproject.com/Articles/17768/ADO-NET-Connection-Pooling-at-a-Glance
デフォルトのコネクションプールサイズは100.
正確には
maxconnection: 100
minconnection : 1

コネクション文字列で、チューニング可能

```clj
String connectionString = "Data Source=sql01\\MSSQLSERVER02;" +
              "Initial Catalog=syncdb;" +
              "Min Pool Size=100;" + // 最小プールサイズを100に変更
              "User ID=test;" +
              "Password=password;";
```



### 認証モードの違い

http://stackoverflow.com/questions/1229691/difference-between-integrated-security-true-and-integrated-security-sspi

To connect to the database server is recommended to use Windows Authentication, commonly known as integrated security. To specify the Windows authentication, you can use any of the following two key-value pairs with the data provider. NET Framework for SQL Server:

 Integrated Security = true;
 Integrated Security = SSPI;
However, only the second works with the data provider .NET Framework OleDb. If you set Integrated Security = true for ConnectionString an exception is thrown.

To specify the Windows authentication in the data provider. NET Framework for ODBC, you should use the following key-value pair.

Trusted_Connection = yes;


## パフォーマンスカウンターで、利用されている接続、最大接続数の確認が可能

```shell
typeperf "\.NET Data Provider for SqlServer(*)\NumberOfPooledConnections"
typeperf "\.NET Data Provider for SqlServer(*)\NumberOfActiveConnectionPools"
```
rake test lots of warning

```bash
vagrant@precise64:~/data/store$ rake
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/sass-rails-5.0.6/lib/sass/rails/helpers.rb:6: warning: method redefined; discarding old asset_data_url
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/sprockets-3.7.0/lib/sprockets/sass_processor.rb:253: warning: previous definition of asset_data_url was here
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/therubyracer-0.12.2/lib/v8/init.so: warning: method redefined; discarding old IntegerValue
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/therubyracer-0.12.2/lib/v8/error.rb:43: warning: assigned but unused variable - trace_framework
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/therubyracer-0.12.2/lib/v8/error.rb:69: warning: `*' interpreted as argument prefix
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/therubyracer-0.12.2/lib/v8/error.rb:74: warning: `*' interpreted as argument prefix
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/therubyracer-0.12.2/lib/v8/error.rb:64: warning: assigned but unused variable - backtrace
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/therubyracer-0.12.2/lib/v8/access/invocation.rb:16: warning: `*' interpreted as argument prefix
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/therubyracer-0.12.2/lib/v8/access/invocation.rb:27: warning: `*' interpreted as argument prefix
/home/vagrant/.rvm/gems/ruby-2.2.3@test/gems/therubyracer-0.12.2/lib/v8/access/invocation.rb:31: warning: `*' interpreted as argument prefix
Run options: --seed 35022

# Running:

.

Finished in 0.297693s, 3.3592 runs/s, 3.3592 assertions/s.

1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
```

https://github.com/ruby/rake/blob/v10/lib/rake/testtask.rb#L88

https://github.com/ruby/rake/blob/v11/lib/rake/testtask.rb#L91

可以加上t.warning = false

类似这样

```rb
require "rake/testtask"

Rake::TestTask.new(:test => "db:test:prepare") do |t|
	t.libs << "test"
	t.pattern = "test/**/*_test.rb"
	t.warning = false
end

task :default => :test
```

https://github.com/ruby/rake/blob/v11/lib/rake/testtask.rb#L52

warning=true 也就是ruby -w

https://github.com/ruby/rake/blob/v11/lib/rake/testtask.rb#L137-L138

这里可以看到lib也就是加到load_path