OmniAICreator/Qiita-1.07M huggingface dataset:
MHAの挙動備忘録

# 環境
Masterサーバ
Slaveサーバ×2
MHAマネージャー用サーバ

# 挙動
*常時、Masterサーバへのコネクションチェック*
↓　
*(コネクションチェックの失敗)*
↓
*SSHコネクションチェック*
↓
**Phase 1:**
*MHA設定ファイル・Master/Slave設定ファイルのチェック*
↓
**Phase 2:**
*Masterのシャットダウン*
↓
**Phase 3.1:**
*最も最新のbinlogログを取得しているSlaveと、binaryログの取得が最も遅れているSlaveを特定*
↓
**Phase 3.2:**
*Master-MHAマネージャ間でSSHコネクションチェックが通っている場合、
Masterサーバから最新のSlaveで未取得のbinlogの差分ファイルを作成し、SCPでマネージャに送信。
また、SlaveサーバへのSSHのコネクションチェックも行う。
※SSHのコネクションチェックに失敗した場合は最新のSlave-Master間の差分はロストする*
↓
**Phase 3.3:**
*新しいMasterになるSlaveを指定していない場合は、もっとも新しいSlaveを新Master候補にする。*
↓
**Phase 3.4:**
*新Masterのrelaylogが全て適用されるのを待ち、Phase3.2で取得した旧Master-新Masterのbinlogの差分を適用させ、
新Masterのbinlogのポジションを示し、IPアドレスのフェイルオーバー処理があれば行う*
↓
**Phase 4.1:**
*最新Slave-Slave間で差分があれば差分ファイルの作成と適用を行う。*
↓
**Phase 4.2:**
*旧Master-最新Slaveで間で作成した差分ファイルを他のSlaveに適用し、
新Masterに対してレプリを貼り直す*
↓
**Phase 5:**
*新MasterのSlave時代の情報を消す*
↓
おわり

# 参考
https://www.cyberagent.co.jp/technology/pdf/2011_15.pdf

間違い等あればご指摘ください。
githubでよく使っているコマンド

#毎日たたく#


*現在のブランチを確認する*
`git branch`

*developをチェックアウトする*
`git checkout develop`

*更新ファイル確認*
`git status`

*差分確認*
`git diff`

*git管理に追加*
`git add`

*リモートのdevelopをpullする*
`git pull origin develop`

*リモートのdevelopへpushする*
`git push origin develop`

*リモートのdevelopへ-f pushする*
`git push -f origin develop`

*gitのログを見る*
`git log`

*gitのコミットログを見る*
`git reflog`

*コミットする*
`git commit -a`

*developでリベースする*
`git rebase develop`
`git rebase --continue`
`git rebase --abort`

*ソースはそのままでひとつ前のコミットを取り消す*
`git reset --soft HEAD^`


#たまにたたく

*ソースの変更を取り消してひとつ前のコミットを取り消す*
`git reset --hard HEAD^`

*特定のコミットのみを適用する
`git cherry-pick XXXXXXXX

*ファイルを管理対象から外す*
`.gitignoreに追記`
`git rm --cached [ファイル名]`
`git rm -r --cached [フォルダ名]`

#最初だけ

*初期設定*
`git ini`
`git remote add origin https://XXXXX@github.com/XXXXX/XXXXX.git`

*色を付ける*
`git config --global color.ui true`


#その他
１年経つまでは随時更新していきます。
VimでJSONファイルを100倍快適に作成する方法


タイトルは釣りです. 

JavaScriptを使った開発をしていると、とかくJSONによる設定ファイルが頻出しますよね.
NPMのpackage.jsonとか, Bower.json, .jshintrc, tsconfig.json等々です.

それぞれの設定ファイルについて, どのようなkeyが必要なのか, 値には何が書けるのか, 暗記していますか？
僕は覚えていません. 毎度毎度, ググったり, リファレンスページに行ったりしてました.

`npm init` や `bower init` で雛型は生成してくれるものの, 全てのkeyが載っている訳ではないですし...
(JSONにコメントが許されないのが辛いですね).

