OmniAICreator/Qiita-1.07M huggingface dataset:
Google Apps Scriptでデバッグ


SpreadSheetで、セルとか行を引数にとって何か実行して返すような関数をApps Scriptで書いた場合、どうやってその関数をデバッグするのかさっぱりわからない。

例えばこういう引数をとらない関数だったら、関数実行するボタン押せば実行されてログが表示される。

```javascript
function printProductInfo() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  for (var i = 0; i < data.length; i++) {
    Logger.log("Product name: " + data[i][0]);
    Logger.log("Product number: " + data[i][1]);    
  }
}
```

けど、こんな感じで引数を取るやつは実行ボタン押しても引数がわからない。（`rows`はスプレッドシート側で`=calc(A:A)`とかで渡される）

```javascript
function calc(rows) {
  for (var i = 0, len = rows.length; i < len; i++) {
    var row = rows[i];
    // 何か処理
  }
}
```

スクリプトを保存してスプレッドシートの方に戻ると、この関数が適用されているセルで再実行されて返り値がそのセルに表示されるので、こんな感じで書いて無理矢理デバッグした。

```javascript
function calc(rows) {
  var debug = [];
  for (var i = 0, len = rows.length; i < len; i++) {
    var row = rows[i][0];
    // 何か処理
    debug.push(foo); // デバッグしたい値を適当につっこむ
  }

  return JSON.stringify(debug);
}
```

これはひどい。
2/3日のJavaScript学習内容

本日は、JavaScriptの基本を学ぶためにドットインストールというサイトの動画講座を視聴しました。
今までに学習したことのある内容もありましたが、基礎をもう一度思い出す意味でももう一度しっかりとおさらいしたいと思います。

本日行った内容は主にプログラムを書き下すための構文やオブジェクトなどについてです。

①各演算子について
②条件分岐
③ループ文
④配列
⑤オブジェクト

それぞれにおいて注意しなければならない点を挙げていきたいと思います。
①＝は代入演算子なので、左右を比較したい時には＝＝と二つ使う。

②if...else...if...の分を上手く使うことによって様々な条件に対応したプログラムを書く事が出来る。

③whileループとforループを行ったが、それぞれ同じ結果を導くプログラムを作ることができるが、実行している中身は全く違うことを行っている。whileは規定値まで何度も検証を続け、規定値に達した所でループを抜けるが、forはそのカウンターで条件の真偽をし、真であれば偽になるまでループをし真偽を続けていく。

④連想配列を用いることによってその場に合った良いプログラムを書くことが出来る。

⑤本日はStringオブジェクトのみだったが、substrやreplaceなどを用いることにより様々なプログラムを書くことが出来る。初めのnew Stringという宣言は省略が出来る。

まだ講座が少し残っているので完璧ではないですが、こういった基本的な内容をしっかりと補完していこうと思います。
複数人でSassファイルを編集する場合のベストプラクティス？

既存Sassファイルの末尾に、`@import` を用いて追加修正用のSassファイルをインポートする。

その際、インポートされるファイルは、`@import` のみ記述、実際の修正を記述したSassファイルは、各人のフォルダに配置。

## 例

# hoge.scss

```
/* 最終行 */
@import 'additional';
```

# _additional.scss

```
@import 'person1/hoge.scss';
@import 'person2/fuga.scss';
```


既存Sassファイルは、作成者のみが編集可能で、それ以外のメンバーは、該当ファイルにインポートされるファイルのみ編集可能とすれば、ファイル構造を変更しなくても複数人でSassファイルの修正が可能になる。
AVSpeechSynthesizerによる音声合成


アプリで音声合成できないかなーとと思っていろいろ調べていたら、iOS7で標準搭載になったAVSpeechSynthesizer使えば簡単にできそうだったので試してみました。

## Swift

AVFoundationを追加します。

```
import AVFoundation
```

あとは読み上げをしたいコントローラーに下記のように、読み上げる言葉と音声を指定してあげればOKです

```
let speech = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: "こんにちは")
utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
utterance.rate = 0.3
speech.speakUtterance(utterance)
```

ちゃんと漢字混じりでも発音してくれます。これは簡単に使えますね。

## RubyMotion

```Rakefile
  app.frameworks += ['AVFoundation']
```

```
speech = AVSpeechSynthesizer.alloc.init
utterance = AVSpeechUtterance.speechUtteranceWithString("こんにちは")
utterance.voice = AVSpeechSynthesisVoice.voiceWithLanguage("ja-JP")
utterance.rate = 0.2
speech.speakUtterance(utterance)
```

## 参考
+ http://www.toyship.org/archives/1483
+ https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVSpeechSynthesizer_Ref/Reference/Reference.html
JavaScriptの勉強1日目：2014年2月3日(月)

ドットインストールにある、JavaScript入門(全25回)を学習した。

映像を視聴し、サンプルコードを記述して動作を確認した。
25回分すべて視聴し、サンプルも全て実行した。

大学の講義で学習したJavaと比較すると、変数の型の宣言などをいちいちする必要が無く書きやすい印象を受けた。

プロパティやメソッドの簡単な例の紹介が中心となっていたため、学習に抵抗は無かった。

学んだ内容を少し混ぜた簡単なクイズを作成した。1＋1＝？という問題に対して、設置した2つのボタンで答えを選択するといったものである。
また、タイマーメソッドを利用し、5秒経つと、時間切れです。というメッセージを出すようにした。

以下にJavaScriptの記述を記す。
<script>
	
	var e = document.getElementById('myButton1');
	e.onclick = function(){
		alert("正解！");
	}
	
	var e2 = document.getElementById('myButton2');
	e2.onclick = function(){
		alert("不正解！");
	}	
	
	setTimeout(function(){
	alert("時間切れです。残念。");
	},5000);
	
	
	</script>
	
より理解を深め、さらに複雑で面白い対話型プログラムを作成したい。
helm-agで高速検索 (GNU Emacs/Cygwin)

Helm-agで高速にファイル検索できて感動したのでインストール手順をメモしておきます．
間違いなどあれば指摘していただけると幸いです．

[環境] Windows7/Cygwin/GNU Emacs24.3

# ag.exeの作成
## 準備(Shift-JIS,EUC-JPの対応)
ag (the silver searcher)はutf-8のテキストファイルしか検索してくれません．
Shift-JISやEUC-JPのテキストファイルも対象に含むようにパッチをあてたVerがありました．

