OmniAICreator/Qiita-1.07M huggingface dataset:
Sequelizeのassociation

http://docs.sequelizejs.com/en/latest/docs/associations/
ここに書いてあるのですが若干理解に詰まったのでメモ書きを残します。

Sequlizeに限らずActiveRecordとかもだいたい同じ考え方だと想います。

## belongsTo

直訳すると「属している」です。

```js:モデル定義1
var Member = sequelize.define("Member",{
  member_id : {... , primaryKey: true},
  project_id: {...}   //...k1
  name : {...}
});
var Project = sequelize.define("Project",{
  project_id : {... , primaryKey: true},   //...k2
  name : {...}
});
```

``Member.belongsTo(Project)``これはわかりやすいですね。`Member.project_id`を外部キーとして`Project`とJOINします。

### 結合キーの指定

結合キーは明示的に指定するならこうです。

```js
Member.belongsTo(Project,{
  foreignKey: "project_id",  //k1を指定
  targetKey: "project_id"    //k2を指定
});
```

省略してもモデル名とプライマリキー名から自動的に決めてくれるのですが、よくわからなくなるので明示的に書くことをオススメします。

ちなみにここで言う`foreignKey`はRDBMSでいうConstraintとかIndexではなく、Columnのことを指します。

### ちょっとわかりにくいbelongsTo

「属している」という言葉にこだわるとわかりにくい例です。

```js:モデル定義2
var Member = sequelize.define("Member",{
  member_id : {... , primaryKey: true}, //...k4
  project_id: {...}   //...k1
  name : {...}
});
var Project = sequelize.define("Project",{
  project_id : {... , primaryKey: true}, //...k2
  leader_id : {...}   //...k3 プロジェクトリーダーのmember_id
  name : {...}
});
```

* `belongsTo`...属している
* `hasOne`   ...１つ持っている

この言葉尻だけを捉えると、``Project.hasOne(Member, {as: "Leader"})``っぽいのですが

```js
Project.belongsTo(Member,{
  as: "Leader",
  foreignKey: "leader_id",  //k3を指定
  targetKey: "member_id"    //k4を指定
});
```
こちらです。

``Source.belongsTo(Target)``は端的に言うと**`foreignKey`がSource側にある**ということになります。

## hasOne

対して``Source.hasOne(Target)``は**`foreignKey`がTarget側にある**ということになります。
先のモデル定義2の例だと、

```js
Member.hasOne(Project,{
  as: "LeadingProject",
  foreignKey: "leader_id" //k1
})
```
となります。

hasOneの場合は``targetKey``の明示指定オプションは無いようです。SourceのprimaryKeyになるのは自明ということでしょうか。

## hasMany

hasOneが理解できればhasManyも同じようなものです。**`foreignKey`がTarget側にある**ということは相変わらずです。

```js
Project.hasMany(Member,{
  foreignKey: "project_id" //k1
})
```

## belongsToMany

先までの例のモデル定義1,2ではメンバーは複数のプロジェクトを兼任できないデータ構造です。
現実的には複数プロジェクトを兼任することがありますね。

RDBでn対m関係を表現するには間に関連テーブルを入れるのが常套手段ですね。

* Project:ProjectMember = 1:n
* Member:ProjectMember = 1:m

```js:モデル定義3
var Member = sequelize.define("Member",{
  member_id : {... , primaryKey: true},    //...kkk1
  name : {...}
});
var Project = sequelize.define("Project",{
  project_id : {... , primaryKey: true},   //...kkk2
  name : {...}
});
var ProjectMember = sequelize.define("ProjectMember",{
  project_id: {....},  //...kkk3
  member_id: {...},    //...kkk4
});
```

```js:メンバーが所属しているプロジェクト
Member.belongsToMany(Project,{
  through: ProjectMember,
  foreignKey: "member_id",  //kkk4を指定
  otherKey: "project_id"    //kkk3を指定
})
```

この`Source.belongsToMany(Target)`は

* `foreignKey`はthroughにある
    * 指しているものはSourceの`primaryKey`
* `otherKey`もthroughにある
    * 指しているものはTargetの`primaryKey`

となります。
KotlinのNullableをScalaのOptionのように使用する。

ScalaのOptionには`map`と`getOrElse`メソッドがあって、次のような便利なイディオムが書けます。

```scala:scala
val x1: Option[Int] = Some(10)
val x2: Option[Int] = None

val y1 = x1.map(_ + 10).getOrElse(0)
// -> 20
val y2 = x2.map(_ + 10).getOrElse(0)
// -> 0
```

これと同じようなことをKotlinのNullableでifを書かないでやりたい。

```kotlin:kotlinでもこう書きたい
val x1: Int? = 10
val x2: Int? = null

val y1 = x1.map {it + 10}.getOrElse { 0 } 
// -> 20
val y2 = x2.map {it + 10}.getOrElse { 0 }
// -> 0
```

次のようにNullableを拡張すればOKです。(forEachはおまけ)

```kotlin:ScalaOption.kt
package com.frontier45

/**
 * Created by du on 16/01/29.
 */

fun <T1, T2> T1?.map(f: (T1) -> T2): T2? {
    return if (this != null) {
        f(this)
    } else {
        null
    }
}

fun <T> T?.forEach(f: (T) -> Unit): Unit {
    if (this != null) {
        f(this)
    }
}

fun <T> T?.getOrElse(f: () -> T): T {
    return this ?: f()
}
```

`getOrElse`の引数にデフォルト値ではなく、引数なしの関数を渡すことでnullだった時の値として複雑なブロックも使用できるようになっているのがポイント。

```kotlin
val y1 = x1.map {
  cool codes
}.getOrElse { 
  awesome codes
} 
```

Gistはこちら。
https://gist.github.com/lucidfrontier45/8d3dddc0d8a0d232e997

(編集 2016-01-29)
頂いたコメントより`map`と`forEach`は不要とわかりました。代わりに`?.let`を使用すればいいようです。
`getOrElse`も別名にした方がいいです。
iptables 覚書

```
iptables [-t table] -A
         [-t table] -L
         [-t table] -D
         [-t table] -F
         [-t table] -I
         [-t table] -P
         [-t table] -N
```

# -A
append。設定を最後尾に追加。

# -L
line numbers。設定内容表示。

# -D
delete。設定を削除。

# -F
flush。指定したチェーンすべてを削除。

# -I
insert。先頭に設定を追加。ルール番号を指定すると任意の場所に挿入される。

# -P
チェーン内全体で有効なターゲットを定義する。既定値は ACCEPT。

# -N
new。新しいチェーンを作成する。

# テーブル
## -t table

### filter
パケットフィルタリングを参照するテーブルを指定する。

### nat
新しいセッションを開くパケットが参照するテーブルを指定する。

### mangle
特別なパケットが参照するテーブルを指定する。

# チェーン
処理を適用するパケットのグループ。

## INPUT
受信パケット

## OUTPUT
送信パケット

## FORWARD
転送パケット

## PREROUTING
受信時の宛先アドレスを変換する。

## POSTROUTING
送信時の送信アドレスを変換する。

# ルール
処理を適用するパケットの検索条件。
! を指定すると条件を反転させることができる。

## -p [!] protocol
使用するプロトコル。 tcp / udp / icmp / all

## -s [!] address [/netmask]
送信元アドレス。 IP アドレスまたはホスト名を指定する。

## -d [!] address [/netmask]
接続先アドレス。 IP アドレスまたはホスト名を指定する。

## --sport port
送信先ポートを指定する。

## --dport port
送信元ポートを指定する。

## -i interface
パケットを受信するインターフェイスを指定する。
例) eth0, eth1 など

## -o interface
パケットが出ていくインターフェイスを指定する。
例) eth0, eth1 など

## -m module
モジュールを指定する。 -p オプションで暗黙に指定される為、省略が可能。

## --icmp-type [!] type
ICMP のタイプ名を指定する。
ICMP タイプ名は ``iptables -p icmp -h`` で確認することができる。

# ターゲット
パケットがルールに合致した場合に実行する処理を指定する。

## -j target
### ACCEPT
パケットの通過を許可する。

### DROP
パケットを破棄する。(パケットの通過を拒否する)

### RETURN
チェーン内のルール評価を終了する。

### MASQUERADE
``-t nat`` と ``-A POSTROUTING`` と同時に用いて
送信元 IP とポート番号を書き換える。

### REJECT
パケットの受信を拒否し、 ICMP メッセージを返信する。

### PREROUTING
特定のポートへリダイレクトする。

### LOG
ログを採取する。

### SNAT
パケットの送信元アドレスを修正する。
nat テーブルの POSTROUTING チェーンでのみ利用可能。

### DNAT
パケットの送信先アドレスを修正する。
nat テーブルの POSTROUTING チェーンでのみ利用可能。
list内のnull項目を取り除く覚え書き


R言語です。案外手こずったのでメモしておきます。
listの中にNULLがある場合、その項目を取り除いたlistを作る方法。

# リスト作成

list型はなんでも入る柔軟さがあります。

