OmniAICreator/Qiita-1.07M huggingface dataset:
型推論器を作る(2) 単相の型推論①型取得と単一化


環境変数を保存する為のマップ用モジュールを作ります。

```ocaml:
module M = Map.Make(String)
```

型取得(typeof)
型推論の基本は、式をトラバースして、型を取得する計算を行う事です。

```ocaml:
  let rec typeof env e =
    match e with
    | Var x -> M.find x env
    | Lam(x,e) ->
      let tx = newvar() in
      let te = typeof (M.add x tx env) e in
      TArrow(tx,te)
    | App(e1,e2) ->
      let te1 = typeof env e1 in
      let te2 = typeof env e2 in
      let t = newvar() in
      t
    | Let(x,e1,e2) ->
      let te1 = typeof env e1 in
      typeof (M.add x te1 env) e2
```

この計算をする場合に、Appの関数呼び出しの箇所がありますが、
このApp(e1,e2)のe1の型をte1,e2の型をte2とすると、e1の型は関数の型のはずで、
e1が例えばintを文字列に変換する関数でe2の型がintならe1の型はint->stringでe2の型はintです。
そして、e1にe2を適用した型はstringになります。

```ocaml:
te1 = int -> string
te2 = int
t = string
```

です。

```ocaml:
te2 -> t = te1
```

という方程式が作れる事に注目しましょう。
te2 -> tは TArrow(te2, t)と書けるので、仮にTArrow(te2, t)とte1の型は同じにしてくれる関数unifyというものがあったとすれば、

```ocaml:
    | App(e1,e2) ->
      let te1 = typeof env e1 in
      let te2 = typeof env e2 in
      let t = newvar() in
      unify t (TArrow(te2, t));
      t
```
と書く事ができます。

このunifyは日本語では単一化といって、以下のように実装出来ます。

```ocaml:
  let rec unify t1 t2 =
    match (t1, t2) with
    | (t1,t2) when t1 == t2 -> ()
    | (TVar({contents=Unbound _} as tv), t)
    | (t, TVar({contents=Unbound _} as tv)) ->
      tv := Link t
    | (TVar({contents=Link t1}), t2)
    | (t1, TVar({contents=Link t2})) ->
      unify t1 t2
    | (TArrow(l1,l2),TArrow(r1,r2)) ->
      unify l1 r1;
      unify l2 r2
```

t1とt2が同じなら何もしません。

```ocaml:
    | (t1,t2) when t1 == t2 -> ()
```

どちらかがまだ型が割り当てられていなければ、片方に、もう片方をコピーします。

```ocaml:
    | (TVar({contents=Unbound _} as tv), t)
    | (t, TVar({contents=Unbound _} as tv)) ->
      tv := Link t
```

コピーした結果がどちらかに入っていたら、その中身を単一化します。

```ocaml:
    | (TVar({contents=Link t1}), t2)
    | (t1, TVar({contents=Link t2})) ->
      unify t1 t2
```

共に関数の型なら、 その中身をチェックします。

```ocaml:
    | (TArrow(l1,l2),TArrow(r1,r2)) ->
      unify l1 r1;
      unify l2 r2
```

最も簡単な単一化はこれだけで行う事が出来ます。
Docker で SSH 接続可能なコンテナ (CentOS) を作成する

Docker で SSH 接続可能なコンテナを作成する方法のメモ。コンテナの OS は CentOS です。

