OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidアプリにおけるCIベストプラクティス（案）


なんとなく考えているものです。
もう少し考えがハッキリしてきたら別でエントリをまとめます。

基本的に<a href="http://www.amazon.co.jp/gp/aw/rd.html?ie=UTF8&a=482228395X&at=shoma2da-22&dl=1&lc=msn&uid=NULLGWDOCOMO&url=%2Fgp%2Faw%2Fd.html">継続的インテグレーション入門</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=shoma2da-22&l=as2&o=9&a=482228395X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />に書かれている内容や考え方を参考にしています。

<iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=shoma2da-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=482228395X" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

## CIの流れ

本にも書かれている通り、Androidアプリの場合でも3種類のビルドがあれば良いかな―と思ってます。

1. コミットビルド - コミットの度に実行し、数分以内に終わるビルド
2. 2次ビルド - 定期的（1日1回など）に実行し、時間が長くかかっても良いビルド
3. リリースビルド - リリース直前に実行するビルド

それぞれのビルドで実行する内容（の案）について書いていきます。

## コミットビルド

1. コンパイルが通るか → `./gradlew assemble`など
2. コード解析
	* Checkstyle
	* PMD
	* FindBugs
	* Android Lint
3. テスト+カバレッジ計測（短い時間で実行したいのでJavaVMでテストする）
	* Robolectric
	* JUnit
	* Jacoco(もしくはCoberturaかEmma??)
4. ドキュメンテーション
	* JavaDoc
	* クラス図の生成（やり方はわからない...）
5. フィードバック
	* Slack、HipChat、メールなどでビルド結果を適切に通知（特にビルドに失敗した場合）
	* DeployGateなどでビルドしたapkを配布


## 1日1度など定期的に行うビルド(2次ビルド)

コミットビルドに追加して以下の内容を行います。

1. 単体テスト、結合テスト、UIテスト（本番環境に近い形にしたいので端末もしくはエミュレータ上でテストする）
	* monkey
	* モデル単体テスト、Activity単体テスト、Service単体テスト...
	* Espresso
	* UI Automator

## リリースに向けたビルド(リリースビルド)

まず2次ビルドを動作させ、問題なく動作したら以下を行います。
（もちろん、CIとは別にapkの手動確認はすべきだと思います。）

1. apkをDeveloper Consoleにアップロードし、リリース直前の状態にする
	* Google Play Developer API : Publishing API


## 以上です。

それぞれのビルドでデバッグ/リリースのどちらの署名を使うかですが、ビルド対象にしているブランチによって変えるのが良さそうな気がしています。（リリースに使うブランチならリリース署名、開発に使っているfeature系のブランチならデバッグ署名）

実際に色々試していってみようと思います。
ノウハウがある！など何かコメントあれば是非いただきたいです。
iOS 9 時代のURLエンコーディング（日本語環境）

### 背景
iOS7からURLエンコーディング用にNSStringに ```stringByAddingPercentEncodingWithAllowedCharacters()``` が追加されました。
しかし、日本語のようなマルチバイトの言語ではエンコード対象の文字数が一定数を超えるとクラッシュする問題があり、安心して使うことができません。

