OmniAICreator/Qiita-1.07M huggingface dataset:
PHP-Twig for SublimeText3

# PHP-Twigプラグイン
phpのテンプレートエンジン`Twig`用のシンタックス等。

`Package Control ⇒ install package`で`PHP-Twig`が表示されるので、てっきりPackage Controlで出来るかと思いきや出来なかったのでメモ。

公式githubに手順ありますが。。
https://github.com/Anomareh/PHP-Twig.tmbundle

# 環境

* mac OSX10.11

# インストール手順

## １． パッケージディレクトリに移動

```
$ cd /Users/[ユーザ名]/Library/Application Support/Sublime Text 3/Packages
```

## ２． gitでclone

```
$ git clone https://github.com/Anomareh/PHP-Twig.tmbundle.git
```

## ３． 設定

* 取得したPHP-Twig.tmbundleディレクトリの名前を
PHP-Twigに変更

* PHP-Twig/Syntaxes内の
HTML (Twig).tmLanguageファイルをPHP-Twig直下にコピー

上記２つを実施したら再起動

## ４． シンタックス設定

* `.twig`のファイルをSublime Textで表示し、`メニューの表示 > シンタックス`から「PHP-Twig」を選択する

---
java IPアドレス4オクテット目変更

## IPアドレス4オクテット目変更
```sample.java
    private static String changeFourOctetIpAddress(final String ipAddress, final String fourOctet) {
        //カンマ区切りで取得
        final String[] split = ipAddress.split("\\.");
        return String.format("%s.%s.%s.%s", split[0], split[1], split[2], fourOctet);
    }
```
Lenovo system interface foundationがインストールできない

