OmniAICreator/Qiita-1.07M huggingface dataset:
ズンドコキヨシ with C using 128bit XORshift(擬似乱数生成)

ブックマークを整理してたら見つけた。
http://d.hatena.ne.jp/jetbead/20121202/1354406422

> 2.XORshift(擬似乱数生成)
> xor演算とビットシフトのみから高速に生成できる擬似乱数です。
マラソンマッチなどで使えそうでしょうか。

いえ。ズンドコキヨシで使えます。

## code 

http://ideone.com/NYXMBs

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

// Thaks to http://d.hatena.ne.jp/jetbead
uint32_t xor128(void){
  static uint32_t x = 123456789;
  static uint32_t y = 362436069;
  static uint32_t z = 521288629;
  static uint32_t w = 88675123; 
  uint32_t t;
 
  t = x ^ (x << 11);
  x = y; y = z; z = w;
  return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 	
}

int main(void) {
	int idx;
	uint32_t val;
	int zuncnt = 0;
	
	for(idx = 0; idx < 200; idx++) {
		val = xor128();
		if (val % 2 == 0) {
			printf("[Doko]");
			if (zuncnt == 4) {
				printf("...Kiyoshi!\n");
				break;
			}
			zuncnt = 0;	
		} else {
			printf("[Zun]");
			zuncnt++;
		}
	}
	
	return 0;
}
```

## 結果

```txt:結果
Success	time: 0 memory: 2156 signal:0
[Doko][Doko][Doko][Doko][Doko][Doko][Zun][Doko][Doko][Zun][Doko][Zun][Doko][Zun][Doko][Zun][Doko][Doko][Doko][Doko][Doko][Doko][Doko][Doko][Zun][Zun][Zun][Doko][Doko][Zun][Zun][Doko][Doko][Doko][Zun][Zun][Doko][Doko][Zun][Zun][Doko][Doko][Doko][Zun][Zun][Doko][Zun][Doko][Doko][Zun][Doko][Zun][Zun][Doko][Doko][Doko][Zun][Doko][Doko][Doko][Doko][Zun][Doko][Doko][Zun][Doko][Doko][Doko][Zun][Doko][Doko][Doko][Zun][Doko][Doko][Doko][Doko][Doko][Doko][Zun][Zun][Doko][Zun][Doko][Doko][Zun][Doko][Zun][Zun][Doko][Zun][Doko][Doko][Zun][Doko][Zun][Doko][Zun][Doko][Zun][Zun][Doko][Doko][Doko][Zun][Zun][Doko][Zun][Zun][Zun][Zun][Zun][Zun][Doko][Zun][Zun][Zun][Doko][Zun][Doko][Doko][Doko][Zun][Doko][Doko][Zun][Doko][Doko][Doko][Doko][Zun][Zun][Zun][Doko][Doko][Zun][Zun][Zun][Doko][Doko][Zun][Doko][Doko][Doko][Zun][Zun][Doko][Doko][Doko][Doko][Zun][Doko][Doko][Doko][Doko][Zun][Zun][Zun][Doko][Doko][Zun][Doko][Zun][Zun][Zun][Zun][Doko]...Kiyoshi!
```

１２８ビットの乱数を得ながら、そのLSBしか見ていないのは贅沢な使い方だ。
NimをOSXでインストール

[歌舞伎座.tech#9「異種プログラミング言語格闘勉強会」](http://kbkz.connpass.com/event/26677/)でNimに興味持ったのでインスコしたところハマったのでメモ。

- 免責事項
    - 2016年3月時点での記事です

**brew経由のインストールだとnimbleがインスコできない**

https://github.com/nim-lang/nimble/issues/203

うまいことPATHが設定されないっぽい。git cloneしてビルドしてbinに自分でPATH通すのが正解っぽい（2016年3月時点)

```shell-session
brew remove nim # 一回入れてた場合は消す
cd Github/Nim/
git clone --depth 1 https://github.com/nim-lang/csources
cd csources && sh build.sh # installとかはしない、binに吐き出されるバイナリだけ使う
nano .bash_profile # PATHに追加
```

後は

```shell-session
nim e install_nimble.nims
```

とかでnimble(npm的なの？)が入るのでニムニムできるのかな、と思います。Nimは独自のバイナリじゃなくてCのソースコードを吐くらしいので、エコシステム的な分断が無いのがいいなと思った…後インデント尊い。
VyOS バージョン一覧

周期表の「スイヘーリーベー」なんだけど、忘れがちなのでメモ
2016年3月20日調べ

0. Hydrogen (ver = 1.0.x)
    * 1.0.0 : 2013-12-22
    * 1.0.1 : 2014-01-17
0. Helium (ver = 1.1.x)
    * 1.1.7 : 2016-02-17 (Security patch)
0. Lithium (ver = 1.2.0)
    * Will be released soon (2016 first half?) regardless of issues.
0. Beryllium (ver = ?.?.?)
    * Debian Jessie based. Worked on "current" branch.
    * Will focus on this release for now. (as of 2016-01)


* Debian Jessie ベースの VyOS「Beryllium」がどうなるか日本語まとめ
  * https://www.higebu.com/blog/2016/02/26/2016-02-26-vyos-beryllium
* [Vyos-developers] End of squeeze-lts support, lithium,  and what to do next
  * https://lists.tuxis.nl/pipermail/vyos-developers/2016-January/000150.html
* [Vyos-developers] Updates on squeeze-lts EOL and jessie migration issues
  * https://lists.tuxis.nl/pipermail/vyos-developers/2016-January/000177.html
VPC Private Network 内の Lambda Function から boto3 で S3 を操作する

ちょっと前に VPC Private Network 内に立てた Python Lambda Function から boto3 で S3 を操作しようとしたとき、 S3 へアクセスできなくて困った。今更ながらそのときの解決策を（思い出しながら）メモ。

## VPC Endpoint の作成

『 [VPC Lambdaからs3へアクセスする](http://qiita.com/ijin/items/94c0bc4b8f6f5e77a591) 』によると、 Private Network から S3 へアクセスするには NAT インスタンス（ゲートウェイ）を立てるか VPC Endpoint for S3 を使う必要があるとのこと。自分は後者にすることにした。

## boto3 から S3 を操作する

上記設定をしたものの、依然として S3 へアクセスしようとするとエラーとなってしまう。

```
raise caught_exception ConnectionError: ('Connection aborted.', error(111, 'Connection refused'))
```

いろいろ調べているうちに [こちらのポスト](http://ijin.github.io/blog/2016/02/18/ssh-and-git-on-aws-lambda/ "LambdaでSSHやGitを使ってみよう") で以下のように `config` で `signature_version` を指定しているのをみつけた。

```python3
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
```

`s3v4` とは、S3認証の Version 4 ということらしい。
config を指定して実行したところ、 S3 へアクセスすることができた。

ちゃんと調べていないので推測になってしまうけど、デフォルトの v2 で S3 へアクセスしにいったけど、東京リージョンは v4 しか対応していないのでエラーになった、というところだろうか。

## まとめ

VPC Private Network 内に立てた Lambda Function から Python boto3 で S3 へアクセスする場合は以下のように `signature_version` を明示的に指定する。

```python3
import boto3
import botocore.client

