OmniAICreator/Qiita-1.07M huggingface dataset:
AtomでのGo言語開発環境セットアップ


社内からの圧力でこの記事を書いています。（冗談）

# 前提環境
他の環境で動かなかったらゴメンナサイ。

* Mac Yosemite
* go version go1.4.2 darwin/amd64 (`brew install go`)

Goの基本的なインストールは済んでいるものとします。
※Goのインストール、GOPATH, GOROOTの設定 など。他の記事などをご参考に！！

# atom package をインストールする前に

goのツール関連をインストールしていきます。

```bash
$ go get -v golang.org/x/tools/cmd/goimports # -> gofmtの拡張コマンド
$ go get -v github.com/golang/lint/golint # -> linter
$ go get -v github.com/nsf/gocode # -> コード補完
$ go get -v github.com/rogpeppe/godef # -> 定義ジャンプ
$ go get -v github.com/redefiance/go-find-references # -> 参照コードをリストしてくれます
```

# インストールするatom package

## autocomplete-plus
設定デフォルトのまま。

## go-plus

### 設定項目
ある程度環境設定ができていれば、設定しなくてもいいかもしれません（僕は心配症なので）
![スクリーンショット 2015-05-11 15.47.26.png](https://qiita-image-store.s3.amazonaws.com/0/4239/81e7c4f1-f6dc-480a-0bec-b1022c15904c.png "スクリーンショット 2015-05-11 15.47.26.png")

### 操作

* 文字を入力すると候補値が出ますので、選択したい候補値を選び、`tabキー`で補完してくれます。
* lintは上の設定だと保存時に警告を出してくれます。

## godef
設定デフォルトのまま。
定義ジャンプは、カーソルを上においた状態で`ctrl + i`

## go-find-reference

### 設定項目

![スクリーンショット 2015-05-11 15.50.09.png](https://qiita-image-store.s3.amazonaws.com/0/4239/23349c21-809d-899e-7f07-6dbada1f28dd.png "スクリーンショット 2015-05-11 15.50.09.png")

`command + shift + p`から、`go find reference:toggle`
もしくは`alt + shift + r` 


# 最後に
これでうまく動かない場合はぜひコメ欄で教えて下さい。さらの状態のMacでトライしておりませんで。。
lombok.valを使ってローカル変数の型宣言を省略する

# ローカル変数の型宣言を省略

lombokは、導入するとアノテーションでいくつかのコードや宣言を省略できる強力なライブラリです。Javaはローカル変数もきちんと型宣言しますが、これも省略が可能になります。

## ローカル変数はvalで略記可能

例えばデータベースに対して検索条件を指定し、検索した結果を返すServiceクラスと、検索結果を一部加工してから画面へ出力するActionクラス、この2つを作るとします。

また、Serviceクラスが返す検索結果は、```List<Map<String,Object>>```で返されるとします。

このとき、通常のActionクラスは次のようになるでしょう。
※Actionクラスから画面へ値を渡す処理、ならびに加工処理は省略しています。

```java:BeforeAction.java
public class BeforeAction {
	public String start() throws Exception {
		// Serviceクラスの呼び出し
		List<Map<String,Object>> resultList = service.execute("param");

		// resultListに何らかの加工処理.....
		
		// 画面へ渡す処理....
		
		// 処理終了
		return SUCCESS;
	}
}
```

resultListの宣言部にも、Serviceクラスのexecuteメソッドの実行結果と同じ宣言にします。ここの宣言部はIDEなどで自動補完することもできますが、lombokを使うことで次のように省略できます。

```java:AfterAction.java
import lombok.val;

public class BeforeAction {
	public String start() throws Exception {
		// Serviceクラスの呼び出し
		val resultList = service.execute("param");

		// resultListに何らかの加工処理.....
		
		// 画面へ渡す処理....
		
		// 処理終了
		return SUCCESS;
	}
}
```

このように、他クラスの実行結果を受け取るローカル変数に対し、型宣言をコードから省略できました。Scalaっぽいですね。
【TypeScript】dtsmをCIで使う

# dtsmとは
[**dtsm**][dtsm]は**@vvakame**さん製のTypeScript型定義ファイルをいい感じに管理するツール（c.f. JSのnpmやbower，Rubyのbundler）．
[tsd][tsd]というデファクトスタンダードみたいなやつもあるが，サブコマンドが難しくて覚えられない…．[dtsm][dtsm]はサブコマンドがnpmやbower等と同じになってるのでとても良い:rabbit2:
詳しくは[@vvakameさんのQiita記事][dtsm-qiita]参照．

## dtmsを利用する上での課題
`dtsm.json`が`package.json`や`Gemfile`の役割を果たすが，環境によって利用する`*.d.ts`を分けることが出来ない（c.f. npmの`devDependencies`, bundlerの`group :test`）．
そして，`*.d.ts`はちょっとしたことですぐに競合する（e.g. `node/node.d.ts`と`angularjs/angular-mocks.d.ts`の`module`）．
こうなると，`bundle.d.ts`（`dtsm install`したファイルが全部referenceされるやつ）をそのまま読み込むとtscが通らなくなる．

```
typings/angularjs/angular-mocks.d.ts(21,13): TS2403: Subsequent variable declarations must have the same type.  Variable 'module' must be of type '{ exports: any; require(id: string): any; id: string; filename: string; loaded: boolean; parent: ...', but here has type '(...modules: any[]) => any'.
```

CI環境で`dtsm install`を実行すると，`bundle.d.ts`が全部上書きされる．これをそのまま`karma.conf.js`等で読んでしまうと死ぬことになる（`typings`以下をignoreしている場合の話）．


## 対策: `dtsm.json`の分割
たとえば，`dtsm.json`と`dtsm.test.json`に分割する．
`karma.conf.js`で`dtsm.test.json`が吐く方の`bundle.d.ts`を読むようにすればテストが落ちることもなくなる．

```shell-sessions
$ dtsm init --config dtsm.json
$ dtsm init --config dtsm.test.json 
```

`dtsm.test.json`の生成後，少なくとも`bundle`の変更は忘れずに（`dtsm.json`と被ってたら意味なくなる）．

`dtsm.test.json`に定義ファイルを追加する際は，`--config`オプションを**`dtsm`と`install`の間に**付与する．

```shell-sessions
$ dstm --config dstm.test.json install angularjs/angular-mocks.d.ts
```

`dtsm`本体のオプション（e.g. `--config`）がサブコマンド（e.g. `install`）より後ろに来ると動かないので注意．


## そもそも…
* もしかして`typings/*.d.ts`をignoreするのが良くなかったりする？
* コンパイル前の`*.ts`をCIに投げ渡すのがよくない？
* コンパイル後の`*.js`もignoreせずにcommitすべき？

JavaScriptむずかしい．

# References
* [vvakame/dtsm][dtsm]
* [dtsmのご紹介 - Qiita][dtsm-qiita]
* [TypeScriptリファレンス Ver.1.0対応](http://amzn.to/1K0PJfq)
* [TypeScript in Definitelyland](https://techbooster.booth.pm/items/75031)

[dtsm]: https://github.com/vvakame/dtsm
[dtsm-qiita]: http://qiita.com/vvakame/items/38b953ab0f4de63cce8b
[tsd]: https://github.com/DefinitelyTyped/tsd
node-inspectorで普段のPORT設定でExpressをデバッグする

サーバーをデバッグオプション付きで起動する。ポートも指定できた。

```
PORT=8080 node --debug bin/www and then start the node-debugger bin/www
```

次にnode-inspectorを起動、デフォルトで8080を使おうとするので指定してあげる。指定しないと先のサーバーが8080なのでinspectorがコケる。

```
node-inspector --web-port=8081
```

親切にデバッグページを教えてくれるのでその通りのURLをブラウザに貼り付ける

```
Visit http://127.0.0.1:8081/debug?ws=127.0.0.1:8081&port=5858 to start debugging.
```
swiftのREPLとswiftファイル実行 [MacOSX]

`swift` REPLと `swift`ファイルを直接実行する。prototype、勉強、hackの時に便利です

### 環境は MacOSX 

#### REPL
```bash
$ xcrun swift
Welcome to Swift!  Type :help for assistance.
  1>
```

`swift`ファイルを実行する

```bash
$ cat hello.swift
println("hello world!")
```

```bash
$ xcrun swift hello.swift
hello world!
```
robot.respondでmsg.matchを使う場合は単一でもキーワードを()で囲まなければならない

# 結論
`robot.hear`の場合はいつでも`msg.match[0]`で入力を取得できるが、
`robot.respond`の場合は`msg.match[0]`には呼び出すためのHubot名まで入ってしまい、()で囲まなければHubot名が取り除かれた入力の`msg.match[1]`が生成されない。


# 正規表現

## respond

```coffeescript
module.exports = (robot) ->
	robot.respond /.*/i, (msg) ->
		console.log(msg.match)
```

```
Hubot> hubot aaa
[ 'hubot aaa', index: 0, input: 'hubot aaa' ]
```

```coffeescript
module.exports = (robot) ->
	robot.respond /(.*)/i, (msg) ->
		console.log(msg.match)
```

```
Hubot> hubot ttt
[ 'hubot ttt', 'ttt', index: 0, input: 'hubot ttt' ]
```

## hear

```coffeescript
module.exports = (robot) ->
	robot.hear /.*/i, (msg) ->
		console.log(msg.match)
```

```
Hubot> ccc
[ 'ccc', index: 0, input: 'ccc' ]
```

```coffeescript
module.exports = (robot) ->
	robot.hear /(.*)/i, (msg) ->
		console.log(msg.match)
```

```
Hubot> bbb
[ 'bbb', 'bbb', index: 0, input: 'bbb' ]
```

# 完全一致

## respond

```coffeescript
module.exports = (robot) ->
	robot.respond /test1/i, (msg) ->
		console.log(msg.match)
```

```
Hubot> hubot test1
[ 'hubot test1', index: 0, input: 'hubot test1' ]
```

```coffeescript
module.exports = (robot) ->
	robot.respond /(test2)/i, (msg) ->
		console.log(msg.match)
```

```
Hubot> hubot test2
[ 'hubot test2', 'test2', index: 0, input: 'hubot test2' ]
```

## hear

```coffeescript
module.exports = (robot) ->
	robot.hear /test3/i, (msg) ->
		console.log(msg.match)
```

```
Hubot> test3
[ 'test3', index: 0, input: 'test3' ]
```

```coffeescript
module.exports = (robot) ->
	robot.hear /(test4)/i, (msg) ->
		console.log(msg.match)
```

```
Hubot> test4
[ 'test4', 'test4', index: 0, input: 'test4' ]
```

# 躓き経緯
今までは`/hoge (.*)/`のような使い方しか見てなかったので、正規表現のみの場合は()は不要と考えていたし、`robot.hear`で正規表現だけのものでは()が無いことがあった。
`robot.respond`かつ正規表現のみの入力を利用する場面が今回が初だった。
cronolog で nginx のアクセスログをローテート

## cronolog のインストール

```shell-session
$ sudo yum -y install cronolog --enablerepo=epel
```
```shell-session
$ which cronolog
/usr/sbin/cronolog
```

## cronolog の使い方

http://linux.die.net/man/1/cronolog

```shell-session:30秒間隔でローテート
$ cronolog --period=30seconds access.log
```

```shell-session:30分間隔でローテート
$ cronolog --period=30minutes access.log
```

```shell-session:2時間間隔でローテート
$ cronolog --period=2hours access.log
```

```shell-session:2日間間隔でローテート
$ cronolog --period=2days access.log
```

```shell-session:2週間間隔でローテート
$ cronolog --period=2weeks access.log
```

```shell-session:2ヶ月間隔でローテート
$ cronolog --period=2months access.log
```

## cronolog で出来ないこと

```shell-session:120分間隔でローテート
$ cronolog --period=120minutes access.log
※60分を超える時間は指定できない。
```

```shell-session:120秒間隔でローテート
$ cronolog --period=120seconds access.log
※60秒を超える時間は指定できない
```

```shell-session:7分間隔でローテート
$ cronolog --period=7minutes access.log
※60分で割り切れない時間は扱えない
```


## nginx の設定

```/var/log/nginx/access.log``` を [mkfifo](http://linuxjm.osdn.jp/html/LDP_man-pages/man3/mkfifo.3.html) でパイプにして、実際のログは ```/var/log/nginx/access.log.%Y-%m-%d.%H.%M``` に出力するようにする。

```shell-session:/etc/init.d/nginx
　：
　：

cronolog="/usr/sbin/cronolog"
logdir="/var/log/nginx"

　：
　：

cronolog_start() {
    if ! [ -p $logdir/access.log ]; then
       rm -f $logdir/access.log
       mkfifo $logdir/access.log
    fi

    /bin/sh -c "/bin/cat $logdir/access.log | $cronolog --period=30minutes $logdir/access.log.%Y-%m-%d.%H.%M &"
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    cronolog_start || exit 7  ← これを追記
　　：
　　：
}
```

## アクセスログ

アクセスログはこんな感じになります。

![スクリーンショット 2015-05-11 15.01.29.png](https://qiita-image-store.s3.amazonaws.com/0/39929/cf3b81bf-31d8-904d-623c-aaa1ef23f197.png)
ラジオボタン選択肢で送信ボタンのアクティブ/非アクティブ状態を変更

#ラジオボタンからアクティブにするボタンを変更する

どこにでもあるとおもいますが自分がわりと多く使うのでメモ．
選択肢によって送信フォームのボタンの状態を変えたい時に使えます．
特定の入力欄を入力していない場合にはボタンをdisabledにする等に応用が可能です．

> 注意：一部BootStrapを使用した表記になっています．

Javascript部分

```
<script type="text/javascript">
function changeDisabled() {
    if ( document.send_form["inlineRadioOptions"][1].checked ) {
        document . send_form["ng"] . disabled = false;
        document . send_form["ok"] . disabled = true;
    } else {
        document . send_form["ok"] . disabled = false;
        document . send_form["ng"] . disabled = true;
    }
}
window.onload = changeDisabled;
</script>
```

HTMLは下記のように記述します

```
    <form action="sendmai/result/" method="post" name="send_form" role=form>
        <div class='form-group'>
            <div class="has-success">
                <label class="radio-inline">
                    <input type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1" checked onClick="changeDisabled()"> YES!
                </label>
            </div class="has-success">
            <div class="has-error">
                <label class="radio-inline">
                    <input type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2" onClick="changeDisabled()"> NO!
                </label>
            </div class="has-error">
            <button type="submit" class="btn pull-right btn-success btn-lg" name="ok">Send</button>
            <button type="submit" class="btn pull-right btn-danger btn-lg" name="ng">Cancel</button>
        </div>
    </form>
```
ChefでNetAppを管理する方法

# はじめに
Chef-soloを使用してNetAppのストレージを管理する方法について記載する

# 前提
OS：Clustered Data ONTAP 8.2
NetApp Manageability (NM) SDK：5.2.2
Chefの環境が構築されていること

# インストール
1 netapp cookbookをinstall

```
knife cookbook site install netapp
```

2 SDKの配置
SDKを[ダウンロード](http://mysupport.netapp.com/NOW/cgi-bin/software?product=NetApp+Manageability+SDK&platform=All+Platforms)、ファイルを解凍してnetapp-manageability-sdk-5.2\lib\ruby\NetApp配下のファイルをcookbooks/netapp/libraries/にアップロードする


3 NaServer.rbの修正

```
vi NaServer.rb

require NaElement
↓
require File.dirname(__FILE__) + "/NaElement
```
4 cookbook/netapp/library/nteapp_api.rb修正
2015/5/11現在) HTTPのポートがデフォルトの80ではなく8080を使用するようになているので修正する

```
vi cookbook/netapp/library/nteapp_api.rb

@server.set_port(8080)
↓
@server.set_port(80)
```
```
system services web node show -fields http-port,https-port
node         http-port https-port
------------ --------- ----------
node1 80        443
node2 80        443
```

# Chef-solo実行
1 solo.rb修正

```
vi solo.rb

cookbook_path [ "~/chef-repo/cookbooks" ]
```

2 localhost.json修正

```
vi localhost.json

//localhost.json
{
    "run_list" : [
        "netapp::volume"
    ]
}
```


3 レシピ修正　※今回はvolume.rb

```
vi cookbooks/netapp/recipes/volume.rb

# Cookbook Name:: netapp
# Recipe:: volume

netapp_volume 'demo_vol' do
  svm "svm1"
  aggregate "aggr10"
  size "250m"

  action :create
end
```

4 接続先を指定

```
vi cookbooks/netapp/attributes/default.rb

 default[:netapp][:https] = false
 default[:netapp][:user] = 'admin'
 default[:netapp][:password] = 'パスワード'
 default[:netapp][:fqdn] = 'Cluster mgmtのIPアドレス'
 default[:netapp][:api][:timeout] = 60
```
※timeoutの設定が必要(サンプルには存在しない)

5 Chef-solo実行

```
chef-solo -c solo.rb -j ./localhost.json
```

6 ストレージ側で確認

volumeが作成されていること

```
volume show -vserver svm1 -volume demo_vol
```

# まとめ
Clustered Data ONTAPの特性上、スケールアウトしていくにつれて構成管理が複雑になってしまう
Chefを使うことにより構成管理をコード化できる
※現状のcookbookではvolume moveした場合はレシピとかい離が発生する

# 参考

netaapp-cookbook
https://supermarket.chef.io/cookbooks/netapp

NMSDK download
http://mysupport.netapp.com/NOW/cgi-bin/software?product=NetApp+Manageability+SDK&platform=All+Platforms
※要アカウント登録

Use Chef to Manage Your NetApp Storage Infrastructure - ChefConf 2015
https://www.youtube.com/watch?v=2xoTOnygH-0
SASの基本構造

これは[自分のブログとクロス投稿](http://puppet-life.com/post-290/)です
#SASプログラミングの基本構造
SASプログラミングには4つの構成によって出来ています。つまり、  
･OPTIONSステートメント  
･SASデータセット  
･DATAステップ  
･PROCステップ  
  
です。では、SASプログラム見ながら説明します。  
(この例題ではコーラとドクターペッパーのおいしさについてというテーマです)  
  
```
options ls=80 ps=30;
data water;
input id $ name $ sex $ cola dokupe;
cards;
001 takaaki m 20 80
002 aya f 40 30
003 tarou m 68 93
;
proc print data=water;
run;
```  
  
##OPTIONSステートメント
例題でSASステートメントは`options ls=80 ps=30;`のところです。これは結果出力の縦幅、横幅を指定しています。lsは"Line Size"
であり64~256の間で指定できます。psは"Page Size"であり縦の行を15~32767で指定できます。  
  
##DATAステップ
例題で`data water`から`proc print datta=water`の上のセミコロンまでです。`date water`これはこれから統計処理を行うデータを入れる箱です。なので箱の名前をつけましょう！例題はコーラとドクターペッパーのおいしさについてなのでwaterと名付けました。  
(名付け親は自分なのでわかりやすい名前にしましょう。とはいえ`data a`とか`data b`とか名付けると後で大変です)  
  
`input id $ name $ sex $ cola dokupe;`は箱に入った記号や数字などに名前をつける作業です。プログラムは察してくれませんのできちんと名前をこちらもつけましょう。ここは名付けは特に重要なのでしっかり適切な名前を！！！  
  
`cards`からデータ入力ですので特に説明は省略します。データ数が多い場合は別のファイルに保存しておき読み込むのがいいと思います。  
  
  
例題ではこれくらいにしていますがDATAステップは色々できます。例えば、ドクターペッパーおいしさ得点が90点以上だったらドクターペッパー中毒という決まりをつくりドクターペッパー中毒者が何人いるかや、実は水のおいしさ得点もあり記入しわすれたからつけたそうといったことなどできます。  
  
  
  
##PROCステップ
`proc print`でデータを表示させます。例題だときちんとidに通し番号、nameに名前ときちんとデータが表示されているかチェックします。SASプログラムを作った際は一番最初に`proc print`を行い、データがちゃんと読み込めてるかチェックしましょう。手入力でデータ入力するとミスはつきものです。  
`proc print data=water;`としてwaterの箱のデータを表示させます。DATAステップでは２つ３つと何個も箱を作ることもざらですのでしっかりdata=と指定しましょう。  
  
そして最後に`run;`で実行を指示します。これで完成です。  
  
  
  
##最後に
SASプログラムは行末にセミコロンが必要です。わすれずにつけましょう！！！
npm initでエラーが起きた


`npm init`したらエラーが起きて何事だろうと思って調べた。

```
npm ERR! Darwin 14.3.0
npm ERR! argv "/Users/naru/.nodebrew/iojs/v1.8.1/bin/iojs" "/Users/naru/.nodebrew/current/bin/npm" "init"
npm ERR! node v1.8.1
npm ERR! npm  v2.8.3

npm ERR! Cannot read property 'join' of undefined
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/naru/GitHub/vccwGulp/npm-debug.log
```

ひとまず情報として価値がありそうなのがここ

```
npm ERR! Cannot read property 'join' of undefined
```

で、ぐぐって知ったんですけど、package.jsonのファイル名には大文字使っちゃいけないんですね。
sampleNpmみたいなキャメルケースにしてる場合はsample-npmとかそんな感じにして解決しました。


【参考】
https://github.com/npm/npm/issues/7927
privateメソッドをSelectorとして指定する場合は@objcが必要

Target-ActionモデルのAPIを使うとき、Actionに指定するメソッドはPrivateにしたいけど、その場合 ```@objc``` 付けないと実行時エラーになる。

```lang:swift
class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.leftBarButtonItem = UIBarButtonItem(
            barButtonSystemItem: UIBarButtonSystemItem.Done,
            target: self,
            action: "test"
        )
    }

    //OK
    @objc private func test() {
        println("test")
    }

    /*
    //NG
    private func test() {
        println("test")
    }

    //OK
    func test() {
        println("test")
    }

    //OK
    public func test() {
        println("test")
    }
    */
}
```
objcクラスを継承したクラスであっても、Privateメソッドはobjcにexposeされないので明示的に@objcつけてやる必要があるらしい。internal/publicであれば@objcしなくてもよいらしい。

http://stackoverflow.com/questions/25056278/swift-access-control-with-target-selectors

ちなみにobjcクラスを継承していないクラスのメソッドをSelectorで指定する場合はAccess Controlにかかわらず@objcは必須。

```lang:swift
class PureSwiftClazz {

    func setup() {
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: "test",
            name: UIApplicationWillEnterForegroundNotification,
            object: nil)
    }

    //OK
    @objc private func test() {
        println("test")
    }

    /*
    //NG
    private func test() {
        println("test")
    }

    //NG
    func test() {
        println("test")
    }

    //NG
    public func test() {
        println("test")
    }
    */
}
```
バイオインフォマティクス-ゲノム配列から機能解析へ-第3章3.4節配列アラインメントにおけるスコア行列とギャップペナルティの使用方法

#3.4 配列アラインメントにおけるスコア行列とギャップペナルティの使用方法
・一致、不一致、置換、挿入、欠失に対するスコアを含む**スコア化システムの選択によってアラインメントに影響**が出る
・DNA配列やタンパク質配列間の挿入、欠失を**計上する方法が必要**

#3.4.1 アミノ酸置換行列
・**アミノ酸置換行列とは？**
　・アミノ酸置換の相対頻度をスコア化し行列であらわしたもの
　・アミノ酸を行列上部と側面に配列
　・行列上のそれぞれの位置をスコアで埋める
・**スコアはどうやって決める？**
　・あるアミノ酸が他のアミノ酸と対をなす頻度を反映
　・アミノ酸A→Bに変わる確率はB→Aに変わる逆の確率と仮定
　・置換の可能性は2つのアミノ酸の出現率の席とそれらの化学的、物理的類似性に依存
#3.4.2 Dayhoffのアミノ酸置換行列(PAM行列)
・**PAM行列**
　特徴：比較的短い進化時間の間に観察されるアミノ酸置換をさらに長い進化時間の間に観察されるアミノ酸に外挿できる

それぞれのアミノ酸がその他のアミノ酸に変化し、合計で1%の変化の割合になるときの相対的な割合を示す**PAM1行列**を作成し、N乗することで遷移行列が得られる

#3.4.3 ブロックアミノ酸置換行列(BLOSUM)
・**BLOSUM**
特徴：大きなデータセットに基づいた作製法でより発散した配列群から始めてより遠縁の配列中にみつかる置換からスコア行列を作る

・**ブロック**とは？
　・BLOSUMの行列の値を決定するためのもの
　・多数のアミノ酸パターンに基づく
　・類縁タンパク質の500以上のタンパク質ファミリーのシグネチャーとしての機能をはたす
#3.4.4 PAMとBLOSUMアミノ酸置換行列の比較
**PAM**
<進化モデルに基づく>
進化的な起源の跡をたどるように設計
**BLOSUM**
<データベースに基づく>
保存されたドメインを見つけるように設計

#3.4.5 核酸のPAMスコア行列
**核酸スコア行列**
DNA配列のアラインメントを評価するもの

核酸のスコア行列の選択に関して
・**非常によく似た配列**を比較するなら**PAM値の低い行列**を用いるのがよい
・**偏りのあるモデル**は、遠縁の配列をアラインメントする際に**一律の変異モデルよりも得られる情報がかなり多くなる**ので、この目的に使用される
・**長い進化距離**におけるスコア行列で、アラインメントで同じオッズスコアを達成するためにはより**長い配列が必要**
#3.4.6 ギャップペナルティ
**アラインメントの末端のギャップは重要な構成要素**
ギャップペナルティの選択について
・相同でほぼ同じ長さ→端のギャップペナルティは**含める**
・相同性が不明、違う長さ→端のギャップペナルティは**含めない**
・一方の配列が他方に含まれると予想→**短い方の端**にギャップペナルティを**含める**
Amazon S3 で Terraform の状態管理ファイル terraform.tfstate を管理 / 共有する

## 2017-06-17: この記事はもう古いです。Terraform v0.8.x 以下を対象としています。

2017/03 にリリースされた Terraform v0.9.0 で remote config 周りの仕様が大きく変わりました。
S3 に置くファイル形式は変わってないですが、特に CLI 周りで後方互換性のない変更が入っています。例えば `terraform remote` コマンドが無くなっています。

詳しくは以下の公式ドキュメントを読んで下さい。

- [Backends - Terraform by HashiCorp](https://www.terraform.io/docs/backends/index.html)
- [Backends: Migrating From 0.8.x and Earlier - Terraform by HashiCorp](https://www.terraform.io/docs/backends/legacy-0-8.html)

というわけで、以下の記事は Terraform v0.8.x 以下を対象としたものになります。

---

2015-05-08 にリリースされた [Terraform v0.5.0](36c2bd6c65097107049928b11863368515fc5e3e) にて Terraform の状態管理ファイルである `terraform.tfstate` を Amazon S3 で管理する機能が追加されたので、試してみました。

[S3 Remote State Backend by apparentlymart · Pull Request #1723 · hashicorp/terraform](https://github.com/hashicorp/terraform/pull/1723)

## 前置き: `terraform.tfstate` の管理とか共有

`terraform.tfstate` は、Terraform が管理しているリソースの状態を生の JSON で保存しているものです。Terraform はこのファイルを元に、記述された `.tf` との差分を検出しているのです。
このファイル、RDS のパスワードとかも__平文__で入っています。なので、いくら private リポジトリでもそのままバージョン管理するのは抵抗がありました。

`terraform.tfstate` の管理方法はこれまで3種類ありました。

- [Atlas](https://atlas.hashicorp.com/)
- [Consul](https://www.consul.io/)
- HTTP

現在おそらくポピュラーなのは Atlas 管理です。tfstate のやりとりにおいて認証がかけられており、また HashiCorp 謹製であるので Terraform との連携もバッチリです。現在はベータで無料ですが、いつ有料化されるかわかりません。

Consul 管理は、Consul 内の KVS で tfstate を管理する形になります。クラスタを組んでおけば複数マシンに分散させて保存とかできるのでしょうか。ただ、Consul フロントエンドの前に何らかの認証機構やファイアウォールを用意しないと、tfstate が丸見えになってしまう危険性があります。

そして、v0.5.0 でここに第四勢力として S3 が登場したのです。

## S3 backend を試す

まず S3 に管理用の bucket を作ります。今回は AWS CLI でやってますが Management Console からでも何でもいいです。

```bash
$ aws s3 mb s3://dtan4-terraform-state
```

Terraform 側の設定です。最低限

- 管理バックエンドに S3 を使う
- bucket は `dtan4-terraform-state`
- tfstate をの保存名 (key) は `tf`

を設定すればよいです（bucket、key は任意のものを指定してください）。

```bash
$ cd /path/to/your-terraform-repository
$ terraform remote config -backend=S3 -backend-config="bucket=dtan4-terraform-state" -backend-config="key=tf"
Remote configuration updated
Remote state configured and pulled.
```

では `push` してみます

```
$ terraform remote push
State successfully pushed!
```

確認してみましょう

```bash
$ aws s3 ls s3://dtan4-terraform-state
2015-05-07 11:21:56        344 tf
```

`terraform.tfstate` が tf という名前で配置されました :tada: 

## 所感

S3 backend 導入により、これまで悩みの種だった `terraform.tfstate` の管理が幾分やりやすくなったと思います。
例えば CI や ChatOps で Terraform の操作を行う場合、

- `terraform.tfstate` 管理用バケットを作り、
- CI 用にそのバケットに対する R/W 権限のみを持つ IAM を発行して使う

といった運用が可能となります。
Atlas はいつ有料化するかわからない、かといって自前で Consul 建てるのも大げさだしセキュリティがなあ…といった悩みがうまく解消された感じです。

## REF
- [S3 Remote State Backend by apparentlymart · Pull Request #1723 · hashicorp/terraform](https://github.com/hashicorp/terraform/pull/1723)
- [Command: remote config - Terraform by HashiCorp](https://www.terraform.io/docs/commands/remote-config.html)
ubuntu 明るさロック

sudo apt-get install xbacklight
xbacklight -dec 20

Ubuntuを起動したときに、自動的に画面の明るさを調整
自動起動するアプリケーションに登録

起動時間短縮

# vi /etc/default/grub
  GRUB_TIMEOUT=10 を GRUB_TIMEOUT=2 に変更

# update-grub    (設定を反映)
SpringBootあれこれ

SpringBoot利用時のメモ

## 環境
 * windows7
 * eclipse Luna
 * java8(1.8.0_25)
 * spring-boot(1.2.2)

## thymeleafキャッシュオフ

テンプレートを修正してもすぐに反映されず、
いちいち起動し直すのが面倒だったので。

```yaml:application.yml
spring.thymeleaf.cache: false
```
※上記ファイルをsrc/main/resources直下に置く

## ホットデプロイ

これまたいちいち起動し直すのが面倒だったので。

```xml:pom.xml
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>springloaded</artifactId>
</dependency>
```
eclipseで起動するときはVM argumentsに以下を指定する

```text
-javaagent:[springloadedまでのパス]/springloaded-1.2.1.RELEASE.jar -noverify
```
スペースのみの文字列を生成する際のパフォーマンスの違い

気になったのでテストプログラムを書いてみた。(Java7)

**ソース**
https://gist.github.com/suzukitadashi/7abe0e9e998f697308f6
※時間計測用クラス
https://gist.github.com/suzukitadashi/ddb686435ded498d3e7b

**結果**
1回目
paramBlankValueUseString        :162457587
paramBlankValueUseStringBuilder :23487956
paramBlankValueUseChar          :7265772
useArraysFull                   :6003701
copyArraysFull                  :5795637
copyArraysFull2                 :6025160
stringFormat                    :324924502

2回目
paramBlankValueUseString        :107769605
paramBlankValueUseStringBuilder :18082324
paramBlankValueUseChar          :4051814
useArraysFull                   :3150824
copyArraysFull                  :5202544
copyArraysFull2                 :4725768
stringFormat                    :301213243

3回目
paramBlankValueUseString        :111268758
paramBlankValueUseStringBuilder :24473541
paramBlankValueUseChar          :6652153
useArraysFull                   :5977888
copyArraysFull                  :6081764
copyArraysFull2                 :3946693
stringFormat                    :308876172


charを使った配列を作り、半角スペースを入れていくやり方が一番速い。
String.formatは遅い。

**まとめ**
普通にWebアプリケーションで使う際はString.formatを使っても問題にはならないと思われる。
バッチ処理の中で、大量の固定長のデータを作る時に意識した方がいい場面はありそう。
Node.js on HerokuでBasic認証をかける方法

Herokuだからどうということはないのですが、環境変数にpasswordを設定できるので、同じコードベースの複数環境を管理したり、不特定多数にコードを共有する場合には便利かと思います。

##環境変数の追加
heroku configコマンドでBasic認証で使うuser nameとpasswordを追加します。
`$ heroku config:set BASIC_AUTH_USERNAME="hoge_taro"`
`$ heroku config:set BASIC_AUTH_PASSWORD="your_password"`


##package.jsonに"basic-auth-connect"を追加
Express4からはBasic認証で使う"basic-auth-connect"が外部モジュールになったのでインストールが必要です。

##サンプルコード
```js:server.js
var express = require('express');
var app = express();
var basicAuth = require('basic-auth-connect');

var username = process.env.BASIC_AUTH_USERNAME;
var password = process.env.BASIC_AUTH_PASSWORD;

if (username && password) {
  app.use(basicAuth(username, password));
}

app.use(express.static(__dirname + '/public'));

app.set('port', (process.env.PORT || 5000));

app.listen(app.get('port'), function() {
  console.log("Node app is running at localhost:" + app.get('port'))
})

```
usernameとpasswordが設定されていない環境ではBasic認証がかからないようにしています。
月の第何週の何曜日か指定して求めるdate_supportというgemを作った

Date型のオブジェクトに対してその月の第何週か指定して取得するメソッドと、何曜日か指定して取得するメソッドを追加するdate_supportというgemを作りました。この２つのメソッドを組み合わせると、元の日付に対して第何週の何曜日という形で日付を取得できます。

日付は不定で週と曜日が決まっている場合にすぐに求められて便利です。

```rb
date = Date.new(2015, 5, 13)

# 曜日は同じまま、その月の第２週の日付を取得
date.nth_week_of_month(2)  # => <Date: 2015-05-06>

# 第３週のまま、その週の金曜日の日付を取得
date.day_to(:friday)  # => <Date: 2015-05-15>

# その月の第４週の土曜日を取得
date.nth_week_of_month(2).day_to(:saturday)  # => <Date: 2015-05-23>
```
PHPonGAE環境で突然アップロードできなくなった場合の対処方法

#環境
Google App Engine for PHP

#問題
アップロードしようと、こんなエラーが発生する

```shell-session:shell
Error 400: --- begin server output ---
PHP 5.4 applications are prevented from being deployed to Google App Engine from any version of the SDK, including older ones. If you need to continue to deploy PHP 5.4 applications for compatibility reasons, you can request that your application be whitelisted for PHP 5.4 deployment by visiting http://goo.gl/qjKEuk.
--- end server output ---
```
**PHP5.5でやれ**とのことらしい。
#解決方法

##PHP5.5を利用しても構わない場合
```yaml:app.yaml
runtime: php
```
↓

```yaml:app.yaml
runtime: php55
```

**実行時のコマンドのruntime**もphp55に

```shell-session:shell
/usr/bin/python /usr/local/google_appengine/appcfg.py --oauth2 -R --runtime=php55 update /Users/konata/PhpstormProjects/myProject/
```
PHPStormでアップロードしている人は、PHPStormが設定しているGAEアップロード用のコマンドに「--runtime=php」が含まれてしまっているので、
直近は、**PHPStormのGAEアップロード機能は使えない思う**。
なので、上記のコマンドをTerminal等から実行し、アップロードしてください。

##PHP5.5を利用できない場合
以下URLからGoogleにGAEでPHP5.5より前の環境を利用したい旨を申請する。
http://goo.gl/qjKEuk.

#参考
http://stackoverflow.com/questions/30045149/when-i-try-to-deploy-my-php-application-to-google-app-engine-why-am-i-suddenly
amebaなどの画像リンクが禁止されている画像をimgタグで表示する方法

amebaブログなどで使うためにアップロードした画像は外部ページでimgタグのsrcで利用しても、画像を表示することはできない。リンクそのものが無効となる。
これはユーザーのプライバシーを守る為なのだが、自分で（あるか分からないが）自分の画像を利用したい場合は困る。

そういう場合は画像情報を取得して、画像生成を行えばいい。
(jpgからjpgの変換のみ)

```php
//imagejpeg用に画像生成リソースに変換
$source = imagecreatefromjpeg('amebaに置かれている画像パス');
//画像のパス内に作成する
imagejpeg($source,'保存先');
//リソースのメモリは解放
imagedestroy($source);

```

画像パスは正規表現で取得できたものを使えばいい。あとはこの画像をimgタグに埋め込めばいいだけ。悪用はしないように。
VCCWでWordPressの環境をローカルに構築してみました。

いくつか簡単に出来る箇所もあるかと思いますが、とりあえず。
##1.VirtualBoxのインストール
[VirtualBox](https://www.virtualbox.org/ "VirtualBox")からダウンロード→インストール
環境がMacなので、VirtualBox 4.3.26 for OS X hosts  x86/amd64を選択。(2015/05/11現在の最新Ver.です)

##2.Vagrantのインストール
[Vagrant](https://www.vagrantup.com/ "Vagrant")からダウンロード→インストール
MAC OS X Universal (32 and 64-bit)を選択。

##3.vagrant-hostsupdaterプラグインのインストール
hostsの書き換えが必要なので、苦手なところはプラグインに任せました。

```
$ vagrant plugin install vagrant-hostsupdater
```

##4.ベースイメージをダウンロード

```lang:vagrantboxのダウンロード
$ vagrant box add miya0001/vccw
```

##5.VCCWのファイルをダウンロード
[VCCW](http://vccw.cc/ "VCCW")からダウンロードし、任意のディレクトリに展開します。

##6.展開したディレクトリに移動

```lang:ディレクトリに移動
$ cd vccw-2.8.1
```

2.8.1は2015/05/11現在での最新Ver.です。

##7.Vagrantを立ち上げる

```
$ vagrant up
```

##8.ブラウザで確認
それほど時間もかからずに環境が作られます。
[http://wordpress.local/](http://wordpress.local/)
[http://wordpress.local/wp-admin/](http://wordpress.local/wp-admin/)

* Username:admin
* Password:admin

それぞれ表示されていることを確認。

##メモ

```lang:仮想環境を停止
$ vagrant halt
```

```lang:仮想環境の再起動
$ vagrant reload
```


###参考URL
以下のサイトをみながら作業しました。ありがとうございました。(2015/05/11)
[VCCW](http://vccw.cc/ "VCCW")
[vccwでWordPressのローカル開発環境を作りました](http://qiita.com/pugiemonn/items/043bf3a959cb8be69462 "vccwでWordPressのローカル開発環境を作りました")
[VCCWでWordpressの環境を構築する](http://qiita.com/spawn0x501/items/5f2c610508b44060b860 "VCCWでWordpressの環境を構築する")
TaggedLogging で ActiveRecord のログを調査しやすくする方法

Rails4のデフォルトloggerであるTaggedLoggingは、次のようにすると入れ子でタグを出力してくれます。

```ruby
require "active_support/tagged_logging"
logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT))

logger.tagged("tag1") do
  logger.tagged("tag2") do
    logger.debug "message"
  end
end

# >> [tag1] [tag2] message
```

これを活用して次のようにモデルの主要メソッドをラップしまくると、何のメソッドがトリガーになってそのSQLが呼ばれたのかがわかりやすくなります。

```ruby
require "active_record"
ActiveRecord::Base.logger = logger
ActiveSupport::LogSubscriber.colorize_logging = false
ActiveRecord::Migration.verbose = false
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
ActiveRecord::Schema.define do
  create_table :users do |t|
    t.string :name
  end
end

class User < ActiveRecord::Base
  validates :name, :uniqueness => true

  [:save!, :save, :valid?, :destroy].each do |e|
    define_method(e) do |*args, &block|
      logger.tagged("#{self.class.name}##{e}") { super(*args, &block) }
    end
  end

  [:save, :destroy].each do |e|
    send("around_#{e}", prepend: true) {|_, block| logger.tagged(e, &block) }
  end
end

User.create!(:name => "alice").destroy!

# >>    (1.7ms)  CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar) 
# >> [User#save!]    (0.1ms)  begin transaction
# >> [User#save!] [User#valid?]   User Exists (0.1ms)  SELECT  1 AS one FROM "users" WHERE "users"."name" = 'alice' LIMIT 1
# >> [User#save!] [save]   SQL (0.1ms)  INSERT INTO "users" ("name") VALUES (?)  [["name", "alice"]]
# >> [User#save!]    (0.0ms)  commit transaction
# >> [User#destroy]    (0.0ms)  begin transaction
# >> [User#destroy] [destroy]   SQL (0.1ms)  DELETE FROM "users" WHERE "users"."id" = ?  [["id", 1]]
# >> [User#destroy]    (0.1ms)  commit transaction
```

DBの水平分割などをしている場合は、DBの接続先をタグに入れるのも良いと思います。
ブラウザ上の MVC的な分割を Node Stream API で行う


[Node Streamをブラウザで動かす](http://qiita.com/ledsun/items/428b05162178b0fc6f28) で、ブラウザ上でNode Streamが使えることがわかりました。

典型的なMVC分割に使えることを示します。

# 概要

ボタンをクリックするとカウンターをインクリメントします。
![out.gif](https://qiita-image-store.s3.amazonaws.com/0/15964/80175213-6f77-142c-6e6b-816d4ebae69c.gif "out.gif")


# 設計

- ControllerStream ボタンのクリックイベントをStreamに変換する
- ModelStream クリックイベントに応じて値を更新する
- ViewStream 値をDOMに反映する

# ソースコード

```js:index.js
import {
  Writable,
  Readable,
  Transform
}
from 'stream'

const option = {
  objectMode: true
}

class ControllerStream extends Readable {
  constructor(id) {
    super(option)
    document.querySelector(`#${id}`).addEventListener('click', e => this.push(e))
  }
  _read() {}
}

class ModelStream extends Transform {
  constructor(initialValue) {
    super(option)

    this._value = initialValue
    this.push(this._value)
  }
  _transform(chunk, encoding, done) {
    this._value++;
    this.push(this._value)

    done()
  }
}

class ViewStream extends Writable {
  constructor(id) {
    super(option)
    this._element = document.querySelector(`#${id}`)
  }
  _write(chunk, encoding, callback) {
    this._element.innerHTML = chunk

    callback()
  }
}

new ControllerStream('button')
  .pipe(new ModelStream(0))
  .pipe(new ViewStream('count'))
```

```html:index.html
<body>
  <button id="button">+</button>
  <span id="count"></span>
  <script src="bundle.js"></script>
</body>
```

# 準備

```
npm install browserify babelify stream-browserify
```

# ビルド

```
node_modules/browserify/bin/cmd.js index.js -t babelify > bundle.js
```
devstackで構築したOpenStack環境内のVMをインターネットと通信させる

devstackで作ったOpenStack環境で稼働している仮想マシンをインターネットと通信させたい。

local.confに以下の設定が必要:

```ini
[[local|localrc]]
IP_VERSION=4
PUBLIC_INTERFACE=eno16777736
OVS_PHYSICAL_BRIDGE=br-ex
FLOATING_RANGE=192.168.226.0/24
PUBLIC_NETWORK_GATEWAY=192.168.226.2
HOST_IP=192.168.226.129

[[post-config|/etc/neutron/dhcp_agent.ini]]
[DEFAULT]
dnsmasq_dns_servers = 192.168.226.2
```

`ip route`などを見て、デフォルトゲートウェイになっているインターフェースを`PUBLIC_INTERFACE`に設定する。`PUBLIC_INTERFACE`と`OVS_PHYSICAL_BRIDGE`を設定しておくと、devstackがbr-exスイッチに`PUBLIC_INTERFACE`をさしてくれる。逆に言うと、この2つを設定しないとbr-exスイッチにインターネットと繋がるポートが設定されない。これではNATしない限りインターネットとの通信はできない。何所ともつながっていない。

`PUBLIC_INTERFACE`と同じネットワークレンジを`FLOATING_RANGE`、デフォルトゲートウェイを`PUBLIC_NETWORK_GATEWAY`、DNSを`dnsmasq_dns_servers`に設定する。サブネットのDNS設定を空にしておくと、dnsmasqは自身をプライマリDNSとしたネットワーク設定情報をゲストに渡す。この最後の設定により、そのdnsmasqがDNSのスレーブもになるため、ゲストからの名前解決に答えられるようになる。書かないとdnsmasqは名前の解決ができない。正確には「僕に質問されても誰に確認すればよいのか分からない」という情況になる。上司のいないヒラ公務員のようなもの。（じゃあ最初から課長を出せ、ってことでdevstack完了後にprivateサブネットのDHCP設定を編集して、DHCPサーバーがゲストに外部DNSを割り振るようにしてもよい。けど`./stack.sh`ってやるだけのほうが楽だと思う。）

IPv6を試してみたいのでなければ、IPv6形式のアドレスで画面が見にくくなるのでOff。`HOST_IP`はデフォルトゲートウェイになっているインターフェースに割り当てられているIPを設定する。
rails4による記述法(3.2)との違い(備忘録)

#cotnroller 
###params記法の違い
これまでは、params[:id]としていたところの記述をprivate関数に置き換えて書き換え
→ def article_params
   params.require(:article).permit(:title, :text)
  end
####params.require(:article).permit(:title, :text)ここが違っているところがポイント

###find(params[:id])がうまく機能しない
show,destroy,editなどのparamsでidを渡す場合


###railsでhas_manyで関連しているモデルで親モデルのデータを消したら関連するモデルのデータも連動して消したいとき
:dependent =>　:destroy or :delete_all (1段階の関連であれば、:delete_all 2段階の関連であれば、:destroy	)

#show
###viewで各メソッドへ移動する時の注意点
paramsを渡す場合、特に前でeach文などをまわしている場合は、どんな変数名で渡しているのかでえ間違っているときがある
ex. @user each do |u| でまわしているのに user_path(@user) で渡していたり・・・この場合は、 user_path(u)で渡す
Rubocop の Metrics AbcSize チェックについて


# はじめに

[rubocop](https://github.com/bbatsov/rubocop) を導入しました。
大抵のアラートは `-a, --auto-correct` オプションを指定することで、自動でなおしてくれます。

自動でなおらない箇所も、内容をみてサクサク潰せるのですが、**Metrics AbcSize チェック** は一筋縄ではいかないやっかいなものだったので、なおしていく流れをまとめます。

# Rubocop の Metrics AbcSize チェックについて

そもそも、Metrics AbcSize チェックとは何？ということで、以下の定義となります。

* http://c2.com/cgi/wiki?AbcMetric

```
ABC is strictly a software size metric, although it has often been misconstrued as a complexity metric.

Size is computed by counting the number of assignments, branches and conditions for a section of code. The counting rules in the original C++ Report article were specifically for the C, C++ and Java languages, and defined as:

    Assignment -- an explicit transfer of data into a variable, e.g. = *= /= %= += <<= >>= &= |= ^= >>>= ++ --
    Branch -- an explicit forward program branch out of scope -- a function call, class method call, or new operator
    Condition -- a logical/Boolean test, == != <= >= < > else case default try catch ? and unary conditionals.

A scalar ABC size value (or "aggregate magnitude") is computed as:

       |ABC| = sqrt((A*A)+(B*B)+(C*C))
```

要するに、「代入少なく、関数呼び出し少なく、制御構文少なく」ということです。

_これは、今まで開発者が感じていたプログラムの **匂い** を定量的に判断してくれるものですね。_

# Metrics AbcSize チェックのアラートを改修


### 1. AbcSize チェック以外のアラートをなおす

以下のような別のアラートを解消しているうちに AbcSize チェックもパスするように改善されるようになります。

* LineLength チェック:  1行の長さ
* MethodLength チェック: 1メソッドの大きさ
* CyclomaticComplexity チェック: 制御構文の数

### 2. リファクタリング

メイン作業です。

一時変数の導入やメソッドの抽出などしながら、メソッドを小さくしていきます。  
リファクタリングに関するテクニックは色々あるので他サイトを参考にしてください。

### 3. AbcSize チェックの条件みなおし

最後の手段。

デフォルトの AbcSize チェックの基準値は `15` です。
プロジェクトの状況にあわせて `.rubocop.yml` で基準値を調整します。（甘えですね）

```
Metrics/AbcSize:
  Max: 20
```

# 最後に

rubocop を導入した意味を考え、本末転倒にならないようにしましょう。

あくまで、システムの品質を向上させるための１ツールです。アラートが出ないようにすることが主ではありません。

# 参考

* http://hikitest.hatenablog.com/entry/2015/01/14/034346
* http://changesworlds.com/2015/01/rubocop-metrics-abc_size/
Vagrantを起動するまで

#1.VirtualBoxの準備	

##(1)VirtualBoxのダウンロード
`https://www.virtualbox.org/wiki/Downloads`
##(2)上記サイトからダウンロードしたらインストール

#2.Vagrantの準備と起動	
##(1)Vagrantのダウンロード
`https://www.vagrantup.com/downloads.html`
##(2)上記サイトからダウンロードしたらインストール
##(3)BOXの追加
####1.下記サイトより「CentOS 6.5 x86_64」(ProviderがVirtualBoxのもの)のURLをコピーする
■BOX配布サイト
`http://www.vagrantbox.es/`
####2.コマンドを実行してBOXを追加する
`vagrant box add [BoxName] [URL]`
※[BoxName]は任意の名称、[URL]はコピーしたURL

##(4)BOXの確認
以下のコマンドを実行して正常にBOXが追加されているか確認
`vagrant box list`
正常に追加が完了していれば追加したBOX名が表示される

##(5)Vagrantfileの作成
任意のディレクトリを作成
例：`/vagrant/CentOS6`
作成したディレクトリに移動して、以下のコマンドを実行
`vagrant init [BoxName]`
※[BoxName]は先ほど追加したBOX名

##(6)Vagrantの起動
上記ディレクトリにいる状態で以下のコマンドを実行
`vagrant up`
Laravel で HTTP Status 201 な JSON を返したい


タイトル通り、JSON を返すけど、HTTP Status が 200 以外のステータスコードを返したい時のやりかた。

```php
<?php namespace App\Http\Controllers;

use Illuminate\Http\JsonResponse;

class TestController extends Controller{
  public function postIndex ( CreateRequest $request ) {
    // ごにょごにょ操作
    
    $obj = \App\Model\Test::findOrCreate( $request->all() );
    
    return new JsonResponse(
    	[
    		'success' => "OK",
    		"data" => $obj->toJSON()
    	],
    	201 );
  }
}
```
vimshellで文字コードを制御する

# はじめに

Windowsのコマンドプロンプトに機能不足を感じるvimmerにとって[vimshell](https://github.com/Shougo/vimshell.vim/)は頼もしい存在です。
ですが、GitやGoのようにUTF-8を出力するコマンドでは文字化けしてしまいます。
そんな場合の対処方法を紹介します。

## exeのencodingオプション

他のコマンドを実行する`exe`内部コマンドに`--encoding`オプションがあり、ここでコマンドが出力する文字コードを指定できます。
指定できる文字コードはiconvに準拠しています。

**使用例**

```sh
$ exe --encoding=utf-8 git log
```

以下のように`~/.vimshrc`にaliasを定義してもよいでしょう。

```sh:~/.vimshrc
alias git='exe --encoding=utf-8 git'
```

## g:vimshell_interactive_encodings変数

`g:vimshell_interactive_encodings`変数はキーにコマンド名、値が文字コードの辞書で、キーと一致したコマンドが実行されるとその出力は値で指定された文字コードで変換されます。
また、キーに`/`が含まれているとコマンド名ではなくコマンドのパスに含まれるかチェックされます。

Windowsの場合だけ以下の初期値が設定されています。

| キー | 値 |
|-----|----|
|`/MinGW/bin/`|`utf-8`|
|`/msysgit/bin/`|`utf-8`|
|`/cygwin/bin/`|`utf-8`|
|`gosh`|`utf-8`|
|`fakecygpty`|`utf-8`|

## 活用例

### Windowsの場合

SourceTree経由でインストールしたgitを使っているので次のように設定しています。
このようにディレクトリを指定すると`ls`や`find`など他のコマンドも一括指定できます。

```vim:.vimrc
let g:vimshell_interactive_encodings = {
\'/Users/'.$USERNAME.'/AppData/Local/Atlassian/SourceTree/git_local/':'utf-8',
\}
```

### OSXの場合

OSXのデフォルト文字コードはUTF-8なので問題なさそうに見えますが、ファイル名だけは改変NFDであるUTF-8-MACが使われているので、ファイル名を出力する`ls`や`find`で濁点、半濁点を含むファイル名の表示がおかしくなります。
そこで少し乱暴ですが`/`に`utf-8-mac`を指定してしまいます。
また、`g:vimshell_user_prompt`のカレントディレクトリ名も同様に変換します。

```vim:.vimrc
let g:vimshell_interactive_encodings = {
\'/':'utf-8-mac',
\}
let g:vimshell_user_prompt = 'iconv(fnamemodify(getcwd(), ":~"), "utf-8-mac", "char")'
```
blobデータのonloadについて



imgタグのソースにblobデータを指定したとき、
chromeの場合だとonloadを待たずに一瞬で画像が読み込まれるが、
firefoxやsafariでは、通常の画像データと同様にonloadまでにしばらく時間がかかる。

canvasを扱っている時に引っかかりがちなので注意。
TeXLive2014のTeXShopで日本語を書いて保存すると、日本語の個所が???となって化けるのを直す

筆者の場合、いちばん大きな原因はOSの言語設定を英語にしているからだと思う。OS X Version 10.9.5。環境設定でEncodingの設定を、Unicode（UTF-8）に設定すれば治る。デフォルトは別の何かだった。今あるプロジェクトは諦めて作りなおした方がいいと思う。
Instagram - Clientを登録するときのエラーへの対応

#instagram API

instagramが大好きなのでinstagram APIを使ってDIYしようと思い
Developer登録をし、Clientを登録しようとしました。

APIについてはここに載っています。
https://instagram.com/developer/

登録をして、クライアントIDを貰えばAPIをたたく準備ができます。

![SS 2015-05-11 10.16.40.png](https://qiita-image-store.s3.amazonaws.com/0/48974/9d9cba97-5c4d-463a-f0ff-c8a39839bf44.png)
ここで以下を入力しますが、アプリケーション名以外は適当でもよさそうです。
Application: アプリケーション名
Description: 説明文
Website URL: URL
Redirect URI(s): リダイレクト先　
これらとCAPTCHAを入力してRegisterします。

#登録時エラーへの対処
フォームを送信するとエラーが出ることがあります。

![SS 2015-05-11 10.20.59.png](https://qiita-image-store.s3.amazonaws.com/0/48974/4430e4cc-ab23-5591-14aa-a802e1fbd03d.png)

いろいろ試してみて分かりましたが、このフォーム
**すべての値が正しくないと受け取ってくれない** みたいです。
CAPTCHAを埋めても、説明文ちゃんと書いてもウェブサイトURL貼っても
全部埋めてるのにうまくいかない時これをチェックしてみてください。

![SS 2015-05-11 10.28.01.png](https://qiita-image-store.s3.amazonaws.com/0/48974/8463f407-96ec-d18a-757c-231c147b18de.png)
**URI(s)** なので複数入力できるようになっているんですが、
ひとつだけ入力するときでも 
**フォーム内でEnterを押してURIを確定する** 必要があるみたいです。


これで登録できればAPIを叩けます。
Node Streamをブラウザで動かす


[Node Stream APIを実装するサンプル](http://qiita.com/ledsun/items/9be7fcb6837c9e1f56a0) をブラウザで動かします。

ソースの修正は必要ありません。

# ビルドツール

- babelify@6.0.2
- browserify@10.1.3
- stream-browserify@1.0.0

# 準備

```
npm install browserify babelify stream-browserify
```

# ビルド

```
node_modules/browserify/bin/cmd.js index.js -t babelify > bundle.js
```

# html

```html:index.html
<body>
  <script src="bundle.js"></script>
</body>
```

# 結果

開発ツールのConsole上に出力します。
htmlには何も表示しません。

![スクリーンショット 2015-05-11 10.11.21.png](https://qiita-image-store.s3.amazonaws.com/0/15964/014ee33c-160d-7994-8340-277112ed24c3.png "スクリーンショット 2015-05-11 10.11.21.png")
Ruby mailに添付ファイルをつける


Rubyでメールを送信する時に、添付ファイルつけるやり方

```rb
require "mail"

mail = Mail.new do
  from    "from@example.co.jp"
  to      "to@example.co.jp"
  subject "subject text"
  body    File.read("body.txt")
end

# カレントディレクトリのpicture.jpgを添付
mail.add_file = "./picture.jpg"


# カレントディレクトリのpicture.jpgをphoto.jpgとして添付
mail.attachments["photo.jpg"] = File.binread("./picture.jpg")


# add_fileはnewのブロック内でも使用可能
mail = Mail.new do
  add_file "./picture.jpg"
end
```
Realmで複数レコードを更新する方法


主に一番最後の事例でハマったのでメモ。

# 前提

Realm 0.92.2を使用

```swift
import RealmSwift

class Todo: Object {
  dynamic var id = NSUUID().UUIDString
  dynamic var text = ""
  dynamic var position = 1
  dynamic var createdAt = NSDate()
  dynamic var updatedAt = NSDate()

  override static func primaryKey() -> String? {
    return "id"
  }
}
```

# 該当レコードを一括更新する

```swift
let realm = Realm()

var todos = realm.objects(Todo).filter("position BETWEEN %@", [1, 3])

realm.write {
  todos.setValue(NSDate(), forKey: "updatedAt")
}
```

v0.91.2で追加された`setValue`を使って更新する。

# 該当レコードを1つずつ更新する

## filterの値以外を更新する場合

```swift
let realm = Realm()

var todos = realm.objects(Todo).filter("position BETWEEN %@", [1, 3])

realm.write {
  for todo in todos {
    todo.name += "hogehoge"
    todo.updatedAt = NSDate()
  }
}
```

for inで回して更新する。

## filterの値を更新する場合

```swift
let realm = Realm()

var todos = realm.objects(Todo).filter("position BETWEEN %@", [1, 3])

realm.write {
  var ids: [String] = []
  for todo in todos {
    ids.append(todo.id)
  }
  for id in ids {
    if var todo = realm.objectForPrimaryKey(Todo.self, key: id) {
      todo.position++
      todo.updatedAt = NSDate()
    }
  }
}
```
Resultsをそのままfor inで回して更新する方法では、Results自体が更新されてしまって上手く処理出来ない。
一旦該当レコードのprimaryKeyを取得してから、改めて更新処理を実行すると上手くいく。

若干コードの見通しが悪いので、もし以外で良い方法があれば教えてください。
IEで一回目のaudioが鳴らない問題や、SEのような短い音声の連続再生について

firefoxやクロームなどではしっかりサポートされているaudio。
しかしIEではわりかし新しいバージョンでも、しっかり動作しないことがあり困ったことがあった。

それは始めてaudioを再生するときや、しばらく再生していなかったaudioを再び再生した際に出だしが聞こえない問題である。

長い音声ならまだしも、SEのような短いファイルなら致命的である。そんな問題に私は直面したとき下記の方法で強引に解決した。

```js
//音声ファイルはビットレート最低なものでよい
var se =  new Audio("/se/soundless.mp3");
se.volume = 0;
se.loop = true;
se.autoplay = true;
se.load();
```
--- 2015/05/13追記 ---

上記でも解決しない場合はvolume0にして一度音声を鳴らし再生終了時にvolumeを1に戻すと、初めから再生されたケースもある

----------------------


音の無い音声を裏で流し続けると、いつでもSEが出だしを途切れることなく聞こえるようになったのである。本当ならもっと良い方法があるだろうが、解決案の1つとして覚えてもらえたら良いと思う。

また、SEの連続再生については同じ音声ファイルをリネームし複数用意したものを交互に鳴らすことによって解決した。これでゲームなど作る際は攻撃音とかの多重再生に困らないと思う。
AWS CLIインストールと初期設定を行う(Mac,Ubuntu)

# インストール
pipを使うので、入っていない場合はまずpipをインストール

```
// mac
$ sudo easy_install pip
// ubuntu
$ sudo apt-get install python-pip
```

awscliをインストール

```
$ sudo pip install awscli
```

コマンド実行できたらOK

```
$ aws help
```

# 初期設定
設定コマンドを実行
※formatはjson/table/textを選択可能

```
$ aws configure
AWS Access Key ID [None]: ***
AWS Secret Access Key [None]: ***
Default region name [None]: ap-northeast-1
Default output format [None]: text
```

awsコマンドを適当に叩いてみて想定通りに出力されたらOK

```
$ aws ec2 describe-instances
```
Qiita の脚注記法

他の人の記事を見て気づいたんだが， Qiita って脚注（footnote）に対応してるんだねい[^1]。

- [脚注記法に対応しました - Qiita Blog](http://blog.qiita.com/post/105484781374/qiita-markdown-supporting-footnotes)

[^1]: ていうか [Qiita Blog](http://blog.qiita.com/) って Tumblr なのか。まぁ [CCjp](http://creativecommons.jp/) みたいに今さら WordPress.com にホストするよりは百倍マシだが。
Android library projectでBuild.DEBUGを使うtips

2016/1/17 追記: この記事はobsoleteです。ライブラリ付属のサンプルアプリならこの方法でいいですが、実際のライブラリでこれをするとdebug buildとrelease buildのアーティファクトが２つ出来てしまい、dependenciesで非常に扱いづらくなります。

[Androidでライブラリモジュールからアプリケーションのdebuggableフラグを参照する](http://gfx.hatenablog.com/entry/2015/11/26/102545) をおすすめします。

---

元ネタ: [android - BuildConfig.DEBUG always false when building library projects with gradle - Stack Overflow](http://stackoverflow.com/questions/20176284/buildconfig-debug-always-false-when-building-library-projects-with-gradle)

Android library projectでは `Build.DEBUG` が常にfalseになります。リリース版アーティファクトはこれでいいのですが、同梱するサンプルアプリでも常にそうなってしまうので、 `Build.DEBUG` でログを有効にする手法が使えません。

上記stackoverflowエントリによると、Android Gradle Plugin 1.1から以下の設定をすることで、同梱するサンプルアプリから見える `BuildConfig.DEBUG` がtrueになるとのことで、実際にやってみたところ確かに有効だったのでメモっておきます。

```groovy
// in the library project
android {
    // ...
    publishNonDefault true
}
```

```groovy
// in example apps
dependencies {
    compile project(path: ':library', configuration: 'debug')
}
```
[メモ書き] GoでTDD風な感じでライブラリを作って公開てのをとりあえずやってみる

今回は素数を生成する`Prime` というライブラリをGithubに公開する流れを例にとります.

# フォルダを作る

特に命名はかっちりと決まっていませんが 

githubに公開する場合は `$GOPATH/src/github.com/ユーザー名/ライブラリ名` が良い習慣だと思います.

    mkdir -p $GOPATH/src/github.com/gogotanaka/prime

 ファイルを作る. testファイルの命名は　`xxxx_test.go`

    cd $GOPATH/src/github.com/gogotanaka/prime 

    touch prime.go, prime_test.go

# testを書いてみる

go の標準のテストはif文を駆使して落とすように書く、落ちなかったら成功.

割と好みだけど冗長

```go:prime_test.go
package prime

import "testing"

func TestGet(t *testing.T) {
  if p := Get(1); p != 2 {
    t.Errorf("Expect: Get(1) is 2, Actual: %d", p)
  }

  if p := Get(5); p != 11 {
    t.Errorf("Expect: Get(5) is 11, Actual: %d", p)
  }
}
```

とりあえずこんなのを書いてみる.

```go:prime.go
package prime

func Get(n int) int {
	return n
}
```

テストを走らせる

    go test

```
--- FAIL: TestGet (0.00s)
	prime_test.go:7: Expect: Get(1) is 2, Actual: 1
	prime_test.go:11: Expect: Get(5) is 11, Actual: 5
FAIL
exit status 1
FAIL	github.com/gogotanaka/prime	0.005s
```



おお、

# 実装

（TDDの下りは省略）

以下が完成したコード

```go:prime.go
package prime

func Get(n int) int {
	c := make(chan int)
	var p int
	go gen(c)
	for i := 1; i <= n; i++ {
		p = <-c
		c1 := make(chan int)
		go filter(c, c1, p)
		c = c1
	}

	return p
}

func gen(c chan<- int) {
	for i := 2; ; i++ {
		c <- i
	}
}

func filter(in <-chan int, out chan<- int, p int) {
	for {
		i := <-in
		if i%p != 0 {
			out <- i
		}
	}
}
```



    go test

```
PASS
ok  	github.com/gogotanaka/prime	0.005s
```

いいね！


# github にpush

    git init
    git add -A .; git commit -m 'Init'
    git push origin master

# 使えるか試してみる

    go get github.com/gogotanaka/prime 
    
    ls $GOPATH/pkg/darwin_amd64/github.com/gogotanaka 
    #=> prime.a


おお！試してみよう



    mkdir /tmp/try_prime; cd /tmp/try_prime; touch main.go

```go:main.go
package main

import (
    "fmt"
    "github.com/gogotanaka/prime"
)

func main() {
    fmt.Println(prime.Get(5))
}

```

    go run main.go 
    #=> 11

使えてる！！
ポリモーフィックを実装する

ポリモーフィックの実装の説明しているサイトは色々あるけれどrails g modelコマンドを使って説明しているサイトがないのでメモ

## モデルを作成する

### 子モデルを作成
```shell-session
$ rails g model children_one children_one_name:string
$ rails g model children_two children_two_name:string
```
### 親モデルを作成
```shell-session
$ rails g model parent parentable:references{polymorphic}:index name:string
```

### generate
```shell-session
$ rake db:migrate
```
## リレーションを作成
``` ruby
# 子クラス
class ChildrenOne < ActiveRecord::Base
  # 追加
  has_many :parents, :as => :parentable
end

# 子クラス
class ChildrenOne < ActiveRecord::Base
  # 追加
  has_many :parents, :as => :parentable
end
 
# 親クラス
class Parent < ActiveRecord::Base
  belongs_to :parentable, polymorphic: true
end
```

## 親クラスから子クラスを参照

``` ruby
# 親クラスに紐づく子クラスChildrenOneかChildrenTwoが参照される
Parent.first.parentable
```
Mithril.jsで画像のアップロード、プレビューを実装してみて分かったこと


# はじめに

最近[Mithril.js](https://lhorie.github.io/mithril/index.html)で遊んでいる。

Mithril.jsは最近流行りの[React](https://facebook.github.io/react/)と同じ仮想DOMな実装のjsフレームワーク。

とにかく速度が爆速で、Reactの5倍速いらしい。

↓の記事がすごく分かりやすい。(僕がやってみようと思ったきっかけもこの記事でした。)
[最速MVCフレームワークMithril.jsの速度の秘密 - Qiita](http://qiita.com/shibukawa/items/890d24874655439932ec)


上記の記事にも書いてあるけど、Mithrilはredrawするタイミングが少し特殊で、それが高速化の一端を担っている。

ブラウザから画像をアップロードして、プレビューする実装をしてみて、その辺が理解できたので紹介。

# 環境
- Mithril.js 0.2

# 資料
[auto-redrawのタイミングに関する公式ドキュメント](https://lhorie.github.io/mithril/auto-redrawing.html)

# コード
http://jsfiddle.net/k0Lu22fm/2/


```coffeescript
imageView = {}
imageView.vm =
  init: ->
    @image = m.prop(null)
    @fileChange = (e) =>
      file = e.target.files[0]
      unless file?
        @image(null)
        return
      fr = new FileReader
      fr.readAsDataURL(file)
      m.startComputation()
      fr.onload = (event) =>
        @image(event.target.result)
        m.endComputation()

imageView.controller = -> imageView.vm.init()

imageView.view = ->
  m('div', [
    m('div', [
      m('input[type=file]', {onchange: imageView.vm.fileChange})
    ])
    m('img', src: imageView.vm.image()) if imageView.vm.image()?
  ])

m.mount(document.getElementById('image-view'), {controller: imageView.controller, view: imageView.view})
```

# 解説

Mithrilは、デフォルトではcontrollerのinitializeが走った時か、イベントが発火した時にauto-redrawされる。
Reactではstateという概念があって、`setState`メソッドで状態が変更された時に再renderが走るわけだけど、Mithrilのプロパティ(m.prop)にはそういう仕組みはない。
m.propは、純粋にgetter、setterを定義してくれるだけ。

デフォルトでイベント発火時にauto-redrawされるので、viewからイベントを発火してイベント中にプロパティを更新するだけなら、イベント終了のタイミングでredrawしてくれる。

だけど今回はHTML5のFileAPIのFileReaderを使って、非同期にファイル読み込みを行って、プロパティを更新するようにしたい。
そうすると、イベントが終了した時にはまだ読み込みがされていないので、そのままではredrawされない。

そこで登場するのが、`m.startComputation()`と`m.endComputation()`だ。

これが何かを説明する前に、Mithrilのredrawが走るタイミングを説明する。

Mithrilでは内部カウンタを持っていて、イベントハンドラが呼ばれるとincrementされて、終了時にdecrimentされる。redrawが走るのはこの内部カウンタが0になった時だ。

`m.startComputation()`は内部カウンタを手動でincrementするメソッドで、`m.endComputation()`はdecrementする。

つまり、イベント発火時にincrementされて1になった内部カウンタは、さらに`m.startComputation()`を呼ばれて2になる。
イベント終了時にdecrementされて1になり、FileReaderのonloadイベントで`m.endComputation()`が呼ばれて0になる。
ここで0になったのが検知されて、redrawが走る。

この仕組みはすごくよくできていて、`view`メソッドにconsole.logを仕込むと分かるけど、`view`メソッドはファイルアップロード時に1度しか呼ばれない。

非同期処理が複数あって、全て終了した時にredrawしたい、みたいな時にはそれぞれのメソッドで`m.startComputation()`と`m.endComputation()`を呼ぶようにしておけば、無駄なredrawでリソースを消費しなくて済む。(公式に分かりやすい例が書いてあります。)

`m.render()`メソッドを使えば、強制的にredrawすることも可能。

# 所感

今回はViewの部分だけだったけど、Mithril.jsは軽量な割に、MVCの範囲を全てカバーしている。
個人的にはすごく書いていて気持ちが良い。
他のフレームワークと組み合わせるのも簡単なので、覚えておいて損はないフレームワークかなーと思う。