Lenovo ThinkPadに[System Interface Foundation](http://support.lenovo.com/jp/ja/products/desktops-and-all-in-ones/ideacentre-b-series-all-in-ones/ideacentre-b320/downloads/ds105970)がインストールできない。
インストーラはインストールに成功したというがコントロールパネルのプログラムと機能には現れない。

インストールが完了したところで、インストーラを終了する前に%TEMP%\is-PH9SO.tmpを見ると、ServiceTotal_inst.cmdというファイルがあったので調べてみた。

```bat:%TEMP%\is-PH9SO.tmp\ServiceTotal_inst.cmdの一部
::Begin to install all components
::
set Key="HKLM\System\CurrentControlSet\Control\Nls\Language"
for /F "tokens=3" %%a in ('reg query %Key% ^| find /i "Default"') do set /a 

```
findというコマンドを実行しているが、このPCには[cygwin](https://cygwin.com/)を入れているので、`C:\WINDOWS\system32\find.exe`ではなく、cygwinのfindが実行され、結果的にこのスクリプトがうまく動いていない。

一時的に環境変数PATHからcygwinを消してインストーラを実行したら、正しくインストールできた。

いろいろな環境で実行されるプログラムでは、勝手な前提をせず、内部でPATH変数を設定するなりフルパスで書くなりする必要があるという例。

参考:
[シェルスクリプト :: シェルスクリプトのセキュリティーを高める](http://tm.root-n.com/programming:shell_script:etc:security)
[シェルスクリプトを書くときに気をつける9箇条](http://qiita.com/b4b4r07/items/9ea50f9ff94973c99ebe)
[シェルスクリプトを書く時に気をつけている事など](http://qiita.com/bsdhack/items/47c9cbb5fd22fcc9597a)
aws Linuxでhttps(443)が開かなかったけど開けれた

<h1>aws linuxでhttpsが開かなかったけど開れた話</h1>
やったこと
１．とりあえずawsのコンソールでセキュリティグループ確認 -> 開いてた
２．linux側でiptablesの設定が入ってなかった　->　なんだやってなかったっけｗ
　↓
３．やってみたけど開かない（・ω・）
　↓

```ruby:command
vi /etc/sysconfig/iptables
```

```ruby:/etc/sysconfig/iptables
# Generated by iptables-save v1.4.18 on Mon Jul  4 13:10:03 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [12:1904]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed
```

```ruby:command
/sbin/iptables-save > /etc/sysconfig/iptables
/etc/init.d/iptables restart
```

４．とりあえず分からないから放置
５．「あれ確かhttpd的になんかやるんじゃなかったっけ？」
６．ssl.confとかなんとかがいると判明。こんなの今まで入れてたっけ？
７．yumしてみたが失敗。

```ruby:command
yum -y install mod_ssl
```

```ruby:yum
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/x86_64                                                                                                                         | 2.1 kB     00:00
Resolving Dependencies
--> Running transaction check
---> Package mod_ssl.x86_64 1:2.2.29-1.4.amzn1 will be installed
--> Processing Dependency: httpd-mmn = 20051115 for package: 1:mod_ssl-2.2.29-1.4.amzn1.x86_64
--> Processing Dependency: httpd = 2.2.29-1.4.amzn1 for package: 1:mod_ssl-2.2.29-1.4.amzn1.x86_64
--> Running transaction check
---> Package httpd.x86_64 0:2.2.29-1.4.amzn1 will be installed
--> Processing Dependency: httpd-tools = 2.2.29-1.4.amzn1 for package: httpd-2.2.29-1.4.amzn1.x86_64
--> Processing Dependency: apr-util-ldap for package: httpd-2.2.29-1.4.amzn1.x86_64
--> Running transaction check
---> Package apr-util-ldap.x86_64 0:1.4.1-4.14.amzn1 will be installed
---> Package httpd-tools.x86_64 0:2.2.29-1.4.amzn1 will be installed
--> Processing Conflict: httpd24-tools-2.4.10-1.59.amzn1.x86_64 conflicts httpd-tools < 2.4.10
--> Processing Conflict: httpd24-2.4.10-1.59.amzn1.x86_64 conflicts httpd < 2.4.10
--> Processing Conflict: 1:mod24_ssl-2.4.10-1.59.amzn1.x86_64 conflicts mod_ssl < 1:2.4.10
--> Finished Dependency Resolution
Error: httpd24-tools conflicts with httpd-tools-2.2.29-1.4.amzn1.x86_64
Error: httpd24 conflicts with httpd-2.2.29-1.4.amzn1.x86_64
Error: mod24_ssl conflicts with 1:mod_ssl-2.2.29-1.4.amzn1.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
```

８．apache2.4系をいれてるのでmod_sslもmod24_sslというのを入れれば解決した

```ruby:command
yum -y install mod24_ssl
apachecontrol restart
```

以上
Functional? Swift

# 関数を定義する & 呼ぶ

```swift
func increment(n: Int) -> Int {
    return n + 1
}

let increment = { (n: Int) in n + 1 }
let increment = { (n) in n + 1 }
let increment = { n in n + 1 }
let increment = { $0 + 1 }
```

```swift
increment(4)  // 5
```

----

# 関数を返す関数

「カリー化」された関数を定義する構文があるのだが、廃止予定 :disappointed: 

```swift
func makeConst(n: Int)(_: Int) -> Int {
    return n
}

makeConst(4)(7)  // 4
```

今後は以下のようになる

```swift
func makeConst(n: Int) -> Int -> Int { 
    return { (_: Int) in n }
}
```

----

# オプショナル

```swift
let m: Int? = nil
let n: Int? = 0

if let m = m, n = n {
    print(m + n)
}
```

----

# 二重のオプショナル

```swift
let p: Int?? = nil          // 外側が nil
let q: Int?? = nil as Int?  // 内側が nil
let r: Int?? = 0
```

ちなみに Haskell だと

```hs
p = Nothing
q = Just (Nothing)
r = Just (Just 0)
```

----

# `Map`

```swift
let a: Int? = nil
let b: Int? = 2

a.map { n in n + 1 }  // nil
b.map { n in n + 1 }  // 3
```

```swift
let a = [0, 1, 2, 3, 4]
a.map { n in n * 2 + 1 }  // [1, 3, 5, 7, 9]
```

```swift
let s = Set([1, 2, 3])
s.map { x in x + 1 }  // [3, 4, 2]
```

集合も `map` すると配列になってしまう... :disappointed:

----

# `flatten`

二重のリストを一重にする

```swift
[[1, 2], [3, 4]].flatten()
// [1, 2, 3, 4]
```

二重オプショナルの `flatten` はない :disappointed:

----

# `flatMap`

`map` して `flatten` する

```swift
[10, 20, 30].flatMap { n in [n, n + 1] }
// [10, 11, 20, 21, 30, 31]
```

```swift
func divide10(n: Int) -> Int? {
    guard n != 0 else {
        return nil
    }
    return 10 / n
}

(nil as Int?).flatMap(divide10)  // nil
(0   as Int?).flatMap(divide10)  // nil
(5   as Int?).flatMap(divide10)  // 2
```

----

# モノイドをプロトコルとして定義する

```swift
protocol Monoid {
    init()
    func + (left: Self, right: Self) -> Self
}

extension Int: Monoid {
}
extension Array: Monoid {
}

func reduce<S: SequenceType
        where S.Generator.Element: Monoid>
        (sequence: S) -> S.Generator.Element {
    return sequence.reduce(
        S.Generator.Element(), combine: +)
}

reduce([] as [Int])    // 0
reduce([] as [[Int]])  // []
reduce([0, 1, 2, 3])   // 6
reduce([[0, 1, 2], [3, 4], [5, 6, 7, 8]])
// [0, 1, 2, 3, 4, 5, 6, 7, 8]
```

----

# Swift でできないこと :disappointed:

- 末尾呼び出し最適化
  - 最適化器が頑張ればできることもある
- ファンクターやモナドをプロトコルとして定義する
  - リストやオプショナルの `map` や `flatMap` はシグネチャーが「同じ」だけで、プロトコルとしては共通化されていない
分解、組み立て 可能な自作HMDの作り方（図面ファイルあり）

# はじめに
* 一度はダメかと断念したレーザーカッター版HMD。色々なノウハウを蓄え完成させることが出来ました！
    * 前回ホームページ
        * http://qiita.com/maruo2/items/baddfa9b57d451ea6ec9
* 下に実際に使用した図面ファイル（pdf版、svg版）があります。そのままレーザーカッターで利用できます。

# サンプル画像
* ![hmd-outline.JPG](https://qiita-image-store.s3.amazonaws.com/0/44076/791835f2-3da7-ad3a-6742-18fd19040cab.jpeg)
* ![hmd-parts-set.JPG](https://qiita-image-store.s3.amazonaws.com/0/44076/3a16cf9b-079c-d07f-1331-e6c37b5457a4.jpeg)
* ![hmd-oritatami.JPG](https://qiita-image-store.s3.amazonaws.com/0/44076/12537705-dfd6-d800-4532-024c0c75c020.jpeg)






# コンセプト
* 壊れない
* 持ち運び可能（分解できる）★接着剤未使用★
* ピント調整もできる

# 作り方
* 実際の作り方は前のHPを参考にしてください。基本は変わりません。

# ノウハウ（接着剤無しで結合できるパーツ作成）
* パーツの作成は中心から足し算
    * 前回HPでも書いていますが、中心に来るパーツを作ったらそれをコピペして別パーツを作るようにすると確実にサイズを合わせられます。
    * 慣れてくると一緒に作っても大丈夫になりますが、最初はそうした方が良いと思います
* 組み合わせ箇所は、レーザー切断によるレーザー太さ減少分も考慮する（0.1mm）
    * 利用している素材（MDFボード）は、厚さが2.5mmなのですが、図面の穴をそのまま2.5mmにすると切断線の中央にレーザーが入るので左右に0.1mmづつ広がります。実際に組み合わせると穴がすかすかになります。（私の使用したレーザーカッター）その為、組み合わせ箇所の穴は、2.5mm->2.3mmにしてぴったり収まるようにします。
* 切断面同士は十分なスペースをあける（5mm以上推奨）
    * 今回とは別件で指パーツを自作したのですが、ほぞ穴とパーツの隙間を2mmにしたら組み立て時にぽっきり折れましたｗ 密着結合刺せようとしているので仕方ないのですが、経験則的に4mm以上ないと簡単に折れました。ほぞの長さよりも切断面の隙間がどのくらい空くかが大切です。
 
# 図面ファイル
* PDF版
    * https://s3-ap-northeast-1.amazonaws.com/zzz-open-files/00.hmd-all-in-one.pdf
* svg版
    * https://s3-ap-northeast-1.amazonaws.com/zzz-open-files/00.hmd-all-in-one.svg


# さいごに
* 2016年のメーカーフェアに出展します（ http://makezine.jp/event/makers2016/gadgetkenkyuukai/ ）実物をみて確認したい際は是非おいでください。
天下り的にC言語の骨格を知りたい方へ

## 概要
手っ取り早くC言語の骨格を知りたい方向けです。
普段C言語を使いこなしている方にはどうでもいい記事です。

## 前置き
天下り的なので、本当に必要なことしか書きません。
詳しいことはテキストなりWebページなりを参照してください。

## #include
C言語で使うヘッダーファイルを読み込むおまじない
これがないと汗水垂れ流して作ったプログラムも水の泡です。

```c
#include <stdio.h>
```

includeは含めるという意味でプログラムに<>内で指定したヘッダーファイルという
関数が記述されたファイルを読み込めという命令をしています
とりあえず、これをまずはじめに書きます
というか書かないと動きません

## main関数
第2のおまじないとして、以下を追加します

```c
void main(void){
   //プログラム
}
```

または

```c
int main(void){
   //プログラム
   ...

   return 0;
}
```

のうちどちらかを使います。
はじめはint～のほうでいいと思います。

## まとめ
ここまでの流れをまとめると以下のようになります

```c
#include <stdio.h>

int main(void){
   //プログラム
   ...

   return 0;
}
```

となります。

あとはプログラムを//プログラム以下に組み込んで適当なコンパイラでコンパイルして実行ファイルを作れば完成です。
Jenkins でいくつかのジョブで共通の環境変数を使用したい

# 概要

Jenkins でいくつかのジョブで共通の環境変数を使用したい。
使えるプラグインがないか調べた

# 結論

* [EnvInject Plugin - Jenkins - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin)

このプラグインを使うとよい。

マスターにファイルを作成しておいて、それをジョブが引き継いでくれるように設定した。

# その他

プラグイン自体でできることがいくつもあるので、プラグインのページをみてもらったほうがよい。

自分できになったところだけ抜粋すると

* At node (master and slaves) level
* Inject variables as a build step
利用しているライブラリ内部の参照を表示する方法 (Android Studio)


メンバを定義している箇所で "Find Usage" すると、デフォルトでは自分のプロジェクトファイル内から該当メンバーを参照している箇所しか Find パネルに表示されないが、Find パネルの設定で変更するとライブラリ内部での参照も表示されるようになる

![ss_20160704_094643_01.png](https://qiita-image-store.s3.amazonaws.com/0/112602/1642c756-c505-61fb-b550-27efc969a17a.png)

調査中に "Find Usage" した際に表示されたヒントで気付いたが、以前は表示されなかったような

![ss_20160704_095804.png](https://qiita-image-store.s3.amazonaws.com/0/112602/316773df-d263-735d-cdda-bff9849c68ad.png)
PC起動時にTODOを表示させてTODO忘れを防ぐ

#はじめに
TODOを書いたけど、TODOを書いたこと自体を忘れて時間を無駄にしてしまう....そんな経験はありませんか？ (筆者はよくあります)
そんなときはPC起動時にTODOテキストが勝手に開くようにしてみましょう。 TODOを忘れてしまう...なんてことはなくなるはず。

ちなみにこの記事のOSはWindows10です

#TODOを画面に表示させる流れ
以下の流れで　PC起動時のTODO表示　を実現させてみます

TODO.txtを書く -> PC起動時にbatchを実行してTODO.txtを開く -> 画面にTODOが出る


#1. TODO.txtを作る
Documentフォルダ直下にTODO.txtを作成します.
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/7c702b82-1365-19e4-1f60-7829a52d44bf.png)

TODO.txtのファイルパスは C:\Users\ユーザー名\Documents\TODO.txt となります。 ( ユーザー名 のところは適宜読み替えてください。 )

#2. TODO.txtを開くbatch
```todo.batch
echo off
notepad "C:\Users\ユーザー名\Documents\TODO.txt"
```

先ほど作成したTODO.txtを開くbatchです。 (ユーザー名 のところは適宜読み替えてください。)

#2. PC起動時にTODOテキストが開くようにする
スタートアップフォルダ( C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\ )に上記のtodo.batchを入れておきます。

こうすることでPC起動時にtodo.batchが実行され、TODOテキストが表示されるようになります。

#3. TODOテキストを閉じたら数分後にまたTODOテキストが開くようにしてみる
PC起動時にTODOテキストを表示させたとしても、少し経つうちにTODOのことを忘れてしまうでしょう。
そんな場合は一定時間ごとにTODOが開くようにしてみましょう。PCに向かってさえいればTODO忘れは無くなるはずです。

todo.batchを以下のように書き換えます

```todo.batch
echo off
:LOOP
notepad "C:\Users\ユーザー名\Documents\TODO.txt"
timeout 180 /nobreak
GOTO LOOP
```
このように書き換えることで、TODOテキストを閉じた3分後にふたたびTODOテキストが表示されるようになります。

# 最後に
ここまでやれば、Windowsさんが自動的にTODOを画面にしつこく出してきてくれるのでTODOを忘れることはまずなくなるでしょう (完)
Msys2のVimを+luaにする

# Msys2のVimを+luaにする

Msys2にデフォルトで付いてくるVimは+luaでないため、neocompleteなどの+luaに依存するプラグインが使えません。+luaに依存するプラグインを使うためには、Vimを+luaでビルドする必要があります。ここでは、Msys2のVimを+luaでビルドする手順を説明します。

## msys開発者ツールをインストールする

msys用ソフトウェアのビルドに最低限必要なツール群をインストールします。

```
pacman -S base-devel msys2-devel
```

## luaをビルドする

Msys2ではmingw32とmingw64用のluaはパッケージとして入手できますが、msys用のluaは入手できません。Vimはmsysでビルドするため、msys用のluaを自力でビルドする必要があります。

luaをビルドするために必要なパッケージをインストールします。

```
pacman -S ncurses-devel libcrypt-devel gettext-devel
```

公式サイトからluaを落としてビルドします。

```
curl -O http://www.lua.org/ftp/lua-5.3.3.tar.gz
tar xzf lua-5.3.3.tar.gz
cd lua-5.3.3
make mingw
make install
```

lua53.dllだけインストールされないので手動でPATHが通っているディレクトリに移動させます。

## Vimをビルドする

vimのビルドに必要なパッケージをインストールします。

```
pacman -S python3 ruby
```

MSYS2のパッケージ群をcloneします。

```
git clone https://github.com/Alexpux/MSYS2-packages.git
```

vim/PKGBUILDを次のように修正します。

```diff
--- a/vim/PKGBUILD
+++ b/vim/PKGBUILD
@@ -75,13 +75,15 @@ build() {
    # make distclean

    ./configure \
+       --enable-fail-if-missing \
        --prefix=/usr \
        --build=${CHOST} \
        --with-features=huge \
        --with-tlib=ncursesw \
        --enable-cscope \
        --enable-multibyte \
-       --enable-luainterp=dynamic \
+       --enable-luainterp \
+       --with-lua-prefix=/usr/local \
        --enable-perlinterp=dynamic \
        --enable-pythoninterp=dynamic \
        --enable-python3interp=dynamic \
```

ビルドしてインストールします。

```
makepkg
pacman -U vim(version).pkg.tar.gz
```

## +luaになっているか確認

```
vim --version | grep lua
```

+luaが出てくればOKです。お疲れ様でした。
「vagrant up」した時に使われる「vagrant_private_key」は、いつの時点で作成されるか

> 使用する box ファイルにもよるのかもしれませんが、vagrant up や vagrant halt 等のコマンドは内部的に「公開鍵認証による VM への SSH 接続」を行っているようです。その際に使用している秘密鍵のありかは、VM が立ち上がっている状態で vagrant ssh-config すると確認できます。

`vagrant box add centos package.box`でboxを追加した時点で、「~/.vagrant.d/boxes/centos/0/virtualbox/vagrant_private_key」の秘密鍵が生成されているのを確認。  
逆に`vagrant box remove centos`で秘密鍵が削除される。    
つまり、boxの中に「vagrant_private_key」が内包されているか、vagrant自体のルールで決まった「vagrant_private_key」が生成されているのかもしれない。  
ちなみに、windowsでエクスポートしたboxをmacでインポートした際も、まったく同じ内容の「vagrant_private_key」が生成されているのを確認。  

## 参考
- [Vagrant で作った VM にやってはいけない2つのこと](http://qiita.com/megane42/items/1d8ae7444d8c1b10bbd7)
傾斜計 > MPU-6050 > XA_OFFSET_H > 0x06 / MPU-6500やMPU-9150とは異なる (0x77)

```txt:動作環境
ESP-WROOM-02
MPU-9250 https://strawberry-linux.com/catalog/items?code=12250
ライブラリ https://github.com/jrowberg/i2cdevlib/
```

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

ic2devというライブラリはMPU-6050をもとに開発され、その後MPU-9150対応したようだが、そのレジスタマップが間違っているようだ。

MPU-6050に関して検索した情報では以下を見つけた。

> The table below lists the registers in the MPU-6050 compatible mode register map <font color=red>that are different</font> from the
MPU-6500 mode.

そのテーブルではXA_OFFSET_Hのアドレスが 0x06 と記載されている。

一方で、MPU-6500(やMPU-9150など)ではXA_OFFSET_Hのアドレスは 0x77となっている。

ic2devではこのあたりの違いがきちんと考慮されていないようである。
さくらインターネットでPython bottleが動いたお話

ちょうど思い出せば去年くらいに、さくらのレンタルサーバーでPythonはCGIで動いたけどbottleが何をどうやっても動かなかったお話をしたような気がします。結論から言うと、動きました。


# どう問題を発見したか

さくらレンタルサーバーにbottleプロジェクト一式をアップロードします。コントローラー部分は.cgiに変更してパーミッションは755としておきます。bottle.pyはそのまま配置。

そのままアクセスすると

Status: 500 Internal Server Error Content-Type: text/plain Content-Length: 59 A server error occurred. Please contact the administrator.

と言われます。ここが一番躓いていた原因。ログを辿ってみると、

・File "/usr/local/lib/python2.7/wsgiref/handlers.py", line 86, in run
・File "/usr/local/lib/python2.7/wsgiref/handlers.py", line 128, in finish_response
・File "/usr/local/lib/python2.7/wsgiref/handlers.py", line 217, in write

と言った感じで明らかに動いてます。エラーの問題はどこなんだ・・・。と探していると見つかりました。


”UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 358: ordinal not in range(128)”

なんとまぁユニコードエラーです。ローカル環境でもHeroku環境でも出なかった箇所のユニコードエラー。

# どこに問題があったか

index.tpl の中にある日本語をサクサク消してみたところ無事動く事が判明。何なんだこのオチは・・・。

よくあるルーティング問題は.htaccessですんなり解決できたものの、このユニコードエラーはいかんともしがたい。これなんかいい解決方法が他にあるようなきがするので、ちょっと色々試します。

{{default_tag}}　とかで読み込んだ日本語もエラー。イラつきます。
マイクロサービス作成時におこなった負荷対策

マイクロサービスをつくった。
[一からマイクロサービスの開発フローを作った話
](http://qiita.com/tomoyamachi@github/items/0f049c87bfdef4aa6ad9)

そこで、実際にどのように開発していたかを共有する。

今回は
- [テスト](http://qiita.com/tomoyamachi@github/items/a1240ac1cb451a8425b1)
- ドキュメント作成
- エラー/負荷対策、負荷テスト (←今回はここ)


今回は負荷対策に関して。
開発するときにどのような点に気をつけて、
どのようにテストしたかを書く。

前提として、過去の開発で負荷が起こるのって以下のどれかだった。
どれも起こらないようにするために、どういう開発にしたか、というのを書く。

# 負荷対策
## 負荷が大きくなる原因
基本的にサーバ負荷はよほどループを挟んだり、メモリリークがなければ、なんとかなることが多い。
サーバのループ数に関しては、コードチェック時に確認しているので、大きな問題は起こらないだろうと予想。

これまでの負荷による障害は、多くの場合はDBが原因。
DBの中でも、以下のパターンが多い。

- 走査するデータの量が大きい
	- INDEXを貼られていないデータを検索している
	- パーティションが適切に設定されていない
- 実行するクエリが多い
	- キャッシュが効果的に利用されていない

## 負荷対策のため開発で確認するログ
### indexをはられていないクエリの確認
INDEXがはられていないカラムで検索された場合、
SLOW QUERYとして出力されるようにする。

```
[mysqld]
long_query_time=1
log-queries-not-using-indexes
log-slow-queries=/var/log/mysql/log-slow-queries.log
```

### 実行されたクエリの確認
同じクエリを複数回走らせていないかを確認する。
同じクエリを走らせている場合は、キャッシュを利用する。

```
log=/var/log/mysql/query.log
```

## その他TIPS
以下の場合はindexが利用できないので、それぞれ別の解決方法を用意する。

### offsetを利用したい
offsetを使うと、一度全件取得を行うので、直接利用しない。
offsetを使う場合、インクリメンタルなIDなどの場合は、IDを引数として、そのIDからn件取得という形にする。

```
<before>
SELECT * FROM account WHERE status = "valid" LIMIT 10 OFFSET 10;

<after>
SELECT * FROM account WHERE status = "valid" AND id > 10 LIMIT 10
```


### rand()は直接使用しない
randで、indexがはられていないカラムを取得しようとすると、indexが利用できない。
面倒だが、indexが効いているカラムを指定してprimary keyを取得し、そこから値を取得する。

```
<before>
SELECT * FROM account ORDER BY RAND() limit 0,20;

<after>
SELECT * FROM account,
(SELECT id FROM account ORDER BY RAND() LIMIT 0,20) AS random
WHERE account.id = random.id LIMIT 0,20;
```

## 負荷テスト
以前利用したものでJMeterがあったが、ユーザシナリオを書くのが面倒で、これはエンジニアの仕事なのか、と思った。

今回はせっかくCucumberを使ってAPIを呼び出せるようにして、全機能のテストもできるようになっていたので、それを利用して負荷テストを行った。
時間がなかったから、というのが最も大きい理由の一つ。

### 負荷テストの手順

わざわざ書くほどのものではないが、以下のとおり。

1. 本番サーバを用意。当たり前だが、本番とまったく同じ性能にしなければ意味がない。
2. 負荷テスト用サーバを複数台用意 ※ 本番サーバよりいいものを用意
2. 負荷テスト用の全サーバから、本番サーバに向けてcucumberを並列実行
3. 本番サーバの負荷状況などは、Amazon Cloud Watchなどを使ってみる。

## その他システム側でできそうなこと

今回、データ設計/コードを書く際に、以下のルールを設けた。
- foreign keyを利用しない
- JOIN句を利用しない

これはDBを垂直分割する際に、移行をスムーズにするため。


# エラー対策
エラー対策はテストコードをしっかり書くこと。

またエラーが発生し、それが致命的なエラーだった場合は、
指定のメールリストにメールが届くようにした。
メールリストには関係者全員が入っており、エンジニア以外にも送信する。

### メールの内容
調査時に、必要最低限となる情報を入れている。

```
エラーが発生しました。

Server : https://api.sampleerror.com

Endpoint : /v1/sample/endpoint

IP : xxx.xxx.xxx.xxx

Time: 2016-07-02 13:03:21

Msg : Call to a member function set() on a non-object

File: /home/ec2-user/projects/sample-api/src/Account.php

Line: 114
```

今後は、致命的ではないエラーに対しても、エラーの種類ごとに分類して、1日に1回まとめてメールを送付するようにしたい。
.editorconfig の書き方

# .editorconfig とは？

* 主にプログラミング言語向けの、テキストファイルのレイアウトを統一するための設定ファイルです
* テキストファイルを編集・保存する際にインデントや改行コードを設定したものに統一してくれます
* エディタ自身が対応しているものや、プラグインで対応しているものがあります

# 使い方

* 設定を適用したいフォルダに `.editorconfig` というファイル名でファイルを作成する
* 下記の設定をファイルに記述する

# 記述方法

* 対象とするファイルのパターンを記述し、その続きの行に設定を記述する

```properties
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_size = 4
indent_style = space
trim_trailing_whitespace = true
```

# ファイルパターン

| パターン                | 対象                     |
|:-----------------------|:-------------------------|
| `[*]`                  | 全てのファイル            |
| `[*.md]`               | 特定の拡張子のファイル     |
| `[*.{less,css,scala}]` | 複数の拡張子のファイル     |
| `[Makefile]`           | 特定のファイル名のファイル |

# 設定項目

| 項目                     | 内容                                               | 値                                           |
|:-------------------------|:--------------------------------------------------|:---------------------------------------------|
| charset                  | 文字コード                                         | latin1, utf-8, utf-8-bom, utf-16be, utf-16le |
| end_of_line              | 改行コード                                         | cr, lf, crlf                                 |
| insert_final_newline     | ファイル末尾に空行を挿入するか                       | true                                         |
| indent_size              | インデントのサイズ                                  | 2, 4, 8                                      |
| indent_style             | インデントはタブかスペースか                         | space, tab                                   |
| trim_trailing_whitespace | 行末尾のホワイトスペース（空白文字）を削除するかどうか | true, false                                  |

# プラグイン

| エディタ | プラグイン |
|:--------|:------------------------------------------------------|
| Atom    | [EditorConfig](https://atom.io/packages/editorconfig) |

# 参考資料

* [EditorConfig](http://editorconfig.org/)
* [EditorConfig Editor](http://mgaoshima.github.io/EditorConfigEditor/)
.gitignore の書き方

# .gitignore とは？

* Git の管理に含めないファイルを指定するためのファイル。

# 設定方法

* 無視設定を行いたいフォルダに `.gitignore` という名前でテキストファイルを作成する。
    * Windows 標準のメモ帳など一部のエディタでは、拡張子のみのファイルは生成できないので、どちらかの手順で作成する
        * 拡張子のみのファイルを作れるエディタを利用する
        * 既にあるファイルをコピーしてくる
    * MAC は標準の設定では、拡張子のみのファイルは `Finder` 上に表示されません。
* 無視したいファイルを下のパターンをもとに `.gitignore` 内で指定する。
* 設定の有効範囲は `.gitignore` ファイルの有るフォルダ内全部。
* リポジトリのルートにある必要はなく、リポジトリ内に複数あってもよい。

# パターン

## コメント

```
# "#" で始まる行はコメント
```

## 特定の拡張子を無視する

```
# exe ファイルは要らない
*.exe
```

## 特定のフォルダの中身全てを無視する

```
# bin フォルダは要らない
bin/
```

## 特定のパターンを無視しない

```
# nuget.exe は必用なファイル
!/.nuget/nuget.exe
```

## フォルダ内の特定拡張子を無視

```
# パッケージフォルダ内の .ts ファイルは要らない
package/**/*.ts
```

# フォルダそのものを残したい場合

* `Git` はファイルを管理しているだけなので、空のディレクトリのディレクトリ構造を保存できない。
* 残しておきたいフォルダの中に `.gitkeep` というファイル名で空のファイルを作成すしてディレクトリを残す方法がある。
    * このファイル名は何でもいい


# 参考資料

* [github / gitignore](https://github.com/github/gitignore)
Rack::Utils.secure_compare 防止timing attack

http://www.rubydoc.info/github/rack/rack/Rack/Utils.secure_compare
https://twitter.com/joelquen/status/559816980354854912

https://thisdata.com/blog/rack-from-the-ground-up/

https://thisdata.com/blog/timing-attacks-against-string-comparison/

https://github.com/chloerei/campo/blob/master/app/models/user.rb#L30

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/security_utils.rb#L11
iTerm2でタブをWindow外にドラッグした時に、タブを別のWindowに分離する機能をOFFにする

# 問題

iTerm2 を操作している時に、ポインターで意図せずタブをドラッグして別のWindowに分離されてしまって、操作しづらくなってしまうことがありました。

# 原因

デフォルトとではiTerm2は、タブを(Window外に?)ドラッグするとWindowとして分離する挙動になっているため上記問題が発生しています。

# 対策

iTerm2 のオプションを変更して、ドラッグした時にWindowが分離しないようにします。
Preference の Advanced オプションの以下の項目をNo に変更して、iTerm2 を再起動します。
<img width="1020" alt="tabtab.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/47394/0fce28ab-650b-849b-1f60-ab1a45120bcc.jpeg">

## Windowの分離は禁止せず、タブが元に戻ればいい場合

[コチラ](http://qiita.com/kakinoki/items/3eb9b7252280a34c4fc2) を参照してください。
JavaScript DOM操作再入門②


# 概要

[前回](http://qiita.com/gcfuji/items/8173977de75da1b0e5e9)の続き。

# 親・子・兄弟ノードの取得

取得した要素から見て「親」「子」「兄弟」ノードを取得する事も可能です。

|Method|Description|
|------|-----------|
|element.parentNode|elementの親ノードを取得する。|
|element.childNodes|elementの子ノードを取得する。|
|element.firstChild|elementの最初の子ノードを取得する。|
|element.lastChild|elementの最後の子ノードを取得する。|
|element.nextSibling|elementの次のノードを取得する。|
|element.previousSibling|elementの前のノードを取得する。|

上記の注意点として、「改行」や「空白」も取得してしまう点があります。
(あくまでも、ノードを取得するメソッドの為)

毎回それらを判別するのはすごく手間です。
その対策として、要素のみに限定して取得する、下記のメソッドも準備されています。

|Method|Description|
|------|-----------|
|element.children|elementの子要素を取得する。|
|element.firstElementChild|elementの最初の子要素を取得する。|
|element.lastElementChild|elementの最後の子要素を取得する。|
|element.nextElementSibling|elementの次の要素を取得する。|
|element.previousElementSibling|elementの前の要素を取得する。|
|element.childElementCount|elementの子要素の数を返す。|

# カスタム属性の取得

DOM取得では、カスタム属性の値も取得する事が可能です。

|Method|Description|
|------|-----------|
|element.dataset.[dataName]|data属性名がdataNameの値を取得する|

# DOMの作成

今までは、DOMノードの取得がメインでしたが、自分でDOMノードを作成する事も可能です。

|Method|Description|
|------|-----------|
|document.createElement|要素ノードを作成する。|
|document.createText|テキストノードを作成する。|
|document.createComment|コメントノードを作成する。|

# DOMの挿入

作成したDOMノードや、既存のDOMノードに対して、ノードを挿入する事ももちろん可能です。

|Method|Description|
|------|-----------|
|element.appendChild(newElement)|newElementをelementの末尾に挿入する。|
|element.insertBefore(newElement)|newElementをelementの先頭に挿入する。|

# DOMの属性の追加

DOMに属性を追加する事も容易に可能です。

|Property|Description|
|------|-----------|
|element.id = 'foo';|elementに#fooを追加する。|
|element.className = 'hoge'|elementに.hogeを追加する。|
|element.style.color = 'red'|elmentのcolorを赤にする。|

# DOMの書き換え

**innerHTML**を使えば「createElement」や「appendChild」を使わずともDOMの書き換えが可能です。

```js
let content = document.getElementById(`content`);

content.innerHTML = `
  <h1>Hello from innerHTML</h1>
`;

let getContent = content.innerHTML;

console.log(getContent);
```

innerHTMLは要素の中身の書き換えのみではなく、要素の中身の取得も可能です。

また、 **textContent** もinnerHTMLと同じ様な記述ができます。
innerHTMLとの違いは、タグを書いても文字列として判別されます。

# ノードの置換

ノードとノードを入れ替える事もできます。
**replaceChild**を利用します。

```js
document.replaceChild(newElement, oldElement);
```

# ノードの削除

ノード自体を削除する事も可能です。
**removeChild**を利用します。

```js
document.removeChild(element);
```

# 終わり

これである程度DOMの操作はできる様になったのではないでしょうか。
次回以降はもう少し細々した内容について調査したと思います。

続きは次回。
ApacheのHttpClientで日本語のファイル名の画像を送信する

この記事ではWindows 7にインストールしたjdk1.8.0_92を使って
Eclipse4.4.2で実行しています。

# 1. 概要

## 問題
日本語のファイル名の画像をポストで送信すると文字化けしてしまう。

## 解決方法
MultipartEntityBuilderクラスのsetCharsetメソッドを使用してエンコードを行う。

# 2. 詳細

## ソース
外部API連携のツール作成時に、「画像.png」のようなファイル名が
「??.png」として送信されてしまう問題が起こりました。

```UploadAsset.java
HttpPost post = new HttpPost(HOST_NAME + URL_UPLOAD_ASSET);

// ヘッダー情報を付与
List<Header> headers = new ArrayList<Header>();
headers.add(new BasicHeader("Content-Type", "multipart/form-data;charset=UTF-8"));
// アクセス権限
headers.add(new BasicHeader(AUTHORIZATION, "アクセストークン"));

// クライアント作成
HttpClient client = HttpClientBuilder.create()
		.setDefaultHeaders(headers).build();

// ボディに画像情報を付与
File file = new File("送信元の画像ファイルのパス");
String filePath = "送信先の配置したいパス";
String fileName = "画像.png";

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

// このfileNameが文字化けしてしまう
builder.addBinaryBody(FILE, file, ContentType.DEFAULT_BINARY, fileName);
builder.addTextBody(PATH, filePath, ContentType.TEXT_PLAIN);

HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);
```

## 修正箇所

```
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
```

この部分に真ん中の一行を追加しました。

```
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(StandardCharsets.UTF_8);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
```

# 3. まとめ
MultipartEntityBuilderクラスを使用するときは
文字化けしたらエンコード指定を疑ってください。

ヘッダーもボディも基本は書いておいたほうが無難です。
Nightmare(v2)でファイルをダウンロードする


## はじめに
Nightmare(v2)でファイルをダウンロードする方法をようやく一つ確立したので、投稿しておきます。
Nightmare(v2)って何？という方は[こちら](http://qiita.com/imunew/items/06023f689c1a31aeddf9)を参照ください。

## 動作環境
- node v4.4.5
- npm  v2.15.5
- 主要なパッケージは下記のとおり

    ```json
    {
      "devDependencies": {
        "mocha": "^2.5.3",
        "mocha-generators": "^1.2.0",
        "nightmare": "^2.5.2"
      }
    }
    ```

## 試してみた方法

### ☓ ダウンロードリンクを`click()`する
READMEを詳しくみても、downloadに関する記載は一切ありません。
それっぽいPRは見つかりましたが、長い議論の末、そっとcloseされています。
[handle will-download by rosshinkley · Pull Request #382 · segmentio/nightmare](https://github.com/segmentio/nightmare/pull/382)

### ☓ `nightmare-inline-download`を使ってみる
前述のPRの[rosshinkley](https://github.com/rosshinkley)さんが、[nightmare-inline-download](https://github.com/rosshinkley/nightmare-inline-download)というパッケージを出していたので、使ってみましたが、結果、ダウンロードできませんでした。

### ○ `evaluate`して、ブラウザ側で`XMLHttpRequest`して`response`を返却、バイト配列に変換して保存
最終的に、辿り着いた方法が、これです。
ブラウザ側でダウンロードリンクを`XMLHttpRequest`して`response`をテストケース側に返して、バイト配列に変換するなどして保存します。
以下、サンプルコードです。

```node
require('mocha-generators').install();

var Nightmare = require('nightmare');
var fs = require('fs');

describe('example', function() {

    var nightmare;

    beforeEach (function*() {

        nightmare = Nightmare();
    });

    it('downloads example', function*() {

        var text = yield nightmare
            .goto('http://www.nightmarejs.org/')
            .evaluate(function (){
                var imageUrl = 'http://www.nightmarejs.org/nightmarejs.org/images/ground.jpg';
                var xhr = new XMLHttpRequest();
                xhr.open("GET", imageUrl, false);
                xhr.overrideMimeType("text/plain; charset=x-user-defined");
                xhr.send();
                return xhr.responseText;
            })
            .end()
        ;
        
        var buffer = new ArrayBuffer(text.length);
        var bytes = new Uint8Array(buffer);
        for (var i = 0; i < text.length; i++) {
            bytes[i] = text.charCodeAt(i);
        }

        fs.writeFileSync('/path/to/save/image.jpg', new Buffer(bytes), 'binary');
    });

});
```

上記のコードで、ダウンロードした画像がこちらです。
![example.jpg](https://qiita-image-store.s3.amazonaws.com/0/26422/156ba279-2a28-8b69-cee8-0e6879b6340a.jpeg "example.jpg")


### 参考URL
- [javascript - Download a file using Nightmare - Stack Overflow](http://stackoverflow.com/questions/27109563/download-a-file-using-nightmare)
- https://gist.github.com/artjomb/a84e915f05b03cf19bdc

## おわりに
何でこんな苦労しないとダウンロード一つできないんだろうという疲労感ありますが、同じことで悩んでいる人のお役に立てれば幸いです。
Awaitibilityを使ってeventuallyなテストをJavaで書く

JavaのテストをJUnitなどで書いている時に、ある非同期処理を待ってからassertしたいことなどが多々あります。そんなときは `CountDownLatch` を使ってある非同期処理の終了までawiatするというコードを書くことになるでしょう。

[Awaitibility](https://github.com/awaitility/awaitility)は`CountDownLatch`をwrapし、そういった処理をテスト中に簡単にかけるようにするライブラリです。

```java

void test() {
  obj.doAsync();
  await().atMost(10, SECONDS).until( () -> obj.doneAsync() );
  assertTrue(obj.isDone());
}

```

Java8の文法を用いていますがこのように書けます。
untilには`Callable<Boolean>`を渡せばいいので、もちろんJava7などでも使用が可能です。


untilに渡すconditionのpoll間隔はデフォルトだと100msですが、それをコントロールすることもできます。

```java

void test() {
  obj.doAsync();
  await()
    .atMost(10, SECONDS)
    .pollDelay(500, MILLISECONDS)
    .pollInterval(200, MILLISECONDS)
    .until( () -> obj.doneAsync() );
  assertTrue(obj.isDone());
}

```

## 使用方法

以下に詳細な情報が載っています。

[https://github.com/awaitility/awaitility/wiki/Usage](https://github.com/awaitility/awaitility/wiki/Usage)
太さの違うDouble Border

# デモ

https://jsfiddle.net/gatespace/onp0bjc5/

# ソース

CSS

```css:left-double-border.css
.left-double-border {
	border-left: solid 6px red;
	padding-left: 2px;
}
.left-double-border:before {
	content: " ";
	border-left: solid 2px red;
	margin-right: 10px;
	padding: 4px 0;
}
```

Sass（Scss）

```scss:left-double-border.scss
.left-double-border {
	border-left: solid 6px red;
	padding-left: 2px;
	&:before {
		content: " ";
		border-left: solid 2px red;
		margin-right: 10px;
		padding: 4px 0;
	}
}

```

# 注意点

`:before` を使うので、左のみ。
`:after` も使えば右にも実装できるかも。
JavaScript DOM操作再入門①



# 概要

Angular2やReactをメインで使っていると、ちょっとした事でjQueryに頼るのが疎ましくなってきます。
特にDOM操作は基本jQueryで行ってきたのですが、生のJavaScriptでDOM操作をしたいという思いがあり、再度JavaScriptのDOM操作を調査したいと思います。


# DOMとは

そもそもDOMとは何でしょうか。
DOMとは **Document Object Model** の略でHTMLやXMLを取り扱うための「API」です。
DOMを利用する事で、HTMLの探索やスタイルの変更・イベントの設定・HTML要素の取得の他に、振る舞いを変えたり、ユーザー操作時の処理を設定することができます。

## DOMツリー

DOMを押さえる上で重要なのが、「DOMツリー」です。
各HTML要素は入れ子でマークアップされていきます。
その入れ子をツリーで表現しているものになります。

DOMのルートは、 **[Document]** となっており、`document`以下に`html`が存在し、`html`以下に`head`, `body`があります。
DOMツリーをしっかりイメージ出来ていれば、DOM操作の習得はどんどん楽になると思います。

## ノード

英語で「Node」, 日本語で「節」という意味です。
ざっくりいうと、タグの事です。DOM上では「ノード」と表現します。

### ノードの種類

|ノード|ノードタイプの定数|ノードタイプの値|インタフェース|
|:---:|:-------------:|:--------:|:----------:|
|要素ノード|ELEMENT_NODE|1|Element|
|属性ノード|ATTRIBUTE_NODE|2|Attr|
|テキストノード|TEXT_NODE|3|Text|
|コメントノード|COMMENT_NODE|8|Comment|
|文書ノード|DOCUMENT_NODE|9|Document|

DOMでは、HTMLのタグやテキストが全て上記のどれかに当てはまる事になります。
DOMの操作とは、DOMツリーのノードにアクセスして、DOMを書き換えたり、追加したりするという事です。

# Documentオブジェクト

よく生のJavaScriptのDOM操作で登場する、

```js
document.getElementById('foo');
```

の、`document`はDocumentオブジェクトといい、HTMLドキュメント全体を表すオブジェクトです。
これがDOMの最上位のノードとなります。
DOM操作を行う上で、非常にウェイトの高いオブジェクトになります。

Documentオブジェクトは、windowオブジェクトのプロパティですが、windowは省略できる為、この様な記述になります。
また、直接bodyにアクセスしたい場合は、

```js
document.body;
```

で、アクセスする事も可能です。

## 要素の取得

Documentオブジェクトを使えばDOMツリーのノードにがんがんアクセスする事が可能です。

|Method|Description|
|------|-----------|
|`document.getElementById('foo')`|id="foo"のノードを取得する。|
|`document.getElementsByTagName('p')`|HTML内のpElementのノードを取得する。|
|`document.getElementsByClassName('hoge')`|class="hoge"のノードを取得する。|
|`document.querySelector('#foo')`|CSSセレクタを指定してノードを取得する。(単一)|
|`document.querySelectorAll('.foo')`|CSSセレクトで指定してノードを取得する。(複数)|


複数ノードが存在する場合は、返り値は配列になります。
SelectorAPIは柔軟な指定ができるものの、動作パフォーマンスは少し下がります。
後、重要な点としては、下記のライブオブジェクトには対応していないという事です。
これを知らなければ思わぬミスに繋がってしまいます。


## ライブオブジェクト

複数のノードを取得した場合(NodeList)、プログラム上で変数に格納されたとしても、プログラムの途中でNodeListの中身が増えると、取得するNodeListも変更されます。
NodeListは動的な参照を持っており、 常にDOMツリーを参照しているので、要素の数が増えたり減ったりしても、再取得する必要はありません。

# 終わり

DOMの操作に関しての基本を解説してきました。
次回は、DOMの取得の続きと、DOMの作成に関して解説します。

続きは[次回](https://qiita.com/tfrcm/items/1d7c3f443e235d70c73a)。
Re:dashからSQL Server Expressに接続する

先日さくらのクラウド上にインストールを行ったRe:dashから自身の使っているSQL Server Expressに接続して見よました。。

[さくらのクラウドにRe:dashをインストールしてみた](http://qiita.com/Dalice/items/b790a522b6626cb0385c)

![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/4c13d3a4-b649-d657-b733-86ffb3476c14.png)

Adminでログインして右肩のデータベースっぽいアイコンをクリックして追加画面を呼び出します。

![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/8c4f4724-eb50-9f00-4f58-657c09c3c391.png)

Typeで”Microsoft SQL Server”を選択してあとは必要項目を入力するだけ。
この辺の設定はSSMSで接続する時と同様の設定項目ですね。

Re:dashは残念ながらその場で疎通確認ができません。
都度都度保存して、Query画面で確認する必要があります。

![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/7e6bd9ee-355a-28a9-f555-c582da2e256d.png)

Query画面のサイドバーの部分にテーブル一覧が表示されていればほぼ間違いないです。
あとは必要なSQLを記述するだけで可視化ができるようになります。


SQL Serverに接続するためにいろいろとドライバ入れたりしなくてもすぐに使えるという圧倒的な手軽さは本当に素晴らしいです :smile:
【すぐわかる】 Docker & Docker compose入門


# Dockerとは
コンテナ型のサーバ仮想化技術を用いた、デプロイに対する課題を解決するために作られた技術。

## サーバ仮想化
サーバ仮想化とは、『あるマシン』上で仮想的に『別のマシン』を動かすことで、仮想化する側の『あるマシン』を **ホストマシン**と呼び、仮想化される『別のマシン』を **ゲストマシン**と呼ぶ。
例えば、Amazon EC2のような仮想ソフトウェアの[Xen](http://www.xenproject.org/)を使って物理サーバ上で仮想的に複数台のサーバを動かすなどという形で使われていたりする。

サーバ仮想化技術には主に次の2つがある。

### VM型仮想化
上記で述べたように、Amazon EC2などのクラウドサービスで見られる仮想化方式。基本的には、仮想化ハイパーバイザの機能によって。ハードウェアやファームウェアレベルまで丸ごと仮想化することで、あるOSのマシン上で独立したOSのマシンを動かせる。

### コンテナ型仮想化
コンテナ型仮想化は、Dockerで用いられている仮想化方式。
コンテナ型仮想化の場合、マシン上で稼働するOSはひとつだけ。そのOSの内部のユーザー空間を分離して、それぞれのプロセス、ファイル、ネットワーク、CPU/メモリ/デバイスなどのリソースを制御し、閉じ込めたユーザ空間が「コンテナ」と呼ぶ。なので、ゲストOSはホストマシンと同じである必要がある。

Dockerは、このコンテナ型仮想化技術であるLinuxコンテナ（LXC）のローレベルのカーネル機能を活用するためのツールで、コンテナ内部で動かすアプリケーションの実行環境の管理が簡単になる。

## Dockerのメリット
- アプリケーション実行環境に必要十分なものをパッケージングし、再現性を保ったままデプロイできる。
- VMと比較してパフォーマンスの劣化が少なく、仮想マシンの起動が早い
- それぞれのアプリケーションが独立した環境で実行される
- パッケージング、デプロイ、起動のどれもが簡単に行える
結果として、次のワークフローが可能になる
- 開発者がアプリケーションをイメージに保存し、
- そのイメージをシステム管理者に共有し、
- システム管理者が本番環境までイメージを運び、
- 開発環境で動いていたアプリケーションをそのまま本番環境で動かす

## Dockerコンテナ
Dockerでは仮想マシンのことを、Dockerコンテナ、またはコンテナと呼ぶ。各コンテナは独立しており、作成、起動、停止、削除が行える。

## Dockerイメージ
仮想マシンにはもとになるイメージが必要になる。DockerではDockerイメージ、またはイメージと呼ぶ。
アプリケーションをイメージとして保存することをパッケージングすると表現していたが、Dockerではイメージをビルドすると表現する。1つのイメージからいくつでもコンテナを作成できる。

Dockerイメージを構築するには、主に3つの方法がある。
- Docker Hubから取得
- コンテナをコミットする
- Dockerfileで構築する

これらの構築方法の一番の違いは、イメージの作成を手動で行うか、自動で行うか。
何をインストールするかやどのようなコマンドを実行するかなど、すべての処理が明示的である、Dockerfileをのみを使って運用するのがベストプラクティス。

## ベストプラクティス
- Dockerfileを使う
- コンテナレイヤのサイズを抑え、レイヤ数を最小限に
- .dockerignoreを使う
- コンテナはいつでも捨てれるようにする
- シンプルに保つ
- 1コンテナ1プロセス

Dockerfileを書く際の基本方針は小さいイメージを作ること。そして、レイヤ数を少なくするには `&&` と `\`を使って関連するコマンドを連結することでレイヤ数を減らすことができる。連結しすぎると、キャッシュを使った効率的なビルドという恩恵が受けられなくので注意。.dockerignoreや不要なファイルを削除することによって、イメージをより小さくすることができる。
イメージが小さければ、ビルドや、pushやpull、コンテナの起動にかかる時間が短くなる。
コンテナがいつでも捨てられる状態というのは、
- プロセスの起動・終了が秒単位で実行できる
- コンテナの設定とアプリケーションコードが分離している
- ステートレス(データは外部に保存している)
- コンテナ外にログを出力している
上記の条件を満たしていること。
1コンテナ1プロセスとは、アプリサーバコンテナとwebサーバコンテナやFluentdコンテナのように、それぞれ別々に立てたのちに連携させること。1コンテナ1プロセスにしておくことで、あるサービスだけリスタート・アップデート・垂直/水平にスケールさせたい場合や別のミドルウェアに入れ替えたい場合などに対応しやすくなる。

複数のコンテナにまたがるサービスを管理するにはどうすればいいのか？

# Docker Composeとは
複数コンテナ管理のためのオーケストレーションツール。
Docker Composeを使うと、複数コンテナから成るシステムを一括管理できる。(YAMLファイル)

## Docker Composeでできること
- 複数のコンテナをコードで管理
- コンテナの同時起動・停止
- コンテナのスケール
- ネットワーク機能に対応

以下のようにYMLファイルで書くことができる

```yaml:docker-compose.yml

mysql:
  image: mysql:5.6.23
  environment:
  MYSQL_ROOT_PASSWORD: 'pass'
  ports:
    - '3306:3306'

nginx:
  build: nginx
  ports:
    - '8080:80'
  links:
    - app

app:
  build: .
  ports:
    - "80:80"
    - '3000:3000'
  links:
    - mysql
```

こういった感じで複数コンテナを一括で管理できるかつ、だいたい`docker run` のオプションとも対応しているので楽に管理できる。

複数サーバの管理はDocker Swarmというのがあるけど、それはまたこんど。
SaltStackを始めて困ったことまとめ

# チュートリアルあるの?

[Salt in 60 seconds](http://www.saltstat.es/posts/quickstart.html)
[公式チュートリアル](https://docs.saltstack.com/en/latest/topics/tutorials/index.html)
[Manage the cloud with Terraform, Salt, Consul and DigitalOcean](https://ahus1.github.io/saltconsul-examples/tutorial.html#introduction)
[Salt Notes](http://pyholodeck.readthedocs.org/en/latest/index.html#salt-notes)

# Ansible、Puppet、Chefなどとどう違うの

[Amon - SaltStack - Review and how it fares against Ansible and Puppet?](https://www.amon.cx/blog/saltstack-review/)

# python 2なの？3なの?

2です。

そのうち3になるかも。

参考: [Python 2.7.x と 3.x の決定的な違いを例とともに | プログラミング | POSTD](http://postd.cc/the-key-differences-between-python-2-7-x-and-python-3-x-with-examples/)

# pythonって*env的なのあるの？

pyenvがある。

参考: http://qiita.com/nyango/items/f227c259485fbd3c7c9c

# saltモジュールのpythonソースにjavadocみたいな型指定のコメントかかれてるけど・・・

PyCharmのtype hintingらしい?

参考: http://qiita.com/methane/items/e95c578c3d8fc5f1f62e

# test-kitchen使えないの？

kitchen-saltで使える
[Test Kitchen style testing for Salt](https://thepracticalsysadmin.com/test-kitchen-style-testing-for-salt/)

saltのテストはPythonつながりでtestinfraでやる、って人もいるかもしれません。
そういう人はbusser-testinfraを使いましょう

https://github.com/jcftang-r7/busser-testinfra
https://github.com/test-kitchen/busser/issues/28

# pythonわからん

以下の様なパターンさえ覚えておけば、あとはpythonで困ることは無い気がする。(salt自体の改造とかしなければ)

```python
# Simulating a 'local static' variable in python
# http://stackoverflow.com/a/460811
class Bar(object):
    def __init__(self):
        self._cache = {}
    def __call__(self, a):
        if a not in self._cache:
            self._cache[a] = self.evaluate(a)
        return self._cache[a]
    def evaluate(self, a):
        return 'foo'

_bar = Bar()

def bar():
    return _bar(1)

class propertycache(object):
    def __init__(self, func):
        self.func = func
        self.name = func.__name__
    def __get__(self, obj, type=None):
        result = self.func(obj)
        self.cachevalue(obj, result)
        return result
    def cachevalue(self, obj, value):
        setattr(obj, self.name, value)

# $ salt-run myrunner.baz
# 'myrunner.baz' is not available.
@propertycache
def baz():
    return 'baz'
```

# SSH経由で実行できる?

salt-ssh

https://blog.logentries.com/2015/04/salt-ssh-for-remote-execution-of-states-and-modules/
Elasticsearch 2.3.3 + Kibana 4.5.1をMacに一発セットアップ

GYAOの窓際エンジニア　玉利です。

突然ですが、またベトナム人エンジニアがやめてしまいました。

日本の同僚SE N氏からも「仕事あげたら１日かかるかと思ったら２時間で仕上げてきて、自分のできなささに凹みました」と言われるほど、腕のたつ男だったのですが、もっと大きなチャンスをあげようと社内交渉しているうちに、あっさり移籍先を見つけてきてしまいました。

日本からベトナムへリモートで渡せる仕事は環境の制約もあるので、やっぱり、ベトナム人のデキるエンジニアを見つけたら日本に連れて来て日本人エンジニアと同じ難易度の仕事を与えないとダメみたいです。移籍先の会社はラッキーでしたね。

この際だから、日本で引っこ抜き返してやろうとおもってます。目下開発しなければいけないのは、ベトナム人の腕利きを辞めさせない仕組み、です。


夏にホーチミン行くのは、日本より涼しくてお勧めです。行くには行きたいんですけどね、他のメンバーが担当業務のバックアップや家庭の事情などあるので、連れて行くのも難しいんです。

とはいえ、飯がウマイというのは良いです。飯がまずい場所に行くのは本当に辛い。

![スクリーンショット_2016_07_04_9_05.png](https://qiita-image-store.s3.amazonaws.com/0/113049/ba59f98a-2aab-e3e1-4eeb-62b8cc82d1f6.png)



さて、彼がやめる前に、次の職場でも「こいつはいろいろ芸がある」と役に立つよう、できるだけ未経験の仕事をあげなければいけません。ちょうど開発会議で「いま業務で何が起きているのかひと目でわかるダッシュボードがほしい」と言われました。それならばElasticsearch + Kibanaで作ってあげるのが手軽です。

私「Elasticsearch使ったことある？」
Kくん「Solrなら前職で」

というわけで、開発環境のセットアップから開始です。インストールの記事はいっぱいあるのですが、いまbrewで入るのは2.0系で、バージョン指定して2.2が入ります。ところが、いまはメインが2.3なんですよね。そしてもうすぐ5にジャンプしそうな勢いです。

brewでセットアップを試したのですが、brew側のformulaの更新を待っているのも嫌だったので、手動セットアップしてみました。動きが早過ぎるのも困ります。

ベトナムに送るためのセットアップ指示書ですが、Qiitaにころがしておきます。

コピペで動くと思います。動かなかったらごめんなさい。(ベトナム人が刺さったら、修正します）

# Install elastic search

Please copy script and paste to your console.

```
cd /tmp && \
curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-2.3.3.zip && \
cd /usr/local/opt/&& unzip /tmp/elasticsearch-2.3.3.zip && \
cd elasticsearch-2.3.3/ && \ 
bin/plugin install analysis-kuromoji && \
bin/plugin install mobz/elasticsearch-head

bin/plugin install license && \
bin/plugin install marvel-agent

# When you have got quoted, please answer with yes
Continue with installation? [y/N]y

// to start elasticsearch
% bin/elasticsearch
```

open URL and check 
http://localhost:9200
http://localhost:9200/_plugin/head/


# Kibana install

# setup node.js for Kibana

open URL and install node.js
https://nodejs.org/en/download/

```
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash &&
source ~/.bashrc
```

# Install Kibana 4.5.1
```
cd /tmp; curl -L -O https://download.elastic.co/kibana/kibana/kibana-4.5.1-darwin-x64.tar.gz && \
cat kibana-4.5.1-darwin-x64.tar.gz|(cd /usr/local/opt; tar zxvf -) && cd /usr/local/opt && \
cd kibana-4.5.1-darwin-x64/ && \
./bin/kibana plugin -i elasticsearch/marvel/latest && \
./bin/kibana

```

Please open URL and check:

http://localhost:5601/
http://localhost:5601/app/marve
Office 2013 > 「新しいOfficeをインストールしましょう」を非表示にする方法  > 簡易修正ツール

```txt:動作確認
Office 2013 on Windows 8.1 pro (64bit)
```

Excelを開くと以下のようなメッセージが表示されるようになった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/26c72ce4-be3f-a91d-4449-7acecba8d34d.png)

これを非表示にするにはどうすればいいか。

レジストリ書換えツールの紹介が以下にあった。
[Office 2016 のアップグレード後に Office 2013 を再インストールする](https://support.office.com/ja-jp/article/Office-2016-%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E5%BE%8C%E3%81%AB-Office-2013-%E3%82%92%E5%86%8D%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B-a6ca92f4-cbb4-4609-9fdb-f8d3dd6812f3?ui=ja-JP&rs=ja-JP&ad=JP)

> 通知を解除すると、次回 Office 2013 アプリケーションを起動するまで表示されなくなります。レジストリ キーを使用し、通知を無効にすることもできます。「簡易修正ツールのダウンロード」を行い、レジストリ キーを設定することができます。

簡易修正ツールのダウンロードは上記のリンクから可能。

レジストリを書替えるしかないのが残念。これを多数のPCにも適用していいかは悩みどころ。

間違って2016にアップグレードしてしまう人もいそうなので、非表示にしておくのがいいだろか。
各機械学習ライブラリの比較をまとめる

この部分は需要が高いと思ったので、以下の自分の投稿から抜粋。

TensorFlowのチュートリアルを通して、人工知能の原理について学習する
http://qiita.com/jintaka1989/items/3b70b5c5541620536fa2



以下のことについて知りたい人向けの記事。

・各機械学習ライブラリの比較



ちなみに私はTensorFlowしか触っていないので、
この記事はブログなどを探索して、それをまとめたものである。
追記：実際にライブラリをいろいろ使ってみた人の感想はこちら
https://speakerdeck.com/contaconta/deep-learningraiburari-se-tukatutemitagan-xiang-matome



■他の機械学習ライブラリとの比較
 　他の機械学習ライブラリと比較するとなると、そのための開発環境を整えなければならない。よって比較実験は今後の課題とし、今回は文献やインターネットの調査から考察する。以下の表に主な機械学習ライブラリを示す。

追記：caffeはPython, MATLABでも書けます

 表1 機械学習ライブラリ一覧
![表1.jpg](https://qiita-image-store.s3.amazonaws.com/0/131965/0a6a6e0a-5f26-b194-5517-265ed07a0396.jpeg)



※公式サイトリンク一覧
TensorFlow:https://www.tensorflow.org/

 Chainer:http://chainer.org/
 Caffe:http://caffe.berkeleyvision.org/
 Theano:http://deeplearning.net/software/theano/index.html
 Torch:http://torch.ch/
 scikit-learn:http://scikit-learn.org/stable/
 PyML:http://pyml.sourceforge.net/
 Pylearn2:http://deeplearning.net/software/pylearn2/
 PyBrain:http://pybrain.org/pages/home

・TensorFlow
　以下の１．結論、２．背景、７．まとめ、において言及している。
http://qiita.com/jintaka1989/items/3b70b5c5541620536fa2

・Chainer
参考文献：
http://qiita.com/icoxfog417/items/96ecaff323434c8d677b
http://nonbiri-tereka.hatenablog.com/entry/2015/06/14/225706

Chainerは、Preferred Networksが開発したニューラルネットワークを実装するためのライブラリである。記法が直感的かつシンプルなので、単純なネットワークから、複雑なディープラーニングまで幅広くカバーできる。
 日本発のライブラリである。
また、短く書ける。Caffe上のコード2058行がChainerでは167行で書ける。
そして、設定ファイルや固定データセットが必要ない。Caffeでは、設定ファイルと構築したデータセットを主に使うことになっていたので、動的にDataArgumentationしようとすると面倒になる。
 最後に、インストールが簡単である。

・Caffe
参考文献：
http://caffe.berkeleyvision.org/

　CaffeはPython向けの代表的なディープラーニングライブラリである。C++で実装され、GPUに対応しているため、高速な計算処理が可能である。
 　Caffe is a community　というキャッチコピーもあるほど、その開発コミュニティーが活発にgithubを更新していたり、サンプルコードも多く初心者に推奨される。
 　大規模画像認識のコンテストILSVRCで2012年に1位となった畳み込みニューラルネットワークの画像尾分類モデルがすぐに利用できるようになっている。
 　Caffeは、カリフォルニア大学バークレー校のコンピュータビジョンおよび機械学習に関する研究センターであるBVLCが中心となって開発している。ヤフージャパンは2014年6月から同センターのスポンサーになっていて、Caffeの開発を含めたセンターの研究の支援を行っている。

・Theano
参考文献：
http://aidiary.hatenablog.com/entry/20150127/1422364425
http://www.chino-js.com/ja/tech/theano-rbm/#id5

TheanoはPython向けの「ディープラーニング（Deep Learning）」ライブラリである。
 　機能としては、ディープラーニングの他に「行列演算」「実行時にCコードを生成してコンパイル」「自動微分」「GPU処理(要CUDA)」もあり、ケースによっては数値計算ライブラリ「Numpy」よりも高速に計算できる。
 　Deep learning に関するTutorialの量がとても多い。Theano自体は自動偏微分機能・GPU対応などをサポートする計算ライブラリで、Deep learning専用のパッケージではない。自分で理論から理解してScratchで実装したい人にはとても参考になる。
 　Theanoをベースに開発されたライブラリが多いようだ。

・Torch,Lua
参考文献：
http://conditional.github.io/blog/2013/12/07/an-introduction-to-torch7/

畳み込みニューラルネットワークを用いた、低画質画像から高画質画像を生成するソフトであるwaifu2xなどはこれを利用して開発されている。

・scikit-learn
機能としては、分類 (Classification)や回帰 (Regression) 、クラスタリング (Clustering) 、次元削減(Dimensionality reduction)などが実装されている。

・PyML
 SVM、再近傍法、リッジ回帰等に適している。

・Pylearn2
　機械学習向けライブラリのPylearn2は、画像の認識処理等に適している。

・PyBrain
　ニューラルネットワーク系に強いライブラリである。
react-routerで<Link />にparamsを指定する方法が変わった

react-routerの使い方について、[React初心者のためのreact-routerの使い方](http://beck23.hatenablog.com/entry/2015/02/20/054900)という記事にたいへんお世話になりました。

ただ、バージョンが変わって変更点が発生したっぽいので補足します。


2016年7月4日現在、バージョンを指定せずにreact-routerをインストールすると、

```json
// package.json
 "react-router": "^2.5.2",
```

となります。

このバージョンにおいて、Linkコンポーネントを使う場合、paramsの指定は、

```js
// このようなルーティングの設定があった場合
<Route name="user" path="/users/:userId"/>

// 以下のリンクコンポーネントで、上記の<Route/>のハンドラーを呼び出せる。
<Link to="user" params={{userId: "123"}}/>
```

ではなく、

```js
// このようなルーティングの設定があった場合
<Route name="user" path="/users/:userId"/>

// 以下のリンクコンポーネントで、上記の<Route/>のハンドラーを呼び出せる。
<Link to="user/123"/>
```

となったようです。

無視するとこのように怒られます。
![Screen Shot 2016-07-04 at 07.57.56.png](https://qiita-image-store.s3.amazonaws.com/0/77614/4355ed8a-c667-d0ed-0f5f-f8c74ff530d3.png)


公式：[react-router#whats-it-look-like](https://github.com/reactjs/react-router#whats-it-look-like)
技術英語 > He, [from what I can tell], did work to eliminate some of the bad practices by bad actors

@ LOE > June 20, 2003

http://www.loe.org/shows/shows.html?programID=03-P13-00025
> He, <font color=red>from what I can tell</font>, did work to eliminate some of the bad practices by bad actors

上記のtellは「分かる」の意味かと思ったが、以下の訳し方(「言う」としている)も見つかった。

http://www.linguee.jp/%E8%8B%B1%E8%AA%9E-%E6%97%A5%E6%9C%AC%E8%AA%9E/%E7%BF%BB%E8%A8%B3/what+i+can+tell+you.html
> but what I can tell you is that they just had different work ethics.
> 僕に言えるのは､彼らは仕事に対して違った 倫理観を持っているということだ。 

http://eow.alc.co.jp/search?q=I+can+tell+you

<hr>
関連して思い出したのは

> I can tell the difference

http://ejje.weblio.jp/content/tell+the+difference+between
[Itamae] user アトリビュートでこける

user アトリビュートは、 `Vagrantfile` に `shell` オプションを追加する必要がある。

こんな感じ。

```rb:Vagrantfile
config.vm.provision :itamae do |config|
  config.shell = '/bin/sh'
end
```

出典：https://github.com/itamae-kitchen/itamae/issues/158
【論文シリーズ】GoogleがCTRの予測プログラムを作った

## 原文
[広告クリック(率)の予測:  (Ad Click Prediction: a View from the Trenches)](http://goo.gl/dUZT3T)
H. Brendan McMahan, Gary Holt, D. Sculley, Michael Young (2013)



## 1. 要約／背景
* Googleのリスティング広告(search advertising)のビッグデータを学習させて、広告のCTRを予測した。
* メイン理論はよく研究されているので、より実践的な項目(メモリ節約、パフォーマンス評価方法、校正など)について調査した。

## 2. 骨子の理論 / 実践Tips
　入力次元に対応する広告関係のメタパラメータは残念ながら公表されない。
メインの学習手法は、NNを利用しているみたいだ。
論文では、重みと学習係数の更新の計算手法として、一般的なOGD(オンライン確率降下法)に代わってFTRL-Proximalアルゴリズムが提唱された。

### (1)FTRL-Proximal (Follow The Regularized Leader- Proximal)
重みの更新の際、前エポックについて、下のパラメータを計算する。パラメータの最小値を記録した重み項を更新に採用するというアルゴリズムである。

```math
{\bf w_{t+1}} = \arg\min_{{\bf w}}\Big({\bf g}_{1:t}・{\bf w} + \frac{1}{2}\sum_{s=1}^{t}\sigma_{s}||{\bf w}-{\bf w}_s||^2_2 + \lambda_1||{\bf w}||_1\Big)
```
この式の右辺は、L1, L2正則化を考慮して、次のように書き換えられる；

```math
\Big({\bf g}_{1:t} - \sum_{s=1}^{t}\sigma_{s}{\bf w}_s\Big)・{\bf w}+ \frac{1}{\eta_t}||{\bf w}||^2_2 + \lambda_1||{\bf w}||_1 +(const)
```

$w$の係数項を$z$と置くと、$z$と$L1$項の係数$λ_1$の比較により、重みの更新を選ぶ；

```math
\begin{eqnarray}
w_{t+1,i}=\left\{ \begin{array}{ll}
0 & \mbox{if} |z_{t,i}| \le \lambda_1 \\
-\eta_t(z_{t,i}-\mbox{sgn}(z_{t,i})\lambda_1 ) & \mbox{otherwise.} \\
\end{array} \right.
\end{eqnarray}
```

$L_2$正則化項の$\eta$は、次元ごとの勾配を利用して、更新される。そのため、Per-Coordinate Learningとよばれる。

```math
\eta_{t,i} = \frac{\alpha}{\beta + \sqrt{\sum_{t}^{s=1}g_{s,t}^2}}
```

### (2)メモリ節約アイディア
・確率分布の活用→出現率の低いデータセットに対して、ポアソン分布を使うなど
・2ビット論理値のような、メモリを食わないデータデザインをする。
・関連モデルの活用
・当てはめ
・学習係数の計算の近似→ポジティブデータとネガティブデータの比率に落としこむ

```math
\begin{align}
\sum g_{t,i}^2 &= \sum_{\mbox{positive events}}(1 - p_t)^2 + \sum_{\mbox{negative events}}p_t^2 \\
&\approx P\Big(1-\frac{P}{N+P}\Big)^2 + N\Big( \frac{P}{N+P}\Big)^2\\
&= \frac{PN}{N+P}
\end{align}
```

### (3)予測の評価
ROC曲線による評価が上げられている。

### (4)予測の校正
実装したアルゴリズムが、(考慮していないファクターによって)実際のCTRとずれたCTRを叩きだしたとき、それを校正すると、パフォーマンスがよくなる。
筆者らは、NNに**校正層(calibration layer)**を導入して、学習の校正を試みた。
校正関数は、ポワソン回帰のそれを採用して、訓練データに当てはめる。

## 本モデル構築に際して、価値の出なかった手法を以下に挙げる
### ①特徴ベクトルの行き過ぎたHash化
一般に文字列データは処理が重く、ハッシュ化することで処理の高速化が期待できる。ところが、本論文の系で特徴量をハッシュ化しても、期待されるほどのRAMの節約(計算効率)にならなかった。
### ②Dropout
効きにくい原因として、入力データの質の違いを挙げている。
画像データのように、情報が密集しているデータは、次元間の相関が強いため、Dropoutによる間引きが頑健性に貢献しやすい。
一方で、スパース性(One-hotベクトルばかり)やノイズ性のあるデータについては、単に情報量を間引くだけになり、効果が得られにくい。
### ③アンサンブル学習(特徴包装: feature bagging)
アンサンブル学習は、バイアスの除去と平行学習に効果があるとされているが、このモデルでは、0.1~0.6%くらいの改善寄与しかなかった。
### ④特徴ベクトルの正規化
この系では、入力データの多様性が強いため、本来は正規化すべきと考えた。
しかし、結果として、次元学習と正則化に対し、有害な結果をもたらすに至った。