OmniAICreator/Qiita-1.07M huggingface dataset:
【MySQL】マルチインデックスの制約の話とか


#はじめに
　
大前提として、__INDEXは極力少なくしてクエリを捌けさせる構造がベスト。__
無駄なINDEXが存在するだけで、容量を食い(場合によっては、部分INDEXという手もありますが...)、
パフォーマンスも落ちるので二重苦となります。
　
　
__INDEXは、本当に必要なものだけ！__

　
　
これを踏まえた上で、マルチインデックスの話に移りたいと思います。
かなり説明を省いています。ご了承下さい。

#マルチインデックスとは
　
簡単に言うと、複数のカラムに対してのINDEX。単一のINDEXより高速な検索が可能です。

詳しくはこちら → http://dev.mysql.com/doc/refman/4.1/ja/multiple-column-indexes.html
　


```ex.1
create table test (
  col1 int(5),
  col2 int(5),
  col3 int(5),
  primary key (col1),
  key cols_index (col1, col2, col3)　#マルチインデックス
) ENGINE=InnoDB;
```
　
例えばex.1のような、マルチインデックスを含めたテーブル構造だった場合。


##INDEX使用不可
　

```ex.2
select * from test where col2 = 3;
select * from test where col2 = 1 and col3 = 3;
select * from test where col2 = 3 and col1 = 3;
```
　
マルチインデックスは、__クエリ文がINDEX作成時のカラム順に基づいていないと、
INDEXが使えない__という制約が存在します。
ex.2のようなクエリだと、INDEXの順番に基づいていないため、使用不可ということ
になります。
　
　
##INDEX使用可
　

```ex.3
select * from test where col1 = 3 and col2 = 3;
```
　
これだったらカラム順に沿っているので、INDEXが使えるということになります。
　
　
#マルチインデックス作成時のポイント
　
##１つのクエリを実行する時、１つのテーブルにつき１つのINDEXしか使用できない。
　
つまり、もしINDEXがex.1の__cols_index__のようなマルチインデックスの他に、例えば__index (col1)__といった、マルチインデックス内のカラムを利用した単一INDEXが存在していた場合、場合によっては単一INDEXのほうは無駄になるということです。※1
この辺りは、EXPLAINとか使うとよりわかり易いです。今回は説明を省略します。
　
※1　どうしてもユーザーIDのみ持ってきたい時とかは必要な時もあるかも？
　　ただ、INDEXの性質がIDに基づいて対象テーブルを決めている場合だったらマルチインデックスだけで十分です。
　
　
#Performance Tuning のためのヒント
　
・COVERING INDEX
→簡単に言うと、INDEXだけで完結するINDEX。これによってランダムアクセスが無くなりま
　すので、I/Oの回数を減らすことができます。よって、これが高速化につながります。

・可能なところはNOT NULLを宣言

・JOINに使う列は同じデータ型に

・varchar(255)ではなく、varchar(64)に
[Apache, PHP, MySQL] Apache経由でPHPからMySQLにつながらないとき

## 結論
SELinux のせい


## 現象
```shell-session:mysqlから接続
# mysql -h192.168.xxx.xxx -uUSER DB -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7792537
Server version: 5.1.44-community-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

```

```shell-session:phpから接続
# php test.php
```

```php:test.php
<?php
$dbh = new mysqli('192.168.xxx.xxx','USER','PASS','DB');
$dbh->close();
```

これもOK。


```shell-session:ブラウザ経由で接続
http://localhost/test.php
```

繋がらない。。。

```shell-session:/var/log/php/error.log
[18-Aug-2014 16:30:37] PHP Warning:  mysqli::mysqli() [mysqli.mysqli]: (HY000/2003): Can't connect to MySQL server on '192.168.xxx.xxx' (13) in /path/test.php on line 2

```

## 処方箋

```shell-session:SElinuxの確認
# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive
```

これでつながる。
（リモートサーバーにつなごうとするとセキュリティにひっかかるのではないかと。）

## 参照
[SQLSTATE[HY000] [2003] Can’t connect to MySQL server on ‘xxx.xxx.xxx.xxx’ (13)](http://www.filonov.com/2009/08/07/sqlstatehy000-2003-cant-connect-to-mysql-server-on-xxx-xxx-xxx-xxx-13/)
ansibleでdockerを使うための準備(ubuntu)

ansibleのドキュメントを見ていたらdockerモジュールというのがあるのを発見。
これで勝てる！（なにがだ？）

[docker - manage docker containers](http://docs.ansible.com/docker_module.html)


ただしdockerモジュールを使うにはdocker-pyが必要でdocker-pyを入れるにはpipが必要でという缶詰と缶切りみたいな話になってくる。
幸いansibleにはpipのモジュールもあるので、サーバー自体の初期化時にこんな感じのことをやればよいと思う。


```lang:main.yml

- name: apt install
  apt: name={{ item }} update_cache=yes
  with_items:
    - software-properties-common
    - python
    - python-pip

- name: docker-py install
  pip: name=docker-py
```
Swiftのenumは最小完全ハッシュ値を持っていた．


enumを

```swift
Enum IntEnum: Int { case A = 0xA000, B = 0xB000, C = 0xC000 }
Enum StrEnum: String { case A = "Alfa", B = "Bravo", C = "Charlie" }
```
と定義したとき，`IntEnum.A.hashValue`や`StrEnum.B.hashValue`はそれぞれ`0xA000`や`"Alfa"`のハッシュ値になるのかと思いきや，さにあらず．

```swift
println(\(IntEnum.A.hashValue))		// 0
println(\(IntEnum.B.hashValue))		// 1
println(\(IntEnum.C.hashValue))		// 2
```
なんと，列挙した順に値が付けられていました．連番，最小完全ハッシュですね，これ．
StrEnumの方ももちろん同様．3万個以上列挙しても，もちろん同様でした．（限界まで確かめたかったのですがコンパイルが終わらないので断念．）


### enumをキーとしたコンパクトなディクショナリー

この`hashValue`を使わない手はありません．もろに配列のインデックスに使えます．
これは，[enumをDictionaryのkeyに指定する](qiita.com/kishisuke/items/c803b1ce2bbc91e5b278)のコメント欄の議論の延長ですが，`hashValue`を使うとさらにシンプルに辞書を実装できます．ほんの一つ足りないものがあるため，protocolを定義してextensionします．

```swift
protocol FastEnumKey: Hashable {
	class var count: Int {get}
}
```
というプロトコルを定義します．`count`とは要は列挙の個数です．
そして例えば，上の`IntEnum`を`FastEnumKey`プロトコルに準拠させます．

```swift
extension IntEnum: FastEnumKey {
	static var count: Int { return 3 }
}
```
この場合，列挙数は`3`と決め打ちです．extensionによって後から`case`を追加することは不可能なので決め打ちで問題ないと思います．
あとは，`EnumDictionary`を組み込みのディクショナリーに似せて軽く実装するだけ．このとき，Keyのタイプを`FastEnumKey`に制約します．(以下のコードは[ここからほぼ引用](http://qiita.com/kishisuke/items/c803b1ce2bbc91e5b278#comment-b9d3ee8acc618173bd01)してます．)

```swift
struct EnumDictionary<Key: FastEnumKey, Value> {
    var values = [Value?](count: Key.count, repeatedValue: nil)

    subscript(key: Key) -> Value? {
        get {
			return values[key.hashValue]  // hashValueは配列のインデックスである．
		 }
        set {
			 values[key.hashValue] = newValue!
		}
    }
}
```
`hashValue`値がそのまま配列のインデックスに使えるのでとてもシンプル．
簡単とはいえ，いちいちextensionしなければならないのが難点ですが，列挙の個数だけは今のSwiftのリフレクションを使っても取得できないので仕方ありません．

## ところで，enumに設定した値はどこにあるの？

`enum`では`fromRaw`や`toRaw`というメソッドで`値<==>列挙`変換ができますが，この変換テーブルはメモリ上に隠されているみたいです．enumのサイズが

```swift
sizeofValue(StrEnum.A) == 1
```
なのです．（caseが255個以下ならサイズは1, それ以上なら2になることは確かめた．）
そしてその1バイトは`hashValue`値になっていました．設定した値をプロパティとして包含してるわけではないんですね．
変換テープルのアドレスが分かれば，上の`count`は取得できそうなのですけどね．ちょっと残念です．
特定のURLに対してローカルファイルを一時的に差し替える方法

Fiddler2を使います。

# Fiddler とは
Microsoftによる Proxy 型の HTTP デバッガ。HTTPトラフィックの監視や特定条件でのブレークポイントの設定など、Webアプリケーションのデバッグに便利なツール。Version 2 から HTTPS にも対応。
（ http://d.hatena.ne.jp/keyword/Fiddler より）

ここからDL：
http://www.telerik.com/fiddler

# Fiddlerは何してくれるの

　webサイト → 　　　proxy 　　　→ ローカル
　　　　　  ←　　　　　　 　　　←
　　　　　　　fidderが中間に入る

# ローカルファイルをサーバ上のファイルと差し替える

サーバ上にあるページを変更したローカルファイルと
一時的に差し替えて検証したいときに使います。

### Fiddler画面

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/ccb2c674-d3b4-4764-ccd0-d1174948f183.png)

### 差し替え前のページ

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/b40b6372-e463-7dbc-f72f-0613f3fec942.png)

■やりたいこと■
・投稿タイプの図を真ん中にしたいなぁ。

## 探して＞ドラッグして＞差し替えるファイル選択

該当のページをリロードすると、左側にズラーとURLが表示される。
今から http://qiita.com/rico のページのhtmlをローカルに落として編集したので、
それを http://qiita.com/rico に反映したいと思います。

右は、AutoResponderにしておいてください。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/609246c3-7a7d-4165-0be4-fb2f9635e660.png)

左側あるqiita.com /ricoをクリックして、右の白い余白へドラッグする。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/4c9699aa-952e-bab1-819b-ab2e31eac7cd.png)