**参考** 
- [日本語文字列のURLエンコード時に潜む罠（iOS7 以上）](http://qiita.com/tasanobu/items/84b3a7c390ee52e57621)
- [Alamofire - escape function crashes when escaping long Chinese strings](https://github.com/Alamofire/Alamofire/issues/206)

代替手段として、これまではCore Foundationの```CFURLCreateStringByAddingPercentEscapes()```を使っておりましたが、iOS 9からなんとdeprecatedになってしまいます。(参考: [CFURL Reference - Prerelease](https://developer.apple.com/library/prerelease/ios/documentation/CoreFoundation/Reference/CFURLRef/#//apple_ref/c/func/CFURLCreateStringByAddingPercentEscapes))

### iOS9時代からの対処法
クラッシュ覚悟で```NSString.stringByAddingPercentEncodingWithAllowedCharacters()```を使うことができる人は少ないと思いますので、代替手段として使えるライブラリを作ってみました。

> **PercentEncoder**
> Lightweight library to escape string using so called URL encoding in Swift.
> https://github.com/tasanobu/PercentEncoder

このライブラリでは```JavascriptCore```を使い、javascriptに用意されているURLエンコード用の関数 (encodeURI / encodeURIComponent / decodeURIComponent / decodeURIComponent) を呼ぶようにしています。
内部実装は[**こちら**](https://github.com/tasanobu/PercentEncoder/blob/master/PercentEncoder/PercentEncoding.swift)を見て頂くと分かります。

#### 使い方
URLエンコーディングの機能は ```String```,```NSString```のextensionメソッドと```PercentEncoding```というenumで提供しています。
使い方は非常にシンプルです。

##### String extension 
```swift:String
/// encodeURI
"http://tasanobu.jp?city=東京&year='20".ped_encodeURI()

/// decodeURI
"http://tasanobu.jp?city=%E6%9D%B1%E4%BA%AC&year='20".ped_decodeURI()


/// encodeURIComponent
let encoded = "東京".ped_encodeURIComponent()
// encoded to "%E6%9D%B1%E4%BA%AC"

/// decodeURIComponent
encoded.ped_decodedURIComponent()
// decoded back to "東京"
``` 

##### PercentEncoding enum
```PercentEncoding``` にはjavascriptのURLエンコーディング用メソッドに対応した4つの値(encodeURI / encodeURIComponent / decodeURIComponent / decodeURIComponent)があり、使い方は次の通りです。
 
```swift:PercentEncoding
let url = "http://tasanobu.jp?city=東京&year='20"

/// EncodeURI
let escaped = PercentEncoding.EncodeURI.evaluate(string: url)
// encoded to "http://tasanobu.jp?city=%E6%9D%B1%E4%BA%AC&year='20"

/// DecodeURI
PercentEncoding.DecodeURIComponent.evaluate(string: escaped)
// decoded back to "http://tasanobu.jp?city=東京&year='20"


let value = "東京" // 東京 means Tokyo which is the capital of Japan.

/// EncodeURI
let encoded = PercentEncoding.EncodeURIComponent.evaluate(string: value)
// encoded to "%E6%9D%B1%E4%BA%AC"

/// DecodeURI
PercentEncoding.DecodeURIComponent.evaluate(string: encoded)
// decoded back to "東京"
```

#### システム要件
- iOS 7.0+ (iOS 8.0+ when installing with Cocoapods)
- Xcode 6.4

#### インストール方法
- Cocoapods

 ```
 platform :ios, '8.0'
 use_frameworks!
 pod 'PercentEncoder'
 ```

- git submodule

### まとめ
使い方はシンプルで導入コストもそんなにないので、```PercentEncoder```を試して頂けると幸いです。
何か不明な点や不具合などありましたら、お気軽にこの記事にコメントして頂いたりやGithub上でIssueを作って頂ければと思います。

> **PercentEncoder**
> Lightweight library to escape string using so called URL encoding in Swift.
> https://github.com/tasanobu/PercentEncoder
ステータスコード 499


ページがうまく表示されないという問い合わせを受けてnginxのログを調べていたところ、見なれないレスポンスコードを発見しました

* access_log

```
2015-08-04 06:00:54     access_log {"host":"111.111.111.111","user":"-","method":"GET","path":"/hoge/list","code":499,"size":0,"referer":"","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0","request_time":59.447,"forwarded_for":"111.111.111.111","cookie":""}
```

何度か試してみたところどれも60秒弱で現象が発生していたのでタイムアウトのようです

nginxのエラーログに何かあるかと思ったのですが何も出力されておらず

nginxのタイムアウト設定も90秒にしていたのでnginxではない...

レスポンスが変える前にクライアントに接続を切られたということで、nginxの上位かもしれないということでELBをチェックしたところあたりでした

ELB側のタイムアウト設定が60秒だったためELB側で接続を切られてしまったようです

nginx、もしくはバックエンド側のタイムアウトだと下記のようにエラーログに出力されるはず

```
upstream timed out (110: Connection timed out) while reading response header from upstream,
```
Linux（RHEL、CentOS）でWindowsの共有フォルダをマウントする


#環境
 - RedHat Enterprise Linux Server release 6.5
 - Windows7 pro

#前提
 - Windows側に共有フォルダを作成する
 - 作成した共有フォルダがLinux側から参照できる
 - Linux側にマウントポイントを作成する

##マウントコマンド
###ユーザ制限がされている場合
```
mount -t cifs -o username={username},password={password} //{共有フォルダのIPアドレス}/{共有フォルダ名} {マウントポイント}
```

###ユーザが制限されていない場合
```
mount -t cifs //{共有フォルダのIPアドレス}/{共有フォルダ名} {マウントポイント}
```

###アンマウントコマンド
```
umount {マウントポイント}
```
MojoX::JSON::RPC::Serviceで作ったJSONRPCサーバー側処理でparams以外を使いたい




ググってもそれらしき情報が全然出てこなかったので自分用メモ

メソッドをregisterするときのoptionに

    {
        with_self => 1,
    }

を指定すれば、メソッド呼び出し時の第１引数にアプリ本体が渡ってくるので、そこから$app->req->envとかなんでも自由に取り出して使える。

# 困りごと

ただし、PODの最初にあるような基本的な使い方をすると、JSONRPCの処理を行うメソッドが`register`と同じ階層に散らかってしまいコードの見通しが良くない。

``` perl
use MojoX::JSON::RPC::Service;

my $svc  = MojoX::JSON::RPC::Service->new;

$svc->register(
    'sum',
    sub {
        my ($app, @params) = @_;
        my $sum    = 0;
        $sum += $_ for @params;
        return $sum;
    },
    {
        with_self => 1,
    }
);

```



そして、PODの二つ目にあるように MojoX::JSON::RPC::Serviceを継承したモジュールを作って、register_rpc_method_namesでメソッドの登録を行うと、register時の引数として自動的に `with_svc_obj => 1` が指定され、メソッド内の第１引数が Service オブジェクトになってしまうため、自由にいろいろアクセスできない。

```perl
package MyService;

use Mojo::Base 'MojoX::JSON::RPC::Service';

sub sum {
    my ($self, @params) = @_;
    my $sum    = 0;
    $sum += $_ for @params;
    return $sum;
}

__PACKAGE__->register_rpc_method_names( 'sum' );

```

# 解決策

register_rpc_method_namesはやめて、new の時に自分でregisterしてやることにした。

```perl
package MyService;

use Mojo::Base 'MojoX::JSON::RPC::Service';

my @METHODS = qw/ sum /;

sub new {
    my $class = shift;
    my $self = $class->SUPER::new(@_);
    
    for(@methods){
        $self->register(
            $_ => \&{$_},
            {
                with_self => 1.
            }
        );
    }
    
    return $self;
}

sub sum {
    my ($app, @params) = @_;
    my $sum    = 0;
    $sum += $_ for @params;
    return $sum;
}

## Then in Mojolicious application
$self->plugin(
    'json_rpc_dispatcher',
    services => {
        '/jsonrpc'  => MyService->new,
    }
);

```


# 参考リンク
MojoX::JSON::RPC::Service
http://search.cpan.org/~henryykt/MojoX-JSON-RPC-0.04/lib/MojoX/JSON/RPC/Service.pm
Pythonの関数の引数まとめ

pythonの関数の引数の動作についてまとめる.
3系も含む.


# A. 関数を使うとき
|番号|Syntax|機能|
|:-:|:-:|:-:|
|1|func(value)|通常の呼び出し, 関数呼出と引数の位置が対|
|2|func(name=value)|キーワードに対応して関数呼出|
|3|func(*iterable)|iterableなものを展開して関数呼出|
|4|func(**dict)|dictをkey, valueに展開して関数呼出(2の引数をdictにして渡す)|

# B. 関数を定義するとき
|番号|Syntax|機能|
|:-:|:-:|:-:|
|1|def func(name)|通常の関数定義, 関数呼出と引数の位置が対|
|2|def func(name=value)|引数に初期値を設定する|
|3|def func(*name)|引数をタプルにする|
|4|def func(**name)|引数をdictionaryにする|
|5|def func(*arg, name)|nameだけは指定必要,3系のみ|
|6|def func(*, name=value)|引数をすべて指定が必要なものにする, 3系のみ|

# Bの5, 6について
5と6がわかりにくい
pythonの関数呼出では, ```name = value```として呼び出せるけれど, ```def func(name)```だけでは, 関数呼出側が, name = valueにするか, valueだけで渡すのか自由にできる. そうすると当然コードにばらつきが出てくる.
で, それを解消しようとして3系からそれを強制するsyntaxができた(たぶん).

## 5について
5 は```name = value```を強制するものと, そうでないものを共存させることができる.
下記では, cだけ, name = valueの形式を強制する.

```
In [18]: def kwonly(a, *b ,c):
   ....:     print(a, b, c)
   ....:

In [19]: kwonly(1,2,3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-763cbb52b1ed> in <module>()
----> 1 kwonly(1,2,3)

TypeError: kwonly() missing 1 required keyword-only argument: 'c'
# cはname = valueでしか値が渡せない


In [20]: kwonly(1, 2, c=3)
1 (2,) 3
```

## 6について
5とほぼ同じなんだけど, 全部をname = valueにして, かつデフォルト値も決めておきましょう, というもの. もちろんデフォルト値はなくてもよいです. デフォルト値もできますよ, という意味程度で.

```
In [21]: def kwonly2(*, b , c=3):
   ....:     print(b,c)
   ....:

In [22]: kwonly2(1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-22-ace6c6f57de4> in <module>()
----> 1 kwonly2(1)

TypeError: kwonly2() takes 0 positional arguments but 1 was given
# そもそも1が引数として認識されていない

In [23]: kwonly2(b=1)
1 3

In [24]: kwonly2(b=1,2)
  File "<ipython-input-24-6c15c1f279e8>", line 1
    kwonly2(b=1,2)
               ^
SyntaxError: non-keyword arg after keyword arg
# cはname = valueでしか渡せない(もちろんbも)


In [25]: kwonly2(b=1,c=2)
1 2
```
JavaScriptのDeepCopyでJSON.parse/stringifyを使ってはいけない

JavaScriptでのDeepCopyはJqueryではextend, angular.js だと angular.copy を使って簡単にできてしまうようだけれど、標準実装としてはそもそも用意がされていないようだ。

だから自分で作らないと行けないし、それにはいくつもの方法があって、中には罠のようなものもある。

例えば適当に個人ブログなんかを当たって見つかるのがJSONを経由した方法。

```javascript
var copy = JSON.parse(JSON.stringify(obj));
```

オブジェクトをJSON文字列に変換してから再びオブジェクトに戻すというハック的なやり方だ。stackoverflowだとこれが一番高速に動くぜ！なんて意見もあって、さすがネイティブ実装されたメソッドなだけはあるという感じだ。お手軽感も高い。

しかしDeepCopyする方法として実戦投入するにはいくつかの問題がある。
###①そもそもDeepCopyするためのものじゃない

　この方法を知らない他人がコードを見たときに「ああ、DeepCopyをしてるんだな」とはすぐに気づけないだろう。

###②破壊的な変換を伴う

　JSON.stringify()を行ったときに破壊的な変換が行われてしまう可能性がある。
　オブジェクトのプロパティに以下の３種類が入っている場合だ。

####Dateオブジェクト

```javascript
var d = new Date(); // Wed Aug 05 2015 21:47:25 GMT+0900 (JST)
JSON.stringify(d);  // "2015-08-05T12:47:25.328Z"
```

####function

JSON.stringifyするとなぜか消えてしまう。

####undefined

これもfunction同様、stringifyによって消されてしまう。

よって以下のオブジェクトをJSON.parse/stringifyでDeepCopyしようとすると悲惨な目に遭う。

変換前

```javascript
// コピーするオブジェクト
var obj = {
    p: "hoge", 
    d: Wed Aug 05 2015 22:23:40 GMT+0900 (JST),
    u: undefined,
    f: function(){}
}

// DeepCopyしたつもり
var copy = JSON.parse(JSON.stringify(obj));
// {p: "hoge", d: "2015-08-05T13:23:40.864Z"} ごっそり抜け落ちる
```

３種類と書いたが他にもあるのかもしれない。 何にせよ、軽々しく使ってはいけない方法だろう。

参考
[[stackoverflow] Most elegant way to clone a JavaScript object](http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object)
[[stackoverflow] What is the most efficient way to clone an object?](http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-an-object)
Swiftでバネのようにバウンスするメニューを作ってみた

SkypeのiOSアプリで見るバウンドするアニメーションを実装してみた。
その要点をまとめておく。

## デモ
https://github.com/ytakzk/Hokusai
![Demo](https://raw.githubusercontent.com/wiki/ytakzk/Hokusai/images/demo.gif)


## 実装方法

### CADisplayLink
アニメーションにはCADisplayLinkを使用した。
ディスプレイが更新されるタイミングで関数が走るため、
NSTimerよりもアニメーション適している。

### UIBezierPath
波のようなアニメーションを作るために、 ベジェ曲線を利用する。 
具体的にはUIBezierPathで毎フレームごとにCALayerを描画。

```
// レイヤーの開始点に移動
UIBezierPath().moveToPoint(開始点)

// 現在の点からベジェ曲線を描いて次の点へ移動
UIBezierPath().addQuadCurveToPoint(次の点,
        controlPoint:曲率を作るための制御点)

// 現在の点から開始点までのパスを閉じる
UIBezierPath().closePath()
```

ベジェ曲線については、これを見ればなんとなくイメージできるはず。
![ベジェ曲線](http://4.bp.blogspot.com/-bcXUKttO9O8/TpDEeCG7msI/AAAAAAAAJeY/xl1tWNjw4vo/s800/step2.gif)
出典：[sigbus.info](http://blog.sigbus.info/2011/10/bezier.html)


### 該当するソースコード
```swift
// アニメーション開始時に呼ばれる
func positionAnimationWillStart() {
    // displayLinkでループ開始
    if displayLink == nil {
        displayLink = CADisplayLink(target: self, selector: "tick:")
        displayLink!.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode)
    }
}

// アニメーションの関数
func updatePath() {
    // 四角形の幅と高さを取得
    let width  = CGRectGetWidth(shapeLayer.bounds)
    let height = CGRectGetHeight(shapeLayer.bounds)
    
    // パスを描く
    // bendableOffsetが肝で、画面からせり出してくる距離に応じて大きさを変化させ、
    // メニュー上部の波を作る。
    let path = UIBezierPath()
    path.moveToPoint(CGPoint(x: 0, y: 0))
    path.addQuadCurveToPoint(CGPoint(x: width, y: 0),
        controlPoint:CGPoint(x: width * 0.5, y: 0 + bendableOffset.vertical))
    path.addQuadCurveToPoint(CGPoint(x: width, y: height + 100.0),
        controlPoint:CGPoint(x: width + bendableOffset.horizontal, y: height * 0.5))
    path.addQuadCurveToPoint(CGPoint(x: 0, y: height + 100.0),
        controlPoint: CGPoint(x: width * 0.5, y: height + 100.0))
    path.addQuadCurveToPoint(CGPoint(x: 0, y: 0),
        controlPoint: CGPoint(x: bendableOffset.horizontal, y: height * 0.5))
    path.closePath()
    
    shapeLayer.path = path.CGPath
}

func tick(displayLink: CADisplayLink) {
    if let presentationLayer = layer.presentationLayer() as? CALayer {
        // メニューの位置によってoffsetの大きさを変化させる。
        var verticalOffset = self.layer.frame.origin.y - presentationLayer.frame.origin.y
                
        bendableOffset = UIOffset(
            horizontal: 0.0,
            vertical: verticalOffset
        )
        // アニメーション用の関数を呼ぶ
        updatePath()
        
        // offsetが0になったタイミングでループを終了
        if verticalOffset == 0 {
            self.displayLink!.invalidate()
            self.displayLink = nil
        }
    }
}
```


## ライブラリ
せっかくなのでライブラリ化してgithubに公開した。
cocoapods、Carthageどちらにも対応している。
https://github.com/ytakzk/Hokusai

使い方は簡単。
クロージャーでもセレクターにも対応しているので色んな用途に使えるはず。

```
let hokusai = Hokusai()

// クロージャーでコールバックを定義する
hokusai.addButton("Button 1") {
    println("Rikyu")
}

// セレクターでもコールバックを定義できる
hokusai.addButton("Button 2", target: self, selector: Selector("button2Pressed"))

// メニューを出す
hokusai.show()

func button2Pressed() {
    println("Oribe")
}
```
ジェネリクスでオーバーロードいらず！？

#ジェネリクスを使うと型を特定せずに同じメソッドやクラスで別のプログラムができます。#
まずはジェネリクスを利用した関数から説明していきます。


```swift
import Foundation

func test<T>(n1:T)->T{
    return n1
}

var num1:Int = 100
print(test(num1)) //100と表示
```


testというn1というパラメーターを持つ関数です。```<T>```というものがくっついています。
```<T>```のTはタイプパラメーターといいますが、Tという文字である必要はありません。一般的な書き方がそうなだけです。
test関数内では特に型を定めていません。num1でInt型に設定し、100という数字を代入しています。

型を決めてしまうと同じ処理をさせるには型の制約を受けることになります。
例えば以下のような場合です。

```swift

import Foundation

class NoGenerics {
    func test (param: String) -> String{
        return param
    }

    func test (param: Int) -> Int{
        return param
    }

    func test (param: Double) -> Double{
        return param
    }
}

var age = NoGenerics()

print(age.test("HI"))    //HIと表示
print(age.test(100))     //100と表示
print(age.test(9.999))   //9.999と表示
```

違う型のtestという同じ名前の関数を持つクラスNoGenericsではメソッドで呼ばれるときに与えたパラメーターの型を推測して値を返しています。いわゆる***オーバーロード***です。

ジェネリクスで```func test<T>```とすることで呼ばれるときにパラメーターの型を指定すれば1回書けば済んでしまいます。

次にクラスでジェネリクスを利用した例を書きます。

```swift
import Foundation

class NazoPerson<T,U> {
    let name: T
    var age: U
    init(name: T, age: U){
        self.name = name
        self.age = age
    }
}

var i_am_taro = NazoPerson<String, Int>(name: "曙太郎", age: 100)
var i_am_shiro = NazoPerson<Int, String>(name: 46, age: "四十六")

print("名前:\(i_am_taro.name), 年齢\(i_am_taro.age)歳") //名前:曙太郎, 年齢100歳
print("名前:\(i_am_shiro.name), 年齢\(i_am_shiro.age)歳") //名前:46, 年齢四十六歳
```

名前も年齢も型を決めないNazoPersonクラスでnameにT、ageにUというタイプパラメーターをつけました。i_am_...で型を決めています。

ジェネリクスを応用すれば色々なことができますね＼(^o^)／
UICollectionViewでcellの再利用時に描画の重複を防ぐ方法


```Objective-C:Objective-C
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *cellId = @"Cell";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath];
    
    // 再利用時にサブビューをクリアする
    for (UIView *subview in [cell subviews]) {
        [subview removeFromSuperview];
    }

	// cellの情報をセットする
   
    return cell;
}
```
無料サーバーにドメインハックを求めるのは間違っているだろうか



**収穫を得るには、種をまかねばならない。**
**ドメインハックをするには、ドメインを取得しなければならない。**

ある朝、無性にドメインハックなるものをしてみたくなる。ドメインハックってなんだっけ。とwikiってみる（最近あまり聞かないかも、と思う）。アイデアがあるわけではなく、ドメイン取得維持費用のあてもない。だが、一度くらいはドメインハックなるものをやってみたい。で、無料でできそうな手段を考えてみたが思いつかなかったので、これ以上考えなくても良いように、できることだけやった。
というのが少し前の話。
その時作った”呪文共有サービス-crowly"をまとめてみた。

http://crowly.webcrow.jp


結果、語呂合わせにもならなかった。

###**やったこと**
-----

* __トップレベルドメインを諦める__

ドメインハックではなくなってしまうけど、第2レベルドメインをハックしてみる路線に変更。

* __無料サーバー__

webcrowという無料サーバーがあって、***.webcrow.jpというurlになるので、crow→アレイスター・クロウリーを連想してみた。語尾はleyじゃなくてlyにしてみたかった。語呂合わせどころか、全然判りづらいだけだった。

* __AngularJS__

AngularJSでかなり前に作ったのを再利用した。
2.0が理解できなさそうで勉強するのをやめてしまっていたが、とりあえず動いているっぽい。

* __Parse__

バックエンドはParse.com。


* __黒系のデザイン__

デザインは昔のメタルバンドっぽいのを目指した。
googleフォント探すの好き。




* __Web Speech API__

テキスト読み上げは一度試してみたかったこと。
ブラウザとかバージョンとかがうざい、firefoxで動かないっぽい。
言語を区別するのを大雑把にググってやってみたけど、呪文って何語なのかわからないよ。再生回数カウントするのは、画面の更新がきれいじゃない感じ。

ラテン語とかだと、もっとカッコよく喋るのかも。

```js

// speak
$scope.speak=function(list){
var myspell = list.spell;
var myspeak = new SpeechSynthesisUtterance(myspell);
if (myspell.charCodeAt(1)>256){
    myspeak.lang = "ja-JP";

}else{
   myspeak.lang = "en-US";
}


speechSynthesis.speak(myspeak);

$scope.vote(list.id);

getListFactory.getList().then(function(list){
$rootScope.res = list;
$rootScope.isCardList=true;
});

$scope.apply();
$rootScope.apply();

};

});
// ---end---

```
【Appleデベロッパ向け】iTunes Connectの報酬振込先をゆうちょにするためのzengin codeとか。


ご無沙汰しております。
最新作「<a href="http://blueroy.jimdo.com/%E6%BC%A2%E6%96%B9%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%B3%E3%83%96%E3%83%AB/" target="_blank">漢方スクランブル</a>」がなかなか人気で、検索からのダウンロードと思われる方が増えていてちょっと頑張ろうかなと思っている私です。

さて。こんな私ですが有償アプリ"<a href="http://blueroy.jimdo.com/icf-inputter/" target="_blank">ICF inputter</a>"というものも世に出しておりまして（リンク先には無償版"ICF inputter free(iOS/Android)"へのリンクもありますのでご興味あれば是非）。
ありがたいことにそちらもいくばくか売れるようになってきましたので、ゆうちょの個人事業用の口座を開設いたしました。

既にゆうちょ口座があるところに作ろうとすると「口座を更に作ろうとする理由」の紙を書かされますが、「個人事業用の口座を開設したい」というのを書けばOKです。

で、いざiTunes Connectの報酬振込先をゆうちょにしようとしてちょっと戸惑ったので…
情報共有したく筆をとりました。
新規でデベロッパになろうとされている方がゆうちょへの振込を希望される場合にもお役に立てるかと思います。

＝
iTunes Connectの「契約／税金／口座情報」のところから
![スクリーンショット_2015-08-05_20_42_18.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/9edc1196-0a5a-b385-3ee6-1a86fe84c59d.jpeg)
ピンクで囲ってあるところを選んで

![スクリーンショット_2015-08-05_20_32_07.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/eda7d29e-fac3-51f1-358c-4e2db67424d4.jpeg)
↑のピンクのところを押すと口座情報が編集できて。

![スクリーンショット_2015-07-31_07_00_30.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/1e834c37-ef01-3cdd-18bb-b81c43656f1c.jpeg)
私の場合、最初は東京三菱UFJ銀行を指定していたのでこのような状態からのスタート。
既にUFJを指定しているので、他の銀行に変えたいのだが。。。
緑色の○のところに、変更先が現れない。

あ、その右の Add Bank Accountで追加すんのか

で、

ゆうちょのzengin codeだの支店だのの扱いがわからなくて、困ると。

結論書きます。
ゆうちょの通帳を用意してください
![IMG_20150731_070251_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/52244c45-0064-5d2a-2400-a73954d81f79.jpeg)
zengin code:9900-オレンジ下線部3桁数字
この場合は9900-428
Bank Account Number:水色線のところ

これで登録してください。

【要点】
zengin code = ゆうちょの9900＋店番3桁
Bank Account Number　=　他金融機関と取引するときの「口座番号」

ここに集うデベロッパさんたち、
お互い収入が得られるといいですね！

私もこれを書いたら、また頑張りますよー☆

現役女性薬剤師プログラマのワタシについては<a href="http://blueroy.jimdo.com/about-blueroy-inc/" target="_blank">こちら</a>を☆
zshのプロンプト設定を晒す

Qiita初投稿です。
zshのプロンプト設定がやっと自分の理想に近くなったので、
備忘録的な感じでまとめておきます。

#.zshrcの設定
```lang:.zshrc
autoload -U promptinit
autoload -U colors && colors

# 直前の返り値によって色変更 #
local p_color="%(?.%{${fg[cyan]}%}.%{${fg[magenta]}%})"

# スクリーン番号を（あれば）変数に格納 #
local window_no="${WINDOW:+"[$WINDOW]"}"

PROMPT="
%{$fg[cyan]%}User:%n%{${reset_color}%}
$p_color [%~] > %{${reset_color}%}"

RPROMPT="$p_color return:[%?]%{${reset_color}%}"

# ちょいメモ #
function memo() {RPROMPT="%S$1%s $p_color return:[%?]%{${reset_color}%}";}

# Googleカラーでサジェスト #
setopt correct
SPROMPT="( ´・ω・) ＜ %{$fg[blue]%}も%{${reset_color}%}%{$fg[red]%}し%{${reset_color}%}%{$fg[yellow]%}か%{${reset_color}%}%{$fg[green]%}し%{${reset_color}%}%{$fg[red]%}て%{${reset_color}%}: %{$fg[red]%}%r%{${reset_color}%}？ [(y)es,(n)o,(a)bort,(e)dit]
-> "
```
#説明
###PROMPT
プロンプトは最初に改行を入れることで、使ってるうちにゴチャゴチャして見づらくなるのを防いでます。
###RPROMPT
右プロンプトには一言メモと直前の返り値を表示
`$p_color`という変数を作り、返り値が0ならシアン、それ以外ならマゼンタと
プロンプトの色を変えてます。
![スクリーンショット 2015-08-05 21.09.28.png](https://qiita-image-store.s3.amazonaws.com/0/83976/5c1744c6-5bb5-1ebf-bf1e-5c9cc058200c.png)

`$ memo hoge`
で右プロンプトに一言メモが書けます。
メモを消すときは
`$ memo` 
でおK

#最後に
もっとこうした方がいい等、何かありましたら
ぜひコメントお願いします!!
mochaで特定バージョンだけスキップしたりしなかったりするテストをする。


[circle-ciで複数バージョンを検証](http://qiita.com/inuscript/items/f5dd5eacb10085d15ff7)できるようにしたので、特定バージョンだけでやるテストを書きたい。

`process.version`で現在のnodeのバージョンは取れるので、そこに`semver`を組み合わせると手軽にできる

```mocha.js
var semver = require("semver")
describe("何らかのテスト", function(){
  var itFn = it
  if(semver(process.version, ' < 0.12')){
    itFn = it.skip
  }

  itFn("0.12以上ならやるテスト", function(){
    // test...
  })
})
```
circle-ciで複数のnode.jsバージョンで検証をしたい


Travis.ciではできていた複数バージョンでのビルド。
「どーやるとできますかー」ってhelpで聞いてみたら、教えてくれた
（チャットっぽいヘルプUIすごい。circle-ciのサポート力高い。）

```circle.yml
test:
  override:
    - nvm alias default 0.12.0
    - npm test
    - nvm alias default iojs-v1.3.0
    - npm test
    - nvm alias default 0.10.34
    - npm test
```
こんな感じ。
nvm入っているので切り替えていけばいい。

元々教えてもらったやり方だと、デフォルトのマシンを`0.12.0`にして最初のnvm切り替えを省略していたが、いまいち可読性が良くなかったので全部nvmで切り替えることにした。


もしparallelにやりたいならこうやると良いらしい。個人的に需要はなかったのでこれは試してない。

```circle.yml
machine:
  node:
    version: 0.12.0
 
dependencies:
  pre:
    - if [ $CIRCLE_NODE_INDEX == "1" ] ; then nvm alias default iojs-v1.3.0 ; fi

test:
  override:
    - npm test:
        parallel: true
```
動画プレイヤー mpv のビルド（homebrew）

こんにちは。
わたしも mpv を homebrew 利用でビルドしてみました[^1]。こちらの mpv-player/[mpv.rb](https://github.com/mpv-player/homebrew-mpv/blob/master/Formula/mpv.rb) そのままですが、手を加えて好きなパッチを当てました。

```console
$ brew tap mpv-player/mpv
$ brew rm mpv
$ brew install --HEAD --with-bundle --with-little-cms2 --with-lua mpv.rb
 :
$ brew linkapps mpv
$ mkdir ~/.config/mpv
$ vi ~/.config/mpv/mpv.conf
```

```diff
$ diff -u mpv.rb.orig mpv.rb
--- mpv.rb.orig
+++ mpv.rb
@@ -62,6 +62,10 @@
     bundle_caveats if build.with? 'bundle'
   end
 
+  def patches
+    DATA
+  end
+
   def install
     ENV.prepend_create_path 'PYTHONPATH', libexec/'lib/python2.7/site-packages'
     ENV.prepend_create_path 'PATH', libexec/'bin'
@@ -104,3 +108,16 @@
     EOS
   end
 end
+
+__END__
+--- a/common/common.c.orig
++++ b/common/common.c
+  :
+  :
```

-------
[^1]: ビルド済みのものはこちらからダウンロードできるようです： http://sva.wakku.to/~chris/mpv_builds/ 。なお homebrew-cask/mpv.rb は廃止されたようです。
elastic beanstalk環境にあるインスタンスのprivate ipをリストで取得する

ruby

```
env = JSON.parse(`aws elasticbeanstalk describe-environment-resources --environment-name hogehoge`)
instance_ids = env['EnvironmentResources']['Instances'].map {|instance| instance['Id']}
reservations = JSON.parse(`aws ec2 describe-instances --instance-ids #{instance_ids.join(' ')}`)
private_ips = reservations['Reservations'].flat_map{|reservation| reservation['Instances']}.map{|instance| instance['PrivateIpAddress']}
```
unity > coroutineが始まらない > IEnumerableで宣言していた

```txt:動作確認
Unity 5.1.1-f on MacOS X
```

coroutineが始まらないと思ったら

```csharp
private IEnumerable SampleCoroutine()
{
...
```
としていた。

正しくは

```csharp
private IEnumerator SampleCoroutine()
{
...
```

疲れているのよ、モルダー。
げ！ローカルサーバーを切らずにターミナルを消しちゃった！


こんなことあると思います。
再度ターミナルに入り、rails sしても立ち上がらない。

```
Address already in use - bind(2) for 127.0.0.1:3000 (Errno::EADDRINUSE)
```

こんなエラーまで出てきた。
「3000番は既に使われてるよ！新しく接続とか無理無理！」
どうやらこういうことらしい。

ということは、3000番の接続を切ってあげればok。

以下対処法。

```
lsof -i :3000
```
まずターミナル上で上のコマンドを入力。
3000番ポートに現在接続しているものの一覧を出してくれる。

するといくつか出てくるなかで、今回のポイントはPID
接続しているもののIDです。


これを削除してやれば元の綺麗なportに戻るわけですな。

```
kill -QUIT <PID>
```

これで元どおり。楽しいrails lifeを。
middleman-syncでgzipする


`sync.gzip_compression = true` にすればgzipになりそうだけどならない。

コードを見ると最終的に`AssetSync`がsyncしている。[asset_syncのreference](https://github.com/rumblelabs/asset_sync#automatic-gzip-compression)を見に行くと、`.gz`のものとそうでないものの両方を用意してあるとgzがuploadされると書いてある。

ので
`build/cta/index.html.gz` と `build/cta/index.html` の両方を用意して実行したら

```
Uploading: build/cta/index.html.gz in place of cta/index.html saving 24.45%
Ignoring: cta/index.html.gz
```

というメッセージが出ててきてやっと `Content-Encoding: gzip` になりました。
FYI: @ngs
【CakePHP】save()でTIMESTAMP型に現在時刻を保存する時、date()を使わない方が良い理由

CakePHPでデータベースに対して insert や update を行う際、PHPのメソッドである date() メソッドは使用しないほうが良い。

# 代案
CakePHPにおいてDBに現在時刻を保存する場合は```DboSource::expression('NOW()')```を使うと良い。

# 理由
2つの表す時刻は次の通りである。

|記述|表す時刻|
|:---|:---|
|```date('Y-m-d H:i:s')```|PHPサーバ時刻|
|```DboSource::expression('NOW()')```|DBサーバ時刻<br>SQLで```NOW()```を直ガキした場合や```CURRENT_TIMESTAMP```と記述した場合と同じ。|
|```ConnectionManager::getDataSource('default')->expression('NOW()')```|```DboSource::expression('NOW()')```で、```Non-static method DboSource::expression() should not be ...```と言われるようならこっち。|

ということである。
つまりは、前者はDBサーバとのタイムゾーンの整合性が保証されないのに対し、後者はそこが保証されるということ。

MySQLでは```DEFAULT CURRENT_TIMESTAMP```, ```ON UPDATE CURRENT_TIMESTAMP```制約は1テーブルにつき1カラムにしか設定できないなどの制約があり、データ更新時に手動で時刻を与えてやらなければならない場合がある。
この時先の制約を付けたカラムとの時刻整合性を保つためには```DboSource::expression('NOW()')```を用いた方が良いということ。
docker0のIPアドレス帯の変更

Dokkuを使ってDockerをインストールしたら内部LANの172.X.X.Xとかぶってしまって通信ができなくなりました。docker0のアドレスを変更する方法で悩んだのでメモです。

## 環境

+ Ubuntu 18.04, 14.04
+ [Dokku](https://github.com/progrium/dokku)

インストールはドキュメント通りに普通にやります。アドレスがかぶっているとインストール中にバシッと通信が途切れます。

## 変更方法(Ubuntu 18.04)

昔と同じように修正したら反映しないので見直したら変更箇所が変わっていました...

```:/etc/default/docker
#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
#   Please see the documentation for "systemd drop-ins":
#   https://docs.docker.com/engine/admin/systemd/
#
....
```

いろいろ方法はあるようですが、/etc/docker/daemon.jsonを書きかえる方法が良さそうです。

```:/etc/docker/daemon.json
{
    ...
    "bip": "192.168.200.1/24",
    ...
}
```

サービスを再起動します

```sudo service docker restart```


設定したipになっているのを確認します

```
$ ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.200.1  netmask 255.255.255.0  broadcast 192.168.200.255
        ether 02:42:01:c5:3d:0e  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

## 変更方法(Ubuntu 14.04)

/etc/default/dockerファイルを変更します。

```:/etc/default/docker
...
DOCKER_OPTS="--bip=192.168.200.1/24"
...
```

コマンドラインオプションの--bipにて利用するアドレス帯を指定するだけなんですが、情報が無かったので。
Railsアプリを複数ドメインにて運用する

調べたら意外と情報がなかったので掲載。

rails1.comとrails2.comで同じrailsアプリを稼働したい場合。

まずはsettingsでドメイン毎のホスト名を設定する

```yaml

main:
  service_name: "Rail1"
  service_name_kana: "レイルズ１"
  service_protocol: "http"
  service_host: "rails1.com"
  cookie_domain: ".rails1.com"

rails2:
  service_name: "Rail2"
  service_name_kana: "レイルズ２"
  service_protocol: "http"
  service_host: "rails2.com"
  cookie_domain: ".rails2.com"

```

そして各ホスト用のroutesファイルを用意する

config/routes/rails1.rb

```rb

Rails.application.routes.draw do
  default_url_options host: Settings.main.service_host
  root to: "home#index"
end

```


config/routes/rails2.rb

```rb

Rails.application.routes.draw do
  default_url_options host: Settings.rails2.service_host
  root to: "home#index"
end

```
Route53のAレコードをawscliで更新する


# IAMポリシーの設定

更新には `route53:ChangeResourceRecordSets` アクションが必要。
進捗確認もするなら `route53:GetChange` アクションが必要。
Route53のリソースレベルパーミッションでは、レコード単位の指定はできないのでホステッドゾーンまで指定。

[Using IAM to Control Access to Amazon Route 53 Resources](http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/UsingWithIAM.html)
[AWS Services That Work with IAM](http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "route53:ChangeResourceRecordSets",
      "Resource": "arn:aws:route53:::hostedzone/XXXXXXXXXXXXXX"
    },
    {
      "Effect": "Allow",
      "Action": "route53:GetChange",
      "Resource": "arn:aws:route53:::change/*"
    }
  ]
}
```

# 更新リクエスト用のJSONを用意

形式については `aws route53 change-resource-record-sets help` か [AWS CLIのドキュメント](http://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html) を参照。
`UPSERT` があって便利。

```json:r53.json
{
  "Comment" : "",
  "Changes" : [
    {
      "Action" : "UPSERT",
      "ResourceRecordSet" : {
        "Name" : "my.example.com",
        "Type" : "A",
        "TTL" : 300,
        "ResourceRecords" : [
          {
            "Value": "0.0.0.0"
          },
          {
            "Value": "0.0.0.0"
          }
        ]
      }
    }
  ]
}
```

# 更新リクエストを送る

```sh:awscli
$ aws route53 change-resource-record-sets --hosted-zone-id XXXXXXXXXXXXXX --change-batch file://r53.json
```

リクエストが受け付けられると `PENDING` ステータスになる。
Idは進捗確認に必要なのでメモっておく。

```json:response
{
    "ChangeInfo": {
        "Status": "PENDING",
        "Comment": "comment",
        "SubmittedAt": "2015-08-05T00:00:00.000Z",
        "Id": "/change/XXXXXXXXXXXXX"
    }
}
```

# 進捗確認

```sh:awscli
$ aws route53 get-change --id /change/XXXXXXXXXXXXX
```

まだ `PENDING` だが、この時点で一部更新されている可能性はある。

```json:response
{
    "ChangeInfo": {
        "Status": "PENDING",
        "Comment": "comment",
        "SubmittedAt": "2015-08-05T00:00:00.000Z",
        "Id": "/change/XXXXXXXXXXXXX"
    }
}
```

`INSYNC` ステータスになったら完了。
Route53のDNSサーバは全て更新されている。

```json:response
{
    "ChangeInfo": {
        "Status": "INSYNC",
        "Comment": "comment",
        "SubmittedAt": "2015-08-05T00:00:00.000Z",
        "Id": "/change/XXXXXXXXXXXXX"
    }
}
```
[JavaScript] 画像変換：<img>要素 ⇔ Base64（相互変換）

**\<img\>要素 ⇔ Base64 相互変換についてのまとめです。注意点として、\<img\>要素 → Base64 の時は、Ajax同様に JavaScript のクロスドメイン制限があります。つまり、<font color="red">外部サーバーにある画像をBase64形式に変換することはできません。</font>**


# ![](//goo.gl/tuSQrq) \<img\>要素 → Base64

```js:JavaScript
//=====================================================
// <img>要素 → Base64形式の文字列に変換
//   img       : HTMLImageElement
//   mime_type : string "image/png", "image/jpeg" など
//=====================================================
function ImageToBase64(img, mime_type) {
    // New Canvas
    var canvas = document.createElement('canvas');
    canvas.width  = img.width;
    canvas.height = img.height;
    // Draw Image
    var ctx = canvas.getContext('2d');
    ctx.drawImage(img, 0, 0);
    // To Base64
    return canvas.toDataURL(mime_type);
}

//=====================================================
// 使い方
//=====================================================
var img = document.getElementById('MyImg');
var b64 = ImageToBase64(img, "image/jpeg"); // "data:image/jpeg;base64,XXXXXX..." みたいな文字列
```

⇒ デモはこちら：<a href="http://jsfiddle.net/yasumodev/nLo4n5rg/" target="_blank">Image to Base64｜JSFiddle</a>

この手法を応用すると、画像リサイズや回転もできます。⇒ <a href="http://qiita.com/yasumodev/items/ec684e81ee2eac4bdddd" target="_blank">別記事参照</a>


# ![](//goo.gl/tuSQrq) Base64 → \<img\>要素

```js:JavaScript
//=====================================================
// Base64形式の文字列 → <img>要素に変換
//   base64img: Base64形式の文字列
//   callback : 変換後のコールバック。引数は<img>要素
//=====================================================
function Base64ToImage(base64img, callback) {
    var img = new Image();
    img.onload = function() {
        callback(img);
    };
    img.src = base64img;
}

//=====================================================
// 使い方
//=====================================================
Base64ToImage(base64img, function(img) {
    // <img>要素にすることで幅・高さがわかります
    alert("w=" + img.width + " h=" + img.height);
    // <img>要素としてDOMに追加
    document.getElementById('main').appendChild(img);
});
```

Base64形式の文字列を \<img\>要素に変換することで幅と高さが分かるようになります。また、そのままDOMに追加することもできます。

⇒ デモはこちら：<a href="http://jsfiddle.net/yasumodev/tg298ns7/" target="_blank">Base64 to Image｜JSFiddle</a>

(･o･ゞ いじょー。


# ![](//goo.gl/tuSQrq) 参考URL

<a href="http://www.html5.jp/canvas/ref/method/drawImage.html">drawImage() メソッド - Canvasリファレンス｜HTML5.jp</a>
VMWare環境でNICを認識しているのに外部通信できない場合

実際おきた現象と対処方法のメモです。

解決しました！！！(2015/10/1追記)

## 環境
+ Dell-ESXi-5.1 Updated 2-1483097-A01
+ Ubuntu 14.04/14.10 Server(64bit)

## 状況
+ VMWareの環境作成時に「Ubuntu(64bit)」を選択
+ ネットワークアダプターでe1000/vmxnet2/vmxnet3を選択
+ 通常通りインストール
+ VMToolsをインストール（必要であれば）
+ NICは認識しており、自分IPへの通信はできているが自分以外にはまったく繋がらない。
 
> sudo ethtool eth0
> ...
> Link detected: no

↑リンクしていない状態。物理だとケーブルが外れている状況だが、仮想なのでそんな訳はない...。

## 対処方法

+ 環境作成時に「Ubuntu (32bit)」を選択
+ ネットワークアダプターで「フレキシブル」を選択

※OSの選択によって出てくるネットワークアダプターの選択肢が変わります（始めて知った）

## 説明

何故か手元の環境では「e1000」「vmxnet3」のどちらのドライバーもロードはできて認識するが、リンクが切れた不思議な状態に。リンク切れ状態で有る事を把握するのにかなりの時間がかかりました。vCenterから見ると「接続中」のチェックを入れることができません。

![vm.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/83365259-9b73-aef0-22a0-f7f1c096f908.jpeg)

どうやってもリンク状態を変更する事ができず、インストール時のOS種別を変えることで出てきた「フレキシブル」を選択することで「pcnet32」ドライバーがロードされ通信する事ができます。

なんとなくESXiのバグっぽいのですが自分の環境では無いのでバージョンアップできていません。どこにも同様の事例が無いっぽいのでかなり悩みました。そして、解決方法を忘れて2度悩みました。

~~ちなみに同じESXi上のWindows環境では、同様の現象はおきていません。~~
Windows環境でも同様の現象が発生しています。

## 解決しました(2015/10/1追記)

本番系なので再起動もできず放置していましたが、Windows環境でも追加できない現象が出てきていよいよ困ったので再起動前に問合せをかけたところ現象が解決しました。

+ ESXiホストの再起動で一応解消
+ 根本原因はメモリーリークとの事でパッチ有

原因：ネットワーク接続が Out of memory で失敗している

```vmkernel.log
2015-08-27T05:52:04.304Z cpu0:25383783)Net: 1858: can't connect internal  to
Service-02: Out of memory

2015-08-27T05:52:04.304Z cpu0:25383783)WARNING: Net: 2021: connect to
vswitch Service-02 from world 25383784 failed: Out of memory
```

KB：
E1000/E1000E vNIC を使用する仮想マシンのあるホストを ESXi 5.1 U2 にアップグレードするとネットワークの問題が発生する(2073735)
http://kb.vmware.com/kb/2073735

反省点：
動きの怪しい時はvmkernel.logもちゃんと見よう！
ブラウザがリロード前の位置にスクロールしている対応メモ

今更気付いたのだけど、この頃のブラウザはスクロール位置を覚えていて、リロード後もその位置に自動スクロールしていたりする。

というか、割と前からそうなっている模様。
ブラウザリロード時にスクロールをページトップにもってくる方法
http://helog.jp/environment/browser/reload-pagetop/

表示位置固定系のライブラリに影響がありそうだが、最近だと、jQuery.gpFloatというライブラリがうまく動作しなかった。
jQuery.gpFloat
https://github.com/ginpei/jQuery.gpFloat

```js
// リロード後、スクロール状態だと表示位置の計算がおかしくなることがある。
    $(function () {
        (function () {
            $('.fixed-top').gpFloatX();
        })();
    });
```

付け焼刃的対応。

```js
    $(function () {
        (function () {
            var _top = $(window).scrollTop();
            var _left = $(window).scrollLeft();
            $(window).scrollTop(0);
            $(window).scrollLeft(0);
            $('.fixed-top').gpFloatX();
            $(window).scrollTop(_top);
            $(window).scrollLeft(_left);
        })();
    });
```
MongoDB Bulk Methodを使う


## Bulk Method とは
2.6から実装された、大量にinsert、updateを行うときに
効率よく処理してくれる便利な物


## 実装以前
```
db.table_name.insert([{docA}, {docB}, {docC}])
```

こんな感じで配列で渡してあげることで実現してた

## 使って見る
```javascript
var bulk = db.tbl_name.initializeUnorderedBulkOp();
bulk.insert ({docA});
bulk.insert ({docB});
bulk.insert ({docC});
bulk.execute();
```
まず、bulkオブジェクトを生成しその後に実行したい操作をつんでいく
最後にexecuteメソッドを利用して反映。

bulkオブジェクトには、 __initializeUnorderedBulkOp__ と __initializeOrderedBulkOp__ が存在する。

## UnorderedとOrederd
エラー発生時にそのまま続けるかどうか

``` javascript:main.js
var try_bulk_insert = function(bulk) {
  bulk.find({}).remove();
  bulk.insert(datas[5000]);
  datas.forEach(function(i) { bulk.insert (i) });

  try {
    bulk.execute();
  } catch (e) {
    printjson(e);
  }
}

try_bulk_insert(
  db.tbl_insert_unorderd_bulk.initializeUnorderedBulkOp()
);

try_bulk_insert(
  db.tbl_insert_orderd_bulk.initializeOrderedBulkOp()
);
```

結果
Orederdはエラー発生で処理を中断しているが
Unorderedは可能な限り実行している

``` 
{
	"writeErrors" : [
		{
			"index" : 5002,
			"code" : 11000,
			"errmsg" : "E11000 duplicate key error collection: test.tbl_insert_unorderd_bulk index: _id_ dup key: { : ObjectId('xxxxx') }",
			"op" : {
				"_id" : ObjectId("xxxxx"),
				"skey" : 89,
				"user_id" : 1752659,
				"area_id" : 3,
				"comp" : 2,
				"map_id" : 1
			}
		}
	],
	"writeConcernErrors" : [ ],
	"nInserted" : 100000,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
}
{
	"writeErrors" : [
		{
			"index" : 5002,
			"code" : 11000,
			"errmsg" : "E11000 duplicate key error collection: test.tbl_insert_orderd_bulk index: _id_ dup key: { : ObjectId('xxxxx') }",
			"op" : {
				"_id" : ObjectId("xxxxx"),
				"skey" : 89,
				"user_id" : 1752659,
				"area_id" : 3,
				"comp" : 2,
				"map_id" : 1
			}
		}
	],
	"writeConcernErrors" : [ ],
	"nInserted" : 5001,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
}
```


## 計測する
``` javascript:main.js
//
// 10万件のデータ,以下の形式のファイルを読み込み
// var datas = [ { object }, {object} ];
//
load("./tbl_data.json");

var measure = function(tag, target_func)
{
   var startTime = new Date();
   target_func();
   var endTime = new Date();

   print(tag + " : " + (endTime - startTime) + "ms");
};

// 一件ずつinsert
measure("insert 1", function() {
  datas.forEach(function(i) {db.tbl_insert.insert (i) });
});

// 1000件ずつ配列によるBulkinsert
measure("insert 2", function() {
  for (var i = 0; i < datas.length; i += 1000) {
    db.tbl_insert_bulk.insert( datas.slice(i, i + 1000) );
  }
});

// BulkMethodを利用したinsert
measure("insert 3", function() {
  var bulk = db.tbl_bulk.initializeUnorderedBulkOp();
  datas.forEach(function(i) { bulk.insert (i) });
  bulk.execute();
});

```

実行結果

```
$ mongo main.js 
MongoDB shell version: 3.0.5
connecting to: test
insert 1 : 53365ms
insert 2 : 5903ms
insert 3 : 6138ms
```


## 結果
バッチ処理で今回のような大量にinsertすることがあると思う。
こういうときは __BulkInsert__ を利用する。

数十件レベルであれば、配列によるBulkInsertで問題ない

数千件を超えてくる場合であればBulkMethodを使うほうが
自分でスライスしたり調整しなくていいので楽かなと
【Android】EditTextでsetErrorが真っ白になる問題に対応【support:design:22.2.1】

`com.android.support:design:22.2.1`を導入し、
AppTheme(applicationで定義しているtheme)のparentを'Theme.AppCompat.Light.DarkActionBar'にした所、2.x系でEditTextのsetErrorが真っ白になってしまう問題に突き当たった。
(何で背景色白色なのに文字色黒になってないんだよ！！素直に`TextInputLayout`使えという思し召しか...)

結論だけ書くと、style内で
`        <item name="android:textColorTertiaryInverse">@color/primary_text_default_material_light</item>`
とか書くと解決できそうです。(中身はsetErrorの文字色)

まだソース全然読みきれてないので何とも言いがたいですが、
同じ部分で迷う人が居た時の為に一時的にでも書き残しておきます。。。
(他にどこで利用されてるのか調べねば...)
PHP で SFTP

## phpseclib

phpseclib なら簡単です。

```console
$ composer require phpseclib/phpseclib:\*
```

```php
<?php
require __DIR__ . '/vendor/autoload.php';

$sftp = new Net_SFTP('ore-no-server.example.com');

$keyfile = '/path/to/ore-no-key';

$key = new Crypt_RSA();
$key->loadKey(file_get_contents($keyfile));

if (!$sftp->login('ore', $key)) {
    exit('Login Failed');
}

echo $sftp->pwd() . "\r\n";
$sftp->put('filename.ext', 'hello, world!');
print_r($sftp->nlist());
```

↑の例は公開鍵認証ですが、次のようにすればパスワード認証もできます。


```php
<?php
require __DIR__ . '/vendor/autoload.php';

$sftp = new Net_SFTP('ore-no-server.example.com');

if (!$sftp->login('ore', 'ore-no-password')) {
    exit('Login Failed');
}

echo $sftp->pwd() . "\r\n";
$sftp->put('filename.ext', 'hello, world!');
print_r($sftp->nlist());
```

## phpseclib 2.0.0

コメントでの @kuwa72 さんからの指摘の通り、最新の 2.0.0 だと名前空間が使われているため、次のように変更する必要があります。

```php
<?php
require __DIR__ . '/vendor/autoload.php';

use phpseclib\Net\SFTP;
use phpseclib\Crypt\RSA;

$sftp = new SFTP('ore-no-server.example.com');

$keyfile = '/path/to/ore-no-key';

$key = new RSA();
$key->loadKey(file_get_contents($keyfile));

if (!$sftp->login('ore', $key)) {
    exit('Login Failed');
}

echo $sftp->pwd() . "\r\n";
$sftp->put('filename.ext', 'hello, world!');
print_r($sftp->nlist());
```

## pecl ssh2

拡張にもあるけどあんまりメンテナンスされている感じがしないので使うのはやめておきます。

- https://pecl.php.net/package/ssh2
- http://php.net/ssh2
敢えてGitをソースファイルからインストールする


# 何故？
- yum install だと最新が取れない(´・ω・`)
- brew install でエラーが出て挫けた(´・ω・`) { 後で頑張る )
- テスト的に使うVB内のGitだからバージョン管理しなくてもいいかなって(´・ω・`)

# 環境
CentOS6.6 (Vagrant)

# Gitのバージョンを選択
- [こちら](https://www.kernel.org/pub/software/scm/git/)から欲しいバージョンのURLを取得。

　今回は最新バージョンが欲しかったので *2.5.0* のURLを取得。

# 前準備

```shell-session
$ yum install perl-ExtUtils-MakeMaker curl-devel expat-devel gettext-devel   openssl-devel zlib-devel
```

# Gitのセットアップ
- シェルで先ほどのURLを使ってDL

```shell-session:shell
$ su - # ルートで作業
$ cd /usr/local/src
$ wget https://www.kernel.org/pub/software/scm/git/git-2.5.0.tar.xz
```

- ファイルの解凍

```shell-session:shell
$ xz -dv git-2.5.0.tar.xz
$ tar -xvf git-2.5.0.tar
```

- 旧バージョンを削除
yumでインストールしていたので。

```shell-session:shell
$ yum erase git
```

- セットアップ

```shell-session:shell
$ cd git-2.5.0
$ ./configure
$ make && make install
```

- 確認

```shell-session
$ git --version
git version 2.5.0
```

おっしゃ幸せ( *´艸｀)


# 参考サイト
- [fatal: Unable to find remote helper for 'https'の対処](http://rcmdnk.github.io/blog/2013/07/27/computer-cygwin-git/)
- [Can’t locate ExtUtils/MakeMaker.pm](http://katzplus.com/centos-6/namazu/cant-locate-extutilsmakemaker-pm/)
TerraformでのAWS環境構築の設定を分ける


TerraformでAWS環境のつくり方は
[Terraform簡易チュートリアル on AWS - Qiita](http://qiita.com/zembutsu/items/93e546df765f8b2c4f32)
など分かりやすいですので参考にしてください。


**※ 追記(2016/10)**
本記事の内容は少し古いので、今だとこちらに書いてあるのやり方がいいかもです。
[Terraformにおけるディレクトリ構造のベストプラクティス ｜ Developers\.IO](http://dev.classmethod.jp/devops/directory-layout-bestpractice-in-terraform/)


なお、以下の記事は terraform v0.6.0 で使っているものになります。

## はじめに

AWS上に環境を作る際に、たとえば develop環境、staging環境、production環境など複数の環境を、同じterraformの設定ファイルで管理したいことがあるかと思います。

同じ設定ファイルを使うと言っても、

- instance_typeなどは環境ごとに分けたい
- 起動する台数も環境ごとに変えたい

など、環境ごとに違う部分もあるので、その辺りをどうやってるか、という話です。
大きく分けて、tfファイルをどう書くか、と、tfstateをどう管理するか、ということになります。


## tfファイルをどう書くか

### tfファイルの分け方

tfファイルというのは、terraformの設定を書くファイルです。
自分の場合、設定したい要素やサーバの種類の数だけtfファイルを作ってます。

- vpc.tf
- security_group.tf
- rds.tf
- elb.tf
- elasticache.tf
- app-server.tf

みたいな感じです。

また、それとは別に、`variables.tf`と `outputs.tf`を用意しています。`variables.tf`は、いろいろな変数を入れていて、`outputs.tf`にはterraformの実行の最後に出力したい値を記述します。

### 環境ごとの設定の書き方


まず、`variables.tf` には、空の変数として `env`を定義しておきます。
この`env`を今回は環境を示す変数として使います。

```
variable "env" {
  description = "dev or stg or pro"
}
```

次に、`variables.tf`には、例えば次のように環境ごとに分けたい設定を書きます。

```
variable "app_instance_type" {
  default = {
    dev = "m1.small"
    stg = "m1.small"
    pro = "m3.medium"
  }
  description = "app server instance type"
}
```

このような感じで`variables.tf`を作って置いたら、残りのtfファイルを作っていきます。


例えば`app-server.tf`では、サーバの名前を付ける部分で、次のような形で`var.env`という環境を表す名前を入れます。

```
tags {
    Name = "hoge-app-${var.env}-${count.index}"
}
```

すると、これが `hoge-app-stg-1` のような名前になります。

また、先ほど`variables.tf`で定義したinstance_typeを参照するためには

```
instance_type = "${lookup(var.app_instance_type, var.env)}"
```

とすれば、使いたい環境の設定を参照できます。


### 実行時のオプション

以上のような設定をしたあと、実行時のオプションで

```
terraform apply -var "env=stg"
```
のような感じで`env`を指定してやればいいです。

### その他の方法

たぶん実行時の`-var-file`オプションを使えば、参照するvarファイルが切り替えられるので、variables.tfにまとめるのではなくて環境ごとにファイルを分けることもできます。
個人的には、同じ項目の設定は同じところにあった方が管理や視認性の観点でいいと思うので、上記のようなやり方をしています。



## tfstateファイルをどう管理するか


devlop, staging, productionのように環境を分けるためには、tfstateファイルを分ける必要があります。また、複数人がterraformを実行する可能性がある場合、どこかで同期を取る必要があります。

そこで、 s3を使って同期するやり方をここでは紹介します。

### tfstate利用の流れ

0. ローカルにあるtfstateファイルを消す
1. 実行前に terraform remote config, remote pull
2. 実行 terraform apply
- （成功したら）terraform remote push
- 最後に terraform remote config -disable

という流れでやると、環境ごとの設定が混ざることがないです。
最後の `disable`をやらないと、ローカルにtfstateが保存されて正しく動作しませんでした。

### 実際のコマンド例


```
rm *.tfstate

terraform remote config \
  -state="stg.tfstate" \
  -backend=S3 \
  -backend-config="bucket=hogedeploy" \
  -backend-config="key=stg.tfstate"
  
terraform remote pull

terraform plan \
  -state="stg.tfstate" \
  -refresh=true \
  -var "env=stg"

terraform remote push

terraform remote config -disable -state="stg.tfstate"

```

という感じです。



以上です。

S3を使わずにAtlasを使ってもよいと思います。
もっと良いやり方あるよ、という場合は教えていただけると助かります。
Qiitaでの数式記述のベクトル表記

Qiitaでの数式記述については，[Qiitaの数式チートシート](http://qiita.com/MERON/items/63ac58898541cbe81ada)に9割9分必要な情報があるけど，
太字＋斜体でのベクトル表記の方法がなかったので，ここでメモ．

$ \boldsymbol{x} $ は``\boldsymbol{x}``

ついでにインラインは$$で囲めばおｋ．
CouchDB on AWS EC2

#Amazon LinuxにCouchDB1.6.1をインストールする方法

##対応バージョン
EC2は素の状態からインストールしました。
Amazon Linux AMI 2015.03 (HVM), SSD Volume Type
CouchDB 1.6.1

###手順
1.EC2インスタンス起動してログイン
2.sudo yum -y update
3.epel リポジトリを有効化
　`vim /etc/yum.repos.d/epel.repo`
  enable=0 から enable=1にする。
4.必要なパッケージをインストール
`sudo yum install gcc gcc-c++ libtool libicu-devel openssl-devel autoconf-archive erlang python27 python-sphinx help2man`

5.SpidarMonkeyインストール

```
wget http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz
tar xzvf js185-1.0.0.tar.gz
cd js185-1.0.0/src
./configure
make
sudo make install
```

6.CouchDB公式からソースをダウンロード（記事作成時は1.6.1）
7.tarで解凍してディレクトリ移動して
`./configure`
8.erlangのヘッダが見つからないエラーで止まる場合は（私はそうだった）
`./configure --with-erlang=/usr/lib64/erlang/usr/include`
9.configureが通ったら後は普通に

```
make
sudo make install 
```

10.ユーザーとパーミッションの設定をする

```
sudo useradd -r -d /usr/local/var/lib/couchdb -M -s /bin/bash couchdb
sudo chown -R couchdb:couchdb /usr/local/etc/couchdb
sudo chown -R couchdb:couchdb /usr/local/var/lib/couchdb
sudo chown -R couchdb:couchdb /usr/local/var/log/couchdb
sudo chown -R couchdb:couchdb /usr/local/var/run/couchdb
sudo chmod 0775 /usr/local/etc/couchdb
sudo chmod 0775 /usr/local/var/lib/couchdb
sudo chmod 0775 /usr/local/var/log/couchdb
sudo chmod 0775 /usr/local/var/run/couchdb
```

11.起動スクリプト等をコピー（既にあると言われるかも？）

```
sudo cp /usr/local/etc/logrotate.d/couchdb /etc/logrotate.d
sudo ln -s /usr/local/etc/rc.d/couchdb /etc/init.d/couchdb
```

12.自動起動の設定
`sudo chkconfig --add couchdb`
13.起動
`sudo /etc/init.d/couchdb start`
14.確認
AWSのEC2セキュリティグループでインバウンドTCP5984を許可すれば
futonにパブリックIPでアクセスできる
`http://パブリックIP:5984/_utils/index.html`

###これで一応布団上でいじれる
しかし、まだローカルのMacとかにレプリケーションができない・・・
（だれかボスケテ）

##ところで
最近はCouchDBよりCouchBaseの方が盛んなのでしょうか？
触り始めたばっかりでまだ良くわからないので教えてください。。。
passenger 再起動のための touch tmp/restart.txt しても空振りしてないか？気になった

# passengerの再起動の動作が変わっているのか。

http://qiita.com/QUANON/items/a321d2d1ca9c908d59e7

```
Release 5.0.0 beta 1 
これはパフォーマンス上の理由から passenger_stat_throttle_rate (Apache の場合は PassengerStatThrottleRate) のデフォルト値が 10 になったため。
```

passenger_stat_throttle_rate を 0 に設定すると、touch restart.txt 後に即座に再起動されるという従来と同じ挙動になるが、推奨しない。


http://ameblo.jp/hbnizm31/entry-11906103519.html
http://qiita.com/marsa746079/items/da6e19b8436232a8e62b
http://hakutoitoi.hatenablog.com/entry/2014/03/10/191942
https://gist.github.com/koudaiii/9af3483746352b59126e

https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html#_redeploying_restarting_the_rack_application
公式では
touch /webapps/rackapp/tmp/restart.txt
が書かれている

PassengerStatThrottleRate
https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html
この値を10(sec) から 0にしておいたら以前と同じ動きのよう。(ただし、ディスクへの負荷が心配)

# Passengerのログはどこに書かれる？

http://redmine.jp/tech_note/passenger-options/
ログは Apache の error ログ(CentOS の場合は /var/log/httpd/error_log)に出力されます。

passenger がこのアプリだけ再起動した、というログはでてくれないか？
/var/log/httpd/error_log の以下を確認すればよさそう

```
[ 2015-08-05 15:24:39.7621 20757/7fa62662a700 age/Hel/Main.cpp:724 ]: Disconnecting long-running connections for process 25182, application /web/XXX (production)#default
```

# passengerの状態
passenger-status コマンドで確認できる。

```
/web/XXX (production)#default:
App root: /web/XXX
Requests in queue: 0
* PID: 25976 Sessions: 0 Processed: 2 Uptime: 5s
CPU: 6% Memory : 31M Last used: 5s ago
```

アクセスするごとに Processed が増えて行く。
touch tmp/restart.txt の後のアクセスから、リセットされ0からのスタートとなっている。

# 対策

passenger は デフォルト設定により10sec おきに restart.txt をみていると考える。
そのため、touchしてても最悪10sec後にみられる可能性あり。
そのため、10sec まってからアクセスするが確実。
または passenger の PassengerStatThrottleRate を変える。