config = botocore.client.Config(signature_version='s3v4')
s3 = boto3.resource('s3', region_name='ap-northeast-1', config=config)
bucket = s3.Bucket(s3_bucket_name)
obj = bucket.Object(s3_key)
```
AWSの自分用メモ4 (Aurora_Part.2)

前回Auroraの特徴についてまとめましたが、その後さらにいぢくり、さらにいぢくり倒し、
何点かわかったことについて追加/補足していきます。
前回はAuroraの仕様についての話がメインでしたが、今回はAuroraの使い方についてが主になります。

## ClusterEndpoint
この子には騙されました。(勝手に勘違いしただけなのですが…)
最初私はこれは"WriterとReaderをまとめたインスタンス郡の名前"と思っており、
ELBのように負荷分散とかをやってくれるものだと思っていました。

ですが実はそうではなく、これは"ReaderにFailoverしてもその新しいWriterを常に追いかけてくれる名前"でした。
要するに"Writerを指し続けるDNS"だそうで、複数の向き先を指定して～などやらずとも
これ一つ指定しておけば100%Writerに向かってくれるというものだそうです。

「じゃあ逆にReader達を指し続けてくれるものは？」というと、残念ながらありません。
大きいシステムだと『Writerは書き込み専用で、読み込みは全てReader達にへ』なんて用途は少なくないはずですので、
それこそReaderだけを指し続け、おまけにELBのように負荷分散までやってくれる！みたいなものが、
すぐに出てきてくれるのでは！と、勝手に思っております。

## MariaDB Connecter/J

公表されている『Failover完了までの時間』というのが、
このClusterEndpointが新しいWriterに切り替わるまでの時間のようです。
要するに1分未満です。

これまでのMySQLに比べれば十分早いです。
ただ用途によっては『1分間書き込み不可』というのは結構な痛手だったりします。
「どうにかならないかしら・・・」

**安心してください、早くなりますよ**

JDBCを使って、より早くする方法が、この*MariaDB Connecter/J*です。
こいつを使ってやることで超高速のfailoverができるのです。
設定にもよりますが、その時間、なんと**1～2秒!!!** (検証済み)

さすがに驚きました。設定時に注意するのは以下です。

- parameterは`aurora`を設定する
- ClusterEndpointは使用せずに、Writer/ReaderのEndpointをカンマ区切りで指定
- オプションの`connectTimeout`を**適切に設定する**
    - ここで結構はまりました・・・

あと、これは2016/2末時点での制限ですが、
『この高速failoverと負荷分散(loadbalance)の両立はできません！』
つまり『書き込みはWriterに高速failoverする設定にして、読み込みはWriterとReaderで分散するように』みたいな事は現状ではできません。
どちらかを諦めるか、読み書きで設定を分けるかの対応になってしまいます。
うむぅ・・おしい。。

ただこれもきっとすぐに何とかしてると、勝手に思ってます。

## AuroraのCloudFormation

Auroraの場合、既存のRDSと異なるのはClusterが必要な部分です。
そのため、[DBClusterParameterGroup](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html)と[DBCluster](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html)を作成する必要があります。
また、Clusterを指定した場合、[DBInstance](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html)の方で指定できないものが幾つかあります。
指定すると怒られます。

- AllocatedStorage
- CharacterSetName
- DBSecurityGroups
- SourceDBInstanceIdentifier
- StorageType
- MultiAZ
- PreferredBackupWindow
- PreferredMaintenanceWindow
- StorageEncrypted

これはParamterGroupがDBCluasterとDBInstanceに分かれたのと理由は同じで、
『DB構成全体で管理する設定』と『DB一台ずつ個別で持つ設定』が異なるためになります。

## まとめ

failoverが1～2秒でできるのは正直感動ものです。
更に、failover先のレプリカの選択は、これまではレプリカの中からそのときの状況で自動選択されてたものを、最近では設定できるようになったそうです。(まだ試してませんが)
Auroraのレプリカはストレージ料金がかからない分、Multi-AZよりも低コストですし、
読み書きどちらもDB負荷が高い場合などにはfailover先の控えとして1台、余分にレプリカを建てておくことにも抵抗が少なくなります。
高速failoverと合わせて、冗長化のメリットが飛躍的に向上しているようです。
今後改善して欲しいところもちょこちょこありますが、まだまだ進化途中といった感じですし、今後に期待も高まりますね！
Chef+Vagrantで環境構築(基本コマンド)


##Vagrantで仮想サーバーを立ち上げ

###Vagrantの初期化

```bash:ターミナル
$ vagrant init <Box名>
```

Vagrantfileが作成される

###SSHの設定

```bash:ターミナル
$ vagrant ssh-config --host <ホスト名> >> ~/.ssh/config
```

vagrant ssh-configコマンドでssh config向けの設定が出力されるので、それを~/.ssh/configにリダイレクト
それにより、ssh <ホスト名>でログインできるようになる

###仮想サーバーのネットワーク設定

```ruby:Vagrantfile
Vagrant.configure(VAGRANT_API_VERSION) do |config|
	config.vm.network "private_network", ip: "192.168.33.10"
end
```
プライベートネットワークを記述することにより、192.168.33.10で接続できるようになる

###Vagrantの起動

```bash:ターミナル
$ vagrant up
```

##knife-soloでchef-soloをリモート実行

knife-soloを使うことでホストOSでクックブックを作成してリモートサーバーに転送しchef soloコマンドを実行する一連の作業を自動化できる

###knife-soloのインストール

```bash:ターミナル
$ gem install knife-solo
```

インストールされるもの
・Chef
・knifeコマンド

###Berkshelfのインストール

knife-soloは、他のgemのインストール有無によってデフォルトのオプションが変化するので、事前にBerkshelfのインストールも行う

```bash:ターミナル
$ gem install berkshelf
```

Berkshelfは、クックブックの依存関係を管理するもの
(Gemfileのようなもの)

###knife-soloリポジトリを作る

```bash:ターミナル
$ knife solo init .
```

このコマンドによりローカル側にChefに必要な各種ファイルとディレクトリが展開される

###ホストOSからゲストOSにChef Soloをインストールする

```bash:ターミナル
$ knife solo prepare <ホスト名 or IPアドレス>
```

###ホストOSからゲストOSでchef soloコマンドを実行

```bash:ターミナル
$ knife solo cook <ホスト名 or IPアドレス>
```

###(補足)ホストOSからChef soloのインストールと実行を同時に行う

```bash:ターミナル
$ knife solo bootstrap <ホスト名 or IPアドレス>
```

##クックブックの作成

###knifeコマンドでクックブックの作成

```bash:ターミナル
$ knife cookbook create <クックブック名> -o site-cookbooks
```

自作のクックブックはsite-cookbooksに置く

###レシピの編集

```ruby:(例)site-cookbooks/dstat(クックブック名)/resipes/default.rb(例)
package "dstat" do
	action :install
end
```

##Nodeオブジェクトでサーバーの状態を記述

Nodeオブジェクトは任意のノードの状態を記述するためのJSON形式の設定ファイル
knife solo prepare(knife solo bootstrap)の際にnodesディレクトリに<ホスト名.json>という名前で作成されている

###Nodeオブジェクトに設定を記述

```json:(例)nodes/ホスト名.json
{
	"run_list":[
		"recipe[dstat]"
	]
}
```

上記の例はノード(ホスト名)にdstatのレシピが適用されるという状態を定義している

(注)このrun_listへの追加をせずにchef soloコマンドを実行するとレシピが実行されないので忘れないようにする必要がある

###ホストOSからゲストOSでchef soloコマンドを実行

```bash:ターミナル
$ knife solo cook <ホスト名 or IPアドレス>
```

これによりレシピがノード(ホスト名)に適用される
実際にはrsyncでローカルからリモートにクックブックが転送され、SSH経由でsudo付きでchef soloコマンドが実行されている

##参考
Chef実践入門2章
true/falseを切り替えるコマンドを作った

## 内容
コードを書いている時にtrue/falseを書き直すのが面倒なので、Vim scriptの勉強として作ってみた。
![switchBoolean.gif](https://qiita-image-store.s3.amazonaws.com/0/68643/b5202931-8234-6b92-a808-08ca7f8f8434.gif)
## コード
```.vimrc
function! BooleanToggle()
  let l:word = expand("<cword>")
  let l:bool = {'true': 'false', 'false': 'true'}
  if has_key(l:bool, l:word)
　　　　　　　　let l:tmp = @a
    let @a = l:bool[l:word]
    execute 'normal "_diw'
    execute 'normal "aP'
  　　　　let @a = l:tmp
  endif
endfunction
nnoremap <silent> <LEADER>+ :call BooleanToggle()<CR>
```
## コード説明
1. `expand("<cword>")`でカーソルの単語をローカル変数に格納
2. `true/false`の辞書型変数を作成
4. カーソルの単語が`true/false`だったらレジスタをローカル変数に退避させ、レジスタに値を格納
5. レジスタを上書きしないようにブラックホールレジスタでカーソルの単語を削除
6. レジスタに格納した論理値をペースト
7. 退避させたレジスタを元のレジスタに格納
8. `<LEADER>+`で論理値を切り替えるように設定

## その他
[AndrewRadev/switch.vim](https://github.com/AndrewRadev/switch.vim)というプラグインがあるみたい。
ESP8266 > 圧電ブザーで演奏してみた

参考 http://qiita.com/dtaksak/items/da1273fa3826ebcad6dc

http://qiita.com/7of9/items/a7b34547902f3565445f
を下敷きに曲を演奏するようにしてみた。

## 曲

頭がパンのあれ。白あんかこしあんか気になるこの頃。

参考 http://komachi.yomiuri.co.jp/t/2011/0914/443612.htm

## 圧電ブザー > LF-MB12B06

http://eleshop.jp/shop/g/gB6N363/

## 回路

- IO4 : 圧電ブザーの信号線
- GND : 圧電ブザーのGND

## code 

```esp8266_160321_buzzerMelody.ino
#define BEAT 300    // 音の長さを指定
#define SOUNDER 4  // 出力ピン

void setup() {
  Serial.begin(115200);
  Serial.println();
}

void soundDoremi(int idx)
{
  switch(idx) {
  case 0:
    analogWriteFreq(262) ;  // ド
    break;
  case 1:
    analogWriteFreq(294) ;  // レ
    break;
  case 2:
    analogWriteFreq(330) ;  // ミ
    break;
  case 3:
    analogWriteFreq(349) ;  // ファ
    break;
  case 4:
    analogWriteFreq(392) ;  // ソ
    break;
  case 5:
    analogWriteFreq(440) ;  // ラ
    break;
  case 6:
    analogWriteFreq(494) ;  // シ
    break;
  case 7:
    analogWriteFreq(523) ;  // ド
    break;
  }
}