ドラッグすると上のようにruleが追加されると思います。

右上のチェックボックス
:heavy_check_mark: Enable automatic responses
:heavy_check_mark: Unmatched requests passthrough
をチェックする。
（画像では３つチェックしていますが。）

![4.png](https://qiita-image-store.s3.amazonaws.com/0/44278/8df2f712-013d-c4b6-df26-00fb904c3634.png)

右下のドロップダウンメニューにあるFind a fileから差し替えたいローカルファイルを選択して、

saveを押す。

ブラウザをリロードすると、

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/66e0b50f-8b69-8f3d-1261-b73c02f24e2a.png)

図が真ん中にきてる、ということはローカルのファイルが反映されていますね。

Fiddlerを落とせば差し替えタイム終了。
Java1.5インストール(CentOS6.5) 

#Java1.5 Install

CeontOS6.5にJava1.5をインストールする。

##RPM取得

以下のサイトから1.5.0.22のバージョンのRPMをダウンロードする。

オラクルアカウントは取得しておく。

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase5-419410.html

![Java_Archive_Downloads_-_Java_SE_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/37a69487-9762-03a5-ba26-6402c8429997.jpeg)


##インストール

サーバへSCP等でファイルを送り、実行権限を付与する。

```
chmod +x jdk-1_5_0_22-linux-amd64-rpm.bin
```

実行

```
./jdk-1_5_0_22-linux-amd64-rpm.bin
```

ライセンスに関しては、スペースを押して進めていき
最後に[yes]を入力。

正常にインストールが終了することを確認。

##パス設定

Profileにパスを設定

```
vim /etc/profile/
export JAVA_HOME=/usr/java/jdk1.5.0_22/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
```

適用

```
source /etc/profile
```

##確認

```
#java -version
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)
```

以上
Bluetooth Low EnergyによるA10サイクロンSAの制御


Bluetooth Low Energy対応の世界初の性家電、A10サイクロンSA。
http://www.vorze.jp

手に入れたので、せっかくなので制御してみようと思います。

## 検出

BLE対応の解析アプリで検出してみましょう。
私は下記のLightBlueを使いました。

https://itunes.apple.com/jp/app/lightblue/id639944780?mt=12

A10サイクロンSAの電源が入っていると、「CycSA」という名前のPeripheral(デバイス)が検出されます。