packer を使った方法は [すでに先に書かれて](http://qiita.com/ikuyamada/items/9cce2fa28b17c8d794e3) いましたが、ここでは Dockerfile を使って作る方法を書きます。

## ssh-ignorekey エイリアス

コンテナを作り直しても、 known_hosts ファイルによって接続エラーにならないように以下のエイリアスを定義しています

```sh
alias ssh-ignorekey='ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no'
```

## 空パスワードまたは指定したパスワードで root ログインできるコンテナを作りログインする方法

1. Dockerfile

    ```Dockerfile
    FROM centos
    
    RUN yum -y install initscripts MAKEDEV
    
    RUN yum check
    
    RUN yum -y update
    
    RUN yum -y install openssh-server
    
    # 空パスワードの場合は以下をコメントアウト
    # RUN sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config
    
    RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
    RUN sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config
    
    RUN /etc/init.d/sshd start

    # 空パスワードの場合は以下をコメントアウト
    # RUN passwd -d root

    # 任意のパスワードの場合は以下をコメントアウト & パスワードを書き換える
    # RUN echo 'root:root' | chpasswd
    
    EXPOSE 22
    
    CMD /sbin/init
    ```

1. コンテナイメージ作成

    ``docker build -t ssh-enabled .``

1. コンテナ起動

    ```sh
    CONTAINER_ID=$(docker run -P -d ssh-enabled) && SSH_PORT=$(docker port $CONTAINER_ID 22 | cut -d: -f2) && SSH_HOST=$(docker port $CONTAINER_ID 22 | cut -d: -f1);
    ```

1. SSH ログイン

    ```sh
    ssh-ignorekey -p $SSH_PORT root@$SSH_HOST
    ```


## 鍵認証で root ログインできるコンテナを作りログインする方法

1. Dockerfile

    ```Dockerfile
    FROM centos
    
    RUN yum -y install initscripts MAKEDEV
    
    RUN yum check
    
    RUN yum -y update
    
    RUN yum -y install openssh-server
    
    RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
    RUN sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config
    
    RUN /etc/init.d/sshd start
    
    RUN sed -ri 's/^(root):[^:]*:(.*)$/\1:*:\2/' /etc/shadow
    
    RUN ssh-keygen -f ~root/.ssh/id_rsa -t rsa -b 2048 -N ''
    RUN cp ~root/.ssh/id_rsa.pub ~root/.ssh/authorized_keys
    RUN chmod 0600 ~root/.ssh/authorized_keys
    
    EXPOSE 22
    
    CMD /sbin/init
    ```

1. コンテナイメージ作成

    ``docker build -t ssh-enabled .``

1. コンテナ起動

    ```sh
    CONTAINER_ID=$(docker run -P -d ssh-enabled) && SSH_PORT=$(docker port $CONTAINER_ID 22 | cut -d: -f2) && SSH_HOST=$(docker port $CONTAINER_ID 22 | cut -d: -f1);
    ```

1. 鍵コピー

    ```sh
    docker cp $CONTAINER_ID:/root/.ssh/id_rsa $CONTAINER_ID
    ```

1. SSH ログイン

    ```sh
    ssh-ignorekey -i $CONTAINER_ID/id_rsa -p $SSH_PORT root@$SSH_HOST
    ```
UbuntuにJenkinsをインストールする

環境: Ubuntu Server 14.04LTS

## JDKのインストール

OracleJDK7をインストールします。

```
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer
```

## Jenkinsのインストール

Jenkinsをインストールします。

```
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
```

## Nginxのインストールとリバースプロキシの設定

Jenkinsデフォルトでは8080番ポートで稼働するので、
Nginxを使ってホストから80番ポートからアクセスできるようにします。

### Nginxのインストール
```
$ sudo apt-get install nginx
```

### リバースプロキシの設定

Nginxの設定ファイルを以下のようにします。

```
$ cat /etc/nginx/sites-available/default
server {
	listen 80 default_server;
	listen [::]:80 default_server ipv6only=on;

	root /usr/share/nginx/html;
	index index.html index.htm;

	# Make site accessible from http://localhost/
	server_name localhost;

	location / {
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_redirect off;

		if (!-f $request_filename) {
			proxy_pass http://localhost:8080;
			break;
		}
	}
}
```

### Nginxの再起動

```
$ sudo service nginx restart
```

### Jenkins起動の確認

ブラウザでhttp://localhost/にアクセスして、Jenkinsが起動していることを確認します。

![jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/34365/7dfe3b91-a578-5b87-7b36-d8d707120cc1.png)
AutolayoutのAspect Ratio固定でリサイズしたUIViewの子Viewを比率を合わせてリサイズする

Storyboardを使って、比率を維持しながらsubviewもリサイズするのに苦労したのでまとめ。

# 要件

4インチでは全画面で表示しているUIViewを、3.5インチの端末で起動した時に縦横比率を保ったまま、横に余白を開ける。
子Viewは、親Viewが縮小された比率に合わせて大きさ、場所を調整したい。

# 親Viewを3.5インチで縦横比率を保ってセンタリング

まずStoryboardで、UIViewControllerの中に親ViewとなるUIView（水色）を載せ、子ViewとなるUILabel（黄緑）を100x100のサイズで載せました。

普通に3.5インチ端末で起動すると、下が切れます。

![スクリーンショット 2014-06-22 0.50.39.png](https://qiita-image-store.s3.amazonaws.com/0/9490/9a0489f3-049b-f46f-b252-5a8b6f3d14f7.png)

左右に余白を開けて、縦横の比率(320x568)を固定したまま縮小するため、AutolayoutのPinで、上下を端に固定、`Aspect Ratio`にチェックをして`Add 3 Constraints`します。

![写真 2014-06-22 1 04 27.jpg](https://qiita-image-store.s3.amazonaws.com/0/9490/cfcaf6ef-85e9-5e9f-18ff-18965675c800.jpeg)

これだけだと左上を中心になってしまうので、AutolayoutのAlignで、センタリング指定します。`Horizontal Center in Container`にチェックをして`Add 1 Constraint`します。

![写真 2014-06-22 1 07 36.jpg](https://qiita-image-store.s3.amazonaws.com/0/9490/c43c3f21-0c7a-c44b-0bf9-c40f60a1de4f.jpeg)

この状態で起動すると、親View（水色）は希望通りの大きさで3.5インチ画面内に比率を保って表示されます。

![スクリーンショット 2014-06-22 0.53.51.png](https://qiita-image-store.s3.amazonaws.com/0/9490/7203f0ae-fc3d-e0d7-635e-bcedc933ecd5.png)

# 子ViewのAutolayout指定

子View（黄緑）は左上からの座標のままなのでまだずれています。これを、親Viewが縮小した比率を保ってセンタリングしていきます。

まず、AutolayoutのPinで上下左右を親Viewに対して固定します。

![写真 2014-06-22 1 15 02.jpg](https://qiita-image-store.s3.amazonaws.com/0/9490/e60a11af-e646-661d-7fa7-2789e5f0c2ad.jpeg)

この状態で起動すると、親Viewの四辺からの絶対値指定なので、親Viewが小さくなった分、子Viewも小さくなってしまいます…

![スクリーンショット 2014-06-22 1.13.24.png](https://qiita-image-store.s3.amazonaws.com/0/9490/972472ed-2f0b-1e36-086f-d323849fa5d9.png)

これを調整していきます。

## 上

まず、上のConstraintの線を選択し、Attributes Inspectorから
Top位置を親ViewのBottom（=Height）との比率110:568（=4インチで表示されるのと同じ比率）となるよう指定します。

Before:
![スクリーンショット 2014-06-22 1.18.56.png](https://qiita-image-store.s3.amazonaws.com/0/9490/58d87553-a4f3-d700-70bc-26f5db899dc9.png)

After:
![2014-06-22 01.21.45.png](https://qiita-image-store.s3.amazonaws.com/0/9490/cb8850cc-ab8f-bedf-589c-57e7572ae170.png)

同じ要領で、左右と下も、Bottom（=Height）、Trailing（=Width）と考えて、親Viewの高さや幅 x 4インチでの表示位置の比率 でConstraintを設定していきます。

## 下

Before:
![スクリーンショット 2014-06-22 1.27.27.png](https://qiita-image-store.s3.amazonaws.com/0/9490/c0a90e1e-7f2d-cfba-a288-59bce9870b85.png)

コツは、`Reverse First and Second Item`で子Viewを基準にすること。
![スクリーンショット 2014-06-22 1.27.47.png](https://qiita-image-store.s3.amazonaws.com/0/9490/1c1734ed-c5c7-f98b-bf31-0976a4e6573f.png)

After:
![スクリーンショット 2014-06-22 1.28.27.png](https://qiita-image-store.s3.amazonaws.com/0/9490/a6d4c35c-b88c-1814-eb6c-9e63207dc409.png)

## 左右
同じ要領なのでAfterだけ。

左:
![スクリーンショット 2014-06-22 1.31.48.png](https://qiita-image-store.s3.amazonaws.com/0/9490/4eebca8b-8ff2-3dd7-fe3c-e135f00a6b6b.png)

右:
![スクリーンショット 2014-06-22 1.32.41.png](https://qiita-image-store.s3.amazonaws.com/0/9490/cb84472b-8e72-381b-d39f-02923a20e805.png)

# 結果

比率を保ったまま子Viewが小さく表示できました！
4インチシミュレータの様な感じ。
（フォントサイズは別途調整してね）

![スクリーンショット 2014-06-22 1.32.55.png](https://qiita-image-store.s3.amazonaws.com/0/9490/ffc9727a-ccc0-0e96-0800-43420f734213.png)
Arelで足したカラムのAS付けが出来ない？

以下の方法でASで名づけたいんですが、出来ないのかな。

```
user_table = User.arel_table
(user_table[:a_count] + user_table[:b_count]).as("score")
> (user_table[:a_count] + user_table[:b_count]).as("score")
NoMethodError: undefined method `as' for #<Arel::Nodes::Grouping:0x007f7aeac179f8>
```
Hashの値が数字を表すStringの時にIntegerとBigDecimalに変換するメソッド

メモ。階層があっても再帰的に探してくる。

```rb
def foo(h)
    h.each{|k, v| h[k] = filter_value(v) if v.class == String }
    h.each do |k, v|
        if v.class == Hash
            foo(v) 
        end
    end
end
```
net/httpの統計を取る


ぱっと調べた所net/httpの統計情報：例えばどのぐらい書き込んだか、読み込んだか、statusは何だったのかというのを取るようなinterfaceがnet/httpにはなかったりします。

別途monitoring用のAgentを使ってもいいのですが、networkのtrafficだけならまだしもHTTPのStatusなどを取りたいといった場合に構成が面倒になるのでサーバー自体で統計を取る仕組みをつくってしまうのが運用上楽かと思います。

## アプローチ

http.ListenAndServeでは細かい指定ができないのでhttp.Serverにnet.Listenerをかぶせたものを渡してあげればごにょごにょすることができます。

HTTPのStatusに関しては特にAPIがないようなのであまりよくない手法ですがReflectionで取るのが楽なようです。


```go
package main

import (
	"fmt"
	"net"
	"net/http"
	"reflect"
	"time"
)

// trace bytes written, connection count.
type TracingListener struct {
	net.Listener
}

type TracingConn struct {
	net.Conn
}

func (self TracingListener) Accept() (c net.Conn, err error) {
	conn, err := self.Listener.Accept()
	if err != nil {
		return nil, err
	}

	// TODO: connectionをincrementする
	return TracingConn{conn}, nil
}

func (self TracingConn) Close() error {
	// TODO: connectionをdecrementする

	return self.Conn.Close()
}

func (self TracingConn) Read(b []byte) (int, error) {
	// TODO: len(b)の大きさだけreadを増やす
	return self.Conn.Read(b)
}

func (self TracingConn) Write(b []byte) (int, error) {
	// TODO: len(b)の大きさだけwriteを増やす

	return self.Conn.Write(b)
}

func getStatusCode(w http.ResponseWriter) uint64 {
	var status int64 = 0

	field := reflect.ValueOf(w).Elem().FieldByName("status")
	if field.Kind() == reflect.Int {
		status = field.Int()
	}

	return uint64(status)
}

type Handler struct {
}

func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	begin := time.Now()

	//実際の処理はかぶせちゃったほうが楽かも
	fmt.Fprint(w, "Hello")

	end := time.Now().Sub(begin)
	status := getStatusCode(w)
	fmt.Printf("Status: %d, Elapsed: %f\n", status, end.Seconds())
}

func main() {
	h := &Handler{}
	listener, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	listener = TracingListener{listener}
	srv := &http.Server{
		Handler: h,
	}
	srv.Serve(listener)
}
```

もっといい方法あったらだれか教えて！
RailsでRakeタスクをconsoleから呼び出す方法

Railsの開発ではconsole(というかdebugger)が必需品ですよね。

となると、当然、バッチ処理用に作るRakeタスクもconsoleでデバッグしたくなるわけで。
実はこれまで、consoleからはRakeタスクをキックできないと思っていたので、実際の処理をModel.execに書いてRakeタスクからはそれを呼ぶ形で書いてたんですが、調べたら簡単に出来ました。

```rb:consoleを起動した後
require 'rake'
Rails.application.load_tasks
Rake::Task['タスク名'].execute
```

なお、`タスク名`の部分は、namespaceを含んだ形で記述します。
例えば、`inactive_user:destroy_suspended`のような形。
隠しファイル,フォルダを表示する方法


##表示
```
defaults write com.apple.finder AppleShowAllFiles TRUE

//Finder再起動
killall Finder
```
##非表示
```
defaults write com.apple.finder AppleShowAllFiles FALSE
//Finder再起動
killall Finder
```

[参考サイト WEB HORIC](http://webhoric.com/apple/mac/how-to-look-hidden-folder)
空行の削除

# TL;DR
`:v/./d`を実行。

# 概要
空白行を消したいとき、`vim`なら簡単にできます。

# パターン1
1. `:%s/\s*$`で、末尾の空白を削除。
2. `:v/./d`を実行。

末尾の空白がない場合は、`:v/./d`だけでなので**おすすめ**です。

なにより、`/./`が打ちやすい。

# パターン2
`:v/\S/d`を実行。

`/\`が打ちにくいので、私はあまり使わない。

# 例
```
a
{空白行}
b
{空白行}
c
{空白行}
d
```
↓

```
a
b
c
d
```

# まとめてファイルを編集したい場合

```
:argdo %v/./d | update
```
Gitでコンフリクト対処時の便利コマンド検証

  
コンフリクトが発生した時、Gitのコマンドだけで対処できる方法があるらしい。  
[Gitでバイナリファイルがコンフリクトした際の対処方法](http://qiita.com/FiNGAHOLiC/items/34312c5cbd4989fa192c)


`git checkout --theirs 対象ファイル`
  
で、マージ先を採用。

`git checkout --ours 対象ファイル`

で、マージ元を採用。  
というもの。
## 検証してみる
**※結果だけ知りたい人は「コンフリクトさせよう」まで飛ばしてもらって構いません。**
### 準備
簡単なファイルを使って調べてみる。Gitのバージョンは **1.8.4**。
  
リポジトリに **testA.txt**ファイルを置く

```testA.txt
あまみはるか 17
きさらぎちはや 16
ほしいみき 16
はぎわらゆきほ 17
きくちまこと 17
がなはひびき 16
```
  
**のワの＜ファイルの中身に意味はありませんよ**
 
### コンフリクトさせるためのブランチを作る
`[master]git checkout -b songs`
でsongsブランチ作成。
  
んで

```[songs]testA.txt
あまみはるか 乙女よ大志を抱け
きさらぎちはや 蒼い鳥
ほしいみき Relations
はぎわらゆきほ First Stage
きくちまこと 自転車
がなはひびき TRIAL DANCE                          
```
こうしてコミット。
`[songs]git add .`
`[songs]git commit -m "add songs"`
 
準備完了。

### コンフリクトさせよう
masterブランチにsongsブランチをマージ
`[master]git merge songs`
すると

```
Auto-merging testA.txt
CONFLICT (content): Merge conflict in testA.txt
Automatic merge failed; fix conflicts and then commit the result.
```
無事コンフリクト成功。 **やったぜ。**
  
中身を見てみる

```[master]testA.txt
<<<<<<< HEAD
あまみはるか 17
きさらぎちはや 16
ほしいみき 16
はぎわらゆきほ 17
きくちまこと 17
がなはひびき 16
=======
あまみはるか 乙女よ大志を抱け
きさらぎちはや 蒼い鳥
ほしいみき Relations
はぎわらゆきほ First Stage
きくちまこと 自転車
がなはひびき TRIAL DANCE
>>>>>>> songs
```

上がmasterブランチ、下がsongsブランチの内容。

### コマンド使ってみる
やってみる
`[master]git checkout --theirs testA.txt`
すると

```[master]textA.txt
あまみはるか 乙女よ大志を抱け
きさらぎちはや 蒼い鳥
ほしいみき Relations
はぎわらゆきほ First Stage
きくちまこと 自転車
がなはひびき TRIAL DANCE
```
**マージ先（songsブランチ）**が採用された。
  
もう一つのコマンドも使ってみる
`[master]git checkout --ours testA.txt`
こうなった

```[master]testA.txt
あまみはるか 17
きさらぎちはや 16
ほしいみき 16
はぎわらゆきほ 17
きくちまこと 17
がなはひびき 16
```
**マージ元（masterブランチ）**が採用された。予想通り。

## 結論
Gitすごい！！！！
知ってるようで知らない is false な値

# 確認した環境
- Mac Firefox 30.0
- Windows Google Chrome: 91.0.4472.77

# false 扱いされる値

JavaScript で false な扱いをされる値は 6 つある。

`false, 0, "", null, undefined, NaN`

```js
var falseVals = [false, 0, "", null, undefined, NaN];
for (var i in falseVals ) {
  if ( falseVals[i] ) {
    console.log("true val: " + falseVals[i]);
  } else {
    console.log("false val: " + falseVals[i]);
  }
}
```

```
false val: false
false val: 0
false val: 
false val: null
false val: undefined
false val: NaN
```

空文字列が false 扱いされるというのがハマりどころな感じ。

さらに気をつけなきゃいけないところは、ここで false 扱いされる値が == fasle でないというところ。

```js
var falseVals = [false, 0, "", null, undefined, NaN];
for (var i in falseVals) {
  if ( falseVals[i] == false ) {
    console.log("false is equal " + falseVals[i]);
  } else {
    console.log("false is not equal " + falseVals[i]);
  }
}
```

```
false is equal false
false is equal 0
false is equal 
false is not equal null
false is not equal undefined
false is not equal NaN
```

分かってはいても混乱しそう。
ActiveRecord + SQLite3 を使う


Railsではなく、単体でActiveRecordを使ってみたいと思う。

まず、必要なgemをインストールする。

```
$  gem install activerecord
$  gem install sqlite3
```

オンメモリでSQLiteに接続してみる。
ファイルを作りたい場合は、:memory:のとこをファイル名にすればOK.

``` ruby
require "active_record"

# データベースへの接続
ActiveRecord::Base.establish_connection(
  adapter:   'sqlite3',
  database:  ':memory:'
)

# スキーマの設定
class InitialSchema < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
    end
  end

  def self.down
    drop_table :users
  end
end

# マイグレーション
InitialSchema.migrate(:up)

class User < ActiveRecord::Base
end

# モデルを生成
User.create(name: 'hogehoge')

# 表示
p User.all
```

はじめ、ぐぐった結果、データベースへの接続のとこで、adapter: 'sqlite'とかdbfile: ':memory:'という記述が多かったが、自分の環境ではできなかった。どうやら、新しいバージョンでは変更になったもよう。

ちなみに、rubyとgem(activerecord, sqlite3)のバージョンは

- ruby : 2.0.0p247
- activerecord : 4.1.1
- sqlite3 : 1.3.9

を使用した。

参考URL

- http://takuya-1st.hatenablog.jp/entry/20120302/1330709753
Chefでの構築時に"apache"と"nginx"のポートが被ってコケる


Chefでの環境構築の際に、"apache"と"nginx"のポートが80で競合してしまう話。

## レシピについて

apacheとnginxのレシピは下記の通り。

```ruby:apache/recipe/default.rb
# Install Apache
package httpd do
  action   :install
end

# ==== start service
service "httpd" do
  action   [ :enable, :start ]
  supports :reload => true
end

# Create Apache Config
template "/etc/httpd/conf/httpd.conf" do
  source   "httpd.conf.erb"
  owner    "root"
  group    "root"
  mode     00644
  notifies :reload, 'service[httpd]'
end
```

```ruby:nginx/recipe/default.rb
# Install Nginx
package nginx do
  action   :install
end

# ==== start service
service "nginx" do
  action   [ :enable, :start ]
  supports :reload => true
end

# Create Nginx Config
template "/etc/nginx/nginx.conf" do
  source   "nginx.conf.erb"
  owner    "root"
  group    "root"
  mode     00644
  notifies :reload, 'service[nginx]'
end
```

設定ファイルの生成時にポートが下記のように変更される。

|サービス|ポート|
|:--|:--|
|apache|10080|
|nginx|8080|

## Chefの実行順

どうやらChefが走っている状況を見ると、レシピ毎に処理するわけでも、レシピ内を上から処理する訳でも無いみたい。

自分の時はこんな感じだった。

1. **nginx** インストール
2. **apache** インストール
3. **nginx** 起動
4. **apache** 起動
5. **nginx** 設定変更 => リロード
6. **apache** 設定変更 => リロード

どうやら"4"の時に80番ポートが被っているのでこけているようだったが、その場合も"5"は実行できているので、もう一度cookすれば問題ないみたい。("6"は失敗していた)

## 解決方法

以下のようにレシピを変更することで解決できた。
どうやら`notifies`は最後に処理されるようだが、それ以外は記述順のようです。

```ruby:apache/recipe/default.rb
# Install Apache
package httpd do
  action   :install
end

# Create Apache Config
template "/etc/httpd/conf/httpd.conf" do
  source   "httpd.conf.erb"
  owner    "root"
  group    "root"
  mode     00644
  notifies :reload, 'service[httpd]'
end

# ==== start service
service "httpd" do
  action   [ :enable, :start ]
  supports :reload => true
end
```

```ruby:nginx/recipe/default.rb
# Install Nginx
package nginx do
  action   :install
end

# Create Nginx Config
template "/etc/nginx/nginx.conf" do
  source   "nginx.conf.erb"
  owner    "root"
  group    "root"
  mode     00644
  notifies :reload, 'service[nginx]'
end

# ==== start service
service "nginx" do
  action   [ :enable, :start ]
  supports :reload => true
end
```
ClojureScriptでChrome Extensionを作る

まずはleiningenのプロジェクトを作る。


```
lein new chrome-ex-sample
```

続いて、chrome-ex-sample/project.cljを編集する。  
project.cljはこんな感じ。

```clj
(defproject chrome-ex-sample "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [org.clojure/clojurescript "0.0-2234"]]
  :plugins [[lein-cljsbuild "1.0.3"]
            [lein-resource "0.3.6"]
            [no-man-is-an-island/lein-eclipse "2.0.0"]]
  :resource {
             :resource-paths ["resources"],
             :target-path "target/chrome-ex-sample"
            }
  :cljsbuild {
    :builds [{
        ; The path to the top-level ClojureScript source directory:
        :source-paths ["src-cljs"]
        ; The standard ClojureScript compiler options:
        ; (See the ClojureScript compiler documentation for details.)
        :compiler {
          ; :optimizations :whitespace
          :output-to "target/chrome-ex-sample/js/main.js"
          :pretty-print true}}]})
```

上記の設定ではClojureScriptのファイルはchrome-ex-sample/src-cljsに配置することになる。  
作成したClojureScriptのコンパイルは

```
lein cljsbuild once
```
で行う。  
ClojureScript自体はClojureで書くのだけれども、拡張子はcljではなくcljsにする。cljでClojureScriptを書いた場合は、上記のコマンドでJavaScriptにコンパイルしてくれないので注意。

続いて、chrome-ex-sample/src-cljs/main.cljsを作成する。

```clj
(ns chrome_ex_sample)

(defn ^:export hello []
  (js/alert "Hello World!!!"))
(set! (.-onload js/window) hello)
```

さらに、resourcesディレクトリ以下に下記のようにファイルを配置する。

```
chrome-ex-sample
└─resources
  │  manifest.json
  │
  └─icons
          icon.png
```

manifest.jsonは以下のようにする。

```json
{
  "manifest_version": 2,
  "name": "chrome-ex-sample",
  "version": "0.1",
  "description": "Hello World!",
  // icon
  "icons": {
    "16": "icons/icon.png",
    "48": "icons/icon.png",
    "128": "icons/icon.png"
  },
  "content_scripts": [{
    "matches": ["http://www.yahoo.co.jp/"],
    "js": ["js/main.js"]
  }]
}
```

matchesにはextensionが作用するサイトのURLを正規表現で指定するので、上記の設定ではYahooのトップページを開いたときに"Hello World!"が表示される。

一通りファイルを作成した後で、コマンドラインから

```
lein do resource, cljsbuild once
```
と入力すると、target/chrome-ex-sampleにChromeのExtensionに必要なファイルが一式作成される。その後、Chromeの拡張機能の画面から「パッケージ化されていない拡張機能を読み込む」(デベロッパーモードの場合のみ表示される)を押下し、target/chrome-ex-sampleを選択すると、作成したextensionがブラウザに組み込まれる。

パッケージングの仕方とかはまた調べよう。  

参考にしたWEBページ
* https://github.com/clojure/clojurescript
* http://www.casleyconsulting.co.jp/blog-engineer/chrome/chrome%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%81%AE%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95-2/
* https://github.com/m0smith/lein-resource
【Unity】1. Ragidbody, 2. Physical Material, 3. Colliderこいつらの機能を見てみよう

ちょっとメモと、あとこいつらの設定がぱっとみよくわからなかったので、調べて使ってみて動作を確認した

#PhysX
物理エンジンに特化したゲーム開発用のSDK

#1. Rigidbody
直訳で剛体です。要は理想の物体ですね、物理の授業とかで仮想の物質で2点の距離が絶対に一定になるとかいうあれです。
##ドキュメント
http://docs-jp.unity3d.com/Documentation/Components/class-Rigidbody.html


* GameObject が物理特性の制御下で動作する
* 力やトルクを受け、現実的な方向にオブジェクトを動かす
* GameObject は、重力の影響を影響を受けるリジッドボディを含めるか、スクリプティングを通じて加えた力の下で動作するか、NVIDIA PhysX 物理特性エンジンを通じて、その他のオブジェクトと相互作用

![スクリーンショット 2014-06-21 11.28.36.png](https://qiita-image-store.s3.amazonaws.com/0/44698/46ea1d61-b75b-2c72-0216-be19baa46a4a.png)

| 制御 | 内容 |
|:------------:|:--------------|
| Mass|オブジェクトの質量
| Drag|移動の抵抗
| Angular Drag|回転の抵抗
| Use Gravity|重力による移動をするかどうかのフラグ
| Is Kinematic|物理的な動作をスクリプトでコントロールするかどうかのフラグ
| Interpolate|動作の補間方法で、挙動が変な時に前後のフレームから補間させるための設定
| Collision Detection|衝突判定の方法で、オブジェクトのすり抜け防止が可能
| Constraints|Position(移動)、Rotation(回転)の拘束設定。


#2. Physic Material
## ドキュメント
http://docs-jp.unity3d.com/Documentation/Components/class-PhysicMaterial.html

* GameObject が物理特性エンジンの制御下で動作
* 現実的な衝突、多様な種類のジョイント、その他のクールな動作へのゲートウェイが開く

![スクリーンショット 2014-06-21 22.27.17.png](https://qiita-image-store.s3.amazonaws.com/0/44698/d10f8378-f4d6-56df-4234-58ec88ed1594.png)

| 制御 | 内容 |
|:---:|:----|
| Dynamic Friction | 動的摩擦度 0 ~ 1 |
| Static Friction | 静的摩擦度 0 ~ 1 |
| Bounciness | 弾力度 0 ~ 1 |
| Friction Combine | 摩擦の合成
| Bounce Combine | 弾力度の合成
| Friction Direction 2 | 方向別の摩擦度
| Dynamic Friction 2 | Friction Direction 2 の動的摩擦度
| Static Friction 2 | Friction Direction 2 の静的摩擦度

#3. Collider
直訳すると衝突装置。コライダーとよみます。
##ドキュメント
http://docs-jp.unity3d.com/Documentation/ScriptReference/Collider.html

| Collider | 内容 |
|:--------:|:-----|
| Box | 立方体
| Sphere | 球
| Capsule | カプセル
| Mesh | メッシュデータ


![スクリーンショット 2014-06-22 13.04.59.png](https://qiita-image-store.s3.amazonaws.com/0/44698/9f43c57a-21ec-9b78-bf9b-5603ad2910ff.png)

*isTriger*
オブジェクトが衝突範囲に入ったことを検知します
trueにしたGameObjectの衝突範囲に入ったことが検知され、OnTrigger*のメソッドが呼ばれます

| method | call timing |
|:------:|:-------|
|OnCollisionEnter | 衝突時
|OnCollisionStay| 衝突している最中
|OnCollisionExit| 衝突後、オブジェクトから離れた
|OnTriggerEnter| トリガー状態で衝突時
|OnTriggerExit| トリガー状態で衝突している最中
|OnTriggerStay| トリガー状態でオブジェクトから離れた

##使い分け
Rigidbodyが絶対に必要だが、各々条件が異なっている

*OnCollision**

* 触れ合う2つのオブジェクトにRigidbodyが必要
* Is Kinematic = false
* Is Trigger = false

*OnTrigger**

* 触れ合う2つのオブジェクトのどちらかにRigidbodyが必要
* Is Trigger = true

→この条件を逸した状態で動かしてみると、OnTriggerの判定よりもOnCollisionが優先されたりするので、何か別条件もあるとは思われます

#ちゃんとどの機能があるか知れば難しくない
これらを組み合わせて落下物とそれを物理的に処理することができる

→要はRigidBodyが剛体なのでモノ自体を表現してます。そのモノが実際に物理的に摩擦や弾力性の影響が出るものをPhysic Materialとして処理します。
通常は、この２つを用いて処理します

クソゲーでも作ってみようかなと画策中
Sublime Text 3 ショートカット(Mac)


##途中から次行改行
・⌘ + return

##行末
・^ +  e

#対応する括弧 (コントロール+m)
・^ +  m

##マルチセレクト
*⌘ + D

##矩形選択
・alt を押しながら、左クリックしドラッグで選択

##選択文字列の前後をクォーテーションなどで囲う
・⌘ + ⇧ + L

##ウィンドウの分割(コマンド+オプション)
・⌘ + ⌥ + 2,3,4


##行の削除 (コントロール+shift)
・^ + ⇧ + K 

##行の移動
・^ + ⌘ + ↑、^ + ⌘ + ↓

##行のコピー
・⌘ + ⇧ + D

##対象メソッドへジャンプ
・⌘ + R

##コメントアウト・コメントイン
・⌘ + /
そうだ, 三項演算子を使おう.

皆さん, 3項演算子使ってますか？使ってますよね. 便利ですよね.

Objective-Cに限った事では無いのですが元々GNU拡張らしいので全部の環境で使えるわけではないですし, Objective-Cで使う事が多いのでObjective-Cネタとして書きます.

    Foo foo = bar ? bar : baz;

みたいな書き方が

    Foo foo = bar ?: baz;

って書ける. ただそれだけです. ただそれだけなんですが, Objective-Cは基本的に困ったらnil返すって人なので程よく使えます.

例えば,

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
    if(!cell) CustomCell.loadFromNib;

って書いてたことが

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier] ?: CustomCell.loadFromNib;

って書けちゃう. 便利.

/* tableViewにregisterNibとかしておけばこの例で書いてる事は不要だけどstoryboardとかからIBOutletで接続するのがめんどくさいときとかにはオススメです. */
Java Gradle プロジェクトの作成方法


## 動作環境

* Gradle 1.9+

## Java プロジェクトの作成

`init` task により、Gradle で Java を扱うのに最低限必要な構成、及びサンプルコードが作成される。

    $ mkdir project-name; cd project-name
    $ gradle init --type java-library

ビルドの実行:

    $ gradle compileJava

テストの実行:

    $ gradle test

なお、`type` オプションは他にも以下をサポートしている。

* pom (Maven プロジェクトを変換)
* scala-library
* groovy-library
* basic

## 参考資料

* Gradle User Guide: [Chapter 47. Build Init Plugin](http://www.gradle.org/docs/current/userguide/userguide_single.html#build_init_plugin)
意外と情報がない！？メモっておくと楽できる、AngularJSで国際化対応

AngularJSはデータと画面を連携できるフレームワークです。[サワリ](http://qiita.com/ukiuni@github/items/08e341626416400bbc62)はこちらに書きました。

AngularJSには、ブラウザサイドでアプリケーションを国際化（ブラウザの設定に応じて、表示する言語を英語だったり日本語だったりに切り替える）する拡張機能があります。調べたところ、古い情報が多く、リンク切れしてたり、そのままでは動かないということがあったので、ここにお勧めの使い方をしたサンプルを記載します。

# 使う機能拡張
AngularJSにはいろいろな拡張機能がありますが、今回使ったのは[こちら]（http://angular-translate.github.io/）の、angular ○ translateです。
今回は、言語別にリソースファイルをJSONで作って、それを読み込む形式で国際化対応します。

#　セットアップ
[こちら](https://github.com/angular-translate/bower-angular-translate/releases)にダウンロードページがあるのですが、そこからダウンロードできるzipだと、今回の使い方にはファイルがちょっと足りません。Githubからmasterをダウンロードしてきましょう。使うのは、解凍してできたangular-translate.minと、loader-static-files.jsをダウンロードして、Webアプリケーションに取り込みましょう。

# サンプルソース
Githubに[サンプルソース]https://github.com/ukiuni/AngularJSTranslateInspectを載せます。

# 解説
キモは[index.html](https://github.com/ukiuni/AngularJSTranslateInspect/blob/master/WebContent/index.html)です。ほぼ、ここに全ての処理が書かれています。それ以外は外出しした言語リソースです。

## index.html
読み込むべきJSファイルは3つです。

```html
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.13/angular.min.js"></script>
<script type="text/javascript" src="scripts/angular-translate.min.js"></script>
<script type="text/javascript" src="scripts/loader-static-files.js"></script>
```

上から、AngularJS本体、国際化拡張機能の本体、国際化したファイル読み込み機能です。


```js
var myApp = angular.module('myApp', [ 'pascalprecht.translate' ]);
myApp.config([ '$translateProvider', function($translateProvider) {
	$translateProvider.useStaticFilesLoader({
		prefix : 'scripts/translate/lang_',
		suffix : '.json'
	});
	$translateProvider.preferredLanguage(findLanguage());
} ]);
function findLanguage() {
	try {
		return (navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0, 2)
	} catch (e) {
		return "en";
	}
}
```

pascalprecht.translateモジュールを有効にすることで、国際化が有効になります。
あとは、\$translateProvider.useStaticFilesLoaderで、読み込むべき国際化したファイルの読み込み場所とサフィックスを指定します。ファイルはJSONで作ります。
あとは、\$translateProvider.preferredLanguageでどの言語のファイルを読み込むか指定します。ここでは、findLanguageでブラウザ設定を2文字で読み込んでいます。アプリによってはen_USとen_UKを分けたい場合もあると思うので、その場合はfindLanguageを最適なものにしてください。

## 国際化された言語ファイル
scripts/translate/lang_en.jsonとscripts/translate/lang_ja.jsonで英語と日本語のリソースを記載しています。

```json:scripts/translate/lang_ja.json
{
	"appName":"AngularJSの国際化対応確認",
	"index":{
		"read":"簡単国際化！",
		"description":"AngularJSでも、簡単に国際化対応ができます。"
	}
}
```

設定で指定した場所からファイルを読み込みます。JSONで記述します。

最後にHTML中で国際化すべきタグを記述します。

```html
<h1 translate="index.read"></h1>
<h2 translate="index.description"></h2>
```

以上です。

# どうでしょう？
AngularJSでアプリを作るためには国際化は必須の機能だと思いますが、ちょっと癖があります。このページを覚えておくと、AngularJSを使うときに、きっと役に立つはずです。
Three.jsでWebGL(2) - CSS3DRendererを使ってみる -

[three.js](http://threejs.org/)のCSS 3D Transformのサンプルを参考に１５パズルを作成してみました。

参考ソース：
http://threejs.org/examples/#css3d_periodictable
http://minimal.be/lab/Sprite3D/examples/slideExampleFixed.html

## CSS3DRenderの読み込み
three.jsのソースにある`examples/js/renderers/CSS3DRenderer.js`をhtmlに追加
`
<script src="js/renderers/CSS3DRenderer.js"></script>
`
## CSS3DRendererの作成
`THREE.WebGLRenderer`の代わりに`THREE.CSS3DRenderer`を使う
`
renderer = new THREE.CSS3DRenderer();
renderer.setSize(window.innerWidth, window.innerHeight); // 描画領域
renderer.domElement.style.position = 'absolute'; // スタイル設定 {position:absolute}
document.getElementById('container').appendChild(renderer.domElement); // 描画領域を#containerにappend
`

## オブジェクトの追加
WebGLの場合はPlaneGeometryやMeshを使いましたが、CSS3DRendererの場合はDOMとTHREE.CSS3DObjectを使うようです
たとえばスタイルファイルに
`
.box {
      background: url("img/enikki.png");
      width: 126px;
      height: 126px;
}
`
としてから
`
// DOM作成
var dom = document.createElement('div');
dom.className = "box";
// object作成
var object = new THREE.CSS3DObject(dom);
`
とすると、縦126px,横128pxの画像ファイルのオブジェクトが作成できます。

## 分割画像を作る場合
上記DOMを読み込むときにbackgroundPosition属性で
`
dom.style.backgroundPosition = "-" + px + "px -" + py + "px";
`
と設定すると画像の左上から(px,py)から縦126px,横128pxをオブジェクトにすることができます

## パズル作成
`15パズル`あたりで検索するとソースはいっぱい出てくるので、詳しい内容は省略

* 画像を15分割してそれぞれをオブジェクト化
* オブジェクトをクリック時イベントを登録、three.jsは↓こんな感じで楽チン
`
dom.addEventListener("click", onPieceTouched, false);
dom.addEventListener("touchstart", onPieceTouched, false);
`
* クリック時にブロックの位置を入れ替え
* 画像が元に戻ったら終了

サンプル
http://odorumaharaja.github.io/test/webgl_02.html

こんな感じでできました。
![sample02.png](https://qiita-image-store.s3.amazonaws.com/0/35319/67d21e89-c1c7-4b93-400d-1193551668c9.png)

題名がWebGLなのにWebGLを使ってないという矛盾...
書きたいことりすと

- プログラミングが人間に優しくなってきた革命の歴史と、今後の動き
  - コード: 高級言語革命, OOP革命, LL革命, Ruby, ORM革命, Rails革命, BaaS革命
  - コード運用: VCS, Unit Test, E2E Test, GitHub(PullRequest), CI
  - インフラ: VM革命, クラウド革命, Docker(コンテナ)革命
  - 今後(多分): 宣言型アプローチ, フロントエンドのFRP革命, Protocol Buffer, あとはTestにおける何らかがあると思う(理論的アプローチとか、E2Eテストが革命的に簡単になるとか)
- SQSを使って、マルチインスタンスでのワークフローを簡単に書く
- BigQueryでCollaborative Filteringを書く
- SwifterのためのScalaでAndroid
- iOSとAndroidでネイティブで書きながらコードを共有するための方法
  - Modelとか、他ビジネスロジックを共有したい
  - Dropboxの事例
  - RubyMotionでモデルとビジネスロジックを書くのはどうだろう？(Android対応が出たら)
- Swiftと似てるアプローチで安心して使えそうなRubyMotion（iOS+Androidもうすぐ!）を調査
- いま良い言語について書く。思考整理用
  - 自分的にいま「使える」言語（Swift, Scala, JS, Ruby, Node.js?）
  - 今後すごく良くなると思う言語（Node.js, Go）
  - ＊ [ポリシー]
  - ＊フロントエンドを書ける言語を優先（because ユーザのとっての製品＝インターフェース）
  - ＊また、フロントエンドはユーザの持つ処理系に依存するので、言語の流行り廃りが遅い
  - ＊むしろ、バックエンドはas a Service使えばいいし、使った方がいいので。（ParseとかFirebaseはスバラシイ）
  - ＊100xか、O(n)がO(n^2)になるようなパフォーマンス差が出ない限り、
  - ＊ ⇒フレンドリーな文法を優先（だから、JSはCoffeeScriptで書く）
  - ＊ ⇒強くてコミュニティの活発なフレームワークが存在することを優先
  - ＊ ⇒ライブラリの豊富さを優先
  - ＊ ⇒まあ、当たり前ですが、一緒に働いてくれるエンジニアが好き(な/になれる)言語が一番。
  - ってか、「遅い」のほとんどはフロントの問題か、またはネットワークが遅い（地理的に遠いとか）
  - バックエンドは出来るだけ薄く書く。API化。そうすれば、移行の際も楽だし、グルーも楽。
  - 今後：JSON SchemaとかでAPIを定義したい。バックエンドもフロントもAPI関連のコードがほぼ0に
- フロントが遅いとビジネスが死ぬ。フロントエンドのチューニングでやること一覧 order by 時間対効果
Vim のスペルチェックで特定のキーワードを一時的に例外と見なす

例外として見なしたいキーワードにカーソルをのせて `zG` をタイプすると一時的に例外としてみなされマーキングを消すことができます。Vim を再起動すると、この操作で追加した例外はクリアされます。

下記を参考にしました。ありがとうございます。
http://stackoverflow.com/questions/5536856/ignore-one-misspelling-in-vim/5539808#5539808
Sublime Text3 のインストールと設定


Sublime Text2を使い続けていたが、そろそろ3に移行しようとした時のまとめ。
そんなに使い込んではいなかったのでクリーンインストールした。
※Sublime Text2 のアンインストールには[AppCleaner](http://www.freemacsoft.net/appcleaner/)を使用。
※[ここ](http://gadget-drawer.net/2013/12/mac-sublime-text-3-japanese/)を参考にしました。

## Sublime Text3 のインストール

[公式サイト](http://www.sublimetext.com/3)よりOS X向けのdmgファイルをダウンロードする。

ダウンロードファイルを開くと下記のようなウィンドウが開くので、 **Sublim Text** をApplicatonsの中にドラッグ・アンド・ドロップする。

![pic-1.png](https://qiita-image-store.s3.amazonaws.com/0/45249/1875fc9c-f792-b574-421a-35663cd0e028.png "pic-1.png")

これでインストールは完了。

## Package Control のインストール

日本語化やプラグインのインストールに必要な **Package Control** をインストールしておく。

Sublime Text3 を起動し、メニューバーの **View＞Show Console** をクリックする。

![pic-3.png](https://qiita-image-store.s3.amazonaws.com/0/45249/d6ee3866-0975-0776-ceb3-277959605212.png "pic-3.png")

下記をコンソールに貼り付けてreturnキーを押し、インストール完了。
※詳しくは[こちら](https://sublime.wbond.net/installation#st3)

```
import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())
```

## Sublime Text3 の日本語化

**Shift＋Command＋P** を押し、表示されたウィンドウに`install`と打つと **Package Control: Install Package** と出てくるのでこれをクリックする。

![pic-4.png](https://qiita-image-store.s3.amazonaws.com/0/45249/36a394dd-4537-5309-176f-6b8519c79da4.png "pic-4.png")

続いて表示されたウィンドウに`japanize`と打つと日本語化ファイルが見つかるのでこれをインストールして日本語化完了。

![pic-6.png](https://qiita-image-store.s3.amazonaws.com/0/45249/330c80c3-8c50-93d0-5edc-4f85d5cd28bb.png "pic-6.png")

## その他

そもそも自分はそんなに入れてないですが変な拡張機能より、サイドバーにフォルダ構成(ショートカット)を表示できるところが好きです。

![スクリーンショット 2014-06-21 20.06.33.png](https://qiita-image-store.s3.amazonaws.com/0/45249/3a946a51-7337-a590-1ca5-4c5f950d52b7.png "スクリーンショット 2014-06-21 20.06.33.png")

**表示>サイドバー** から設定可能です。

![スクリーンショット 2014-06-21 20.09.14.png](https://qiita-image-store.s3.amazonaws.com/0/45249/a04e67df-7c08-9165-739b-4dda51263d25.png "スクリーンショット 2014-06-21 20.09.14.png")

ってSublime Text2 と全く同じ手順ですね・・・。
Mavericksにupgradeして、Macportsも入れ替えた時のメモ


まず、mavericksにしたら、macportsがDarwinのバージョンが違うぞこら！とかいいだして、portコマンドすら通らない状況に。（ここでXcodeCLT入れてなかったからかな？）

ちまちまFixするのも面倒なので、macportsも入れえ。

1. Uninstall Macports

[ここ](https://guide.macports.org/chunked/installing.macports.uninstalling.html)から、消し消しする。ちょっとかかる。

これをやっちまったので、zshすらなくなる事態にｗ久々のterminalを触ると、iterm2+oh-my-zshがいかに便利か実感するｗｗ
iterm2かterminalのpreferencesから、立ち上げるシェルを`/usr/bash` に書き換え。

2. Install Xcode
3. Install Command line tools

学内LANのせいか、Command line toolsを見つけるときに、エラー。

```
Can't install the software because it is not currently available from the Software Update server.
```

なんだと？！
ってことで、[マックのデベロッパーサイト](https://developer.apple.com/downloads/index.action?name=for%20Xcode%20-) からダウンロード。インスコ。

4. Install Macports

本体は、すんなりインスコ完了。
するときには、LAN内のセッティング（[LAN内からのMacports selfupdate](http://ishwt.net/blog/2011/04/05/use-macports-at-inside-of-proxy/)）を忘れずに、アップデート

```sh
sudo port -d sync
```

が通らない。

```sh
~$ sudo port -d sync
Password:
DEBUG: Copying /Users/hoge/Library/Preferences/com.apple.dt.Xcode.plist to /opt/local/var/macports/home/Library/Preferences
--->  Updating the ports tree
Synchronizing local ports tree from http://www.macports.org/files/ports.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   320  100   320    0     0   1130      0 --:--:-- --:--:-- --:--:--  1134
100 25.8M  100 25.8M    0     0   435k      0  0:01:00  0:01:00 --:--:--  450k
Error: Extracting http://www.macports.org/files/ports.tar.gz failed (can't read "verboseflag": no such variable)
DEBUG: Synchronization of 1 source(s) failed
    while executing
"mportsync [array get global_options]"
port sync failed: Synchronization of 1 source(s) failed
```

なんですと。とりまエラー文（ERROR:以降の一行）でググる。
[ここ](https://trac.macports.org/ticket/43821)にあるように、macportsのtclファイルを書き換えに行く。

```sh
sudo find /opt/local/* | grep macports.tcl
```

とかで、ファイルの場所探して、そこへ移動（私の場合 `/opt/local/libexec/macports/lib/macports1.0/` にありました）

```sh
sudo cp macports.tcl macports.tcl.bak
sudo vi macports.tcl
```

とかして、下記のように書き換える。

```
--- macports.tcl.bak    2014-05-26 12:08:25.000000000 +0200
+++ macports.tcl        2014-05-26 12:20:42.000000000 +0200
@@ -2496,6 +2496,8 @@
                 if {$macports::portverbose eq {yes}} {
                     set progressflag "--progress builtin"
+                    set verboseflag "-v"
                 } elseif {[info exists macports::ui_options(progress_download)]} {
                     set progressflag "--progress ${macports::ui_options(progress_download)}"
+                    set verboseflag ""
                 }
```

ちなみに、viのジャンプは `ESC+2496G` とかでいけます。
蛇足ですが、私は、vimのセッティングで、readonlyに書き込めないとか言われたので、

```sh
sudo chmod a+w macports.tcl
sudo vim macports.tcl
sudo chmod a-w macports.tcl
```

とかして凌ぎました。

やっとこさ、インストール出来る環境が整いました。とりまzsh入れよ。
Linuxへのpgpool-IIの導入と基本的な設定

# はじめに

本記事は旧バージョンで説明です。最新のバージョンは、下記の記事が参考になります。

[pgpool-IIの機能を理解して、インストールと設定をする ( 入門編 )](http://techblog.lclco.com/entry/2016/05/05/020544)

## 概要

pgpool-IIを試したいが、公式ドキュメントをすべて読むのが大変という方向けに、とりあえず動かすまでの基本知識と導入手順をまとめる。

## pgpool-IIとは

PostgreSQLへの接続に利用するミドルウェア。コネクションプールやクエリキャッシュ・負荷分散機能がある。

アプリケーションとPostgreSQLを透過的に中継するので、現状の作りのまま導入ができる。

詳細はこちら参照。
http://www.pgpool.net/docs/pgpool-II-3.3.3/doc/pgpool-ja.html

## pgpool-IIの導入判断

Javaであれば、アプリケーションサーバで代替できる機能もあるため、そちらとの比較が必要。
PHP等の場合は、コネクションプール目的だけでも導入する価値がある。

## pgpool-IIの動作モード

以下の４つのモードがある。

- rawモード
- レプリケーションモード
- マスタスレーブモード
- パラレルクエリモード

今回は、DBサーバ１台構成を想定し「rawモード」で導入する。

## pgpool-IIの導入サーバ

どのサーバに導入するかは、以下の３つの選択肢がある。

- 専用サーバの配置
- WEBサーバ・アプリケーションサーバと同居
- DBサーバと同居

今回は、以下の理由でWEBサーバと同居させる。

- 専用サーバ配置は、１台だとpgpool自体が単一障害点になる。複数台にすると専用のHAの仕組みが必要となる。
- WEBサーバ配置は、WEBサーバを複数台構成にすると、pgpoll自体も単一障害点でなくなる。将来的にDBサーバが複数台構成になった場合にも、アプリを変更せずに対応できる。
- DBサーバは配置は、将来的にDBサーバが複数台構成になった場合に、アプリ側で振り分けが必要となってしまう。

## pgpoolの導入

### 環境

- CentOS 6.5
- PosgreSQL 9.3
- pgpool-II 3.3.3

### pgpool-II インストール

yum -y install http://www.pgpool.net/download.php?f=pgpool-II-pg93-3.3.3-3.pgdg.x86_64.rpm

### pgpool-II 初期設定

/etc/pgpool-II/pgpool.confが主要な設定ファイル。
ほぼ初期設定のままで、下記のみを変更する。

データベースの接続情報

```
backend_hostname0 = '10.0.1.10'
backend_port0 = 5432
```

コネクションプールの設定

```
num_init_children = 64 # pgpoolへの接続数
max_pool = 1           # DBユーザ名・データベース名毎に一つ
```

オンメモリクエリキャッシュの設定

```
memory_cache_enabled = on # 有効にする
```

必要なディレクトリを作る。

```
mkdir /var/run/pgpool
mkdir /var/log/pgpool

chown postgres:postgres /var/log/pgpool/
chown postgres:postgres /var/run/pgpool/
```

pool_passwdファイルがないと、エラーログが出るのでダミーファイル作成

```
vi /etc/pgpool-II/pool_passwd
chown postgres:postgres /etc/pgpool-II/pool_passwd
```

自動起動を有効化

```
chkconfig pgpool on
```

### アプリケーション側の設定変更

元々、データベースサーバを指定しているIP・Portを、pgpoolを指定するように変更する。
デフォルトであれば、IPはlocalhost、Portを9999に変更する。ユーザ・パスワードは変更不要。

### 起動と確認

Serviceへ登録されているので、起動は以下のコマンド。

```
service pgpool start
```

ログはデフォルトでは、「/var/log/pgpool.log」に出力されるので、うまくいかなければ確認する。
ログ出力場所は、「/etc/init.d/pgpool」に記載されている。

## 最後に

上記の通りに導入は非常に簡単。

接続数がそれなりにあるアプリケーションであれば、コネクションプールとオンメモリクエリキャッシュのみの利用でも、効果が出るはず。

レプリケーションについては、PostgreSQL標準のレプリケーションとの使い分けがいりそう。

パラレルクエリについては、よくわかっていないので使うタイミングが来たら調べる。
test-unitでテストの共有

[GitHubのイシュー][1]を読めばそれで終わるんですが。

test-unitってアンドキュメンテドな便利機能が色々あるので日本語で残しておこうと思いました。

こんなクラスの実装があるとします。

```ruby:my_book.rb
class MyBook
  class << self
    def from_epub(epub)
      # ...
      self.new
    end

    def from_kindle_format(mobi)
      # ...
      self.new
    end

    def from_pdf(pdf)
      # ...
      self.new
    end
  end

  attr_reader :author, :title
end
```

これをテストするのにこんなの書いたりします。

```ruby:test_my_book_redundant.rb
require 'test/unit'
require 'my_book'

class TestMyBook < Test::Unit::TestCase
  def setup
    @author = "It's me"
    @title = 'My Special Book'
  end

  class TestEPUB < self
    def setup
      super
      @book = MyBook.from_epub('path/to/book.epub')
    end

    def test_author
      assert_equal @author, @book.author
    end

    def test_title
      assert_equal @title, @book.title
    end
  end

  class TestKindleFormat < self
    def setup
      super
      @book = MyBook.from_kindle_format('path/to/book.mobi')
    end

    def test_author
      assert_equal @author, @book.author
    end

    def test_title
      assert_equal @title, @book.title
    end
  end

  class TestPDF < self
    def setup
      super
      @book = MyBook.from_pdf('path/to/book.pdf')
    end

    def test_author
      assert_equal @author, @book.author
    end

    def test_title
      assert_equal @title, @book.title
    end
  end
end
```

    $ ruby -I. test_my_book_redundant.rb
    ...
    Finished in 0.019281834 seconds.
    
    6 tests, 6 assertions, 6 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
    0% passed
    
    311.17 tests/s, 311.17 assertions/s

（今実装がないのでコケるのはご愛嬌）
`#test_author`と`#test_title`の重複が明らかに臭いですね。

重複を取り除くのに、RSpecだとshared_examplesを使うところですが、test-unitではRubyの標準のモジュールを使います。

```ruby:test_my_book_shared
require 'test/unit'
require 'my_book'

module TestAttributes
  def test_author
    assert_equal @author, @book.author
  end

  def test_title
    assert_equal @title, @book.title
  end
end

class TestMyBook < Test::Unit::TestCase
  def setup
    @author = "It's me"
    @title = 'My Special Book'
  end

  class TestEPUB < self
    include TestAttributes

    def setup
      super
      @book = MyBook.from_epub('path/to/book.epub')
    end
  end

  class TestKindleFormat < self
    include TestAttributes

    def setup
      super
      @book = MyBook.from_kindle_format('path/to/book.mobi')
    end
  end

  class TestPDF < self
    include TestAttributes

    def setup
      super
      @book = MyBook.from_pdf('path/to/book.pdf')
    end
  end
end
```

    $ ruby -I. test_my_book_shared.rb
    ...
    Finished in 0.017621966 seconds.
    
    6 tests, 6 assertions, 6 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
    0% passed
    
    340.48 tests/s, 340.48 assertions/s

「6 tests, 6 assertions」、つまり、一つのモジュールにテストをまとめても、それを`include`しているテストクラス三つ分、ちゃんと実行されています。

[1]: https://github.com/test-unit/test-unit/issues/68
codeforcesのAPIから色んな情報が取れるようになったのを試した

はい。
[http://codeforces.com/api/help](http://codeforces.com/api/help)  
  
  
```python:test.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import urllib2
import json

#データを取りに行く
res=urllib2.urlopen('http://codeforces.com/api/user.info?handles=clarinet758')
#json形式で扱えるようにする
f=json.load(res)
```


```xml:example.json(返って来てるデータ例)
{
    u'status': u'OK',
    u'result': [
        {
            u'registrationTimeSeconds': 1339342427,
            u'rating': 1040,
            u'handle': u'clarinet758',
            u'country': u'Japan',
            u'rank': u'newbie',
            u'maxRank': u'specialist',
            u'lastOnlineTimeSeconds': 1403338836,
            u'contribution': -8,
            u'maxRating': 1414
        }
    ]
}
```

```python:test.py
#単純に今すぐとあるデータを表示させるならprintで出力できます
#コレで現在のレーティング
print f[u'result'][u'rating']

#Integer同士のデータなら引き算で差分出したり出来ます
#コレでレーティングの最高値の時と現在の差分を出します
print f[u'result'][u'maxRating'] - f[u'result'][u'rating']
```

user.infoを叩くと現在の個人データ、profileで見える情報とほぼ同等かな？  

user.ratedListを叩くとユーザ名やレーティングなど何か解析したりとか目的がないと個人使用では用途があまりないかも？
参考先さま [http://tubo028.hatenablog.jp/entry/2014/06/15/134848](http://tubo028.hatenablog.jp/entry/2014/06/15/134848)  

user.ratingを叩くとコンテストの参加記録。おそらく個人プロフィールのContestsで見えるものとほぼ同等。参加登録だけではなくsubmissionした回でないとデータは出てこない  

user.statusで個人のsubmision履歴。"verdict":"OK"が多分AC出たもの。  

いまのところ [http://codeforces.com/problemset/standings](http://codeforces.com/problemset/standings) で表示されるような個人の解いた問題数の呼び出しは分からない。OKを数えると同じ問題を違う言語使ったのとか簡潔に書きなおしたとかもカウントしそうなので必死に工夫して除外させるか、API追加公開を待つかだと思います。
Octicons使ってみた

GitHubが[Octicons](http://octicons.github.com/)を公開したので、Chrome Storeで公開している[GitHub Checker](https://chrome.google.com/webstore/detail/github-checker/dejgifcjoefbogdjpjokobdlddjhbich)に早速使ってみた。

GitHub Checkerに関する以前の投稿は[こちら](http://qiita.com/dtaniwaki/items/5ab9b6141c56699a006a)

# 使用前

![Screen Shot 2014-06-21 at 5.49.05 PM.png](https://qiita-image-store.s3.amazonaws.com/0/22653/60ce4068-6643-6fd3-d508-2cb033510834.png)

htmlとcssはこんな感じ

```html
<h3 class="repo-title"><a href="https://github.com/dtaniwaki/github-checker">kaizenplatform / github-checker</a></h3>
```

```scss
.repo-title {
  display: block;
  margin-bottom: 10px;
  padding-left: 20px;
  padding-bottom: 5px;
  border-bottom: 1px solid #eee;
  background: url('/images/repo.png') no-repeat 0 0;
  font-size: 1.2em;
}
```

# 使用後

![Screen Shot 2014-06-21 at 5.49.13 PM.png](https://qiita-image-store.s3.amazonaws.com/0/22653/d143cfe6-6523-ccbd-8edc-0ceae093a700.png)

htmlとcssはこんな感じ

```html
<h3 class="repo-title"><span class="octicon octicon-repo"></span><a href="https://github.com/dtaniwaki/github-checker">kaizenplatform / github-checker</a></h3>
```

```scss
.octicon {
  font-size: 16px;
}
.repo-title {
  display: block;
  margin-bottom: 10px;
  padding-bottom: 5px;
  border-bottom: 1px solid #eee;
  font-size: 1.2em;
  .octicon {
    margin-right: 10px;
  }
}
```

`octicon`クラスと`oction-xxx`クラスを持った`span`を追加するだけ。
octiconは16pxの倍数にすると奇麗に見えるので推奨とのこと。

今までGitHubのサイト上の画像を切り出して使うというアナログなことをしていたので、全アイコンが簡単に使えて良かった！
おもしろい数学２

　う〜ん・・・１０進数から必ず始まるという思い込みが招いた結果だと思われます。どうも変換して・・・という風にやっていたのですが、桁に分けなくてはいけないと気付き、この方法では破綻するとおもって中断して、解答を確認してコーディングしました。

```java:
import java.util.*;
public class Main {
//詰まってしまった解答
//途中で明らかに問題を全探索で解く方式ではない方法で、答えが出なさそうなコードだったので中断
//	boolean ok(int num, int base) {
//		int sum = 0;
//		int temp = num;
//		while(temp != 0) {
//			sum += temp % base;
//			temp /= base;
//		}
//		return(sum % num == 0);	
//	}
//	
//	int toDigit(int a, int b, int c) {
//		return(a * 100 + b * 10 + c);
//	}
//	
//	int[] digits(int base) {
//		TreeSet<Integer> list = new TreeSet<Integer>();
//		for(int r = 0; r < 10; r++) {
//			for(int c = 0; c < 10; c++) {
//				for(int k = 0; k < 10; k++) {
//					int digit = toDigit(r, c, k);
//					if(ok(digit, base)) {
//						
//					}
//				}
//			}
//		}
//	}
	
//	int[] digits(int base) {
//		ArrayList<Integer> v = new ArrayList<Integer>();
//		
//		for(int n = 2; n < base; n++) {
//			boolean ok = true;
//			for(int k1 = 0; k1 < base; k1++) {//1桁目
//				for(int k2 = 0; k2 < base; k2++) {//2桁目
//					for(int k3 = 0; k3 < base; k3++) {//3桁目
//						if((k1 + k2*base + k3*base*base) % n == 0 && (k1 + k2 + k3) % n != 0) {
//							ok = false;
//							break;
//						}
//					}
//					if(!ok) break;
//				}
//				if(!ok) break;
//			}
//			if(ok) v.add(n);
//		}
//		int[] ans = new int[v.size()];
//		for(int r = 0; r < v.size(); r++) {
//			ans[r] = v.get(r);
//		}
//		return(ans);
//	}

//中断し、解答を見て、自分で解答を見ずに書いてみたコード
	int[] digits(int base) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		
		for(int n = 2; n < base; n++) {
			boolean ok = true;
			for(int k1 = 0; k1 < base; k1++) { //ここに条件を含む方法もある
				for(int k2 = 0; k2 < base; k2++) {
					for(int k3 = 0; k3 < base; k3++) {
						//当てはまらない
						if(k1 + k2 * base + k3 * base * base % n == 0 && k1 + k2 + k3 % 2 != 0) {
							ok = false;
							break;
						}
					}
					if(!ok) break;
				}
				if(!ok) break;
			}
			if(ok) list.add(n);
		}
		int[] ret = new int[list.size()];
		for(int r = 0; r < ret.length; r++) {
			ret[r] = list.get(r);
		}
		return(ret);
	}
	
	void doIt() {
		int[] ans = digits(3);

		for(int r = 0; r < ans.length; r++) {
			System.out.print(ans[r] + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}
```

　実はこの問題、解答を見た後に上述の思い込みによって理解出来ませんでした。とりあえず保留していたのですが、今回まで響いてしまい、このまま理解出来ずはマズいとおもった上での中断です。
　本当は中断しちゃいけないんですけどね・・・。あと、for文の中に条件を入れてしまえば、見やすくなります。一応、自分が参考している書籍に準拠して書きました。