void loop() {
#if 1  
  int doremiList[] = { 5, 5, 3, 1,   1, 2, 3, 1,
    4, 5, 4, 3, 2, 1, 7,
    7,  // for wait 
    5, 5, 3, 1, 1, 2, 3, 1,
    4, 5, 4, 2, 3,
    };
#else
  int doremiList[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
#endif  
  int lenth = sizeof(doremiList)/sizeof(doremiList[0]);

  analogWrite(SOUNDER, 500) ;

  for(int idx = 0; idx < lenth; idx++) {
    soundDoremi( doremiList[idx] );
    delay(BEAT);

    analogWrite(SOUNDER, 0) ;
    delay(BEAT);  
    analogWrite(SOUNDER, 500) ;
  }
  delay(BEAT);

  analogWrite(SOUNDER, 0) ;
  delay(3000) ; // msec
}
```


次はリストのラ・カンパネラだ。
掲載予定 2052年8月頃。
SQLの基本(複数テーブルのデータベース設計)


##外部キーに制約をつける

```sql:SQL
CREATE TABLE テーブル名 (
列名 データ型 NOT NULL AUTO_INCREMENT PRIMARY KEY,
列名 データ型 [NOT NULL],
列名(外部キー) 型 [NOT NULL],
[CONSTRAINT テーブル名(参照元)_列名(参照元)_FK]
FOREIGN KEY (列名(外部キー))
REFERENSES テーブル名(参照元) 列名(参照元)
)
```

```sql:例
CREATE TABLE interests (
int_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
interest VERCHAR [NOT NULL],
contact_id INT [NOT NULL],
[CONSTRAINT my_contact_contact_id_FK]
FOREIGN KEY (contact_id)
REFERENSES my_contact contact_id
)
```

###外部キー制約(FOREIN KEY)
参照整合性(外部キーに挿入できるのは、そのキーの参照元のテーブルに存在している値のみ)を持ち
主キー側のテーブルで行の削除や主キー値の変更を試みた場合エラーになる

###CONSTRAINT my_contact_contact_id_FK
必須ではない
後から取り消す場合に利用する

##関数従属

列Aの値が修正されると列Bも変更しなければならない時
列Bは列Aに関係従属している

省略記法
テーブル名.列名A ->; テーブル名.列名B
(例：initials列はname列に従属している)
super_heroes.name ->; super_heroes.initials

###部分的関数従属性

主キーではない列が、複合主キーに従属しているが、
複合主キーを構成する列全体には従属していないことを部分的関数従属性という
(複合主キーの一部分に従属していること)

###推移的関数従属性

主キーでない列のどれかが主キーでない列のどれかに従属していることを推移的関数従属性があるという

##第２正規形(2NF)

(規則)
1. 1NFであること
2. 部分的関数従属性を持たない

単一列の主キーを持っていればそのテーブルは2NFである
(部分的関数従属性を持つことはないため)

(2NFにする為には)
部分的関数従属性をもつ列を別のテーブルに移す

##第３正規形(3NF)

(規則)
1. 2NFであること
2. 推移的関数従属性を持たない

単一列の主キーを持っていればそのテーブルは2NFである
(部分的関数従属性を持つことはないため)

(2NFにする為には)
部分的関数従属性をもつ列を別のテーブルに移す

##参考

HeadFirstSQL7章
MySQLの便利クエリ


ちょっと便利なクエリについてまとめます。

## PORTを確認する
```sql
show variables like 'port';

```

## ユーザの一覧を取得する

```sql
select User, Host from mysql.user;

```

## 現在のデータベース名を表示する
```sql
SELECT database();

```

## テーブル一覧を取得する
```sql
SHOW TABLES FROM データベース名 LIKE パターン;
```
※カレントデータベースの場合From句は省略可
※LIKE句による絞込が可能

## テーブルのDDLを確認する
```sql
SHOW CREATE TABLE テーブル名
```

## テーブルのコメントを確認する
```sql
show table status like テーブル名など;
```

## カラムのコメントを確認する
```sql
show full columns from テーブル名;
```

## 期間の絞込
```sql
select * from hoge where hoge_date between now() - interval 10 WEEK and now();
```
* 上記の例は直近10週間
* 日付のみの場合、now()の代わりにcurrent_date()を使う
* WEEK以外にもSECOND、MINUTE、HOUR、DAY、WEEK、MONTHなどがある

## 実行計画を見る
```sql
explain select * from hoge;
```

## Linuxコマンドを実行する
```sql
\! ls
```

## 外部SQLを実行する
```sql
source test.sql
```
「ESP8266 - 電圧ブザーでメロディを奏でる」を試した

[ESP8266 - 電圧ブザーでメロディを奏でる](http://qiita.com/dtaksak/items/da1273fa3826ebcad6dc)
が気になる春分の今日このごろ。

http://qiita.com/7of9/items/844bbedb2dbf20e042b9
で購入していた圧電ブザーで試した。

##  圧電ブザー1 > LF-PB30W25C

- LF-PB30W25C
  - http://eleshop.jp/shop/g/gB6N361/
  - メーカー > ARIO
  - 216円
  - 動作電圧 > 3Vから30V
  - 消費電流 > 9mA
  - 電圧が変わると音の大きさが変わる

ドレミファソラシドには聞こえなかった。

## 圧電ブザー2 > LF-MB12B06

> 上記の接続とコードで試してみた。
音がでかく夜に使うのはだめだ。
道具箱直行。

のやつ。

http://eleshop.jp/shop/g/gB6N363/

音はでかいが、こちらはドレミファソラシドに聞こえる。
道具箱に置いておいてよかった。

昼に使うのは問題ない。。。と思うがやはり音は大きい。

ブザーの穴の部分にポストイットを貼ったら大分音が下がった。これでいい。
jsFiddle + AngularJS > JSON > JSON項目の取得

http://qiita.com/api/v2/schema
からJSON文字列を取得して、descriptionという項目を取得するサンプル。

## code
http://jsfiddle.net/okacgmpu/

```html
<div ng-controller="MyCtrl">
  Hello, {{name1}}
  <hr>
  Res, {{result}}
</div>
```

```js
var myApp = angular.module('myApp',[]);

function MyCtrl($scope, $http) {
	  $http.get('http://qiita.com/api/v2/schema').success(function(data, status, headers, config) {
	  $scope.name1 = data;
    $scope.result = data.description;
		});
}
```

```txt:
{"description":"このスキーマ定義では、Qiita API v2 のインターフェースをJSON Hyper Schema draft v4形式で表現しています。","properties":{"access_token":{"description":"Qiita API v2で認証・認可を行うためのアクセストークンを表します。","links":[{"description":"与えられた認証情報をもとに新しいアクセストークンを発行します。","href":"/api/v2/access_tokens","method":"POST","rel":"create","schema":{"properties":{"client_id":{"description":"登録されたAPIクライアントを特定するための…
```

というようなJSON文字列から以下の文字列が取得できた。

```
このスキーマ定義では、Qiita API v2 のインターフェースをJSON Hyper Schema draft v4形式で表現しています。
```
elasticsearch2.2.1 on Centos6.6 by vagrant

所要あって、railsでelasticsearch使おうとしたものの、
公式どおりのインストールでつまづいたので、例のごとくきろく。


キホンは[公式](https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html)の説明の通り。

のはずだったが・・・・


JDKいれて、elasticsearch起動しても下記のエラーが発生・・・
長いので省略してます・・

```
user@hostname ~/elasticsearch $ elasticsearch
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /home/kieaiaarh/elasticsearch/logs/elasticsearch.log (許可がありません)
        at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:270)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
        at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)

org.elasticsearch.bootstrap.Bootstrap.setupSecurity(Bootstrap.java:196)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:167)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:285)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
:
Refer to the log for complete error details.
```

許可がないといわれたので、
```
$ sudo elasticseach
```


で実行するも・・・NG。

```
Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root.
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:93)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:144)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:285)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
Refer to the log for complete error details.
```

プロセス自体はelasticserch user で[開始される](https://github.com/elastic/elasticsearch/issues/14458)とのこと・・・


なので、そもそも、ダウンロードしたディレクトリごと所有者＆グループを変更。
で動くようになった。もともと、下記においていたので、
root権限なっていた・・・（汗

```
$ ll /usr/local/src/elastcsearch-2.2.1
$ mv /usr/local/src/elastcsearch-2.2.1 /home/user/elasticsearch
$ sudo chown user:wheel /home/user/elasticsearch
```

とりあえず、wheelグループへ変更して解決。


### 追記
起動等は[こちら](https://github.com/elastic/elasticsearch/issues/14533)を参考に下記の通り。

```
$ sudo service elasticsearch (re)start/stop
```


### 参考
http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html
QiitaAPI > jsFiddle + AngularJS > 最新の記事を取得

```txt:動作環境
jsFiddle + AngularJS
```

関連 [jsFiddle > AngularJSを使う > リンクからFork](http://qiita.com/7of9/items/9d695647f6b17739ccd4)

関連　http://qiita.com/api/v2/docs
参考  http://qiita.com/tag1216/items/5e5ee1738e236fafe78b

## 振る舞い

Qiitaのページで最新の１記事を取得する。

@ Qiita api docs
> 認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。

## code v0.1

http://jsfiddle.net/zmkjLfz3/3/

```html
<div ng-controller="MyCtrl">
  Hello, {{name}}!
</div>
```

```js
var myApp = angular.module('myApp',[]);

function MyCtrl($scope, $http) {
	  $http.get('https://qiita.com/api/v2/items?page=1&per_page=1').success(function(data, status, headers, config) {
    $scope.name = data;
    });
}
```

```txt:結果
Hello, [{"rendered_body":"<p>http.getを使う例へのリンク</p>\n\n<p><a href=\"http://jsfiddle.net/jsengel/t3kcwc7y/\" class=\"autolink\">http://jsfiddle.net/jsengel/t3kcwc7y/</a></p>\n\n<p>学習事項</p>\n\n<ul>\n<li>$scope.</li>\n<li>$http.get()</li>\n<li>.then()</li>\n<li>.success()</li>\n<li>.error()</li>\n</ul>\n\n<p>内容を理解せずに data を代入しないこと。（大量データに対して）ブラウザが固まる現象に遭遇したので。</p>\n","body":"http.getを使う例へのリンク\n\nhttp://jsfiddle.net/jsengel/t3kcwc7y/\n\n\n学習事項\n\n- $scope.\n- $http.get()\n- .then()\n- .success()\n- .error()\n\n内容を理解せずに data を代入しないこと。（大量データに対して）ブラウザが固まる現象に遭遇したので。\n\n\n","coediting":false,"created_at":"2016-03-21T07:39:21+09:00","id":"a6b340097e34b6ea9d2f","private":false,"tags":[{"name":"link","versions":[]},{"name":"AngularJS","versions":[]},{"name":"jsFiddle","versions":[]}],"title":"jsFiddle / AngularJS > Link > http example","updated_at":"2016-03-21T07:39:21+09:00","url":"http://qiita.com/7of9/items/a6b340097e34b6ea9d2f","user":{"description":"セブンオブナインです。\r\nUnimatrix 01の第三付属物 9の7という識別番号です。Star trek Voyagerの好きなキャラクターです。\r\n\r\nまとめ記事は後日タイトルから内容がわからなくなるため、title検索で見つかるよう個々の記事にしてます。\r\n\r\nいわゆるBorg集合体の有名なセリフから「お前たち（の知識）を吸収する。抵抗は無意味だ」。Thanks in advance.","facebook_id":"","followees_count":30,"followers_count":55,"github_log
```
jsFiddle / AngularJS > Link > http example

http.getを使う例へのリンク

http://jsfiddle.net/jsengel/t3kcwc7y/


学習事項

- $scope.
- $http.get()
- .then()
- .success()
- .error()

内容を理解せずに data を代入しないこと。（大量データに対して）ブラウザが固まる現象に遭遇したので。
jsFiddle > AngularJSを使う > リンクからFork

Qiita APIをさくっと試そうとした時にどういう環境がいいか？

昨夜眠い目をこすりながら見つけたのがjsFiddle + AngularJSという組合せだった。

jsFiddleでAngularJSを使うには以下のリンクからForkすればいいとのこと。

http://jsfiddle.net/IgorMinar/ADukg/


参考 https://pkozlowskios.wordpress.com/2012/08/12/using-jsfiddle-with-angularjs/
ESP8266 > TOUT(AD)のsampling rate > 2.5kHz上限?

http://qiita.com/exabugs/items/fa012510f5eaef8e880a
を読んでESP8266でAD取込みはどれくらいの速度まで可能か気になった。

以下を見つけた。

http://www.esp8266.com/viewtopic.php?f=13&t=7033
> Problem is I need to sample at 8KHz and the analogRead() function won't go above 2.5KHz. - See more at: http://www.esp8266.com/viewtopic.php?f=13&t=7033#sthash.wmnPO5O7.dpuf

TOUT(内蔵の10bit ADC)を使う限りでは2.5kHzくらいまでのようだ。iOSでのADC 44.1kHzには及ばない。

外付けADCをつければどれくらいまで可能かは未調査。
技術英語 > opt out > and people can't just opt out of paying it.



http://loe.org/shows/shows.html?programID=03-P13-00008

> Electric's David Ruben explains that the energy crisis in 2001 left the state with a large bill, and people can't just opt out of paying it.

http://ejje.weblio.jp/content/opt-out
http://eow.alc.co.jp/search?q=opt+out

支払を免除できない、という意味だろうか。未消化。

「手を引く」方のopt outは時々何かの資料で見るような気がする。
debian9にdocker最新版をインストール

* [Installation on Debian](https://docs.docker.com/engine/installation/linux/debian/#debian-wheezy-stable-7-x-64-bit)

```
apt-get install apt-transport-https ca-certificates
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
```

```diff:/etc/apt/sources.list
+ deb https://apt.dockerproject.org/repo debian-stretch main
```

```bash:インストール
apt-get update
apt-get install docker-engine
```
Hikiをお引越し


備忘録がてらやったことをまとめます。
環境依存の話だと思うので、参考になりますやら。

# 参考

http://blog.panicblanket.com/archives/980

# やったこと
RaspbianにHikiを導入し、既存環境から、データをお引越し。

# apt

念のためruby2.0を入れる

```shell
sudo apt-get install ruby2.0
```

# hiki.cgi

hiki/confがないと言われるのでhiki.cgiのshebangを変更

```ruby
#!/usr/bin/ruby2.0 -I ./lib/
```

Pathnameクラスが見つからないと言われるので下記の行を追加。

```ruby
require 'pathname'
```

# gem

こんな感じでないと言われたファイルを順番にインストール
> Hiki Error
> 
> cannot load such file -- sequel (LoadError)

```shell
sudo gem2.0 install docdiff
sudo gem2.0 install sequel
sudo gem2.0 install hikidoc
sudo gem2.0 install rdtool
```

# データの移行

* hikiconf.rbをhiki/以下に移動
* hikiのdataディレクトリをhikiconf.rb内の@data_pathエントリの位置に移動。

# パーミッションの設定
* @data_path内のファイル、ディレクトリにCGIからアクセス可能なパーミッションを設定。

# 管理者パスワード、テーマをリセット
パスワードを忘れた、および、以前設定していたテーマを持っていないので...

* @data_path/hiki.conf内の、password設定業、thema設定業をリセットする。
	* http://pen.agbi.tsukuba.ac.jp/~torarimon/?hiki* hikiのインストールガイドに従い、再度パスワードを設定し直す。
	* http://hikiwiki.org/ja/install.html

---

大体こんな感じでできました。
コールバック関数とは

# ■ コールバック関数とは

他の関数に引数として渡す関数のこと。

下記サイトのC言語の例が分かりやすい。
関数ポインタにコールバック関数を代入し、引数として渡している。

http://shiroibanana.blogspot.jp/2012/09/callback.html

```c
#include<stdio.h>
typedef void (* FUNC_POINTER)(char *); 

// コーバック関数1
void callback1(char *s){
    printf("%s\n",s);
}

// コールバック関数2
void callback2(char *s){
    printf("[");
    printf("%s",s);
    printf("].\n");
}

// コールバック関数を呼び出す関数
void func(char *s,FUNC_POINTER p){
    // コールバック関数を呼び出す
    p(s);
}

int main(){
    FUNC_POINTER p;

    p = callback1;
    // コールバック関数1を呼び出す
    func("コーバック関数1",p);

    p = callback2;
    // コールバック関数2を呼び出す
    func("コーバック関数2",p);
    return 0;
}
```
実行結果。

```
コーバック関数1
[コーバック関数2].
```

# ■ Pythonの例

pythonでのコールバック関数の使用例。
コールバック関数を呼び出す関数はhandlerと記述されることが多いらしい↓

```py
def handler(func,*args):
    return func(*args)
```

http://www.phactory.jp/cms/blog/post/admin/2010/02/python_funcpointer/

流れとしては、

1. ハンドラーを定義
2. コールバック関数を定義
3. 関数ポインタにコールバック関数を代入
4. 関数ポインタをハンドラーの引数として渡す

```py
# -*- coding: utf-8 -*-
def handler(func,*args):
    return func(*args)

def callback1(message1):
    print("%s" % message1)

def callback2(message1, message2):
    print("%s, %s" % ( message1, message2) )

# main
if __name__ == "__main__":

   # コールバック関数の代入
   call = callback1
   # ハンドラーの実行 : コールバック関数の呼び出し
   handler(call, "message1")

   # コールバック関数の代入
   call = callback2
   # ハンドラーの実行 : コールバック関数の呼び出し
   handler(call, "message1", "message2")
```

実行結果。

```
message1
message1, message2
```

# ■ クラスを使う

関数ポインタの役割をする変数をクラス内のメンバ"func"に持たせているが、基本的にやってることは同じ。

1. ハンドラーとして機能するクラスを定義
1. 関数ポインタとして扱うメンバを定義
2. ハンドラーとして機能するメソッドを定義
2. コールバック関数を定義
3. 関数ポインタにコールバック関数を代入
4. 関数ポインタをハンドラーの引数として渡す

```py
# -*- coding: utf-8 -*-
class Callbacker():
    def __init__(self, func):
        self.func = func

    def handler(self, *args):
        self.func(*args)

def callback1(message1):
    print '%s' % message1

def callback2(message1, message2):
    print("%s, %s" % ( message1, message2) )

# main
if __name__ == "__main__":

    # コールバック関数の代入
    callback = Callbacker(callback1)
    print (type(callback.func))
    print ("callback.func "),
    print (callback.func)
    print ("callback1     "),
    print (callback1)
    # ハンドラーの実行 : コールバック関数の呼び出し
    callback.handler("message1")
    print ("")

    # コールバック関数の代入
    callback.func = callback2
    print (type(callback.func))
    print ("callback.func "),
    print (callback.func)
    print ("callback2     "),
    print (callback2)
    # ハンドラーの実行 : コールバック関数の呼び出し
    callback.handler("message1", "message2")
```

実行結果

```py
<type 'function'>
callback.func  <function callback1 at 0x7fcff9c8a9b0>
callback1      <function callback1 at 0x7fcff9c8a9b0>
message1

<type 'function'>
callback.func  <function callback2 at 0x7fcff9c8ab18>
callback2      <function callback2 at 0x7fcff9c8ab18>
message1, message2
```

# ■ まとめ

コールバック関数とは他の関数に引数として渡す関数のこと。

基本は、
1. ハンドラーを定義
2. コールバック関数を定義
3. 関数ポインタにコールバック関数を代入
4. 関数ポインタをハンドラーの引数として渡す
minecraftサーバー構築

↓こちらを参考にdockerで立ててみました

ConoHaを使ってCentOS 7.2でMinecraftサーバーを立てる - Qiita
http://qiita.com/syarihu/items/9d9522bb86c301ef57cb

# まずポート開放

```bash
# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 25565 -j ACCEPT
# systemctl restart iptables

// 必要かも
# systemctl restart docker
```

# dockerで立てる

```bash
$ docker run --privileged=true -d --name minecraft -p 25565:25565 -v `pwd`/mincraft:/data -v /etc/localtime:/etc/localtime:ro -i -t centos:centos7 /sbin/init
$ docker exec -i -t minecraft /bin/bash

# yum install wget
# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"
# rpm -ivh jdk-8u73-linux-x64.rpm
# java
See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.
# useradd minecraft
# mkdir /data/minecraft
# chown minecraft:minecraft /data/minecraft/
# su - minecraft
$ cd /data/minecraft
$ wget -O minecraft "http://minecraft.gamepedia.com/Tutorials/Server_startup_script/Script?action=raw"
$ vi minecraft
 #MCPATH='/home/minecraft/minecraft'
 MCPATH='/data/minecraft'
$ chmod +x minecraft
$ exit
# ln -s /data/minecraft/minecraft /etc/init.d/minecraft

# su - minecraft
$ wget https://s3.amazonaws.com/Minecraft.Download/versions/1.9/minecraft_server.1.9.jar
$ mv minecraft_server.1.9.jar minecraft_server.jar
$ java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
$ vi eula.txt
eula=true
$ java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
[12:02:51] [Server thread/INFO]: Preparing spawn area: 96%
[12:02:51] [Server thread/INFO]: Done (21.308s)! For help, type "help" or "?"
//Ctrl+c
$ exit

# chkconfig minecraft on
[root@da21d74be2d5 data]# /etc/init.d/minecraft start
Starting minecraft_server.jar...
-bash: screen: command not found
# yum install screen
# /etc/init.d/minecraft start
```

# バージョンアップ

outdated server i'm still on 1.9などと出たら

minecraftのバックアップとアップデート - Qiita
http://qiita.com/ymko/items/044435c26b80b09c0758

~~minecraft_serverバージョンアップ方法（Linux版マルチサーバ） | server- memo.net~~
~~http://www.server-memo.net/minecraft/mc-op/update.html~~

Minecraft
https://minecraft.net/download

# ハマったところ

* screenコマンドが必要
* 認証エラー

```bash
[15:16:07] [User Authenticator #1/INFO]: Disconnecting com.mojang.authlib.GameProfile@782b6074[id=<null>,name=xxxxxxx,properties={},legacy=false] (/xxxxxxxxxx:xxxx): Authentication servers are down. Please try again later, sorry!
[15:16:07] [User Authenticator #1/ERROR]: Couldn't verify username because servers are unavailable
```

この認証エラーはポート開放されてもdockerが認識していないとダメな場合。``systemctl docker restart``で解消された。

# 参考

Dockerでホストと同じタイムゾーンをコンテナ起動時に設定する - Qiita
http://qiita.com/ganta/items/a0f34866c994ebaeef69
VMWare FusionでWindows 10を動かす時に外部ディスプレイに映した時に解像度がおかしいのを解消する

Windows 10をVMWare Fusionで使用し、Macbook(Air|Pro)?のディスプレイではなく外部ディスプレイに映した時に解像度がおかしいのを修正する。

## っていうよりドライバーが入ってないだけ

[VMware ESX/ESXiの仮想マシンではWindows Server 2008 R2のVMware SVGA 3Dグラフィックドライバがインストールされない](http://norimaki2000.blog48.fc2.com/blog-entry-1235.html)って記事に書いてある通り、適切なドライバーが入らないらしく、適切なドライバーを入れてあげたら正常に表示されます(手順も上記サイトに書いてあるとおりです)。

デバイスマネージャーの「グラフィックアダプター」の項目を選択してドライバーの更新をして、
C:\Program Files\Common Files\VMware\Drivers\video_wddm にあるvm3d.infをインストールすればOKです。
Live2D　mtnファイルを反転させるツール

#背景
対になったキャラクターを左右に配置し、Live2Dで同期モーションさせるときに動きを左右反転させる必要が出てくる。
出力したキャラクターの画像自体を反転させるのも手だが、反転してはマズイデザインのキャラクターがいて
モーション自体の反転で対応したいことがあるが、Live2DのAnimatorにはその機能がない。
<img width="385" alt="opyukari - コピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/117475/5dddd5eb-8f75-9541-e849-baa06e965395.png">
※結月ゆかりは左側に髪飾りを持っている

ハカセトゥーンでアニメーションを担当したときに魔理沙側がこのような左右に差をもつ構造で
モーション自体を反転させるのが最適案と判断し、モーションデータであるｍｔｎファイルの中身を
意味合い的に反転させる支援ツールを作成して対応した。

#前提とする対象モデルの定義
正面図であることが望ましい。（理由は反転させたときに破綻しにくいから）
体の芯をコントロールするパラメーターは概ね問題無いだろうが
左右対になるパラメーターは可動範囲が一致していることが必要になる。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/5d8ad436-d19a-65ad-7e30-9271f5e56b5b.png)
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/ab61a527-1848-0711-7a40-bec8eee46089.png)
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/0ef09965-94bf-10db-5e08-64f317fea390.png)
※腕パラメは－９０～９０の範囲で左右同じ動きをする

なお、＋－は反転しても良く
０～１で反転してても対応してる

#ソフト
ダウンロードはこちらから
https://t.co/hub8BnIVTL
※使用は自己責任で　.NET4.5がたぶん必要

#使い方
まずは変換設定を作ります
GUIからも作れるようにしていますがcsvファイルを設定として読み書き出来るので
テキストエディタでチャチャッと作った方が早いです
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/7cdbb19d-68f6-07f4-6dfc-a287da9b4802.png)
※変換設定を押して
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/0c47e976-991c-a47e-bb2d-63fecd2d2da4.png)
※設定ダイアログを呼び出す　設定ロードでcsvファイルを読み込む

設定を読み込んだらForm1ダイアログのファイル読み込みを押してmtnファイルを読み込み
右下の変換を押す
そうしてからファイル保存で変換されたｍｔｎファイルを保存してLive2DAnimatorで読み込む

##csv仕様
>変換前ID,変換後ID,変換倍率（1 or -1）,基準値

変換前IDに該当したデータはすべて下記の数式によって変換される
計算式は
>新規値　＝　基準値　＋　旧値　＊　変換倍率

である

##変換設定の作り方
変換する必要のあるパラメーターは
- 中央にあるX軸方向へ変化のあるパラメーター
- 左右対になるパラメーター
すべてである

中央パラメーターは　変換後IDに変換前IDと同じモノを入れて変換倍率を-1にして対応
左右対パラメーターは　右パラメ,左パラメ,1,0 と　左パラメ,右パラメ,1,0　を対で作って対応する

もし０～１で変化するパラメーターが反転している場合は
targetID,combertID,-1,1
で最大値を4つめに指定し反転した数値を足す形にしてやれば意味合い的に反転してくれるはずである

#注意点として
mtnファイルとして出力した時点でキーを打った場所以外もキーを打ったようになるので
mtnを経由した時点で相当にデータの加工性は悪くなると考えた方が良い
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/11b5cbdd-6efa-2980-962b-d35d07307c4f.png)
※左右反転したモノを読み込んだデータ　びっしりとキーが打たれてしまう

#別の使い方
動作原理としては指定されたパラメータデータのIDと数値を変換するだけなので
別のプロジェクトでパラメーターIDは違うのに意味合いがいっしょでモーションをなんとかして流用したい時や
一部のモーションのデータをずらしたり小さくしたりなどの変換にも使えるかもしれない
JavaScriptでobj["chino[0].cocoa.rize[2]"]みたいにしたメモ

## 元ネタ

http://blog.asial.co.jp/1178

## やりたいこと

JsonObjectに```obj["chino[0].cocoa.rize[2]"]```的なアプローチしたい。
値の取得だけでなく更新もしたい。
配列も使えるようにしたい
evalは嫌だ。

## 書いた

```js

function access(obj, path){
	path = path || '';
	obj  = obj || {};

	var keys = path.split('.');
	var value = obj;
	for (var i = 0; i < keys.length; i ++) {
		// List
		if(keys[i].match(/^.+\[\d+\]$/)){
			name = keys[i].split("[")[0];
			pos = keys[i].match(/.+\[(\d+)\]/)[1];
			value = value[name][pos];
		// Dict
		} else {
			value = value[keys[i]];
		}
	}
	return value;
}

function transform(obj, path, val){
	path = path || '';
	obj  = obj || {};

	var keys = path.split('.');
	var value = obj;

	path = [];
	for (var i = 0; i < keys.length; i ++) {

		// List
		if(keys[i].match(/^.+\[\d+\]$/)){
			name = keys[i].split("[")[0];
			pos  = keys[i].match(/.+\[(\d+)\]/)[1];
			path.push(name);
			path.push(pos);
			if( i !== keys.length - 1){
				value = value[name][pos];
			}
		// Dict
		} else {
			path.push(keys[i]);
			if( i !== keys.length - 1){
				value = value[keys[i]];
			}
		}
	}

	for(var i = 0; i < path.length-1; i++){
		obj = obj[path[i]];
	}
	obj[path[path.length-1]] = val;
}
```

## サンプル
以下のようなデータを用意した。

```js
obj = {  
 "chino":
    ["kawaii","cappuccino"],
 "cocoa" :
    {
       "character": "angel"
    },
  "rize":
    {
       "hair":
          ["angel wings", "violet"]
    }
}
```


#### (1) Accessによる値の取得
```js
access(obj,"chino[0]");
```
で```kawaii```がとれる。

```js
access(obj,"rize.hair[1]");
```
で```violet```がとれる。

#### (2) Transformによる値の更新
```js
transform(obj,"chino[0]","cute");
```
とすると以下のようにchino[0]の値がcuteになる。

```json
{
   "chino": [
      "cute",
      "cappuccino"
   ],
   "cocoa": {
      "character": "angel"
   },
   "rize": {
      "hair": [
         "angel wings",
         "violet"
      ]
   }
}
```


もう一例。

```js
transform(obj,"rize.hair[1]","black");
```
とすると

```json
{
   "chino": [
      "cute",
      "cappuccino"
   ],
   "cocoa": {
      "character": "angel"
   },
   "rize": {
      "hair": [
         "angel wings",
         "black"
      ]
   }
}
```
rizeのhairがblackになる。

## 辛かったこと

http://qiita.com/migi/items/3417c2de685c368faab1
にもあるが
途中は参照渡しで最後が値渡しとなるため変換されず意味不明だった。

## ライセンス
使う人がいるかは不明だが一応MITライセンス。
さくらインターネットの障害でデータが消えた話

伝えたいこと『さくらインターネットのVPSはさくらが原因でデータを消すような状況になっても利用者が期待している程の対応してくれない』
（VPS以外は知らない）

ということで言いたいこと
**『自分が誤った操作をしなくても、いつでもデータを失うリスクが有る。重要なデータをサーバーに置くならバックアップは毎日でも毎時でも足りない。バックアップするシステムの導入が必要。絶対的な安心はない。技術を持っていそうで信用していてもあっさりと事故は起こる』**

例えば、さくらインターネットのVPSを借りるなら、いつOSを再インストールしなければならない状況になってもいいように注意して利用しなければならない。
他社は知らない。

バックアップはお客様でお願いしますと規約に書いてあった気はしていました。（未確認）
ですが、実際にさくらインターネット側のミスでOSごと起動しなくなっても、さくらインターネットはその修復さえも対応してくれないので本当に注意が必要である。
（もちろん私も数日おきにバックアップをしていましたが、毎日は無理でした。ちょうどさくらの持っていたバックアップと同じ日のバックアップを自分で持っていましたが、データを失ってしまうことになりました。）

---

さくらVPSを利用していましたが、OSがブートしなくなるという状況に陥ってしまいました。
事の発端は
http://support.sakura.ad.jp/mainte/mainteentry.php?id=18381
この障害発生。

この告知によると、１６時に障害対応完了ということだが、最後の追記にあるように一部VPSではなんと、OSがブートさえしなくなるという新たな障害を発生させた。
これははっきり言ってさくらインターネット側の完全なるミスではないのか？
私もその一部に入ってしまった。

さくらインターネットはこの１３時に発生した障害発生の解決のためにハードウェアを入れ替えたようだが、その後、私のVPSはOSをブートすらしなくなってしまったのだ。

さくらインターネットに問い合わせた回答は
>お客様自身で持っているOSフルバックアップディスクで復元するか、持っていないなら管理画面からOSの再インストールをして下さい。
もし持っていないなら、２日前に私達がとっておいたバックアップディスクで復元することも可能です。

この回答を見て分かるように、さくらインターネットのVPSを利用するときは
いつ、データが全て消えてもいいようにとにかく毎日何回もバックアップを取るような気持ちで利用しなければならない。

ぜんぜん対応してくれる空気ではなかった。

今回は、障害が発生し、おそらくその障害の復旧に失敗して一部のVPSがOSのブートさえしなくなってしまったと思われる。
明らかにすべてさくらインターネット側のミスだが、さくらインターネットはこのようにあっさり軽い回答しかしないと感じた。
彼らにとってはサーバーのデータなどそんな軽いものだとしか思っていないのかはわからない。

私は『本当にどうにもならないのですか？』と問い合わせた。
私からすれば、さくら側でなんとかなりそうなのだが、

暗号化されているのかな？
だって、OSのがブートしないだけでデータは１００％の状態で生きてるんですよ？

セーフモードもさくら側で入れないようになっているのかな？

いずれにしても、ブートさえしないので私はさくらインターネットに頼ることしかできなかったが、さくらインターネットも無理なのかわからないが、対応してくれないようだ。
私のせいなら対応しなくても当たり前。
だが、今回はさくらインターネットの責任。
もしも対応できるならそこまでして欲しかった。

対応できないならその理由をキチンと教えて欲しかった。
なので、自分の中で全然納得ができない。
ただ単に、いきなりデータが消えたのだから。

---

また、さくらインターネットは本当に対応が悪いと感じた。
東証一部に上場している企業とは思えない。

印象として実際に頭のなかで思ったのは「面倒くさいお問い合わせはスルーしていい」とでも教わっているのかと私は思った。

なぜなら、私が電話でサーバーが起動しないと伝え、さくらインターネット側は係の人に伝えてまた電話する当流れで私は電話を切った。
しかし、何時間待っても電話は一切来ない。

その後、メールで問い合わせてやり取りした。
とりあえず、電話の件は「忘れ去られた」ことになっていたかのように感じた。

どうしようもない。さくらの持っているバックアップ書き出し以外では何も対応してくれない。修復もしてくれないようなので、私はさくらインターネット側が持っているバックアップによる復元を依頼した。
しかし、これまた、全然返答のメールが来ない。
「了解しました。作業を開始します。」というメールがあるのが普通では？
その間にもメールを何度か送ったが、スルーされ、最後に「完了しました」のメールが来た。

そして、もう１回だけ、きちんと今回の障害の原因を知りたかったので１回だけメールを送ったが、今は、完全に無視されています。あるいは、対応に何日もかかるのか、
もうどうでもいい。

なぜきちんと原因が知りたいって？
それは、今回のようなデータが消えるようなことはしょっちゅうあるのか、
本当にさくらインターネットではセーフモードで再起動さえもできない状況だったのか、
さくらインターネットのミスなのか、いろいろはっきりさせて、今後のバックアップ頻度とサーバー乗り換えを考えたかったからだ。

---

さらに、障害が発生したのは今回が初めてではない。
この１年間に２，３回目だったきがする。
これは多くないかい？
（毎回割引も一切無しです。今回も何時間もサービスが止まっていたのに）

私の責任でOSが起動しなくなったなら一切のサポートがないのももちろん当たり前。
だが、今回はさくらインターネット側のせいでOSがブートしなくなり、結果、データが消えてしまった。

さっきも言ったけど、無理なら無理できちんと解答して欲しかった。


【追記】
返答来ました。
SSDの故障を検知できず、壊れたSSDに読み書きしていたためファイルシステムが破損して、OSを含むデータがぐちゃぐちゃになったみたいです。

なので、修復もできず、
緊急メンテナンス前にバックアップもとれずの状態となったみたいです。

（SSDの変更したと思うので、バックアップと言うよりデータのフル移動を行ったと思いますが、その時点で読み込むデータは、もう既にぐちゃぐちゃなデータしかなかったということだと思います。）
TwitterのOAuth認証後のCallBackで「sorry, that page doesn't exist」と表示されるケース


無駄に時間を使ってしまったので一応メモ
<h1>Callback URLの設定確認</h1>
使用しているアプリの設定でCallback URLにアンダーバーを使用出来ない。
アンダーバーを削除して更新したら問題なくアプリに戻れた
Vagrant で良く使うコマンド

Vagrant で良く使うコマンドについて記載



バージョン確認

```
$ vagrant -v
```

ヘルプ

```
$ vagrant -h
```

boxの一覧を表示

```
$ vagrant box list
```

boxを追加

```
 $ vagrant box add NAME URL
```

boxを削除

```
 $ vagrant box remove boxName
```

Vagrantfileの作成

```
$ vagrant init boxName
```


VagrantfileをGUIモードに設定
(Vagrantfile内の以下の記述をコメントアウト)

```
    config.vm.provider :virtualbox do |vb|
        vb.gui = true
    end
```

仮想マシンの起動

```
$ vagrant up
```

仮想マシンの一時停止

```
$ vagrant suspend
```

仮想マシンの状態確認

```
vagrant status
```

仮想マシンの再起動

```
$ vagrant resume
```

仮想マシンの削除

```
vagrant destory
```

sshでログイン

```
$ vagrant ssh
```


以上
ffmpegとImageMagickでクロマキーmovをgifアニメーションにする

movを綺麗にgifに変換するには、まずパレットを生成する必要がある。

```
ffmpeg -i hoge.mov -vf palettegen palette.png
```

つぎにこのpaletteを用いて、movからgifファイルを生成する。

```
ffmpeg -i hoge.mov -i palette.png -filter_complex paletteuse out.gif
```

最後にこのgifファイルにクロマキー処理をする。
色はblueのようなプリセット、または'rgb(0,0,200)'のように指定する。

今回はクロマキーなので、ある程度幅のある値をとって欲しい。
whiteを95%の範囲で透明にする（gifなので階調指定はできないが)するには、次のようにする。

```
convert -white-threshold 95% -transparent white out.gif trans.gif
```

# と思うじゃろ？
しかし、これではgifアニメーションにおかしな軌跡が写り込んでしまう。
これは、ffmpegが変換する際に圧縮を行うので、各フレームごとに前フレームからのdiffを取っているため。
背景が真っ白だったら、画像のない部分を常に白で上書きすれば問題ないが、透明になった場合は写り込んでしまうのでダメ。
Imagemagickのtransparentオプションは白部分を透明にするだけなので、
結果、前フレームのゴミが次のフレームに写り込んでしまう。

# どうすればいいか 
透明なので、毎回前フレームの情報を消去して書きなおせば良い。
つまり、各フレームは必然的に画像情報を全て持っていることになるので、ファイルサイズは大きくなってしまうが仕方ない。

ffmpegの出力結果out.gifを、一度imagemagickで次のように処理する。

```
convert -coalesce -loop 0 out.gif out_coalesce.gif
```

-coalesceオプションを付けると、各フレームが全画素情報を持つようになる。
（ここで-dispose previousオプション（後述）を付けてはいけない。）
次に、これを次のように変換する。

```
convert -white-threshold 95% -transparent white -coalesce -dispose previous -loop 0 out_coalesce.gif trans_coalesce.gif
```

透明化のオプションは先ほどと同じ。
-dispose previousオプションを付けると、前画像の情報を全て破棄し、次フレームの情報のみを再描画する。
ここでも-coalesceを付けるのを忘れずに。

# 参考
http://fftest33.blog.fc2.com/blog-entry-69.html
http://www.imagemagick.org/script/color.php
http://stackoverflow.com/questions/27099682/imagmgick-multiple-color-and-transparent-image-with-anti-aliasing
http://www.imagemagick.org/Usage/anim_basics/
JSQMessagesViewController

# JSQMessagesCollectionViewのTop位置調整

```
self.topContentAdditionalInset = {Top位置};
```

# JSQMessagesCollectionViewCellの初期スクロール位置調整

```
self.automaticallyScrollsToMostRecentMessage = NO;
[self.collectionView reloadData];
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:{行番号} inSection:0] 
                            atScrollPosition:UICollectionViewScrollPositionCenteredVertically
                                    animated:NO];
```

# 吹き出しのテキストカラーが一部黒字になってしまう場合の対処法

```
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[super collectionView:collectionView
                                                                          cellForItemAtIndexPath:indexPath];
    cell.textView.textColor = [UIColor whiteColor];
    return cell;
}
```

# 吹き出し画像の非同期取得

```
JSQPhotoMediaItem *item = [JSQPhotoMediaItem new];
message = [[JSQMessage alloc] initWithSenderId:{SenderID}
                             senderDisplayName:{SenderName}
                                          date:{Date}
                                         media:item];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSURL *url = [NSURL URLWithString:@"{画像URL}"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    item.image = [[UIImage alloc] initWithData:data cache:NO];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.collectionView reloadData];
    });
});