[ag(The Silver Searcher)でEUC-JP/Shift-JISのファイルも検索できるようにしてみた - Thinking-megane](http://blog.monochromegane.com/blog/2013/09/15/the-silver-searcher-detects-japanese-char-set/)

しかし，ビルドが通りませんでした…．
改修点はsrc/util.*のみのようなので，src/util.*を，masterプロジェクトへ差し替えてmasterプロジェクトをビルドしました．
[monochromegane/the_silver_searcher at detect-japanese-char-set · GitHub](https://github.com/monochromegane/the_silver_searcher/tree/detect-japanese-char-set)
↑こちらからsrc/util.cとsrc/util.hをコピー
[ggreer/the_silver_searcher · GitHub](https://github.com/ggreer/the_silver_searcher)
masterのプロジェクトをcloneしてコピーしたファイルを差し替え

## ビルド
cygwinを起動し，the silver searcherのディレクトリへ移動して，build.shを実行．

```Bash:
cd the_silver_searcher
./build.sh
```

ビルド終了後、生成されたag.exeをcygwin/binにコピー．

```bash:
cp ./ag.exe /bin/
```

↓ビルドが通らない場合，こちらのページが参考になるかと思います
[Windows Cygwin環境のThe Silver Searcher(ag.exe)ビルド方法 - GeekなNooblog](http://geekna.hatenablog.jp/entry/20130531/p1)

# Emacsの設定

## emacsでag.exeのパスを通す
emacsでM-x getenv pathを実行し、pathの値にC:\cygein\bin;が含まれて無ければ.emacsに/cygwin/binディレクトリをpathに追加するコードを追加します

```el:.emacs
;;/cygwin/binをパスを通す
(setenv "PATH" ("C:\cygein\bin;" (getenv "PATH")))
```

## helm-ag.elを取得
cygwinで次のコマンドを実行します．
```bash:
git clone https://github.com/syohex/emacs-helm-ag.git
```

## .emacsにhelm-agの設定を追加

```el:helm-ag_sample.el
;必要であればload-pathにhelm-agディレクトリを追加
;(add-to-list 'load-path "C:\Dropbox/.emacs.d/elisp/emacs-helm-ag")

(require 'helm-config)
(require 'helm-files)
(require 'helm-ag)
; agのデフォルトのコマンドオプションを指定
; -nを消すとサブディレクトリも再帰的に検索します
(setq helm-ag-base-command "ag --nocolor --nogroup -n")

;Alt+sでag実行
(define-key global-map [(M s)] 'helm-ag)

```
## 動作イメージ
Dired上で M-s → "ag --nocolor --nogroup -n する" を実行した結果．

![ScreenShot00053.png](https://qiita-image-store.s3.amazonaws.com/0/13064/8f63ed04-86b7-533b-ee1f-066dfd4251b0.png)

ファイル内検索の場合はM-x helm-ag-this-fileを利用しましょう．

### 気になる点
Diredバッファの文字コードがutf-8なので，
"ag --nocolor --nogroup -n する"
の"する"はutf-8です．
(検索コマンドの文字コードは，カレントバッファの文字コードを引き継ぐようです)
そのためこの場合Shif-JISやEUC-JPファイル内の"する"はヒットしません．
その他の文字コードで検索したい場合は，C-x RET f(または M-x set-buffer-file-coding-system RET)でカレントバッファの文字コードを変更→再度helm-agを実行する必要があります．

#参考
helm-ag作者の方のページ．ありがとうございます
[helm-agを書きました - Life is very short](http://d.hatena.ne.jp/syohex/20130302/1362182193)
メモ: IE11にてtableのbordercolorがtdに引き継がれない

IE11で内側に黒線が入ってなんだこれ・・・？と数時間ハマってた。

IE8
---------

![スクリーンショット 2014-02-03 16.02.32.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6ee02f00-1bb3-b7f6-cf2f-01ab53afdccc.png)


IE11
-----------

![スクリーンショット 2014-02-03 16.03.31.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b3693984-c5f3-ca3d-5713-4be8dfe907ce.png)
スマホサイトコーディングの覚え書き（右側アイコンとborderに背景画像を指定する飾り枠）

デモ：http://jsdo.it/Ituki/sJPv

#borderに背景画像を指定する飾り枠

##ジェネレーター
http://border-image.com/#%7B%22src%22%3A%22http%3A%2F%2Fwww.w3.org%2FTR%2Fcss3-background%2Fborder.png%22%2C%22linkBorder%22%3Atrue%2C%22borderWidth%22%3A%5B0%2C0%2C0%2C0%5D%2C%22imageOffset%22%3A%5B27%2C27%2C27%2C27%5D%2C%22fill%22%3Atrue%2C%22setRepat%22%3Afalse%2C%22repeat%22%3A%5B%22repeat%22%2C%22repeat%22%5D%2C%22scaleFactor%22%3A3%2C%22setRepeat%22%3Atrue%7D

##レティナっぽい感じにする
BはAの２分の１を指定する

```css
    border: Apx solid;
    -webkit-border-image: 背景画像 B repeat;
    border-image: 背景画像 B fill repeat;
```

※デモ2番目

#右側アイコン

##background-position: right XXpx XX
スマホ未対応。PCはIE9以上。
※デモ3番目

##background-position: calc(100%-XXpx) XX
Android4.3以下やiPhone5.1以下が未対応
http://caniuse.com/#search=calc

##background-position: right XX + background-origin: content-box;
display: blockの時に有効
※デモ4番目

##display: inline-blockにしたいとき
afterの背景画像でbackground-sizeを指定する。
※デモ5番目
Androidエミュレータでシステム署名が必要な処理の動作を確認する

システム署名(端末メーカー提供/市販品は通常、入手不可)が必要な機能を実装していて、「修正⇒システム署名依頼⇒実機でテスト」が時間がかかり面倒･･･

そんな時、エミュレータでテストできればいいのになと思っていろいろ試した結果、以下の手順でいくつかは動かせることが分かりました。

全ての要システム署名の権限、要rootのコマンドを試したわけではないので、あしからず。

●確認した動作（権限）

* PackageManager#installPackage,deletePackage(INSTALL_PACKAGES,DELETE_PACKAGES)

* 位置情報のネットワークを利用,GPSを利用のON/OFF(WRITE_SECURE_SETTINGS)

もしかしたらもう有名な方法かもしれませんが^^;
自分用のメモとしても置いておきます。

アプリ権限のうち、条件が「signature」になっているものは、

* システム署名がされているか

* プリインアプリであるか(/system/app/下にインストールされているか)
>追記：KitKat以降では、/System/priv-app/下

のどちらかでしか動作しません。
なので、エミュレーターの/system/app/下にインストールさせられれば動くのでは？と考えて試してみたところ･･･、無事動作しました。


●手順

(1)エミュレータを起動する

(2)コマンドプロンプトから、以下を実行する

```adb -s emulator-5554 remount```

※emulator-5554の「5554」の部分は、起動しているエミュレータのタイトルバーに表示されているものと合わせてください。

(3)/system/app/下に署名付きapkをインストールする(デバッグ署名でも可)

```adb -s emulator-5554 push mysample.apk /system/app/```


ただし、この方法はエミュレータを閉じると、アプリが消えてしまうので、(2)から毎回やり直す必要があります。
それでも、これで、何度もハードメーカーさんのお手を煩わせることがなくなり、大幅に効率がUPしました。

なお、一度上記で/system/app/下に置いておけば、エミュレータを落とさない限り、その後の上書きインストールは通常の```adb install```で出来ます。

また、プリインストールアプリ扱いとなり端末からはアンインストールできませんが、消したかったらエミュレータを再起動すればよいだけです。
MySQLでパフォーマンス・チューニングのための情報取得

チューニングのためにはexplainとshow profileして、まずは情報取得。
下の結果を見る限り、SELECTで抽出するレコード数を減らす & (テーブルのレコード数を減らす or パーティショニング)が効きそうかな。

# explain
```sql:explain.sql
explain select xxx from yyy ...;
```

|id |select_type|table     |type |possible_keys |key    |key_len|ref   |rows |Extra      |
|:--|:----------|:---------|:----|:-------------|:------|:------|:-----|:----|:----------|
|1  |PRIMARY    |<derived2>|ALL  |NULL          |NULL   |NULL   |NULL  |500  |NULL       |
|2  |DERIVED    |yyy       |range|IDX_1,IDX_2   |IDX_2  |3      |NULL  |52104|Using where|
|2  |DERIVED    |zzz       |ref  |IDX_Z_1       |IDX_Z_1|4      |zzz.id|9    |Using where; Using index|

# show profile
```sql:profile.sql
-- プロファイリングを有効にする
set profiling = 1;

-- プロファイル情報を取得する対象となるSQLを実行する
select xxx from yyy ...;

-- プロファイル情報を表示する
show profile;
```

|Status  |Duration|
|:-------|:-------|
|starting|0.000120|
|checking permissions|0.000017|
|checking permissions|0.000013|
|checking permissions|0.000014|
|Opening tables|0.000143|
|init|0.000036|
|System lock|0.000036|
|optimizing|0.000014|
|optimizing|0.000033|
|statistics|0.000111|
|preparing|0.000070|
|Sorting result|0.000019|
|statistics|0.000019|
|preparing|0.000017|
|executing|0.000027|
|Sending data|0.000032|
|executing|0.000013|
|Sending data|11.752481|
|end|0.000031|
|query end|0.000018|
|closing tables|0.000014|
|removing tmp table|0.000025|
|closing tables|0.000049|
|freeing items|0.000376|
|logging slow query|0.000021|
|Opening tables|0.000024|
|System lock|0.000087|
|cleaning up|0.000030|
[Titanium]ScrollViewの中のTableViewに行追加したときの更新方法


リストの続きを読むとかを実装するときに、
ScrollViewの中にTableViewを配置し、
TableViewにappendRowするとTableViewに行が追加されるのはいいんだけど、
ScrollViewの高さが変更されなくて表示が残念になるときの対処法。

ScrollViewのheightを
`height: Titanium.UI.SIZE`
にしておく。

んで、行追加するときに

```test.js
tableView.appendRow(tableViewRow);

// これを追加
scrollView.add(Titanium.UI.createView());
```

とするとScrollViewの高さが更新されて、
TableViewに追加された行もきちんとScrollView内に収まります。

けど、このままだと新しく作って追加したViewが被って、
ボタンとか押せなくなるので、

```test.js
tableView.appendRow(tableViewRow);

// これを追加
scrollView.add(Titanium.UI.createView({width:0, height:0}));
```

として追加した。
これならどこの要素の邪魔もしないViewを追加したことになるので
更新もされるし、ボタンも押せるので良いかと。

`valiable:true`とかのほうがきれいかなーとか思いつつ。（試してない）
簡単にトピックブランチだけでinteractive rebaseする

# 背景
プルリクエストを投げる前にトピックブランチのコミットを綺麗にしたい

# 問題
トピックブランチの根本のsha1が分からないのでいちいち調べないといけないので面倒です。

# 解法 1 - git-merge-base

こんな `branch-root` エイリアスを作ります。

```~/.gitconfig
[alias]
  branch-root = merge-base master HEAD
```

あとはこのように実行すればトピックブランチだけでinteractive rebaseができる

```bash
$ git rebase -i $(git branch-root)
```

## 解説
`git-merge-base` は与えられたコミットの共通の祖先のsha1を出力してくれます。これを使うことで `branch-root` はトピックブランチの根本のsha1を標準出力します。

# 解法 2 - git-rev-list

```~/.gitconfig
[alias]
  branch-first = !git rev-list master..HEAD | tail -n 1
```

こっちの場合は

```bash
$ git rebase -i $(branch-first)^
```

## 解説

`git-rev-list` は与えられたrevisionにマッチするsha1を出力してくれるので、その中で一番古いものを出力します。こうすることで `branch-first` はトピックブランチの一番最初のsha1を標準出力します。
BioRubyのmidifileの使い方

BioRubyで塩基配列などのデータをSMFに変換する`midifile`の使い方

## 使用環境
* Ruby バージョン1.9系
* BioRuby バージョン1.4.3.0001

## BioRubyシェル`bioruby`から下記を実行する

```ruby:BioRubyシェル
midifile("[SMFファイルパス]", getseq("[ファイルパス/塩基配列文字列]"))
```
Varnish Cache 設定編


この記事の内容はvarnish-3.0.4で確認しています.

## VCL構文チェック

```shell
$ varnishd -C -f default.vcl
```

## vcl_recvのreturn

`return`はそこでvcl_recvサブルーチンを抜けます.
例えば以下のコードの結果で`after`は出力されません.

```
import std;
sub vcl_recv {
  std.log("before");
  return (pass);
  std.log("after");
}
```

# vcl_xxxxの複数定義

以下の記事で、デフォルトのvcl_xxxxサブルーチンを複数定義できます.
このメリットは同じ定義は定義された順にデフォルトのサブルーチンの前に処理が入っていきます.

* [同じVCLアクション(vcl_recvなど)を複数定義する](http://blog.xcir.net/?p=1120)

ただし、デフォルトのvcl_xxxx以外の自前のサブルーチンを複数定義するとVCLのコンパイル時に失敗します.
Varnish Cache インストール編


## Install

Redhat/CentOS系はyumリポジトリが用意してあるのでそれを使用

```shell
$ sudo rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el6/noarch/varnish-release/varnish-release-3.0-1.el6.noarch.rpm
$ sudo yum install varnish
```

## 起動

```shell
$ sudo service varnish start
```

## 参考

* [第13回　［キャリアアップ編④］varnishを使おう③─便利な機能を使いこなす：使える！サーバ運用の実践テクニック｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/server_tech/0013)
Quick Lookプラグインのテスト環境設定

Xcode 5 で Quick Look プラグイン (.glgenerator) を開発するにあたって、私が使っている Build Scheme です。
Quick Look プラグインは普通のアプリケーションと違ってプラグインを直接実行するわけではないので、デバッグ用にはそれに合わせた設定が必要。
なのですが、日本語で（英語でさえ）いい感じに紹介してるサイトが見当たらなかった<sup>1</sup>ので書いてみたいと思います。

## テスト用ファイルを作成
デバッグ時に使用するテストファイルを作成しておく。テストファイルはデスクトップなどに置かずにプロジェクトディレクトリに突っ込んでおいた方が便利だと思う。後述のパスの指定もしやすいし、テストファイルもプロジェクトの一部としてまとめて管理した方が理にかなってる。

## 2つのScheme作成
Quick Lookはpreviewをthumbnailの2種類がある。それぞれテストできるように、thumbnail用とpreview用の2つのSchemeを作る。とはいえ、以下で解説する1カ所を抜かして内容は同一。

![run.png](https://qiita-image-store.s3.amazonaws.com/0/6520/cc93c216-3bef-20b0-fade-1be1f8a3f7c1.png)
2つ作ってビルド時に適宜選べるようにしておく。

## Scheme設定
### Executableの指定
Run時にコマンドラインの `qlmanage` を実行するように設定する。`qlmanage`はコマンドラインでのQuick Look管理を司る。つまりこれを使ってテストファイルをプレビューする。詳しくは `qlmanage -h` を。

RunのInfoタブを開いて、Executableをqlmanageにする。おそらくプルダウンには出てこないので、「Other...」を選択し、そこからqlmanageを選ぶ<sup>2</sup>。qlmanageの居場所はTerminalから `which` でも叩いて見つけておく。これでRun時に`qlmanage`コマンドが蹴られる。

```shell-session
$ which qlmanage
/usr/bin/qlmanage
```

![info.png](https://qiita-image-store.s3.amazonaws.com/0/6520/4b6f6aab-7a35-ea85-a661-56b7170ce378.png)

### Argumentsの設定
次に `glmanage` 実行時の引数を Arguments タブで設定する。引数は3つ取る。

* `-p`（もしくは `-t`）：Quick Lookするファイルのパスを設定。先ほどのテストファイルのパスを指定すれば良い。`$(SOURCE_ROOT)`でプロジェクトのルートディレクトリのパスが指定できる。この（スクリーンショット）場合はルートに置いたtest.svgというファイルをテストに使う。このオプションを`-p`にするとpreviewになり`-t`にするとthumbnailになる。なのでこれを`-p`と`-t`にした2つのSchemeを作れば良い。
* `-c`：テストファイルのファイルタイプ UTI を指定する。この次の`-g`オプションを有効にするためにはこれも指定する必要がある。これは作成しているQuick Lookプラグインに合わせて適宜変える。
* `-g`：使用するジェネレータを強制的に指定する。これを抜かすと、今回buildしたqlgeneratorではなく別のヤツが使われる可能性があるので重要。`-g "$(TARGET_BUILD_DIR)/$(TARGET_NAME).qlgenerator"` を指定。

「Expand Variables Based On」には適宜デバッグしたいターゲットを選択しておく。

![arguments.png](https://qiita-image-store.s3.amazonaws.com/0/6520/62e19441-531f-818e-7f83-66a60bac32b4.png)

## まとめ
ということで、Quick Lookプラグイン開発用のBuild Scheme設定でした。これでshareもできる環境に寄らないプレーンなSchemeが完成しました。ポイントは以下の3点：

- テストファイルはプロジェクトディレクトリ内に入れて管理する
- thumbnail用とpreview用に2つのSchemeを作成する
- qlnamage実行時に`-g`オプションを指定して、確実にデバッグ対象のジェネレータが使われるようにする


-- 
1. 一応[Appleのガイド](https://developer.apple.com/library/mac/documentation/userexperience/conceptual/quicklook_programming_guide/articles/qldebugtest.html)もあるけど古いしあんま親切ではない。
2. 選択パネルから `/usr/bin/` に行くのはやりづらい。Finder の Go to Folder か Terminal の `open` コマンドで該当フォルダを Finder で開いておいて、それをパネルにドラッグ＆ドロップするのが楽だと思う。
RでROCカーブ

Receiver Operating Characteristic (ROC) カーブは、識別器(判別器)の性能評価に使われる。

![ROC.png](https://qiita-image-store.s3.amazonaws.com/0/34199/6a1cb28c-63a4-ef70-81f8-e7950783c943.png)

横軸 Specificity = True Negative Rate = True Negative / Called Negative
縦軸 Sensitivity = True Positive Rate = True Positive / Called Positive

識別器の値に対する、閾値を動かしていくと、図のような曲線が描かれる。図では3つの識別器を比較している。左上に曲線が行くほど、性能が良い。

少しややこしい。

Specificity とは日本語で特異度。ネガティブと判断された中で、真にネガティブなものの割合。
Sensitivity とは日本語で感受性。ポジティブと判断された中で、真にポジティブなものの割合。

ある病気を判断するバイオマーカーを例にとると、Specificity は、病気でないと判断したうち、本当に病気でない割合、Sensitivity は病気と判断したうち、本当に病気な割合。なので、重要な病気のバイオマーカーの場合は、Sensitivity は多少犠牲にしても、Specificity は高い方がいい。多少間違って病気と判断してしまっても、病気を見逃すよりは良い。

[pROC](http://web.expasy.org/pROC/) というパッケージがある。
CFD法を学ぶ、第4回「ソフトウェアテスト技法ドリル」勉強会

そーだそーだ、やりたいのはこういうディシジョンツリーに漏れがあった時の対応だ。

```scala:CFD.scala
// [CFD法を学ぶ、第4回「ソフトウェアテスト技法ドリル」勉強会](http://softest.cocolog-nifty.com/blog/2011/04/cfd4-28d6.html)

object 買い物合計金額 extends Enumeration {
  type 買い物合計金額 = Value
  val v2000円以上,その他 = Value
}
object カード持参 extends Enumeration {
  type カード持参 = Value
  val 持参している,持参していない = Value
}
object 支払方法 extends Enumeration {
  type 支払方法 = Value
  val 現金,現金以外 = Value
}

object 付与 extends Enumeration {
  type 付与 = Value
  val ポイント付与,付与なし = Value
}

import 買い物合計金額._
import カード持参._
import 支払方法._
import 付与._

def ディシジョンテーブル(a:買い物合計金額,b:カード持参,c:支払方法):付与 = {
  (a,b,c) match {
    case (v2000円以上,持参している,現金) => ポイント付与
    case (v2000円以上,持参している,現金以外) => 付与なし
    case (v2000円以上,持参していない,c) => 付与なし
    case (その他,b,c) => 付与なし
    case (a,b,c) => 付与なし // ここはどうすんの?
  }
}

println(ディシジョンテーブル(v2000円以上,持参していない,現金))
```
今更ながら、補完や検索に便利なhelm

結構前になるが Anything から helm に移行して、
かなり便利に使ってるので、設定の一例の紹介を。

## 必要なもの
### helm
言わずと知れた本体そのもの
https://github.com/emacs-helm/helm
### helm-descbinds
キーバインドを helm で表示
https://github.com/emacs-helm/helm-descbinds
### emacs-helm-ag
後述のThe  Silver Searcher での検索結果を helm で表示
https://github.com/syohex/emacs-helm-ag
### The Silver Searcher
別名 ag 。以前は ack を使っていたが、当時3〜5倍高速とのことで乗り換えた
https://github.com/ggreer/the_silver_searcher

## インストール

helm, helm-descbinds, emacs-helm-ag は load-path の通った場所に、
git clone するなり、releases からダウンロードして展開しておく。

The Sliver Searcher は自力ビルドするなり、 `brew install ag` なりで、
PATH に含めておく。

## 設定
```el:
(require 'helm-config)
(require 'helm-ag)
(require 'helm-descbinds)

(helm-descbinds-mode)

(global-set-key (kbd "C-;") 'helm-mini)
(global-set-key (kbd "C-c h") 'helm-mini)
(global-set-key (kbd "C-c b") 'helm-descbinds)
(global-set-key (kbd "C-c o") 'helm-occur)
(global-set-key (kbd "C-c s") 'helm-ag)
(global-set-key (kbd "C-c y") 'helm-show-kill-ring)
```
例のごとく、キーバインドはお好みで。

特にインストールの項で記述していないものは、
helm-config を require すると使えるようになっている。

helm 使ってんなら、コレも使わないと損だろ、みたいなのがあれば、
コメントに書いてもらえると有り難い。
Lobi Rec SDK のサンプルアプリを動かす。(Cocos2d)

ゲームのプレイ中の画面を録画/共有することのできる[Lobi REC SDK](https://lobi.co/recsdk)の導入メモです。

SDK の取得
---------

SDK は [github](https://github.com/kayac/Lobi) 上で公開されているので

    $ cd <WORK_DIR>
    $ git clone git@github.com:kayac/Lobi.git
    Cloning into 'Lobi'...
    remote: Counting objects: 4133, done.
    remote: Compressing objects: 100% (2820/2820), done.
    remote: Total 4133 (delta 1246), reused 4121 (delta 1234)
    Receiving objects: 100% (4133/4133), 54.25 MiB | 938 KiB/s, done.
    Resolving deltas: 100% (1246/1246), done.
    Checking out files: 100% (4201/4201), done.
    
と普通の git リポジトリとおんなじように取得できます。

アプリケーションの登録
------------------

> **NOTE**
> サンプルアプリにクライアント ID が最初から登録されているので試すだけなら必要ないかも

SDK を取得したのですが、 Lobi のサービスにアプリケーション登録してクライアント ID を取得する必要があります。
Twitter/Facebook 等の外部サービスを利用するのと一緒ですね。

[Lobi のアプリケーション登録ページ](https://developer.lobi.co/myapps)にいくとユーザ登録画面なのですが、まずLobiのアカウントが必要みたいなので[iOS](https://itunes.apple.com/jp/app/id405548206?mt=8)/[Android](https://play.google.com/store/apps/details?id=com.kayac.nakamap)のアプリからユーザを作り、再度[Lobi のアプリケーション登録ページ](https://developer.lobi.co/myapps)でログイン完了しました。

サンプルアプリの起動
----------------

    $ cd Lobi
    $ tree -L 2
    .
    ├── LobiRankingSDK
    │   ├── README.md
    │   └── android
    ├── LobiRecSDK
    │   ├── LobiRanking.bundle
    │   ├── doc
    │   ├── header
    │   └── lib
    ├── README.md
    ├── Unity
    │   ├── README.md
    │   ├── lobirec.unitypackage
    │   ├── unity_sample
    │   └── unity_xcode_sample
    ├── cocos2d
    │   └── RecTest    <= 今回使うのはこれ
    └── cocos2dx
        ├── CocosDenshion
        ├── cocos2dx
        ├── extensions
        ├── external
        ├── licenses
        └── projects

Cocos2d のサンプルプロジェクトはこんな感じです。

    $ cd cocos2d
    $ tree -L 3
    .
    └── RecTest
        ├── DerivedData
        │   └── RecTest
        ├── RecTest
        │   ├── AppDelegate.h
        │   ├── AppDelegate.m
        │   ├── HelloWorldLayer.h
        │   ├── HelloWorldLayer.m
        │   ├── IntroLayer.h
        │   ├── IntroLayer.m
        │   ├── Prefix.pch
        │   ├── Resources
        │   ├── libs
        │   └── main.m
        └── RecTest.xcodeproj
            ├── project.pbxproj
            ├── project.xcworkspace
            └── xcuserdata

まず `RecTest/RecTest/AppDelegate.m` でクライアント ID を設定します。

```objc

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [KLRConfiguration currentConfiguration].clientID
        = @"今回所得したクライアント ID";
    [KLRConfiguration currentConfiguration].accountBaseName
        = @"動画を投稿する際に自動で作られるデフォルトのユーザ名";

```

あとは実機で動かすだけ。

ドキュメント
----------

導入ドキュメントは[ここ](https://github.com/kayac/Lobi/wiki)にあります。また、詳細な API ドキュメントは `Lobi/LobiRecSDK/doc/index.html` に書かれています。

この処理が面白そう。

    preventSpoiler
    録画中このプロパティがtrueの間、ゲーム録画ファイルにモザイク処理がかかります。
iOSデバイスから端末情報を取得する


#iOSデバイスから端末情報を取得する
##キャリア情報


```objectivec:キャリア情報取得
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>

	CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
    CTCarrier *carrier = [netinfo subscriberCellularProvider];
	NSLog(@"carrierName:%@",carrier.carrierName);
    NSLog(@"carrierName: %@", carrier.carrierName);
    NSLog(@"mobileCountryCode: %@", carrier.mobileCountryCode);
    NSLog(@"mobileNetworkCode: %@", carrier.mobileNetworkCode);
    NSLog(@"isoCountryCode: %@", carrier.isoCountryCode);
    NSLog(@"allowsVOIP: %hhd", carrier.allowsVOIP);
```


```実行結果
carrierName: ソフトバンクモバイル
mobileCountryCode: 440
mobileNetworkCode: 20
isoCountryCode: jp
allowsVOIP: 1
```

キャリア情報はSIMから取得しているものと思われます。
参考:https://groups.google.com/forum/#!msg/iphone-developer-japan/NTFcsA311v8/_rlQotuXBLYJ


##OSバージョン
```objectivec:OSバージョン取得
    NSLog(@"systemVersion: %@", [UIDevice currentDevice].systemVersion);
```


```実行結果
systemVersion: 6.0.1
```


##モデル名
```objectivec:モデル名取得
	NSLog(@"model: %@", [UIDevice currentDevice].model);
```


```実行結果
model: iPhone
```


##プラットフォーム


```objectivec:プラットフォーム取得
#include <sys/types.h>
#include <sys/sysctl.h>

	size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *machine = malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
    free(machine);
```


```実行結果
platform: iPhone5,2
```
NodObjCでNSLogを任意のファイルに出力する

# Node.jsでCocoa APIが叩けるNodObjC

## 近況

node-webkitと悪魔合体を密かに試みて、ビルド出来るところまで行ったのですが、しばらくすると、
終了してしまう現象が解決できずにいます。

## 本題
ファイルディスクリプタ番号２を閉じることで、NSLogの出力を任意のファイルに出力できる。

```js
fs.closeSync(2)
var fd = fs.openSync("foobar.log", 'w')

$.NSLog($("NSLogのテスト"))
```

# まとめ

先日[MacRubyがMavericksで動かせそうになってきた記事](http://markvillacampa.com/2014/01/30/compiling-macruby-on-osx-10-9-mavericks/)をみて、そっちに移りそうなので、
node.jsベースで覚えたことを忘れない為に、ここにメモを残しました。

この応用で、ファイルディスクリプタ番号1をクローズすれば、標準出力を任意のファイルに落とせるんだろうが、
リダイレクトでいいからなぁ。。。

# Link

- [NodObjC/test/NSLog.js at master · TooTallNate/NodObjC](https://github.com/TooTallNate/NodObjC/blob/master/test/NSLog.js)
- [NSLog の出力先を変更する](http://qiita.com/CarmineScarlet/items/5aad44207ae5c74a1927)
- [loading problem on OSX 10.8.2 · Issue #113 · rbranson/node-ffi](https://github.com/rbranson/node-ffi/issues/113)

# 関連記事

- [MavericksでNodObjCを試すには](http://abrakatabura.hatenablog.com/entry/2013/12/11/114418)
- [Node.js v5.0.0でnode-ffiやNodObjCが動かない](http://abrakatabura.hatenablog.com/entry/2015/11/05/071522)
- [node-ffiをGoで入門してElectronを使って応用してみる](http://abrakatabura.hatenablog.com/entry/2015/12/11/000722)
- [Electron 1.2系だとNodObjCが多分使えない](http://abrakatabura.hatenablog.com/entry/2016/06/11/172606)
OSXからAmazon s3をマウントするには


s3、安くていいですよね。

サーバからではなく、自分のPCからファイルをあげたりさげたりできたらもっといいですよね。
そんなわけでOSXからs3をマウントさせる方法を見つけたのでメモします。

インストールは以下。

```
brew install s3fs
```

設定ファイルは以下。

```
echo "accessKeyId:secretAccessKey" > ~/.passwd-s3fs
```

あとは対象のフォルダを作り、s3fsコマンドでマウントしてください。

```
s3fs [バケット名] [フォルダ名] -o allow_other,default_acl=all
```

これでいろいろいじくれまーす。
LruCacheの仕組みを理解したい


ソースはこれを見ました。
https://android.googlesource.com/platform/frameworks/support.git/+/795b97d901e1793dac5c3e67d43c96a758fec388/v4/java/android/support/v4/util/LruCache.java

実装はシンプルな気がする。

## あるオブジェクトをキャッシュに追加したい

putというメソッドを使います。

```Java:put
public synchronized final V put(K key, V value) {
        if (key == null || value == null) {
            throw new NullPointerException("key == null || value == null");
        }

        putCount++;
        size += safeSizeOf(key, value);
        V previous = map.put(key, value);
        if (previous != null) {
            size -= safeSizeOf(key, previous);
        }
        trimToSize(maxSize);
        return previous;
}
```

### safeSizeOfとは？
sizeOfメソッドの返り値を取得してそのまま返してるだけです。

```Java:safeSizeOf
private int safeSizeOf(K key, V value) {
        int result = sizeOf(key, value);
        if (result < 0) {
            throw new IllegalStateException("Negative size: " + key + "=" + value);
        }
        return result;
    }
```

sizeOfはprotectedなメソッドなので、拡張クラスで任意の値を設定することができる。
LruCache.javaのsizeOfは1を返すようになっています。

```Java:sizeOf(オリジナル版)
protected int sizeOf(K key, V value) {
        return 1;
    }
```

### 古いキャッシュを更新

putを見てると以下のような処理があります。

```Java:古いキャッシュを更新してる
V previous = map.put(key, value);
if (previous != null) {
            size -= safeSizeOf(key, previous);
        }
```

これは古いキャッシュの大きさをsizeから引いてます。
同じキーでもファイルサイズが違うこともあるので、それを考慮して更新してくれています。

### trimToSizeとは？

trimToSizeメソッドではmaxSizeとsizeを比較してsizeがmaxSize以下になるように調整してくれる。
trimToSizeはmapを見守り、mapがメモリを確保し過ぎることを防いでくれる。

```Java:trimToSize
private void trimToSize(int maxSize) {
        while (size > maxSize && !map.isEmpty()) {
            Map.Entry<K, V> toEvict = map.entrySet().iterator().next();
            if (toEvict == null) {
                break; // map is empty; if size is not 0 then throw an error below
            }

            K key = toEvict.getKey();
            V value = toEvict.getValue();
            map.remove(key);
            size -= safeSizeOf(key, value);
            evictionCount++;

            // TODO: release the lock while calling this potentially slow user code
            entryEvicted(key, value);
        }

        if (size < 0 || (map.isEmpty() && size != 0)) {
            throw new IllegalStateException(getClass().getName()
                    + ".sizeOf() is reporting inconsistent results!");
        }
    }
```

### キャッシュに追加する上で注意したいこと

先ほどsafeSizeOfで見たように、sizeの変動はsizeOfに依存してます。
trimToSizeを正しく使うためにはsafeSizeではキャッシュしたい対象のオブジェクトの大きさを正確に返すことが求められます。
正しいサイズが分からないと、これ以上キャッシュ確保できないのに大きなオブジェクトを詰め込もうとしてメモリリークを起こしてしまう。。なんてことがあります。僕は起こしました。
なので、拡張クラスのsizeOfでvalueの大きさを計算して返すようにします。

以下のように書くとvalueのサイズを計算できます。


```Java:sizeOf(拡張クラスでオーバライド)
protected int sizeOf(K key, V value) {
	return value.getByteCount();
}
```

もし、sizeOfでvalueの計算をしないと困ったことが起きます。
sizeOfメソッドをオーバライドせずに使ってみる。
すると、常にsafeSizeの返り値が1となりますね。
仮に4MBのBitmapをキャッシュしたとしても、safeSizeの返り値は1になってしまいますｗ
sizeがたった1しか増えてないので、maxSizeがよほど小さく設定されてない限りtrimToSizeでメモリの調整はしてくれません。
このままだとトリムが全く発動しないまま大きいファイルをどんどんキャッシュしてしまいます。
その結果、メモリ領域を食いつぶしてしまいOutOfMemoryエラーが起きてしまうのです！

## 他の機能は後で書くかも
LESS記法チートシート

LESSの記法チートシートです。
関数は[関数リファレンス](http://www.lesscss.org/#reference)を見てください。

## 変数

```
@variable-name: #111;
@another: (@variable-name + #222); // => #333;

.class1 {
    color: @variable-name; // => color: #111;

    // variable scope
    .class2 {
        @variable-name: #555;
        color: @variable-name; // => color: #999;
        @variable-name: #999;
    }
    .class3 {
        color: @variable-name; // => color: #111;
    }
}
```

## mixin

```
.mixin-name (@paramName1: 1px; @paranName2: red) { // 引数名: デフォルト値
    border-width: @paramName1;
    border-color: @paramName2;
}

.class1 {
    .mixin-name();  // => .mixin-name(1px, red)
}
.class2 {
    .mixin-name(2px); // => .mixin-name(2px, red)
}
.class3 {
    .mixin-name(@paramName2: blue); // => .mixin-name(1px, blue)
}
```

## nested rule

```
p { // => p
    font-size: 14px;
    &.sub { // => p.sub
        font-size: 12px;
    }
    a { // => p a
        text-decoration: none;
        &:hover { // => p a:hover
            text-decoration: underline;
        }
    }
}
```

## operations

```
@color: #111;
@width: 1px;

.class1 {
    color: (@color * 3); // => color: #333;
    border-color: (@color + #003300); // => border-color: #114411;
    border-width: (@width * 2); // => border-width: 2px;
}

```
jQueryプラグイン定義チートシート

チートシートなので詳細な説明はなしです。

jQueryプラグイン定義の書き方。

メソッドとかもった高機能なやつは[Extending jQuery Boilerplate](https://github.com/jquery-boilerplate/jquery-boilerplate/wiki/Extending-jQuery-Boilerplate)を見てください。

```js
(function ($) {
    $.fn.pluginName = function(options){
        // default option values
        var settings = $.extend({
            optionName: "defaultOptionValue"
        }, options);
        
        return this.each(function(){
            var obj = $(this);

            // settingsをもとにobjに対して処理
        });
    };    
    
})(jQuery);

// usage
$("#id").pluginName({optionName: "optionValue"});
```
JavaScriptの名前空間定義チートシート

チートシートなので説明なし。

JavaScriptでの名前空間の書き方。

```js
var top = top || {}; // ancestor namespace
top.second = top.second || {}; // ancestor namespace

(function (third) { // namespace
    // private property
    var privPropName = "privPropValue";

    // private method
    function privFuncName() {
    }

    // public function
    third.funcName = function () {
    }

    // public class
    third.ClassName = (function () {
        function ClassName() {
        }
        return ClassName;
    })();

    // public singleton object    
    third.objectName = (function () {
        return {
        };
    })();

})(top.second.third = top.second.third || {});

// usage
top.second.third.funcName();
var instance = new top.second.third.ClassName();
top.second.third.objectName;
```
Rubyの外部コマンドとの連携

Rubyで外部コマンドとの連携がどれくらい簡単にできるかを試してみました。
今回はlsで表示されるファイルを正規表現でマッチさせて、マッチしたファイルをファイル名の長い順に
ソートし、長い方から5つを表示させるプログラムを書きました。
と言ってもたったの1行です。
コードを下に示します。

```rb:ls_sort.rb
p `ls`.split("\n").grep(/^e/).sort_by { |file| -file.length }.take(5)
# >> ["echo-client.rb", "echo-server.rb", "each_names.rb", "eightqueen.rb", "ex2601.erb"]
```

では解説をしていきます。
Rubyでは`(バッククォート)で外部コマンドを囲むだけで実行できます。
ここではlsをバッククォートで囲んでいます。
次のsplitですが、lsの実行結果は文字列で、またファイルをそれぞれ改行(\n)で区切っています。
ですのでsplitの区切り文字として\nを指定することで、ファイルの一覧を配列で得ることができます。
この配列に対してgrepを呼ぶことで、正規表現にマッチした配列の要素を抽出できます。
例ではファイル名の初めの文字がeのファイルを抽出しています。
次にsort_byを呼んでいますが、file.lengthに付いているマイナスに注目してください。
ここでマイナスを付けないと、ファイル名の短い順にソートされます。
最後にtakeを呼ぶことで引数に指定した数字分、配列の先頭から要素を取り出しています。

説明が長くなりましたが、これだけのことをRubyでは簡単に行うことができます。
メソッドチェインの強力さを改めて実感しました。
寝る前に思いついてささっと書いたので間違いがあれば指摘お願いします。
rvmな人が流行にのっかってrbenv使って、ついでにChefったときにひかかったんで、

サーバ環境を`Chef`ってる途中なんですけど、どうせならついでに`rvm`から`rbenv`に乗り換えようかなって思ってですね、ためしてみましたよ。

## 訂正

同じような内容をもっと詳しく書いて下さっている記事がありました。
もっと早く見つけてれば、、、涙
[今日作りたくなる簡単cookbook [Kim'sキッチン] rbenv](http://qiita.com/ryurock/items/f0ef33639c188a5965c7) at 2013-04-18

## リファレンス

1. [お手軽環境構築 !chefでrubyのバージョンを2.0.0-p195にする方法 ~CentOS~](http://nigohiroki.hatenablog.com/entry/2013/07/04/000557) at 2013-07-04
2. [Chef Soloでrubyのバージョンを2.0.0-p195にする方法 ~Debian、Ubuntu編~](http://blog.machacks.net/2014/01/14/chef_ruby_2-0-0-p195_debian_ubuntu/) at 2014-01-14

## やってみた（未読スルー可）

リファレンスの記事を読んだりしながらやってみました。

まず、1.の記事通りやったら、`rbenv install 2.1.0`で「`rbenv`が無いよ」っておこられる。
で、2.の記事にフルパスにすりゃいいよってあったので、フルパス書いたら今度はインストールはできるんだけど、ゲストOSに`ssh`で入って`ruby -v`してみるとsystemの1.8.7とかが使われたままで、`rbenv versions`しても2.1.0が表示されないーー

なんで。。。

## 調べる（未読スルー可）

「ruby本体はどこにいったの？」って調べてみたら、`/root/.rbenv/versions/2.1.0/ruby`にいる訳で。
で、初心者にはこれで合ってるのかわからなくて、レシピを読み直してみた。
どうやらシステム全体にインストールしようとしていて、`/usr/local/rbenv/versions`に入れようとしていたらしいです、笑
たぶん、ルートの下に入ってしまったのはルートでインストールしてるからで、インストール先のパスが通ってないんだろうなって推測。
レシピ見ると確かに、`template`で作った環境変数が反映されていない状態で`rbenv`を使ってるっぽい。
ってことでこんな感じになりました。

## 最終的なレシピ

* `source /etc/profile.d/rbenv.sh`で環境変数を毎回読み込み
* 伊藤本が`bash`だったので、`execute`から`bash`にしました（ヒアドキュメント使えていいし）
* rubyのバージョンは`node.json`で設定

このあたりがポイントかなー

```rb
git "/usr/local/rbenv" do
  repository "git://github.com/sstephenson/rbenv.git"
  reference "master"
  action :sync
end

# 各バージョンのrubyはversions/以下におかれる
# 使用中のrubyがshims/以下におかれる
%w{/usr/local/rbenv/shims /usr/local/rbenv/versions}.each do |dir|
  directory dir do
    action :create
  end
end

# rbenv自体にはrubyのインストール機能は含まれないんだってさ
git "/usr/local/ruby-build" do
  repository "git://github.com/sstephenson/ruby-build.git"
  reference "master"
  action :sync
end

bash "install_ruby_build" do
  not_if 'which ruby-build'
  cwd "/usr/local/ruby-build"
  code <<-EOH
    ./install.sh
  EOH
end

# 環境変数の設定
template "rbenv.sh" do
  path "/etc/profile.d/rbenv.sh"
  owner "root"
  group "root"
  mode "0644"
  source "rbenv.sh.erb"
end

# rubyのインストールに必要な物を入れる
# EPEL必須
%w{make gcc zlib-devel openssl-devel readline-devel ncurses-devel gdbm-devel db4-devel libffi-devel tk-devel libyaml-devel}.each do |pkg|
  yum_package pkg do
    action :install
  end
end

# rubyインストール(ビルドに数10分かかる、、、)
# 【注意】この段階では環境変数が適用されていないので
# rbenv.shを読み込むことで環境変数を適用
bash "install ruby (This may take several tens of minutes...)" do
  code <<-EOC
    source /etc/profile.d/rbenv.sh
    rbenv install #{node['ruby']['version']}
  EOC
  # ここにrubyの本体がいる
  creates "/usr/local/rbenv/versions/#{node['ruby']['version']}"
end

bash "ruby change to #{node['ruby']['version']}" do
  # 「設定されていたら何もしない」を不細工に表現w
  not_if "source /etc/profile.d/rbenv.sh; rbenv versions | grep '* #{node.ruby.version}'"
  code <<-EOC
    source /etc/profile.d/rbenv.sh
    rbenv global #{node['ruby']['version']}
    rbenv rehash
  EOC
end
```

素人丸出し記事ですみません笑
`Qiita`ってこんなんでいいのかな。。（2回目の投稿）

あと、`nvm`版のレシピも作ったので明日時間があったらあげますー
RailsアプリをHerokuにデプロイする手順メモ


＊Herokuのアカウント登録、Gitのインストールは完了していること。

(0) Heroku側でデプロイの受け入れスペースを確保する

```heroku:terminal
$ heroku create [<app_name>]
```

(1) デプロイしたリポジトリを初期化

```heroku:terminal
$ git init
```

(2) コミットするファイルを追加

```heroku:terminal
$ git add .
```

(3) コミット

```heroku:terminal
$ git commit -m "first commit"
```

(3.5) remote.herokuの設定

* 削除

```heroku:terminal
$ git remote rm heroku
```
* 登録

```heroku:terminal
$ git remote add heroku git@heroku.com:<app_name>.git
```

(4) デプロイ

```heroku:terminal
$ git push heroku master
// rejectなんたらでデプロイが完了できない場合
$ git push heroku master --force
```

(5) マイグレート（これを忘れてた）

```heroku:terminal
$ heroku run rake db:migrate
```
  
(6) ブラウザで見る

```heroku:terminal
$ heroku open
```


参考
* [デプロイ手順](http://d.hatena.ne.jp/nayuko22/20120120/p1)
* [mysqlがherokuでコンパイルできないから、デプロイではpgにする手順](http://mofuken.blogspot.jp/2012/08/heroku-push-sqlite3.html)
* [全体的なherokuとrailsの操作](http://nobyu.hatenadiary.jp/entry/20100207/1265531331)


# 「解決できないこと」
assetsがHerokuにデプロイされなかったり、jQueryがローカルと違う動きをしたり、CSSが反映されていないなどのずれがある。どうすれば完全に同じ挙動をしてくれるのか？
Android Gradle plugin と robolectric plugin を使って groovyコードでテスト

# 用意するもの
* Androidプロジェクト
* Gradle (1.9) // 1.10 は Android Gradle Plugin が未対応

# 使うもの

* [Android Gradle plugin](http://tools.android.com/tech-docs/new-build-system/user-guide)
* [Robolectric](http://robolectric.org/)
* [robolectric-plugin](https://github.com/novoda/robolectric-plugin) ([修正版](https://github.com/turugina/robolectric-plugin))
* groovy-base plugin (Gradle標準)

## robolectric-plugin の問題

現在 sonatype のmaven repositoryで公開されている robolectric-plugin 0.0.1-SNAPSHOT (com.novoda.gradle:robolectric-plugin:0.0.1-SNAPSHOT) にはいくつか問題点があります。

* Windows環境下ではpluginロード時に例外発生 (半年も前にpull-reqされるも現時点で絶賛放置中の模様)
* androidのソースコードが <var>'src/main/java'</var> にあること決め打ち
* テストの実行時ディレクトリが <var>'src/main'</var> 固定
* debug build type のclasses しか参照しないのに assemble taskに依存しているため無駄に assembleRelease task が動く

上記の修正版の方はこれらの問題を修正したもの。適宜 `git clone` して `gradle install` してください。(この際、versionは0.0.1となる com.novoda.gradle:robolectric-plugin:0.0.1 )

## groovy-base plugin について

Gradleにはgroovy plugin が標準で用意されているが、このgroovy pluginはjava pluginに依存している、一方Android Gradle plugin はjava plugin と共存不可能となっている。

groovy-base plugin は一応Gradleの公式Documentで紹介はされているが、詳細についてはundocumentedなpluginである。
Gradleのソースを確認したところ、java pluginに依存し、taskの依存関係を設定しているのが groovy plugin で、 groovy-base pluginはそれ以外の仕事を引き受けているようだった(compile<i>SourceSet</i>Groovy taskの生成など)

# build.gradle 例

```groovy:build.gradle
buildscript {
  repositories {
    mavenCentral()
    mavenLocal()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.7.3'
    classpath 'com.novoda.gradle:robolectric-plugin:0.0.1'
  }
}


apply plugin: 'android'
apply plugin: 'robolectric'
apply plugin: 'groovy-base'

repositories {
  mavenCentral()
  mavenLocal()
}

dependencies {
  robolectricCompile 'org.robolectric:robolectric:2.0'
  robolectricCompile 'junit:junit:4.+'
  robolectricCompile 'org.codehaus.groovy:groovy-all:2.2.0'
}
sourceSets {
  robolectric {
    java.srcDirs = ['test/java']
    groovy.srcDirs = ['test/groovy']
    resources.srcDirs = ['test/resources']
  }
}

tasks.withType(Test) {
  // avoid "> superClassName is empty!" error
  scanForTestClasses = false
  include "**/*Test.class"
  exclude "**/Abstract*.class"
}

android {
  compileSdkVersion 8
  buildToolsVersion "19.0.0"

  sourceSets {
    main {
      // Legacy構成 :)
      manifest.srcFile 'AndroidManifest.xml'
      java.srcDirs = ['src']
      resources.srcDirs = ['src']
      aidl.srcDirs = ['src']
      res.srcDirs = ['res']
      assets.srcDirs = ['assets']
    }
  }
  // etc..
}
```

# groovyのテストコード例

```groovy:HogeTest.groovy
package test;

import com.example.android.Hoge;

import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;

@Config(shadows=[org.robolectric.shadows.ShadowListView.class])
@RunWith(RobolectricTestRunner.class)
class HogeTest  {

  @Test
  void testHoge()
  throws Exception
  {
    def target = new Hoge();
    // do test with target
  }
}
```
【初心者による、初心者のためのRails】Herokuを使って、無料でRailsアプリをデプロイ→公開する


カフェで仕事すると、なぜか盛り上がる千葉です。
今日は、HerokuにRailsアプリをデプロイして世界的に公開しちゃいます。

# ゴール
Railsアプリを、全世界公開。
自分の目で、晒されている姿を見る。

# Herokuとは？
PaaSサービス。
Railsアプリを簡単にデプロイして、Webで公開できます。
gitと連動しているため、ローカルにはgit環境が必要です。

## 料金体系
基本的には無料。
高機能なアドオンを使用する場合に料金が発生します。
初心者なので詳細はおいおい。

# 事前準備
gitが必要なため、インストールしておく。

# HerokuでRailsアプリ公開

以下の手順で行っていきます。

1. Herokuユーザ登録
1. Herokuソフトウェアのインストール
1. Herokuにログイン(ターミナルにて)
1. Herokuにサンプルアプリをデプロイ
1. 晒され具合を確認する

## Herokuユーザ登録
[Heroku](https://www.heroku.com/)でユーザ登録します。

1. SingUpを選択して、メールアドレスの登録
1. メールが届くのでURLリンクをクリック
1. パスワード入力
1. 登録完了

## Herokuソフトウェアのインストール
1. [Toolbelet](https://devcenter.heroku.com/articles/getting-started-with-ruby#set-up)ダウンロードボタンがあるので、そこからインスコする

## Herokuにログイン
Herokuにログイン。ターミナルに以下のコマンドを入力。

    $ heroku login


## Herokuにサンプルアプリをデプロイ
まずは、サンプルアプリをダウンロード

    $ mkdir ~/rails_study
    $ cd ~/rails_study
    $ git clone git://github.com/heroku/ruby-sample.git

Heroku上に、アプリケーション用の場所を作成

    $ heroku create

デプロイ

    $ git push heroku master

### 以下のエラーが出た場合

```
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

    ssh-keygen -t rsa
    heroku keys:add

## データベースの初期化
    heroku run rake db:migrate


## 晒され具合を確認する
    $ heroku open

ブラウザが起動し、サンプルアプリが表示されます。

## 晒したサンプルアプリを削除
デプロイしたサンプルアプリを削除します。

1 Herokuにブラウザにてログイン
2 Appsを選択
3 削除対象のアプリのSettingsを選択

![スクリーンショット 2014-02-03 1.01.31.png](https://qiita-image-store.s3.amazonaws.com/0/33834/04259183-6797-7b53-2d5c-00aa1d79d235.png "スクリーンショット 2014-02-03 1.01.31.png")

4 下の方のDelete Appを選択
5 アプリケーション名を聞かれるので、入力してOK
6 掃除完了

これで自作アプリもデプロイ出来ると思います。

## 注意事項
自作アプリをデプロイする場合は、Heroku用にGemfileを書き換えましょう。
最低限必要な箇所。

```Gemfile
group :development do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
  gem 'rails_12factor'
end”
````

    $ bundle install --without production


* pg：Herokuでは、PostgreSQLが使われているためpg gemを本番のみ使用する
* rails_12factor：HrokuでCSS・HTML・画像を使うのに必要
オフラインリアルタイムどう書く18回の参考問題を、rubyで

第18回 http://atnd.org/events/47025
の、参考問題「山折り谷折り」
http://nabetani.sakura.ne.jp/hena/ord18mafovafo/
の実装例。

rubyで。

他の言語などの解答例は
http://qiita.com/Nabetani/items/373105e7fafd12f5e9fd
から辿れます。

で。

```ruby
def solve( x )
  return "" if x.empty? || ! x
  r=solve( x[1..-1] )
  i=r.tr("mV", "Vm").reverse
  case x[0]
  when "L"; i+"V"+r
  when "J"; r+"V"+i
  when "Z"; r+"m"+i+"V"+r
  when "S"; r+"V"+i+"m"+r
  when "U"; i+"V"+r+"V"+i
  else; raise "#{x}"
  end
end

$stdout.sync=true

DATA.map{ |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual==expected;
  puts "%s %s->%s ( %s )" % [ ok ? "ok" : "***NG***", src, actual, expected ]
  ok
}.tap{ |x| p x.all? }

__END__
0 JZ  mVVmV
```

いつも通り、テストデータの大半は省略。

方針としては、順当な再帰処理というつもり。
L なら、まんなかは谷折り。
谷折りの左側は逆になって、右側はそのまま。

紙を折る問題は、話が理解できてもパッと書き始められないことが多いみたいで、ちょっと面白い（と、思ってるんだけど、どうだろう）。
AngularJSでng-repeatした要素ごとに独立した処理を実行させる

AngularJSを初めてまだ2日目ですが、なんとなくメモしておきます。

わかってる人にとっては当たり前のことなんだと思います。

## 成果物
実装後の挙動

![sample](http://gifzo.net/4rUaPKS1tL.gif)

サンプルは以下に実装してあります。触りながら理解したい人はどうぞ。

http://jsfiddle.net/uJ2P9/

## 背景
ng-repeatしてフォームを複数作ったあと、ng-keyupとかでフォーム毎に処理を行いたい場合に、すべてのフォームが同期されてしまって、それを直すのに苦労しました。

結果的にはng-*=""の中で連想配列が使えることがわかり解決。

自分の要件的には複数のフォーム毎に独立してAPI経由の非同期なインクリメンタルサーチができるところまで実装しました。需要があれば書きますが今回は省略。

## 実装

定義してあるformsの分だけリピートさせフォームを作りたい。

```html
<div ng-controller="myController">
    <div ng-repeat="f in forms">
        {{f}} 
        <input ng-model="data[f]" ng-keyup="doChange(f)">
        {{dataTimes[f]}}
    </div>
</div>
```

ng-modelの```data[f]```のfには、```hoge```, ```fuga```, ```piyo```がkeyとして入ってきます。
これはjs内では```$scope.data[f]```で参照できます。これで独立した挙動を実現できます。

変数の定義と、フォームでの記述をkeyとして関数を実行。
今回は単にフォームの内容を3倍するだけの処理としました。

```js
var myApp = angular.module('myApp', []);
myApp.controller('myController', ['$scope', function($scope) {
    $scope.forms = {
        0: "hoge",
        1: "fuga",
        2: "piyo"
    };
    $scope.data      = {};
    $scope.dataTimes = {};
    $scope.doChange = function(f){
        console.log($scope.data);
        $scope.dataTimes[f] = $scope.data[f] * 3;
    };
}]);
```

## 参考

ここにたくさん動かせるサンプルがあって便利です。
もっと最初に出会っていれば…。

https://github.com/angular/angular.js/wiki/JsFiddle-Examples
WordPressのパーマリンクが表示されないときの解決法(ubuntu ×　apache2)

WordPressで結構引っかかることが多いのが、サーバとの兼ね合い
特にパーマリンクがうまくつながってくれない問題は、よく起こるのでは
ググって出てくるのは、AllowOverride None を　All　にしろとばかり
もうやってるっちゅーの！！
半泣きになりながらも、解決法を探っていたら、やっと見つけた
Ubuntu独特のmoduleを有効にする方法が、躓きの原因だったようだ


# mod_rewriteを有効にする

Ubuntuでは、apache2をインストールした時に、デフォルトでmod_rewriteがインストールされている
しかし、有効になっていないので、それを有効にする作業が必要

##rewrite.loadがあることを確認する

```zsh:
% cat /etc/apache2/mods-available/rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
```
##mod_rewriteを有効にする

```zsh:
% sudo a2enmod rewrite
```
有効になったことを確認する

```zsh:
% ls -al /etc/apache2/mods-enabled/rewrite.load
lrwxrwxrwx 1 root root 30 Feb  2 20:12 /etc/apache2/mods-enabled/rewrite.load -> ../mods-available/rewrite.load
```

#apache設定ファイルのAllowOverrideを書き換える

よく httpd.conf というファイル名で見られる、いわゆるapacheの設定ファイルみたいなものは、Ubuntuでは、apache2.confであり、しかも、AllowOverrideについては、そのファイルではなく
/etc/apache2/sites-available/default
に書き込むのだそうだ
私自身は結構ハマったところだが、Ubuntuを使い慣れている方は大丈夫なのだろう

```:/etc/apache2/sites-available/default
<Directory /var/www/>
	Options Indexes FollowSymLinks MultiViews
#	AllowOverride None
	AllowOverride All
	Order allow,deny
	allow from all
</Directory>
```

そしてapacheを再起動する

```zsh:
% sudo service apache2 restart
```

#WordPressのパーマリンクRewrite設定を確認する
パーマリンク設定をデフォルト以外にして更新すると、wordpressフォルダの下に.htaccessが生成される
自動生成されない場合は、以下のファイルを.htaccessとしてアップロードすればよいが、そもそも.htaccessが自動生成されない環境では、今後も問題が起こるのではないかと思う
その.htaccessが正しく書かれているか確認する

```:.htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>
# END WordPress
```

****

参考にしたサイト↓
[How to enable mod_rewrite in Apache2 on Debian or Ubuntu](http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html)
[WordPressの引越しでパーマリンクの404 Not Foundエラーが発生](http://junrei.dip.jp/wordpress/wordpress/wordpress%E3%81%AE%E5%BC%95%E8%B6%8A%E3%81%97%E3%81%A7%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE404-not-found%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F-2/)
[Go言語] JSONを解析するのに、型作るのはめんどい


ChromeのDevToolsには、timelineという機能があり、Webアプリのパフォーマンスチューニングに使えます。このtimelineで記録したデータはJSONで保存ができます。
最初はjqを使って解析しようと思いましたが、スクリプトがだんだんと黒魔術臭がしてきました。

そこで、Go言語で解析しようと思ったのですが、正直このJSONのフォーマットがイマイチ分からないので、型が作れません。また、Chromeさんはバージョンがガンガン上がるので、いつフォーマットが変わるか分かりません。その度に型が変わるのは嫌です。

ということで、型を作らずにJSONを解析するライブラリ的なものを作ってみました。
`reflect`パッケージ的な感じに使えます。

* https://github.com/tenntenn/gj

こんな感じで使えます。`ResourceSendRequest`レコードを羅列する例です。

```
package main

import (
	"github.com/tenntenn/gj"

	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	jsonStr, _ := ioutil.ReadAll(os.Stdin)
	v, _ := gj.New(jsonStr)
	traversal(v.Slice(1, v.Len()))
}

func traversal(v *gj.Value) {

	if v.IsArray() {
		v.EachIndex(func(i int, v *gj.Value) {
			traversal(v)
		})
		return
	}

	if v.IsObject() {

		if v.Has("type") && v.Get("type").String() == "ResourceSendRequest" {
			fmt.Println(v.Get("data").Get("url").String())
		}

		if v.Has("children") {
			traversal(v.Get("children"))
		}
	}
}
```

まだまだ改良の余地がありそうですが、個人で使う分にはいい感じかな。
Active Adminで/admin/以下以外のパスに管理ページを配置する方法

config/initializers/active_admin.rb に以下の様な記述をすればできます。
(2014年2月3日現在、masterブランチの)ドキュメントに書かれてはいませんが、生成された config/initializers/active_admin.rb のコメントに書かれています。

例1: /super_admin/ 以下に配置したい場合
--------------------------------------
```rb
config.default_namespace = :super_admin
```

例2: / 以下に配置したい場合
--------------------------------------
```rb
config.default_namespace = false
```
Web業界で働くなら押さえておきたい広告基礎用語

抜け漏れや間違い等があればぜひぜひご指摘ください。

# 基礎用語
| 用語 |  意味 |
|:-----|:-----|
| imp(Impression) | 広告の表示回数。 |
| CTR(Click Through Rate) | 広告がクリックされた割合。クリックされた数÷表示回数。 |
| CVR（Conversion Rate） | コンバージョンした割合。コンバージョン数÷表示回数。コンバージョンの内容は広告の目的によって異なる。例として会員登録や商品の購入があげられる。CPA(Cost Per Acquisision/Action=顧客獲得単価)も同じ意味。アプリのダウンロードの場合はCPI(Cost Per Install)と呼ぶ。 |
| CPC(Cost Per Click) | クリック単価ともよばれる。クリック1回あたりの料金。 |
| RPM(Revenue Per Mill) | インプレッション収益とも呼ばれる。広告表示回数1000回あたりの見積もり収益額。eCPM(effective Cost Per Mill)も同じ意味。|
| LP(Landing Page) | 広告をクリックした際に表示されるページのこと。 |
| ROI(Return On Investment) | 投資回収率。広告によって得られた利益÷広告費用。 |
| グロス/ネット| 売上全体をグロス、手数料などの費用を引いた利益をネットと呼ぶ。 |
| クリエイティブ | バナー広告の画像のこと。テキスト広告の場合は「原稿」と呼ばれる。 |
| リーチ | その広告をみたユニークユーザー数。 |
| フリークエンシー | 1人のユーザーがその広告を見た回数。 |
| フリークエンシーキャップ | 1人のユーザーに同じ広告を表示する回数の上限。 |
| 純広告 | 広告主が媒体の広告枠を買い取る方式。対義語にアドネットワークがある。 |

# 課金方式
| 用語 |  意味 |
|:-----|:-----|
| インプレッション保証型広告 | 広告の表示回数で料金を設定する。 |
| クリック保証型広告 | クリック数で料金を設定する。 |
| 成果報酬型広告 | アフィリエイト広告とも呼ばれる。商品の購入などのコンバージョンを達成した場合に料金が発生する。 |

# 広告の種類
| 用語 |  意味 |
|:-----|:-----|
| ディスプレイ（バナー）広告 | 画像の広告。 |
| テキスト広告 | 文字のみで構成される広告。 |
| リッチメディア広告 | 動画広告等の情報量が多い広告を指す。動画の他、マウスポインタを重ねたりクリックした場合に拡大するエキスパンド広告、ページの遷移時や、アプリの終了時に表示されるインタースティシャル広告、コンテンツの上に重ねて表示されるフローティング広告などがある。 |
| 検索連動型広告 | リスティング広告とも呼ばれる。検索エンジンで検索したキーワードに関連した広告を表示する。 |
| タイアップ広告 | 媒体側と協力して作成された広告。 |
| 記事広告 | タイアップ広告の一つ。通常のニュース記事と同じ体裁で書かれた広告。 |
| リワード広告 | ユーザーにインセンティブを与えるもの。アプリをダウンロードしたユーザーにポイントを付与するなど。 |

# 広告効果（CTR）を上げる方法
| 用語 |  意味 |
|:-----|:-----|
| 検索連動 | 検索エンジンで検索したキーワードに関連した広告を表示する。 |
| コンテンツマッチ | サイトのコンテンツに応じた広告を表示する。 |
| インタレストマッチ | 過去に閲覧したページや、検索履歴に応じた広告を表示する。 |
| リターゲティング | 広告主のサイトを訪問したことのあるユーザーに対して、広告を表示させる。ECサイトの商品を見たら、その商品の広告が表示され続けるのはこのため。 |
| デモグラフィックターゲティング | 性別、年齢、住所、職業などのデモグラフィック属性を使う手法。 |
| オーディエンスターゲティング | 後述のアドテク欄を参照。 |

# アドテク
| 用語 |  意味 |
|:-----|:-----|
| アドネットワーク(Ad Network) | 複数のWebサイトの広告枠にまとめて配信する方式。 |
| アドエクスチェンジ(Ad Exchange) | 複数のアドネットワークを束ねたもの。 |
| RTB(Real Time Bidding) | 広告が表示される瞬間にオークションを行い、配信する広告を決定する方式。 |
| SSP(Supply Side Platform) | 媒体社側のシステム。インプレッション毎に最も効果の高い広告を配信する仕組み。 |
| DSP(Demand Side Platform) | 出稿者側のシステム。複数のアドネットワークやアドエクスチェンジに出稿でき、広告効果を学習し最適化を行う。 |
| DMP(Data Management Platform) | 広告の効果を最適化するためにユーザーの情報を保存するプラットフォーム。自社が持っている情報も使うプライベートDMPと、他のサービスのデータのみを使うオープンDMPの2種類がある。 |
| Data Exchange | DMPの情報を取引すること。 |
| オーディエンスターゲティング | DMPの情報を元に、ユーザーに合わせて効果的な広告を配信する方法。 |


http://blog.katty.in/5143 アドテクの超絶わかりやすい説明