```r:作成
l<-list()

#いろんな入れ方ができます
l[["one"]]<-c(1,2,3,4,5)
l$two<-c(3,4,NA,6,7)
l[[4]]<-c(9,8,7)

#こうなる
> l
$one
[1] 1 2 3 4 5

$two
[1]  3  4 NA  6  7

[[3]]
NULL

[[4]]
[1] 9 8 7

```

# NULLを取り除く

NULLの項目を取り除くにはsapplyを使うときれいに書けます。

```r:nullを除く
ll <- l[!sapply(l,is.null)]

> ll
$one
[1] 1 2 3 4 5

$two
[1]  3  4 NA  6  7

[[3]]
[1] 9 8 7

```

## 追記（Filterを使う）

[hoxo_m](http://qiita.com/hoxo_m)さんにコメントで教えて頂きました。

```r:Filterを使おう
> Filter(Negate(is.null), l)
$one
[1] 1 2 3 4 5

$two
[1]  3  4 NA  6  7

[[3]]
[1] 9 8 7
```

シンプルでいい感じです。

## 追記（rlistを使う）

[gingi99](http://qiita.com/gingi99)さんにコメントで教えて頂きました。
[rlist](http://renkun.me/rlist/ja/)というパッケージを使うともっとシンプルに書けます。
rlistはdata.frameで扱いにくいようなリストデータを扱うツールボックスです。

```r:rlistを使おう
> list.clean(l)
$one
[1] 1 2 3 4 5

$two
[1]  3  4 NA  6  7

[[3]]
[1] 9 8 7
```

# 項目の中のNAを取り除く
おまけ。リストの中に入っている項目の中のNAを取り除く、というのもsapplyやlapplyで楽にできます。

```r:項目の中のNAを除く
lapply(ll,function(v){v[!is.na(v)]})
$one
[1] 1 2 3 4 5

$two
[1] 3 4 6 7

[[3]]
[1] 9 8 7
```


うむ。わかれば簡単なんですがハマるときはハマる。
h2o構築作業メモ

http2を理解するために[h2o](https://github.com/h2o/h2o/)をインストールしました。

# 環境
* Ubuntu 12.04 (on Virtual Box in Mac OS) 
* h2o 1.6.3

# h2oをインストール

```bash
# root ユーザで実行
# https://github.com/h2o/h2o/releases の tarファイルのURLから
wget https://github.com/h2o/h2o/archive/v1.6.3.tar.gz
tar xzf v1.6.3.tar.gz
cd h20-1.6.3
cmake .
make
sudo make install
```

# h2oを設定する

## 最終的な設定ファイル郡

```bash
root@precise64:/usr/local/etc# tree h2o/
h2o/
|-- access-log
|-- cert.csr
|-- cert.key
|-- cert.pem
|-- error-log
|-- h2o.conf
|-- index.html
`-- pid-file
```

## 自己証明書の作成
```bash
$ mkdir /usr/local/etc/h2o/
$ cd /usr/local/etc/h2o/
$ openssl genrsa 2048 > cert.key
$ openssl req -new -key cert.key  > cert.csr
$ openssl x509 -days 3650 -req -signkey cert.key < cert.csr > cert.pem
```

## 各種起動に必要なファイルを作成

```bash
$ touch /usr/local/etc/h2o/access-log
$ touch /usr/local/etc/h2o/error-log
$ touch /usr/local/etc/h2o/pid-file
```

## confファイルの作成

```bash
$ cd /usr/local/etc/h2o/
$ vi h2o.conf 
#----------------------
 1 user: root
 2 hosts:
 3   "*":
 4     listen:
 5       port: 443
 6       ssl:
 7         certificate-file: /usr/local/etc/h2o/cert.pem
 8         key-file:  /usr/local/etc/h2o/cert.key
 9     paths:
 10       "/":
 11         file.dir: /usr/local/etc/h2o/
 12 
 13 access-log: /usr/local/etc/h2o/access-log
 14 error-log: /usr/local/etc/h2o/error-log
 15 pid-file: /usr/local/etc/h2o/pid-file
```

## index.htmlの作成

```html
$ cd /usr/local/etc/h2o
$ vi index.html 
-----------------------------
<html>
<head>
        <title>hello, h2o! </title>
</head>
<body>
        hello, h2o!
</body>
<html>
```

# 起動と終了

```bash
# 起動前のテスト
$ sudo /usr/local/bin/h2o -m test -c /usr/local/etc/h2o/h2o.conf
# Backgroundプロセスとして起動
$ sudo /usr/local/bin/h2o -m daemon -c /usr/local/etc/h2o/h2o.conf 
# 停止
$ sudo kill -TERM `cat /usr/local/etc/h2o/pid-file`
```

# アクセス
※ host os:8443 → VM os: 443へforwordingする設定をしています
![enter image description here](https://i.imgur.com/xa9KUrL.png)


# その他にやったこと

## cmake をソースからインストール

apt-getでインストールしたcmakeのバージョンが古かったため

```bash
# rootユーザで実行
sudo apt-get install build-essential
wget http://www.cmake.org/files/v3.2/cmake-3.2.2.tar.gz --no-check-certificate
tar xf cmake-3.2.2.tar.gz
cd cmake-3.2.2
./configure
make
make install
```

# 参考
* [cmakeのインストール手順](http://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04)
Vagrant CentOS でログインシェルをzshにし、.vimrcを適用させたメモ

# はじめに
Vagrant立ててCentOS動かして、普段使ってる```.zshrc```とか```.vimrc```とか適用させようと思ったらちょこちょこ引っかかったのでメモしておきます。
誰かの役にたつかもなので。

# zsh
はじめは、zshさんがいらっしゃらないのでお連れしなければなりません。

```
# sudo yum install zsh
```

なんか

```
PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'"
```

こんなのばっか出てうまくいかない。

### ipv6の設定

- まずこのファイルを作る

```/etc/modprobe.d/disable_ipv6.conf
options ipv6 disable=1
```

- ip6tablesサービス停止

```
# service ip6tables stop
```

- ipv6tablesサービスの自動起動停止

```
# chkconfig ip6tables off
# chkconfig --list|grep ip6tables
```

- ネットワークの再起動

```
# service network restart
```

こうやって再度installでうまくいった。

```
# sudo yum install zsh
```



これでzshさんがいらっしゃいました。

```
# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
/bin/zsh
```

でzshさんをログインシェルに設定。

```
# usermod -s /bin/zsh
```

いつも使ってる```.zshrc```を召喚して呼びだす。

```
# source .zsh
```

ログアウトしてログインし直し確認。

```
# echo $SHELL
/bin/zsh
```

# vimrc

## vimrc関連で詰まりそうなやつ

### neobundle#rc()

[neobundle#rc()がdeprecated functionになる時の対処法](http://qiita.com/musclemikiya/items/58edc801264aca151446)

### NeoBundleのプロトコル 

```NeoBundle 'git://github.com/Shougo/unite.vim.git'``` を ```NeoBundle 'https://github.com/Shougo/unite.vim.git'``` とプロトコルを変更する必要があるよう。

https://github.com/Shougo/neobundle.vim/issues/451

### rubyが使えない（rubyが入ってるはずなのに入ってないって言われる) (NeoBundleで)

そもそもvimを入れなおした。(homebrewで)

```
#  ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/linuxbrew/go/install)"

# export PATH="$HOME/.linuxbrew/bin:$PATH"
# export MANPATH="$HOME/.linuxbrew/share/man:$MANPATH"
# export INFOPATH="$HOME/.linuxbrew/share/info:$INFOPATH"
# export LD_LIBRARY_PATH="$HOME/.linuxbrew/lib:$LD_LIBRARY_PATH"

# brew install vim
```

これでいけた。

# 参考

[シェルを bash から zsh に変更 〜 CentOS6](http://easyramble.com/change-shell-from-bash-to-zsh.html)
[【RHEL6】ipv6無効化](http://nopipi.hatenablog.com/entry/2012/08/15/162613)
[CentOSでも使用できるHomebrew(Linuxbrew)の導入](http://qiita.com/CyberMergina/items/36f34b5b722b7bf4a26d)
UIWebViewを使わない理由とWKWebViewを使う理由

iOS版Google Chromeがver48.0でUIWebViewからWKWebViewに移行しました (2016/01/28)。このアップデートにより、それまでのクラッシュ率を70%削減し、JavaScript実行速度も大幅に上がりましたと書いています。2015年末にリリースされたiOS版FirefoxもWKWebViewを使用しています。

主要アプリがWKWebViewを採用していく流れのようです。ご自身のアプリにUIWebViewを使用している場合はWKWebViewへの移行も視野に入れてはいかがでしょうか。私自身WKWebViewを採用したブラウザアプリをリリースし15ヶ月以上運用していますのでその中で気付いたことも書いていきます。


## 理由1 クラッシュ率
   UIWebViewには開発者レベルではどうにもならないクラッシュ問題が潜んでいます。特に複数のUIWebViewを使用するアプリでは顕著です。たとえGoogleの開発者であっても回避のしようがありません。
   
   一方のWKWebViewではそのような理不尽なクラッシュ問題とは無縁です。Chromeはクラッシュ率70%削減としていますが、残りの30%もWKWebView自体にはほぼ非はなく実装方法や他の部分のものでしょう。
   
   UIWebView/WKWebViewは共にメモリを大量に消費するのは変わりませんが、使用するメモリの領域に違いがあります。UIWebViewは各アプリのメモリ領域に存在するのに対し、WKWebViewはアプリ外の領域に存在しています。XcodeでWKWebViewのメモリ量を測定できないのはそのためです。
   
   ちなみに、WebViewを多く使うアプリは最新の2GB以上のメモリを搭載したiPhone/iPad上では快適に動作します。


## 理由2 セキュリティ
   UIWebViewが既にあるにも関わらず、AppleがWKWebViewを公開した一番の理由はこの点にあると考えています。
   UIWebViewの接続先は他の通信関連APIで操作することが可能です。そのため、開発者に悪意があれば通信先をすり替えたり完全に遮断することが可能になります。

   WKWebViewは通信関連APIでは操作することができません。これがChromeのデータ通信量削減機能が廃止になった理由です。
   
   iOS 9から新たにApp Transport Securityという制限が加わりました。非推奨ですが不特定多数のWebサイトを表示する必要があるブラウザ等のアプリでは例外的にこの機能をOffにします(info.plist: NSAppTransportSecurity > NSAllowsArbitraryLoadsの値をtrue)。


## 理由3 将来性
   UIWebViewは初期のiOSから存在しています。現時点ではDeprecated(廃止予定)とはなっていないものの、WKWebViewやSFSafariViewControllerがある今、Appleが今後もサポートし続けるのでしょうか？
   ブラウザまでとは行かなくても少しWebサイトを表示したいという場合にはiOS 9で登場したSFSafariViewControllerで間に合っています。
   WKWebViewもiOS 8では機能不足でしたが、iOS 9で機能が盛り込まれています。
   :link: [iOS 9 WKWebView 主な変更点をざっくり](http://qiita.com/ShingoFukuyama/items/a9bf7d26f9dd889d3297)
   今後のiOSバージョンで更なる進化が期待できそうです。

   
## WKWebView関連のリンク
   :link: [WKWebViewで躓いた10つのまとめ](http://qiita.com/ShingoFukuyama/items/eede79a284c3669846e9)
   :link: [iOSアプリがWKWebViewかUIWebViewのどちらを使用しているかの判定方法](http://qiita.com/ShingoFukuyama/items/35a2f4f1fdde8a4fd455)
   :link: [GitHub ShingoFukuyama/WKWebViewTips](https://github.com/ShingoFukuyama/WKWebViewTips)
   :link: [アプリ単体とOS全体のメモリ領域を確認できるツール](https://github.com/ShingoFukuyama/OHJMemoryIndicator)

## PR
:link: [Ohajiki Web Browser](http://ohajiki.ios-web.com/)
WKWebViewの高速なJavaScript実行環境を活かした機能を盛り込んだブラウザです。無料版もあるのでぜひお試しください。すべてのWebページの背景を黒くする・特定のコンテンツをブロックするなどJavaScriptの実行速度が遅いUIWebViewでは難しかったことも実用的になっています。
OpenSSHについて(memo)

# OpenSSH
SSHには，SSH1とSSH2プロトコルがある，SSH2推奨．
## PKI(公開鍵)認証の場合
### ユーザ認証
ユーザは，```ssh-keygen```コマンドによって，秘密鍵と公開鍵を作成する．生成された公開鍵(.pub)をサーバに置く．ユーザアクセス時，サーバは乱数を生成し公開鍵を用いて暗号化しユーザに送信する．ユーザは，秘密鍵で復号し，乱数のハッシュ値を計算，サーバに送信する．サーバは，ハッシュ値が一致していることを確認し照合する．

### サーバ認証
目的: サーバなりすましを防ぐため
サーバは，鍵を生成し，ユーザに公開鍵を送付する．送付された鍵は，.ssh/known_hostsに格納され，通信時に上記のユーザとサーバが入れ替わったかたちで照合される．

### DSAとRSA
公開鍵認証方式，DSAは鍵長1024bitに対して，RSAは基本的に2048bitで，さらに4096bitにもできる．RSA推奨
※自分の鍵の長さの確認
```ssh-keygen -l -f ~/.ssh/id_rsa.pub```

## 証明書による認証の場合
CA(認証局)が鍵の信頼を担保する形で認証される．
brew update が出来なくなった時の対処

```bash
$ brew update
error: could not lock config file .git/config: Permission denied
fatal: Will not delete all non-push URLs
Error: Failure while executing: git remote set-url --delete origin .*mxcl/homebrew.*
```

Permission の問題っぽいのでそれっぽい所に移動する

```bash
$ cd $(brew --prefix)
$ ls -l
total 80
-rw-r--r--@   1 geshi  admin   3158 10 24  2014 CODEOFCONDUCT.md
-rw-r--r--@   1 geshi  admin    916 10 24  2014 CONTRIBUTING.md
drwxr-xr-x@  30 501    admin   1020  2 23  2015 Cellar
...
```

やっぱりなんか変

```bash
$ sudo chown -R geshi ./
$ brew update
error: The following untracked working tree files would be overwritten by merge:
	Library/Formula/agedu.rb
	Library/Formula/appledoc.rb
	Library/Formula/mydumper.rb
	Library/Formula/nailgun.rb
Please move or remove them before you can merge.
```

まだ出る。。。

```bash
$ git fetch origin
$ vim .git/config
$ git remote add origin https://github.com/Homebrew/homebrew.git
fatal: remote origin already exists.
$  git reset --hard origin/master
HEAD is now at cbbc9e5 gtk+3: update 3.18.7 bottle.
$ brew update
To restore the stashed changes to /usr/local run:
  `cd /usr/local && git stash pop`
Updated 1 tap (homebrew/dupes).
==> New Formulae
homebrew/dupes/bc       homebrew/dupes/bzip2    homebrew/dupes/krb5     homebrew/dupes/srm      homebrew/dupes/xar
...
```

出来た！
【SQLite3】コマンド例と他データベースとの比較から始める SQLite 入門

## コマンド例

###### 基本

```
$ sqlite3 -version   # バージョンを表示
$ sqlite3 database.sqlite3   # データベースに接続する（同名ファイルがなければ作成して接続する）

sqlite> .help   -- ヘルプを表示する
sqlite> .show   -- 設定情報を表示する
sqlite> .exit   -- 終了する
```

###### ファイル操作

```
-- CSVを取り込む
sqlite> .separator ,   -- 区切り文字を変更する
sqlite> .import file table   -- 指定したファイルのデータをテーブルに挿入する

-- バックアップを取る
sqlite> .output backup.dump   -- 出力先を任意のファイルに指定する
sqlite> .dump [table]  -- テーブルのデータを出力する

-- 復元する
sqlite> .read backup.dump   -- バックアップを元に復元する（同じ名前のテーブルが存在する場合はエラーが発生する）
```

###### テーブル操作
```
sqlite> .tables   -- テーブルの一覧を表示する
sqlite> .schema [table]   -- テーブルのスキーマを表示する

-- CREATE
sqlite> CREATE TABLE table (column_a [type], column_b [type]);  -- テーブルを作成する。型の指定は任意。
sqlite> CREATE INDEX index on table (column);   -- インデックスを追加する

-- ALTER
sqlite> ALTER TABLE table_old RENAME TO table_new;   -- テーブル名を変更する
sqlite> ALTER TABLE table ADD COLUMN column;   -- カラムを追加する

-- Drop
sqlite> DROP TABLE table   -- テーブルを削除する
```

###### レコード操作

```
-- INSERT
sqlite> INSERT INTO table (column_a, column_b) VALUES (value_a, value_b);   -- レコードを挿入する

-- UPDATE
sqlite> UPDATE table SET column_a = value_a WHERE column_b = value_b;   -- レコードを更新する

-- DELETE
sqlite> DELETE FROM table WHERE column = value;   -- レコードを削除する

-- SELECT
sqlite> .header on   -- カラム名も出力するよう設定する
sqlite> SELECT * FROM table;   -- 全てのレコードを取得する
sqlite> SELECT (TYPEOF)column FROM table;   -- 全てのレコードから特定のカラムのみ（型情報を含めて）取得する

-- 特殊な変数
sqlite> SELECT current_time;   -- 12:57:55
sqlite> SELECT current_date;   -- 2016-01-28
sqlite> SELECT current_timestamp;   -- 2016-01-28 13:00:47
sqlite> SELECT ROWID, * FROM table   -- ROWIDは内部的にレコードに付与される連番
```

## 押さえておくべきポイント
### 概要
- データベースは通常のファイルである
- ファイルの拡張子は慣例として `.sqlite3` にする
- データベースを削除するにはファイルを削除する
- データベースのバックアップを取るにはファイルをコピーする
- SQL 以外に `.` で始まる命令がある

### 他のデータベースとの比較
- 同じ点
 - 標準 SQL をおおよそサポートしている
 - 命令の区切りは `;` （ `.` で始まる命令には不要）
- 異なる点
 - クライアント・サーバー構成ではなく、実行プロセスが直接ディスクを読み書きする
 - データ型は指定できるが、必須ではない
 - 挿入されたデータが、指定されたデータ型にキャスト可能であればキャストするが、不可能ならそのまま格納する（1つのカラムに異なるデータ型が混在しうる）
 - テーブルの外部結合は `LEFT OUTER JOIN` のみ
 - `ALTER TABLE` の命令は `RENAME TO`, `ADD COLUMN` のみ

### データ型
|型  |説明  |
|---|---|
|**NULL**  |NULL（値がないことを表す）  |
|**INTEGER**  |マイナスを含まない 8byte の整数  |
|**REAL**  |8byte の浮動小数点数  |
|**TEXT**  |文字列（文字コードはデータベースの設定による）  |
|**BLOB**  |バイナリデータ（Binary Large OBject） |
※厳密にはこれらはストレージクラスと呼ばれ、データ型よりも広い概念である

## リファレンス
- [Core Functions - SQLite](http://www.sqlite.org/lang_corefunc.html)
- [Date And Time Functions - SQLite](Date And Time Functions)
- [Datatypes - SQLite](http://www.sqlite.org/datatype3.html)
Redis ClusterをJavaで使ってみる

## 概要

- Redis-ClusterをJavaで使ってみた。
- 実運用はまだしていません。
- コードはこちら。https://github.com/uryyyyyyy/redisSample

## 使用するライブラリ

こちらの星がついているクライアントを選びました。

http://redis.io/clients#java

- jedis
- lettuce
- reddison

## 試すこと

- 文字列のset/get
- 文字列のmset/mget
- リクエストが最適なノードに届くか？
- 一部のマスタが死んでも適切に対応するか？
- 非同期APIを持つか？

## Redisクライアントの仕組みのおさらい

クラスタは複数のマスタでデータを分散して管理しており、対象のデータを持っていないマスタへのリクエストは別マスタへリダイレクトされる。
また、クラスタの現在の状態は`CLUSTER INFO`コマンドで知ることができる。

賢いクライアントであれば、

- 定期的にクラスタの状態を監視して、マスタやその保持するslotに変更があればそれを反映する。
- リダイレクトされないように現在のクラスタの状態をキャッシュしておく

などをしてくれるはず。

## 試してみる

今回は簡単な例で以下を調べてみた。

- get/set/mget/mset/expire
- フェイルオーバーに自動で対応
- 非同期・同期APIの速度検証

### get/set/mget/mset/expire

[コード例](https://github.com/uryyyyyyy/redisSample/tree/master/client/src/main/java/com/github/uryyyyyyy/redis/client/java/exec/simple)

Jedis、Lettuceは問題なし。

Redissonは[現行の安定版ではmget/msetができなかった](https://github.com/mrniko/redisson/issues/378)ので、SNAPSHOTを使ってみた。

どんなリクエストが来てるか知りたければ[MONITOR](http://redis.io/commands/MONITOR)コマンドを使うと良い。
（クラスタ組んだ時は全リクエストが同一ノードに来てるように表示されるのはなぜ？）

### フェイルオーバーに自動で対応

[コード例](https://github.com/uryyyyyyy/redisSample/tree/master/client/src/main/java/com/github/uryyyyyyy/redis/client/java/exec/failover)

マスタ３台、スレーブ３台でクラスタを組んでいる状態でマスタを一台落としてみてフェイルーバーする際にクライアントが対応できるかを調べる。

1. クライアントプログラムを走らせる。
2. マスタを落とす。
3. リトライを試みていることを確認し、フェイルオーバー完了後に元に戻っていることを確認する。

どのクライアントも普通にできていました。

### 非同期・同期APIの速度検証

[コード例](https://github.com/uryyyyyyy/redisSample/tree/master/client/src/main/java/com/github/uryyyyyyy/redis/client/java/exec/asyncRequest)

大量のリクエストを同期、非同期で送ってみて速度を測る。

- Jedisはまだ非同期APIをサポートしていないので、裏で同期と同じことをしている。
→https://github.com/xetorthio/jedis/issues/241
　（2011年からずっと検討中。もう組み込まれてるっぽいけどAPIがまだ？）
- クライアントとサーバーが同一マシン（ホスト上でDocker立てた）なので、ネットワーク遅延がほぼないと思われる。（同期APIに有利な条件？）
- asyncを正しく測るのが難しいので、とりあえず全リクエストを別スレッドに送り終えた時点で計測している。
- asyncの前後に処理を入れることで結果が変わりそうなので、両方の順番を試してみた。

結果： 

Jedis

```
# 一回目
async: 5502
sync: 4116

# 二回目
sync: 5217
async: 4109
```

Lettuce

```
# 一回目
async: 4105
sync: 8986

# 二回目
sync: 10769
async: 1667
```

Redisson

```
# 一回目
async: 4897
sync: 12705

# 二回目
sync: 11290
async: 3091
```

## まとめ

- 普通に使うならJedisが無難（他のはSNAPSHOT使ってるし。。）
- 非同期APIを使いたい、さらに速く使いたい、場合にはLettuceがいいかも。
- Redissonは個人的にはAPIがわかりにくくて好きじゃない。。。
- 速度測定なんだか当てにならないっぽい？
herokuにデプロイするgitをgithubにした時にherokuコマンドを使うときの設定

# 前提
herokuにデプロイするgitをgithubにした時、herokuコマンドがどのアプリなのか指定がないので、そのままではherokuコマンドが使えない状態になります。別のherokuコマンドなどでappを設定できないか調べたが、特にそういうオプションはないので、下記の方法で解決。

# 解決法1
herokuコマンドでappを指定する方法で解決。

```
heroku open --app [heroku app name]
```
同じリポジトリで別のapp（staging用とか）などで利用している時はこちらがよさそう。

# 解決法2
git remoteにherokuのappも登録

```
heroku git:remote -a [heroku app name]
```
git remoteの名前が
origin: => github
heroku: => heroku

のようになります。

herokuコマンドは、git remoteに登録されているapp名で操作されるようなので、appが固定の場合はこちらで。

### ※参考
http://stackoverflow.com/questions/5129598/how-to-link-a-folder-with-an-existing-heroku-app
AVAudioPlayerで音楽を再生する

##はじめに##
製作したゲームの中で音楽を流したかったのですが、調べに調べて「どうやらAVAudioPlayerというものを使うらしい」というところまでは辿り着いたのですが、調べたページのコードを参考にしても、どうもうまくいかず、ずっと匙を投げたり放置したりしていたのですが、やっとまともに音楽が再生できました。


理解はできてませんがとりあえずできた方法を忘れないように書いておきます。

##環境##
*swift 2*
*Xcode 7.2*

##手順##
1.AVFounditionフレームワークを追加する。
2.Supporting Filesに音楽ファイルをドラッグ&ドロップする。
3.ViewControllerに`import AVFoundition`を書く。
4.ViewControllerクラスに`AVAudioPlayerDelegate`を継承させる。
5.ViewControllerクラスの中で`AudioPlayer`を宣言する。

```
var audioPlayer = AVAudioPlayer()
```

6.再生するクラス（TitleSceneとします）にもimport AVFounditionを書く。
7.TitleSceneクラスの中でViewControllerをインスタンス化する。

```
let gameVC = GameViewController()
```

8.再生したい場所に以下のコードを書く。

```
let titleSound = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("scene1", ofType: "mp3")!)

do {
    gameVC.audioPlayer = try AVAudioPlayer(contentsOfURL: titleSound, fileTypeHint: nil)
} catch {
    print("なんかダメみたい")
}

gameVC.audioPlayer.prepareToPlay()
gameVC.audioPlayer.play()
gameVC.audioPlayer.numberOfLoops = -1
```

※音楽ファイル名：scene1.mp3

9.止めたい場所に以下のコードを書く。

```
gameVC.audioPlayer.stop()
```
 

8のコードtry catchの部分は最初以下のように書いてたんですがどうしてもエラーが出てしまってつまづいていました。何がいけなかったのか、わかる方がいたら是非教えてください。。
![スクリーンショット 2016-01-28 17.18.19.png](https://qiita-image-store.s3.amazonaws.com/0/94953/54160690-2e6c-7006-266b-f79f06b5014b.png)

 

##参考サイト##

[【Swift】音を鳴らす - とりあえず何でも書く](http://gokexn.blog.fc2.com/blog-entry-114.html)

[iOS8 音を鳴らす](http://qiita.com/mr0505iwaki/items/d0c00c82dde82b6a9a6a)

[[iPhone] AVAudioplayer 音楽の再生 (Swift)](https://akira-watson.com/iphone/avaudioplayer.html)

[【Swift】AVFoundationでサウンドを再生する](http://splitcp.com/post/104764752236/swiftavfoundationでサウンドを再生する?is_related_post=1)

いつも本当に助かってます。ありがとうございます。
DockerUIのサイズ

## DockerUI
[DockerUI](https://github.com/crosbymichael/dockerui "DockerUI")を入れてみました。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17388/51e77e58-d6b0-0b2b-c644-bc9499999a78.png)



DokcerUI自体もDocker Imageが提供されており、下記コマンド一つで起動可能です。
```
docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock dockerui/dockerui
```

コンテナの起動・停止やイメージのリスト、コンテナ間のネットワーク状態などもグラフィカルに確認可能で便利です。

DokcerUIのimageサイズを見て見ると、たったの**5.8MB**しかない！
なんで、こんなサイズで動くのかと少し調べてみました。

DockerUIの[Dockerfile](https://github.com/crosbymichael/dockerui/blob/master/Dockerfile "Dockerfile")は非常にシンプルで下記の構成になっています。

```lang
FROM scratch

COPY dist /

EXPOSE 9000
ENTRYPOINT ["/dockerui"]
```

## scratchイメージ
scratchというベースイメージが使われており、これは超最小化されたベースイメージでshさえ入っていないようです。
[Dockerのscratchイメージを探検する](http://dev.classmethod.jp/server-side/docker-server-side/exploration-to-docker-scratch/ "Dockerのscratchイメージを探検する")

でもこれだけではwebサーバーとして、どうして動くのか分かりません。
少し調べて見ると、go言語のhttpサーバー機能が使われているようでした。
[dockerui.go](https://github.com/crosbymichael/dockerui/blob/master/dockerui.go "dockerui.go")
[Go言語でhttpサーバーを立ち上げてHello Worldをする](http://qiita.com/taizo/items/bf1ec35a65ad5f608d45 "Go言語でhttpサーバーを立ち上げてHello Worldをする")
[動的言語だけやってた僕が、38日間Go言語を書いて学んだこと](http://qiita.com/suin/items/22662f43b6a6e8728798 "動的言語だけやってた僕が、38日間Go言語を書いて学んだこと")

dockerとscratchイメージとgo言語を使えばたったの**5.8MB**でwebアプリを構成する事が可能なんですね。これはうれしい驚きでした。
Swiftはじめたい...その１２ クラス


# その１２でやっとクラスです。

+ ジェネリクスを試そうと思ったんですが、クラスとかプロトコルが前提になってるところがあるので先にクラスを試します。

## クラス定義

+ まずはシンプルなクラス定義をしてみます。
+ メンバとメソッドを設定してみます。
+ init()というのがコンストラクタ＝初期化メソッドだそうです。
+ deinitというのもあるそうですが、あまり使わないかも。

```swift:クラス定義
class MyClass {
    var property:Int
    // 初期化
    init() {
        print("MyClass Init")
        self.property = 0
    }
    // 初期値
    init(_ a:Int) {
        print("MyClass Init with initial value")
        self.property = a
    }
    // メソッド
    func add(a:Int){
        self.property += a
    }
    func description()->String {
        return String(self.property)
    }
}

let a:MyClass = MyClass()
print(a.description())
a.add(5)
print(a.description())
a.property = 10
print(a.description())


let b = MyClass(10)
print(b.description())
b.add(5)
print(b.description())
```

```shell:結果
MyClass Init
0
5
10
MyClass Init with initial value
10
15
```

+ ふつーですね。

## クラスメソッド

+ クラスメソッドはあるのでしょうか？調べたところswift2.1ではstaticでできるみたいです。

```swift:クラスメソッド
class MyClass {
    var property:Int
    〜〜    
    static func staticMethod(s:String)->String {
        return "Hello " + s + "."
    }
print(MyClass.staticMethod("aaa"))
```

```shell:結果
Hello aaa.
```

+ Javaっぽい感じですね。

## 継承

+ MyClassを継承してみます。
+ 引き算の関数をつけてみます。

```swift:継承
class MyClass2 : MyClass {
    override func add(a:Int) {
        self.property += a + 1
    }
    func sub(a:Int) {
        self.property -= a
    }
}

let c = MyClass2(20)
print(c.description())	// 20
c.add(5)					// 20 + 5 + 1 = 26
print(c.description())	// 26
c.sub(30)					// 26 - 30
print(c.description())	// -4
```

```shell:結果
MyClass Init with initial value
20
26
-4
```

+ 関数を上書きする場合には``override``をつけないとエラーになりました。

## getter/setter

+ Objective-Cとちがってgetをわざわざ明示するんですね。
+ メソッドじゃなくて変数風だけど参照と設定ができる感じ？

```swift:getter/setter
class GetSetClass {
    var a:Int;
    var b:Int;
    init(){
        a = 0
        b = 0
    }
    var cc:Int {
        get {
            return a * 10 + b
        }
        set(newVal) {
            a = newVal * 10
            b = newVal
        }
    }

let d = GetSetClass()
d.cc = 10
print(d.cc)
```

```shell:結果
1010
```

+ ccのsetterで10を代入すると、内部で```a = 10 * 10 = 100```、```b = 10```となります。
+ ccのgetterを呼ぶと```a * 10 + b = 100 * 10 + 10 = 1010```となるわけです。

## 遅延実行

+ インスタンスは遅延実行できるようです。

```swift:lazy
class MyClass {
    var a:String
    init(){
        a = "No Name"
        print("Init")
    }
    var name:String {
        get {
           return "My Name is " + a
        }
        set(newVal) {
            a = newVal
        }
    }
}

class NewClass {
    lazy var hoge:MyClass = MyClass()
}

var d:NewClass = NewClass() // ここではhogeのinit()は実行されません。

d.hoge.name = "Swift" // これを実行するとinit()が実行されました。

print(d.hoge.name) // My Name is Swift
```

+ クラスの中ではなくいきなりlazyと書くとエラーになりました。

```swift:これはダメ
lazy var huga:MyClass = MyClass()
```

```shell:エラー
Playground execution failed: /var/folders/〜〜/playground320.swift:28:1: error: lazy is only valid for members of a struct or class
lazy var huga:MyClass = MyClass()
^~~~~
```

+ lazyはstructかclassのメンバ変数でしか使えないようですね。

## まとめ

+ クラス定義はふつーです。
+ 抽象メソッドはないのかな？

# 今日はここまで

+ 次はプロトコルとかstructあたりかな〜
Amazon Elasticsearch Service の IAM Role 対応方法


## Ruby
[Amazon Elasticsearch Service の IAM User/Role ](http://qiita.com/deme0607/items/8024deb3ff0fcd7e95ba)

## Python

[AWS ElasticSearch Service の認証にIAM Roleを使う [Python編]](https://www.hands-lab.com/tech/entry/1034.html)

## PHP

[AWS ElasticSearch Service の認証にIAM Roleを使う [PHP編]](https://www.hands-lab.com/tech/entry/1027.html)

## Node.js


[awslabs/amazon-elasticsearch-lambda-samples](https://github.com/awslabs/amazon-elasticsearch-lambda-samples/blob/master/src/s3_lambda_es.js)


## Proxy (汎用的)

[AWS ElasticSearch Service の認証にIAM Roleを使う [aws-auth-proxy編]](https://www.hands-lab.com/tech/entry/1039.html)
WordPressをはじめて使ってみる

# 手順
### dotinstallのwordpressを見る

手元のmac自体にwordpressをインストール
cyberduckでcentosにコピー
sampleファイル名を変更

### public_htmlを読み込んでくれない

/home/配下にログインユーザのディレクトリを作成（すでにあるはず）
httpd.confの設定を追加

~~~
[vagrant@localhost ~]$ sudo vi /etc/httpd/conf/httpd.conf

367| UserDir enabled vagrant
apache restart

[vagrant@localhost ~]$ sudo /etc/init.d/httpd restart
~~~

/home/[user]/配下にpublic_html配下のファイルをコピー
/home/[user]のパーミッションが701になっていることを確認
シンボリックリンク貼る

~~~
[vagrant@localhost ~]$ ln -s /home/vagrant/wordpress /var/www/html/
~~~



# メモ
* 画像アップロードを出来るようにする
    1. `$ localhost.localdomain:~/wordpress $ mkdir wp-content/uploads`
    1. `$ localhost.localdomain:~/wordpress $ chmod 777 wp-content/uploads`

* WordPressのテーマをどうするか
    * 内部SEOが効いているテーマを使うべき
    * イケてるサイトのテーマはheadタグを見れば読み込んでいるCSSがあるので、それを開いて`Theme URI`を見る
        * http://stinger3.com/ がいいらしい
        * インストール方法はまだ知らない
* テーマを自作したい
    1. セレクタ名(id, class名)が決まっているのでそれを知っておく
    2. 任意のディレクトリを作って、その中に`index.html`と`style.css`を作る
        * html/var/www/html配下にシンボリックリンクを通さないと見れないので忘れずに
    3. `wp-content/theme`配下にテーマ名をつけたディレクトリを作り、完成したディレクトリをコピー
    4. `index.html`を`index.php`に変更
    5. `style.css`の一番上にヘッダー情報を入れる。下記からコピーでOK
        * https://codex.wordpress.org/Theme_Development#Theme_Stylesheet
        * 「Theme Name」「Theme URL」「Author」「Author URL」を変更。「Tag」削除可
    6. これで選択できるはず
        * `screenshot.png`は該当ディレクトリ直下に置かないと表示されない
    7. が、選択してもCSSがあたっていないので下記を行う
        8. まずは`index.php`を分割可能なレベルに分割していく
        1. `header.php``footer.php``sidebar.php`を`index.php`と同じ場所に作成
            2. WordPressのブログに関する設定を入れておく`functions.php`も作成
        3. それぞれ別ファイルに移して、`index.php`の該当箇所に`<?php get_header(); ?>`と書く
        4. スタイルがあたってないのは、`header.php`の`style.css`読み込み部分なので、ここを`href="<?php echo get_stylesheet_uri();`に変更
        5. `header.php`のタイトルは`<?php wp_title('|', true, 'right'); bloginfo('name'); ?>`に変更
        6. ブログタイトルは`<?php bloginfo('name'); ?>`
        7. ブログURLは`<?php echo home_url('/'); ?>`
        8. `header.php`内のメニューは管理画面からカスタマイズできると便利。その機能はすでにあり、`functions.php`を使う
            9. `header.php`のmenuタグを`<?php wp_nav_menu(); ?>`に変更
            10. `functions.php`を作成し、`<?php add_theme_support('menus');`を記載
            11. 管理画面のテーマ枠にメニューが増える

疲れた。なんとなく分かったし、自分でテーマ作らないから離脱。
Webpackバンドルを占めるサイズがでかい奴を探す方法

# はじめに
[Webpack](http://webpack.github.io/docs/)でビルドしてできあがったバンドルが、気付いたらサイズが超でかいよ！！ なんて時の犯人探しに役立つかもしれないTips。

# webpack --display-modules で分析
webpackコマンドの実行時に`--display-modules`オプションを付けると、インクルードした`node_modules`や`bower_components`配下のモジュールについても詳細情報がわらわらと出力されるようになる。ここにサイズも出力されている。

```bash
$ webpack --display-modules
Hash: 20265560bd210ea64e82
Version: webpack 1.12.12
Time: 7110ms
    Asset     Size  Chunks             Chunk Names
bundle.js  2.76 MB       0  [emitted]  main
   [0] multi main 28 bytes {0} [built]
   [1] ./~/react/react.js 56 bytes {0} [built]
   [2] ./~/babel-runtime/helpers/interop-require-default.js 148 bytes {0} [built]
   [3] ./~/core-js/modules/$.export.js 1.5 kB {0} [built]
   [4] ./~/process/browser.js 2.06 kB {0} [built]
   [5] ./~/babel-runtime/helpers/extends.js 428 bytes {0} [built]
   [6] ./~/classnames/index.js 1.1 kB {0} [built]
   [7] ./~/fbjs/lib/invariant.js 1.51 kB {0} [built]
   [8] ./~/react-bootstrap/lib/utils/bootstrapUtils.js 4.86 kB {0} [built]
   [9] ./~/core-js/modules/$.js 417 bytes {0} [built]
  [10] ./~/babel-runtime/helpers/class-call-check.js 211 bytes {0} [built]
  [11] ./~/babel-runtime/helpers/inherits.js 780 bytes {0} [built]
  [12] ./~/react/lib/Object.assign.js 1.26 kB {0} [built]
  [13] ./~/fbjs/lib/warning.js 1.77 kB {0} [built]
  [14] ./~/babel-runtime/helpers/object-without-properties.js 283 bytes {0} [built]
・・・
```

ただし、Babelとか使うだけで大量に出力されるので正直これを見るのは辛い。また、.js単位で出力されるので結局のところ使っているどのライブラリが犯人なのかぱっと見て分からないというのもある。

# そこで webpack-bundle-size-analyzerですよ
webpackコマンドの引数に`--json`を付けると、より詳細な情報がjsonで出力される。

```json
        {
          "id": 22,
          "identifier": "d:\\work\\sample\\node_modules\\react\\lib\\ReactMount.js",
          "name": "./~/react/lib/ReactMount.js",
          "index": 28,
          "index2": 63,
          "size": 36774,
          "cacheable": true,
          "built": true,
          "optional": false,
          "prefetched": false,
          "chunks": [
            0
          ],
```

これをいい感じに読みこんでサマってくるツールが[webpack-bundle-size-analyzer](https://github.com/robertknight/webpack-bundle-size-analyzer)。

## 使い方
まずはインストール

```bash
npm install -g webpack-bundle-size-analyzer
```

後は先ほどのJSONを食わせるだけ。パイプで繋げば一発で実行できる。ただし、webpackの処理で独自に標準出力しているとコケるので注意(`webpack.config.js`でconsole.log呼んでいるなどで)。

```bash
webpack --json | webpack-bundle-size-analyzer
```

## 出力例
React.jsを使っている手元のアプリを分析してみた結果です。ライブラリごとにまとめて、占める割合が多い順にサマって出してくれるので分かりやすい。

```bash
$ webpack --json | analyze-bundle-size
react: 590.99 KB (22.7%)
  <self>: 590.99 KB (100%)
nvd3: 556.24 KB (21.4%)
  <self>: 556.24 KB (100%)
lodash: 449.4 KB (17.3%)
  <self>: 449.4 KB (100%)
d3: 328.77 KB (12.6%)
  <self>: 328.77 KB (100%)
react-bootstrap: 275.43 KB (10.6%)
  <self>: 275.43 KB (100%)
core-js: 125.89 KB (4.84%)
  <self>: 125.89 KB (100%)
lodash-compat: 67.98 KB (2.62%)
  <self>: 67.98 KB (100%)
react-overlays: 64.77 KB (2.49%)
  react-prop-types: 2.94 KB (4.53%)
    <self>: 2.94 KB (100%)
・・・
```
O(1)でリストにデータを追加する方法

Rで、リストにO(1)で要素を追加したいときにどうするかという話。
簡単なやり方として、こういうイディオムがある。

```r
l <- list()
l <- c(l, list(1:3))
```

しかし、これはリストのコピーを作成するため、O(リストの長さ)の時間がかかってしまう。ちなみにappendを使ったとしても同様にO(リストの長さ)の時間がかかる。まぁリストの長さが短い時はこれでもいいのだけど、長いリストに要素を追加したいときは困る。
参考ページ: [Append an object to a list in R in amortized constant time?](http://stackoverflow.com/questions/2436688/append-an-object-to-a-list-in-r-in-amortized-constant-time)
O(1)にするには、自分でデータ構造を作らなければならないようだ。以下Stack Overflowよりコードを引用。
まずこういう関数を作って

```r
expandingList <- function(capacity = 10) {
    buffer <- vector('list', capacity)
    length <- 0

    methods <- list()

    methods$double.size <- function() {
        buffer <<- c(buffer, vector('list', capacity))
        capacity <<- capacity * 2
    }

    methods$add <- function(val) {
        if(length == capacity) {
            methods$double.size()
        }

        length <<- length + 1
        buffer[[length]] <<- val
    }

    methods$as.list <- function() {
        b <- buffer[0:length]
        return(b)
    }

    methods
}
```
こうすれば

```r
> l <- expandingList()
> l$add("hello")
> l$add("world")
> l$add(101)
> l$as.list()
[[1]]
[1] "hello"

[[2]]
[1] "world"

[[3]]
[1] 101
```
O(1)で要素を追加できる。


でもCRANを探せばこういうデータ構造が入ってるパッケージが既にありそう…。誰か知ってたら教えて下さい。
Githubと改行文字


# 結論
Githubは **ファイルの改行文字** が変わった場合、正しく差分として出せない場合がある。

## 検証
**CRLF** / **LF** / **CR** で改行されたダミーデータをが入っている、masterに対して
改行文字のみを変更する、PullRequestを複数投げて差分を見てみます。

色々なパターンがあると思いますが、今回は
**CRLF -> LF**
**CR -> LF**

の場合を検証してみます。

## CRLF -> LF の場合
ズドン。
![スクリーンショット 2016-01-28 21.55.23.png](https://qiita-image-store.s3.amazonaws.com/0/102952/b8fa66af-8a6b-e03a-d751-46b4e85a0247.png "スクリーンショット 2016-01-28 21.55.23.png")

**全ての行** が差分となっています。
最後の改行文字が変わったので、納得が出来ます。

windowsで作成したファイルを、Macで開いて編集し、上書きした時などは
エディタによっては起こりうるのではないでしょうか。


## CR -> LF の場合
ドカン。
![スクリーンショット 2016-01-28 21.54.54.png](https://qiita-image-store.s3.amazonaws.com/0/102952/12e784ef-d4a8-0aba-eff8-41326158c483.png "スクリーンショット 2016-01-28 21.54.54.png")

！？
**なんだこれは！(ガタッ**
~~**何もしてないのにGitが壊れた！**~~

いきなりこれです。
> -[^M  {^M    "_id": "56aa0b7ee64843b8df9bd9bf",^M    "index": 0,^M ...(略)

の様な、気の利いた差分は **一切出ません。**


# 所感
~~改行コードぐらいGithub上で吸収して、変な差分出さないで欲しい。~~
あまり普段は意識する事が無い、ファイルの改行コードにも気をつけようと思いました。

**お使いのエディタで、何かのショートカットが偶然押されてしまい** 
更に
**ちょっとした作業だからと、git diffで差分を確認しないでcommit/pushした場合**
とかに起こってしまう可能性があるかもしれません。


滅多に無いレアケースですが、偶然身の回りで起こって驚きました。
ご注意あれ。
Python 文字列反転

文字列や配列の順番を反転させたい時ありますよね。
そういう時は次のようにすると反転できます。

以下サンプル
```lang:reverse.py
alpha = "abcdefghijklmnopqrstuvwxyz"
alpha = alpha[::-1]
print alpha
```
zyxwvutsrqponmlkjihgfedcba

詳しくは
http://d.hatena.ne.jp/redcat_prog/20111104/1320395840
JAVA (tomcat) でセッションをDBに持つ方法

最近仮想化の技術が進歩して、AWSやAzure等のIaasも普及してきた。。。

今までは基本はサーバ1台で運用し、バックアップでクラスタ化するとかしないとか。。。
でも仮想化とかIaaSとかで、WEBサーバが1台で運用している時もあれば、
3台で運用している時もあって時間帯とかでスケールアップすることも容易になってきた。

そんな時、sessionのデータをDBに持ったりすれば便利だなと・・・
SqlServerだったら容易にできるのになと・・・

Java（tomcat）でできないか調べてみました。。。

出てきました。

context.xmlに以下の内容を記載すると、SessionのデータがDBに格納することができました。

```
<Manager sessionIdLength="10" className="org.apache.catalina.session.PersistentManager"
      distributable="true"
      duplicates="0"
      saveOnRestart="false"
      maxActive="100"
      maxActiveSessions="100"
      minIdleSwap="0"
      maxIdleSwap="0"
      maxIdleBackup="0"
      maxInactiveInterval="0"
      sessionCounter="0" >
    <Store className="org.apache.catalina.session.JDBCStore"
        checkInterval="1"
        connectionURL="jdbc:mysql://localhost:3306/sessiondb?user=root&amp;password=pass"
        driverName="org.gjt.mm.mysql.Driver"
        sessionAppCol="app_name"
        sessionDataCol="session_data"
        sessionIdCol="session_id"
        sessionLastAccessedCol="last_access"
        sessionMaxInactiveCol="max_inactive"
        sessionTable="tomcat_sessions"
        sessionValidCol="valid_session" />
  </Manager>
```

もちろんDBにSessionデータを格納する必要がありますが、
テーブルの指定や格納するカラムの指定もできてかなり便利です。

ただちょっと遅くなったような・・・
ま～原因は後々調べるとして、

２つはまりました。connectionURLの&amp;の部分です。
エスケープすることを忘れていて、DBに接続できません
て出た。。。。

もう一つはJDBCのjarファイルがTomcatのlib配下に入っていないため、ClassNotFoundがでました。。

今回はちょっとメモ程度の投稿です。

以上
The innodb_system data file~でmacのmysqlが動かない場合の対処法


# まとめ

- `/usr/local/var/mysql`の所有権が自分になってしまっていないか
	- なっていたら所有権を変える
	- 消して入れ直しても所有権がおかしいのでhomebrewがおかしい状態？


# 発生した問題
homebrewで mysql: stable 5.7.10 をインストールしていましたが、気がついたらmysqlが起動しなくなっていました。

```
% mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/PCNAME.local.pid).
```


# 原因調査
/usr/local/var/mysql/PCNAME.local.errの最後のほうを見てみると、以下のようなエラーが出ていました。

```
2015-12-20T13:26:05.997337Z 0 [Note] InnoDB: Uses event mutexes
2015-12-20T13:26:05.997344Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2015-12-20T13:26:05.997350Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2015-12-20T13:26:05.997639Z 0 [Note] InnoDB: Number of pools: 1
2015-12-20T13:26:05.997808Z 0 [Note] InnoDB: Using CPU crc32 instructions
2015-12-20T13:26:06.085311Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2015-12-20T13:26:06.102112Z 0 [Note] InnoDB: Completed initialization of buffer pool
2015-12-20T13:26:06.119514Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2015-12-20T13:26:06.119558Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2015-12-20T13:26:06.119587Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2015-12-20T13:26:06.428463Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2015-12-20T13:26:06.428500Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2015-12-20T13:26:06.428511Z 0 [ERROR] Failed to initialize plugins.
2015-12-20T13:26:06.428517Z 0 [ERROR] Aborting
```


Errorとして、

```
The innodb_system data file 'ibdata1' must be writable
```
と出ていることから、対象のファイルのアクセス権が問題のようです。

# 解決方法

該当ファイルがある/usr/local/var/mysql/を確認したところ、
ほぼ全てのファイルの所有権が ログインユーザ:admin になっていたため、

```
sudo chown -R _mysql /usr/local/var/mysql
sudo chmod -R o+rwx /usr/local/var/mysql
```

を実行することで問題なく起動するようになりました。

# 補足

問題を解決する過程で一度mysqlをアンインストールし、
かつ`/usr/local/var/msylq`をフォルダごと消して再インストールしたにも関わらず、このエラーが解決しなかったため、
もしかしたら今のhomebrewが設定する所有権がおかしい状態なのかもしれません。
Mac OSX El Capitan での ~/.zshenv の扱いについて

# El Capitanにアップグレードしてから，zshのPATHの様子がおかしい

調べてみると，/etc/zprofile が作られていて，その中身は

```sh:/etc/zprofile
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
   eval `/usr/libexec/path_helper -s`
fi
```

のようにpath_helperを実行させるものだった。
このpath_helperは

__「/etc/pathsおよび/etc/paths.d/*からPATHを作り出し、元からあったPATHから重複を除いたものを後ろにつける」__

という~~余計な~~ことをしてくれるものらしく，/etc/zprofileは，~/.zshenvより後に読み込まれるため，せっかくせっせと~/.zshenvにPATHなどを設定していても書き変えられてしまう。

# 解決法

1. ~/.zshenvではなく~/.zshrcでPATHの設定をする。
 これをするとせっかく.zshenvと.zshrcを使いわけてる意味がなくなる。

2. /etc/zshprofileの中身をコメントアウトする。
 あんまりシステムデフォルトを変えたくはないが，こちらで対処。

# 追記
- 解決法2.の場合，/etc/paths,/etc/paths.d/内に置いてあるPATH設定が読み込まれなくなるので，自分で読み込むようにした方がよいのかも。
というわけで export PATH する直前に

```sh:~/.zshenv
eval `/usr/libexec/path_helper -s`
```
を付け加えることにしました。
つまりpath_helperと~/.zshenvのPATH設定の順序を逆にしたことになります。
もっとスマートな解決法を知ってたら誰か教えてください。

- 下のyudai-nktさんのコメントにある方法が一番すっきりして良さそうです。つまり，
/etc/zprofileは書き変えず，

```sh:~/.zshenv
setopt no_global_rcs
```

をつけ加える。

## 参考

OSXでのzshにおけるPATH設定 
http://hayajo.tumblr.com/post/12281915216/osx%E3%81%A7%E3%81%AEzsh%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bpath%E8%A8%AD%E5%AE%9A

Fixing your zsh path after upgrading to El Capitan.
http://richa.avasthi.name/blog/2015/10/fixing-your-zsh-path-after-upgrading-to-el-capitan/

path_helperについて。Mac OSX 版
http://takuya-1st.hatenablog.jp/entry/2013/12/14/040814
[Python3]日付の差分を取得する

日数計算という便利なサイトがあります。
http://keisan.casio.jp/exec/system/1177658154

これっぽいのを再現します。

```lang:calc_days.py
import datetime
a = datetime.date(2015, 4, 1)
b = datetime.date(2016, 1, 25)
print((b-a).days)
# 299
```
ちなみにこの値は、初日を含んでいないので、〜日目の表記をしたい場合は+1しましょう。
Googleフォーム送信後に、フォームの入力内容を本文に活用してメールを送信させる

# メモの内容

Googleフォームを使うことで、お仕事の依頼するためのフォームを簡単に作ることができます。
今回は、フォームから入力があった場合に、依頼内容をもとにしたメールを関係者に送信するスクリプトを作成しました。

# スクリプトの作成

Googleフォーム作成後、GoogleSpreadSheetが作成されます。
そこから[ツール]-[スクリプトエディタ...]にて、GoogleAppsSciptsを作成することができます。
下記のようなスクリプトを作成して、現在のプロジェクトのトリガーにて、
イベントを"スプレッドシートから", "フォーム送信時"に設定してあげると、
フォームから入力送信後、下記にスクリプトが実行されて、`MailApp.sendEmail`で設定したアドレスにメールが送信されます。

```gas
function notificationSendEmail(){
  var sheet = SpreadsheetApp.getActive().getSheetByName("フォームの回答 1");
  var datarange = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn());
  var data = datarange.getValues();

  var body_mail = "";
  // emailのbodyの内容をつくる
  // ...
  // ...
   
  for (var i = 0; i < data.length-1; i++) {
    // data[i][x] で i行目の x番目のGoogleSpreadsheetの値を取得する
    // 下記では、emailのbodyに上記の値を挿入して文章を作りたいので、data[i][x].toString()を使用しています。
    var col1 = data[i][0].toString();
    var col2 = data[i][1].toString();
    var col3 = data[i][2].toString();
    
    //
    // body_email に上記col1, 2, 3 を加えて文章をつくる
    //
  
    var subject;  
    subject = "件名"

    // メール送信
    MailApp.sendEmail("recipient@example.com",
  	                            subject,
 	                            body_mail, 
	                            {
	                              name: 'Automatic Emailer Script',
	                              noReply: false,
	                              replyTo: "reply-to@example.com",
	                              cc: "cc@example.com"
	                           });
	
    Logger.log("ログの内容を記載する");
}
```

# さいごに

次回のメモでは、この後、[trello](https://trello.com/)への連携部分も書き残したいと思います。
vue-validatorの対応バージョンメモ

## 対応表（2016/01/28調べ）

| Vue.js   | vue-validator      |
|:---------|:-------------------|
| 0.x      |1.x                 |
| ~1.0.13  |動作するバージョンなし？|
| 1.0.14~  |2.0.0-alpha.x       |

※詳細は未検証です。

## 最新バージョン（2016/01/28時点）

| Vue.js   | vue-validator      |
|:---------|:-------------------|
| 1.0.15   |2.0.0-alpha.16      |


## インストール
　2016/01/28時点で[vue-validator](https://github.com/vuejs/vue-validator)を `npm install vue-validator` するとインストールされるバージョンは `1.4.4` です。

```json:package.json
"dependencies": {
  "vue-validator": "^1.4.4"
}
```

しかし、
> vue-valudator 1.x is not working with VueJS 1.x. Use vue-validator 2.x.

らしい[^1]ので、 2.x系のvue-validatorをインストールします。


```shell-session
$ npm install vue-validator@^2.0.0-alpha --save
とか
$ npm install vue-validator@2.0.0-alpha.16 --save
とか
```
もしくは

```json:package.json
"dependencies": {
  "vue-validator": "^2.0.0-alpha"
}
```
と書いて、

```shell-session
$ npm install
```

　ただし、逆にvue-validator 2.x（というか2.0.0-alpha.16の時点で）は Vue.jsの`1.0.14+`が必須[^2]なので、`1.0.14`未満を使用している場合は、`1.0.14`以上にアップデートしましょう。

### [参考] 依存関係不整合時のエラー例

`vue@1.0.12` と `vue-validator@2.0.0-alpha.16` だと

```
Uncaught TypeError: Cannot read property 'push' of undefined
```

`vue@1.0.12` と `vue-validator@1.4.4` だと

```
Uncaught TypeError: Vue.parsers.directive.parse is not a function 
```


[^1]: https://github.com/vuejs/vue-validator/issues/124
[^2]: https://github.com/vuejs/vue-validator#requirements
Node.jsからChatworkのタスクを追加するメモその２


[前回記事](http://qiita.com/n0bisuke/items/61b15080aac41d12ebbe)の続きです。

タスク追加にあたり、メンバーのリストを取得してきてから追加します。

APIドキュメントはこちらです。

http://developer.chatwork.com/ja/endpoint_rooms.html#GET-rooms-room_id-members

[[JavaScript] 非同期処理のコールバック地獄から抜け出す方法](http://qiita.com/LightSpeedC/items/7980a6e790d6cb2d6dad)を参考にasync/awaitのaaを使って同期的に処理を書いてみます。

```bash
$ npm i aa request
```

```chtask.js
'use strict';

if (!process.env.chtoken) {
    console.log('Error: Specify token in environment');
    process.exit(1);
}

let aa = require('aa');
let request = require('request');
const ROOM_ID = '43484166';

//タスク追加
function addTask(text, userList){
  let task = {
    body: text,
    limit: 0,
    to_ids: userList,
  };

  let options = {
      url: `https://api.chatwork.com/v1/rooms/${ROOM_ID}/tasks`,
      headers: {
          'X-ChatWorkToken': process.env.chtoken
      },
      form: task,
      json: true
  };

  return new Promise((resolve,reject) => {
    request.post(options, (error, response, body) => {
      if(error) reject('error: '+ response.statusCode);
      resolve(body);
    });
  });

}

//メンバー取得
function getMember(){
  let options = {
      url: `https://api.chatwork.com/v1/rooms/${ROOM_ID}/members`,
      headers: {
          'X-ChatWorkToken': process.env.chtoken
      },
      json: true
  };

  return new Promise((resolve,reject) => {
    request.get(options, (error, response, users) => {
      if(error) reject('error: '+ response.statusCode);
      let userList = '';
      for (let i = 0, len = users.length; i < len; i++) {
        userList += users[i].account_id;
        if(len !== i+1) userList += ',';
      }
      resolve(userList);
    });
  });
}

//同期実行
aa(function*() {
  let userList = yield getMember();
  let res = yield addTask('message', userList);
  return res;
}).then(
  function (val) { console.info('ok: ',val); },
  function (err) { console.error('ng: ',err); }
);

```

実行してみます。

```bash
$ chtoken=xxxxxxxxx node chtask.js
```

こんな感じでタスク追加できました。

![](https://i.gyazo.com/a9cf108ef1720b99bd9c33c9e64f7ca9.png)


APIを二回投げるあたりは非同期処理の練習になりますね〜
tar zxvfの覚え方

1. キーボードの左下を見る.
2. `Z` `X` `C` `V`が並んでいる.
3. 大体アルファベットの後ろの文字だが, `C`だけ前の方の文字なので仲間外れ.
4. 仲間外れの`C`は列から弾き出されて右上の`F`を押してしまう.
5. `Z` `X` `V` `F`の完成.

※ちゃんと意味で覚えよう.
ADLはクラステンプレートのインスタンス化とは無関連

# まずADLって何よ？

関数呼び出し式において、関数名についてスコープ解決演算子 `::` を使用しなかった時、実引数の存在する名前空間が探索される。 [^1]
この時、引数がクラステンプレートであれば、テンプレート引数の型が定義されている名前空間も探索対象となる。

[^1]: 大幅に簡略化して書いている。厳密な定義ではない。

```cpp
#include <iostream>
#include <utility>
using namespace std;
namespace ns
{
    struct s{};
    void swap( s, s ) { cout << "ns" << endl; }
}

int main()
{
    using std::swap;
    ns::s v;
    swap( v, v );
}
```

# クラステンプレートのインスタンス化

クラステンプレートをインスタンス化する時、そのテンプレート引数の型の定義が定義されている名前空間を探索対象にはしない。
何故なら、関数呼び出し式ではないからだ。
例えば、以下のコードはビルドが通らない。

```cpp
#include <limits>
namespace ns
{
    template< class C >
    struct numeric_limits {};
    struct s {};
    template<>
    struct numeric_limits< s >
    {
        static constexpr const bool is_exact = true;
    };
}

int main()
{
    using std::numeric_limits;
    static_assert( numeric_limits< ns::s >::is_exact, "test" );
}
```

# どうすればいいのか

臆せず堂々と特殊化しろ。名前空間 `std` だろうがテンプレートの特殊化なんだ、未定義の動作にならないはずだ！ [^2]

[^2]: 名前空間 `std` 内に名前を定義する事はオーバーロードを含め、その動作は定義されない。ただし、テンプレートの特殊化は例外である。

# 参考
- [Argument-dependent lookup - cppreference.com]
(http://en.cppreference.com/w/cpp/language/adl)
- [Unqualified name lookup - cppreference.com]
(http://en.cppreference.com/w/cpp/language/unqualified_lookup)
- [std名前空間にテンプレートの特殊化を追加する - Cry’s Diary]
(http://d.hatena.ne.jp/Cryolite/01000227)
【Visual Studio】ブロックコメント挿入時に折りたたみ解除を回避する

Visual Studioで既存のコードをブロックコメントでコメントアウトすると、素早く閉じるコードを入力しないと後ろのコードの折りたたみが解除されてしまう。
この動作を回避する方法はとても簡単だ。

# 回避方法

**先に閉じるコードを入力する**ことで、回避できる。

```csharp:hoge.cs
this.hoge.Text = "hoge"; */
```

こうすると、「*/は無効です*」とエラーが表示されるが、折りたたみ解除が回避できる。

```csharp:hoge.cs
/* this.hoge.Text = "hoge"; */
```

最後に開始するコードを入力すると、無事完了する。
Laravel Queue で__PHP_Incomplete_Classが出た時に確認したいこと 


Laravel Queueはlistenのコマンドを常時走らせる事によって、メール等を非同期で送信することができる。
その際に、今まで普通に動いていたのに、いつの間にか突然下記のようなエラーが出てきた。
```[InvalidArgumentException]
  No handler registered for command [__PHP_Incomplete_Class]
```

ドキュメントを見ると、
```
アプリケーション内でオブジェクトをシリアライズして再利用する場合のお勧めは、 そのクラスの定義をアプリケーション全体で include することです。 クラスの定義が存在しなければオブジェクトの復元に失敗してしまいます。 その場合、PHP は __PHP_Incomplete_Class_Name クラスのオブジェクトを返します。このオブジェクトにはメソッドは一切なく、 使い道がなくなってしまいます。 
```
http://php.net/manual/ja/language.oop5.serialization.php

ということで、クラスを生成できなかったのが問題ということのよう。

いろいろ調べた結果、jobの定義しているクラスのnamespaceの大文字小文字の問題だったよう
phpcsを使っていると、

```
App\Jobs\Hoge
↓
app\Jobs\Hoge
```
に変更を促されるが、jobをfireしているクラスでは
```
namespace Illuminate\Queue;
```
であり、app\Jobs\Hogeを展開しようとすると
Illuminate\Queue\app\Jobs\Hoge
を展開しようとしてエラーが出るよう。

composer.jsonでは、App\
をpsr4読みしているので、基本的にAppを使うようにしたほうがいいみたい。