[_messages addMessage:message];
```

# 吹き出しの上部に送受信時刻を表示

```
// CellTopLabelの表示位置
- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView
                   layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout
                   heightForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
    // default:20.0f
    return kJSQMessagesCollectionViewCellLabelHeightDefault;
}

// CellTopLabelの表示
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView
                   attributedTextForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
    return [[JSQMessagesTimestampFormatter sharedFormatter] attributedTimestampForDate:{送受信時刻}];
}
```
[Rails] 同じmodelを参照する外部キーを一つのmodelでもつ方法

「同じmodelを参照する外部キーをもつ」とは、例えば「ユーザ間取引」とか。その場合、売り手と買い手の２つのユーザを参照しなければならない。railsのデフォルトでは、外部キーを表す命名規則が`${model名}_id`と決まっているため、同じmodelを参照する外部キーがそのままでは設定できない。
この様な場合、`belongs_to`/`has_many`の`foreign_key`オプションを使って、それぞれ外部キー設定してあげればよい。
まず、下記のようなmodelとする。

|Transaction model|
|:--:|
|seller_id (User modelの外部キー)|
|buyer_id (User modelの外部キー)|

|User model|
|:--:|
|nameとか|
|emailとか|

この場合、modelの`belongs_to`/`has_many`で`foreign_key`を明示的に指定する。
これで、`transaction.seller`で売り手の情報が、`transaction.buyer`で買い手の情報が、そして`user.seller_transactions`/`user.buyer_transactions`で取引の情報が取得できる。

```ruby:models/transaction.rb
belongs_to :buyer, class_name: 'User', :foreign_key => 'buyer_id'
belongs_to :seller, class_name: 'User', :foreign_key => 'seller_id'
```

```ruby:models/user.rb
has_many :buyer_transactions, class_name: 'Transaction', :foreign_key => 'buyer_id'
has_many :seller_transactions, class_name: 'Transaction', :foreign_key => 'seller_id'
```

# 参考
[belongs_to](http://railsdoc.com/references/belongs_to)
[[Rails3] 複数の外部キーがある場合のアソシエーション](http://blog.bitmeister.jp/?p=2739)
さよならButterKnife. 僕はAPTの無いキミが好きだったよ

一身上の都合により、ButterKnifeを捨てることにしました。
かなり個人的な理由ですが、ButterKnifeを捨てる理由を挙げていきます。

# Androidアプリ開発でのButterKnifeの便利さ

ButterKnifeはいかに便利であるかは、Qiitaで"ButterKnife"と検索すればたくさん出てくると思う。Java標準機能である"Annotation"を駆使して、findViewByIdやsetOnHogeHogeListenerを駆逐してくれる、便利なライブラリだ。

この「findViewByIdやsetListenerの代わりにAnnotationを用いる」という基本的なところは大いに賛同するし、Android Annotationを始めとして幾つかの人気ライブラリはそういった便利さを提供してくれている。

# ButterKnifeに足りないもの

ButterKnifeはライブラリプロジェクトでは使えない。これが致命的となった。
Annotationの引数として、Resource id(R.id.**とか）を渡すようになっている。しかし、Androidプロジェクトの仕様としてライブラリプロジェクトでは"R.java"に記述された変数にfinal属性が付与されない。そのため、Annotationの引数として使えない（つまりライブラリプロジェクトでButterKnifeは使えない）という状態になっている。

ButterKnifeのissueでは早くから[その問題について議論されている](https://github.com/JakeWharton/butterknife/issues/45)が、現在のところ対応される予定はないようだ。


# Not for me.

ButterKnifeは8.x系列で、APTを導入すると発表されているし、既にsnapshotが公開されている。APTは便利だし、DataBindingその他のライブラリも積極的に利用しようとしていて「流行り」ではあると思う。APTは事前にソースコードが生成されるから速度面でも有利になる。

しかし、個人的にはAPTに頼るライブラリ数は少なくしておきたい。

## ビルド時間の長大化

開発者のマシンスペックは有限で、APTを無数に利用することは開発のイテレーションが遅くなることと直結する（ただでさえGradleはビルドが遅い）。少しでもビルド速度を向上するためには、万札で殴るか、APT導入数を少なくする等の工夫が必要だ。

また、ButterKnifeが活躍するシーンは基本的にオブジェクトがCreateされた瞬間だけであるため、2016年現在の端末ではRuntimeに処理されてもほぼ問題ないレベルであると考えられる。

我々はIS03やREGZA PHONEをそろそろ忘れるべきだ。

## APTはNDKプロジェクトとの共存ができない

AS 2.1現在のプラグイン構成では、Android NDK用プラグインとAPTは共存できなかった。つまり、Android NDKを積極的に使いたい場合はプロジェクト構成をかなり工夫しなければならない（「[どろいどたん](https://play.google.com/store/apps/details?id=jp.co.topgate.charactor.android_tan)」アプリ開発では複数のプラグインとプロジェクトを組み合わせて開発している）

## APTを導入してもライブラリプロジェクト問題は解決しない

APTはビルド時に問題解決が行われるため、そもそもAnnotation構成ではライブラリプロジェクトに導入することができない。

# ButterKnifeのようでButterKnifeではないライブラリを作った

いろいろ調べたうえでButterKnifeを導入したが、結局自分向けのライブラリではなかったようだ。

仕方ないので、ButterKniffe7.0.1系列な使い勝手のまま、ライブラリプロジェクトでも利用可能なライブラリを自分で作ることにした。

# MargarineKnife

 * githubで公開している
 * https://github.com/eaglesakura/margarineknife

名前の時点でもうパクリ臭がすごい。個人的にはMargarineよりもButter派だけど、Butterが無いならMargarineを塗ろう。

ButterKnifeからforkしようかとも考えたが、どうせ修正するならButterKnifeの（個人的に思っている）問題も解決したほうが良いということで、1から書きなおしている。

## このライブラリの特徴

 * 追加の依存ライブラリが無い
 * 規模が小さいのでソースコードを追いかけるのが簡単
 * ソースコード生成のような迂回路を利用しない
 * ライブラリプロジェクトでも使える（制限あり）
  * final変数が使えない制限はAnnotation固有のものなので、R.id.**の代わりにリソース名を文字列指定するようになっている。
 * ButterKnifeから簡単に移行できる

## ライブラリプロジェクトでも使える

リソース名を文字列で指定するオプションを追加実装しているので、ライブラリプロジェクトでも使うことができる。ただし、typoの問題が残るのでその点については諦める。

```java
// ButterKnife 7.0.1 ERROR!
@Bind("View_Id")
ViewGroup mViewGroup;
```

```java
// MargarineKnife OK!
@Bind(resName = "View_Id")
ViewGroup mViewGroup;


