OmniAICreator/Qiita-1.07M huggingface dataset:
Twitter Fabric(Crashlytics)のAnswersの新機能イベントトラッキング結果例を紹介

[GoogleAnalytics - Twitter Fabric(Crashlytics)のAnswersに追加されたイベントトラッキング機能を導入してみた - Qiita](http://qiita.com/mono0926/items/707096b01f960b06e37a) の続きです。

実際に、プリセットのイベントやカスタムイベントを発行すると、データがどのように見えるのかをご紹介します。
(全てデバッグ実行している開発版のデータなので、母数データが少ないです)

# 全体説明

まず、一覧画面です。
"TODAY'S TOP EVENTS"と書いてある通り、全てが一覧される訳ではないです。(おそらくトップ10が表示される。)
検索窓がありフィルタ可能なので、一覧から漏れているものはそこから見つけます。

また、上から4つアイコンが違いますが、それがプリセットのイベントです。合計で12個用意されています。
ドキュメント: [Answers Events — Fabric iOS latest documentation](http://docs.fabric.io/ios/answers/answers-events.html)
![Screen Shot 2015-07-26 at 11.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/19398/efd73e1d-4df9-7653-a882-354fda168ea8.png)

個別に見ていくと、例えばプリセットイベントのSignUpはこのようになっています。
[Sign Upのドキュメント](http://docs.fabric.io/ios/answers/answers-events.html#sign-up)に書いてある通りに`method`・`success`に値を渡すと結果をカテゴライズしてくれます。
上半分の4つのグラフはどのイベントでも共通で、各指標の推移など見られます。
![Screen Shot 2015-07-26 at 11.29.44.png](https://qiita-image-store.s3.amazonaws.com/0/19398/76b95fa8-efdb-9c9a-038a-e1bc8c99a02f.png)

以下、上半分のグラフは省略しつつ、紹介します。

# Log In
![Screen Shot 2015-07-26 at 11.30.13.png](https://qiita-image-store.s3.amazonaws.com/0/19398/df2256ea-45f7-c0ac-7d1a-9a695bcbd561.png)

# Share
![Screen Shot 2015-07-26 at 11.30.40.png](https://qiita-image-store.s3.amazonaws.com/0/19398/0487ba33-259c-01af-7ba0-11b8002b2464.png)


# Content View
![Screen Shot 2015-07-26 at 11.31.06.png](https://qiita-image-store.s3.amazonaws.com/0/19398/976d69ab-4e8f-aa43-9cba-9e58439e2df3.png)

# 離脱画面(カスタムイベント)

[steipete/Aspects](https://github.com/steipete/Aspects)を使って、`viewDidAppear`のタイミングで直近の`ViewController`名を保持しておいて、`func applicationDidEnterBackground(application: UIApplication)`のタイミングでイベントを投げるようにしました。

![Screen Shot 2015-07-26 at 11.31.29.png](https://qiita-image-store.s3.amazonaws.com/0/19398/13e9b5df-25cd-9618-aab7-e245822c9f1d.png)

# 感想

[Twitter Fabric(Crashlytics)のAnswersに追加されたイベントトラッキング機能を導入してみた、の「今いちなところ」](http://qiita.com/mono0926/items/707096b01f960b06e37a#今いちなところ)に書いた通り、厳密な分析には不向きだと思いますが、日々クラッシュレポートやAnswersのアクティブユーザーなど観察しつつ、ついでにアプリの利用状況をざっくり把握するにはとても良いと思います。
先ほど、[ookami](http://qiita.com/organizations/ookami)の勉強会で展開したところ、とても好評でした(　´･‿･｀)

無料なのも素晴らしいですね。
gomobileでiOS用のライブラリをビルドするまで

```zsh
$ cd
$ brew uninstall go
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
$ vi .zprofile.local
```

```zsh:.zprofile.local
# gvm
[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"
```

* まず、gomobileはGo 1.5以降が必要なので、HomebrewをやめてgvmでGoのバージョン管理をする。

```zsh
$ source .zprofile
$ gvm install go1.4.2
$ gvm use go1.4.2 --default
$ GOROOT_BOOTSTRAP=$GOROOT gvm install go1.5beta2
$ gvm use go1.5beta2 --default
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init -v
```

* Go 1.5のインストールにはGo 1.4以降が必要なので先に1.4.2をインストールする。
* その後`GOROOT_BOOTSTRAP`で1.4.2の`GOROOT`を指定して1.5beta2をインストールする。
* `gomobile init`でiOSやAndroid向けにツールチェーンをインストールしたり標準ライブラリをビルドしたりしているようだ。

```zsh
$ cd $GOROOT/src
$ mkdir gomobile_playground && cd $_
$ mkdir hello
$ vi hello/hello.go
```

```go:gomobile_playground/hello/hello.go
package hello

func World() string {
    return "Hello, world!"
}
```

* `hello`というパッケージをとりあえず書いてみる。

```zsh
$ cd hello
$ gomobile bind -target ios
$ ls
hello.framework hello.go
```

* `gomobile bind -target ios`でパッケージをiOS用のフレームワークにビルドする。

```cpp:hello.framework/Versions/Current/Headers/Hello.h
// Objective-C API for talking to github.com/naoty/gomobile_playground/hello Go package.
//   gobind -lang=objc github.com/naoty/gomobile_playground/hello
//
// File is generated by gobind. Do not edit.

#ifndef __GoHello_H__
#define __GoHello_H__

#include <Foundation/Foundation.h>

FOUNDATION_EXPORT NSString* GoHelloWorld();

#endif
```

* ヘッダーファイルを見てみると、確かに文字列を返す関数が定義されているようだ。
html5

# tag
## aside
aside tag is used for content (such as sidebars) that complements the rest of the page but can also stand alone.
http://www.htmq.com/html5/aside.shtml

## a
target="_blank" is used to get the browser to open the page in a new window or tab.

```
<a href="http://gravatar.com/emails" target="_blank">
```
C言語用のWebSocketライブラリはlibwebsocketsを使うことにしました

Webサーバでないサーバ（C言語）に、HTML5で作られた端末の間で常時通信させるため、C言語版WebSocketのライブラリを探してみたところ、以下の候補が見つかりました。

* [libwebsockets](http://git.warmcat.com/cgi-bin/cgit/libwebsockets/)
* ~~[cwebsocket](https://code.google.com/p/cwebsocket/)~~ GitHubへ移行
* [cwebsocket(GitHub)](https://github.com/m8rge/cwebsocket)

[libwebsockets](http://git.warmcat.com/cgi-bin/cgit/libwebsockets/)はサンプルをすぐに動かすことができましたが、[cwebsocket](https://code.google.com/p/cwebsocket/)は実行できませんでした。~~後者は2010年から更新されていないようですし~~ [libwebsockets](http://git.warmcat.com/cgi-bin/cgit/libwebsockets/)を使うことにしました。

以下、サンプル実行までの様子です。

#付属サンプル実行

##[libwebsockets](http://git.warmcat.com/cgi-bin/cgit/libwebsockets/)

Ubuntu 12.04上でサーバ・サンプルをビルドして動かしてみました。

```text:ビルド
$ cd ~
$ wget http://git.warmcat.com/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.4-chrome43-firefox-36.tar.gz
$ tar xvzf libwebsockets-1.4-chrome43-firefox-36.tar.gz
$ cd libwebsockets-1.4-chrome43-firefox-36
$ mkdir build
$ cd build
$ cmake ..
$ make
$ cd bin
$ ./libwebsockets-test-server --resource_path=~/libwebsockets-1.4-chrome43-firefox-36/test-server
```

サンプルプログラムであるlibwebsockets-test-serverは、resource_pathオプションでは相対パスで無く絶対パスを指定しないダメなようです。

ブラウザを複数立ち上げlocalhost:7681/にアクセスすると、ブラウザ上で手書きメモを共有するサンプルが見られます。ライブラリの中身はこれから見ていきますが、何の苦労も無くスムースにサンプルプログラムを実行できたので好印象です。

##[cwebsocket](https://code.google.com/p/cwebsocket/)

最初からビルド済み実行ファイルを入手できますが、こちらは

```text:クライアント側のエラー
error on websocket!
websocket closed
```

となって処理できないようです。

サーバ側のエラーを見るとOriginがnullとなっているので、XSSチェックでエラーになっている？のかもしれません（よく判っていません）。

```text:サーバ側のエラー
Connected 127.0.0.1:50890
In packet:
GET /echo HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: uzPyBvU3/YJiHaWQWK5yRg==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket


Error in incoming frame
Disconnected
```

[cwebsocket(GitHub)](https://github.com/m8rge/cwebsocket)の方でも同じような結果でした。
ubuntu14にrails4の環境構築

ubuntu14.10にrails4の環境を構築する方法です。

* Apache2

```
$ sudo apt-get install apache2
```

* Gitとかその他インストール

```
$ sudo apt-get install build-essential git curl zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev sqlite3 libsqlite3-dev
```

* rbenvのインストール

```
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
```

* rbenvの設定

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```

* シェルの再起動

```
$ exec $SHELL
```

* ruby-buildのインストール

```
$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git
```

* ruby（2.0.0）のインストール

```
$ rbenv install 2.0.0-p481（時間かかります）
$ rbenv global 2.0.0-p481
```

* railsのインストール

```
$ rbenv rehash
$ gem install rails --no-ri --no-doc （時間かかります）
```

* railsアプリの作成

```
$ rails new アプリ名
```

完成！！！
macでrails4の環境構築

## ■環境設定
・xcodeのコマンドラインツールが入っていない人はインストール（以下のコマンドでプロンプトが出るため、指示に従ってインストール）  

```
$ xcode-select --install
```

・Homebrew（ターミナルから簡単にインストールするためのツール）のインストール（以下のコマンドは１行）  

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

・Git のインストール  

```
$ brew install git
```

・rbenvとruby-buildのインストール  

```
$ brew install rbenv ruby-build
```

・パスの設定  

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile  
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile  
$ exec $SHELL -l  
```


・rubyのインストール  

```
$ rbenv install 2.0.0-p481
```

・Homeディレクトリに移動  

```
$ cd
```

・railsプロジェクトを作成  

```
$ mkdir rails_projects
```

・railsプロジェクトに移動  

```
$ cd rails_projects
```

・rubyのローカルバージョン設定 
 
```
$ rbenv local 2.0.0-p481
```

・rubyのバージョン確認  

```
$ ruby -v
```

・railsのインストール  

```
$ gem install rails --no-ri --no-doc  
$ rbenv rehash
```

・アプリケーションの作成

```
$ rails new アプリ名
```
VyOSでSSHの公開鍵認証を有効にして、パスワード認証を無効にする

# 公開鍵認証の設定

```
loadkey $ユーザ名 $公開鍵ファイル
```

# パスワード認証を無効にする

```
set service ssh disable-password-authentication
```

# SSHv2のみを使う

```
set service ssh protocol-version v2
```
cpp / api > バージョンAPI > IsAtLeast(int major, int minor, int patch); / HasFeature("THREADSAFE")

引用: C++のためのAPIデザイン by マーティン・レディ

APIのバージョン情報を返すための「バージョンAPI」

```cpp:version.h
#include <string>

#define API_MAJOR 1
#define API_MINOR 2
#define API_PATCH 0

class Version
{
public:
    static int GetMajor();
    static int GetMinor();
    static int GetPath();
    static std::string GetVersion(); // return 1.2.0
    static bool IsAtLeast(int major, int minor, int patch);
    static bool HasFeature(const std::string &name);
}
```

IsAtLeast()を提供することで「バージョンXXX以降」の判別を利用者がそれぞれ実装しなくていい。

> 最後がHasFeature()メソッドだ。通常、ユーザがバージョン番号を比較するのは、バージョン番号自体を知りたいからではない。使用したい機能がそのAPIにあるかどうかを特定する識別子として使っているのだ。...たとえばAPIのバージョン2.0.0でスレッドセーフにした場合、「THREADSAFE」という<font color=red>機能タグ</font>を追加しておくと、ユーザは以下のように確認できる。

```cpp
if (Version::HasFeature("THREADSAFE"))
{
...
}
```
技術英語 > I'm on it.

@ Star trek Voyager > エピソード Eye of the needle.

作業を依頼しようとしているキムに対して、すでに着手済みのトレスが言った言葉。

> I'm on it. (やっている)
> Just a few minutes more. (あと2,3分かかる)

<hr>

on 関連で思い出したのは1:

> I'm on my way. (そちらに向かっている)

<hr>
on関連で思い出したのは2:

> Mirror mirror on the wall. Who is the fairest of them all?
...
NSTableView に CustomView を表示させる

メモ。

NSTableView にデータを表示させる方法
http://rakuishi.com/archives/5535/
上記はdataSourceから文字を返すやり方。でも、たいていの人がやりたいのはCellを返すということだと思う。
任意のViewを返すのは、iPhoneと同じくdelegateから返す。
iPhoneと違うところは、カラムがあるところ。

下記の手順で設定する。

- カラム単位でidentifierがあるので、こいつを設定する。
![Screen Shot 2015-07-26 at 6.15.32 AM.png](https://qiita-image-store.s3.amazonaws.com/0/8518/5c82c076-6bc1-930f-cec4-6d1825d24e9c.png)

- delegate先でregisterNib:forIdentifier:する。

```
        NSNib *cellNib = [[NSNib alloc] initWithNibNamed:@"MECategoryTableViewCell" bundle:nil];
        [self.categoryTableView registerNib:cellNib forIdentifier:@"category_"];

        self.categoryTableView.dataSource = self;
        self.categoryTableView.delegate = self;
```
- viewForTableColumn内でmakeViewWithIdentifier:する。

```
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    MECategoryTableViewCell *cell = [tableView makeViewWithIdentifier:@"category_" owner:self];
    [cell.textField setStringValue:[MECategory existCategories][row]];
    return cell;
}
```
qfcというファイルパスを補完してくれるプラグインが便利

##qfc

[qfc](https://github.com/pindexis/qfc)というファイルパスを補完してくれるzsh, bashのプラグインが公開されています。

https://github.com/pindexis/qfc

便利そうなので使ってみました。

インストール方法は以下のような感じです。

- `git clone https://github.com/pindexis/qfc $HOME/.qfc`
- Add the following line to your *rc (.zshrc, .bashrc, .bash_profile in OSX):  
    `[[ -s "$HOME/.qfc/bin/qfc.sh" ]] && source "$HOME/.qfc/bin/qfc.sh"`

これで、`C-f`を押せば候補が表示されます。パスは`Tab`で追加していきます。

##qfcz

似たようなの作れるかも知れないと思い、さっそく[qfcz](https://github.com/syui/qfcz)というやつを作ってみました。`z`の履歴をしようします。あと、インターフェイスは`peco`を利用。

https://github.com/syui/qfcz

```bash:Install
$ git clone https://github.com/syui/qfcz $HOME/.qfcz

$ touch ~/.zshrc && echo '[[ -s "$HOME/.qfcz/bin/qfcz.zsh" ]] && source "$HOME/.qfcz/bin/qfcz.zsh"' >> ~/.zshrc

$ source ~/.zshrc
```

あまり便利でもないのだけど、ファイルパスを選択的に補完します。`C-f`

![](https://raw.githubusercontent.com/mba-hack/images/master/qfcz-screen-ttygif-01.gif)

また、移動しながらパスを補完するやつは、`C-f,C-f`です。

機能は似てるけど内容はぜんぜん違う...。いつか`qfc`のように全部自前でやるツール作ってみたいです。

機能追加とか修正とかがあれば、お願いします。
ウェイト指定のシステムフォントで UIFont を作る

表題ではうまく意味が伝わりにくいかもしれませんが、`+[UIFont systemFontOfSize:]` では指定できなかったシステムフォントのウェイト（太さ）を指定する方法が iOS 8.2 から用意されました。

```objc:UIFont.h
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize weight:(CGFloat)weight NS_AVAILABLE_IOS(8_2);
```

`weight` には `UIFontDescriptor.h` で定義される定数を指定します。

```objc:UIFontDescriptor.h
UIKIT_EXTERN const CGFloat UIFontWeightUltraLight NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightThin NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightLight NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightRegular NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightMedium NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightSemibold NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightBold NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightHeavy NS_AVAILABLE_IOS(8_2);
UIKIT_EXTERN const CGFloat UIFontWeightBlack NS_AVAILABLE_IOS(8_2);
```

なぜ CGFloat 型なのかはわかりませんが、上が極細、下が極太を表しています。これらに対応するウェイトを持つフォントであればそれが採用されます。iOS 8.4ではシステムフォントは Helvetica Neue、日本語はヒラギノ角ゴシックProNです。（iOS 9では San Francisco になります。）
なおiOS 8のヒラギノは Helvetica Neue ほどにはウェイトが無いので一部は区別されないと思われます。

```objc:Sample
UIFont *lightSystemFont = [UIFont systemFontOfSize:20 weight:UIFontWeightLight];
```

任意のウェイトのシステムフォントで表示したい場合にご活用ください。
sinatra-activerecordでproduction環境にrake db:createする

SinatraでActiverecordを使うにあたってsinatra-activerecordというgemを使う際のメモです。

このgemが提供しているrakeファイルを用いてproduction環境にdb:createする方法がわからずにハマってしまいました。
検索して出てくるのはRails環境下でのActiverecordの情報が多いので注意が必要ですね…

それぞれ以下のように環境を指定します。

Rails

```bash
rake db:create RAILS_ENV=production
```

sinatra-activerecord

```bash
rake db:create RACK_ENV=production
```

ちなみに指定しない場合はデフォルトで`development`が選択されます。
おめぇの出番だ、悟飯！

HTMLで保存してchromeブラウザで開いて
↑x↓blyraと入力してください

残念ながら、カカカ…は再現できませんでした。。

```uxdblyra.html
<!DOCTYPE html>
<html>
<title>おめぇの出番だ、悟飯！</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">
var comp_ary = [];
var base_ary = [38,88,40,66,76,89,82,65];// ↑x↓blyra
$( document ).on('keydown', function(event) {
    comp_ary.push(event.keyCode);
    if (comp_ary.length > base_ary.length) {
        comp_ary.shift();
    }
    $('#comp').text(comp_ary.join(","));
    $('#base').text(base_ary.join(","));
    if (comp_ary.toString() == base_ary.toString()) {
       voice_load("カカロットォー");
    }
});

function voice_load(str) {
    var msg = new SpeechSynthesisUtterance();
    msg.volume = 0.4;
    msg.rate   = 0.5;
    msg.pitch  = 0.1;
    msg.text = str;
    msg.lang = 'ja-JP';
    speechSynthesis.speak(msg);
}

</script>
<body>
<p id="base">aaa</p>
<p id="comp">aaa</p>
</body>
</html>
```

# 参考

上X下BLYRAとは (カカロットォとは) [単語記事] - ニコニコ大百科
http://dic.nicovideo.jp/a/%E4%B8%8Ax%E4%B8%8Bblyra
えっ、ブラウザが喋った！スピーチAPIを試してみたよ。【HTML5／Web Speech API】 : フタパパ
http://www.pondad.com/?p=8734
laravel で画像にリンクを貼る方法

ニーズは多いと思うわりには
ディフォルトで見つからないのが、
画像にリンクを貼る方法。

**html_entity_decode**
を指定してあげることで、

**HTML::link**
と
**HTML::image**
の併用が可能になります。

```:記入例
{{ html_entity_decode( HTML::link("/check", HTML::image("/img/picture/btn_codecheck.png", "瞬間コードチェック") ) ) }}
```

または
**URL::to('/')**
を使う方法もあるようです。

```html:記入例
<a href="{{URL::to('/check')}}"><img src={{asset('/img/picture/btn_codecheck.png)}} alt="瞬間コードチェック"></a>
```
RでPostgreSQLにつなぐ


```R
> install.packages('RPostgreSQL')
> library(RPostgreSQL)
> con <- dbConnect(PostgreSQL(), host="localhost", > port=5432, user= "postgres", password="*****", dbname="db_name")
> dbListTables(con)  # テーブル一覧取得
> dbListFields(con, "users")  # usersテーブルのカラム名一覧取得
```

### クエリを実行してデータフレームを得る

```r:R
> con <- dbConnect(PostgreSQL(), host="localhost", port=5432, user="aikawa", password="", dbname="wantedly")
> light_query <- "SELECT * FROM users LIMIT 4"
> data <- dbGetQeury(con, light_query)
> heavy_query <- "SELECT * FROM users"
> rs <- dbSendQuery(con, heavy_query)
> summary(rs)
<PostgreSQLResult:(10272,0,11)> 
  Statement: SELECT * FROM users 
  Has completed? no 
  Affected rows: -1 
  Rows fetched: 0 
> data <- fetch(rs)
> nrow(data)  # 全体はもっと多いのに500行しか取得しない
[1] 500
>  summary(rs)  # summaryはrow fetchedが500になっている
<PostgreSQLResult:(10272,0,11)> 
  Statement: SELECT * FROM users 
  Has completed? no 
  Affected rows: -1 
  Rows fetched: 500 
> data <- fetch(rs)  # 次の500件を取得
> data <- fetch(rs, n=1000)  # 次の1000件, n=-1で全て取得
```



### エラー処理

`dbSendQuery`での結果を取得しfetchすべて仕切らないまま(`dbHasCompleted(rs)`が`FALSE`のまま)、`dbSendQuery`などのクエリを実行すると

```r:R
 Error in postgresqlExecStatement(conn, statement, ...) : 
  RS-DBI driver: (connection with pending rows, close resultSet before continuing)
```

このようなものがでた場合、

```r:R
dbClearResult(rs)
```

もしくは、`rs`など変数に入れなかった場合は、

```r:R
dbClearResult(dbListResults(con)[[1]])
```

とすれば、改めてクエリを実行できるようになる

## REF

https://code.google.com/p/rpostgresql/
Unity5+iOS+Admobの導入方法をまとめているサイト

日本語
http://www.gamefactory.xyz/archives/32062229.html
英語
http://a2dr.blogspot.jp/2015/03/how-to-integrate-admob-into-unity-5-ios.html
Script使い方
https://github.com/googleads/googleads-mobile-plugins/tree/master/unity


日本語の記事は一部間違ってる??
![enable modules.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/ea072634-06f4-a603-c280-191262680929.jpeg)
modulesは写真のように設定しないとエラーが起きる。
(写真は英語の記事にあるやつです)
$state.goでのパラメータの引き渡し方


AngularJSを使っている時にあるURLから異なるURLへパラメータを渡しつつ遷移する時に$state.goを使うと思います。
しかし、私の場合以下の様にコードを書いてみても上手くパラメータが引き渡せませんでした。

````main.controller.js
$state.go('hoge', { parameter: 1 });
````

````hoge.js
$stateProvider
  .state('hoge', {
    url: '/hoge',
    templateUrl: 'app/hoge/hoge.html',
    controller: 'HogeCtrl'
  });
````

で、アレコレ考えた結果以下の様にhoge.jsを変更したら引き渡せました。

````hoge.js
$stateProvider
  .state('hoge', {
    url: '/hoge',
    templateUrl: 'app/hoge/hoge.html',
    controller: 'HogeCtrl',
    params: {'parameter' : null}
  });
````

このコード内でnullをパラメータに入れていますが、nullを省いてみると動きませんでした・・・
これについてはどこにも参考になる文献がありませんでしたので、ご存じの方はコメント欄等でお教え頂けると幸いです。
canvasでng-key◯◯が動かない時の対処法


AngularJSにはng-key◯◯系のモジュールがいくつか存在します。
ng-keyup,ng-keydownなど、JSにもあるonkeydownやらonkeyupと同じようなものですね。

で、このng-key◯◯がcanvas上で動かなかったので色々調べた結果、 __tabindexが必要__ ということが分かりました。

動かなかった時のコードは以下

````main.html
<canvas ng-keydown="hoge($event)"></canvas>
````

これを以下の様に変更しました。

````main.html
<canvas type="text" ng-keydown="hoge($event)" tabindex="0"></canvas>
````

これで、hoge関数がちゃんと動くはずです。
動かないで困っている方はこれを参考に一度やってみてください。
SpriteKitを試してみる12　GameOver


![iphonePlay_2015072601.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/4a85a0a2-1666-c249-5b4d-f47a01f82661.gif "iphonePlay_2015072601.gif")


ゲームオーバーになった時、ゲームを止めてcontinue?をタップするまで画面を止めておきたいのでSKSceneのpausedプロパティにtrueをセットしてやれば動きを止めれる。
だがHomeボタンを押してからアプリに戻ってくるとpausedがfalseになってしまう（初期値に戻る）ので画面が動いてしまう。
対応策としてpausedをオーバーライドして別のpause管理プロパティの値をセットしてやる。


```
    // ゲームストップ
    var stopped : Bool = false
    
    override var paused : Bool{
        didSet {
            if(stopped && !paused) { // このif文がないと実行中にBAD_ACCESSになる
                paused = stopped
            }
        }
    }
```

何故Homeボタンを押したらpausedが解除されるのかは不明。バグのような動きにしか思えないが・・・。

Continue?ラベルをボタンのような動きをさせているのは以下のページ参照
タップされたらゲームオーバー時の設定を全部解除して続きからやれるようにしている。

[サンプルゲーム](http://spritekit.jp/tutorial/example/)
RaspberryPiの冷却

# きっかけ
これまで高温で動作が不安定になることはなかったが少し不安なので対策を考えていた。
小型ファンを取り付ける例は良く見るが、別の方法でやってみたい。

そんな時ふといけるんじゃねってアイテムを見つけた。
[吸引式 ノートパソコン用 熱排出ファン (温度計付き) DN-12372](http://www.donya.jp/item/27208.html)
[古いノートPCの冷却に好適、排気口装着式の冷却ファンを使ってみた](http://www.watch.impress.co.jp/donya/DN-12372.html)
![DSC_0054.JPG](https://qiita-image-store.s3.amazonaws.com/0/54591/aacdeec2-71e8-7a0f-4870-6e0f0c40ae85.jpeg)

# 条件
## 装備
* Raspberry Pi 2
* KSYのケース [RASPIOEMCASEC]
* KSYのヒートシンク [KSYHEATSINKSS]

![DSC_0055.JPG](https://qiita-image-store.s3.amazonaws.com/0/54591/7142f494-1218-fa80-1f21-01fa6b5b772e.jpeg)

## ファン装着
ひっくり返してGPIOピンをいじる穴にどん！
![DSC_0057.JPG](https://qiita-image-store.s3.amazonaws.com/0/54591/2606e125-4467-b16e-1dc2-50198d9503f8.jpeg)


# 測定
温度の測定配下のコマンドにて行う。
`cat /sys/class/thermal/thermal_zone0/temp`
負荷はstressツールにて行う。
[EC2でサーバーに負荷を発生させる stress ツールを使ってみる](http://dev.classmethod.jp/server-side/server/use-stress-tool-on-ec2/)
`stress -c 4`

室温:28°
オーバークロック:`Pi2    1000MHz ARM, 500MHz core, 500MHz SDRAM, 2 overvolt`

## 変更前

|CPU使用率|温度|
|----:|--:|
|20%|55℃|
|100%|72℃|

## 変更後

|CPU使用率|温度|ファン動作モード|
|----:|--:|--:|
|20%|40℃|自動化変|
|100%|43℃|自動化変|
|100%|50℃|MAX固定|

## 結果
低負化時で15℃程度、高負荷時で20-30℃程度下がった。
ファン動作モードをMAX固定にしたとき自動化変より温度が高かったのはRaspberryPi本体から電源をとっていたのが原因と思われる。

# まとめ
## 良かった点
* 想定以上に温度が下がった
* ケース等の加工がいらない

## 悪かった点
* 通常の3倍場所をとる
* ピンがいじれない
* 固定がイマイチ

## 今後の課題
* 埃対策
* ファンを改造して排気にしたらどうなるか
* 固定方法の検討
社内リポジトリのサブディレクトリをgo getするにはrepo名に.gitをつける

Github Enterpriseであれどこであれ、VCSにホストしているGoパッケージは、通常

```
go get <domain>/foo/bar
```

のようなremote import pathにより`go get`することができます。
しかし、この一般的なimport pathでは、go getしたいパッケージがサブディレクトリにあるとき、既定ドメイン(github.comなど)以外、つまり社内リポジトリなどでは、以下のようなエラーが発生します。

たとえば、`<domain>/foo/bar`レポジトリの`sub-dir`ディレクトリをgo getしたい場合、こうなります。

```
go get <domain>/foo/bar/sub-dir
package <domain>/foo/bar/sub-dir: unrecognized import path "<domain>/foo/bar/sub-dir"
```

これは、go getコマンドがimport pathからリポジトリとパスを判別できず、リソースに到達できないことによるものです。

（ここで諦めて`<domain>/foo/bar` を`go get`してもいいのですが、リポジトリトップに.goファイルを置かないプロジェクト構成の場合、`no buildable Go source files `エラーになります）

これを回避するためには、リポジトリ名の後にVCSを記入してあげます。というか、一般的なimport pathはこのVCS名を省略した形だということみたいですね。

```
go get <domain>/foo/bar.git/sub-dir
```

出典：[go - The Go Programming Language](http://golang.org/cmd/go/#hdr-Remote_import_paths)
Amethyst で HelloWorld


[Amethyst](http://codcore.github.io/amethyst/) には Rails での rails コマンドのようなジェネレータはまだないっぽいけど、プロジェクトのスケルトンを作ってくれる amethyst-bin というものがあるようなのでそれを使って HelloWorld してみた。

Sdogruyol/amethyst-bin 
https://github.com/Sdogruyol/amethyst-bin

試した時のバージョンは Crystal 0.7.4, Amethyst 0.1.7。

まずは amethyst-bin のインストール。
ここでは PATH の通っている `~/bin` 以下に入れた。

```shell-session
% curl https://raw.githubusercontent.com/Sdogruyol/amethyst-bin/master/amethyst > ~/bin/amethyst
% chmod +x ~/bin/amethyst
```

amethyst のプロジェクト作成。
`crystal deps` 呼んで依存ライブラリのインストールするところも自動でやってくれる。

```shell-session
% amethyst helloworld 
      create  helloworld/.gitignore
      create  helloworld/LICENSE
      create  helloworld/README.md
      create  helloworld/.travis.yml
      create  helloworld/Projectfile
      create  helloworld/src/helloworld.cr
      create  helloworld/src/helloworld/version.cr
      create  helloworld/spec/spec_helper.cr
      create  helloworld/spec/helloworld_spec.cr
Initialized empty Git repository in /home/akishin/src/crystal/helloworld/.git/
Cloning into '.deps/Codcore-amethyst'...
remote: Counting objects: 2576, done.
remote: Total 2576 (delta 0), reused 0 (delta 0), pack-reused 2576
Receiving objects: 100% (2576/2576), 800.14 KiB | 286.00 KiB/s, done.
Resolving deltas: 100% (1603/1603), done.
Checking connectivity... done.
Cloning into '.deps/spalger-crystal-mime'...
remote: Counting objects: 40, done.
remote: Total 40 (delta 0), reused 0 (delta 0), pack-reused 40
Receiving objects: 100% (40/40), 13.65 KiB | 0 bytes/s, done.
Resolving deltas: 100% (13/13), done.
Checking connectivity... done.
```

プロジェクトのディレクトリに移動。

```
% cd helloworld
```

以下のような構造が生成されている。

```shell-session
% tree
.
├── LICENSE
├── Projectfile
├── README.md
├── libs
│   ├── amethyst -> ../.deps/Codcore-amethyst/src
│   └── mime -> ../.deps/spalger-crystal-mime/src
├── spec
│   ├── helloworld_spec.cr
│   └── spec_helper.cr
└── src
    ├── helloworld
    │   ├── controllers
    │   ├── version.cr
    │   └── views
    └── helloworld.cr

8 directories, 7 files
```

`src/helloworld/controllers` の下に `world_controller.cr` を以下の内容で作成。

```ruby
require "amethyst"
class WorldController < Base::Controller
  actions :hello

  view "hello", "#{__DIR__}/../views"
  def hello
    @name = "World"
    respond_to do |format|
      format.html { render "hello" }
    end
  end
end
```

`src/helloworld/views/hello.ecr` を以下の内容で作成。

```erb
Hello, <%= name %>
```

`src/helloworld.cr` を以下のように編集。

```ruby
require "amethyst"
require "./helloworld/controllers/world_controller"
class HelloworldApp < Base::App
  routes.draw do
    # Here you define your routes e.g
    get "/hello", "world#hello"
    register WorldController
  end
end

app = HelloworldApp.new
app.serve
```

サーバ起動。

```shell-session
% crystal run src/helloworld.cr                                                                                                       (git)-[master] 
[Amethyst 0.1.7] serving application "helloworld" at http://127.0.0.1:8080
```

ブラウザから http://127.0.0.1:8080/hello にアクセスして「Hello, World」と表示されれば OK。
PythonのWebアプリをUnitTestするコードを書く


WebTestモジュールを使うと、WSGIベースのWebアプリをテストするコードを簡単に書くことができます。

## インストール方法
pipでインストールできます。

```bash
sudo pip install webtest
```

## サンプルコード

以下はbottleフレームワークを使った、JSON-RPCサーバ実装の例です。  

#### Webアプリ側
```app.py
from bottle import Bottle, HTTPResponse

HOST='localhost'
PORT=8080
DEBUG=True

app = Bottle()

def makeRes(code, data):
	data['retcode'] = code
	r = HTTPResponse(status=200, body=json.dumps(data))
	r.set_header('Content-Type', 'application/json')
	return r

@app.post('/aikotoba')
def api_aikotoba():
	o = request.json
	if o is None:
		return makeRes('ERR_PARAM', {})
	if not 'kotoba' in o:
		return makeRes('ERR_PARAM', {})
	if o['kotoba']=='山':
		return makeRes('OK', {'henji':'えっ？'}
	else:
		return makeRes('OK', {'henji':'はっ？'}

if __name__=='__main__':
	app.run(host=HOST, port=PORT, debug=DEBUG, reloader=True)
```

#### UnitTest側
```test_app.py
import unittest
import api 
from webtest import TestApp

os.environ['WEBTEST_TARGET_URL'] = 'http://localhost:8080'
test_app = TestApp(api.app)

class ApiTest(unittest.TestCase):
	def test_api_aikotoba1(self):
		res = test_app.post_json('/aikotoba',{
			'kotoba':'山' 
		})
		self.assertEqual(res.json['henji'], 'えっ？')
	def test_api_aikotoba2(self):
		res = test_app.post_json('/aikotoba',{
			'kotoba':'川' 
		})
		self.assertEqual(res.json['henji'], 'はっ？')

if __name__ == '__main__':
    unittest.main()
```

## テスト実施

#### 1.テストサーバを立ち上げます。

```
python app.py
```

#### 2.UnitTestを実行します。

```
python app_test.py
```

#### 3.結果を確認します。

こんな感じで結果が出力されます。

```
..
----------------------------------------------------------------------
Ran 2 tests in 0.079s

OK
```

UnitTestクラスのassertなんちゃらが不一致の場合、下記のような感じで出力されます。

```
.F
======================================================================
FAIL: test_api_aikotoba2 (__main__.ApiTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_app.py", line 16, in test_api_aikotoba2
    self.assertEqual(res.json['henji'], 'はっ？')
AssertionError: 'へっ？' != 'はっ？'
- へっ？
? ^
+ はっ？
? ^


----------------------------------------------------------------------
Ran 2 tests in 0.126s

FAILED (failures=1)

```
Rails - has_many & belongs_to関係を既存のモデルに追加

#既存のモデル

- `Moving`
- `Room`

上記のモデル間に`has_many` & `belongs_to`関係を追加する。

#やり方

##各モデルのテーブルにお互いのidを`foreign_key`として追加し、マイグレートする

`$ rails g migration add_room_to_movings room:references`
下記のマイグレーションが生成される。間違いがないか確認。

```ruby:20150725142417_add_room_to_movings.rb
class AddRoomToMovings < ActiveRecord::Migration
  def change
    add_reference :movings, :room, index: true, foreign_key: true
  end
end
```

`$ rails g migration add_moving_to_rooms moving:references`
下記のマイグレーションが生成される。間違いがないか確認。

```ruby:20150725142845_add_moving_to_rooms.rb
class AddMovingToRooms < ActiveRecord::Migration
  def change
    add_reference :rooms, :moving, index: true, foreign_key: true
  end
end
```

`$ rake db:migrate`

##`has_many`、`belongs_to`を関係するモデルのクラスに追加

```ruby:moving.rb
class Moving < ActiveRecord::Base
  ...
  has_many :rooms, dependent: :destroy
  ...
```

```ruby:room.rb
class Room < ActiveRecord::Base
  ...
  belongs_to :moving
  ...
```

これで完了。

##コンソールで思い通りの振る舞いになっているか確認
`$ rails console --sandbox`
色々試す。本当にこれで良いのかここでよく考える。場合によっては`has_many`, `through`を使えばもっと効率よくデータの管理ができるかもしれない。

##気が変わったら、早いうちにやり直す（許されるなら）

```
$ rails destroy migration add_moving_to_rooms moving:references
      invoke  active_record
      remove    db/migrate/20150725142845_add_moving_to_rooms.rb
```

```
$ rails destroy  migration add_room_to_movings room:references
      invoke  active_record
      remove    db/migrate/20150725142417_add_room_to_movings.rb
```

忘れずに`has_many`、`belongs_to`をモデルのクラスから取り除くこと。

以下のタスクでschemaを更新する。

```
$ bundle exec rake db:drop
$ bundle exec rake db:create
$ bundle exec rake db:migrate
$ bundle exec rake db:seed
```

##`has_many, through`に変更することにした

以下のコマンドで中間テーブルのクラスとマイグレーションをつくる。

```
rails g model MovingRoom moving_id:integer room_id:integer
```

```ruby:20150725172522_create_moving_rooms.rb
class CreateMovingRooms < ActiveRecord::Migration
  def change
    create_table :moving_rooms do |t|
      t.integer :moving_id
      t.integer :room_id

      t.timestamps null: false
    end
  end
end
```

```ruby:moving_room.rb
class MovingRoom < ActiveRecord::Base
end
```

中間テーブルのクラスに`belongs_to`を追加し、モデルを関連させる。

```ruby:moving_room.rb
class MovingRoom < ActiveRecord::Base
  belongs_to :moving
  belongs_to :room
end
```

各モデルクラスに`has_many...through...`を追加し、中間テーブル経由でお互いにアクセスできるようにする。

```ruby
class Moving < ActiveRecord::Base
  ...
  has_many :moving_rooms, dependent: :destroy
  has_many :rooms, through: :moving_rooms
  ...
```
```ruby
class Room < ActiveRecord::Base
  ...
  has_many :moving_rooms, dependent: :destroy
  has_many :movings, through: :moving_rooms
  ...
```

効率よくクエリできるようIndexを追加

```ruby:20150726014749_add_index_to_moving_rooms.rb
class AddIndexToMovingRooms < ActiveRecord::Migration
  def change
    add_index :moving_rooms, :moving_id
    add_index :moving_rooms, :room_id
    add_index :moving_rooms, [:moving_id, :room_id], unique: true
  end
end
```
以上。

#参考資料

- [Rails4のhas_many throughで多対多のリレーションを実装する](http://qiita.com/samurairunner/items/cbd91bb9e3f8b0433b99) by @samurairunner
- http://stackoverflow.com/questions/10301794/difference-between-rake-dbmigrate-dbreset-and-dbschemaload
【AWS】rsyncでEC2インスタンスを同期

バックエンド初心者なので毎回初歩的なことにハマります。今回は表題の覚書。

ELBを使って負荷分散した際、複数のEC2インスタンスの特定ディレクトリを同期したいことがあります。
rsyncを使うのが一般的なようなので、やってみました。


#参考サイト
[同期設定(rsync)を今一度整理してみました](http://qiita.com/mitzi2funk/items/9308db56829d7b4cb90d)
[EC2で冗長化したWordPressをGithubでコード管理、rsyncで同期する](http://wpperson.net/wpcustomize/wpaws/136/)
[rsyncをパスワードなしで実施して、コンテンツの同期やバックアップをする方法](http://blog.ybbo.net/2014/12/16/rsync%E3%82%92%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AA%E3%81%97%E3%81%A7%E5%AE%9F%E6%96%BD%E3%81%97%E3%81%A6%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E5%90%8C/)

結論から言うと以下の２点でハマりました。
    1. 「同期先」、「同期元」を勘違い。
    2. rsyncで使われるポート```TCP 873```をセキュリティグループに追加していなかった。

簡単な流れを以下にざっくりメモ。
①　同期元サーバ（マスタとなる方）にrsync, xinetdをインストール
②　同期先サーバ（スレーブとなる方）にrsyncをインストール
③　該当するEC2インスタンスのセキュリティグループに```TCP 873```ポートを追加
④　同期対処となるファイルのパーミッションを```755```に


<br>
#同期元サーバ（マスタとなる方）にrsyncをインストール
まずはインストール
```# sudo su```
```# yum install xinetd rsync```

インストールできたらxinetdの設定ファイルを編集
```# vi /etc/xinetd.d/rsync```

```
service rsync
{
        disable = no　←変更はここのみ
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}
```

xinetdの自動起動をonにした後スタート
```# chkconfig xinetd on```
```# service xinetd start```

<br>
#同期先サーバ（スレーブとなる方）にrsyncをインストール
まずはインストール
```# sudo su```
```# yum install rsync```

rsyncの設定ファイルを新規作成
```# vi /etc/rsyncd.conf```

以下の通り記述

```
#--------------
# Global options
#--------------
uid           = root
gid           = root
log file      = /var/log/rsyncd.log
pid file      = /var/run/rsyncd.pid
hosts allow   = 10.0.0.0/16 ←VPCのIPアドレス
hosts deny    = *
dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png


#--------------
# Module options
#--------------
[html]
        comment      = rsync server
        path         = /var/www/html
        use chroot    = true
        auth users   = admin ←ユーザを設定していないのでこれはいらなかったかも
        secrets file = /etc/rsyncd.secrets ←ユーザを設定していないのでこれはいらなかったかも
        read only    = false
        exclude      = *.mp
        include      = *.mp30
```

デーモンモードで起動
```# rsync --daemon --config=/etc/rsyncd.conf```

<br>
#該当するEC2インスタンスのセキュリティグループに```TCP 873```ポートを追加
以下のような感じで。

![Screen Shot 2015-07-26 at 12.00.29 AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/69560/b037e07a-973d-b68e-28c9-06025550a54a.jpeg)

<br>
#同期対処となるファイルのパーミッションを```755```に
これは必要だったのかどうかちょっとわからないのですが、というか600が正しいのか？？
600の方が正しい気がしますが、自分は755のままにしてます。

```# sudo chmod -R 755 ファイル名```

<br>
#動作確認
<b>同期元</b>のサーバで以下のコマンドを実行。
```# rsync -avz /var/www/html/ 同期先のPrivate IP::html```

（コマンドオプションについては[こことか](http://webkaru.net/linux/rsync-command/)を参考）


試行錯誤した途上で結構いろいろやってしまっているので、はたしてこの手順が最速だったのかわかりませんが、
こんな感じでサーバの同期ができました。
接続中のsshセッションでportforwardを操作する

AWSを使っていると、ssh を使うことが多い。

お金を掛けてVPNゲートウェイを作成したり、お金を惜しんで手間を掛けてVPNサーバを自前で建てるより、sshでポートフォワードするのが手っ取り早い。VPNはネットワークアドレスの選定が面倒だし。
NATインスタンスとssh踏み台サーバをニコイチしちゃえばコストもお得。

Windows 用の ssh クライアントなら接続中にフォワーディングするポートを追加する場合もGUIのメニューから操作できるけど、同じことを openssh で行う方法。
業界にはMacBook使いの方が多いので、彼らには常識なのかも。


## 構成
EC2上にLinuxサーバがあり、sshで接続できる
EC2上にWindowsサーバがあり、172.30.10.21 というアドレスを割り当ててある

自分は 192.168.1.0/24 のネットワークにいる。
192.168.1.112 というFreeBSDからEC2上のLinuxへssh接続している

192.168.1.0/24 のネットワークから、EC2上のWindowsへRDPしたい

## ssh のサブシェルを開く
ssh でリモートサーバに接続しているときに `~C` を入力すると、sshのサブシェルが開く。ここから、sshクライアントの動作を制御できる。

```shell-session:command-line
[ec2-user@ip-172-30-0-11]22:55% # ~C押下
ssh> 
```

## PortForwardの設定変更
サブシェルに対して、-L,-R,-D といったオプションを、ssh コマンドの引数に渡すのと同じように入力できる。
192.168.1.112 の TCP/33389 へのアクセスを、172.30.10.21 の TCP/3389 にフォワードするには以下のように設定する。

```shell-session:command-line
[ec2-user@ip-172-30-0-11]22:58% # ~C押下
ssh> -L 192.168.1.112:33389:172.30.10.21:3389
Forwarding port.

[ec2-user@ip-172-30-0-11]22:58% 
```
これで、192.168.1.112:33389 にリモートデスクトップ接続するとEC2上のWindowsサーバを操作することができる。

## おまけ
恒久的に設定するなら `.ssh/config` に記載しておく

```shell-session:ssh/config
Host xxx.xxx.xxx.xxx
	User ec2-user
	LocalForward 192.168.1.112:33389 172.30.10.21:3389
```
capistrano3 + capistrano-rails + capistrano3-unicorn でよく使うタスク

# バージョン

| version | 
|:---|
| capistrano 3.4.0 |
| capistrano-rails 1.1.3 |
| capistrano3-unicorn 0.2.1 |

# capistrano タスク

## タスクの確認

```shell-session
$ bundle exec cap -T
```

## デプロイ

-t (--trace) オプションをつけています。どんな順番でタスクが処理されているかがわかるので好きです。

```shell-session
$ bundle exec cap -t production deploy
```

環境変数を渡したい場合、後ろに指定しています。

```shell-session
$ bundle exec cap -t production deploy BRANCH=feature/new-actions
```

## unicorn の停止

```shell-session
$ bundle exec cap -t production unicorn:stop
```

## unicorn の開始

```shell-session
$ bundle exec cap -t production unicorn:start
```

## unicorn worker プロセスを増やす

```shell-session
$ bundle exec cap -t production unicorn:add_worker
```

## unicorn worker プロセスを減らす

```shell-session
$ bundle exec cap -t production unicorn:remove_worker
```
BIP39 MNEMONIC GENERATOR

# BIP39 とは

* 秘密鍵を人間でも覚えられるパスフレーズにすること※１
* 通常は12-24個のフレーズを作るがもっと長くすることもできる

以下の表はENTがビット数、MSが文字の個数の対応表

|  ENT  | CS | ENT+CS |  MS  |
|-------|----|--------|------|
|  128  |  4 |   132  |  12  |
|  160  |  5 |   165  |  15  |
|  192  |  6 |   198  |  18  |
|  224  |  7 |   231  |  21  |
|  256  |  8 |   264  |  24  |

※１
正確には乱数初期化に使うエントロピーをフレーズに置き換えたもの
エントロピーのことをマスターシード(master seed)という。
ビットコインの秘密鍵そのものではない。ほかの用途にも使えると思う。
個人的には管理が大変なsshの鍵ペアとかに使えたら楽できそう。

## jsの実装をインストール

npm install bitcore-mnemonic

## 生成してみる

* ランダムで生成
* 24個のフレーズを生成（256bit）

```
var Mnemonic = require('bitcore-mnemonic');
var code = new Mnemonic(256, Mnemonic.Words.ENGLISH);
console.log(code.toString());
var xpriv = code.toHDPrivateKey();
console.log(xpriv.toString());
```

### ニーモニック

```
sun soap spice bid session bring invest pyramid cruise midnight trust project bulb neck zero invest noble tornado party bean special faint mirror phrase
```

※ ニーモニックからマスターシードが得られる
※ マスターシードからマスター秘密鍵が得られる

### マスター秘密鍵

```
xprv9s21ZrQH143K3MqcfykNnXeLVTNPFhyC8DBK9BUvLVftgffqE7PywFx9s1wjAuCx94nG51mNqX6jRbwJrU4vJNfNDLxUgTtWMEGcCWV736n
```

※ マスター秘密鍵はBIP32の拡張秘密鍵形式

## 復元してみる

```
var Mnemonic = require('bitcore-mnemonic');
var code = new Mnemonic("sun soap spice bid session bring invest pyramid cruise midnight trust project bulb neck zero invest noble tornado party bean special faint mirror phrase", Mnemonic.Words.ENGLISH);
console.log(code.toString());
var xpriv = code.toHDPrivateKey();
console.log(xpriv.toString());
```


## 参考リンク

* https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
* https://dcpos.github.io/bip39/
* https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md


## おまけ

勘のいい人は気がついてると思うけど
考え方は昔のドラクエにあった復活の呪文みたいなもん

こちらはドラクエ２みたいな正しくメモっても復活できないバグは仕込まれてないはず・・・

ゆうて　いみや　おうきむ
こうほ　りいゆ　うじとり
やまあ　きらぺ　ぺぺぺぺ
ぺぺぺ　ぺぺぺ　ぺぺぺぺ
ぺぺぺ　ぺぺぺ　ぺぺぺぺ　ぺぺ

## リンク

仕組みを知りたい場合は以下のサイトへどうぞ

https://tech.bitbank.cc/about-bip39/
checkoutせずにmergeする

参考：[Git checkout and merge without touching working tree](http://stackoverflow.com/questions/1402993/git-checkout-and-merge-without-touching-working-tree)

Gitで、「作業ブランチの変更を別のブランチに反映する」という操作は`merge`でおこなうことができます：  
作業ブランチの名前を`b1`、作業ブランチの変更を反映したいブランチの名前を`b2`とします。
![0001.png](https://qiita-image-store.s3.amazonaws.com/0/62450/b4eb8f44-ba0c-12df-122e-9f86de94581f.png)
「`b2`に`b1`をマージする」ためには、普通

```bash
git checkout b2  # 一度b2をcheckoutして
git merge b1     # b1をマージ
```
としますが、なんらかの理由で`checkout`せずに`b1`を`b2`にマージしたいとします。
例えば、ファイルの変更を感知して自動ビルドを走らせる設定がしてある環境 (あるのか？) では、一度`b2`をcheckoutした段階で`b1`で追加／編集したファイルがワーキングディレクトリから消滅するので自動ビルドが走り、さらに`b2`に`b1`をマージした段階でも消滅したファイルが追加され自動ビルドが走ってしまいます。

これを避けるためには、直接`b2`に`b1`の変更を取り込もうとするのではなく、`b1`に`b2`の変更を取り込んでから、`b2`のコミットを進めてしまえば良い：
(1) `b1`に`b2`の変更を取り込む：

```bash
# b1上で
git merge b2
```
![0002.png](https://qiita-image-store.s3.amazonaws.com/0/62450/0e04bd8e-bf66-c89f-aafb-88b4ff46d493.png)

(2) `b2`を`b1`へfast-forwarding

```bash
# b1上で
git fetch . b1:b2
```
![0003.png](https://qiita-image-store.s3.amazonaws.com/0/62450/798d1757-036e-be01-16fb-6333fe7468c4.png)

これで`b2`へcheckoutすれば、実際には`b1`に`b2`をマージしたにもかかわらず、`b2`に`b1`をマージしたのと実質同様の操作が行えたことになります。

ポイントは、`fetch`は`merge`と違い、対象元のブランチ／対象先のブランチを各々指定できることです。
ちなみに、最初の時点ですでに`b2`が`b1`へfast-forwarding merge可能である場合、(1)をおこなう必要はなく、いきなり(2)でOKです。
awsでgitサーバー構築

# authorized_keys方式でユーザーの認証

## サーバーへアクセス
```bash
# localのssh暗号機を送っておく
[local@instance ~]$ scp -i xxx.pem ~/.ssh/id_rsa.pub ec2-user@xxx.com:/tmp/id_rsa.xxx.pub
# サーバーへアクセス
[local@instance ~]$ ssh -i xxx.pem ec2-user@xxx.com
```

## gitユーザー作成
```bash
# rootユーザーに切り替え
[ec2-user@instance ~]$ sudo su -
# ユーザー作成
[root@instance ~]$ adduser git
# パスワード設定
[root@instance ~]$ passwd git
# ユーザgitにsudoを許可する。(任意)
[root@instance ~]$ vi /etc/sudoers
（下記を追記）
git    ALL=(ALL)       ALL
```

## 空のリポジトリを作成
```bash
[root@instance ~]$ su git
[git@instance root]$ cd ~
[git@instance ~]$ mkdir project.git
[git@instance ~]$ cd project.git
[git@instance project.git]$ git --bare init
```

## localのSSH公開鍵をgitサーバーのauthorized_keysに追加
```bash
# .sshディレクトリ作成
[git@instance ~]$ mkdir -p ~/.ssh
# SSH公開鍵をauthorized_keysに追加
[git@instance ~]$ cat /tmp/id_rsa.xxx.pub >> ~/.ssh/authorized_keys
```

# .sshの権限設定
```bash
[git@instance ~]$ chmod 600 ~/.ssh/authorized_keys
[git@instance ~]$ chmod 700 ~/.ssh
```

## localからpush, pullしてみる
### 1回目のユーザーの場合
```bash
[local@instance ~]$ mkdir project
[local@instance ~]$ cd project
[local@instance project]$ git init
[local@instance project]$ echo initial commit >> README.md
[local@instance project]$ git add .
[local@instance project]$ git commit -m "initial commit"
[local@instance project]$ git remote add origin git@xxx.com:/home/git/project.git
[local@instance project]$ git push origin master
[local@instance project]$ git pull origin master
```
### 2回目以降のユーザーの場合
```bash
[local@instance ~]$ git clone git@gitserver:/home/git/project.git
[local@instance ~]$ cd project
[local@instance project]$ echo second commit >> README.md
[local@instance project]$ git commit -am 'second commit'
[local@instance project]$ git push origin master
[local@instance project]$ git pull origin master
```

> 参考サイト
https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97
AnsibleでGitlab構築(nginx MariaDB CentOS7 unicorn)

業務でGitを使うときになかなか GitHub Enterpriseまでは手が出せません。
そこで、GitLabを使ってみるのですが既に用意されているOmnibus GitLabは一発インストールである反面既にnginxがインストールされている環境ですと重複してインストールされてしまいます。

GitLabだけなんとか入れたいと思い構築をしたものの、本番環境以外にバックアップ環境やテスト環境も作成したいので手順を再利用したくAnsibleで手順を書いてみました。
サブディレクトリでの運用やリバースプロキシに対応できるようにしています。
## 対象サーバーGitLab動作環境
CentOS7 (vagrant + virtualbox, VMWare ESXiで確認)
## 対象サーバーOSに事前に設定しておくもの
### SELINUX
別のAnsibleのロールで以下のようにしています。

```lang:yaml
# SELINUX
- name: Install libselinux-python
  yum: name=libselinux-python state=present
- name: disabled selinux
  selinux: state=disabled
- name: Disable selinux
  selinux: policy=targeted state=disabled
```
### rootユーザー SSH公開鍵認証の準備
対象サーバにSSH公開鍵認証方式でrootユーザーがログイン出来るように準備してください。

## yumで対象サーバーに事前に入れておくもの
- Postfix
- Ruby
- Git
- MariaDB
- nginx

## 実行後にインストールされるもの
- rails
- unicorn
- redis

## Ansible ソースコード
https://github.com/euledge/ansible-role-gitlab_centos7

## 構築時にハマったこと
cloneしたGitLabにGemfileがあり bundle install する手順があるのですが、依存するgemが不足していましたので
Gemfile.localに

```
gem 'charlock_holmes', '0.6.9.4'
gem 'execjs'
```
を追加してbundleするようにしました。
併せてexecjsが必要とする nodejs と npm をyumで事前にインストールしています。


## 参考にしたサイト
GitLabをCentOS7にインストールしてみた by @supertaihei02 on @Qiita http://qiita.com/supertaihei02/items/8c7b12b406cb6a1517a2
Ansibleで作るGitlab+Redmine by @volanja on @Qiita http://qiita.com/volanja/items/8362beb5a929a07afee4
GitLab Community Edition Installation from source https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md
OPアンプ > 反転増幅回路 > 抵抗比の拡大を防ぐ方法

引用: オペアンプ基礎回路再入門 by 岡山努さん

> 利得が-1000倍の増幅器を設計しますと、R2/R1が1000になることを意味します。

> 抵抗比を広げないで、反転増幅器の電圧利得を上昇させる方法...

![schemeit-project.png](https://qiita-image-store.s3.amazonaws.com/0/32870/910d06b6-cf78-43fb-9af5-ebcfd198a118.png)

> この回路は出力電圧VOをR3, R4で分圧してから帰還をかけています。...R4の電圧のほぼ(1 + R4 / R3)倍が出力電圧V_Oになります。
material design lite と turbolinks

- 当方、デザイナー。ポートフォリオサイトをRailsで作ってみようといろいろ挑戦中。
- そこにタイミングよく(?) [material design lite](http://www.getmdl.io/) が出たので取り込んでみる。
- で、

# 困った
- rails の turbolinks と相性が悪く、mdl-js系が全て初回読み込み時しか効かない。
- リプル効果とかアニメーションが初回しか効かない。ヘッダの固定も。

# 分からないなりに調べた
- turbolinks は window.load とかダメらしい。
- material.jsの中身を覗くと如何にもな箇所が

```js:material.js
window.addEventListener('load', function() {
```

- しかし、その後、特に具体的な解決策には出会えずじまい。
- でも、

# 勘で書いてみたら動いた。

- 上記部分を以下のように書き換えた。

```js:material.js
$(document).ready(function(){
  load();
});

function load() {
```

- ちなみに、[jquery.turbolinks](https://github.com/kossnocorp/jquery.turbolinks) 使ってます。

# 最後に
- とりあえず動いたけど、これが良い回避策かどうかは分からないです。
superiorメソッド(Javascript The Good Parts掲載)とjQuery　不具合発生

```html:画像をロードするコード

<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>test</title>
<style type="text/css">
</style>
<script type="text/javascript" src="jquery-1.11.1.min.js"></script>
<script type="text/javascript">

Function.prototype.method = function (name, func) {
  if (!this.prototype[name]) {
    this.prototype[name] = func;
    return this;
  }
};
//↓があると不具合がでる
Object.method('superior', function (name) {
    var that = this,method = that[name];
    return function (  ) {
        return method.apply(that, arguments);
    };
});

function loadImage() {
  var img = new Image();
  $(img).load(function() {   
    $(this).hide();
    $('#loader').append(this);
    $(this).fadeIn();
    $("#result").html('成功!');//表示されない 不具合
  }).error(function() {
    $("#result").html('失敗!');
  }).attr('src', 'test.jpg');
}

$(function() {
    //このクリックイベントが最初の1回目のクリックでしか動かない
    $('#btnLoad').click(function(){
        $('#loader').empty();
        var t = setTimeout(loadImage, 1000);
    });
});

</script>
</head>
<body>

<div id="result">
</div>

<br/>

<button id="btnLoad">
Load Image!
</button>

<div id="loader">
</div>   

</body>
</html>

```

##解説
Javascript The Good Partsにsuperiorメソッドの定義が掲載されているが、このsuperiorメソッドの定義を書き、jQueryを使ったコードを書くと不具合が出た。superiorメソッドの定義を消すと正常に動作する。グーグルクロームのwebコンソールでのエラーメッセージは次の通りである。

```

Uncaught TypeError: (ec[b] || []).concat is not a function

```

superiorメソッドの定義を記述したままで正常に動かすには、Function.prototype.methodを次のようにObject.definePropertyを使ったものに変えると正常に動くが、enumerableをtrueにすると、同じ不具合になる。

```js:

//コード1
Function.prototype.method = function (name, func) {
  if (!this.prototype[name]) {
    this.prototype[name] = func;
    return this;
  }
};

//コード2
Function.prototype.method = function (name, func) { 
  if (!this.prototype[name]) {
    Object.defineProperty(this.prototype, name,{value: func, enumerable:false });
    return this;
  }
};

```

これらの結果から、enumerableプロパティ属性は、プロパティが for...inで列挙するので、オブジェクトでのプロパティ列挙にsuperiorが現れることが不具合発生の原因になるってことかな。[If using JQuery, Careful adding Methods to Object][1]に何かいいこと書いてそうだけど英語がろくにわからないからよく分かりません。

Function.prototypeって、いじると他に影響が出ることがあるって話は聞いたことありましたが、このような不具合には、私はお手上げ状態です。Function.prototypeをいじる系のコードは私は、Good parts掲載のあるものしか使ったことがなく、よく理解出来ていません。どなたか詳細な解説をしていただけたら嬉しいです。

###　Function.prototype.methodの疑問点

 - Function.prototype.methodはコード1からコード2に変えたほうがいいのだろうか？
 - this.prototype[name] = func;とObject.defineProperty(this.prototype, name,{value: func, enumerable:true });は同じなのであろうか？

###

##



##参考文献
Douglas Crockford 著 水野貴明 訳『JavaScript:The Good Parts』(オライリー・ジャパン発行、2008) p62-63
[If using JQuery, Careful adding Methods to Object][1]
[+ JavaScript の質問用スレッド vol.108 +][2]
[1]:http://tcoztechwire.blogspot.jp/2012/01/if-using-jquery-careful-adding-methods.html
[2]:http://toro.2ch.net/test/read.cgi/hp/1378462421/
フォームのボタンでaction先を変更するときのベストプラクティス

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A7action%E5%85%88%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/)をご覧ください😀

毎回どう実装しようか迷うので
これからは下記で統一しようと思います。
※jQueryを使用


## jsは汎用的に。
```lang:javascript
$('.submit').click(function() {
  $(this).parents('form').attr('action', $(this).data('action'));
  $(this).parents('form').submit();
});
```

## HTMLはこんな感じ。
```lang:html
<form action="regist.php" method="POST">
  <button class="submit" data-action="regist.php">登録する</button>
  <button class="submit" data-action="input.php">入力画面に戻る</button>
</form>
```

+ data-actionに遷移先URLを設定
+ class="submit"を付与することでjsが起動します

※formのactionはjsで書き換えられるので何でもOKかと。

ステキです。
vagrantで構築した仮想環境（vm）にSSHログイン設定（not vagrant ssh）

正直自分用メモです、あしからず。

##　やりたいこと
```
vagrant ssh 
```
ではなく、

```
ssh username@hostname　#要は、公開鍵認証
```
みたく、ログインできるようにしたく。。。
※ログインユーザーは事前にvm側で作成してあるものとする

## 手順
```code:ホストマシン作業
$ vagrant up
$ vagrant ssh-config --host hostname # ssh接続情報表示
Host hostname
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile 
$ vagrant ssh-config --host hostname >> ~/.ssh/config # confに設定
$ ssh username@hostname　#sshログイン
username@hostname's password:
Last login: Sat Jul 25 20:37:08 2015 from 192.168.33.1
[username@hostname ~]$
```

### 参考
* [VagrantインスタンスにSSHでログインする](http://qiita.com/y_arakawa/items/7bb292c999873032e6a4)
NavigationBarに下線をつける

NavigationBar に下線をつけるカテゴリを作った。

```objc:UINavigationBar+BottomBorder.h
#import <UIKit/UIKit.h>

@interface UINavigationBar(BottomBorder)

-(void)addBottomBorder;

@end
```


```objc:UINavigationBar+BottomBorder.h

#import "UINavigationBar+BottomBorder.h"

@implementation UINavigationBar(BottomBorder)

-(void)addBottomBorder{
    CALayer *border = [CALayer layer];
    border.borderColor = [UIColor blackColor].CGColor;
    border.borderWidth = 1;
    border.frame = CGRectMake(0,
                              CGRectGetHeight(self.frame),
                              CGRectGetWidth(self.frame),
                              1);
    [self.layer addSublayer:border];

}

@end
```


NavigationViewController のRootViewController でaddBottomBorder を呼び出せば下線を引ける。
線を引く場所は変更可能