![スクリーンショット 2014-08-18 16.30.54.png](https://qiita-image-store.s3.amazonaws.com/0/38786/9ce5f09f-bc94-12d8-65d1-25d63f44ff1e.png "スクリーンショット 2014-08-18 16.30.54.png")


BLE Peripheralは機能のI/Fとして複数のServiceを持っています。
見たところ「40EE1111-63EC-4B7F-8CE7-712EFD55B90E」がA10サイクロンSA独自のServiceのようです。
(1800と1801はBLE規格で定義されているもの)

## 制御

BLE Serviceはさらに複数のCharacteristicsによって構成されています。

![スクリーンショット 2014-08-18 16.33.47.png](https://qiita-image-store.s3.amazonaws.com/0/38786/0e43dd27-8ad6-4c5d-b5db-132725f1a571.png "スクリーンショット 2014-08-18 16.33.47.png")

上記Serviceには3つのCharacteristicsがありますが、書き込みできるのは「40EE2222-63EC-4B7F-8CE7-712EFD55B90E」のCharacteristicsのみ。
これはこのCharacteristicsに何かを書き込めば制御できるのでは！

http://pele.bbspink.com/test/read.cgi/onatech/1394880097/522

> ちなみに3バイトは[01,01,xx]でxxは正回転が00h～64h、逆回転が> 80h～E4hだった 
詳しい人いたらツッコミ大歓迎 

こちらのスレの情報を参考に、「010110」と書き込んでみると…回った！
「010190」と書き込むと逆回転！

やったー！！
RubyMineで行番号をデフォルトで表示する

```
Preferences > Editor > Appearance > Show line numbers  にチェック
```

![スクリーンショット 2014-08-18 16.31.27.png](https://qiita-image-store.s3.amazonaws.com/0/7410/5ecaf49f-e15c-e124-33a5-1778fe1f6387.png)
iOS で QR リーダを最速で実装する

少し昔なら ZXing というライブラリがあって定番でしたが、今は iOS7 から AVFoundation が標準で QR を読んでくれます。
ZXing 重そうだったので、標準の API 使うとコードの量が減っていい感じです。

が、使うにも `AVFoundation` まわりのアレコレがとても面倒くさいです。
そこで手前味噌ですが薄い感じにらっぱーを書いたので紹介します。

![](https://raw.githubusercontent.com/kaiinui/FastQR/master/KIFastQRCaptureView.gif)

`pod 'KIFastQR'`

```objc
KIFastQRCaptureView *fastQR = [[KIFastQRCaptureView alloc] initWithFrame:self.view.frame];
[fastQR startCaptureWithDelegate:self];
[self.view addSubview:fastQR];
```

で delegate メソッドをインプリします

```objc
- (void)fastQRView:(UIView *)fastQRView captureOutput:(NSString *)obtainedString {
    NSLog(@"%@", obtainedString);
}
```

`KIFastQR` ということでいかにも速そうですが標準の API を普通に使ってるだけです。

:sushi: 

https://github.com/kaiinui/FastQR
git rebase 失敗した時の対処法


# 大まかな流れ
```git
git add .
git commit -am "message"
git push origin master
```

最後の`push`がうまくいかない時（他の誰かが`push`してる時）の解決策の1つとして、`rebase`してから`push`する方法がある。

```git
git fetch origin
git rebase origin/master
git push origin master
```

とすれば、コンフリクトしない限り`push`できる。
以下、この`rebase`が失敗した時の対処法を記述する。

# [解1]コンフリクトを手動で直す
まず、コンフリクト箇所を手動で直す。
その後、以下のコマンドを実行。

```git
git add コンフリクトを解消したファイル名1
git add コンフリクトを解消したファイル名2
(直したファイル数分繰り返す)
git rebase --continue
git push origin master
```

※コンフリクトの記号に関しては下記URL（公式ドキュメント）参照。
http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC

※`pull`とか`rebase`とか、Eclipseの外部から変更が加えられた時は`F5`コマンドでリフレッシュすべし。

# [解2]指定したファイルをコミットから取り除く
```git
git rebase --abort #rebaseのキャンセル
```
　↓
ソースツリー上でコミットしたファイルを「Hunk を戻す」で`commit`解除
（正確には、逆向きのコミットを貼り、後で上書きすることでコミット解除したように見える）
　↓

```git
git commit -a --amend #commitの上書き
```
　↓
指定したファイルを再度変更し、`add`＆`commit`＆`push`

# [おまけ1]コンフリクトに気付く手段
`git status`で`both modified`と表記されたらそこが怪しい！
→　`git diff ファイルパス名`でコンフリクト箇所閲覧可能。

# [おまけ2]自分の変更を全て取り消す方法

### CLI上で解決
ちょっと変更したけど、変更を取りやめて前のコミットの状態に戻りたい時に有効。

```git
git reset --hard コミットのハッシュ値
```
で、指定したコミットの状態に戻ることができる。コミットのハッシュ値は、`git log`や`git reflog`で確認可能。

### ソースツリー上で解決
自分の変更（Uncommited Changes）を選択
→　変更を取り消したいファイルを選択して右クリック
→　リセット

# [おまけ3]
とにもかくにも、

```
こまめにコミットすべし
```
これに尽きます。
こまめにコミット（プッシュ）していれば面倒なマージ作業もせずに済むので。
配列のインデックスに列挙型を使う

配列の添字として列挙型を使えるような定義を考えました。

この発想の元になったのは「[【今さら】ENUMとINTへの変換【キャスト】](http://qiita.com/KawabataLemon/items/4451a90158ff523539bf)」という記事です。
そこでは、配列にアクセスするために列挙型を数値へ static_cast で陽に変換していました。
私はそれを隠蔽できないかと考えて出来たのが以下の定義です。

```cpp
#include <initializer_list>
#include <algorithm>
#include <type_traits>
#include <cassert>

template<class V, class IX>
class array_wrapper {
private:
  static_assert(std::is_enum<IX>::value, "Index class is not enum type.");
  size_t size;
public:
  typedef V  value_type;
  typedef IX index_type;
  typedef typename std::underlying_type<IX>::type underlying_type;
  value_type *raw_array;

  array_wrapper(std::initializer_list<V> il)
    : size (il.size()), raw_array (new V[size]) {
    std::copy(il.begin(), il.end(), raw_array);
  }

  value_type& operator[](const index_type index) const {
    underlying_type index_number = static_cast<underlying_type>(index);
    assert(index_number < size);
    return raw_array[index_number];
  }

  ~array_wrapper() {
    delete[] raw_array;
  }
};
```

この定義 array_wrapper を用いて配列を定義します。

```cpp
enum struct index_type {
  OTTORI,
  SEKKACHI
};

array_wrapper<const char*, index_type> gamemodes = {
  "score mode",
  "time trial mode"
};
```

テンプレート引数には要素の型と添字の型を渡しています。
この gamemodes という配列にアクセスするには定義時に決めた添字の型のみが使えます。

```cpp
enum struct another_index_type {
  MUHU,
  WAHA
};

int main(void) {
  const char* gamemode = gamemodes[index_type::OTTORI];
  // 他の列挙型の値や数値で要素にアクセスすることは出来ない。
  // const char* gamemode2 = gamemodes[another_index_type::MUHU];
  // const char* gamemode3 = gamemodes[0];
  return 0;
}
```

添字に使う列挙型が配列の定義時に結び付けられてしまうので、うっかり別の型を使ってしまうということがありませんし、配列の大きさを越えてアクセスしてしまうということもないようにチェックを入れています。
アクセスするたびに static_cast で変換を入れるという必要もないので少し見た目もスッキリとすると思います。
knitr の chunk option っていちいち入力するのってめんどくさいよね

みんないったいどうしてるんだろう。。。

```r
  ```{r echo=FALSE, warning=FALSE, message=FALSE}
  knitr::opts_chunk$set(echo=FALSE, warning=FALSE, message=FALSE)
  `` `
```

参考：
http://d.hatena.ne.jp/teramonagi/20130615/1371303616
rails3.2 と 4.1 での ActiveRecord select の違い


rails4.1 では ActiveRecord select で id を指定していないにもかかわらず、オブジェクトに id: nil を含んでしまうようです。
to_json する際に注意が必要そう。

# 例
```mysql
desc users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| nickname   | varchar(255) | YES  |     | NULL    |                |
| birthday   | datetime     | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
```

## rails3.2

```
> User.select([:nickname, :birthday])
=> [#<User nickname: "hoge", birthday: "2014-08-18 06:08:35">, #<User nickname: "hoge2", birthday: "2014-08-18 06:08:39">, #<User nickname: "hoge3", birthday: "2014-08-18 06:08:42">]
```

```ruby
> User.select([:nickname, :birthday]).to_json
=> "[{\"birthday\":\"2014-08-18T06:08:35Z\",\"nickname\":\"hoge\"},{\"birthday\":\"2014-08-18T06:08:39Z\",\"nickname\":\"hoge2\"},{\"birthday\":\"2014-08-18T06:08:42Z\",\"nickname\":\"hoge3\"}]"
```

## rails4.1

```ruby
> User.select([:nickname, :birthday])
=> #<ActiveRecord::Relation [#<User id: nil, nickname: "hoge", birthday: "2014-04-30 03:01:24">, #<User id: nil, nickname: "hoge2", birthday: "2014-03-31 03:01:31">, #<User id: nil, nickname: "hoge3", birthday: "2013-12-08 03:01:40">]>
```

```ruby
> User.select([:nickname, :birthday]).to_json
=> "[{\"nickname\":\"hoge\",\"birthday\":\"2014-04-30T03:01:24.000Z\",\"id\":null},{\"nickname\":\"hoge2\",\"birthday\":\"2014-03-31T03:01:31.000Z\",\"id\":null},{\"nickname\":\"hoge3\",\"birthday\":\"2013-12-08T03:01:40.000Z\",\"id\":null}]"
```
tmux で $PATH がダブらないようにする

tmux を起動するとシェルの環境変数がダブっていることに気がつきました。シェルにログインしたときと tmux を起動したときで二重に環境変数が定義されているようでした。

### シェルにログイン後

```shell-session
⚡ LF=$'\\\x0A' && echo $PATH | sed 's/:/'"$LF"'/g' | sort
/Users/morygonzalez/.nodebrew/current/bin
/Users/morygonzalez/.rbenv/bin
/Users/morygonzalez/.rbenv/shims
/Users/morygonzalez/GOPATH/bin
/bin
/sbin
/usr/bin
/usr/local/bin
/usr/local/sbin
/usr/sbin
```

### tmux 起動後

```shell-session
⚡ LF=$'\\\x0A' && echo $PATH | sed 's/:/'"$LF"'/g' | sort
/Users/morygonzalez/.nodebrew/current/bin
/Users/morygonzalez/.nodebrew/current/bin
/Users/morygonzalez/.nodebrew/current/bin
/Users/morygonzalez/.rbenv/bin
/Users/morygonzalez/.rbenv/bin
/Users/morygonzalez/.rbenv/bin
/Users/morygonzalez/.rbenv/shims
/Users/morygonzalez/.rbenv/shims
/Users/morygonzalez/.rbenv/shims
/Users/morygonzalez/GOPATH/bin
/Users/morygonzalez/GOPATH/bin
/Users/morygonzalez/GOPATH/bin
/bin
/sbin
/usr/bin
/usr/local/bin
/usr/local/bin
/usr/local/bin
/usr/local/sbin
/usr/local/sbin
/usr/local/sbin
/usr/sbin
```

.zshenv に記載している `$PATH` の設定情報が三回も読まれています。

対処方法は二つあって、一つは .zshrc や .zshenv に書かれている `$PATH` の設定を .zprofile に移すというもの。 .zshrc や .zshenv はシェルにログインしたときと tmux を起動したときのどちらのタイミングでも評価されてしまいますが、 .zprofile の評価はログインしたときだけのようでした。

もう一つは `$PATH` の設定を行っている部分で以下のように条件分岐をする。

```zsh
if [[ -z $TMUX ]]; then
    # Homebrew
    PATH=/usr/local/bin:/usr/local/sbin:$PATH
fi
```

tmux が起動しているかどうかを `$TMUX` でチェックし、存在していなければ `$PATH` の設定を行います。

変更点が少なそうなので僕は今回後者を採用しました。

ときどき tmux でペインを追加するときにもっさりしていたのですが、そのような現象がなくなったような気がします。
有効期限が切れたiOS Betaの復旧方法

# はじめに

表題の件、意外と知られていないような気がしたので、メモとして残すことにする。

iOS Beta版を入れたままその端末を放置しておくと、期限切れにより実質的に利用不可能となってしまう。iTunes経由でipswを用いてアップデート／ダウングレードしようにも、「『iPhoneを探す』をオフに……」「iPhoneをアクティベート……」といった警告が出る無限ループに陥ってしまう。

# 端末をリカバリーモードにする

端末をリカバリーモードにすると、（無限ループを抜けて）端末にipswをインストールすることができるようになる。

> iOS デバイスをアップデートまたは復元できない場合
> http://support.apple.com/kb/HT1808?viewlocale=ja_JP&locale=ja_JP
> 
----
> **リカバリモードを使う**
> リカバリモードでは、デバイスを消去して復元するので、問題が解決されます。以前に iTunes または iCloud で同期した場合は、修復後に バックアップから復元する ことが可能です。
> 
> 1. デバイスの電源を切ります。電源を切ることができない場合は、スリープ／スリープ解除ボタンとホームボタンを同時に押したまま、電源が切れるまで数秒間待ちます。
> * デバイスの USB ケーブルをコンピュータのみに接続します。
> * デバイスのホームボタンを押しながら、USB ケーブルをデバイスに接続します。
> * 「iTunes に接続」画面が表示されたらホームボタンを放します。この画面が表示されない場合は、手順 1 ～ 3 をもう一度試します。
> iTunes が起動して、次のメッセージが表示されます。「iTunes はリカバリモードの iPhone を見つけました。iTunes でご利用になる前に、この iPhone を復元する必要があります。」
> * iTunes を使ってデバイスを 復元します。
> 
> **追加情報**
> 誤ってリカバリモードでデバイスを起動してしまった場合は、デバイスを 再起動 してリカバリモードを終了してください。または、デバイスをそのままにしておきます。15 分経過すると自動的にリカバリモードが終了します。


調べると「DFUモード」という単語を見つける事が出来るが、「リカバリーモード」との違いがよく分からなかったので、ここでは前述の公式解説の表記に倣う事にする。
Dockerで、既存のイメージを少しだけ変えて再コミットする

主にDokkuの運用で便利。

とりあえず、当該イメージをアップデートする。

```bash
docker pull progrium/buildstep
```

`docker run -ti` でインストールコマンドを実行する。そうすると実行結果のコンテナがタグなしでできる。正常終了を見届ける。

```bash
docker run -ti progrium/buildstep /bin/bash -c "apt-get -y update; apt-get -y install libmecab-dev mecab-ipadic-utf8; apt-get -y clean"
```

最後に実行した結果の CONTAINER ID は `docker ps -l` で出てくるので確認する。

```shell-session
root@dokku001:~# docker ps -l
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS                     PORTS               NAMES
1b9143e89867        progrium/buildstep:latest   /bin/bash -c 'apt-ge   2 seconds ago       Exited (0) 1 seconds ago                       distracted_feynman   
```

このコンテナのIDを既存のイメージのlatestとひもづける。

```bash
docker commit 1b9143e89867 progrium/buildstep:latest
```

これでOK。 `docker commit` は、gitなどと同様、ローカルのイメージの状態に対しコミットして、リモート（Docker Hub）にあるイメージには一切触れないので気軽に状態を変えることができる。

インストール結果の確認とかは、普通に `docker run -ti` とかで大丈夫。 `docker run` を実行してもコミットしない限りはもとのイメージは変更されないことに留意したい。

```shell-session
root@dokku001:~# docker run -ti progrium/buildstep /bin/bash -c "dpkg -L libmecab-dev"
/.
/usr
/usr/include
/usr/include/mecab.h
/usr/lib
/usr/lib/libmecab.a
/usr/share
/usr/share/doc
/usr/share/doc/libmecab-dev
/usr/share/doc/libmecab-dev/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/mecab-config.1.gz
/usr/bin
/usr/bin/mecab-config
/usr/lib/libmecab.so
/usr/share/doc/libmecab-dev/README
/usr/share/doc/libmecab-dev/AUTHORS
/usr/share/doc/libmecab-dev/changelog.Debian.gz
```

----

大々的に変える場合は別途Dockerfileを作った方が良いと思う。少し変えたい場合はこんな感じでぽちぽちとやっている。
株が取引できる日か判定する、trading_day_jpというgemをこしらえた

日本の証券取引所が開いている日かどうか判定するgemを作りました。祝日の判定には[holiday_jp](https://github.com/komagata/holiday_jp)を使っています。
「市場が開いている場合には○○する」といった用途に使える便利gemです。

```rb
date = Date.new(2014, 12, 30)

date.trading_day_jp? # => true
TradingDayJp.open?(date) # => true

date = Date.new(2014, 12, 31)

date.trading_day_jp? # => false
TradingDayJp.open?(date) # => false
```
Nodejsでエラーキャッチ


すごく軽量で可愛らしいフレームワークなんですが、エラーを吐くと一瞬で死にます。
まるで生まれたての子鹿のような弱さなので、ちゃんとエラーキャッチする癖をつけるべく
備忘録として書いときます。


```js:
var path;
try {
path = require.resolve('hoge');
} catch(e) {
	console.log("Error:Cannot hoge,because the file is not exist.");
}
// hogeが存在したときのみ、hogeのフルパスが取得される。
var directedModule = require(path);
```
mod_rewrite よく使う条件

メモ

# ユーザーエージェントの制限
```apache
# Android (全体）
RewriteCond %{HTTP_USER_AGENT} ".*Android.*" [NC]

# Android (スマートフォン）
RewriteCond %{HTTP_USER_AGENT} ".*Android.*Mobile.*" [NC]

# iPhone
RewriteCond %{HTTP_USER_AGENT} ".*iPhone.*" [NC]

# iPad
RewriteCond %{HTTP_USER_AGENT} ".*iPad.*" [NC]
```

# 接続先の制限（ワイルドカード指定のドメインの場合）
```apache
RewriteCond %{HTTP_HOST} "^.*\.example\.com" [NC]
```

# リダイレクト元の制限
```apache
RewriteCond %{HTTP_REFERER} "^.*\.example\.com" [NC]
```

# 接続元アドレス（ISP)の制限
```apache
RewriteCond %{REMOTE_ADDR} "^192\.168\..*" [NC]
```

# 接続元ドメイン（ISP)の制限
```apache
RewriteCond %{REMOTE_HOST} "^.*\.example\.com" [NC]
```

# リモートユーザーの制限
```apache
# 2.2/2.4 での条件分岐が不要になる
RewriteCond %{REMOTE_USER} "^admin$" [NC]
```

# リクエストメソッドの制限
```apache
RewriteCond %{REQUEST_METHOD} "^(GET|POST)$" [NC]
```

# 日付を指定する（営業日の指定）
```apache
# 以降 : 2014-04-01以降のみ
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY} ">20140401"

# 以前 : 2014-04-01以前のみ
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY} "<20140401"

# 同日 : 2014-04-01 と一致する。
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY} "=20140401"
```

# 時刻を指定する（営業時間の指定）
```apache
# 以前 : 08時以前
RewriteCond %{TIME_HOUR}%{TIME_MIN} "<0800"

# 以降 : 18時以降
RewriteCond %{TIME_HOUR}%{TIME_MIN} ">1800"
```

# 曜日を指定する
```apache
# 日曜
RewriteCond %{TIME_WDAY} "0"

# 月曜
RewriteCond %{TIME_WDAY} "1"

# 火曜
RewriteCond %{TIME_WDAY} "2"

# 水曜
RewriteCond %{TIME_WDAY} "3"

# 木曜
RewriteCond %{TIME_WDAY} "4"

# 金曜
RewriteCond %{TIME_WDAY} "5"

# 土曜
RewriteCond %{TIME_WDAY} "6"

# 平日
RewriteCond %{TIME_WDAY} ">0"
RewriteCond %{TIME_WDAY} "<6"

# 週末
RewriteCond %{TIME_WDAY} "0" [OR]
RewriteCond %{TIME_WDAY} "6"
```
enumからSceneを配列を利用して変換する

```cpp:
// プレイするゲームのステージ
enum struct GameStage{
	STAGE1,
	STAGE2,
	STAGE3,
	STAGE4,
	STAGE5,
	STAGE6
}
```

以下やってしまってはダメなコードです

```cpp:

Scene* getSceneWithGameStage(GameStage s){
	if(s == STAGE1){
		return Stage1::createScene();
	} else if (s == STAGE2){
		return Stage2::createScene();	
	}

	.......( 略 )........
}

````

効率的にSceneを返すには、createメソッドを含んだ配列から引っ張ればいいです。

```cpp:

Scene* getSceneWithGameStage(GameStage s){
  static Scene *(*createScene[])() = {
		Stage1::createScene,
		Stage2::createScene,
		Stage3::createScene,
		Stage4::createScene,
		Stage5::createScene,
		Stage6::createScene,
    };
    
    return createScene[static_cast<int>(s)];
}

```
こうかくと効率的にSceneの取得が行えます。スマートですね。

static_cast<int>(enum)は[こちら](http://qiita.com/KawabataLemon/items/4451a90158ff523539bf)
VBAで送り仮名自動生成

# VBAで送り仮名自動生成

* 漢字やひらがなの名称列データに対して、送り仮名を生成する

```vbnet:VBA
Sub Macro1()

    Dim i As Long

    ' 処理対象のファイル（事前に開いといてね）    
    Workbooks("サンプル.xlsx").Activate
    
    ' 行のループ範囲を指定
    For i = 3 To 340
        ' 右辺のデータを左辺に代入
        ' 左辺＝カナデータを格納するセル
        ' 右辺＝元データからカナデータを生成
        Range("H" & i).Value = StrConv(Application.GetPhonetic(Range("B" & i)), vbNarrow)


    
    Next

End Sub
```
mergepbx(1)を使えるようにする

[iOSアプリ開発の現場で訊いてみた！フリル編 ](http://qiita.com/yimajo/items/26c8e29e44a34a683a78) で [mergepbx](https://github.com/simonwagner/mergepbx) に言及されてたので、そういえばやってなかったなとおもって社内環境セットアップツールに mergepbx を追加した。これ自体はpythonスクリプトだけど、インストール方法が普通じゃないので毎回しらべる羽目になるし、git configの設定も面倒なのでそのへんも何とかしたかった。

やってることはだいたい以下のとおり。

```sh
#!/usr/bin/sh
EXECUTABLE_URL='https://github.com/simonwagner/mergepbx/releases/download/v0.5/mergepbx'
INSTALL_PATH='/usr/local/bin/mergepbx'

set -xe

curl --silent -L "$EXECUTABLE_URL" > "$INSTALL_PATH"
chmod +x "$INSTALL_PATH"

git config --global merge.mergepbx.name 'Xcode project files merger'
git config --global merge.mergepbx.driver 'mergepbx %O %A %B'
git config --global merge.mergepbx.note 'auto-generated configuration for mergepbx(1)'
```
@published の推奨記法が変わった

半月前あたりに [Polymer.dart][] の 0.12.0 がリリースされ、`@published` の推奨の書き方が変わった。チュートリアルとかに反映されてないっぽいのでまとめる。

* [polymer/polymer API Docs の `@published` の項目]( https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/polymer/polymer#id_published)

0.12.0 以前では: 

```my_costom.dart
@CustomTag('my-custom')
class MyCustomElement extends PolymerElement {

  @published String myAttr;

}
```

と書いていたものを: 

```my_costom.dart
@CustomTag('my-custom')
class MyCustomElement extends PolymerElement {

  @published
  String get myAttr => readValue(#myAttr);
  set myAttr(String s) => writeValue(#myAttr, s);

}
```

と書くことを推奨するようになった。今までタイミングによっては古い値がとれてしまった MyCustomElement の `myAttr` を、この書き方に変えることで、この常に最新のものが取得できると謳ってる。

古い方の書き方もまだ生きているが推奨されていない。


所感
----

あんまり古い値とれて困るってケースがなかったので、単に書き方が辛くなっただけ感。

たしかに、DOM 経由で操作した直後に myAttr 参照すると操作前の値とれるけど、そもそもそんな書き方するほうが間違ってるので。

あまりにも書くのが辛すぎるので、transformer がうまく展開してくれるようにて、もっとシンプルな書き方ができるようになりそうな予感がある。

<ins>追記: 冒頭でチュートリアルに反映されてないって書いたけど、そもそも `@published` について書かれてなかった。</ins>

[Polymer.dart]: https://www.dartlang.org/polymer-dart/
MonoDevelopエディタのテーマを変更したい！でも 普通に変更しようとするとエラーでるんですけど！（Windows）


エディタの背景色とか変えたいと思ったが、普通にやるとうまくいかない。
で、お決まりの参考サイトを探す
<br>

><h4>MonoDevelopでシンタックスハイライトのカスタマイズ</h1>
>http://dothiko.cocolog-nifty.com/blog/2012/04/monodevelop-5d0.html
>どうも/usr/lib/monodevelop/dataに、HighlightingSchemesというディレクトリが存在しないのが原因のようです。

<br>
とありますが、自分の場合は<b>下記の場所</b>にHighlightingSchemesフォルダが無いのが原因でした。（Windowsだから？）↓
 
`/Program Files (x86)/Unity/MonoDevelop/data`

<br> :one: HighlightingSchemesフォルダを作成（管理者権限聞かれたら 続行 押す）
 
`/Program Files (x86)/Unity/MonoDevelop/data/HighlightingSchemes`

:two: MonoDevelop を起動して  

`Tools ⇒ Options ⇒ Text Editor  ⇒  Syntax Highlighting`

<br>の Color scheme  エリアから　好きなテーマを選んで 右下の OK を押す。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23248/4b2228cf-cb5d-418b-d4d5-6cecaf3ff70d.png)


<br>これでテーマ変わた。
プッシュ前のローカルのコミットを取り消す方法


ローカル環境で途中の段階に戻って、コミットし直す方法についてです。
gitで変更点の履歴を参照する方法は

```Git
git log
```

で参照することができます。
このコマンドを使うと

 * commit ID(16進数で40桁)
 * Author
 * Date
 * comment

が表示されます。
このcommitIDを使用して取り消しを行います。
取り消しは、

```Git
git reset --hard <commitId>
```

でコミット地点を変更できます。
コミット地点に変更すると、当然ながら、変更前までの段階のファイルしか存在しません。
そのあたり、注意された方がいいと思います。
mod_rewrite で 日付によるリダイレクト等

メモ

```apache:.htaccess
ErrorDocument 410 /service_end.html

RewriteEngine On

# 特定のロケーション
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}   ">20140901"
RewriteCond %{REQUEST_URI}  "/path/to/dir/regex" 
RewriteRule (.*) - [G,L]

# 全てのロケーション
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}   ">20140902"
RewriteRule (.*) - [G,L]
```
Matplotlibでリテンション率グラフを描画する


モバイルアプリケーションの運営に欠かせない指標の1つであるユーザーリテンション、PartyTrack等の分析サービスを使っていると良く目にすると思う。ただ、自分の持っているデータでグラフを描画したいがWebフロントのJavaScriptは書きたくないというケースもある。

そんな時に見た次のエントリ

Making Pinterest — How Pinterest drives sustainable growth
http://engineering.pinterest.com/post/86533331849/how-pinterest-drives-sustainable-growth


コホートヒートマップが何かで描画されてる!! という訳で同じ見た目のグラフをPythonで描画してみる。

## リテンション率のデータ

「ある日xに獲得したユーザーのy日後のアクティブ率z」を次の形で持っているとする。

```
{
	"2014/08/16": [翌日の値],
	"2014/08/15": [翌日の値, 2日後の値],
	"2014/08/14": [翌日の値, 2日後の値, 3日後の値],
	"2014/08/13": [翌日の値, 2日後の値, 3日後の値, 4日後の値],
	...
}
```

## グラフの描画
等高線をプロットするのと同じ要領でまずは獲得日x, 経過日数yのメッシュを作る。

```python
from datetime import datetime
from matplotlib import dates
import numpy as np

vals = [
	datetime(2014, 8, 16), [0.524],
	datetime(2014, 8, 15), [0.574, 0.415],
	datetime(2014, 8, 14), [0.559, 0.440, 0.355],
	#略
]

# 表示する経過日数
max_y = 35

# xはdatetimeからnumberに変換しておく
x = map(lambda v: dates.date2num(v['date']), vals)
# yは1(翌日)からスタート
y = np.arange(1, max_y + 1)
# xとyのメッシュを作成
Y, X = np.meshgrid(y, x)
```

リテンション率の値がzとなるので、グリッドのyに配列の長さをあわせる。

```python
def expand_z(v):
    v = v['values']
    v += list(np.zeros(max_y - len(v)))
    return v
# 縦横を揃えるためにゼロ埋め配列を追加する
z = map(expand_z, vals)
# numpyの行列に変換する
Z = np.array(z).reshape(len(z), len(z[0]))
```

pcolorを使って疑似カラープロットを描画する。

```python
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8, 4))

# プロットの作成
# データによって色が変わってしまうのを回避するため、最大値を指定
im = ax.pcolor(X, Y, Z, vmax=0.6)

# タイトル
ax.set_title(u'Launch Retention')
# y軸
ax.set_ylabel(u'Past Days')
ax.set_ylim(bottom=1)
# x軸
ax.set_xlim(x[0], x[-1])
# カラーバー
plt.colorbar(im)

# Ticks
minorLocator = MultipleLocator(5)
ax.xaxis.set_minor_locator(dates.DayLocator())
ax.xaxis.set_minor_formatter(dates.DateFormatter('%d'))
ax.xaxis.set_major_locator(dates.MonthLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('%Y %b'))
ax.xaxis.set_tick_params(which='major', pad=17)
plt.xticks(rotation=0)
plt.show()
```

## 結果

![plot.png](https://qiita-image-store.s3.amazonaws.com/0/2130/fe1a0ef3-9272-58d1-ed27-893b0f897438.png "plot.png")

できた。全体感を眺める用途には使えるだろう。?日後リテンションを指標として追うという場合は、別途その値だけ折れ線グラフか何かにすると経過を観察しやすい。どちらにしても、夜間バッチ処理で画像ファイルにしておけば、どこでも使えて便利。

今回のコードを手元で実行できる様にgistも用意しました、手元で動かしたい場合はこちらをどうぞ。
https://gist.github.com/hagino3000/455a68a79173fff1d890
CoreOSのタイムゾーンを変更

####変更前

```shell-session
core@ip-10-0-1-145 ~ $ date
Mon Aug 18 11:33:44 UTC 2014
```

####変更作業
```shell-session
core@ip-10-0-1-145 ~ $ sudo timedatectl set-timezone Asia/Tokyo
```

####変更確認
```shell-session
core@ip-10-0-1-145 ~ $ date
Mon Aug 18 20:38:09 JST 2014
```
#define ONE

```cpp
#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4
#define FIVE 5
#define SIX 6
#define SEVEN 7
#define EIGHT 8
#define NINE 9
#define TEN 10
#define ELEVEN 11
#define TWELVE 12
#define THIRTEEN 13
#define FOURTEEN 14
#define FIFTEEN 15
#define SIXTEEN 16
#define SEVENTEEN 17
#define EIGHTEEN 18
#define NINETEEN 19
#define TWENTY 20+
#define THIRTY 30+
#define FORTY 40+
#define FIFTY 50+
#define SIXTY 60+
#define SEVENTY 70+
#define EIGHTY 80+
#define NINETY 90+
#define HUNDRED *100
#define THOUSAND *1000

```
```cpp
#include <stdio.h>
main(){
	printf("%d",THIRTY THREE + SEVEN); /* 40 */
}
```

　　
　　
###補足
`THIRTY + ONE`と書いた場合は、`(31)+ (+ 1)`のように二項演算子と単項演算子に解釈される仕組みです。というわけで乗除はエラーになります。

`ONE + THIRTY`も`(1) + (31)+`と解釈されるためエラーです。
[bash]で入力プロンプトをそれっぽく表示させる方法

read というコマンドを使うっぽいです
-pのオプションを付けると、プロンプト自由に入れられます。

## ソース

ひどく適当ですが、イメージだけわかってもらえればいいや(^_-)

```
#!/bin/bash

cat << _EOT_
*****************************************************************
bash :　入力プロンプトをそれっぽく表示されるデモ shell です
*****************************************************************
_EOT_

read -p '実行しますか？(y/n) > ' _key

if [ "${_key}" = "y" ] ;
then
  _result="y"
else
  _result="y以外"
fi

cat << _EOT_

${_result} を選択されたようです 

_EOT_



exit 0

```

## 実行結果

```
# sh /usr/local/test.sh
*****************************************************************
bash :　入力プロンプトをそれっぽく表示されるデモ shell です
*****************************************************************
実行しますか？(y/n) > n

y以外 を選択されたようです 
```
稼働中のMySQLを無停止でレプリケーション環境を構築する

# 稼働中のMySQLを無停止でレプリケーション環境を構築する

個人メモです。稼働中のサービスを停止できないけど、スレーブを増やしたい（増殖したい）なんて場合に使える技になります。

## マスターのバックアップ

まず、スレーブ側のホストでマスターのスキーマ（例では、schema1 schema2のバックアップをとります。この際に、--master-data と --single-transaction は必須です。

\--master-data を指定しますと、master側のバイナリログファイルとポジションを取得することができます。
\--single-transaction を指定しますと、innodbの場合は、マスターサーバ側のデータベースをロックせずに、dumpすることが可能です

```
mysqldump -h remote_host --databases schema1 schema2 -u myuser -pmypasswd --master-data --single-transaction --routines > /tmp/myDB.dump
```

## ポジションの取得

上記にて、バックアップが完了したファイルから、CHANGE MASTER TOが含まれる行をgrepして、メモしておきます。

```
# cat myDB.dump | grep -i "CHANGE MASTER TO"
-----
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000052', MASTER_LOG_POS=12345678;
```

## バックアップしたファイルをリストアします

リストア先に対象のデータベースが既に存在する場合は、すべて消えてしまいますので注意してください

```
mysql -f -umyuser -pmypasswd < /tmp/myDB.dump
```

## スレーブ側の設定

ヒアドキュメントを使って、書き込んでいますが、別にコピペでMySQLに直接張ってもいいかと思います。また、MASTER_LOG_FILEとMASTER_LOG_POSは、上記で取得した値をセットします

```
mysql -umyuser -pmypasswd << '_EOT_' 
CHANGE MASTER TO
MASTER_HOST='remote_host',
MASTER_USER='slave',
MASTER_PASSWORD='slavepasswd',
MASTER_LOG_FILE='mysql-bin.000052',
MASTER_LOG_POS=12345678;

start slave ;

select sleep(1) ;

show slave status\G
_EOT_

```

以上、こんな感じになります。そこそこ時間はかかりますが、稼働中のMySQLを無停止でレプリケーションが構築できるって魅力的です
ライセンス表記の自動作成


##各種オープンソース等を使用した際のライセンス表記の扱い
Settings.bundleのAcknowledgements.plistファイルにライセンス情報を記載する。
iPhoneの「 **設定アプリ** 」内で表示する。

##想定している状態
TESTSettingsといプロジェクト名
cocoaPodsにてライブラリ管理している

##実装イメージ

![iOSシミュレータ_-_iPhone_Retina__4-inch_64-bit____iOS_7_1__11D167_のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/11373/6366c008-5872-b529-d576-843f6996499b.jpeg "iOSシミュレータ_-_iPhone_Retina__4-inch_64-bit____iOS_7_1__11D167_のコピー.jpg")



##Setting Bundle追加

[ **File** ] → [ **New** ] → [ **File** ] [ **Resource** ] → [ **Settings Bundle** ]


##Settings Bundle内のRoot.plist編集
[ **Root.plist** ] →　[ **iPhone Settings Schema** ] [ **Preference Items** ] → [ **Item 1** ]を下記内容にする。

|Key|Value|
|:-----------|:-----------|
|Type|Child Pane|
|Title|Acknowledgements|
|Filename|Acknowledgements|


##Settings.bundle内にAcknowledgements.plistを作成

xcodeの[ **Settings.bundle** ]を右クリックして表示されるメニューの [ **Show in Finder** ]を右クリック
表示されたFinder上で[ **Settings.bundle** ]を右クリック[ **パッケージの内容を表示** ]表示されたFinder上でRoot.plistを右クリックして[ **複製** ]してファイル名を[ **Acknowledgements.plist** ]にする。
作成した[Acknowledgements.plist]をエディタで開いて中身を全部削除して上書き保存する。
これで[Acknowledgements.plist]が完成

##自動ライセンス更新の設定
podfileを編集してpod install（pod update）すると自動的にライセンス情報が更新されるように設定

```
post_install do | installer |
require 'fileutils'

#Pods-acknowledgements.plist下記の場所に移動（2015/10/15）
FileUtils.cp_r('Pods/Target Support Files/Pods/Pods-Acknowledgements.plist', 'TESTSettings/Settings.bundle/Acknowledgements.plist', :remove_destination => true)

# エラー
#FileUtils.cp_r('Pods/Pods-acknowledgements.plist', 'TESTSettings/Settings.bundle/Acknowledgements.plist', :remove_destination => true)

end
```

##cocoaPodsにて管理していない場合
Acknowledgements.plistを手動で修正する。
SwiftでNSManagedObjectのサブクラスを作成してフェッチする方法(Beta5で)

モデルでのクラス名の設定
----------

xcdatamodeldでエンティティのクラス名にモジュール名のプレフィックスを付ける必要があります。アプリ名がMyApp、Entity名がPersonだとするとクラス名はMyApp.Personと設定します。

モジュール名を付けないとNSEntityDescription.insertNewObjectForEntityForNameが動作せず、コンテキストでフェッチしてもオブジェクトをサブクラスにキャストできませんでした。プレフィックスを付けるとフェッチしたオブジェクトのクラス名がMyApp.Personとなっていましたが、付けないとNSManagedObject_Person（の様な名前。うろおぼえです。）となっていました。

インスタンスの作成
----------

```Swift
let person = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: context) as Person
```

もしくは

```Swift
let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: context)
let person = Person(entity: entity, insertIntoManagedObjectContext: context)
```

として作成します。

Fetch
----------

フェッチではフェッチした後でキャストします。executeFetchRequestを実行する時にキャストしようとするとエラーになりました。


```Swift
let request = NSFetchRequest(entityName: "Person")
let array = context.executeFetchRequest(request, error: nil)
let persons = array as? [Person]
```
備忘録：var_dumpする時、ちょっぴり幸せになる方法。PHP初心者向け


### 先ほど小さな幸せを見つけたので、共有兼、備忘録。

ブラウザ上でvar_dumpして中身を確認したくなる時って有りますよね。でも要素が多すぎるとやたらめったら表示されて悲しいことになります。

でも、var_dumpするときに上下に\<pre\>を挟んであげると……

```php
	echo "<pre>";
	var_dump($result);
	echo "</pre>";

```

わぁ。とっても綺麗。
Googleスプレッドシートに画像検索結果を表示

2017/4/13追記：Google画像検索APIの提供終了によって、本スクリプトも動かなくなりました。

Google Apps Script を用いて、Googleスプレッドシートに、Google画像検索のトップとして表示される結果を返します。下記の記事内容をまとめ直したものです。

- http://shirayuca.github.io/blog/2014/07/27/googleimage.html


## スクリプト

```js:getTopImageUrl.gs
function getTopImageUrl(query) {
  var url = 'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=' + encodeURI(query);
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  var object = Utilities.jsonParse(json);
  return object["responseData"]["results"][0]["unescapedUrl"];
}
```


## 使い方
Googleスプレッドシート上で、任意のセルに検索キーワードを入力（例として、A2セル）し、`=getTopImageUrl(A2)`とすると、Google画像検索結果のトップ画像URLが表示されます。そのURLに対して、Googleスプレッドシートに元々あるimage関数を使用することで、Google画像検索結果のトップ画像がセルに表示されます。

下記では、例として、「都道府県名 AND ラーメン」というキーワード一覧で検索した、各都道府県のラーメン画像スプレッドシートを作成しました。

<a href="https://docs.google.com/spreadsheets/d/1-Bz_JMxg9mqIfAmFxFgEvJArgeF8Z171999wSKQfA7Y/edit?usp=sharing"><img alt="ラーメンシート" src="http://shirayuca.github.io/blog/2014/07/27/googleimage/ramen.png"></a>


## 参考
下記のページを参考にしました。

- http://t-kashima.hateblo.jp/entry/2012/03/11/235755
- http://www.garunimo.com/program/linux/linux43.xhtml
Synth@0.5.3でPOST|GETのパラメータの取り方が変更になったメモ


Synthの最新版ではbodyParserがSynthソースコード内から生成されるひな形内に移動しています。
それによって使用方法が違うので、それのメモです。

```CoffeeScript:back/resources/account/post.coffee
exports.postRegist = (params)->
  console.log params
  result =
    result: "successss"
    post: params
  return result

```

一行目`exports.postRegist = (params)->`の引数である括弧内にほしい文字列を入れたらデータがとれます。
つまり、
`(params, req, res)`と`(req, params, res)`でコードの動作に差はありません。
仕組みとしては、`back/service/params.js`で`params`と言うパラメータをバインドするようになっており、

```JavaScript:params.js
var _ = require('lodash');
var Promise = require('bluebird');
var bodyParser = Promise.promisify(require('body-parser').json());
exports.params = function (req, res) {
  // Combines the three sources of parameters into one, and return them in one object
  // Similar to how Rails and various other frameworks do it
  return bodyParser(req, res).then(function () {
    return _.merge({}, req.query, req.params, req.body);
  });
};

```
このように、今までExpressでは分散されていた`req.query, req.params, req.body`がマージされた状態で取得することができます。
それによって、何も考えずにGETとPOSTの両方で同じコードによってパラメータを取得することが可能です。

Synthのバージョンを上げた事でPOSTの値が取得できなくなったため、私はこれによって小3時間は悩みました。
結局最新のSynthでテンプレートを作りなおして差分を適応した所、このようになっていたので、私のような犠牲者がこれ以上増えないことを祈って書きました。

Synthは実用性は高そうですが、現状実用的に使うにはまだ早いですね。
iOS開発でLocalizable.stringsがコンフリクトしたときの場当たり的対処

iOSの多言語化ファイルであるLocalizable.stringsはUTF-16のため、gitではうまくmergeを行ってくれません(´・ω・｀)

対策をググったのですがいまいちうまい方法がわからず、現状自分が落ちついた方法を書いてみたいと思います。うまいやり方をご存じの方はぜひコメントで教えて下さい。

1. マージ元のLocalizable.stringをLocalizable.strings.oursとして保存する
> git checkout --ours ja.lproj/Localizable.strings
> mv ja.lproj/Localizable.strings ja.lproj/Localizable.strings.ours

2. マージしたいLocalizable.stringを復元する
> git checkout --theirs ja.lproj/Localizable.strings

3. Diffを確認する
> \# GNU diffはutf-16のファイルをバイナリだと思っちゃうのでvimdiffを使う
> vimdiff ja.lproj/Localizable.strings ja.lproj/Localizable.strings.ours

4. 手動で頑張ってマージする (つらい)

5. Localizable.strings.oursを削除してrebase続行
> rm Localizable.strings.ours
> git add Localizable.strings
> git rebase --continue
2014.08.05 Unity5機能紹介セミナーのメモ

#はじめに
Unity5の機能紹介という事で[ワークショップ](http://japan.unity3d.com/kenjin/event_detail.html?id=1401426789192)に参加した時の自分メモです。

#Universal Shaderへ一本化してく

#物理ベースシェーディング
シーン内に環境光が在ると仮定した場合のシーン内オブジェクトの色表現をリアルタイムで行える様にするらしい。
キーワード：
Imaged Based Lighting
Reflective Probe
Realtime GI(Global Ilmination:反射)

#Sound周りのUI刷新
インスペクターでしか設定できなかったのをサウンドのミキシングができるように音楽編集ソフトに近いUIを追加するらしい。
![スクリーンショット 2014-08-18 6.10.32.png](https://qiita-image-store.s3.amazonaws.com/0/25895/3a20bffa-2c96-bd82-cf50-f4f00967acc4.png)

#インポート時とランタイム時のメモリ節約

#WebPlayを無くし、WebGL出力の変更になる
実験的にC# -> Universal Langage（Webの共通言語？）-> c, c++生成で可能性を広げる目的もあるらしい。
![スクリーンショット 2014-08-18 6.14.52.png](https://qiita-image-store.s3.amazonaws.com/0/25895/c6f9d9a6-8ce4-5868-a678-3311ba6599a1.png)

#uGUI(Unity4.6より実装される予定)
画面サイズに簡単にリサイズできる
３D空間のときはカメラの角度に合わせUI画面を傾けるような事もできるようになるらしい。

ボタンオブジェクトが用意されて押したときの動作や設定をインスペクタで出来るようになっている
OnClikでいろいろ設定できる（xCodeがかすんで見える）
UIの繊維をAnimatorで設定できるようにAutomationができる（0フレームで作成すること）

#その他、マルチモニター出力をサポートするかもしれない

#Unity Cloud
[テストフライト](https://www.testflightapp.com)的なサービスや広告などの埋め込み機能を標準実装するらしい。これによりサードパーティーを使わなくてもUnity内で全て完結する可能性がある
![スクリーンショット 2014-08-18 8.41.21.png](https://qiita-image-store.s3.amazonaws.com/0/25895/b9ead274-1e5d-e2e6-6f9b-268585997ec0.png)


以上です。

ほかご意見いただけると、さいわいです。
elasticsearchの起動時にUnknownHostExceptionが発生した場合の対処方法

#現象
elasticsearchの起動時にUnknownHostExceptionが発生する。

/etc/hosts
`[vagrant@vagrant-centos65 elasticsearch-1.3.2]$ ./bin/elasticsearch
[2014-08-17 17:57:14,963][INFO ][node                     ] [Karkas] version[1.3.2], pid[1918], build[dee175d/2014-08-13T14:29:30Z]
[2014-08-17 17:57:14,963][INFO ][node                     ] [Karkas] initializing ...
[2014-08-17 17:57:14,970][INFO ][plugins                  ] [Karkas] loaded [], sites []
[2014-08-17 17:57:22,775][WARN ][common.network           ] failed to resolve local host, fallback to loopback
java.net.UnknownHostException: vagrant-centos65.vagrantup.com: vagrant-centos65.vagrantup.com: Name or service not known
	at java.net.InetAddress.getLocalHost(InetAddress.java:1473)`

#原因
自ホスト名が解決ができていない。

#解決方法
/etc/hostsに自ホスト名を追加する。
Gitで補完機能を有効にする方法


# やること
### 1.`~/.git-completion.bash`ファイルを作成

```linux
vim ~/.git-completion.bash
```
▼`git-completion.bash`ファイルの中身はこちら
https://github.com/git/git/blob/master/contrib/completion/git-completion.bash


### 2.上で作成したファイルを読み込むよう設定

```
vim ~/.bashrc
```
→`~/.bashrc`に`source ~/.git-completion.bash`を書き込む

【追記】
すべてのユーザーに対して Git 用の Bash シェル補完を使わせたい場合は、

- Mac → `/opt/local/etc/bash_completion.d` ディレクトリ
- Linux 系 → `/etc/bash_completion.d/` ディレクトリ

に`~/.git-completion.bash`ファイルをコピー。Bash は、これらのディレクトリにあるスクリプトを自動的に読み込んでシェル補完を行う。
ホームディレクトリに`~/.git-completion.bash`を置くだけでは、ホームディレクトリでGit使う時のみ補完が有効になる。

【参考URL】
▼Git の基本 - ヒントと裏技
http://git-scm.com/book/ja/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%92%E3%83%B3%E3%83%88%E3%81%A8%E8%A3%8F%E6%8A%80
▼ Gitコマンドをタブキーで補完できるようにする
http://mawatari.jp/archives/git-completion-bash
▼Macにbash-completionをインストールし補完を活用する
http://mawatari.jp/archives/install-bash-completion-on-mac
MySQLで補完機能を有効にする方法

# やること
- 設定ファイルに`-auto-rehash`を追記。

# 補足
- 設定ファイル名は`my.cnf`
- 設定ファイル自体は`find`コマンドで見つければOK

（例）
Mac OS X：バージョン 10.8.5
MySQL：バージョン 5.6.17

```linux
find /usr/local/Cellar/mysql -name "my*.cnf" # バージョン確認
vim /usr/local/Cellar/mysql/5.6.17/my.cnf # 設定ファイル更新
```

※CentOSなどのLinux環境下では、設定ファイルが`/etc/my.cnf`にある。
Bash で 似非マルチスレッド & mutex lock

ディレクトリごとの実行結果が同時に出力されてしまうので、
擬似lockっぽいものを追加してみた。
これに git pull とかを食わせると便利。

```bash
#! /bin/bash
# -*- mode: sh -*-

args=$@

dirs=$(ls -d */)

each-internal(){
    pushd $1 > /dev/null
    bash -c "$args"
    popd > /dev/null
}

export lock=$(mktemp)
echo "false" > $lock

trap "rm -f $lock" EXIT

each(){
    outfile=$(mktemp)
    each-internal $@ > $outfile
    while $(< $lock)
    do
        sleep 0.1$RANDOM
    done
    echo "true" > $lock
    cat $outfile
    echo "false" > $lock
    rm -f $outfile
}

pids=

for dir in $dirs
do
    each $dir &
    pids="$! $pids"
done

wait $pids
```
Serverspec のように FTP サーバー上のファイルの状態をテストできる gem を作りました

FTP による接続しかできないサーバーでも [Serverspec](https://github.com/serverspec/serverspec) みたいにファイルの状態をテストしたかったので FTPSpec という gem を作りました。僕のソフトウェア開発戦闘力が高ければ Serverspec に Pull Request で提案をすることもできたかもしれませんが、できそうになかったので、初めてながら gem を作ることにしました。

## GitHub

https://github.com/suzuki86/ftpspec

## インストール

```bash
$ gem install ftpspec
```

## 使い方

`ftpspec-init` というコマンドがインストールされるので、そのコマンドを実行します。

```
$ ftpspec-init
```

テスト用のテンプレートが生成されます。

```
$ tree
.
├── Rakefile
└── spec
    ├── ftp_spec.rb
    └── spec_helper.rb

1 directory, 3 files
```

`spec/spec_helper.rb` に FTP サーバーのホスト名、ユーザー名、パスワードを書きます。

```ruby
require "ftpspec"
require "rubygems"
require "rspec"
require "net/ftp"

RSpec.configure do |c| 
  c.add_setting :ftp, :default => nil 
  c.before do
    hostname = "YOUR HOSTNAME"
    user = "YOUR USER"
    password = "YOUR PASSWORD"
    c.ftp = Net::FTP.new
    c.ftp.passive = true
    c.ftp.connect(hostname)
    c.ftp.login(user, password)
    Ftpspec.set_ftp
  end 
  c.after do
    c.ftp.close
  end 
end
```

`spec/ftp_spec.rb` にテストを書きます。

```ruby
require "spec_helper"

describe "/httpdocs/index.html" do
  it { should be_mode "644" }
end
```

`rake spec` を実行します。

```
$ rake spec
```

結果です。

```
.

Finished in 2 seconds (files took 0.14477 seconds to load)
1 examples, 0 failures
```

## マッチャー

### be_mode

テスト対象のパーミッションが想定したものになっているかテストします。

```ruby
describe "/httpdocs/index.html" do
  it { should be_mode "644" }
end
```

### be_file

テスト対象がファイルであるかテストします。

```ruby
describe "/httpdocs/index.html" do
  it { should be_file }
end
```

### be_directory

テスト対象がディレクトリであるかテストします。

```ruby
describe "/httpdocs/images" do
  it { should be_directory }
end
```

### be_owned_by

テスト対象の所有者が想定したユーザーになっているかテストします。

```ruby
describe "/httpdocs/index.html" do
  it { should be_owned_by "someone" }
end
```

### be_grouped_into

テスト対象のグループが想定したグループになっているかテストします。

```ruby
describe "/httpdocs/index.html" do
  it { should be_grouped_into "admin" }
end
```
CentOS 7のインストール時にTeam Driverを設定する

# 前提

[前回](http://qiita.com/yunano/items/34c6b805759b7560352f)は既に起動しているコンピュータの2枚のNICに対してTeam Driverを使用してteamingを行った。
今回はCentOS 7インストール時にteamingを行ってみる。

前回と環境は同じである。すなわち、VirtualBox 4.3.12上に立てた仮想マシンを利用しており、NICの名前は「enp0s3」と「enp0s8」となっている。

以下3箇所で`{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}`としているが、VirtualBoxではない通常の環境では`{"runner": {"name": "activebackup"}}`で良い。

VirtualBoxにおけるこの制限については https://community.oracle.com/thread/2546040 参照（ここにはbondingの際の手順であるfail_over_mac=1にしなければならない旨が書かれているが、teamingにおいては`"hwaddr_policy": "by_active"`がこれに相当する）。

# GUIインストーラを使用してteaming

CentOS-7.0-1406-x86_64-Everything.iso および CentOS-7.0-1406-x86_64-Minimal.iso の日本語設定にて確認を行った。
なお、テキストインストーラにはteamingを設定する機能はなさそうだった。

《手順》

1. 「ネットワークとホスト名」をクリック
1. enp0s3とenp0s8はとりあえずオフのまま（後で自動的にオンになる）
1. "+"をクリックして「チーム」を選択して「追加」
1. 接続名を適当に編集する
1. Teamed connectionsで「追加」をクリックして「Ethernet」を選択して「作成」
1. 接続名を適当に編集する（そのままだと接続名に"スレーブ"という日本語が入り、今後あまり幸せにならないので変えた方が良い）
1. デバイスのMACアドレスに"enp0s3"を選択
1. 「全般」タブをクリックし、「この接続が利用可能になったときは（以下略）」をオンにする
1. JSON configに「{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}」と入力する
1. 5から9をもう一度繰り返す。7の選択は"enp0s8"とする
1. 「IPv4のセッティング」タブをクリックし、IPアドレス等を設定する

![20140818team.png](https://qiita-image-store.s3.amazonaws.com/0/47934/d0c7374f-c017-b8a7-3765-dcc22ffeaee3.png)

# kickstartファイルを使用してteaming

kickstartを利用した自動インストール時にもteamingを設定することが可能である。
kickstartファイル内のnetworkの設定を以下のように記述すれば良い。

```
network --device enp0s3 --onboot=no
network --device enp0s8 --onboot=no
network --device team0 --activate --bootproto static --ip=10.0.2.34 --netmask=255.255.255.0 --gateway=10.0.2.1 --nameserver=8.8.8.8 --teamslaves="enp0s3,enp0s8" --teamconfig='{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}'
```

あるいは、デバイス名の代わりにMACアドレスを指定しても良い。

```
network --device 08:00:27:CB:8E:FB --onboot=no
network --device 08:00:27:DD:09:C6 --onboot=no
network --device team0 --activate --bootproto static --ip=10.0.2.34 --netmask=255.255.255.0 --gateway=10.0.2.1 --nameserver=8.8.8.8 --teamslaves="08:00:27:CB:8E:FB,08:00:27:DD:09:C6" --teamconfig='{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}'
```

参考： https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-kickstart-syntax.html
YouTube埋め込み時にオリジナル画像を用いる際の注意


YouTubeをサイト内に埋め込む際に、YouTubeの標準UIや再生ボタンなんかが
気に入らないので、クリック前の画像をオリジナルの画像として用意する場合は多いと思います。

その際、

* オリジナルの画像にクリックイベントを持たせ、クリックされた瞬間に画像とYouTubeiframeを置き換える

という実装にしてしまうと、画像の置き替えの際に一瞬画面内に何も映らない
タイムラグが生じてしまいます。

これは、iframeをhtml内に埋め込んでから実際そこに表示されるまでに若干のラグがあるからです。

これを防ぐにはYouTubeAPIのコールバック関数を使うと良いです。

https://developers.google.com/youtube/iframe_api_reference?hl=ja


YouTubeAPIのコールバックのひとつに、動画の再生準備が整った時点で発火される

onPlayerStateChange(event)

というものがあり、これが発火されたタイミングでもともと表示されていた画像を
消すことで、画像 → 動画の置き換えをタイムラグなく行うことができます。
jQueryで取得される値から 'px' を取り除く方法


jQueryでDOMのcssプロパティを取得した場合、"80px" というように、
pxまで含まれた文字列となっているため、今まで数値計算する際は、

```
replace('px', '')
```

という風に半ば強引にpxを消してから計算してた。
でも parseIntメソッドを使えば数値部分だけ切り出して返してくれるということを知った。

```
marginLeftVal = parseInt( $(elm).css('margin-left') );
```
InstagramAPIでerror client_id provided is invalid and does not match a valid application.

InstagramAPIを叩いたらエラーがでました。

```
Instagram::BadRequest: GET https://api.instagram.com/v1/tags/cat/media/recent.json?client_id=%5Bhogehoge%5D
client_id provided is invalid and does not match a valid application.
```

エラーメッセージは以下のようになりました。

```
{
  "meta": {
    "error_type": "OAuthClientException",
    "code": 400,
    "error_message": "The \"client_id\" provided is invalid and does not match a valid application."
  }
}
```

OAuthの認証が通らないようです。Instagramの[開発者画面](http://instagram.com/developer/)からclient_idが正しいかを確認するか、あるいは正しく設定されているかを確認するといいです。

私の場合は、環境変数にclient_idとclient_secretを入れたつもりが、実際は入っていなかったためにこのエラーが発生しました。