@Click(resName = "View_Id")
void  clickView(View view) {
  // do
}
```

# 最後に

実のところ、ButterKnife7.0.1でもProcessorで暗黙的にコードを生成するらしい。気づかなかった。
もっと良い（not APTな）ライブラリがあったら、そっちに移行したい。
PHPのトレイトをいまさら使う

主務（会社）が変わり、環境がPHP5.6へと変わったのでトレイトを利用してみる。

#トレイトとは

PHPマニュアルでは、トレイト（trait）を下記のように説明している。

```
トレイトは、PHP のような単一継承言語でコードを再利用するための仕組みのひとつです。 
```

まぁ、簡単に言えば、使い回すことができるクラスの部品のようなもの。

#実際に使ってみると

```php
<?php

trait Run
{
    public function run()
    {
        echo 'Brrrrr...' . PHP_EOL;
    }
}

class CarA
{
    use Run;
}

class CarB
{
    use Run;
}

$carA = new CarA();
$carA->run();

$carB = new CarB();
$carB->run();
```

"Brrrrr..."の出力部分をトレイトで共通化して、各クラスで読み込む。
この時点で既に無限の可能性を感じ始める。

```php
<?php

trait Run
{
    public function run()
    {
        echo 'Brrrrr...' . PHP_EOL;
    }
}

