OmniAICreator/Qiita-1.07M huggingface dataset:
Herokuの中の人が語るHerokuのメリット

herokuのつかいどころをherokuの中の人(@ayuminさん)が教えてくれました。ありがとうございます。
\#会社としての見解ではなく、あくまでayuminさん個人としての見解とのことです。

### 私の感想
####vs EC2
構成の手間と鯖料金のトレードオフ

####vs GAE
ロックインとそれ以外のトレードオフ
GAEは中指の鎖。

###以下引用
https://twitter.com/#!/ayumin
***
無料で使いたいという場合には、要求リソースがherokuの無料の範囲で収まる程度のサービスをつくるときに使えばいいと思います。具体的には学習環境用途や個人ブログなどです。他にもはサンドボックスとして利用されていることも多いです。

 有料プランの価格については、インフラやミドルウェアの導入・設定・維持管理にかかるコストが大幅に削減され、優秀なインフラエンジニアをひとり雇うよりは安いとおもうので、そこに価値を見いだしてくれる方にとっては合理的だとおもっています。

herokuの強みはアプリケーションのスケールアウトが非常に容易なことです。Amazon EC2などを利用する場合はスケールアウトが可能なような設計上の考慮が必要になりますが、herokuを使っている場合その考慮がほとんどいりません。

そのため、大ブレイクを期待しつつも実際のところどれだけウケるかわからないようなサービスとか、閑散期と繁忙期のトラフィックにものすごく開きがあるサービス、優秀なインフラエンジニアを雇う余力がないスタートアップなどに使われる傾向が多いです。

あと、もうひとつ付け加えるならば、２段落目や３段落目のと部分の価値を見出してくれた大企業の事例も既にいくつもあります。ご興味があれば http://success.heroku.com/ のリストを御覧ください。
Dropboxを使用した複数端末でのKobito同期

※非公式ですし、自己責任でお願いします。
あと、Kobitoのテスト投稿も含めています。

KobitoのDBをDropboxで同期して、複数環境で同期する方法です。

**2012/09/07追記**
「Kobito.db」の名前が「kobito.db」に変わっていましたので、下記手順を行う際はDBファイル名をよく確認してください



## やり方
一度、Kobitoを起動して、KobitoのDBファイルや設定ファイルもろもろを作成しておきます。



```Kobito.dbの場所
/Users/<user name>/Library/Kobito/kobito.db
```

上記のファイルを、Dropboxフォルダ内にいれます。
ここからの作業はKobitoを終了した状態で行なってください。

```Kobito.dbの移動
mv ~/Library/Kobito/kobito.db ~/Dropbox/
```
Dropbox内に移動したらシンボリックリンクを作成します。
私はシンボリックリンク作成の際は、いつもこれを使っています。

>SymbolicLinker http://seiryu.home.comcast.net/~seiryu/symboliclinker.html

DBファイルのシンボリックリンクが作成できたら、
Library内のKobitoのディレクトリに入れます。

```シンボリックリンク格納先
/Users/<user name>/Library/Kobito/
```
※シンボリックリンクの名前は、「kobito.db」以外になっていたら修正してください。


ここで、一度、Kobitoを起動して正常に起動するか確認してみてください。


正常に起動確認できましたら、他の端末をセットアップします。（基本的には上記と同じです）

* Kobitoを起動して、DBファイルや設定ファイルもろもろを作成する。
* Kobitoを終了して、Library/Kobito内のkobito.dbを削除（もしくは、どこかへ移動）する。
* Dropbox内のKobitoのDBファイルのシンボリックリンクを作成して、Library/Kobito内に配置する。
* Kobitoを起動して動作確認をする。


以上で同期の設定は完了となりますが、下記、注意点が。

* 同期している端末間で、同時にKobitoを起動させると、おかしくなると思いますので、起動は一つずつ。
* Kobitoの仕様変更によっては、データが消えたり同期されなくなったりするかもしれませんので、自己責任でお願いします。

##　最後に
Kobito、まだ全然使用していませんが、便利な予感！！
tmuxで新しいwindowを開いて4分割し、それぞれコマンドを実行させる


```zsh
#!/bin/zsh
tmux new-window -n name # 新しいwindowを開きたくない場合は以下
# tmux rename-window name
tmux split-window -h
tmux split-window -v -t name.0
tmux split-window -v -t name.1

tmux send-keys -t name.0 'echo 0' C-m
tmux send-keys -t name.1 'echo 1' C-m
tmux send-keys -t name.2 'echo 2' C-m
tmux send-keys -t name.3 'echo 3' C-m
```

`name`はwindowの名前。好きなのでOK。
`echo`のところをそれぞれ実行させたいコマンドに。
（Rの）環境問題について　その３。 


http://qiita.com/items/325bdf48f4f4885a86f1 と
http://qiita.com/items/35184390984975ec7c6d の続き。

余談ですが、「環境」という言葉から、ちょっと考えこむと「自分の実行環境はどこか？」しいては「自分が今どの環境の中にいるのか」ということを考えてしまいがちです。これはやめといた方がいいです。

必要なのは、「今自分の隣にいるおばちゃんは誰か」です。これで大分すっきりして気が楽になります。

`environment()`は、「今自分がどの環境のかなにいるのか教えてくれる関数」ではなくて、「今隣にいるおばちゃんは誰か」を教えてくれる関数です。

##1-6 関数の環境

関数は環境を持っています。これは関数**呼び出し時**に作られる環境とは**異なります**。
「持っています」というのが誤解の元なんだよなあ。

イメージとしては、困ったときに相談するおばちゃんをメモっとく、という感じです。

関数を定義すると、

```R
> f <- function() {
+ 	print(environment())
+ 	print(parent.env(environment()))
+ }
> environment(f)
<environment: R_GlobalEnv>
```

という感じで、`f`の環境は、この場合は`.GlobalEnv`です。

```R
> f()
<environment: 0x1169ecb88> #これ呼び出し時に作られたおばちゃん
<environment: R_GlobalEnv> #そのおばちゃんが困ったら相談するおばちゃん
```

という風に考えると、関数というのは、

1. 呼び出された時におばちゃん一人つくって、あなたの隣におく。
2. そのおばちゃんに、困ったときに相談するおばちゃんを教えておく。

という能力を持った人です。 

##1-7 関数の環境 ≠ 定義時の環境

デフォルトでは、関数の環境、つまり関数がメモったおばちゃんは、関数が定義された時の環境です。

```R
> environment()
<environment: R_GlobalEnv> # 今の環境（あなたの隣のおばちゃん）
> f <- function() {}
> environment(f)
<environment: R_GlobalEnv> # 関数fがメモったのはその環境

> g <- function() {
+ 	print(environment()) # *1
+ 	h <- function() {}
+ 	print(environment(h)) # *2
+ }
> g()
<environment: 0x11726f608> # *1: 今の環境（呼び出し時に作られたやつ）
<environment: 0x11726f608> # *2: 関数hがメモった環境
```

ただこれ、あとで変えられるんですね。つまり、関数に「困ったらこのおばちゃんに相談するように言っといてねー」ってあとから出来る。

```R
> f <- function() {
+ 	parent.env(environment()) # 実行時の環境の親を表示（自分の隣にいるおばちゃんの相談相手）
+ }
> environment(f)
<environment: R_GlobalEnv> # デフォルトでは相談相手は.GlobalEnv
> f()
<environment: R_GlobalEnv> # です。
> 
> e <- new.env() # 新しい環境を作成。おばちゃんひとり作ったと思っとけばいい。
> e
<environment: 0x1171ea1f8>
> 
> environment(f) <- e # 「困ったらこのおばちゃんに聞いとけ」メモ
> environment(f)
<environment: 0x1171ea1f8> # 変更されてる
> f()
<environment: 0x1171ea1f8> # こっちも
```

あーややこしい。

なので、私はこう考えています。

##1-8 関数にまつわる３つの環境

1. 呼び出し時に作られる環境
2. 呼び出し時に作られる環境の親となる環境
3. 関数がある環境

おばちゃんで言い換えると

1. 呼び出し時にボワッと作られるおばちゃん
2. 1.のおばちゃんが困ったときに相談する相手
3. 関数を持ってるおばちゃん

この3.がまた厄介で、「関数の環境」と「関数のある環境」は異なります。
これが、http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/ のブログの実践と点線、`package:hoge`と`namespace:hoge`につながってきます。

つづく。
codejam用 rustテンプレート