そこで[JSON Schema](http://json-schema.org/)です.
JSON Schemaを使えば, keyや値(と言ってもenum程度ですが)の補完情報を生成出来ます. 
誰かがそういうVim pluginを作って無いかなと思って探したのですが, 見つからなかったので自分で作りました.
**[Quramy/vison](https://github.com/Quramy/vison)** .

visonは[JSON Schema Store](http://schemastore.org/json/) に登録されているschemaファイルを利用します.
冒頭で列挙したpackage.json(NPM), bower.json/bowerrc(Bower), .jshintrc(JSHint), tsconfig.json(TypeScript)等、よく使うようなschemaはSchema Storeに登録されているため, visonをインストールするだけで利用可能になります.

### 2015.07.15追記
[JSON Schemaの本家公式サイト](http://json-schema.org/implementations.html)に、このpluginのリンクが記載されていました. 「公認」と言ってしまってよいのだろうか...?

# Install

Schema StoreからJSONをDLする都合上, gitコマンドがインストールされていることが前提です.

僕は[NeoBundle](https://github.com/Shougo/neobundle.vim)使いなので, NeoBundleでのインストール方法を書いておきます.
下記2行を書いて, `:NeoBundleInstall` を実行してください.

```vim:.vimrc
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Quramy/vison'
```

uniteは必須ではありませんが, visonはuniteのsourceにもなっているので, あると便利です.

visonのインストールが完了したら, Vimから `:VisonSetup` コマンドを実行してください.
Schema StoreのJSONをvisonのキャッシュフォルダにダウンロードします.
(`:VisonSetup` は次回以降のVim起動時は実行不要です)

# 使い方
## Schemaの適用
例えば, NPMのpackage.jsonを作成するとしましょう. 
Vimでpackage.jsonを開いたら, `:Vison package.json` のコマンドを実行してください.
このコマンドにより, 編集中のバッファに対して, visonが管理しているschemaファイル"package.json"が適用されます.
バッファにschemaが適用されると, 補完(omni-complete)が使えるようになります.
keyの入力中に `<Ctrl-x><Ctrl-o>` をタイプすると, 入力可能なkeyが補完されます.
![capt_comp.png](https://qiita-image-store.s3.amazonaws.com/0/8808/f0bc30f3-a4fc-a1e5-7a49-70a1e53d05db.png)

### 自動適用

.vimrcに下記のように記載することで, schemaを自動的に適用することができます.

```vim:.vimrc
autocmd BufRead,BufNewFile package.json Vison
autocmd BufRead,BufNewFile .bowerrc Vison bowerrc.json
```

`:Vison` コマンドはバッファのbasenameがschema名と一致している場合, 引数を省略できます. 上記のpackage.jsonに対するautocmdについては, 引数を省略しています.

### Unite

uniteを使ってschemaを適用することも可能です. `:Unite vison` を実行すると, visonにキャッシュされたschemaファイルの一覧が表示されます.
選択してEnterをタイプすることで, `:Vison`コマンドと同様に, カレントバッファに選択したschemaを適用できます.
![capt_unite.png](https://qiita-image-store.s3.amazonaws.com/0/8808/8bc1a06e-a0b0-a1bf-6052-3d5646bf4a4b.png)


## 独自schemaの登録
自分でschemaファイルを作ったり, Schema Storeに存在しないshcemaファイルをダウンロードしたりした場合に, visonに登録することができます.
登録したいschemaファイルをVimで開き, `:VisonRegisterSchema` コマンドを実行してください.

そのschemaファイルのbasenameをschema名として, visonに登録されます. schema名を明示的に指定したい場合は, `:VisonRegisterSchema スキーマ名` のように引数として指定してください.
一度登録したschemaは, Schema Storeからキャッシュしたファイルと同様に `:Vison`コマンドや `Unite vison`上から選択可能です.

なお, 現状, 自分で登録したschemaファイルを削除する仕組みがありません.
デフォルトでは, `:VisonRegisterSchema` で登録したファイルは `${HOME}/.cache/vison/default` フォルダにコピーされます.
削除する場合は, このディレクトリからファイルを削除してください.

# その他

* 実は補完の仕組みはまだ完璧でなかったりします. `anyOf` のような複雑なschemaについてはfeature workということで...
* もう少し細かい内容については, `:help vison.txt` でドキュメントを参照してください(こちらも書き掛けですけど...)
instantiateViewControllerWithIdentifierを使ってVCを生成する


ストーリーボードにあるViewControllerを自前で生成する方法を書きます。

１．is initial View Controllerのチェックを外してあること（超重要）
２．Storyboard IDを設定してあること
３．コードを書いて呼び出すこと。

以上。

尚、Webには、１．をするのを忘れている記事が多いので、注意しませう。

コードはだいたい以下を参照するとルートに。あと遷移は適当にどうぞ。

```Objective-c:ObjC.m
	//自前で生成する
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    //application launch後の、カスタマイズコードを記述する。
    self.window.backgroundColor = [UIColor whiteColor];
    //表示ON
    [self.window makeKeyAndVisible];
    //ストーリーボードSubのIDがViewControllerのビューコントローラを生成
    UIViewController *rootVC = [[UIStoryboard storyboardWithName:@"Sub" bundle:nil]instantiateViewControllerWithIdentifier:@"ViewController"];
    //windowのルートビューコントローラに設定
    self.window.rootViewController = rootVC;
    //windowにsubビューを追加する
    [self.window addSubview:[rootVC view]];
Travis CIでMySQLに接続できなくなった

古いリポジトリのテストを久しぶりにTravis CI上で走らせたら、次のようなエラーが出た。

```
Incorrect MySQL client library version! This gem was compiled for 5.5.41 but the client library is 5.6.24.
```

2015/4/9前後にTravis CI上のMySQLのバージョンが5.5系から5.6系に上がったのだけれども、今回は`bundle install`した結果をキャッシュするようにしていたために5.5系のライブラリとリンクしたmysql2 gemを使って5.6系と接続しようとしていたことが原因だった。

キャッシュはTravis CI上のリポジトリごとの画面で削除できるので、そこから削除したのち再実行したら上記のエラーは出なくなった。

[![image](https://qiita-image-store.s3.amazonaws.com/0/2103/cdeb4c49-a51f-b44b-6500-4f970114abc2.png)](http://docs.travis-ci.com/user/caching/#Clearing-Caches)

ちなみに時々MySQLサーバが起動せず接続に失敗することがあって、そのときは再実行したら普通に走った。
https://twitter.com/travisci/status/588012083083665409

## 参考

- [Build Environment Update History 2015-04-09](http://docs.travis-ci.com/user/build-environment-updates/2015-04-09/)
- [Clearing Caches](http://docs.travis-ci.com/user/caching/#Clearing-Caches)
Macの便利なコマンド


# pbcopy

標準入力で渡された物をコピー

# pbpaste

標準出力にクリップボードをペースト

# open 

引数で渡されたファイルを開く。（Finderでファイルを開いた時と同じ挙動）

# say 

引数で渡された単語を発音する
OS X Yosemiteでxv6をbuildして動かすまで

**xv6**
http://pdos.csail.mit.edu/6.828/2014/xv6.html

OS Xではcross-compilerが必要なので以下の手順でtoolchainを用意してからbuildします。

<!--#i386-jos-elf toolchainを準備する（手動編）-->
#i386-jos-elf toolchainを準備する
以下のサイトで説明してくれているので、参考に、というかほとんどそのままです。ありがとうございます！
http://d.hatena.ne.jp/gionXY/20130909/1378660645
http://daoyuan.li/i386-jos-elf-toolchain-on-os-x-lion/
http://blogs.yahoo.co.jp/i_love_raspberry_pi/39244842.html
また、以下も参考になります。
http://www.ifp.illinois.edu/~nakazato/tips/xgcc.html

以下、`$PREFIX`は任意のインストールディレクトリ名

##binutils

```shell-session
$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.25.tar.gz    
$ tar xvf binutils-2.25.tar.gz          
$ mkdir build-binutil       
$ cd build-binutil
$ ../binutils-2.25/configure --disable-nls --target=i386-jos-elf --disable-werror --prefix=$PREFIX  
$ make all
$ make install
```

##gcc

```shell-session
$ wget http://public.p-knowledge.co.jp/gnu-mirror/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.gz      
$ tar xvf gcc-4.9.2.tar.gz     
$ mkdir build-gcc
$ cd build-gcc
$ ../gcc-4.9.2/configure --disable-nls --target=i386-jos-elf --disable-werror --enable-languages=c --without-headers --prefix=$PREFIX
$ make all-gcc
$ make install-gcc
```

#xv6をbuild & run
git repositoryからsourceを取得

```shell-session
$ git clone git://pdos.csail.mit.edu/xv6/xv6.git
```

Makefileをちょっと修正
`TOOLPREFIX`と`QEMU`のコメントアウトを削除。
上のtoolchainのインストールディレクトリを`TOOLPREFIX`に指定する。

```diff:Makefile
-# TOOLPREFIX = i386-jos-elf
+TOOLPREFIX = $PREFIX/i386-jos-elf-
-# QEMU = qemu-system-i386
+QEMU = qemu-system-i386
```

qemuが入っていない場合はHomebrewなどでインストール。

```shell-session
$ brew install qemu
```

ビルド、実行

```shell-session
$ cd xv6
$ make
$ make qemu-nox
```
マウスを使いたく無いコピペまとめ


## GNU screenのコピペ

screenにはコピーモードがあるので、コマンド文字（デフォルトではctrl + a）のあと、エスケープキーを押すとコピーモードになる。

カーソルを移動させ、始点でスペースキー、終点でスペースキーと2回スペースキーを押すとscreenのバッファにコピーされる。
コマンド文字（デフォルトではctrl + a）の後に、]を押すと、貼り付け出来る

コピーモード中の移動は、

+ 上下左右 vimのhjklや十字キー
+ ページ送り ctrl + f またはctrl + b
+ 行頭 ^
+ 行末 $

のように、vimに近い


## シェルのコピペ

C-k  現在のカーソルから行末までを切り取り
C-u  現在のカーソルから行頭までを切り取り
C-w  単語単位で切り取り
C-y  ペースト


## vimのコピペ

yでコピー
pでペースト

vを使ってビジュアルモードにするとかなり柔軟にコピペ出来る

## osxでコマンドラインでコピペ

pbcopyに標準出力を渡してあげるとコピー

```shell
echo test | pbcopy
```

pbpasteで標準出力からペースト
MACでAMP環境の構築


MACでMAMPPROを使用してPHPの開発環境を整えていたけど、railsも勉強したいと思い、MAC標準のunixを使用してAMP環境を構築したほうがいいかなと思ったので忘却録を…

##パッケージ管理システム
Linuxでいうyumやaptみたいに、MACにもHomebrewというパッケージ管理システムがあるので、それをまずインストールしておく。

[Homebrew](http://brew.sh/index_ja.html "Homebrew")


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


##Apacheの設定
既にApacheは入ってるので以下のコマンドで動かすことは出来る。

```
$ sudo apachectl start
```

localhost にアクセスすると「It works！」とか表示される。

ローカルだし、いちいちスーパーユーザーで設定するのも面倒なので、ユーザー権限でゴニョゴニョしたい。なのでドキュメントルートを変更してしまう

```
#Apacheの設定ファイルを開く
$ sudo vi /etc/apache2/httpd.conf
```

httpd.confの設定に関してはググれば色々と出てくるので、色々と参考にしてやってみた

```
#これをコメント解除しないとユーザーディレクトリが使えない
LoadModule userdir_module libexec/apache2/mod_userdir.so

#php5を使用するために
LoadModule php5_module libexec/apache2/libphp5.so

#サーバー名を指定しないと警告が出る(動くけど…)
ServerName localhost:80

#ドキュメントルートをユーザー配下にする
#この場合はユーザーディレクトリ配下に'www'を追加した場合
DocumentRoot "/Users/user_name/www"

#ディレクトリの設定
<Directory "/Users/user_name/www">

#htaccessの使用を許可する
AllowOverride All

#CGIを使う予定はないのだれけども…
AddHandler cgi-script .cgi .pl .py .rb

```

とりあえずここまで設定して後は後々勉強する予定

```
sudo apachectl graceful
```

エラーが出なければ完了。エラーが出た場合はエラー読んで対応すれば大丈夫だと思う。

あと、バーチャルホストとかは必要ないので特に触れない

##PHPのインストール設定
PHPも入ってるので

```
$ php -v
```

でバージョンを確認出来る。
自分の場合は5.5.20だった。

php.iniの設定を行う。
/etc/php.ini.defaultファイルがあるのでコピーして、/etc/php.iniを作成する。

```
#php.iniを作成する
$ sudo cp /etc/php.ini.default /etc/php.ini
```

書き込み権限がないので

```
$ sudo chmod o+w /etc/php.ini
$ sudo vi /etc/php.ini
```


設定内容は[sentosサーバー構築マニュアル](http://centos.server-manual.com/centos5_apache2_php5.html)を参考。

```
#ショートタグ使用派なので
short_open_tag = On

#とりあえず１分ぐらいで
max_execution_time = 60

#デフォルト文字コードをUTF-8に
default_charset = "UTF-8"

#最大アップロードサイズを変更(なんぼでもいいと思います)
upload_max_filesize = 20M

#デフォルトタイムゾーンを東京に
date.timezone = Asia/Tokyo

#デフォルト言語を日本語に
mbstring.language = Japanese

#内部エンコーディングをUTF-8に
mbstring.internal_encoding = UTF-8

#HTTP入力エンコーディングをUTF-8に
mbstring.http_input = UTF-8

#HTTP出力エンコーディング
mbstring.http_output = pass

#内部文字エンコーディングの有効・無効
mbstring.encoding_translation = On

#文字コード検出のデフォルト値
mbstring.detect_order = auto

#無効な文字を代替する文字を定義
mbstring.substitute_character = none
```
以上でとりあえず完了

```
$ sudo apachectl graceful
```

反映されているかどうかは`phpinfo()`とかで確認してみる。


##mysqlのインストール設定
```
# インストール
$ brew install mysql

# MySQLの起動
$ mysql.server start

# パスワードの作成
$ mysqladmin -u root password 'password'

# rootユーザでログイン
$ mysql -u root -p

```

【追記】
`mysql_secure_installation`が良さそうなので、こちらで設定することにした。とりあえず「Y」だけでいいみたい。


```
$ mysql_secure_installation

#設定したパスワードを入れる
Enter current password for root (enter for none):

#rootパスワードを設定するか否か（パスワード設定してなければYすでにしている場合はn）
Set root password? [Y/n] n

#匿名ユーザーの削除（誰でもログインできるユーザー）
Remove anonymous users? [Y/n] Y

#rootユーザーのリモートログインの禁止 
Disallow root login remotely? [Y/n] Y 

#テストデーターベースの削除
Remove test database and access to it? [Y/n] Y 

権限の変更の再読み込み
Reload privilege tables now? [Y/n] Y
```

localhostではなく127.0.0.1で接続できるようになる。

とりあえずこんな感じ
過去にMAMPとか入れてると動かないところがあるので、
一旦OSリカバリしてから行った方がスムーズかも…
自分はそうだった
elasticsearch + python で全文検索したい


##1. download & install

```
bin/elasticsearch
```
  
elasticsearchだとマストなプラグイン

```
bin/plugin install mobz/elasticsearch-head
```

形態素解析してくれるプラグイン

```
bin/plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.5.0
```


##2. setting kuromoji

面倒くさいなら (restart elasticsearch)

```config/elasticsearch.yml
index.analysis.analyzer.default.type: custom
index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer
```

インデックス単位で設定するなら

```
curl -XPUT http://localhost:9200/index1/ -d '
{
  "index": {
    "analysis": {
      "tokenizer": {
        "kuromoji": {
          "type": "kuromoji_tokenizer"
        }
      },
      "analyzer": {
        "analyzer": {
          "type": "custom",
          "tokenizer":"kuromoji"
        }
      }
    }
  }
}'
```


##3. check

analyzerの確認

```
curl -XPOST http://localhost:9200/index1/_analyze?analyzer=analyzer&petty -d 'これはペンです'

{
  "tokens": [
    {
      "token": "これ",
      "start_offset": 0,
      "end_offset": 2,
      "type": "word",
      "position": 1
    },
    {
      "token": "は",
      "start_offset": 2,
      "end_offset": 3,
      "type": "word",
      "position": 2
    },
    {
      "token": "ペン",
      "start_offset": 3,
      "end_offset": 5,
      "type": "word",
      "position": 3
    },
    {
      "token": "です",
      "start_offset": 5,
      "end_offset": 7,
      "type": "word",
      "position": 4
    }
  ]
}
```
うむ。ちゃんと動いてるっぽい。



サンプル登録1

```
curl -XPUT http://localhost:9200/index1/type1/1 -d '{"text":"これはパンです"}'
```

サンプル登録2

```
curl -XPUT http://localhost:9200/index1/type1/2 -d '{"text":"これはペンです"}'
```

検索！

```
curl -XGET http://localhost:9200/index1/type1/_search -d '{"query": {"match": {"text": "ペン"}}}'
{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.15342641,
    "hits": [
      {
        "_index": "index1",
        "_type": "type1",
        "_id": "2",
        "_score": 0.15342641,
        "_source": {
          "text": "これはペンです"
        }
      }
    ]
  }
}

```


##4. python client

```
$ pip install elasticsearch
```
【Talend】使い方メモ

Talend Open StudioといオープンソースのELTツールがある。
※ELT（データの抽出・加工・ロード）

半年に一回ジョブを作る程度なのに、日本語の情報がほとんどなくて、毎回忘れるので自分用にメモ。

##talend開きかた
①talendを起動してプロジェクトを開く。新規プロジェクトを作成してもよい。
※プロジェクトの中にジョブがあり、ジョブ単位で処理を記述できる構成になっている。

##使用したいウィンドウがないとき
メニューの「ウィンドウ」→「ビューの表示」
あとは閉じていたりするので、いろいろ開いたり閉じたり試してみる。

##ジョブの作り方
①Repositoryウィンドウのジョブ右クリック→ジョブの作成
②Nameを入力して終了
③RepositoryウィンドウのメタデータのDB接続（作成は後述）から、テーブルをドラッグ＆ドロップして入力元と出力先作成する。
今回は、SQLサーバからmysqlへデータをコピーしたいので、入力元はtMSSqlInput、出力先tMysqlInputにした。
④データコピーの際にカラムのマッピングがしたいので、ジョブの右上の左三角をクリックしてパレットを開き、検索窓にtmpapと入力してtmpapを検索して、ドラッグ＆ドロップする。
**お忘れPOINT：tmpapの場所はジョブの右上の三角開いたとこにあるよ！**
⑤入力元オブジェクトを右クリックして、rowのmainを選択してtmapへ。tmapをを右クリックして、rowのmainを選択して出力先へ。入力元→tmpa→出力先と矢印をつなぐ。
⑥tmpaをダブルクリックして設定画面を開き、左から右へ対応するカラムをドラッグ＆ドロップして対応付けを行う。
⑦コンポーネントをダブルクリックして、ジョブの設定を行う。
出力先をクリックして、基本設定タブのデータ操作を挿入であったり、更新に変更する。
⑧ジョブを右クリックして、ジョブの実行をクリックするとジョブが実行される。
⑨ジョブを右クリックして「ジョブのエクスポート」を選択すると、コンソール実行できるshellとexeが取得できる。これをcronで実行してやる。

##メタデータへテーブルを追加したい。カラムの変更などをメタデータで再読み込みしたい。
①メタデータのDB接続で各DBを右クリックして、「スキーマのリトリーブ」を選択
②「フィルタを選択画面」は次へ
③追加や更新したいテーブルを選択して次へ
④終了ボタン

##メタデータの新規作成
①メタデータのDB接続を右クリックで「create connection」を選択
②Nameを入れて次へ
③DBType、ログイン、パスワード、サーバ、ポート、DataBaseを入力。接続できるかcheckで確認。接続できれば終了。

##ジョブの設定をしたい。
①ジョブを開きコンポーネントをダブルクリック。
②基本設定タブ、詳細設定タブなどで設定を変更できる。


##参考URL
使えそうなリンクメモ。

[Talendのススメ](http://talend-jp.jinaka.com/)
ubuntuにLogstashを入れる

Elasticsearch、kibanaときて、次はLogstashを入れます

# 環境
 * VirtualBox 4.3
 * ubuntu 14.04
 * java8(1.8.0_25)
 * logstash(1.4.2)

## logstashのインストール

```bash
$ cd 
$ wget https://download.elasticsearch.org/logstash/logstash/logstash-1.4.2.tar.gz
$ sudo mv logstash-1.4.2.tar.gz /usr/local/
$ cd /usr/local
$ sudo tar zxvf logstash-1.4.2.tar.gz
$ sudo ln -s logstash-1.4.2 logstash
```
※最新版はhttp://logstash.net/

## 起動と動作確認

以下のようなApacheログを用意しました

```text:access.log
[ip] - - [27/Apr/2015:01:05:10 +0900] "GET [url]" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70"
```
※ip,urlは伏せてあります

設定ファイル作成

```text:test.conf
$ cd /usr/local/logstash
$ sudo mkdir conf
$ cd conf
$ sudo vim test.conf
-----
input { stdin {} }

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
    break_on_match => false
    tag_on_failure => ["parse_failure"]
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    locale => "en"
  }
}
                                         
output {
  stdout { codec => rubydebug }
}
-----
```

起動と動作確認

```bash
$ /usr/local/logstash/bin/logstash -f /usr/local/logstash/conf/test.conf
標準入力になるので、ここに上記ログを貼り付けます
[ip] - - [27/Apr/2015:01:05:10 +0900] "GET [url]" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70"
Enterで実行

{
        "message" => "[ip] - - [27/Apr/2015:01:04:24 +0900] \"GET [url]" 200 1375 \"-\" \"Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70\"",
       "@version" => "1",
     "@timestamp" => "2015-04-26T16:04:24.000Z",
           "host" => "[host]",
       "clientip" => "[ip]",
          "ident" => "[ident]",
           "auth" => "[auth]",
      "timestamp" => "27/Apr/2015:01:04:24 +0900",
           "verb" => "GET",
        "request" => "[url]",
    "httpversion" => "1.1",
       "response" => "200",
          "bytes" => "1375",
       "referrer" => "[referrer]",
          "agent" => "\"Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70\""
}
```
パースされました。

## 設定ファイルの内容

|`設定`    |`説明`                  |
|----------|--------------------------|
|**input**  |入力ログのパス等を記載する。今回は標準入力|
|**filter**|入力ログに対して設定するフィルタを記述する|
|**grok**|非定型なログを処理する設定|
|**match**|入力されたログをマッチングさせる。今回はCOMBINEDAPACHELOG形式でマッチング|
|**date**|時間パース設定|
|**output**|パース結果の出力先。今回は標準出力|
Docker コンテナ内で GlusterFS をマウントする

小ネタ＆自分用のメモとして。

## 背景
Docker コンテナでデータを永続化するためにはボリュームが良く使われます。
ボリュームはホストのディレクトリをコンテナ内にマウントするものですが、それゆえにコンテナとホストの結びつきが強くなってしまいます。具体的にはコンテナを他のホストに持っていったときデータは永続化されません、データも一緒に移動するといったホスト側のメンテナンスが発生してしまいます。
また、複数ホスト間でコンテナを分散しクラスタリングしようとしたとき、やはりボリュームの一元化が必要という問題に悩まされることと思います。
ネットワークボリュームを使う事になると思うのですが、ホスト側にマウントする形ではホストのメンテナンス作業が発生してしまうので好ましくありません。
そこで Docker コンテナ内でネットワークボリュームをマウントできないかと考えました。

なぜ NFS でなく GlusterFS を選択したのかというと、NFS は(標準状態で)利用するポートが不定なためフィルタやフォワーディングが前提な環境だと使いにくかったというのが理由です。GlusterFS もクラスタ数で使用ポートが増えますがまだ設計や予測が可能な範疇だと思います。

## 要求
Docker コンテナ内で他のサーバーが提供している GlusterFS ボリュームをマウントしたい。

## 問題点
GlasterFS は FUSE を用いているがその仕組みが Docker のパーミッションに引っかかって利用ができない。

## 前提環境
GlasterFSサーバー = Debian8 マシン
Dockerホスト = 上記とは別の Debian8 マシン
Dockerコンテナ = Debian8

## 解決策
コンテナ起動時に FUSE が使うシステム要求を許可してやれば良いのです。
WEBで検索すると ```--privileged``` スイッチをつけている例が多く見られます。実験確認用はこれでも良いかも知れないですが、全権限をコンテナに与えるのは些かの不安があるところですね。

必要な権限、とアクセス先のみに絞ると以下のスイッチのようになると思います。
```--device=/dev/fuse --cap-add=SYS_ADMIN```

## 準備
GlusterFS クライアントを含んだ Debian イメージを作成しておきます。

```Dockerfile
FROM debian:jessie
MAINTAINER rerofumi

RUN echo 'deb http://ftp.jp.debian.org/debian/ jessie main' > /etc/apt/sources.list
RUN echo 'deb http://security.debian.org/ jessie/updates main' >> /etc/apt/sources.list

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update; \
    apt-get -y upgrade; \
    apt-get -y dist-upgrade; \
    apt-get -y install glusterfs-client; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*


CMD ["/bin/bash"]

```

上記 Dockerfile を
```docker build -t glusterfs-test .```
などとしてテスト用イメージを作っておきましょう。

## 確認
テスト用イメージに、許可スイッチをつけて起動します。
```
docker run -it --device=/dev/fuse --cap-add=SYS_ADMIN --rm glustefs-test bash
```

コンテナが起動したら GlusterFS のボリュームをマウントしてみます。
```
mount -t glusterfs [GlusterFSサーバーのアドレス]:/[ボリューム名] /mnt
```

エラーが出ずにマウント完了したら成功です。
【Android】Androidの基本を覚えた後に覚えたいこと～はじめてのFragment③～

[【Android】Androidの基本を覚えた後に覚えたいこと～はじめてのFragment①～](http://qiita.com/chihiro/items/793a53c04eb43108778d)
[【Android】Androidの基本を覚えた後に覚えたいこと～はじめてのFragment②～](http://qiita.com/chihiro/items/d1ef02a12e4d04ad64e0)
の続きです。


今回はActivityとの連携をまとめます。

# 連携
ActivityとそのActivityに属するFragmentは直接やりとりをすることができます。

**FragmentがActivityを呼ぶ、使うために**

```lang:SampleFragment.java
View listView = getActivity().findViewById(R.id.list);
```

getActivityメソッドで自身が紐付けられているActivityのインスタンスを取得でき、処理をすることができます。
上の例ではviewを取得しています。

**ActivityがFragmentを呼ぶ、使うために**

```lang:MainActivity.java
SampleFragment fragment = (SampleFragment) getFragmentManager().findFragmentById(R.id.sample_fragment);
```

findFragmentByIdメソッド、またはfindFragmentByTagメソッドを用いることでFragmentのインスタンスを取得できます。

# イベントの共有
Fragment上で発生したイベントをActivityに通知する方法です。
たとえば、Fragment上でのクリックイベントは、Activityに自動的に通知されるわけではありません。
クリックイベントをActivityにも通知したければ、通知するように処理を入れなければいけません。

大まかに説明すると、Frgamentにコールバックのためのインターフェースを定義し、Activityでそのインターフェースを実装する、ということをします。
以下に詳しく説明します。

### 今回やりたいこと
ListFragmentの一項目をクリックしたら、Activity上でそのクリックを検知してLogを出力します。

**Fragmentにコールバック用のインターフェースを定義する**

```lang:SampleFragment.java
public static class SampleFragment extends ListFragment {
    
    public interface OnItemSelectedListener {
        public void onItemSelected();
    }
}
```

今回はListFragmentを継承しています。
このような感じでFragmentにコールバック用のインターフェースを定義します。

**Activityでインターフェースを実装する**

```lang:MainActivity.java
public class MainActivity extends FragmentActivity implements SampleFragment.OnItemSelectedListener{

    @Override
    public void onItemSelected(){
        Log.d("MainActivity ","excute onItemSelected()");
    }

}
```

通知したいActivityで、Fragmentに定義したコールバック用のインターフェースを実装します。
これから、Fragment上でのリストに対するクリック動作が発生したときにonItemSelected()が実行されるようにしていきます。


**FragmentからActivityに通知する**

```lang:SampleFragment.java
public static class SampleFragment extends ListFragment {

　　// 先ほど定義したコールバック用のインターフェース    
    public interface OnItemSelectedListener {
        public void onItemSelected();
    }

    // 自身と紐づいたActivityの参照が格納される
    OnItemSelectedListener listener;
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        
        // 紐づいたActivityの参照を格納。OnItemSelectedListenerを実装していない場合はExceptionが発生します。
        try {
            listener = (OnItemSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnItemSelectedListener");
        }
    }
    
    @Override
    // ListFrgament定義されている。リストが選択されると呼ばれる。
    public void onListItemClick(ListView l, View v, int position, long id) {
        listener.onItemSelected();
    }

}
```

onAttach()は、Activityと紐づいたときに呼ばれるメソッドで、引数のActivityは紐づくActivityです。
あとはActivityにFragmentを追加する処理を書くことで、Fragmentのクリック動作をActivityに通知することが可能になります。


Fragmentの基本については今回の記事でいったん終わりにしようと思います。


# 参考
* http://developer.android.com/guide/components/fragments.html
UniRx使い始め

# 概要
UniRxを導入してみたいけど、何から手をつけたらいいか自分がわからなかったので、
自分が手をつけ始めたところをリストアップしてみました。

# 後始末
参照を握りっぱなしにしてしまわないように、後始末を忘れずにしましょう。
必要ない物(場合)も多いですが、以下のような処理を書いておくのが無難です。
`[NonSerialized] private CompositeDisposable disposables = new CompositeDisposable();`
のような変数を用意し、`.Subscribe().AddTo(disposables)`をすることで、
thisの破棄時にストリームのDispose()をしてくれます。

**追記**
また、単にGameObjectを渡すだけでもDispose()してくれるとのことです。
`.Subscribe().AddTo(this.gameObject)`

* 参考[【UniRx】SubscribeのDisposeをGameObjectに紐付ける](http://qiita.com/toRisouP/items/35b4d6255c1f9ecf27d1)

# FromEvent
`public event Action OnEvent;`
というのがあった場合、
`Observable.FromEvent( h=>OnEvent+=h, h=>OnEvent-=h )`
でストリーム化できます。

# NGUIなどのdelegate
```
public OnDragFinished onDragFinished;
public delegate void OnDragFinished ();
```
などの場合は上記の方法では登録できませんので、
delegateの型に変換してあげる必要があります。

```
Observable.FromEvent<UIProgressBar.OnDragFinished>(
	h => ()=>h(), h => bar.onDragFinished+=h, h => bar.onDragFinished-=h
)
```
で変換しましょう。

# 値の変更を監視
`ReactiveProperty<T>`で実装するのが一番ですが、
既に動いているコードへの実装は難しいと思います。
そんな場合は
`Component.ObserveEveryValueChanged(_=>value)`
で値が変更された時のストリームになりますのでご利用ください。

* 参考[【UniRx】ObserveEveryValueChangedでフレーム間での値の変動を監視する](http://qiita.com/toRisouP/items/d0d32cf674a00f3a8427)

# Update()そのもの
`Component.UpdateAsObservable()`
でUpdate()がストリームになります。
`using UniRx.Triggers;`
しないといけない点にご注意ください。

* 参考[【UniRx】Update()をObservableに変換する方法](http://qiita.com/toRisouP/items/972b97367df12c3457d2)

# NGUIのOnClick()など、SendMessage()で来るもの
ObservableMouseTrigger.cs を参考に以下のような形で作成

```
public class ObservableNGUITrigger : ObservableTriggerBase {
	Subject<Unit> onClick;

	void OnClick() {
		if ( null != onClick ) onClick.OnNext( Unit.Default );
	}

	public IObservable<Unit> OnClickAsObservable() {
		return onClick ?? ( onClick = new Subject<Unit>() );
	}

	protected override void RaiseOnCompletedOnDestroy() {
		if ( null != onClick ) {
			onClick.OnCompleted();
		}
	}
}
```

# いつからいつまでを表す書き方
`Observable.SkipUntil(開始条件).TakeUntil(終了条件)`
でいつからいつまでを表すことができます。
`.RepeatUntilDestroy(this)`をつけることで
thisが生きている間の開始条件〜終了条件を常に監視できます。
例：`this.UpdateAsObservable().SkipUntil(mouseDown).TakeUntil(mouseUp).RepeatUntilDestroy(this)`

**注意点**
TakeUntilのチェックは常に走ります。
つまり、以下のコードは意図した通りに動かない可能性が高いです。

```
IObservable<bool> flag;
this.UpdateAsObservable()
// flagにtrueが流れる前に
.SkipUntil( flag.Where( x => x ) )
// falseが流れて来てしまうと購読がそこで終了してしまう
.TakeUntil( flag.Where( x => false == x ) )
```

# デバッグ方法
* 途中の値が見たい
	`.Do(x=>Debug.Log(x))`を見たい場所に挟めば出力できます。

* Repeatされているかどうか確かめたい
	`.Finally(()=>Debug.Log("finally")).Repeat()`でリピートされたタイミングのログが出せます。


# 参考
* [Reactive extensions入門v0.1](http://www.slideshare.net/okazuki0130/reactive-extensionsv01)
OpenViBEのpython frameworkを使ってみる	


## 最低限必要なBoxクラス

pythonコードで最低限実装しておくクラスがBoxクラスです。
今回は下記のようなスケルトンコードに必要なものを実装していく形になります

```python
class MyOVBox(OVBox):
	def __init__(self):
		OVBox.__init__(self)
	
	def initialize(self):
		return
		
	def process(self):
		return
		
box = MyOVBox()
```

`__init__()`で必要な変数を定義しておきます

`initialize()`でOpenViBEからのinput値や、setting値を変数に代入します

`process()`はOpenViBE実行中にループされるメソッドで、実際に動かしたい処理を書きます

## 試しに書いて動かしてみる

designerで新しくシナリオを作成します

BoxesのScriptingにあるPython scriptingボックスを配置します

Python scriptingボックスを右クリックしてmodify setting > newからName: Threshold, Type: integer, Default value: 10を入力してsettingを追加します

以下のコードをどこかに保存します

```python
class MyOVBox(OVBox):
	def __init__(self):
		OVBox.__init__(self)
		self.count = 0
		self.threshold = 0
	
	def initialize(self):
		self.threshold = int(self.setting['Threshold']
		
	def process(self):
		self.count += 1
		print(self.count)
		
		if self.count >= self.threshold:
			print('Count is threshold!')
			self.count = 0

box = MyOVBox()
```

Settingで指定したthresholdの値になるまでカウントしていって、threshold値になったら再び0からカウントしなおすだけのコードです

Python scriptingボックスをダブルクリックして、Scriptから先ほど保存したpythonコードを指定します

RUNするとスクリプトが動き、Messageが流れます
Visual Programming Editorをどうやって実現するかざっと考えてみた

## いきさつ
近頃Googleの[Blockly](https://code.google.com/p/blockly/)やらUnreal Engineの[Blueprints](https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/index.html)を見ていて「こういうの作ったら仕事が楽になりそうだなぁ」というサボり虫が騒ぎました。特に初期の開発フェーズのプロトタイプには効果がありそう。ということで、では「実際に自作する場合はどうするか」を検討してみる事に。

## 注意
いろいろ調べてどうやったら実現できそうかをメモしただけです。実際に動作するモジュールだとかアプリケーションは作っていないので、そういったものをお探しの場合は以降の内容を見る価値はありません。

## 想定する動作環境
基本的に職場はWindowsなのでWPF、もしくはWebアプリケーションも検討する。出力するデータはXMLやJSON、それかCのソースコードを直接出力。

## 先人の知恵をあたる
ざっとググってみた感じでは以下のページが参考になりそうでした。ノードをコネクターでつないでいくGUIがいいと思っているのでBlocklyのようなものは除外しています。

### WPFでダイアグラムを実装する
CodeProjectの[この記事](http://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part)が良かったです。ただ、出来上がりはVisioのようなものになります。

### Flood	
JavaScriptによる3D Visual Programming環境。ソースコードは[Githubでホスティング](https://github.com/pboyer/flood)されているので参考になりそう。GUIはこのノードにコネクターつないでいくのが理想です。

### JointJS
JointJSの[このあたり](http://www.jointjs.com/tutorial/html-elements)を参考にどうにかならんもんか。

### vvvv
聞いたことの無い環境でした。プロジェクトページは[こちら](http://vvvv.org/documentation/vvvv-%E4%BD%95%E3%81%A7%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88)。
Processingのコードが出力されるのかな？ともかく参考にはなりそう。 

### 既存のRecord Mapper
そもそも用途が違う気がするので飽くまでGUIの参考として。[こんなやつ](http://gojs.net/latest/samples/records.html)とかです。でも、このサンプルは大分流用できそうな気がします…。
	
といった具合です。わかってはいましたが、道のりは楽ではないです。

## まとめ
理想はFloodなのですが、いかんせん近年のJavaScript界隈は変化が激しすぎるため仕事でメンテし続けるのは辛そうだなと…。WPFのサンプルを参考にContentTemplateやControlTemplateあたりをゴニョゴニョするのが無難かな…。

## 追記15/05/07
WPFの記事を考察して、更にMVVMベースで改造した方がいました。

http://www.codeproject.com/Articles/484616/MVVM-Diagram-Designer
pytestまとめ


1.install

```
pip install pytest pytest-pep8 pytest-cov
```

2.write test code

```python:test_hoge.py
import pytest

def TestClass:
	def pytest_funcarg__hoge(request):
		return Hoge(1)
		
	def test_type(self, hoge):
		assert isinstance(hoge, Hoge)
```

pytest_funcarg__hogeは、setupみたいなもので、各テスト実行時に実行されテストの引数として渡してくれる。self.hogeとか不要なので便利。ただ、こちらはオールドスタイルで、デコレータを使うのが新しいやり方。

```python:test_hoge.py
import pytest

def TestClass:
	@pytest.fixture()
	def hoge(request):
		return Hoge(1)
		
	def test_type(self, hoge):
		assert isinstance(hoge, Hoge)
```

3.run tests

* 詳細表示
* カバレッジ取得
* カバレッジレポート出力（HTML形式）
* ソースコードチェック（PEP8）

```
py.test --verbose --cov . --cov-report=html --pep8
```

4.write production code

```python:hoge.py
class Hoge:
	def __init__(self, v):
		self.val = v

```


5.write test code

```python:test_hoge.py
class MockClass:
	def method1(self, p1, p2):
		pass
		
class TestClass:
	@pytest.fixture()
	def mockclass(request):
		return MockClass()
	
	def test_method1(self, mockclass, monkeypatch):
		monkeypatch.setattr(module1, 'method1', mockclass.method1)
		val = module1.method1(p1, p2)
		assert val == "..."
```
PHP7調査(24)ジェネレータがyield fromとreturnをサポート

ジェネレータはPHP5.5で導入された機能です。PHP7では、ジェネレータをさらに便利にするような文法として`yield from`と`return`が実装されました。これはPython 3.3から文法ごと輸入したものです（たぶん）。それぞれ簡単に説明します。

# `yield from`

PHP5では、ジェネレータ関数が値を返す構文は`yield`しかありませんでした。PHP7では新たな構文が導入されます。

```
yield from <expr>
```

この文では`<expr>`から順に値を取り出し、それぞれの値を`yield`します。`<expr>`には`Traversable`なオブジェクトまたは配列を指定することができます。

```php
<?php
function gen2($i) {
  yield $i;
  yield $i*2;
}

function gen1() {
  yield from [1,2];
  yield from gen2(4);
}

foreach (gen1() as $i) {
  var_dump($i);
}
```

上記プログラムを実行すると下記のような結果が得られます。

```
int(1)
int(2)
int(4)
int(8)
```

これは「ジェネレータ関数の処理の一部を別のジェネレータに委譲する」などと説明されることも多いようです。巨大で複雑なジェネレータ関数を作るような場合に、この構文で簡単に関数分割ができますね。

# ジェネレータ関数での`return`

PHP5までのジェネレータ関数には`return`を書くことはできませんでした。PHP7からは、ジェネレータ関数に`return`を書くことができるようになりました。`return`のタイミングでジェネレータ関数は終了します。また、`return`した値はジェネレータの新たなメソッド`getReturn()`で取得することができます。

```php
<?php
function gen() {
  yield 1;
  yield 2;
  return 3;
}

$gen = gen();
foreach ($gen as $i) {
  var_dump($i);
}
echo $gen->getReturn(), "\n";
```

上記プログラムを実行すると下記のような結果が得られます。

```
int(1)
int(2)
3
```

この例だとreturnの存在理由がわからない程度ですが、`yield from`文と組み合わせると少し違った動きになります。`yield from`文でジェネレータを呼び出した場合、ジェネレータの`return`値が`yield from`文の評価値になります。

```php
<?php
function main() {
    $gen = gen1(0);
    $x = $gen->current();
    printf("%d <--yield\n", $x);
    $y = $gen->send(2);
    printf("%d <--yield\n", $y);
    $z = $gen->send(5);
    printf("%d <--yield\n", $z);
    $w = $gen->send(7);
    printf("%d <--yield\n", $w);
    $gen->send(10);
    printf("%d <--return\n", $gen->getReturn());
}

function gen1($a) {
    printf("arg--> %d\n", $a);
    $b = yield 1;
    printf("send--> %d\n", $b);
    $c = yield from gen2(3);
    printf("%d <--return\n", $c);
    $d = yield 9;
    printf("send--> %d\n", $d);
    return 11;
}

function gen2($a) {
    printf("arg--> %d\n", $a);
    $b = yield 4;
    printf("send--> %d\n", $b);
    $c = yield 6;
    printf("send--> %d\n", $c);
    return 8;
}

main();
```

上記プログラムを実行すると下記のような結果が得られます。

```
arg--> 0
1 <--yield
send--> 2
arg--> 3
4 <--yield
send--> 5
6 <--yield
send--> 7
8 <--return
9 <--yield
send--> 10
11 <--return
```

`yield from`で呼び出されているジェネレータ関数`gen2()`の返す値のうち、4と6は`main()`が受け取り、8は`gen1()`が受け取っていることがわかります。このように、異なる2つの関数と値のやりとりができているのは特徴的だと言えます。


この例はかなり複雑なので、手元で試した方が理解が進むかもしれません。

# 感想など

将来的にはPythonの[asyncio](https://docs.python.org/3/library/asyncio.html)のように`yield from`を活用するライブラリが出てくると思いますが、それまでは謎の機能という扱いになりそうですね…。

# 参照

* [PHP RFC: Generator Delegation](https://wiki.php.net/rfc/generator-delegation)
* [PHP RFC: Generator Return Expressions](https://wiki.php.net/rfc/generator-return-expressions)
* [18.5. asyncio – Asynchronous I/O, event loop, coroutines and tasks](https://docs.python.org/3/library/asyncio.html)
AndroidStudio1.1のUnitTestでLibrary Projectの Rパッケージが見つからない場合の対処法


はじめに
=======

AndroidStudio1.1 から UnitTestがサポートされました。
http://tools.android.com/tech-docs/unit-testing-support
＃ *正確には、 android-gradle-plugin 1.1 から、というべきなのかな。*

1.1では、

```bash
./gradlew testDebug
```

などとすると、 このUnitTestのTaskが起動されるみたいです。

ただ、 AndroidApplication が **AndroidLibrary ProjectのRパッケージ** を参照していると NotFound というエラーになるので、その対処法のメモです。

内容
=======

症状
---------

`./gradlew testDebug` とすると、
以下の様なエラーで止まってしまいます。

```
:app-hogehoge-library:compileDebugUnitTestJava
/Users/hogehoge/app-hogehoge/app-hogehoge-library/src/test/java/com/example/models/fugafuga/GetIconInfoModelTest.java:7: エラー: シンボルを見つけられません
import com.example.R;
```

対処
--------

下記に書いてある＃７の方法で治ります。
https://code.google.com/p/android/issues/detail?id=144573

要点だけ書いておくと、
Library Projectの build.gradle に下記を追加します。

```groovy:app-hogehoge-library/build.gradle
...
android {
	...
	sourceSets {
		...

		// https://code.google.com/p/android/issues/detail?id=144573
       test.java.srcDirs += 'build/generated/source/r/debug'   // ← これ!
   }
}
```

さいごに
========

少し広い範囲をテストしようとすると Rパッケージも参照したいですし、
1.2では、治って欲しいなー
ちゃんとシャットダウンしなかったときに出る GRUB メニューを消す

12.04 - How to disable Grub's menu from showing up after failed boot - Ask Ubuntu
http://askubuntu.com/questions/178091/how-to-disable-grubs-menu-from-showing-up-after-failed-boot

1. `/etc/default/grub` をエディタでひらく。
2. `GRUB_RECORDFAIL_TIMEOUT=N`  
↑っていう行をついか。N は起動失敗した時に出る GRUB メニューを自動的にけす時間。
3. `sudo update-grub` して設定を反映。
c++ builder XE4 > __property 

http://www.gesource.jp/weblog/?p=3804

> __property PointerToAFunction OnFunc = { read=FOnFunc, write=FOnFunc };

> このようにすると、処理の一部を他のクラスのメンバ関数に委譲することができます。

read=, write=の部分にFxxと記載するようにしている。

<hr>
http://www.eonet.ne.jp/~takao-n/documents/bcb/01_property.html

> 読み書きに指定する変数名: "F" + プロパティ名
読み出しに指定する関数名: "Get" + プロパティ名
書き込みに指定する関数名: "Set" + プロパティ名

<hr>
実際にプロパティを追加してみた。

C++クラスブラウザ > $(Project) > TForm1 > プロパティの追加において
- 名前: OnFunc
- 型: PointerToAFunction
- 可視性: priavte
- 読取り: 取得アクセサメソッドの作成
- 書込み: 設定アクセサメソッドの作成
と指定すると以下のように追加された。

```cpp:sample.h
private:
    void __fastcall SetOnFunc(PointerToAFunction val);
    PointerToAFunction __fastcall GetOnFunc();
    __property PointerToAFunction OnFunc = {read=GetOnFunc, write=SetOnFunc};
```
2015-04-28 c++ builder XE4 > __closureのまとめ

http://homepage2.nifty.com/Km/contents/20120225.htm
__closureのコードサンプル。

<hr>
http://a7m.sakura.ne.jp/doku.php/cbuilder:vcl:tips1
> C++Builderにおけるクロージャとは拡張関数ポインタとも呼べるものです。

<hr>
http://docwiki.embarcadero.com/RADStudio/XE4/ja/Closure
> VCL コンポーネント イベントはすべて、イベントが発生したときにクラスのメソッドを呼び出せるよう、クロージャとして宣言されます。

<hr>
http://www.gesource.jp/weblog/?p=3804
> C++Builderの拡張機能である__closureと__propertyを使うと、メンバ関数を実行時に他の関数と差し替えることができます。

<hr>
__closureを使うのは以下のような時なのだろう。

- 外部で定義した関数を呼びたい
- 関数を切り替えて使いたい
Eclipseで"building workspace sleeping"が続く問題

パソコンを起動し、Eclipseを起動すると動作が重く、Tomcatなど起動出来なくなっていた。
何度起動しても直らず、cleanしても直らない。
Progressを確認すると"building workspace sleeping"が表示され続けていた。
※正確にはEclipseではなくSTSだが同じもの

探してみると以下のQ&Aで解決策を見つけた。

http://stackoverflow.com/questions/844759/eclipse-stuck-when-building-workspace

手順としては以下のように行った。
1. Eclipseを閉じる
2. 以下のコマンドを実行
　`mv .metadata\.plugins\org.eclipse.core.resources\.projects projects`
3. Eclipseを起動し、そのまま閉じる
4. 以下のコマンドを実行
　`mv projects .metadata\.plugins\org.eclipse.core.resources\.projects`

これで復旧できた。
・・・が、svnなどバージョン管理システムと切断されていたので、接続し直す必要がありました。
他になにか不具合は見つかっていませんが、この方法は最終手段にしておいたほうが良さそうです。
CentOS7にpipをインストール。ついでにiPythonも。

# pipのインストーラーをダウンロードする。
このURLから、任意の場所にダウンロードしてください。
`https://bootstrap.pypa.io/get-pip.py`

**いきなりファイルのURLを書きましたが、WEB上では以下の場所になります。**
1. pipのホームページにアクセスしてリンク`Installation`をクリックする。
`https://pypi.python.org/pypi/pip`
![1.png](https://qiita-image-store.s3.amazonaws.com/0/76564/d66d0698-1ca2-5335-0d87-98840b1643d0.png)
2. 少し下にスクロールして、`To install pip, securely download get-pip.py. [2]`のリンク先が、上記のインストーラーのURLになります。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/76564/0ff34eb8-382a-66cd-a677-8de43a7d8388.png)


# スーパーユーザーで、pipのインストーラーを実行する。
`python get-pip.py`
![1.png](https://qiita-image-store.s3.amazonaws.com/0/76564/732726f6-206a-4371-9ac7-8eb339e7ae1d.png)

これで完了です。
`get-pip.py`は削除おいてください。

# 試しに、pipを使ってiPythonでもインストールしてみる。
`pip install ipython`
![3.png](https://qiita-image-store.s3.amazonaws.com/0/76564/8b5db151-0fd9-27d2-de96-c688b62e7c32.png)

さくっと入りました。
iPythonのインタプリタを実行してみましょう。
`ipython`

```py:
print 'hello egg !'
```
![4.png](https://qiita-image-store.s3.amazonaws.com/0/76564/0670600c-995d-c01c-db7c-d584bc7090f7.png)

問題なく動きますね。
お疲れ様でした。
sprockets 3.0.xに上げたらcapistranoのデプロイで失敗するようになった

Rails 4.2.1にアップデートした直後で、環境はこんな感じ:

- sprockets 3.0.1
- sprockets-rails 2.2.4
- capistrano-rails 1.1.1

このとき次のように`deploy:assets:backup_manifest`で失敗するようになった:

```
Tasks: TOP => deploy:assets:backup_manifest
(See full trace by running task with --trace)
The deploy has failed with an error: #<SSHKit::Runner::ExecuteError: Exception while executing on host xxx.xxx.xxx.xxx: cp exit status: 1
cp stdout: Nothing written
cp stderr: cannot stat `/path/to/releases/2015xxxxxxxxxx/public/assets/manifest*'
No such file or directory
```

sprockets側でmanifestのファイル名が変わったのが原因らしく、capistrano-rails 1.1.3で対応がされていたので、そちらに上げたら直った。

### 参考

- https://github.com/capistrano/rails/blob/master/CHANGELOG.md#113-apr-18-2015
- [deploy:assets:backup_manifest fails - capistrano/rails #111](https://github.com/capistrano/rails/issues/111)
- [No such file or directory(public/assets/manifest*)](http://stackoverflow.com/questions/21179956)
MacOS10系で brew link が怒られた時は。


>$ brew link libtool

すると、以下のエラーが。

>Error: Could not symlink share/info/libtool.info
/usr/local/share/info is not writable.

こういうエラーが出るときは、書き込み権限の問題。
brewはUserから可能だが、 /usr/local/share/info 自体は root 権限になっていたことが原因と考えられる。

>$ sudo chown -R $USER /usr/local/share/info/
$ brew link libtool
$ brew doctor

これでエラーを吐かなくなった。
gulp-sassでError: Invalid US-ASCII character "xE3"になる場合の対処

##解決法
gulp-sassでSCSS→CSSに変換する際に、文字エンコーディングを定義していない状態でCSS内に日本語を含むとこのエラーを吐きます。

![スクリーンショット 2015-04-28 10.57.42.png](https://qiita-image-store.s3.amazonaws.com/0/57867/4ad5ea2b-e1d3-3080-a7fd-b0aa5b968847.png)

日本語を使用しているSCSSの先頭の行に、`@charset "UTF-8";`を定義すると解決できます。
`@import`で外部SCSSを読み込んでいる場合は、日本語を使用しているファイルのみに定義すれば大丈夫です。

`font-family`の指定などで引っかかる場合が多いので、要注意です。
Live2DのSampleApp1で指定モーション再生

[Live2D Communityの英語フォーラム](http://community.live2d.com/discussion/182/change-motion-by-click-the-button-in-unity)経由で、SampleApp1プロジェクトで指定モーション再生したいけどわからんってあったのでちょっと調べてみた。
前に書いたけどもSampleApp1プロジェクトはLive2D SDKの中で一番難しいやつです。
　→　[Live2DのUnitySDKをコードリーディング](http://qiita.com/naotaro0123/items/790db9c3eb7873110d89)

Unityの場合だけど、他のSDKでもほぼ同じように流用できるかと思います。

#修正箇所
Live2DモデルのGameObjectにアタッチしてるソースに少し追加するだけでＯＫ！
![01.png](https://qiita-image-store.s3.amazonaws.com/0/15028/edd1bf4e-efc6-31ad-ed4c-099815b424cb.png)

以下のコードを末尾に追加するだけ。前にソース解析したからここまでシンプルに！

```csharp:LAppModelProxy.cs
// 指定モーションの再生
public void Motion_Change(){
    model.StartMotion("tap_body", 0, 2);
}
```
model.StartMotionの引数については、以下の通りです。

　・引数1(model.jsonのグループID)

　・引数2(model.jsonのGroupIDの中の再生したいファイル番号)
　![02.png](https://qiita-image-store.s3.amazonaws.com/0/15028/622d4a3e-3932-0984-f33b-945633e4e5a4.png)

　・引数3(優先度。idleモーションが1なので2を渡すとidleモーションより優先される)

あとUGUIのbutton作ってLive2DのGameObjectをセットすると呼べます
![03.png](https://qiita-image-store.s3.amazonaws.com/0/15028/85b9ac61-1b3f-6c5e-8255-20696572a103.png)

![haru1.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/0966c5b3-fee2-7e58-b16b-53d094a39682.gif)


ちなみにLAppDefine.csにデバッグ用のフラグ変数があって、trueにすると当たり判定などデバッグ機能がオンになるので活用して下さい
![04.png](https://qiita-image-store.s3.amazonaws.com/0/15028/edc12bfb-8a19-9608-46bf-cf55bd497a49.png)

**2015/10/29追記**
SampleApp1でDrawMeshモードを使いたい場合、LAppModel.csのInit()で以下のように指定します

```csharp:LAppModel.cs
public void Init(String modelJson)
{
    updating = true;
    initialized = false;

    modelSetting = new ModelSettingJson(modelJson);

    if (LAppDefine.DEBUG_LOG) Debug.Log("Start to load model");

	// Live2D Model
    if (modelSetting.GetModelFile() != null)
    {
        loadModelData(modelHomeDir + modelSetting.GetModelFile());
        // DrawMeshモード
        GetLive2DModelUnity ().setRenderMode (Live2D.L2D_RENDER_DRAW_MESH);

        var len = modelSetting.GetTextureNum();
        for (int i = 0; i < len; i++)
        {
            loadTexture(i, modelHomeDir + modelSetting.GetTextureFile(i));
        }
    }
```
Wordpressの更新で、FTP経由のアップデートを回避する方法

WordPressでは不定期でコアアップデートを促すメッセージが表示されます。

```text:WordPressの更新メッセージ例
WordPress 4.9.4 が利用可能です。 今すぐ更新してください。
```

この記事はこのようにメッセージが表示された際のアップデートに関する対応方法に関する記事です。

# WordPressの更新にFTP経由を要求されるケース
WordPressの更新時にFTP経由のアクセスを求められる場合があります。
<img width="442" alt="WordPressの更新" src="https://qiita-image-store.s3.amazonaws.com/0/1624/27647982-917b-3980-a053-a20d51269f01.png">

この次に、画面に遷移するとFTPのIDとパスワードを要求されます。

<img width="376" alt="WordPress 接続情報" src="https://qiita-image-store.s3.amazonaws.com/0/1624/7f706f1a-c7df-c37b-f908-f9f573ad273d.png">

一方、上記の画面が表示されずFTP経由のアップデートを必要としない場合は、ボタン1つでWordPressを更新できます。

つまり、WordPressは**FTP経由**と**更新ボタン経由**のそれぞれの方法でアップデートできるようになっています。

# FTP経由のアップデートを回避

FTP経由のアップデートを回避したい場合、WordPressのディレクトリのパーミションを変えると回避が可能です。

```bash:コマンドでパーミッションの変更
sudo chown -R apache:apache /var/www/html
```
上記はウェブサーバーのユーザーがapacheで、WordPressのディレクトリは`/var/www/html`に置かれているケースです。

WordPressが置いてあるディレクトリの書き込みのパーミッションを変えればアップデートが可能になります。
sourcemap を使いたい

Chromeのインスペクタでscssが確認できるようにするために、sourcemapを使いたい。
と思って調べてみると、sass側の設定とブラウザ側の設定手順が書かれたものがいっぱい出てくる。
でもこれらはちょっと古い情報。
そもそも現バージョンのChromeには、該当の項目（Experiments の「Sass stylesheet debugging」）がなくなってる。

ということで、gulp-sourcemaps を入れてみる。

```
npm install -D gulp-sourcemaps
```

gulpfile.js にオプションなどを設定する。

```gulpfile.js
var sourcemaps = require('gulp-sourcemaps'); 　←　★（１）

gulp.task('css', function(){
  return sass('./src/scss/', {
    style: 'expanded',// nested, compact, compressed, expanded
    sourcemap: true 　←　★（２）
  })
  .on('error', function(err){
    console.error('Error!', err.message);
  })
  .pipe(sourcemaps.write()) 　←　★（３）
  .pipe(gulp.dest('./public/resources/css'));
});
```

（１）で読み込んで
（２）で sourcemap: true を設定して
（３）で sourceMappingの書き出し。オプションはここで設定する。（※オプション設定の詳細は[こちら](https://github.com/floridoo/gulp-sourcemaps)を参照）

デフォルトではsourceMappingはインラインでCSSファイル末尾に自動で書き出されるが、mapファイルとして生成してそれを読み込ませることもできる。

```gulpfile.js
  .pipe(sourcemaps.write('maps', {         　←　★（１）
      includeContent: false,               　←　★（２）
      sourceRoot: '/public/resources/maps' 　←　★（３）
  }))
```

（１）mapファイルを書き出すディレクトリを指定
（２）オプション「includeContent」(default: true)を false にして
（３）mapファイルへのパスを指定する。


CSS関連のgulp設定まとめ。

```gulpfile.js
//sass
gulp.task('sass', function (){
  return sass('./src/scss/', {
    style: 'expanded',
    sourcemap: true
  })
  .pipe(plumber())
  .on('error', function (err){
    console.error('Error!', err.message);
  })
  .pipe(sourcemaps.write())
  .pipe(gulp.dest('./public/resources/css'));
});


//pleeease
gulp.task('ple', ['sass'], function() {
  return gulp.src('./public/resources/css/*.css')
  .pipe(pleeease({
    sass: true,
    mqpacker: true,
    minifier: false,
    sourcemaps: true,
    autoprefixer: {'browsers': ['last 3 versions', 'ie 8', 'ios 5', 'android 2.3']}
  }))
  .pipe(gulp.dest('./public/resources/css'));
});

//watch
gulp.task('watch', function () {
  gulp.watch('./src/scss/*.scss', ['sass', 'ple']);
});
```
【Express4】pm2でwatchができない時の対処法

#問題

ファイルを編集・更新したら、手動でnodeコマンドを打たなくても自動で更新されるようにpm2を使ってwatchする

以下のコマンドで

```

$ pm2 start bin/www --watch


```

がしかし、public以下は編集するとちゃんと反映されるが、routesとviewsはダメだった。
app.jsやroutes以下のjsファイルも監視してくれなくてハマった。


#node-devを使ってみる

インストールして

```

$ npm install node-dev -g

```

package.jsonを修正する

```json:package.json

  "script":{
    "start" : "node-dev ./bin/www"
  },
```


#うまくwatchできた

一度起動したプロセスを削除して、この状態で再度やってみると

```

$ pm2 start bin/www --watch

```

うまくwatchできた。

#他の方法でも

pm2を使わないでやるなら、シンプルにnode-devだけでもできる。開発の段階ではこれで十分。

```json:package.json

  "script":{
    "start" : "node-dev ./bin/www"
  },
```

として、

```

$ npm start

```

でもwatchできる。
laravel4で404ページを作成中にError in exception handler.が出た時の対処方法

# はじめに
CMSを作成していて、大部分の実装が終わったので、404ページの実装を行おうと思い
404になる部分に対して

```
 App:abort('404');
 ```

で404にしようと思ったら、下記のメッセージがでた。

これがなかなか曲者で、アプリエラーログ、apacheのエラーログに有力なログが落ちず、
Log::error()でどこまで処理が通っているかを地道に調査をするしかなかった。
http://sugi511.hatenablog.com/entry/2014/08/11/Laravel4%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E6%99%82%E3%81%AB%E3%80%8CError_in_exception_handler.%E3%80%8D
http://study-ii.com/2014/08/laravel-error-in-exception-handler/
などに、対処方法があり、app/stroageの権限の問題かなと思いきや、すでに設定済みのため、
上記の方法では解決しなかった。

# 前提
app/config/app.php で 'debug' => falseにする。
app/start/global.php でHTTP errorのハンドリングをするようにしておく。
例えば、

```php
// http error
$data = array();
App::error(function(Symfony\Component\HttpKernel\Exception\HttpException $e, $code){
if(File::exists(app_path() . '/views/errors/' . $code . '.blade.php')){
    switch($code){
        case 404:
            Log::error('case 404');
            break;
        default: break;
    }

    return Response::view('errors.' . $code, $data, $code);
}else{
    Log::error('file exists');
    return Response::view('errors.500', $data, 500);
}
```
のように。

また、views/errors配下に404.blade.php,500.blade.phpを作成しておく。

# 原因
404.blade.phpは以下のように作成した。


```php
@extends('common.layout')

<h1>404 not found</h1>
<h2>ページが見つかりません。</h2>

@stop
```

CMSなので、共通のレイアウトを読むこむようにした。

が、ここで気をつけなければいけないのは、common.layout内で使用している変数。
cssやjsのパスの設定や、CMSなのでログインしているユーザ名のための変数を使用しているが、
エラーハンドリングでは渡していなかったため、Response::viewを行った時に落ちてしまった。

# 対処方法
考えられる対処方法は、いくつもあるけど主に以下の2つ

## 対処方法1
404.balde.phpのレイアウトを変更して、common.layoutを呼ばないようにする。
CMSのレイアウトは捨てて完全に独自の404エラーページを作成してしまう。
欠点としては、cssやjsを使用する場合パスを直で書くことになるため、ファイルパスの変更を行った際に漏れる可能性があること。

## 対処方法2
\$dataに必要な分のデータを入れて渡す。
common.layoutや更にcommon.layoutで読んでいるテンプレート内で使用している変数をすべて
\$dataに入れて渡してあげる。こうすることで、404ページのデザインは変更せずに404ページを作成することができる。

# まとめ
404.blade.phpで他のテンプレートを読んでいる場合は、そこで使われている変数も\$dataに入れて渡してあげないと、落ちるので各種エラーページを作成する際には気をつける。
Windowsで気軽にR (R-Portable)

##　Windows用RのPortable版を使ってみる。

[こちら](http://sourceforge.net/projects/rportable/)を使用しました。 http://sourceforge.net/projects/rportable/

\# GPSにも興味をお持ちの方は、こちらで設定のあと、「[Rで GPSのNMEA形式のデータであそぶ その1](http://qiita.com/mt08/items/22882a9c5d68e31d8168)」や「[その2(GoogleMapにGPSの速度と方角の情報から矢印を描く)](http://qiita.com/mt08/items/9164fa3dedb984754cf6)」もどうぞ

* (追記)Ver.3.2.0でRCurlが対応。(リリース時はインストールできなかったので、3.1.3で記事をかいたんですが)

###　手順
1. ここから、ファイルをダウンロード。
 * http://sourceforge.net/projects/rportable/files/R-Portable/

2. 今回はこちらを使用。実行するとインストール先、というか、解凍先をきかれるので、うまいとこを指定。
 * R-Portable_3.1.3.paf.exe

3. 64bitのRを起動する場合
 *　`インストール先\App\AppInfo\Launcher\` の `R-Portable.ini` をちょいと編集。(`i386 => x64`)
`[Launch]`
変更前: `ProgramExecutable=R-Portable\bin\i386\rgui.exe`
変更後: `ProgramExecutable=R-Portable\bin\x64\rgui.exe`

4. `インストールフォルダ\R-Portable.exe` をダブルクリック。=> `RGui 起動`.
5. Enjoy !!
 * `> install.package("パッケージ名")`で、パッケージのインストール. (起動ごと初回、ダウンロードミラー選択ダイアログが出る => .Rprofileで規定値指定可能 => ぐぐってください)
 * `> library(パッケージ名)`　で、パッケージを使用

### 実行例: マンデルブロ集合(Mandelbrot set)を描画
こちら http://tolstoy.newcastle.edu.au/R/help/05/10/13198.html
1. 必要パッケージをインストール. まずは、ひとつずつ..
`install.packages(fields)`
`install.packages(caTools)`
2. コードをコピペ (元記事のがちょいと崩れてるので、改行を修正したのを↓に)

```r:console
### http://tolstoy.newcastle.edu.au/R/help/05/10/13198.html
### By Jarek Tuszynski, PhD.

library(fields)  # for tim.colors
library(caTools) # for write.gif
m = 400          # grid size
C = complex( real=rep(seq(-1.8,0.6, length.out=m), each=m ), 
             imag=rep(seq(-1.2,1.2, length.out=m),      m ) )
C = matrix(C,m,m)

Z = 0
X = array(0, c(m,m,20))
for (k in 1:20) {
  Z = Z^2+C
  X[,,k] = exp(-abs(Z))
}

image(X[,,k], col=tim.colors(256)) # show final image in R 

write.gif(X, "Mandelbrot.gif", col=tim.colors(256), delay=100) # drop "Mandelbrot.gif" file from current directory on any web brouser to see the animation 
```

Rgui内にグラフの表示と、アニメーションGIFのMandelbrot.gifがRを解凍した先に出力される。
ワークディレクトリ(出力先)は、`setwd("C:/R/workdir/")`コマンドで変更可能。

Mandelbrot.gif
![Mandelbrot.gif](https://qiita-image-store.s3.amazonaws.com/0/75594/0c47410e-e158-cb96-6b5f-ff0d374b37f5.gif)


****

****

****

#### TODO

* `.Rprofile`を `R-Portable.exe`と同じフォルダにおく。
* Rの説明?
* もっと、サンプル?
* RStudio Portable
 * http://sourceforge.net/projects/rportable/files/R-Studio/
 * RStudioPortable_0.98.1103.paf.exe