trait Sound
{
    public function sound()
    {
        echo 'honk!' . PHP_EOL;
    }
}

class CarA
{
    use Run, Sound;
}

class CarB
{
    use Run;
}

$carA = new CarA();
$carA->run();
$carA->sound();

$carB = new CarB();
$carB->run();
```

複数のtraitを利用する場合。
多重継承っぽい。

ただ、複数のtraitを読み込んだ場合に、同名メソッドや変数はどうなるか？といった問題がある。
もちろん、この回避方法も用意されている。

```php
<?php

trait Run
{
    public function run()
    {
        echo 'Brrrrr...' . PHP_EOL;
    }
}

trait RunFast
{
    public function run()
    {
        echo 'Wheeeee...' . PHP_EOL;
    }
}

class CarA
{
    use Run, RunFast {
        Run::run insteadof RunFast;
        // RunFast::run insteadof Run;
        RunFast::run as runFast;
    }
}

$carA = new CarA();
$carA->run();
$carA->runFast();
```

insteadofでどちらのメソッドを優先して利用するかが指定できる。
またasでエイリアスを張ることでもう一方のメソッドも利用できる。

こんな感じでマニュアルに書かれている通りでも十分に便利。
でも、おそらくデザインパターン中とかで利用したりすればもっと柔軟にいろいろ書けるような気がする。

```php
<?php