標準入力から問題を受け取りアクターで並列に答え解いて標準出力に吐き出す用
[Rust](http://www.rust-lang.org/)かわいいよ[Rust](http://www.rust-lang.org/)

```template.rs
use std;

import core::io;
import io::reader;
import io::reader_util;
import std::sort;

impl read_util for reader{  
  fn read_valid_char() -> char {
    let mut c;
    do {
      c = self.read_char();
    } while c == '\n' || c == ' ';
    ret c;
  }

  fn read_valid_line() -> str{
    let mut line;
    do {
      line = self.read_line();
    } while line == "";
    ret line;
  }

  fn read_uint() -> uint{
    let raw_uint = self.read_valid_line();
    ret option::get(uint::from_str(raw_uint));
  }
  fn read_int() -> int{
    ret option::get(int::from_str(self.read_line()));
  }
  fn read_uints() -> [uint]{
    fn to_uint(&&s: str) -> uint{
      ret option::get(uint::from_str(s));
    }
    let line = self.read_line();
    ret vec::map(str::split_char(line, ' '), to_uint);
  }
  fn read_ints() -> [int]{
    fn to_int(&&s: str) -> int{
      ret option::get(int::from_str(s));
    }
    let line = self.read_valid_line();
    ret vec::map(str::split_char(line, ' '), to_int);
  }
}

#[doc="input data type"]
type input = {
  mut index: uint,
  w: uint, 
  h: uint, 
  board: [str]
};


#[doc="build input data from stdin"]
fn fetch(stdin: io::reader) -> input {
  let s = stdin.read_uint();
  let v1 = stdin.read_ints();
  let v2 = stdin.read_ints();

  ret {
    mut index: 0u, 
    s : s, 
    v1: v1, 
    v2: v2
  };
}

#[doc="output status"]
enum out_status {
  ready,
  start, 
  solved((uint, str))
}


fn solve(in: input) -> str {
  log(error, #fmt("idx.%u start solved", in.index));
  
  let mut v1 = in.v1;
  let mut v2 = in.v2;
  fn le(&&a: int, &&b: int) -> bool { int::le(a, b) }
  fn ge(&&a: int, &&b: int) -> bool { int::ge(a, b) }
  
  v1 = sort::merge_sort(le, v1);
  v2 = sort::merge_sort(ge, v2);

  fn times(&&x: int, &&y: int) -> int { ret x * y; }
  fn sum(&&accum: int, &&a: int) -> int { ret accum+a; }
  ret int::to_str(vec::foldl(0, vec::map2(v1, v2, times), sum), 10u);

}

fn main() {
  let stdin = io::stdin();
  let n = stdin.read_uint();
  let mut inputs : [input] = [];
  let mut outputs = vec::to_mut(vec::from_elem(n, ""));

  let port = comm::port();
  let chan = comm::chan(port);

  log(error, #fmt("n: %u", n));
  uint::range(0u, n) {|i| 
    let in = fetch(stdin);
    in.index = i;
    inputs += [in];
    
    task::spawn{||
      build_actor(in, chan);
    }
  }
  
  iter::repeat(n) {||
    alt check comm::recv(port){
     solved((idx, res)) {
      outputs[idx] = res;
     }
     _ {
      log(error, "what?");
     }
    }
  }

  vec::iteri(outputs){|i, res|
    io::println(#fmt("Case #%u: %s", i+1u, res));
  }
}

fn build_actor(in: input, chan: comm::chan<out_status>) {
  let res = solve(in);
  comm::send(chan, solved((in.index, res)));
}
```

↑で想定してる問題は2008 Round1A Aの

2
3
1 3 -5
-2 4 1
5
1 2 3 4 5
1 0 1 0 1

というような形式のもの
iTunes Store RSSのfeedをまとめてwgetする


### iTunes Store RSS

* [iTunes Store RSS](http://itunes.apple.com/jp/rss/)
* iTunes Storeの各国のランキングをフィードとして取得できる
* Music/Free app/Paid app/Top sales app
* 過去ログは存在せず、その時点でのランキングのみ取得可能

### これをがんばって活用すれば
* 毎日フィードを溜めていくことで、ランキングの動向を追っかけるウェブサイトとか作れる
* 世界中のアプリ情報が取れるので、海外向けサイトにもなるよ

### How to use
* $countries に取得したい国コードを指定

```php
<?php
$countries = array('jp', 'us', 'cn', 'kr');
$source_filename_prefix = array('topfree', 'toppaid', 'topgrossing');

foreach ($countries as $country) {
    foreach ($source_filename_prefix as $filename_prefix) {
        $filename = $country . "_" . $filename_prefix . ".list";
        $contents = @file($filename);
        foreach ($contents as $line) {
            $rss_data = explode("," ,$line);
            $category = trim($rss_data[0]);
            $xml_url = trim($rss_data[1]);
            $output_filename = $country . "/" . $filename_prefix . "_" . $category . "_" . date('Ymd') . ".xml";
            $cmd = "wget " . $xml_url . " -O " . $output_filename;
            system($cmd);
        }
    }
}
```
（Rの）環境問題について　その２。 


http://qiita.com/items/325bdf48f4f4885a86f1 の続き。

##1-3 環境のイメージ
環境って言うとなんか、かたい感じがして、ちょっととっつきにくいと思う。なんか`call/cc`とか思い出しちゃうし・・・。

なので、環境のイメージは、「おせっかいで親切なおばちゃん」という感じです。

「おばちゃん、きゅうりあるー？」
「あー今ないわー、ちょっと待っててーな、お隣さんに聞いてくるさかいー」

そんな感じいいと思います。

**変数については**これですべてオーケーだと思います。**変数について**は。


##1-4 関数呼び出しでの環境

こっから格段にややこしくなります。

さっき暗黙のうちに、`.GlobalEnv`っていうのが最初に聞く相手だったんですが、いつもそうとは限りません。Rのコンソールでちょいちょいやってる時は、だいたい`.GlobalEnv`です。ややこしいのは、**関数を呼び出した時**です。本当にこっからややこしいです。

最初に聞く相手を知るには、`environment()`です。

```R
> environment()
<environment: R_GlobalEnv>
```

関数呼び出しの時は、こうなります。

```R
> f <- function() {
+ 	print(environment())
+ }
> f()
<environment: 0x101ab3720>
```

なんか適当なおばちゃんがボワッと出てきた感じです。実際にそのとおりで、関数**呼び出し**の時には、環境が一個作られて、それが一番最初に話を聞く相手になります。

このボワッとおばちゃんは、関数を**呼び出すたびに毎回**作られます。

```R
> f()
<environment: 0x11682e470>
> f()
<environment: 0x11682b278>
```

毎回違う環境ですね。

##1-5 変数を作る話を忘れてた
すっかり忘れてた。普通の代入（束縛）演算子`<-`を使うと、一番最初に話を聞く相手に、その変数を持っといてもらうことになります。

```R
> ls()
[1] "b" "f" "l"
> orz <- 1
> ls()
[1] "b"   "f"   "l"   "orz"
```

この場合`.GlobalEnv`が相手です。

関数呼び出しの時も話は同じで、

```R
> f <- function() {
+ 	a <- 1
+ 	print(environment())
+ 	print(ls(pos = environment()))
+ 	a
+ }
> f()
<environment: 0x101d90068>
[1] "a"
[1] 1
```

この関数は最初に`a<-1`を実行してます。`f()`の呼び出し時の環境（ボワッとおばちゃん）は`0x101d...`というやつで、そこにはちゃんと`a`があります。

「`0x101d...`おばちゃん、ちょっとこの`a`もっといてー」

というイメージです。

##1-6 もう少し、関数呼び出しでの環境

関数を呼び出した時に適当に出てきたボワッとおばちゃん環境も、自分が持ってなかったら次の人を紹介してくれるわけですが、それが誰かというと、

```R
> f <- function() {
+ 	print(parent.env(environment()))
+ }
> f()
<environment: R_GlobalEnv>
```

この場合は、`GlobalEnv`です。この場合は。

で、よく知ってる人にはここでトラップがあります。よくある説明では、

>関数の実行環境の親はそれを定義した時の環境となります

的な話があると思います（いみわかんなかったら飛ばしていいです）。

デフォルトではそうなんだけど、ここは正しくなくて、

>関数の実行環境の親は関数の環境となります

が正しいです。

つづく。
なぜか実行するとエラーになる

mingw の gcc version 4.6.2。OS は Windows7 64bit Pro版 で
次のコードを `gcc -O3 -o hoge hoge.c` でコンパイルすると
コンパイルが通って実行ファイルもちゃんと動く。

```c:hoge.c
#include <stdio.h>

typedef struct{
	int value;
} HOGE;

void piyo(HOGE *hoge);

int main(void)
{
	HOGE hoge;
	hoge.value = 100;
	piyo(&hoge);
	return(0);
}

void piyo(HOGE *hoge)
{
	printf("%d\n", hoge->value);
}
```

でも、次のコードを `gcc -O3 -o hoge1 hoge1.c` でコンパイルするとコンパイルは通る。
ただ、実行ファイルを実行するとなぜか Windows7 のPro版が「hoge1.exe は動作を停止しました」
とかのエラーダイアログを出力する。
なんでだろう？ たしか gcc の version が 3.4.5 の時は両方ちゃんと動いてたはず。

```c:hoge1.c
#include <stdio.h>

typedef struct{
	int value;
} HOGE;

void piyo(HOGE *hoge);

int main(void)
{
	HOGE *hoge;
	hoge->value = 100;
	piyo(hoge);
	return(0);
}

void piyo(HOGE *hoge)
{
	printf("%d\n", hoge->value);
}
```

Linda_pp さんにコメントを頂きました。
ポインタ変数の宣言だけしていて、そのポインタ変数が指すべき実体を定義していなかったので、未定義の動作になっているとのこと。
修行が足らんです。

コメントそのままの改修を入れたら、きっちり動きました。

```c:hoge2.c
#include <stdio.h>
#include <stdlib.h>

typedef struct{
	int value;
} HOGE;

void piyo(HOGE *hoge);

int main(void)
{
	HOGE *hoge = (HOGE*)malloc(sizeof(HOGE));  // <= ここ改修
	hoge->value = 100;
	piyo(hoge);
	return(0);
}

void piyo(HOGE *hoge)
{
	printf("%d\n", hoge->value);
}
```

```shell-session
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/tools/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.6.2 (GCC)
```
（Rの）環境問題について　その１。


（Rの）環境問題が界隈を賑やかしているっぽい。例えば、
http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/
に素晴らしい記事が出た。この記事を理解すればRの環境の８割はマスターしたと言えそうだ。

この記事の内容についてざっと触れた後に、関数呼び出しに伴う環境（＋promise）、パッケージ云々での落穂ひろい的な情報を書いてみようと思う。

まず理解するように、ということで細かい所で不正確なところはたくさんあります。

#1. 環境についてのざっくりとした説明

##1-1. 名前
```R
> mean(1:3)
[1] 6
```
`mean`が名前。関数名。

```R
> pi
[1] 3.141593
```
`pi`が名前。変数名。

###変数とか関数の名前一覧を見るには。

```R
> ls()
[1] "e" "l" "o" "P" "x"
```
と、`ls()`を使う。あれ、`mean`も`pi`もない。じゃあどこにある？

##1-2. 環境（っていうか、たらい回し）
こういう説明がいいのかどうかよくわかんなけいど・・・

誰かになんか欲しいって言われても持ってなかった時、せめて、じゃああの人に持ってるか聞いたらいいよ、って答えるのが親切で、Rの環境はこれと同じようなもの。

Rの中で私が何か（例えば`mean`とか`pi`）とかを探すとき、まず身近な相手にそれを持ってるか聞く。その人が`mean`とか`pi`とか持ってなかった時、じゃあ次はこの人に聞いてね、っていうのを教えてくれる。それをずーっとたどっていって最後まで誰も持ってなかったらエラー。

最初に聞く相手は`.GlobalEnv`というやつ。

```R
> .GlobalEnv
<environment: R_GlobalEnv>
```
↑こいつね。

で、こいつが持ってるものを聞くには、やっぱり`ls()`を使う。

```R
> ls(pos = .GlobalEnv)
[1] "P" "d" "e" "i" "l" "o" "p" "x"
```
こいつがもってなかった時、次の人を紹介してくれる。次の人を知るには`parent.env()`。

```R
> parent.env(.GlobalEnv)
<environment: package:stats>
attr(,"name")
[1] "package:stats"
attr(,"path")
[1] "/Library/Frameworks/R.framework/Versions/2.15/Resources/library/stats"
```
ごちゃごちゃ書いてあるけど、要するに、`package:stats`っていうのが次の人。あなたの場合は違うかもしれないけど。
で、`package:stats`さん`mean`をもってるかというと・・・

```R
> ls(pos = "package:stats")
  [1] "acf"                  "acf2AR"               "add.scope"            "add1"                
  [5] "addmargins"           "aggregate"            "aggregate.data.frame" "aggregate.default"   
...以下略
```
ないわ。なので、また次の人を紹介してもらいます。この紹介の順番は`search()`で簡単に知ることができて、

```R
> search()
 [1] ".GlobalEnv"        "package:stats"     "package:graphics"  "package:grDevices" "package:utils"    
 [6] "package:datasets"  "package:devtools"  "MacJapanEnv"       "package:methods"   "Autoloads"        
[11] "package:base"     
```

という感じで、最後が`package:base`です。Rはこの、順番に聞いてたらい回しで、っていう作業を勝手にやってくれている、ということです。

最後まで探してなければない、ということでエラーです。

```R
> orz
Error: object 'orz' not found
```
`orz`という名前はどこにも見つかりませんでした。

ちなみに`mean`は`package:base`にあります。誰が知ってるかを知りたければ、

```R
> find("mean")
[1] "package:base"
```

ですね。
RubyでODSファイルからデータを取り出す

元ネタは http://www.simplegimmick.com/2007/06/read-ods-like-csv/ です(2012-04-05現在、記事がみつかりません)。

2016-11-04追記: GitHubで公開されていました。今まで全然気付かなかった……
[simgim/ods-reader: ods reader is a library for reading .ods (OpenOffice Spreadsheet) file.](https://github.com/simgim/ods-reader "simgim/ods-reader: ods reader is a library for reading .ods (OpenOffice Spreadsheet) file.")

1. https://gist.github.com/185322 にある ods.rb をダウンロードします。

	```
	% wget https://raw.github.com/gist/185322/f00115c70ee62ff2a4788b59358881718e24bbcc/ods.rb
	```

2. 動作にはnokogiriとrubyzipが必要です。

	```
	% gem install nokogiri rubyzip
	```

3. ODSクラスを使って、ODSファイルからデータを取り出すことが出来ます。

	```ruby
	require_relative 'ods'
	ods = ODS.new.parse_file('sample.ods')
	sheet = ods.sheet('Sheet 1')
	row = sheet[1]	# 1行目(0オリジン)
	cell = row[2]	# 2(C)列目(0オリジン)
	cell.value		# => C2のセルの内容
	```

4. ODSCSVクラスを使って、CSVライクにODSファイルからデータを取り出すことも出来ます。

	```ruby
	ODSCSV.open('sample.ods') do |rows|
		rows # => 各行のデータを配列で取り出せる
	end
	```
AndroidのUI探すならこのアプリ

https://play.google.com/store/apps/details?id=com.groidify.uipatterns
UIのサムネイル、githubへの直リン、ライセンスの情報など…。
カテゴライズされててわかりやすい。
あのアプリのUIこれだったんだぁって思うとなんか敷居下がりますよね。
なにか作りたい時はまずはこのサイトからチェックしてみると良いと思います。
git memo


* kobitoリリースおめでとうございます
* ためしにkobitoからQiitaに投稿させてください

###作業ツリーとステージングの差分
```
git diff
```
###ステージングとリポジトリの差分
```
git diff --cache
```

###作業ツリーとリポジトリの差分
```
git diff HEAD
```

###ステージング中のファイルをアンステージする
```
git checkout -- filename
```
bundle exec を省略する


https://github.com/mpapis/rubygems-bundler

README.md の記述は古いものが混じっててよくわからない。noexec gem も入れる必要がありそう。

```
gem install noexec
gem install rubygems-bundler
```

```
# ~/.gemrc
custom_shebang: $env ruby_noexec_wrapper
```

```
gem regenerate_binstubs
```

↑これにより、gem でインストールされたコマンドの shebang が書き換えられる。

アンインストール時は

```
# ~/.gemrc
custom_shebang: $env ruby
```


```
gem regenerate_binstubs
```
で OK。
Xcodeでトラブル

実機で試験をするときに、何回やってもビルド時に下記エラーが発生します。どなたか解決方法をご存知の方いらっしゃいませんか。

エラーメッセージ：
The identity 'iPhone Distribution' doesn't match any valid, non-expired certificate/private key pair in the default keychain.
# NSLog を Debug時のみ出力させる


`ALog`と`DLog`というマクロにして、使用したファイル名、関数（メソッド名）、行番号を NSLog で出力させる。

`ALog` は Release/Debug ビルド双方とも出るが、`DLog`は Debug ビルド時にしか出力しない。


TestFlight 対応


```objectivec
#ifdef DEBUG
#    ifndef DLog
#        define DLog(__FORMAT__,...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#    endif
#else
#    ifndef DLog
#        define DLog(...) /* */
#    endif
#endif /* if DEBUG */

#ifndef ALog
#  ifdef TFLog
#    define ALog(__FORMAT__, ...) TFLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#  else
#    define ALog(__FORMAT__,...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#  endif /* ADHOC */
#endif
```


- 2012/04/05 22:24 +0900: Typo fix
画像を横並びにする方法


```TeX
\begin{figure}[tb] \begin{minipage}{0.5\hsize}  \begin{center}   \includegraphics[width=47mm, clip]{a.eps}  \end{center}
  \caption{日本語キャプション}
  \label{fig:FIGURE1} \end{minipage} \begin{minipage}{0.5\hsize}  \begin{center}   \includegraphics[width=47mm, clip]{b.eps}  \end{center} \caption{日本語キャプション}
  \label{fig:FIGURE2} \end{minipage}\end{figure}
```
画像を保存

```
(use rfc.http)
(use rfc.uri)
(use file.util)
(define (img uri)
  (receive 
	(uri-scheme user-info hostname port path query fragment) 
	(uri-parse uri)
	(receive 
	  (dir file ext) 
	  (decompose-path path)
	  (receive 
		(status head body) 
		(http-get hostname path)
		(with-output-to-file 
		  (string-append file "." ext) 
		  (pa$ print body))))))
```
Rails非標準の型を使うとFactoryGirlでエラーが出る

migrationファイルで以下のようにした

```ruby
class CreateHosts < ActiveRecord::Migration
  def change
    create_table :hosts do |t|
      t.string :name, :null => false, :limit => 255
      t.column :status, "enum('standby','working','destroyed','poweroff','maintenance')", :null => false, :default => 'maintenance'
      # ...
    end
  end
end
```

hostsテーブルにはstatusカラムがあり、statusが取りうる値の種類が初めから分かっているので`enum`にした。

そしてHostモデルを以下のようにした

```ruby
class Host < ActiveRecord::Base
  validates :status,
    :presence => true,
    :inclusion => {
      :in => %w[standby working destroyed poweroff maintenance]
    }
end
```

これ自体は問題なく動作どうさする。
しかしながら、FactoryGirlを使ってHostインスタンスを作ろうとすると

> Can't convert Symbol to string

とRailsの奥深くで怒られる。
上記のstatusのvalidationが無いと問題ないしnameなどの標準の型に対するvalidationは問題ない。
結局諦めて組み込みの型を使うのが無難そうだと、判断した。

レールから外れる時は自己責任で、、、、ということですね。
いまどきのHaskellのTCPクライアント

~~~ {haskell}
{-# LANGUAGE OverloadedStrings #-}                                        
import Data.ByteString.Char8 as B                                         
import Data.Conduit                                                       
import Data.Conduit.Binary as C                                           
import Data.Conduit.List as C                                             
import Data.Conduit.Network                                               
                                                                          
main :: IO ()                                                             
main = runTCPClient (ClientSettings 80 "tanakh.jp") $ \source sink -> do  
  sourceList ["GET / HTTP/1.0\r\nHost: tanakh.jp\r\n\r\n"] $$ sink        
  source $= C.lines $$ C.mapM_ $ \line ->                                 
    B.putStrLn line                                                       
~~~

すごくいい感じなんだけど、やっぱちょろっと書くにはimportが多いなあ。
Google Apps Script でjsonデータの読み込み

Utilities.jsonParse() を使っているサンプルが多いけど、数字キーのデータが扱えないっぽいので JSON.parse() を使うほうが良さそう。

```
function myFunction() {
  var str = '{"1234":"hoge"}';
  Logger.log(JSON.parse(str)[1234]);
  Logger.log(Utilities.jsonParse(str)[1234]);
}
```

[Issue 873 - google-apps-script-issues - Utilities.jsonParse does not behave like JSON.parse - Google Apps Script issues and feature requests - Google Project Hosting](http://code.google.com/p/google-apps-script-issues/issues/detail?id=873)
RSpec用のスニペットファイル


[neocomplcache-snippets-complete](https://github.com/Shougo/neocomplcache-snippets-complete)用のRSpecで使ってるスニペット

```vimscript:spec.snip
snippet     des
abbr        describe '' do end
prev_word   '^'
    describe '${1}' do
      ${2}
    end

snippet     deS
abbr        describe "" do end
prev_word   '^'
    describe "${1}" do
      ${2}
    end

snippet     con
abbr        context '' do end
prev_word   '^'
    context '${1}' do
      ${2}
    end

snippet     coN
abbr        context "" do end
prev_word   '^'
    context "${1}" do
      ${2}
    end

snippet     bef
abbr        before do end
prev_word   '^'
    before do
        ${1}
    end

snippet     bef{
abbr        before { }
prev_word   '^'
    before { ${1} }

snippet     af
abbr        after do end
prev_word   '^'
    after do
        ${1}
    end

snippet     af{
abbr        after { }
prev_word   '^'
    after { ${1} }

snippet     it
abbr        it '' do end
prev_word   '^'
    it '${1}' do
        ${2}
    end

snippet     iT
abbr        it "" do end
prev_word   '^'
    it "${1}" do
        ${2}
    end

snippet     let
abbr        let { }
prev_word   '^'
    let(:${1:name}) { ${2} }

snippet     leT
abbr        let do end
prev_word   '^'
    let(:${1:name}) do
        ${2}
    end

snippet     sub
abbr        subject { }
prev_word   '^'
    subject { ${1} }

snippet     suB
abbr        subject do end
prev_word   '^'
    subject do
        ${1}
    end

snippet     exp
abbr        expect { }.to
prev_word   '^'
    expect { ${1} }.to ${2}
```
オブジェクトに動的にメソッドを追加するトレイト

    <?php

    trait MethodAttachable
    {
        protected $_callbacks = array();

        public function __set($name, $value)
        {
            if (is_callable($value)) {
                $this->_callbacks[$name] = $value;
            }

            $this->{$name} = $value;
        }

        public function magicCallMethodAttachable($method, $args)
        {
            if (isset($this->_callbacks[$method])) {
                $callback = $this->_callbacks[$method];
                if ($callback instanceof \Closure) {
                    $callback = \Closure::bind($callback, $this, get_class($this));
                }

                return call_user_func_array($callback, $args);
            }

            throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s', get_class($this), $method));
        }

        public function __call($method, $args)
        {
            return $this->magicCallMethodAttachable($method, $args);
        }
    }

使い方:

    <?php

    class Foo
    {
        use MethodAttachable;
    }

    $foo = new Foo();
    $foo->name = 'wozozo';
    $foo->eat = function($food) {
        echo sprintf('%s eats %s.', $this->name, $food), PHP_EOL;
    };

    $foo->eat('cocoiti');
TwitterのURL抽出の正規表現

TwitterのURL短縮で面倒なことになったので、正規表現を作ってみた。

TwitterのURL判定とほぼ一致します。

```java:regex
urlRegex = "(?<![\\w])https?://(([\\w]|[^ -~])+(([\\w\\-]|[^ -~])+([\\w]|[^ -~]))?\\.)+(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(?![\\w])(/([\\w\\.\\-\\$&%/:=#~!]*\\??[\\w\\.\\-\\$&%/:=#~!]*[\\w\\-\\$/#])?)?";
```

正規表現が使える言語ならどれでも使用可能。なはず。



**追記：どうやらアルゴリズムがちょっと変わったみたいです。Twitter側でも実際の文字数と表示されている文字数に食い違いがあり投稿できない場合があるようです。URLに括弧を使った場合などにおかしくなる模様です。**




おまけ　@(メンション)判定

```java:regex
mentionRegex = "(?<![\\w])(@|＠)([\\w]{1,15})"
```
PostgreSQL (8.4) と SQLite3 で出たとある違い

NOT NULL な column を追加しようとしたとき，PostgreSQL と SQLite3 で差が出た．

```
rails new sqlite3test
cd sqlite3test
rails g model item name:string # 適当に model 作る
rake db:migrate
rails g migration add_price_to_item price:integer # column を追加する
vim db/migrate/xxxxxxxxxxxx_add_price_to_item.rb # price に null: false を設定
rake db:migrate
```

すると以下のエラーが出る．

```
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "items" ADD "price" integer NOT NULL
```

当然である．NOT NULL な column なのに default を指定しなければ，もし行が既に存在した場合その column (今回は price) が NULL にならざるを得ないではないか．

しかし PostgreSQL だとこれが通るのである．先のコマンドを以下のように変えて見ると分かる．

```
rails new pgtest -d postgresql
cd pgtest
... # 以下同じ
```

ただし，1 つでも行が items に存在する場合は，SQLite3 と同様にエラーが発生する．

```
# 1 度目の rake db:migrate の直後
rails runner 'Item.create'
rails g migration add_price... # 以下同様に
```

```
rake aborted!
An error has occurred, this and all later migrations canceled:

PG::Error: ERROR:  column "price" contains null values
: ALTER TABLE "items" ALTER "price" SET NOT NULL
```

つまり PostgreSQL の方が少しお利口さんなのですね．
Railsでハッシュのキーをシンボルに変換

```ruby
{'a' => 1, 'b' => 2}.symbolize_keys
# => {:a=>1, :b=>2} 
```

逆もできる。

```ruby
{:a => 1, :b => 2}.stringify_keys
# => {"a"=>1, "b"=>2}
```
Rails 3.2のproduction環境でisn't precompiledと出る場合の対処

Rails 3.2でproduction環境で実行した際、下記のようなエラーが発生。

```
ActionView::Template::Error (application.css isn't precompiled):
```

アセットパイプラインという機能でapp/assets配下がコンパイルされていないとダメとのこと。

```sh
bundle exec rake assets:precompile RAILS_ENV=production
```

上記を実行して再度、試したところ次はCSSに対し```ActionController::RoutingError```が発生。
調べると静的なファイルも含めてコンパイルする必要があるとのことで下記を追加。

```config/environments/production.rb
config.serve_static_assets = true
```

無事に動作した。

他にも解決方法があり、下記のように設定するとコンパイル済みのアセットがなかったらコンパイルするようになる。

```config/environments/production.rb
config.assets.compile = true
```


ちなみにコンパイル済みのアセットをクリアする方法は下記の通り。

```sh
bundle exec rake assets:clean RAILS_ENV=production
```
Octopressのサイドバーにタグリストやタグクラウドを表示させよう！


[Octopress](http://octopress.org/)の記事が大量になってくると、タグによるアクセスが欲しくなってきますよね。しかし、Octopressには、デフォルトでタグリストやタグクラウドを表示させる仕組みはありません。

## Octopressで、タグリストやタグクラウドを表示させるプラグイン

[@tokkonopapa](http://twitter.com/tokkonopapa)さんが提供している[プラグイン](https://github.com/tokkonopapa/octopress-tagcloud)を利用します。
この[プラグイン](https://github.com/tokkonopapa/octopress-tagcloud)の詳細は、[記事](http://tokkonopapa.github.com/blog/2012/01/04/octopress-plugin-for-categories-cloud/)がありますのでそちらを参照してみて下さい。

## プラグインを組み込む

[プラグイン](https://github.com/tokkonopapa/octopress-tagcloud)を組み込むと言っても、単純にファイルコピーをするだけです。
まずは、GitHubから[プラグイン](https://github.com/tokkonopapa/octopress-tagcloud)をダウンロードします。

```bash
$ git clone git://github.com/tokkonopapa/octopress-tagcloud.git
Cloning into octopress-tagcloud...
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 31 (delta 6), reused 31 (delta 6)
Receiving objects: 100% (31/31), 4.49 KiB, done.
Resolving deltas: 100% (6/6), done.
```

次に、必要となるファイルをコピーします。

```bash
$ cp plugins/tag_cloud.rb ~/Projects/rails/fakestarbaby.github.com/plugins/tag_cloud.rb 
$ cp source/_includes/custom/asides/* ~/Projects/rails/fakestarbaby.github.com/source/_includes/custom/asides/
```

## タグリストやタグクラウドに対応するHTMLを編集

必要に応じて編集をしましょう。

こちらは、タグリストに対応するHTMLです。

```html:source/_includes/custom/asides/category_list.html
<section>
  <h1>Categories</h1>
  <ul id="category-list">{% category_list counter:true %}</ul>
</section>
```

こちらは、タグクラウドに対応するHTMLです。

```html:source/_includes/custom/asides/tag_cloud.html
<section>
  <h1>Tag Cloud</h1>
  <span id="tag-cloud">{% tag_cloud counter:true %}</span>
</section>
```

`counter:true`でタグ件数を表示し、`counter:false`でタグ件数を非表示にします。

## サイドバーに表示

サイドバーにタグリストやタグクラウドを表示させる為、`_config.yml`に追記します。
ここでは、タグクラウドのみ表示させるように追記してみました。

```ruby:_config.yml
# list each of the sidebar modules you want to include, in the order you want them to appear.
# To add custom asides, create files in /source/_includes/custom/asides/ and add them to the list like 'custom/asides/custom_aside_name.html'
default_asides: [custom/asides/about.html, asides/recent_posts.html, custom/asides/tag_cloud.html, asides/github.html, asides/twitter.html, asides/delicious.html, asides/pinboard.html, asides/googleplus.html]
```

***

以上で、サイドバーにタグリストやタグクラウドを表示させる事が可能です。
JavaScriptでオブジェクトの内容が知りたい時

```javascript
var obj = {
 test: {
   a: 1,
   b: 2
 }
}

//頑張って書いていた…
console.log('obj.test.a:' + obj.test.a);
console.log('obj.test.b:' + obj.test.b);

//実はこれで楽だった！
console.log(JSON.stringify(obj));

//こっちはもっと凄かった！
console.dir(obj);
```
# vim-altrでRailsのコードを縦断する


```Vim
call altr#define('app/models/%.rb', 'spec/models/%_spec.rb', 'spec/factories/%s.rb')
call altr#define('app/controllers/%.rb', 'spec/controllers/%_spec.rb')
call altr#define('app/helpers/%.rb', 'spec/helpers/%_spec.rb')
call altr#define('spec/routing/%_spec.rb', 'config/routes.rb')
```

[vim-altr](https://github.com/kana/vim-altr) を使うと定義されたルールのファイル間を行き来することができるから、これを使って実装とテストを行き来する。

`%` はワイルドカードでマッチした文字列で置き換えられる。
Octopressでサイドバーに簡易プロフィールを表示させよう！


Octopressでは、サイドバーに表示される情報をカスタマイズする事が可能です。
ここでは、簡易プロフィールを表示させてみましょう。

## 簡易プロフィールを作成

実は、デフォルトで簡易プロフィール用のHTMLは作成されています。
このファイルを好きなように変更すればオッケーです。

```html:source/_includes/custom/asides/about.html
<section>
  <h1>About Me</h1>
  <p>A little something about me.</p>
</section>
```

## 設定ファイルを編集

新しく追加したいサイドバーのHTML情報は、_config.ymlに追記します。
ここでは、サイドバーの先頭に簡易プロフィールを表示させたいので、先頭に追記しています。

```ruby:_config.yml
# list each of the sidebar modules you want to include, in the order you want them to appear.
# To add custom asides, create files in /source/_includes/custom/asides/ and add them to the list like 'custom/asides/custom_aside_name.html'
default_asides: [custom/asides/about.html, asides/recent_posts.html, asides/github.html, asides/twitter.html, asides/delicious.html, asides/pinboard.html, asides/googleplus.html]
```

***

これだけで、サイドバーに簡易プロフィールを表示させる事が出来ます。
Ruby1.9で日付の妥当性をチェックする

1.8系ではDate::exist?を使っていたが1.9ではDate::valid_date?を使用する

http://rurema.clear-code.com/1.9.2/method/Date/s/valid_civil=3f.html

```ruby
ruby-1.9.2-p290 :019 > Date.valid_date?(2012,2,29)
 => true 
ruby-1.9.2-p290 :020 > Date.valid_date?(2013,2,29)
 => false 
```
NSTaskの使い方

```objc
  NSTask *task = [[NSTask alloc] init];
  task.launchPath = @"/usr/bin/ruby";

  NSArray *arguments = [NSArray arrayWithObjects:@"arg1", @"arg2", nil];
  task.arguments = arguments;
  NSPipe *pipe = [NSPipe pipe];
  task.standardOutput = pipe;
  NSFileHandle *file = [pipe fileHandleForReading];

  [task launch];
  NSData *data = [file readDataToEndOfFile];
  NSString *retval = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
```

via http://stackoverflow.com/questions/412562/execute-a-terminal-command-from-a-cocoa-app
NSLogでメッセージをファイルに出力する


`NSLog`はstderrに吐いているだけなので，`- (void)applicationDidFinishLaunching:(NSNotification *)aNotification`内などで

```objectivec
freopen([@"/tmp/xcode.log" fileSystemRepresentation], "w+", stderr);
```

とすると`/tmp/xcode.log`に出力される．便利．
空のディレクトリに.gitkeepを配置するコマンドラインツール 

SubversionからGitに移行する過程で、空のディレクトリをリポジトリに追加するのを忘れないようにしないといけません。Gitは空のディレクトリはバージョン管理しないので、何らかのファイルを置く必要があります。何らかのファイルは```.gitignore```や```empty```などありますが、個人的にはRails風に```.gitkeep```を置くようにしています。

基本的には、```find . -type d -name .git -prune -o -type d -empty -exec touch {}/.gitkeep \;``` を実行すればOKです。今回は作ったツールは、```.gitkeep```を配置する前にどのディレクトリが空っぽか確認する機能や、このコマンドの```.gitkeep```部分を指定できたりなど、オプショナルな機能を追加したものです。

## 使い方

空っぽのディレクトリ一覧を出す:

```
cd git-repo
git-empty-dir list
```

空っぽのディレクトリに```.gitkeep```を配置する:

```
cd git-repo
git-empty-dir keep
```

他にも```--dir```や```--keeper```などのオプションがあります。

```
$ git-empty-dir keep --help
usage: git-empty-dir keep [-h] [--dir DIR] [--keeper KEEPER]

optional arguments:
  -h, --help       show this help message and exit
  --dir DIR        path to git directory
  --keeper KEEPER  dummy file name. Default is ".gitkeep"
```

## git-empry-dir.py

```python:git-empry-dir.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import argparse
import commands
import sys

def list(args):
	command = "find %(dir)s -type d -name .git -prune -o -type d -empty" % vars(args)
	result = commands.getstatusoutput(command)
	print result[1]
	if result[0] > 0:
		sys.exit(1)

def keep(args):
	command = "find %(dir)s -type d -name .git -prune -o -type d -empty -exec touch {}/%(keeper)s \;" % vars(args)
	result = commands.getstatusoutput(command)
	print result[1]
	if result[0] > 0:
		sys.exit(1)

def check_git_dir(dir):
	git_dir = dir + '/.git'
	if os.path.isdir(git_dir) == False or os.path.islink(git_dir) == True:
		print 'Not found .git in ' + dir
		sys.exit(1)

def main():
	parser = argparse.ArgumentParser(description='Add .gitkeep to empty directories.')

	subparsers = parser.add_subparsers(title='commands', metavar='command')

	parser_list = subparsers.add_parser('list', help='list candidates')
	parser_list.set_defaults(func=list)
	parser_list.add_argument('--dir', type=str, help='path to git directory', default=os.getcwd())

	parser_keep = subparsers.add_parser('keep', help='')
	parser_keep.set_defaults(func=keep)
	parser_keep.add_argument('--dir', type=str, help='path to git directory', default=os.getcwd())
	parser_keep.add_argument('--keeper', type=str, help='dummy file name. Default is ".gitkeep"', default='.gitkeep')

	args = parser.parse_args()
	args.dir = args.dir.rstrip('/')
	
	check_git_dir(args.dir)
	
	args.func(args)

if __name__ == "__main__":
	main()
```

Pythonの ```argparse``` って便利ですね！

[2012-04-05 11:55] .git がないところでうっかり keep してしまって悲惨なことになったので、.gitがあるかをチェックするようにした
svnリポジトリからgitリポジトリに移行する

* git-svnを使う

```
# SVNリポジトリをチェックアウト
git svn clone -s http://svn.example.com/existing_svn_repo existing_svn_repo

# 新しいGitリポジトリにプッシュ
cd existing_svn_repo
git remote add origin ssh://git@git.example.com:12345/new_git_repo.git
git push -u origin master
```

こんなんでいいのかな
ファイルのパスを絶対パスに変換

unicorn.rb等の設定ファイルやスクリプトでよく使うのでメモ。

```
File.expand_path('tmp/sample_data.csv', ENV['RAILS_ROOT'])
```

複数の環境で実行されるコードで相対パスを使うとけっこうハマるので、railsのプロジェクトのルートを使って相対パスを絶対パスに変換する。
redmineの開発版を動かしてみた

個人的なプロジェクトの管理のために、ローカルでRedmineを動かしてみたくなった。

安定版はRuby 1.8でしか動かないらしいので(4月現在)、最新版にトライ。

インストールガイド  http://www.redmine.org/projects/redmine/wiki/RedmineInstall

公式リポジトリはsvnだが、https://github.com/edavis10/redmine にgitミラーっぽいのがあるのでとりあえずgit clone

dbはsqlite3を使えば簡単だと思う http://d.hatena.ne.jp/fn7/20111102 環境にあわせてconfig/database.ymlを書く

(メモ：今回はpostgresqlを使った。ガイドではredmineユーザを作る手順になっている。createuser, createdb。あるいはユーザだけ作ってrake db:createとかでもいい)

    $ bundle install --without development test
    $ rake generate_session_store
    $ RAILS_ENV=production rake db:migrate
    $ RAILS_ENV=production rake redmine:load_default_data
    (言語を聞かれるのでjaと入力)

インストールガイドではこのあとパーミッションの設定(7.)が続くが、今回はログインユーザで動かすだけなので関係なし

    $ ruby script/server webrick -e production
    ([2012-04-04 15:21:04] INFO  WEBrick 1.3.1 が出るまで少し待つ)
これでhttp://localhost:3000/ で見えるはず。

admin:adminでログインできるので、http://localhost:3000/users から通常ユーザを作り、ログインしなおす。administratorにチェックをつけておけば、このユーザでプロジェクトの作成ができるはず。

検討事項

* webrickで動かすか、powで動かすか
* ローカルのgitリポジトリとの連携を試す
* プラグインを入れて遊ぶ :-)
mochaのstubの外し方

あるクラスの全てのオブジェクトのメソッドをスタブ化

```ruby
Book.any_instance.stubs(:url).returns("http://foobar.com/foo")
```

teardownでちゃんと外す

```ruby
Book.any_instance.unstub(:url)
```

つけるときはstubs、外すときはunstub( "s"がつかない )。
formのsubmit()を止めるときはpreventDefault()じゃなくてreturn falseを返す

http://api.jquery.com/submit/

デフォルトのアクションを止めるなら全部`preventDefault()`かと思ったら、formの場合は違うみたい。

```Javascript
    $('form').submit(function() {
        var password = $('.password').val();
        var confirmation = $('.confirmation').val();
        if (password != confirmation) {
            $('.message.confirmation').text("パスワードが一致していません");
            return false;
        } else if (password.length < 8) {
            $('.message.password').text("パスワードは8文字以上で入力して下さい");
            return false;
        } else {
            this.submit();
        }
    });
```
クラウドサービス比較

主な前提:俺(≒プライベートプロジェクト)
app engineに飽きてec2,herokuとさらさらっと触ったけど、個人利用なら料金・スケーラビリティ・手軽さなどを考えるとapp engineが最強だと思った　欠点はロックインだけど(こないだ値上げされた)、クラピカの蜘蛛専用の中指の鎖みたいでそれがまたかっこよくて中二心をくすぐる。
自分の場合、ツールは、利便性よりも、中二心をくすぐるかどうかで決める。viもmacもgaeもec2(linux)もそれが理由で使い始めた。中二的にダサいツールには食指が伸びない。普通のレンタルサーバーはそういう中二的な観点でみてそそる要素がないから使う意欲が湧かない。ただ、伝え聞いた話ではレンタルサーバーは安いらしい(そのかわり自由度は低い)。
話を戻す。クラウドサービスと呼ばれる代表的なもののうち、もっともあれなのがheroku。料金は高いし導入の敷居も低いようにみせかけてつまづくポイントは多い。開発用に1dynoだけ動かしてDBをなるべく使わないようなものくらいしか用途を想像できない。スケールを任せられるから、インフラエンジニアをぶったぎれるという意味ではいいのかもしれない。人雇うのに比べたら安い。AWSのRDSについても概ね同じことを思っている。
ec2も料金が青天井で使いにくい(上限設定が見当たらないけどあるのかな)。ec2はつけたりけしたりしながら仮想OSライクにつかったりスクレイピングに使ったりといったスポット的な利用には使える。あと、ec2はクライアントに提案するのに向いていない。I/Oの数字とか転送量なんて見当つかないし、その手の資料も少ないから見積もりを出しにくい。自社の責任でec2を骨までしゃぶりつくしてコストを圧縮し、その上にのっかるサービスで金取る形にしないとクライアントはびびってしまって手を出しづらい。中規模以上の自社サービスならいいかもね。
バックグラウンド実行nohupとdisownの違い

コピペ
http://za.toypark.in/html/2007/06-29.html

以下引用
***
nohupは良く使っていた。最近になってdisownを知った。違いは、プロセスの起動前に使うのがnohup、起動後に使うのがdisown。これだけだと判りにくいので、例を考えてみる。プログラムを作って、起動させる。

```sh
$ hoge
```
終わるまでに1分待ったのに終わらない、でもログアウトして帰宅したい。そんな時は、C-zで一時停止して、psとかjobsで一時停止したプロセスのPIDかジョブ番号を調べる。これを引数にしてdisownを走らせる。

```sh
$ jobs
$ disown %1
```
これで心おきなく帰宅できる。ログアウトしてもプロセスは死なず、プログラムhogeが完走するまでプロセスは生きつづける。

hogeが時間のかかるプログラムだということが判ったので、次に計算させるときはあらかじめログアウト後もプロセスを生かしておきたい。そんなばあいはnohupをつけてhogeを起動。

```sh
$ nohup hoge > log.txt &
```

>GNU Free Documentation License
データスキーマ変更時の処理

migrationをやる方法

```objc
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
```

以上のオプションを

```objc
[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:&error]
```
に渡してやる．
プログラミングを念に例える~Unix系のターミナル操作~

プログラミングとHUNTERXHUNTERの念能力は似ている部分がある。特に、中二的な要素がよく似ている。
例)ハッカー∽プロハンター
***
Unix系のターミナル操作は、念能力で言うと流によく似ている。それ自体に集中的に取り組むことは少ないけど、何かやろうとしたら基本的に避けて通れない。この領域の能力は、実戦を通じて伸びていく。
cdからlsへの淀みない動作、パイプでgrepにつなぐときの軽やかなタッチ、監視系コマンドを諳んじているところなどを見ると、私たちは彼が経験豊かな使い手であることがわかる。念能力でも、流は経験の差がでやすい。
Rails 3.2.3の変更点

Rails 3.2.3がリリースされた

- [Rails 3.2.3 has been released!](http://weblog.rubyonrails.org/2012/3/30/ann-rails-3-2-3-has-been-released/)

ので、適当にまとめてみる。（ブログを読んだだけで、実際に確かめたわけじゃないのであしからず）

##重要な変更

`config.active_record.whitelist_attributes` のデフォルト値が`true`に変更された。この変更は`rails generate`等で生成されるアプリケーションから有効になるだけなので（おそらくハードコーディングされたコードが出力されるのだろう）3.2.3にバージョンを上げる際に特別な対応は必要ないらしい。この変更はRailsでは既知のmass assignment脆弱性に対するもので、先日github自体に対してこの脆弱性をついた攻撃が行われたことから記憶に新しい人も多いはず。（この件については「[github の mass assignment 脆弱性が突かれた件 blog.sorah.jp](http://blog.sorah.jp/2012/03/05/mass-assignment-vulnerability-in-github)」が詳しい)

もう一つの変更点は`:remote=>true`オプションが指定された`form_tag`における`authenticity_token`の取り扱いに関するもので`config.action_view.embed_authenticity_token_in_remote_forms = false`を指定することで`authenticity_token`をデフォルトで挿入しないようにできる。`:authenticty_token=>true`オプションを渡すことで挿入することができる。3.2.3ではこのオプションのデフォルト値は`true`なのでバージョン追従に伴う変更は必要ない。

##その他の3.2.2からの変更点（抜粋）

###ActionPack

- textareaタグの最初に空行が入るようになった。

###ActiveRecord
- `find_or_create_by_{attribute}!`メソッドが追加された。
- 上で書いたように、全ての属性がデフォルトでホワイトリストに入るようになった。だからといって`attr_accessible`が不要になった訳ではない。
Sink + Source -> Conduit？

~~~ {haskell}
hoge :: Sink i m r -> Source m o -> Conduit i m o
~~~

なる型を持つ関数を定義できないだろうか？
動作は、おそらく想定の通り、入力を第一引数に食わせて、出力を第二引数から得るというものだ。
NSWebViewでWebInspectorを有効にする

http://stackoverflow.com/questions/695038/is-there-a-way-to-use-the-webkit-web-inspector-from-a-cocoa-webview-object より．

```objectivec
/* Initialize webInspector. */
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"WebKitDeveloperExtras"];
[[NSUserDefaults standardUserDefaults] synchronize];
```
railsでcookieをサブドメイン以下共有

cookieはdomainに`.example.com`とするとサブドメイン以下共有されます。

railsはconfig/initializers/session_store.rbで

```config/initializers/session_store.rb
AppName::Application.config.session_store :cookie_store, key: '_AppName_session', domain: :all
```

とするとリクエストからドメインを取得し、`.example.com`の形でcookieに設定してくれます。

ただ、問題はlocalhostです。

どうもcookieの仕様っぽいのですが、domainは`subdomain.domainname.domain`の形しか受け付けてくれません。
つまり、railsの`domain: :all`だと、`.localhost`になってしまい、うまくいきません。

VirtualHostで`subdomain.domainname.domain`の形になるようUrlRewritingしてもいいですが、[前回](http://qiita.com/items/b42423ad6c7cf625b0d2)同様プロキシでやってしまいます。

```.proxy.pac

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*.localhost.dev")) {
    return "PROXY localhost:3000";
  }
  if (shExpMatch(host, "localhost.dev")) {
    return "PROXY localhost:3000";
  }
  return "DIRECT";
}

```

ここでは`*.localhost.dev`を受け付けてますが、もちろんdevじゃなくても良いです。
これで晴れてlocalhostでも本番環境でもそのままにサブドメイン以下のcookieが共有されます。
ログイン情報とかを共有しないといけない時にはこれを、
逆にサブドメインごとでデータを区切りたい時はWebStorageを使うと便利です。
(WebStorageはサブドメイン以下の共有ができない仕様になってます)
Google App Engineのwebapp.RequestHandlerはputとdeleteを受けるときパラメータを取得できない

getとpostはできる。deleteとputを定義してself.request.arguments()でパラメータを見たが[]になっていた
そんなに困ることはないが、問題が切り分けられないのでもやっとする。
1.httpリクエスト自体がもともとそういうもの
2.GAE(webapp.RequestHandler)の仕様
Deviseでセッション作成時にwardenの認証が失敗した場合の遷移を変える

``` ruby:app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  # POST /resource/sign_in
  def create
    resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_in_path_for(resource)
  end

  # 認証が失敗した場合に呼び出されるアクション
  def failed
    # warden で出力されたエラーを保存する
    flash[:notice] = flash[:notice].to_a.concat [flash[:alert]]
    redirect_to root_path
  end

  protected
  def auth_options
    # 失敗時に recall に設定したパスのアクションが呼び出されるので変更
    # { scope: resource_name, recall: "#{controller_path}#new" } # デフォルト
    { scope: resource_name, recall: "#{controller_path}#failed" }
  end
end
```

失敗時に sessions/new ではなく root にリダイレクトしたかったんだけど ``Sessions#new`` をオーバーライドしたほうがいいのかも。
普通に作ってれば全然必要ない気がするし設計に問題があるかもっておうおう
rails のログ出力設定

rails 3.2.2 で確認。

デフォルトのまま使用するとログに出力日時が設定されていなかったり
ローテションしてくれなかったりするので、その指定を行う。

```ruby:config/environments/xxxx.rb
config.logger = Logger.new(config.paths["log"].first, 'weekly') # 週ごとにローテート
config.logger.level = Logger::WARN
config.logger.formatter = Logger::Formatter.new
config.logger.datetime_format = "%Y-%m-%d %H:%M:%S"
```
出力結果は以下のようなになる。

[2012-04-03 15:30:43 #13160]  INFO -- : Completed 200 OK in 118ms (Views: 34.4ms | ActiveRecord: 1.5ms)
Rails3.2 ActiveRecord::Calculations#pluckを複数列で使える拡張

pluckメソッドで指定列の配列を取得できますが、
複数列まとめて取得したかったので、
その際書いたコードです。
※拡張と書いてしまいましたが、別メソッドとして利用するコードとなっています。

### 使い方

```
Model.select("key1 AS k1, key2 AS k2").multi_pluck([:k1, :k2])
```

### 結果

[["k1の値", "k2の値"], ["k1の値", "k2の値"] ・・・]


### 拡張用コード

```active_record_multipluck_extension.rb
module ActiveRecord
  module Calculations
    def multi_pluck(column_names)
      result = klass.connection.select_all(arel, nil, bind_values)
      return result.map do |attributes|
        column_names.map do |key|
          klass.initialize_attributes(attributes)[key.to_s]
        end
      end
    end
  end
end
```

こちらを参考にさせてもらいました。
https://github.com/jeroeningen/rails/commit/da91b0ae75635b540307c406863620db4073c688
.vimrc 晒します。

メモ代わりに晒します。
ruby 用設定。

```vim:.vimrc
set enc=utf-8

"VimをなるべくVi互換にする。 このオプションを有効にすると、Vimの便利な機能が使えなくなる。
set nocp

"モードラインの有効無効
set ml

"見やすい色を表示するようにVimに背景色を教える
set bg=dark

"行番号を表示する
set nu

"新しい行を開始したときに、新しい行のインデントを現在行と同じ量にする。
set ai

"新しい行を作ったときに高度な自動インデントを行う。 'cindent' がオンのときは、'smartindent' をオンにしても効果はない。
set si

"Vi にはない 検索で小文字なら大文字を無視、大文字なら無視しない設定。
set scs

"検索で、大文字小文字を区別しない
set ic

"インクリメンタルサーチを行う。 検索文字を打っている途中で、目的の単語を見つけたらEnterを押下すればよい。
set is

"検索結果をハイライトする
set hls

"検索をファイルの末尾まで検索したら、ファイルの先頭へループする。
set nows

"ウィンドウの幅を超える行の折り返し設定。
set nowrap

"閉じ括弧が入力されたとき、対応する括弧を表示する。
set sm

"変更中のファイルでも、保存しないで他のファイルを表示することが出来るようにする。
set hid

"Insertモードで: <Tab> を挿入するのに、適切な数の空白を使う。
set et

"ファイル内の <Tab> が対応する空白の数。
"set ts=4
set ts=2

"自動インデントの各段階に使われる空白の数。
"set sw=4
set sw=2

"tabstopを変えずに空白を含めることにより、見た目のtabstopを変える
"set sts=4
set sts=2

"ファイルの上書きの前にバックアップを作る。
set nowb

"バックアップを保持しない
set nobackup

"強調表示(色付け)のON/OFF設定
syntax on

"開いているファイルのタイプ
filetype on
filetype indent on
filetype plugin on

"ステータス行の表示内容を設定する
set statusline=%F%m%r%h%w\%=[TYPE=%Y]\[FORMAT=%{&ff}]\[ENC=%{&fileencoding}]\[LOW=%l/%L]

"ステータスラインを表示するウィンドウを設定する
set laststatus=2

"補完候補を表示する
set wildmenu

"what to do with Unicode chars of ambiguous width
set ambiwidth=double
```
Octopressでトップページに一部の記事内容のみ載せてみよう！

Octopressのデフォルトのトップページは、記事内容の全てがリストとして表示されるようになっています。
トップページでは、一部の記事内容のみ載せて、「もっと読む」等のリンクを貼ってスマートにしたい事があります。
Octopressでは、少しカスタマイズする事で、簡単にこれを実現する仕組みが用意されています。

## 記事を編集

まず、トップページで記事内容の何処までを表示させるかを指定する必要があります。
指定方法は簡単です。
表示させたい箇所に、『<!-- more -->』を差し込むだけです。

```bash:source/_posts/2012-04-02-awesome-app-kobito.markdown
---
layout: post
title: "プログラマーの技術情報を記録するアプリKobitoが素晴らしい！"
date: 2012-04-02 12:41
comments: true
categories: App
---

皆さんは、プログラミングに関する知識をどうやって蓄積していますか？私は、ずっとEvernoteに蓄積していたんですが、つい最近から[Kobito](http://kobitoapp.com/)へ乗り換えました。今回は、このKobitoについて、少し紹介したいと思います。

<!-- more -->

## Kobito

[Kobito](http://kobitoapp.com/)とは、プログラミングに関する知識を記録、共有する最適なサービス[Qiita](http://qiita.com/)のチームによって開発中のMacクライアントアプリです。2012/04/01の現在では、先行ユーザーのみ利用する事が可能で、４月上旬にリリースが予定されています。
```

例えば、上記のように記述するだけで、指定した箇所以下の内容は、トップページに表示されなくなります。

## もっと読むリンクの文言修正

表示させたい箇所を指定しただけで、記事内容は一部のみ表示させるようになり、記事全文を読む為のページへのリンクも自動的に付加されます。
デフォルトでは、「Read on->」のような文言になっていますが、この文言を修正する事も可能です。

```ruby:_config.yml
excerpt_link: "もっと読む"  # "Continue reading" link text at the bottom of excerpted articles
```

簡単ですね。
Emacs tips

# Emacs関係のメモ

## 文字コード変更

C-x [RET] fで文字コード入力
その後C-x C-s

## 正規表現で置換

M-x replace-regexp

()を使う場合は¥(¥)にする

### 置換文字列
マッチ全体は¥& (Ruby,Perlの$&)

()参照は¥1,¥2,¥3... (Ruby,Perlの$1,$2,$3...)
OctopressでDisqusを表示させよう！

Octopressでは、デフォルトでDisqusを表示させる事が可能です。

## Disqus情報を追記

Disqus情報は、_config.ymlに追記します。

```ruby:_config.yml
# ----------------------- #
#   3rd Party Settings    #
# ----------------------- #

# Disqus Comments
disqus_short_name: scrabblenote
disqus_show_comment_count: false
```

これで、記事の最下部にDisqusが表示されればオッケー。
簡単ですね！
Rails の Timezone を日本時間に設定

rails 3.2.2 で確認。

```config/application.rb
config.time_zone = 'Tokyo'
```

合わせて ActiveRecord 使用時に DB に書かれる時刻も合わせたい場合は以下も追加

```config/application.rb
config.active_record.default_timezone = :local
```
Mongoidでfieldにdefaultを指定するとnilが隠蔽されてハマる

Mongoidによくハメられる。

`field: :flag, type: Boolean, default: false`の時

````ruby:pry
11:23:16:pry > MyModel.all.map(&:flag)
=> [false, false, false, false, false, false, false, false, false, false, false, false, false, false]
````

```ruby:pry
11:23:21:pry > MyModel.where(flag: false).count
=> 3
````

！？

```ruby:pry
11:23:25:pry > MyModel.where(flag: nil).count
=> 11
````

同じデータで、defalut指定を外して`field: :flag, type: Boolean`の時

````ruby:pry
11:23:16:pry > MyModel.all.map(&:flag)
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, false, false, false, nil]
````

実際はnilなのに、fieldの値を参照するとdefaultの値が見える。そのくせwhere句で検索したときはnilとして扱われていて実に面倒くさい
Dropbox APIにファイルの差分を取得する/delta APIが追加された

- [Dropbox - REST API reference # /delta](https://www.dropbox.com/developers/reference/api#delta)

今まではアプリにキャッシュされたファイルが最新状態かを知るために、毎回ファイル全体を取ってくる必要があったけど、これで解決できる。
/data/dataの音楽ファイルを再生する


```java:hoge.java
String fileName = "hoge.mp3";

FileInputStream fis = null;
try {
    fis = new FileInputStream(this.getFileStreamPath(fileName));
} catch (FileNotFoundException e) {
}

try {
    mediaPlayer.setDataSource(fis.getFD());
    mediaPlayer.prepare();
} catch (IllegalArgumentException e) {
} catch (IllegalStateException e) {
} catch (IOException e) {
}
mediaPlayer.start();
```
ruby で置換

基本

```:sh
ruby -i -pe '$_.gsub!(/foo/, "bar")' *.txt
```

キャプチャする場合

```:sh
ruby -i -pe '$_.gsub!(/(foo)/, "\\1 and bar")' *.txt
```

置換する前に確認したいとき

```:sh
ruby -ne 'puts $_ if $_.gsub!(/(foo)/, "\\1 and bar")' *.txt
```