OmniAICreator/Qiita-1.07M huggingface dataset:
UILabelのコンテンツをアニメーションする方法

UILabelのコンテンツ(textやtextColorなど)をアニメーションさせたい場合は、CATransactionを使うと簡単に出来る。
これはUIButton.titleLabelなども同様。

```objc
 CATransition *fadeAnim = [CATransition animation];
 [fadeAnim setType:kCATransitionFade];
 [fadeAnim setDuration:0.7f];
 [_button.titleLabel.layer addAnimation:fadeAnim forKey:nil];
    
 _button.titleLabel.textColor = [UIColor redColor];
 _button.titleLabel.text = @"New Title";
```
bitbucketでコミットメッセージからIssueを操作したい

最近まで別のチケット管理システムを使っていたのですが、試しにbitbucketのIssueを使い始めました。
で、コミットメッセージとIssueをリンク・操作できると知らなかったのでそのメモです。

## Issue Hookを追加
リポジトリの設定画面で左カラムのHookより「Issue」を追加してください。
以下みたいな感じになってるなら大丈夫です。

![スクリーンショット 2013-10-31 12.32.11.png](https://qiita-image-store.s3.amazonaws.com/0/4194/420e4208-ef14-4baf-b4f6-d136b20cc4d5.png)

## コミットメッセージでIssueをリンク化
登録したIssueにはそれぞれ番号が振ってあると思いますが、
その番号の前に#を追加してコミットメッセージに書くとリンク化されます。

```
#<Issueの番号> 何かしらのコミットメッセージ
```

例） #15 文字をなんとか〜

![スクリーンショット 2013-10-31 13.29.44.png](https://qiita-image-store.s3.amazonaws.com/0/4194/afd82cac-de02-f1d5-216e-acb6668c699c.png)

こんな感じでリンク化されます。

## Issueをコミットメッセージから操作

コミットメッセージを

```
<コマンド> #<Issueの番号>
```

という感じにすれば操作が可能です。前後に文字が入るのは大丈夫だと思います。

コマンド一覧は以下です。

| 説明 | コマンド（どの単語を使っても同じです） | 例 |
|--------|-----------------|----------|
| link to a changeset for the issue | addresses re references ref refs see | see #34 and #456 |
| mark an issue invalid | invalidate invalidates invalidated invalidating | invalidates #45 |
| mark an issue on hold | hold holds holding | holds #123 |
| mark an issue wontfix | wontfix  | wontfix #12 |
| reopen an issue | reopen reopens reopening  | reopen #746 |
| resolve an issue | close closes closed closing fix fixed fixes fixing resolve resolves resolved resolving | close #845 |

pull requestをmergeするときのコミットメッセージに```fixes #12 #16```などと書くと対応するIssueがまとめてResolveされているのでとても便利でした。

## 参考リンク
[Resolve issues automatically when users push code](https://confluence.atlassian.com/display/BITBUCKET/Resolve+issues+automatically+when+users+push+code)
Backboneでデータバインディングを使ってMVVMをするフロントエンドアーキテクチャ

# 前提

会社(Quipper)で今からこういう風にしたい、と宣言した社内ドキュメントを公開する。
枯れてるわけではない。

* coffeescript
* Backbone
* Backbone.stickit (データバインディング)
* Chapling.js(は、オマケなのでどうでもいいがサンプルコードはこう)

backbone.stickitは安心と信頼のNYT製。(実質Backbone作ってるDocumentCloudと一緒のところ?)
[backbone.stickit](http://nytimes.github.io/backbone.stickit/ "backbone.stickit")

## 目的

データバインディングを全面的に使って再描画を最小限にし、コードの見通しをよくしたい。
モデルの役割を明示的にし、MVVMを導入する。


## 理想的なAPI

擬似コード

```coffeescript

# ビューモデルの定義
class TopicViewModel extends Model
  defaults:
    title: '' # たぶんここでパラメータ名(と仮でもいいので初期値)を書いておくと見通しがよい

# topic.hbs
"""
<span class="title"></span>
"""

# !!! テンプレートはビューモデルにのみ依存してテンプレートを展開する
# getTemplateDataは可能な限り使わない

# controller
  ...
  show: ({topic_id})->
    # Collectionから紐付いたものをとってくる。Collectionの中身は事前に初期化されている。
    # Railsのコントローラに近いイメージでモデルを取得できるようにしておく
    # Modelの役割を本来の意味でのモデルに近づける

    topic = Topics.find {topic_id} #=> Backbone.Collectionはlodashのメソッドをmixinしているのでこういう風に書ける
    # fetchが必要かどうかはモデル次第。Topicに関しては最初に初期化しておきたい


    # 各種モデルを用いてビューモデルを組み立てる
    # ViewModelクラスはBockbone.Modelを継承しているがRESTを叩いたりはせず、ビューの振る舞いだけに興味がある
    topicViewModel = new TopicViewModel
      title: topic.title

    @compose 'topic', new TopicView model: topicViewModel

    # controllerが各種イベントに対するハンドラをもつ

    @subscribeEvent 'updateTopicTitle', (title) ->
      topicViewModel.set 'title', title #=> バインディングがあるのでビューも更新される

    # 仮にビューバインディングで対応できない系(大域に渡る処理)のものは、ある程度受け入れる
    @subscribeEvent 'changeContainerView', ($div) ->
      @$('.content').html $div

# 基本的にイベントは受け取るものは、コントローラで処理する
# コントローラが膨らむ場合は適宜モデルロジック、ビューロジックに移す


# view
# getTemplateDataは可能な限り使わず、ビューモデルにだけ依存する

class TopicView extends View
  # model -> TopicViewModel
  bindings:
    '.title': 'title'
    # ビューに特有な値はonSetなどを用いて生成する

  # ビューイベントをイベント名を翻訳して、コントローラへ向けて発火する
  render: =>
    super
    @stickit()

    # イベントハンドラはrender後に書く
    @delegate 'click', '.i-want-to-change-topic-title-to-hoge', => #雑…
      # コントローラが知るべきものはコントローラに向けてイベントを発火する
      @publishEvent 'updateTopicTitle', 'hoge'
```

## これによって可能になるもの

- サーバーサイドのモデルのコピーと、ビューに紐づくモデルを一貫させ、コードの見通しをよくする。
- パラメータの書き換えを最小限に抑え、再描画を抑えパフォーマンスがよくなる
- ビューの変更はビューモデルを通じて行う
- テストはビューモデルの変更に対して行う(ビューモデルによって生成されるビューには感知しない) #=> DOMに触れずに済む
- テンプレートはビューモデルに一意に依存するので、使えるパラメータが明示的になる


ビューモデルはフロントに近い存在なので、多少汚くてもいい。新しく作る概念なので、ある程度闇を引き受けてもらう。
いままでふわっとした扱いだったModelを明示的に取り回したい。
SkyLabを利用したiOSアプリケーションのABテスト


なんかABテストとか最近ますます重要じゃないすか。[Kaizen Platform](http://kaizenplatform.in/)とか話題だし、日本以外にもスタートアップたくさんできてるし。
ただKaizen Platformはネイティブアプリにまだ対応してないんですよね。残念。
iOSで簡単にABテストするやり方はいろいろあるかもですが、我らが mattt 先生が素敵なライブラリを作ってくれてるので紹介です。

#SkyLabとは
すごくシンプルなABテスト向けライブラリです。ABだけでなく複数のパターンにも対応してます。使い方みれば一目瞭然です。

https://github.com/mattt/SkyLab

#使い方

## 2パターンの場合

AとBブロックのどちらかが50%の割合で実行されます。

```
[SkyLab abTestWithName:@"Title" A:^{
    self.titleLabel.text = NSLocalizedString(@"Hello, World!", nil);
} B:^{
    self.titleLabel.text = NSLocalizedString(@"Greetings, Planet!", nil);
}];
```

## 複数パターンの場合

指定した重みづけの割合で、選択された値がブロックの実行結果として実行されます。

```
[SkyLab splitTestWithName:@"Subtitle" choices:@{
    @"Red" : @(0.15),
    @"Green" : @(0.10),
    @"Blue" : @(0.50),
    @"Purple" : @(0.25)
 } block:^(id choice) {
     self.subtitleLabel.text = NSLocalizedString(@"Please Enjoy This Colorful Message", nil);

     if ([choice isEqualToString:@"Red"]) {
         self.subtitleLabel.textColor = [UIColor redColor];
     } else if ([choice isEqualToString:@"Green"]) {
         self.subtitleLabel.textColor = [UIColor greenColor];
     } else if ([choice isEqualToString:@"Blue"]) {
         self.subtitleLabel.textColor = [UIColor blueColor];
     } else if ([choice isEqualToString:@"Purple"]) {
         self.subtitleLabel.textColor = [UIColor purpleColor];
     }
}];
```

これ便利なのが、WithNameに指定した名前で一旦実行すると、その後同じ名前を実行すれば同じ結果が帰ってきます。結構ABテストのパターンが増えると、表示ロジックもそうだし、ロギングするロジックとかも増えると難しくなりがち（僕だけかも）なんすけど、これだと箇所箇所でこのブロック実行してロジックかけばいいから楽っす。

また、ABテスト結果は、サーバ側にログ送らないと集計できませんが、その部分はこのライブラリでは面倒見てくれません。そこはGoogle AnalyticsとかFlurryとかに上手くログを送って簡単に集計するのがよさそうです。

# 海外のABテスト関連のスタートアップ

Apptimize
http://apptimize.com/

Leanplum
https://www.leanplum.com/

clutch.io
https://github.com/clutchio

一番下のclutch.io は、Twitterに買収される前まではサービスとして存在してたようですが、いまはサービスは停止されてオープンソース化されてます。
一番上のApptimizeだけ少し使ってみましたが、リアルタイムに結果がわかって、かつサーバサイドでABテストの実行をON/OFFできたりすごく便利なんですが、価格が多少高いのと、重み付けの設定方法がいまいちだったので継続利用はやめました。
フカシギの通行止め

```rb
# http://qiita.com/Nabetani/items/9c514267214d3917edf2
#STDOUT.sync=true
$dx=[-2,2,0,0];$dy=[0,0,-2,2]
M=Array.new(9){Array.new(9)}
def d(x,y,d)
	if x==8&&y==8
		$r+=1
	else
		4.times{|i|
			if 0<=x+$dx[i]&&x+$dx[i]<=8 && 0<=y+$dy[i]&&y+$dy[i]<=8
				if !M[y+$dy[i]][x+$dx[i]]&&!M[y+$dy[i]/2][x+$dx[i]/2]
					M[y+$dy[i]][x+$dx[i]]=1
					d(x+$dx[i],y+$dy[i],d+1)
					M[y+$dy[i]][x+$dx[i]]=nil
				end
			end
		}
	end
end
DATA.each_with_index{|e,i|
	$r=0
	M.map!{Array.new(9)}
	M[0][0]=1
	input,expect=e.chomp.split(' -> ')
	expect=expect.to_i
	input[1...-1].split(' ').each{|e|
		a=e.chars.map{|e|e.ord-97}
		d=a[1]-a[0]
		raise if d!=1&&d!=5
		x=a[0]%5*2
		y=a[0]/5*2
		M[y+d/5][x+d%5]=1
	}
	d(0,0,0)
	#p $r
	puts 'Case '+(i+1).to_s+': '+(expect==$r?'OK':'NG')
}
__END__
"" -> 8512 #そのまま。これが最大値。
"af" -> 4256 #対称性より半分になる
"xy" -> 4256 #対称性より半分になる
"pq qr rs st di in ns sx" -> 184 #3x3マスと同値
"af pq qr rs st di in ns sx" -> 92 #3x3マスのパターンの半分
"bg ch di ij no st" -> 185 #3x3マスのパターン +1
"bc af ch di no kp mr ns ot pu rs" -> 16 #4x2x2
"ab af" -> 0 #入口を塞いだ
"ty xy" -> 0 #出口を塞いだ
"bg ch ej gh lm lq mr ot rs sx" -> 11 #2x4+3
"ty ch hi mn kp mr rs sx" -> 18 #6*3
"xy ch hi mn kp mr rs sx" -> 32 #4*8
"ch hi mn kp mr rs sx" -> 50 #6*3+4*8
"ab cd uv wx" -> 621 
"gh mn st lq qr" -> 685 
"fg gl lm mr rs" -> 171
```
ExpressでRedisをセッションストレージにする

```js
var redis = require('connect-redis')(express);
app.use(express.session({
	secret : 'your secret here',
	store : new redis(),
	cookie : {
		httpOnly: false
	}
}));

```
その他オプションとかは適宜。
罠として、app.use(app.router)の前に書かないと動いてくれない。
ServiceアプリとActivityアプリ(別々のアプリ)でSharedPreferencesを使う場合のメモ

めもです。

想定仕様
ServiceアプリでSharedPreferencesを作成して値を書き込む、ActivityアプリでServiceアプリのSharedPreferencesを読み込む。
ServiceアプリはActivityアプリとは独立して動作している。

コードにするとこんな感じ？
Serviceアプリ側

```java
private SharedPreferences mSharedPref = null;

//(onCreteにて)
mSharedPref = this.getSharedPreferences("data",
    Context.MODE_WORLD_READABLE | Context.MODE_MULTI_PROCESS);

//(使いたいところで)
SharedPreferences.Editor editor = mSharedPref.edit();
editor.putString("data", data);
editor.commit();
```

Activityアプリ側

```java
//(使いたいところで。)
Context service = createPackageContext("com.sample.service",
    CONTEXT_RESTRICTED);
SharedPreferences sharedPref = service.getSharedPreferences("data",
    Context.MODE_PRIVATE | Context.MODE_MULTI_PROCESS);
String data = sharedPref.getString("data", "");
```

何が言いたかったかというと、
お互いにContext.MODE_MULTI_PROCESSを設定しないとActivityアプリ側では即時反映された値が取得できなかったので注意。
ssh の設定ファイルを使って rsync で簡単にファイル転送

sshのログインを簡単に - Qiita [キータ]
http://qiita.com/ironsand/items/1910c49bc3ebef870a8d

で書いたように

```~/.ssh/config
Host sakura
  HostName servername
  User username
  Port 10022
```

こんな感じに設定しておくと `ssh sakura` だけでサーバーに接続できるようになって便利なんですが、
rsyncを使うときには

`rsync -e "ssh -p 10022"`

のようにめんどくさい事を今までやってました。

## 解決策

`rsync foo.txt sakura:/home/ironsand/`

でOKだったそうです。簡単！

## 参考

How to use `~/.ssh/config` setting for each server by `rsync` - Unix & Linux Stack Exchange
http://unix.stackexchange.com/questions/94421/how-to-use-ssh-config-setting-for-each-server-by-rsync
VagrantでRailsが遅い時の対処法

# VagrantでRailsが遅いときの対処法

Vagrant利用してる時に```rails s```がとても遅いくて使えないと云う時はVagrantfileに

```
Vagrant::Config.run do |config|
  config.vm.network :hostonly, "192.168.33.10" # NFSを利用するので設定
  config.vm.share_folder 'v-root', 'vagrant', '.', nfs: true # version 1の場合
  # config.vm.synced_folder ".", "/vagrant", nfs: true # version 2の場合
end
```

を追加するとだいぶ早くなります．

## 参考サイト
http://snippets.aktagon.com/snippets/609-slow-io-performance-with-vagrant-and-virtualbox-
http://kubaf.wordpress.com/2013/01/12/vagrant-speed-up-on-mac-os-x/
DialogFragmentの表示でハマったこと

# AlertDialogFragmentを定義しました

ちゃんと setArgumentsでデータを渡しました．
ちゃんと publicなデフォルトコンストラクタ用意しました．

## でも画面回転で落ちた．

> android.app.Fragment＄InstantiationException: Unable to instantiate fragment com.example.test.MainActivity＄1: make sure class name exists, is public, and has an empty constructor that is public

え？publicなデフォルトコンストラクタを用意しろって？あれ？

## 呼び出し側がマズかった
```java:MainActivity.java
AlertDialogFragment dialog = new AlertDialogFragment() {
	@Override
	public void onDismiss(DialogInterface dialog) {
		// dismiss で処理をしたかった
		super.onDismiss(dialog);
	}
};
dialog.setCancelable(false);
Bundle bundle = new Bundle();
bundle.putString("title", "test");
bundle.putString("message", "test");
bundle.putString(AlertDialogFragment.ARG_LABEL_POSITIVE, "yes");
bundle.putString(AlertDialogFragment.ARG_LABEL_NEGATIVE, "no");
dialog.setArguments(bundle);
getFragmentManager().beginTransaction().add(dialog, "TEST").commitAllowingStateLoss();
```

## あ゛っ！
```java:MainActivity.java
AlertDialogFragment dialog = new AlertDialogFragment() {
	@Override
	public void onDismiss(DialogInterface dialog) {
		// dismiss で処理をしたかった
		super.onDismiss(dialog);
	}
};
```

そりゃ，匿名クラスにしちゃったら作成したAlertDialogFragmentとはベツもんだよね．
だから，再生成の際にコンストラクタがないよって言われちゃったのね．
この辺はうっかりやっちゃうよね（おれだけ？）
のんびり座りたい

```rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/4364285801d1c9f370a1
#http://nabetani.sakura.ne.jp/hena/ord7selectchair/
STDOUT.sync=true
while gets
	a=$_.chomp.split(':')
	n=a[0].to_i
	chairs=Array.new(n+2)
	list={}
	a[1].chars{|e|
		if ('a'..'z').include?(e)
			chairs[list[e.upcase]]=nil
			list.delete(e.upcase)
		else
			x=1.step(n).map{|i|
				if chairs[i]
					[999,i]
				else
					[(chairs[i-1]?0:-1)+(chairs[i+1]?0:-1),i]
				end
			}.min
			chairs[x.last]=e
			list[e]=x.last
		end
	}
	puts chairs[1..n].map{|e|e ? e : '-'}*''
end
```
v8でHelloWorld

node.jsのv0.11を試していたら、ネイティブモジュールが軒並みビルドできなくなっていて、調べて行ったらどうやらv8のAPIが変わったようです。

いくつかネイティブモジュールを対応させてみようと思ったけどv8自体がよくわからなかったのでHello Worldから始めてみることにしました。

とりあえずv8をインストール。

```
$ brew install v8
```

```
$ v8 
V8 version 3.19.18.4 [sample shell]
> 
```
バージョン3.19.18.4と言うのが入ったようです。


* [node.jsとは何か(4)](http://d.hatena.ne.jp/badatmath/20101101/1288644245)
* [Getting Started](https://developers.google.com/v8/get_started?hl=ja&csw=1)

↑のページを参考にファイルからJavaScriptを読み込んで実行するコードを書いてみました。


```c++:hello.cpp
#include <v8.h>

using namespace v8;

Handle<String> ReadFile(const char* name) {
        FILE* file = fopen(name, "r");
        if (file == NULL) return Handle<String>();

        fseek(file, 0, SEEK_END);
        int size = ftell(file);
        rewind(file);

        char* chars = new char[size + 1];
        chars[size] = '\0';
        for (int i = 0; i < size;) {
                int read = fread(&chars[i], 1, size - i, file);
                i += read;
        }

        fclose(file);

        Handle<String> result = String::New(chars, size);
        delete[] chars;
        return result;
}

int main(int argc, char* argv[])
{
        Isolate* isolate = Isolate::GetCurrent();
        HandleScope handle_scope;

        Handle<Context> context = Context::New(isolate);
        Persistent<Context> persistent_context(isolate, context);

        Context::Scope context_scope(context);

        if (argc < 2) {
                fprintf(stderr, "script was not specified.\n");
                return 1;
        }

        Handle<String> source = ReadFile(argv[1]);
        Handle<Script> script = Script::Compile(source);

        Handle<Value> result = script->Run();

        persistent_context.Dispose();

        String::AsciiValue ascii(result);
        printf("%s\n", *ascii);
        return 0;
}
```

コンパイル

```
$ g++ -Iinclude hello.cpp -o hello -lv8_base.x64 -lv8_nosnapshot.x64 -lpthread
```

JavaScriptでHello Worldを作成

```JavaScript:test.js
function join(a, b) {
  return a + b;
}

join("Hello", ", World");
```

実行

```
$ ./hello test.js 
Hello, World
```

ちょっと雰囲気が掴めました。
exports と module.exports の違い

なんかややこしい解説が多いが、そんなに難しい話ではない。
1. `exports = module.exports = {}` が予め実行されていて、
2. 最終的に評価されるのは `module.exports`
ということ。

心配だったら常に `module.exports` を使えば OK だし、(正しく記述されているコードを)読む時は全部脳内で `module.exports` と読み替えてしまって良い。

じゃあどこで差が出るのか、なんでややこしい解説がされてるのか。

`exports = なんたら` という式は、`exports`の中身をごっそり入れ替えてしまうので、`exports == module.exports`の関係が壊れる。
`exports.hoge = 1` はこの関係を崩さない。

歴史的経緯によれば（ぶっちゃけ想像ですが）もともとは exports しか無かった。つまり、

```javascript
var hoge = require('./hoge');
hoge.foo();
hoge.bar();
```
という形の使い方しか想定してなかった。
ところが、誰かが `new hoge` したい、と言い出した。(恐らく他の誰かが `new hoge.Hoge`とすればいいじゃん、と反論しただろうが、美しくない、と却下された)
exports だけではこれは実現出来ない。そこで、あとから module.exports という記法が追加された。

多分そんなことだろうと思います。想像ですが。
org-modeのテーブルをHTMLその他任意の形式に変換する

org-modeでテーブルが簡単に書ける機能、便利ですよね。

いったんorg-mode上でテーブルを書くのに慣れてしまうと、もうHTMLやCSVなどの形式でテーブルを書くのが億劫で仕方ありません。あまりに億劫なので、org-mode以外のテーブル形式に対してもorg-modeのテーブルのように楽々編集を行う方法が無いか調べてみました。

# orgtbl-modeではHTMLやCSVの表は編集できない

org-mode以外のメジャーモードでもorg-mode同様のテーブルの編集ができるマイナーモードとしてorgtbl-modeがあります。当初はこれをカスタマイズすることで、「tableタグ内の各セルをTABで移動」、「末尾まで到達してタブで次の行を追加」などの操作ができるようになるのでは……と妄想していたのですが、公式のドキュメントによるとしんどいのでやめた方がよい旨のことが書かれていたのであっさり挫折です。

[Tables in arbitrary syntax - The Org Manual](http://orgmode.org/manual/Tables-in-arbitrary-syntax.html#Tables-in![orgtbl.png](https://qiita-image-store.s3.amazonaws.com/0/14347/42113a3f-7e4a-3bc1-7a6c-f9acd4385381.png)
-arbitrary-syntax)
> Since Orgtbl mode can be used as a minor mode in arbitrary buffers, a frequent feature request has been to make it work with native tables in specific languages, for example LaTeX. However, this is extremely hard to do in a general way, would lead to a customization nightmare, and would take away much of the simplicity of the Orgtbl mode table editor.

# org-mode記法で書いたテーブルを他の形式に変換することはできる

上記のドキュメントの続きを読むと、org-mode形式ではないテーブルをorg-modeのように編集することはできないものの、org-mode形式で書いたテーブルを任意の形式に変換することはできるようなのでそちらを試してみました。

# 変換機能を利用してorg-modeのテーブルからHTMLのテーブルをつくる
以下では、org-mode形式で書いたテーブルをHTMLのテーブルに変換した際の手順を記載します。

## HTMLの中にコメントとしてorg-mode形式のテーブルを書く
orgtbl-modeを使用してHTMLの中にorg-mode形式のテーブルを書きます。このままブラウザに表示されては困るのでHTMLのコメント内に記載するのがよいでしょう。`orgtbl-to-html`はテーブル書式の変換に使う関数名です。

```html
<!--
#+ORGTBL: SEND my-table orgtbl-to-html
|     a |     b |    c |
|-------+-------+------|
| 11111 | 22222 | 3333 |
| 11111 | 22222 | 3333 |
-->
```

## 変換後のテーブルを挿入する箇所を指定する

変換後のテーブルを挿入したい箇所に以下の記述を追加します。`my-table`の部分は、先ほどの手順でSENDのところに記載した値と一致する必要があります。

```html
<!-- BEGIN RECEIVE ORGTBL my-table -->
<!-- END RECEIVE ORGTBL my-table -->
```
## 変換する

org-mode形式のテーブル上にカーソルを移動し`C-c C-c`を押下すると、先ほど記載した`BEGIN`と`END`の間に、HTMLのタグに変換されたテーブルが挿入されます。

```html
<!--
#+ORGTBL: SEND my-table orgtbl-to-html
|     a |     b |    c |
|-------+-------+------|
| 11111 | 22222 | 3333 |
| 11111 | 22222 | 3333 |
-->

<!-- BEGIN RECEIVE ORGTBL my-table -->
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup><col class="right" /><col class="right" /><col class="right" />
</colgroup>
<thead>
<tr><th scope="col" class="right">a</th><th scope="col" class="right">b</th><th scope="col" class="right">c</th></tr>
</thead>
<tbody>
<tr><td class="right">11111</td><td class="right">22222</td><td class="right">3333</td></tr>
<tr><td class="right">11111</td><td class="right">22222</td><td class="right">3333</td></tr>
</tbody>
</table>
<!-- END RECEIVE ORGTBL my-table -->
```

こんな感じの表ができます。
![orgtbl.png](https://qiita-image-store.s3.amazonaws.com/0/14347/ff4ce5c8-13ec-31cd-2724-1af7ffba7033.png)

## 変換形式のカスタマイズ
今回はテーブルの変換関数として`orgtbl-to-html`を使用しましたが、`orgtbl-to-csv`や`orgtbl-to-latex`などの関数を指定することで別の形式に変換することもできます。`orgtbl-to-generic`を使用すると、変換後のテーブルの先頭や末尾、行頭行末の文字などを細かく指定できるので、マイナーな形式のテーブルへの変換などにも柔軟に対応できるのではないかと思いました。

# 感想：うーん……
変換なんてまわりくどいことをせずに、やはりそのままの形式で編集したいのでコレジャナイ感は否めませんでした。ソースの中にorg-mode形式の表を埋め込むのも現実的ではない気がします。
PHPのnullの意味

PHPでの null と false の使い分けの指針として、タイプヒンティングの仕様を参考に考えるという話。

```php
/**
 * @param \DateTime $d
 * @return \DateTime
 */
function test(\DateTime $d)
{
     return $d;
}
```

これで `DateTime` じゃない型の変数を入れると fatal error になる関数のできあがり。

...なんですが、引数を省略できるようにしたいときどうするか。デフォルト引数に意味のあるインスタンスを指定できない(PHPはJavaと違ってstatic領域に静的に存在するインスタンスを定義できない)ので、なにか代わりの即値を入れるんですが...

```php
function test(\DateTime $d = 0) { ... }
```

これはエラー。

```php
function test(\DateTime $d = false) { ... }
```

これもエラー。

```php
function test(\DateTime $d = null) { ... }
```

これはオッケー。タイプヒンティングのある引数のデフォルト引数には null しか書けないのです。

ってことは、これってつまり:

```php
test();
```

これのことですね。

```php
test(null);
```

`DateTime` のインスタンスしかダメなはずの引数なのに、特別に `null` と書いても通るということ。ここ、`0` や `false` だと fatal error です。

`null` でもオッケーな関数宣言をあらためて。

```php
/**
 * @param \DateTime $d
 * @return \DateTime
 */
function test(\DateTime $d=null)
{
     return $d;
}
```

phpDocの型宣言として見た場合、型の部分は、「その型の値 (**もしくは `null`**)」という意味を暗に持つということになります。`null instansof Any == true` なのです。Javaっぽいです。Scalaで考えるとさらによくわかります。

ということで、戻り値も、その型もしくは `null` を返すことを保証する、というふうに考えれば、

```php
test(test(null));
```

は、型違反ではありません。あの「失敗した場合falseを返します」仕様は、このようなタイプヒンティング仕様とは矛盾するのです。というわけで、

```php
/**
 * @param DateTime|false $d
 * @return DateTime|false
 */
function test($d=false) { ... }
```

こういうのは、せっかくタイプヒンティングのあるPHP5世代のインターフェースとしては、避けたほうがいいですね。`false` を使う関数は、型を合わせる意識がなかった、あのPHP4時代の名残なのです。

暗黙的に 「`null` かもしれない」は偏在しているので、`false` とは違い、Docコメントに `@param \DateTime|null $d` と書く必要はありません。PhpStormでも、オブジェクトまたは `false` を入れる関数に関しては、`|false` が必要ですが、そのいっぽうで `|null` は書かなくてもそう解釈してくれます。

あ、けど、デフォルト引数指定しないタイプヒンティングは `null` すら禁止になるので、そこはJavaと違ってていいですね。少なくともあのヌルポの心配はしなくていい。

新しく書くライブラリ、書き換えても問題ない箇所では、積極的に `null` を使っていきましょうというのが、最近のPHPの仕様変更の理由ですね。これまで書いてた `===false` がバグるかもしれないのは辛いですが、まあ、未来に向かっていきますか。
定期的にファイルのバックアップを2行で(別途でcronの設定とかは必要)

はい。なにかちょっとしたホントに小さい容量のファイルとかバックアップ取るのにアレです。
バックアップというかただ単にコピーして、元々の名前＋タイムスタンプで隔離するだけですけど

```sh:log.sh
#!/bin/sh
cp /xxxx/hoge.txt /隔離先/hoge.txt.`date +%Y%m%d`
```

だけです。tar.gzで圧縮とかsqlファイルをdumpしてとかそんなのを何もナシにホントに隔離してコピー取るだけをバックアップとして扱っても良い場合はこの2行で。とりあえずウチでコレでコピーを隔離させられたので目的は果たせました。

というか
```/bin/sh log.sh```
で実行させるなら一行目も省略できるのかな。
JUnit + jMockit が良いよ

私がjMockitに出会ったのは去年の夏でした…ってのはどうでも良くてjMockitを紹介したく。
素晴く色々できるのですがイマイチ情報が少ないので言いたいことだけ書いちゃいます。

ちなみにこの辺を参考に。

* http://jmockit.googlecode.com/svn/trunk/www/tutorial/BehaviorBasedTesting.html
* http://d.hatena.ne.jp/j5ik2o/20110205/1296922274

## コンストラクタのモッキングができる

```java:Hoge.java
public String doAnything() {
    String name = new Hoge().getName();
    return "こんにちは" + name;
}
```

DI使ってないとこんな書き方してたりしますよね。
でもjMockitなら大丈夫。

```java:HogeTest.java
class HogeTest {
    @Mocked
    private Fuga fuga;

    @Test
    public void doAnythingのテスト() {
        Hoge hoge = new Hoge();
        new Expectations() {{
             new Fuga(); result=fuga;
             fuga.getName(); result="ホゲ男";
        }}
        assertThat(hoge.doAnything() ,is("こんにちはホゲ男"));
    }
}
```

コンストラクタそのものをモッキングして、モックインスタンスを変えさせることができます。

### static メソッドのモッキングができる

```java:Hoge.java
public String doAnything() {
    String name = Hoge.getName();
    return "こんにちは" + name;
}
```

staticメソッド使ったりしますよね。
でもjMockitなら大丈夫。

```java:HogeTest.java
class HogeTest {
    @Mocked
    private Fuga fuga;

    @Test
    public void doAnythingのテスト() {
        Hoge hoge = new Hoge();
        new Expectations() {{
             Fuga.getName(); result="ホゲ男";
        }}
        assertThat(hoge.doAnything() ,is("こんにちはホゲ男"));
    }
}
```

って書き始めると、

* Verificationでモックが呼ばれた回数をチェック
* Verificationでモックに渡された引数をassert
* 部分モッキング
* テスト対象のクラスのprivateメソッドの部分モッキング
* privateなフィールドに無理やり値を代入してテスト
* カスケードモッキング

とネタがまだあるのに疲れたのでまた今度にします。
Homebrewのpatchesについて

HomebrewのFormulaで定義する関数`patches`の戻り値は、そのままFormulaで使用するパッチのURL一覧として使われます。

戻り値がリストの場合は、すべて`patch -p1`の入力として処理されます。では、`patch`コマンドの`-p`オプションの引数、つまり`patch`の`strip`値（?）を変更したい場合はどうすればいいのでしょう。Homebrewの[Formula Cookbook](https://github.com/mxcl/homebrew/wiki/Formula-Cookbook)によるとハッシュを使うようにと書かれています。

> If the patches are not p1, return a Hash

そこで、`patches`の中では、以下のような戻り値を返すようにするためのコードがよく見られます。

```ruby:
{ :p0 => "patch -p0で当てたいパッチ",
  :p1 => "patch -p1で当てたいパッチ",
  :p2 => "patch -p2で当てたいパッチ" }
```

つまりハッシュのキーでパッチレベルを指定し、ハッシュのバリューでパッチのURLを指定することになります。

では、`patch -p0`で当てたいパッチが複数ある場合はどうすればいいのでしょう。

```ruby:
{ :p0 => "patch -p0で当てたいパッチその1",
  :p1 => "patch -p1で当てたいパッチ",
  :p0 => "patch -p0で当てたいパッチその2" }
```

とやっても`patch -p0`で当てたいパッチその1・その2両方は当たりません（ハッシュであることを考えれば当然ですね）。

答えは以下の通り、でした。

```ruby:
{ :p0 => [ "patch -p0で当てたいパッチその1",
           "patch -p0で当てたいパッチその2" ],
  :p1 => [ "patch -p1で当てたいパッチ" ]  }
```

[Formula Cookbook](https://github.com/mxcl/homebrew/wiki/Formula-Cookbook)にはなぜか書かれていなかったので、書き留めておきます。
vagrantでVirtualBox4.3用のbox作り方 (ubuntu13.10)

VirtualBoxが4.2から4.3にアップデートのためVirtualBox Guest Addonsの更新が必要となった。
いい機会なのでboxを自作してみた。

ダウンロード
==============
* [Saucy64_VirtualBox4.3.box 415MB](https://www.dropbox.com/s/x0miisbs16osmk9/Saucy64_VirtualBox4.3.box)

特徴
-----
* localeとtimezoneが日本!
* build-essentialが入っているので将来のVirtualBox Guest Addonsのインストールも対応可能。
* 不要なパッケージは削除していません。というか
* chefやpuppet使えてないので含めてません。（使い方覚えたらいれときます。）

QuickTutorial
===========
* `vagrant package --base <vms名>` でpackage.boxが出来る。


以下作成手順


OSセットアップ
==============
* 今回使用したのは ubuntu-13.10-server-amd64.iso
* hddは40gb
* / に全容量を割り当て、swapは作らない。
* ssh serverのみインストール
* id:pass = vagrant:vagrant

OSセットアップ後
==============

```bash:最新版にupdate
$ sudo apt-get upgrade
```

sudoers
--------------

```bash:
$ vim /etc/sudoers
vagrant ALL=(ALL:ALL) NOPASSWD:ALL
```

ssh鍵
-----

```bash:
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ curl -L -o authorized_keys http://bit.ly/mqvENf
$ chmod 600 authorized_keys
```

http://bit.ly/mqvENf は https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub の短縮URL

sshd
-----

```bash:ssh接続を早くするため追記
$ sudo vim /etc/ssh/sshd_config
UseDNS no
```

grub
-----

```bash:起動速度を早くするため
$ sudo vim /etc/default/grub
GRUB_HIDDEN_TIMEOUT=0
$ sudo update-grub
```

failsafe.conf
-------------
* sleepの行をコメントアウト

virtualbox guest addon
----------------------

```bash:
$ sudo apt-get install build-essential
$ mount /dev/cdrom /media
$ /media/VBoxLinuxAdditions.run
```

権限確認
----------------------

```bash:
$ sudo chown vagrant:vagrant $(find $HOME -uid 0)
```

不要なファイル削除
----------------------

```bash:
$ rm /var/lib/dhcp/*
$ cat /dev/null > ~/.bash_history
```

ゼロ埋め
----------------------

```bash:
$ dd if=/dev/zero of=empty bs=1M
$ rm empty
```

boxの作成
========

```bash:
$ VBoxManage list vms
$ vagrant package --base saucy
```

package.box が作成される。

chef
======
* chefはここで勉強する http://tsuchikazu.net/chef_solo_start/

```bash:ホストにchefをインストール
$ sudo gem i chef --no-ri --no-rdoc
$ knife configure
$ sudo gem i knife-solo --no-ri --no-rdoc
$ knife solo init chef-repo
```

```bash:ゲストにchefをインストール
$ vagrant ssh-config --host saucy >> ~/.ssh/config
$ knife solo prepare saucy
```
C#とLINQで直積集合

C#をかじり始めました。LINQがなかなか面白そうだったので、試しに直積集合を作ってみました。
直積集合とは2つの集合$A, B$から次のように作られる集合です:

```math
\left\{ (a, b) \mid {a \in A} \wedge {b \in B} \right\}
```

ペアの集合だけではつまらないので、九九表を出力するプログラムにしました:

```csharp:Test.cs
using System;
using System.Linq;

public class Test
{
	public static void Main()
	{
		var e = Enumerable.Range(1, 9);
		var qq = from n in e from m in e select new {x = n, y = m, z = n*m};
		foreach (var x in qq) Console.WriteLine(x.ToString());
	}
}
```

`from`を2つ重ねています。このクエリ式は下の`SelectMany`拡張メソッドを使用した式と等価なようです。

```csharp:Test.cs
using System;
using System.Linq;

public class Test
{
	public static void Main()
	{
		var e = Enumerable.Range(1, 9);
		var qq = e.SelectMany(n => e, (n, m) => new { x = n, y = m, z = n * m });
		foreach (var x in qq) Console.WriteLine(x.ToString());
	}
}
```

以上。
長いタイトルのときの水平棒グラフ && 降順で積み上げ水平棒グラフ

## 目標

![barh.png](https://qiita-image-store.s3.amazonaws.com/0/1538/d01b0caf-4d3c-f563-d80d-e6de73a4c306.png)

+ 水平棒グラフを描画するときにy軸の目盛に付けるタイトルが長すぎるのでグラフの中に入れる
  + タイトルが見やすいように棒グラフの色を薄くする
  + 中に入れても長すぎる場合はタイトルを折り返す。折り返されたタイトルのフォントは少し小さくする
+ 積み上げ水平棒グラフを積み上げた時の数の降順でソートする

## コード

```py
#!/usr/bin/python
#-*- coding:utf8 -*-
import numpy as np
import textwrap
import matplotlib; matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import *
from matplotlib.font_manager import FontProperties as FP

### Use Japanese fonts
fprop = FP(fname=r'/cygdrive/c/Windows/Fonts/meiryo.ttc')

### dataset
titles = [
        u'あ' * 30,
        u'い' * 40,
        u'う' * 50,
        u'え' * 60,
        u'お' * 70,
]
n_red = [10, 20, 30, 40, 30]
n_white = [20, 40, 30, 10, 20]
n_blue = [40, 20, 30, 10, 20]

### sorted list
sorted_titles = []
sorted_n_red = []
sorted_n_white = []
sorted_n_blue = []
empty = []
for (title, red, white, blue) in sorted(zip(titles, n_red, n_white, n_blue), key=lambda x:x[1]+x[2]+x[3]):
    sorted_titles.append(title)
    sorted_n_red.append(red)
    sorted_n_white.append(white)
    sorted_n_blue.append(blue)
    empty.append('')

N = len(titles) ### number of bars
ind = np.arange(1, N * 2, 2) ### positions of bars
width = 2. ### width of a bar

lw = 0.3 ### linewidth
a = 0.4 ### transparency

barh_red = plt.barh(ind, sorted_n_red, width, color='r', linewidth=lw, alpha=a)
bottom = sorted_n_red ### start positions on x-axis of barh_white
barh_white = plt.barh(ind, sorted_n_white, width, bottom, color='w', linewidth=lw, alpha=a)
bottom = [red + white for (red, white) in zip(sorted_n_red, sorted_n_white)] ### start positions on x-axis of barh_blue
barh_blue = plt.barh(ind, sorted_n_blue, width, bottom, color='b', linewidth=lw, alpha=a)

### Ignore yticks here
plt.yticks(ind + width / 2, empty)

legend((u'赤色', u'白色', u'青色'), prop=fprop, loc='upper center', ncol=3)
grid()
xlabel(u'数', fontproperties=fprop)
tight_layout() ### automatically adjusts figure size

for title, rect in zip(sorted_titles, barh_red):
    yloc = rect.get_y() + rect.get_height() / 2.0
    xloc = 1
    text_width = 30
    wrapped_texts = textwrap.wrap(title, text_width)
    if len(wrapped_texts) > 1:
        fs = 12
    else:
        fs = 14
    text(xloc, yloc, textwrap.fill(title, text_width), ha='left', va='center', fontproperties=fprop, fontsize=fs)

savefig('barh.png')
```

## 参考
+ http://stackoverflow.com/questions/10351565/how-do-i-fit-long-title
CartoCSSのエレメント一覧


[CartoCSS](https://www.mapbox.com/carto/)の左側メニューの一覧。
Webページの段組表示が異常に見づらいので、個人用メモを兼ねて。

# Map Elements


## All elements
image-filters
comp-op
opacity
map
background-color
background-image
srs
buffer-size
base
font-directory

## polygon
polygon-fill
polygon-opacity
polygon-gamma
polygon-gamma-method
polygon-clip
polygon-smooth
polygon-geometry-transform
polygon-comp-op

## line
line-color
line-width
line-opacity
line-join
line-cap
line-gamma
line-gamma-method
line-dasharray
line-dash-offset
line-miterlimit
line-clip
line-smooth
line-offset
line-rasterizer
line-geometry-transform
line-comp-op

## markers
marker-file
marker-opacity
marker-fill-opacity
marker-line-color
marker-line-width
marker-line-opacity
marker-placement
marker-type
marker-width
marker-height
marker-fill
marker-allow-overlap
marker-ignore-placement
marker-spacing
marker-max-error
marker-transform
marker-clip
marker-smooth
marker-geometry-transform
marker-comp-op

## shield
shield-name
shield-file
shield-face-name
shield-unlock-image
shield-size
shield-fill
shield-placement
shield-avoid-edges
shield-allow-overlap
shield-min-distance
shield-spacing
shield-min-padding
shield-wrap-width
shield-wrap-before
shield-wrap-character
shield-halo-fill
shield-halo-radius
shield-character-spacing
shield-line-spacing
shield-text-dx
shield-text-dy
shield-dx
shield-dy
shield-opacity
shield-text-opacity
shield-horizontal-alignment
shield-vertical-alignment
shield-text-transform
shield-justify-alignment
shield-clip
shield-comp-op

## line-pattern
line-pattern-file
line-pattern-clip
line-pattern-smooth
line-pattern-geometry-transform
line-pattern-comp-op

## polygon-pattern
polygon-pattern-file
polygon-pattern-alignment
polygon-pattern-gamma
polygon-pattern-opacity
polygon-pattern-clip
polygon-pattern-smooth
polygon-pattern-geometry-transform
polygon-pattern-comp-op

## raster
raster-opacity
raster-filter-factor
raster-scaling
raster-mesh-size
raster-comp-op

## point
point-file
point-allow-overlap
point-ignore-placement
point-opacity
point-placement
point-transform
point-comp-op

## text
text-name
text-face-name
text-size
text-ratio
text-wrap-width
text-wrap-before
text-wrap-character
text-spacing
text-character-spacing
text-line-spacing
text-label-position-tolerance
text-max-char-angle-delta
text-fill
text-opacity
text-halo-fill
text-halo-radius
text-dx
text-dy
text-vertical-alignment
text-avoid-edges
text-min-distance
text-min-padding
text-min-path-length
text-allow-overlap
text-orientation
text-placement
text-placement-type
text-placements
text-transform
text-horizontal-alignment
text-align
text-clip
text-comp-op

## building
building-fill
building-fill-opacity
building-height

## Values
Color
Float
URI
String
Boolean
Expressions
Numbers
Functions
アトリビュート


　　　　クラス＝＝＝組み込み型  　　　　　　 　　プラグラムで使う部品の「設計図」
　　　クラス名＝＝＝組み込み型の名前（数値、文字列など）
　インスタンス＝＝＝オブジェクト　　　　　　　　メソッドと変数
アトリビュート＝＝＝データ 　　　　　　　　　　　変数
アトリビュートの名前＝＝＝					？？？
Google API Console の API Access って…


[Google API Console](https://code.google.com/apis/console/) の API Access って、複数のアプリを登録できたんですね。気づかなかった。。。

![img1](http://blog.amay077.net/assets/images/posts/multi_apps_in_google_api_console_01.png)

>\<SHA1フィンガープリント>;<アプリのパッケージ名><改行>
>\<SHA1フィンガープリント>;<アプリのパッケージ名>

って書けばよかったんだ。

新しくなった [Cloud Console](https://cloud.google.com/console) では、 +/- ボタンが付いて分かりやすい。

![img1](http://blog.amay077.net/assets/images/posts/multi_apps_in_google_api_console_02.png)
メソッドの中身を２回目からは同じ値を取得するようにしたい

それはMemoizeやメモ化と呼ぶらしい。

参考:
<http://blog.papix.net/entry/2013/01/14/133015>

これPHPで。


```php
<?php

class Huge
{
    public function get()
    {
        static $hi = null;
        if ($hi === null) {
            var_dump('hoooooo');
            $hi = 'fooo';
        }
        return $hi;
    }
}

$huge = new Huge;
var_dump($huge->get());
var_dump($huge->get());

//string(7) "hoooooo"
//string(4) "fooo"
//string(4) "fooo"
```

参考:
<http://www.php.net/manual/ja/language.variables.scope.php#>

`static`を記述しないでも良いモジュールとかあるかも知れないけどさくっとやりたい時はこれで良い。
Railsで日本語サービスを作るときのテンプレート


## apprication.rbの設定

日本メインで、英語でも読めるようにする設定

```ruby:config/application.rb
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
    config.i18n.default_locale = :ja
    config.i18n.available_locales = [:ja, :en]
    config.time_zone = 'Tokyo'
```

## ActiveRecordの日本語化用テンプレート

```ruby:config/locales/01_model/ja.yml
ja:
  activerecord:
    errors:
      template:
        header:
          one:   "%{model}にエラーが発生しました。"
          other: "%{model}に%{count}つのエラーが発生しました。"
        body: "次の項目を確認してください。"
      messages:
        taken: "はすでに存在します。"
        record_invalid: "バリデーションに失敗しました。 %{errors}"
      full_messages:
        format: "[%{attribute}]%{message}"
      models:
        user:
          attributes:
            base:
              restricted:  "制限付きユーザーには許可されていない動作です"
            company_id:
              user_not_working_for: "ユーザが所属していない会社です"
    models:
      user: ユーザー
      company: 会社
    attributes:
      user:
        name: 名前
        age: 年齢
      company:
        name: 会社名
    attribute_values
       #...
    enum
       #...
```

## 解説

`config.i18n.load_path`の設定でconfig/locales以下のどの階層のディレクトリも読み込ませるようにしておくのがミソ。
こうすることで、ディレクトリを分けることでカテゴリごとにi18nのデータを管理することができる様になる。

各言語用ymlファイルは、`01_model`というように数値のprefixをつけたディレクトリに入れ、以下の様な構成にする。

- config/locales/00_base/ja.yml
- config/locales/01_model/ja.yml
- config/locales/02_mailer/ja.yml
- config/locales/99_adhoc/ja.yml

YAMLは同じキーがあった場合は内容を上書きするので、00などをつけて順番を選べるようにしておくと都合が良い。
辞書順に上から読み込まれて行くので、内容がコンフリクトした場合は数値が大きいほうの設定が使われる様になる。

ちなみに、00_base/ja.ymlは[rails-i18n](https://github.com/svenfuchs/rails-i18n)のデータを丸コピーしたものを使う、もしくは`gem install`する。
( https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml )

enの設定もする際は、完全にja.ymlと1対1対応するように`config/locales/01_model/en.yml`を記述しておいたほうが無難。これは(i18n-spec)[https://github.com/tigrish/i18n-spec]でテストを書くことで保証できる。
実際、英語の場合、Localeファイルをちゃんと設定しなくてもモデル名や属性名そのままでいいみたいなことが多いので、特に設定しなくてもあまり困らない。しかし、

- 後々メンテナンスする時、各言語でキーが同じ順、同じ行数でないとミスが起こりやすくなる。
- [i18n-js](https://github.com/fnando/i18n-js)などを使ってJavascript連携するとき、en.ymlに対応する英語が無いとうまくいかない。

といった理由で、少々手間でも、はじめから全てを書いておくことを推奨する。
VCR/WebMock/RSpecで外部と通信を行うテストを書く



## VCRのインストール

Gemfileに以下を追加して`bundle install`

```Gemfile
group :test do
  gem 'vcr'
  gem 'webmock', ">= 1.8.0", "< 1.12"
end
```

## RSpec用設定

`spec/spec_helper.rb`に以下の内容を追加

```ruby:spec/spec_helper.rb
RSpec.configure do |config|
  #  some other codes… #

  VCR.configure do |c|
    c.cassette_library_dir = 'spec/vcr_cassettes'
    c.hook_into :webmock
  end

  # SpecのDescriptionを元にVCRのファイル名を生成する
  config.around(:each, :vcr) do |example|
    name = example.metadata[:full_description].split(/\s+/, 2).join("/").underscore.gsub(/[^\w\/]+/, "_")
    options = example.metadata.slice(:record, :match_requests_on).except(:example_group)
    options.reverse_merge!(record: :new_episodes)
    VCR.use_cassette(name, options) { example.call }
  end
end
```

`c.cassette_library_dir`の場所は色々流儀があるようだが、通常FactoryGirlのfactoryデータが`spec/factories`下に入っているはずなので、それに合わせる形で、`spec/vcr_cassettes`と指定している。



### 参考:

- https://github.com/vcr/vcr
- http://natashatherobot.com/vcr-gem-rails-rspec/
- http://morizyun.github.io/blog/webmock-vcr-gem-rails/
- http://qiita.com/sawamur@github/items/e6fa877e35b383903e2e
RubyでClass Variable(@@)は使えないという話


rubyはクラス変数が継承が絡むと期待通りに動かないので、ほぼ役に立たない。以下の2つのリンクが役立つ。

- http://stackoverflow.com/questions/1251352/ruby-inherit-code-that-works-with-class-variables
- http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

ただ、これらの結論は、instance_variableを使って頑張るというものだけど、別にclass_methodで実現すればいいじゃんと思う。もしくは、Constant。以下のコードで2つ目のリンクのブログが達成しようとしていることは出来ていると思う。

```ruby:
class Polygon
  INTERIOR_ANGLE = 1080
  def self.sides
    8
  end
end

class Triangle < Polygon
  INTERIOR_ANGLE = 180
  def self.sides
    3
  end
end

class Octagon < Polygon
end

puts Polygon.sides  # => 8
puts Triangle.sides  # => 3
puts Octagon.sides  # => 8
puts Polygon::INTERIOR_ANGLE  # => 1080
puts Triangle::INTERIOR_ANGLE  # => 180
puts Octagon::INTERIOR_ANGLE  # => 1080
```
ubuntuでexe (7zの自己解凍書庫)作成

自己解凍書庫の作成を自動化したく、ubuntuに`p7zip-full`パッケージをインストールし
`7z a -sfx test.exe ./`で書庫を作成したが実行すると`too big to fit in memory`とエラー終了。
ということで調べてみた。

必要なファイルをダウンロード
========================

p7zip-fullをインストール
----------------------------

```bash:
$ sudo apt-get install p7zip-full
```

7zsd.sfxの準備
-----------------
* 7zSD.sfxを[ダウンロード](https://www.7-zip.org/sdk.html)
    * 7zS2.sfx, 7zSD.sfx の SFXモジュールは lzma2301\bin\に含まれています。
* 解凍する。

config.txtの作成
------------------
* [参考](http://7zsfx.info/en/parameters.html)

```bash:記述例。改行コードはdosにした。
;!@Install@!UTF-8!
Title="7-Zip 4.00"
;Directory="%Programfiles%\\program1"
InstallPath="%Programfiles%\\program1"
RunProgram="setup.exe"
;!@InstallEnd@!
```

* 上記の例は、実行すると自動で`c:\\Program Files\\program1`に解凍され、`c:\\Program Files\\program1\\setup.exe`が実行される。

書庫を作成する
=============

```bash:
$ 7z a temp.7z ./
$ cat 7zsd.sfx config.txt temp.7z > selfextract.exe
```

windowsで`selfextract.exe`を実行すると解凍できることを確認。

## 追記

* `7zsd_All.sfx` じゃないと解凍とプログラム実行がされない気がする
    * https://sourceforge.net/projects/s-zipsfxbuilder/

* C:\Program Files (x86)\7z SFX Builder\3rdParty\Modules\

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/25bd53e7-a42f-0a8f-39fa-43feb66e1cc7.png)
Spark settings

SparkのMLLibが使いたくていろいろ設定してみた。情報が散らばっていて、簡単に入らなかったのでここにまとめておく。

基本的にはbuild.sbtの依存関係。

```scala:build.sbt
libraryDependencies ++= Seq( 
  "org.apache.spark" %% "spark-core" % "0.8.0-incubating",
  "org.apache.spark" %% "spark-mllib" % "0.8.0-incubating",
  "org.scalatest" %% "scalatest" % "1.9.1" % "test",
  "org.slf4j" % "slf4j-simple" % "1.6.4"
)

resolvers ++= Seq (
  "Akka Repo" at "http://repo.akka.io/repository",
  "MessagePack Repository for Maven" at "http://msgpack.org/maven2",
  "Typesafe" at "http://repo.typesafe.com/typesafe/releases",
  "Scala Tools Snapshots" at "http://scala-tools.org/repo-snapshots/",
  "Spray" at "http://repo.spray.cc",
  "ScalaNLP Maven2" at "http://repo.scalanlp.org/repo"
)
```

必要ないものも混じっているかも。
resolverに関しては書いておいて損はないのでいいとして、libraryDependenciesに関して。
spark-coreは[以前](http://qiita.com/Lewuathe/items/3dd58445835230a13cd1)にも書いた通り。
0.8.0からmllibがspark自体に組み込まれたっぽいので同じところからdownloadできる。

あと地味に忘れてはいけないのがSLF4J。動作自体に影響はないけど、SparkContextオブジェクトを作成するたびに文句言われてしまうので、きちんと入れておく。

これで動くようになるが、SLF4Jのせいで、標準出力が非常にうるさい。どうやったらいいんだろう。
sinatra+erbでDBに格納しているバイナリ画像を表示する方法

Google先生にお願いしても探しきれなかったので、PHPの方法を真似る。 
他に方法があるのかもしれないけど自分の使用方法ではこれで問題なし。
MySQL使ってます、念の為。

```ruby:
require 'base64'
 
def convert_image_source(i)
  base64 = Base64.encode64(i).gsub(/\n/, "") +  "\n"
  mime = "image/jpg"
  return "data:"+ mime + ";base64," + base64
end
 
@indata = convert_image_source(result)
```

resultにはバイナリが格納されていると仮定する。
なぜか改行コードが混じっていたので`gsub(/\n/,"")+ "\n"`しているけどDBへの書き込みでヘタこいてる可能性が高いな。

erbで読み込む例

```erb:
<img src=<%= @indata %>WIDTH=40 HEIGHT=40>
```
nginx のアクセスログを LTSV にする


nginx.conf から抜粋です。

```
    log_format  ltsv  "time:$time_local"
                      "\thost:$remote_addr"
                      "\tforwardedfor:$http_x_forwarded_for"
                      "\tuser:$remote_user"
                      "\treq:$request"
                      "\tstatus:$status"
                      "\tsize:$body_bytes_sent"
                      "\treferer:$http_referer"
                      "\tua:$http_user_agent"
                      "\treqtime:$request_time"
                      "\tcache:$upstream_http_x_cache"
                      "\truntime:$upstream_http_x_runtime"
                      "\tapptime:$upstream_response_time"
                      "\tvhost:$host";

    access_log  logs/access.log  ltsv;
```

項目は必要に応じて増減するといい感じ。
ハニカム歩き

激しく手抜き.

```cpp
//http://qiita.com/Nabetani/items/55641767510c2f9f235f
//http://nabetani.sakura.ne.jp/hena/ord10haniwa/
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;

map<pair<int,int>,char>M={
	{{0,0},'A'},

	{{0,-1},'B'},
	{{1,-1},'C'},
	{{1,0},'D'},
	{{0,1},'E'},
	{{-1,1},'F'},
	{{-1,0},'G'},

	{{0,-2},'H'},
	{{1,-2},'I'},
	{{2,-2},'J'},
	{{2,-1},'K'},
	{{2,0},'L'},
	{{1,1},'M'},
	{{0,2},'N'},
	{{-1,2},'O'},
	{{-2,2},'P'},
	{{-2,1},'Q'},
	{{-2,0},'R'},
	{{-1,-1},'S'},

	{{0,-3},'T'},
	{{1,-3},'U'},
	{{2,-3},'V'},
	{{3,-3},'W'},
	{{3,-2},'X'},
	{{3,-1},'Y'},
	{{3,0},'Z'},
	{{2,1},'a'},
	{{1,2},'b'},
	{{0,3},'c'},
	{{-1,3},'d'},
	{{-2,3},'e'},
	{{-3,3},'f'},
	{{-3,2},'g'},
	{{-3,1},'h'},
	{{-3,0},'i'},
	{{-2,-1},'j'},
	{{-1,-2},'k'},
};

const int D[6][2]={{0,-1},{1,-1},{1,0},{0,1},{-1,1},{-1,0}};
int main(){
	string line;
	for(;getline(cin,line);){
		int i=0;
		pair<int,int>q,p=make_pair(0,0);
		cout<<'A';
		for(;i<line.size();i++){
			q=make_pair(p.first+D[line[i]-'0'][0],p.second+D[line[i]-'0'][1]);
			if(M.find(q)==M.end())cout<<'!';
			else{cout<<M[q];p=q;}
		}
		cout<<endl<<flush;
	}
}
```
tizen ui customize - checkbox

TizenのUI Frameworkのui-scrollview-viewを使って、サムネイル画像の上にカスタマイズしたチェックボックスを配置してみた。

```html
<div data-scroll="xy" style="height:360px">
  <div class="ui-scrollview-view" style="width:1176px" id="scrollview_items"></div>
</div>
```

```js
$( "#scrollview_xy-demo" ).on( "pageshow" , function() {
  for (var i=1;i<10;i++){
    $("#scrollview_items").append(
       "<div style='float:left;margin-left:-26px;'><input type='checkbox'><img src='./test/0"+ i + ".jpg'  height='120px' alt='"+i+"'></div>"
    );
  }
});

$("#scrollview_items").on( "vclick", function ( e ) {
  alert(e.target.src);
});
```

下記のスタイルをあてる。
```
 
.ui-icon-checkbox-on{
	-webkit-appearance: none; 
	position: relative;　　　　
	display: inline-block;
	width: 100px;
	height: 100px;
	background: url(../img/checkbox.png);  
	background-size: contain;
}

.ui-icon-checkbox-off{
	-webkit-appearance: none; 
	position: relative;　　　　
	display: inline-block;
	width: 100px;
	height: 100px;
	background: url(../img/checkbox_off.png);  
	background-size: contain;
}

.ui-icon-checkbox-on-press,
.ui-icon-checkbox-off-press{
	background: url(../img/checkbox_off.png);  

}

input[type="checkbox"]{
 -webkit-appearance: none;  
 position: relative;　　　　
 display: inline-block;
 left: 25px;
 top: 0px;
 width: 20px;
 height: 20px;
 background: url(../img/checkbox_off.png); 
 background-size: contain;
} 

input[type="checkbox"]:checked:before {
 content: "";
 position: absolute;　　　　
 left: 0px;
 top: 0px;
 display: inline-block;
 width: 20px;
 height: 20px;
 background: url(../img/checkbox.png);
 background-size: contain;
 }
```![tizen_custom_checkbox.jpeg](https://qiita-image-store.s3.amazonaws.com/0/28956/018d4207-003a-2217-3972-cd27d24fdcb0.jpeg)
requestのパラメータを取得

URLのgetパラメーターを引き継いでgetで飛ばしたかったので調べたらこんなのがありました。

```rb
request.query_parameters
```

何をするかと言うと
ttp://hoge.com/fuge?hoji=123
の「hoji=123」をハッシュで取ってきてくれます。
&で繋がっていてももちろんそのまま取ってきてくれますので、

```rb
link_to "次のページへ", next_path(request.query_parameters)
```

なんて事もできちゃいます。
randintに気をつけよう

Pythonのrandintでハマったのメモ。
ある区間内のランダムな整数を返す関数として、random.randintとnumpy.random.randintがありますが、これら実は仕様が違います。

ドキュメントを見てみましょう。まずはrandom.randintから
>    randint(self, a, b) method of random.Random instance
>    Return random integer in range [a, b], including both end points.

次にnumpy.random.randint
>    randint(low, high=None, size=None)
>    
>    Return random integers from `low` (inclusive) to `high` (exclusive).
>    
>    Return random integers from the "discrete uniform" distribution in the
>    "half-open" interval [`low`, `high`). If `high` is None (the default),
>    then results are from [0, `low`).

つまりrandom.randint(a,b)はaからbまでの整数（bを含む）が返ってくる可能性があり、numpy.random.randint(a,b)はaからb-1までの整数が返ってくる可能性があるんですね。

なんじゃこりゃあああ！紛らわしい！

どっちが自然な仕様かというと後者だと思います。例えば、range(1,5)は[1,2,3,4]が返ってくるし。

では、Happy Halloween and Happy Hacking!
Javascriptで縦横チェックボックスに一気にチェック付けるやつ

```html:
<SCRIPT TYPE="text/javascript">
function BoxCheckedCircle(circle){
	var elements = document.getElementsByClassName(circle);
	for (i = 0; i < elements.length; i++) {
		elements[i].checked = true;
	}
}
function BoxCheckedCommu(commu){
	var elements = document.getElementsByClassName(commu);
	for (i = 0; i < elements.length; i++) {
		elements[i].checked = true;
	}
}
</SCRIPT>

<FORM NAME="form1">

<table border="1">
<tr>
<td></td>
<td></td>
<td>サークル１</td>
<td>サークル２</td>
<td>サークル３</td>
</tr>

<tr>
<td></td>
<td></td>
<td><INPUT TYPE="button" onClick="BoxCheckedCircle('circle_1');" VALUE="全て選択"></td>
<td><INPUT TYPE="button" onClick="BoxCheckedCircle('circle_2');" VALUE="全て選択"></td>
<td><INPUT TYPE="button" onClick="BoxCheckedCircle('circle_3');" VALUE="全て選択"></td>
</tr>

<tr>
<td>店舗１</td>
<td><INPUT TYPE="button" onClick="BoxCheckedCommu('commu_1');" VALUE="全て選択"></td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_1_circle_1" class="commu_1 circle_1"> </td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_1_circle_2" class="commu_1 circle_2"> </td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_1_circle_3" class="commu_1 circle_3"> </td>
</tr>

<tr>
<td>店舗２</td>
<td><INPUT TYPE="button" onClick="BoxCheckedCommu('commu_2');" VALUE="全て選択"></td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_2_circle_1" class="commu_2 circle_1"> </td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_2_circle_2" class="commu_2 circle_2"> </td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_2_circle_3" class="commu_2 circle_3"> </td>
</tr>

<tr>
<td>店舗３</td>
<td><INPUT TYPE="button" onClick="BoxCheckedCommu('commu_3');" VALUE="全て選択"></td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_3_circle_1" class="commu_3 circle_1"> </td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_3_circle_2" class="commu_3 circle_2"> </td>
<td><INPUT TYPE="checkbox" NAME="chk" VALUE="commu_3_circle_3" class="commu_3 circle_3"> </td>
</tr>

</FORM>
ブラウザからURLリンクをクリックした際にアプリがあれば起動、なければStoreに飛ばす時の対策

自分用メモも兼ねて

## やりたかったこと

ブラウザからURLリンクをクリックした際にアプリがあれば、アプリ起動、
なければ各storeに飛ばそうとした。

### 対応

カスタムURLスキームを使ってiOSはとりあえず動いた。

Androidでうまいこと動かなかったので、悩んだところ
ここを教えてもらったので試したら動いた。
[https://developers.google.com/chrome/mobile/docs/intents](https://developers.google.com/chrome/mobile/docs/intents)


```
<a href="intent://test/#Intent;scheme=hoge;package=com.piyo.hoge;end"></a>
```


みたいな感じ。

標準ブラウザでもchromeでも動作した。  
Androidの場合、Intent使えば判定はいらないのかも？
LOAD DATAした行数と、AUTO_INCREMENT値が一致しない。【バグフィックス済】

新規に生成したテーブルに load data でデータを投入すると、auto_increment の値がおかしくなる事象が発生。

``` hoge.sql
CREATE TABLE `hoge` (
  `auto_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`auto_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
LOAD DATA LOCAL INFILE 'hoge.txt' INTO TABLE hoge;
```

ここで、hoge.txt は9807行とする。

Query OK, 9807 rows affected (1.10 sec)
Records: 9807  Deleted: 0  Skipped: 0  Warnings: 0

すると

``` hoge.sql
[dev]> show create table hoge\G
*************************** 1. row ***************************
Create Table: CREATE TABLE `hoge` (
  `auto_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`auto_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16384 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
```
というふうに、auto_increment値が実際の行数と合わない現象が起きました。

実際に新規のデータをinsertしてみると…

``` hoge.sql
[dev]> select * from hoge\G
*************************** 9807. row ***************************
    auto_id: 9807
create_date: 2013-10-30 09:36:05
*************************** 9808. row ***************************
    auto_id: 16384
create_date: 2013-10-30 11:56:10
``` 

ただしく動いて、16384が振られました。

あー、16384って、$16384 = 2^{14}$だったなーと。(TeXなつかしい)

仕様は詳しく読んでませんが、load data を高速に実行するために
$2^{13} = 8192 <  9807 < 16384 = 2^{14}$
で、メモリを確保しているのではないだろうか。
そのあと、再計算し忘れてるんではなかろうか（笑

解決策は下記のとおりですが

``` hoge.sql
ALTER TABLE hoge ALGORITHM=COPY, AUTO_INCREMENT=1
```

で、めでたく

``` hoge.sql
[dev]> show create table hoge\G
*************************** 1. row ***************************
Create Table: CREATE TABLE `hoge` (
  `auto_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`auto_id`),
) ENGINE=InnoDB AUTO_INCREMENT=9808 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
```

load data 時点で auto_increment 値を正しく設定する方法を調べなきゃ。。。

参考
http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_old_alter_table