/**
 * 文字列表示トレイト
 */
trait DisplayTrait
{
    /**
     * 文字列を表示する
     *
     * @return void
     */
    public function display()
    {
        echo $this->_msg . PHP_EOL;
    }
}

/**
 * 文字列加工トレイト
 */
trait ProcessTrait
{
    /**
     * 文字列を加工する
     *
     * @return void
     */
    public function process()
    {
        $this->_msg = sprintf('===== %s =====', $this->_msg);

        return $this;   // ※もちろんselfは使えないよ
    }
}

/**
 * インターフェース
 */
interface Sample
{
    /**
     * 文字列を表示する
     *
     * @return void
     */
    public function display();
}

/**
 * HogeSample
 */
class HogeSample implements Sample //extends SampleBase
{
    use ProcessTrait, DisplayTrait; # (擬似的)多重継承が可能に

    /**
     * 表示メッセージ
     *
     * @var
     */
    protected $_msg = 'Hoge';
}

/**
 * PiyoSample
 */
class PiyoSample implements Sample //extends SampleBase
{
    use DisplayTrait;

    /**
     * 表示メッセージ
     *
     * @var
     */
    protected $_msg = 'Piyo';
}

/**
 * ファクトリ
 */
class SampleFactory
{
    /**
     * オブジェクト生成
     *
     * @param string $type タイプ
     * @return SampleInterface
     * @throws InvaliParameterException タイプの指定が正しくない場合
     */
    public static function create($type)
    {
        switch ($type) {
            case 'hoge':
                return new HogeSample();
            case 'piyo':
                return new PiyoSample();
            default:
                throw new InvalidParameterException();
        }
    }
}

// 実行結果: ===== Hoge =====
SampleFactory::create('hoge')->process()->display();
```

これまで抽象クラスを膨らませていたこと（抽象クラスの数を増やすこと）で耐えていたファクトリパターンもすっきり。
trait中のメソッドでインターフェースの実装を行う。

トレイト便利だなー。