OmniAICreator/Qiita-1.07M huggingface dataset:
Bootstrap.css for Markdown Pro


```
body {
  padding: 10px 15px;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 14px;
  line-height: 20px;
  color: #333333;
  background: #ffffff;
}

a, a:visited {
  color: #0088cc;
  text-decoration: none;
}

a:hover {
  color: #005580;
  text-decoration: underline;
}

p { margin: 0 0 20px; }
small { font-size: 85%; }
strong { font-weight: bold; }
em { font-style: italic; }

h1,h2,h3,h4,h5,h6 {
  margin: 10px 0;
  font-family: inherit;
  font-weight: bold;
  line-height: 20px;
  color: inherit;
  text-rendering: optimizelegibility;
}

h1,h2,h3 { line-height: 40px; }
h1 { font-size: 38px; }
h2 { font-size: 32px; }
h3 { font-size: 24px; }
h4 { font-size: 18px; }
h5 { font-size: 14px; }
h6 { font-size: 14px; }

ul,ol {
  padding: 0;
  margin: 0 0 10px 25px;
}

ul ul,
ul ol,
ol ol,
ol ul {
  margin-bottom: 0;
}

li { line-height: 20px; }

hr {
  margin: 20px 0;
  border: 0;
  border-top: 1px solid #eeeeee;
  border-bottom: 1px solid #ffffff;
}

blockquote {
  padding: 0 0 0 15px;
  margin: 0 0 20px;
  border-left: 5px solid #eeeeee;
}

code,
pre {
  padding: 0 3px 2px;
  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
  font-size: 12px;
  color: #333333;
  -webkit-border-radius: 3px;
     -moz-border-radius: 3px;
          border-radius: 3px;
}

code {
  padding: 2px 4px;
  color: #d14;
  white-space: nowrap;
  background-color: #f7f7f9;
  border: 1px solid #e1e1e8;
}

pre {
  display: block;
  padding: 9.5px;
  margin: 0 0 10px;
  font-size: 13px;
  line-height: 20px;
  word-break: break-all;
  word-wrap: break-word;
  white-space: pre;
  white-space: pre-wrap;
  background-color: #f5f5f5;
  border: 1px solid #ccc;
  border: 1px solid rgba(0, 0, 0, 0.15);
  -webkit-border-radius: 4px;
     -moz-border-radius: 4px;
          border-radius: 4px;
}

pre code {
  padding: 0;
  color: inherit;
  white-space: pre;
  white-space: pre-wrap;
  background-color: transparent;
  border: 0;
}

table {
  width: 100%;
  margin-bottom: 20px;
  border: 1px solid #dddddd;
  border-collapse: collapse;
  border-left: 0;
  -webkit-border-radius: 4px;
     -moz-border-radius: 4px;
          border-radius: 4px;
}

table th,
table td {
  padding: 8px;
  line-height: 20px;
  text-align: left;
  vertical-align: top;
  border-top: 1px solid #dddddd;
  border-left: 1px solid #dddddd;
}

table th { font-weight: bold; }
table thead th { vertical-align: bottom; }

table thead:first-child tr:first-child th,
table thead:first-child tr:first-child td {
  border-top: 0;
}
```
Redmineテーマやプラグイン開発環境を構築する (RVM版)


テーマやプラグインが開発したくなったので運用環境で作業せずに開発環境を構築してみたメモ。

rbenv版はhttp://qiita.com/items/909ea8134e5199c3457a

# 前提

ポリシー的にはなるべく簡単に、そして環境を限定的に。とりあえずUbuntu 12.04でやってるけど*nix系ならほぼ使いまわせそう。

* Redmine 2.x向け
* GitでRedmine本体を管理する
* Redmine本体の開発については対象外
* 自分のテーマやプラグインは個別のGitリポジトリで管理(submoduleとかは使わない)
* RVMを使い、Redmine用のgemsetを作る
* データベースはSQLiteを使う

# Redmineの実行環境を作る

## Rubyのインストール

RedmineのRubyのバージョンを確認する。
http://www.redmine.org/projects/redmine/wiki/RedmineInstall

https://rvm.io/ からRVMをイントールしておく。

## Redmineの配置とGemsetの準備

```
git clone https://github.com/redmine/redmine redmine-dev
cd redmine-dev
git checkout -b develop/2.2.1 2.2.1
rvm --rvmrc --create 1.9.3@redmine
```

Redmineをgitで落として、バージョンのタグからdevelop/{version}という名前のローカルブランチを作って使う。

でRuby 1.9.3でRedmine用のgemsetである1.9.3@redmineをrvmrcを使ってこのディレクトリでそれを使うようにしている。rvmrcはここを参考。https://rvm.io/workflow/rvmrc/

redmine-devに移動したときに自動的に1.9.3@redmineに切り替えるには/etc/rvmrc または ~/.rvmrcにrvm_project_rvmrc=1を設定しておくといい。

## Redmineのセットアップ

**Redmine 2.3.1にあげたらGemfileが改良されておりdatabase.ymlのadapterを見て適切なデータベースドライバをインストールするようになり、--without mysqlなどのグループによる除外が機能しなくなる**

```/path/to/redmine-dev
cp -p config/database.yml.example config/database.yml
```

でデータベースの構成ファイルを作成して以下のように修正。

```config/database.yml
production:
  adapter: sqlite3
  database: db/production.sqlite3
development:
  adapter: sqlite3
  database: db/development.sqlite3
test:
  adapter: sqlite3
  database: db/development.sqlite3
```

bundlerで依存モジュールを解決する。

```/path/to/redmine-dev
rbenv local 1.9.3-p327
bundle install --without development test rmagick mysql postgresql --path vendor/bundle
```

粛々とセットアップ。

```/path/to/redmine-dev
rake generate_secret_token
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data
mkdir tmp tmp/pdf public/plugin_assets
```

## Redmineの実行

```/path/to/redmine-dev
ruby script/rails server webrick -e production
```

で実行して、 http://localhost:3000/ にアクセス。admin/adminでログインできる。

あとはテーマやプラグインを好き勝手に開発。基本的にRedmine本体の開発はしないのでredmine-dev/.gitはRedmineのバージョンアップ時にブランチを切り替えるだけで特にコミットはせず、自分のテーマやプラグインについてはnew fileで差分が出たままの状態にしておく。

## Redmineバージョンアップ時の作業

リポジトリの最新を取得して、新しいバージョンのタグからローカルブランチを切り替えてデータのマイグレーションとかを行う。

ブランチの切り替え

```/path/to/redmine-dev
git checkout master
git pull; git pull --tags
git checkout -b develop/x.x.x x.x.x
```

データの再セットアップ。

```/path/to/redmine-dev
bundle install --without development test rmagick mysql postgresql
rake db:migrate RAILS_ENV="production"
rake redmine:plugins:migrate RAILS_ENV=production
rake tmp:cache:clear
rake tmp:sessions:clear
```
Jekyllに新しいタグを追加する

JekyllはLiquidというテンプレートエンジンを採用しています．Liquidは表現力をあえて制限することで危険なコードをテンプレートに埋め込めないようになっています．そのため，テンプレートで何かおもしろいことをしようとすると，新しいプラグインを書かなければならないことがよくあります．ところが，Jekyllのプラグインの書き方に関するドキュメントはそれほど多くないため，ここに書き方をメモしておきます．

# Case Study 1: Echo

最初に引数をそのまま表示するタグを作ってみます．タグは `Liquid::Tag` を継承して作ります．

```ruby:_plugins/echotag.rb
# coding: utf-8

module Jekyll
  class EchoTag < Liquid::Tag
    def initialize(tag_name, markup, tokens)
      super
      @arg = markup
    end

    def render(context)
      @arg
    end
  end
end

Liquid::Template.register_tag("echo", Jekyll::EchoTag)
```

これを `_plugins/echotag.rb` に配置して，ページの中で `{% echo hello %}` と書くと `hello` が出力されます．

`EchoTag#initialize` の第二引数にタグの引数が渡されます．それを `EchoTag#render` メソッドで返すようにすれば echo タグを実装できます．

# Case Study 2: RSS Feed

ここでは，RSSを使って外部のサイトから更新情報を取ってきてページに埋め込むタグを例として解説していきます．

先に使用例を示します． `{% feed URL %}` と `{% endfeed %}` で囲った間では `entries` という配列を参照でき，その中にエントリのURLとタイトルが納められています．

```html
<section>
  <h1>CoffeeScript の話題</h1>
  {% feed http://qiita.com/tags/CoffeeScript/feed.atom %}
  <ul>
    {% for entry in entries %}
    <li>
      <a href="{{entry.url | xml_escape}}">
        {{entry.title | escape}}
      </a>
    </li>
    {% endfor %}
  </ul>
  {% endfeed %}
</section>
```

このように閉じタグがあるようなタグは `Liquid::Tag` ではなく `Liquid::Block` を継承します．プラグインのコードは以下のようになります．

```ruby:_plugins/feedtag.rb
# coding: utf-8

require "open-uri"
require "feed-normalizer"

module Jekyll
  class FeedTag < Liquid::Block
    def initialize(tag_name, markup, tokens)
      super
      @url = markup.strip
    end

    def render(context)
      entries = fetch_feed(@url)
      context.stack do
        context["entries"] = entries
        return super
      end
    end

    def fetch_feed(url)
      open(url) do |f|
        feed = FeedNormalizer::FeedNormalizer.parse(f)
        return feed.entries.map {|entry| {
            "url" => entry.url,
            "title" => entry.title,
          }
        }
      end
    end
  end
end

Liquid::Template.register_tag("feed", Jekyll::FeedTag)
```

`initialize`メソッドの第二引数がタグの引数であることは`echo`の場合と同じです．

`fetch_feed`メソッドでは，`url`を開いてRSSフィードをパースしてハッシュの配列にしています．Liquidは`to_liquid`メソッドを持っているオブジェクトしかテンプレートに渡せません．ArrayやHashはLiquidが`to_liquid`メソッドを定義してくれるため，これらに変換しておけば，テンプレートの中でその変数を参照することができます．

`render`メソッドでは，`fetch_feed`を呼び出したあと，2つのことを行っています．

まず，テンプレートの中で `entries` を参照するために，`context` に `entries` を登録しています．ただし，何も考えずに登録すると，`{% endfeed %}` の後でも `entries` を参照できてしまうため，`context["entries"] = entries` を `context.stack do` ～ `end` で囲う必要があります．

次に，`super` を呼び出して，親クラスにタグで囲われた部分をレンダリングをさせます．（`super` はオーバーライドしているメソッドを呼び出す構文です．詳しくは[リファレンス](http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fcall.html#super)を参照．）

# 補足

## site変数を取得する方法

```ruby
site = context.registers[:site]
```

## baseurlを取得する方法

```ruby
site.config["baseurl"]
```

`site` は上述の方法で取得する．
CoffeeScriptでObject.definePropertyを使ってみた

[CoffeeScript Issue #1165](https://github.com/jashkenas/coffee-script/wiki/FAQ)によるとObject.definePropertyは当分実装されない模様。少々強引ですが面白やり方を見つけましたのでここに記入します。

ぶっちゃけObjectice-Cの@propertyみたいに@synthesis出来たらいいなって思ってます。

```coffee-script
Function::property = (prop, desc) ->
  Object.defineProperty @prototype, prop, desc

class Fuga
  constructor: (@_foo='bar') ->
  @property 'foo',
    get: -> @_foo
    set: (foo) -> @_foo = foo

f = new Fuga 'Nyaa'
console.log p.foo
f.foo = 'Nyo'
console.log p.foo
```

http://stackoverflow.com/questions/11587231/coffeescript-getter-setter-in-object-initializers
Sinatra Extension を書くお作法、というか我流

## まず読め

* http://www.sinatrarb.com/extensions.html

> * `Sinatra::Base` を直接いじるな。あらゆるSinatraアプリケーションに影響があってきついので、ことモジュラースタイルでは明示的に`register`させること
> * Extension内部で直接 `require 'sinatra'` するとモジュラスタイルでサーバが立ち上がり沢山の悲しみが生まれるので、`require 'sinatra/base'` しなさい
> * <http://www.sinatrarb.com/extensions.html> に書いてあるAPIだけをできるだけ使え。直接Sinatraのコアクラスにモンキーパッチとかは勘弁
> * Extensionは`Sinatra`のnamespace配下で、moduleとして定義される _べきだ_ 。例えば、基本認証を有効にするようなやつなら `Sinatra::BasicAuth`

なるべくコアクラスと隔離された形で書くのが望ましい。

## クラシックでもモジュラーでも使えるようにするには

* `Sinatra.helpers`

```ruby:sample1.rb
require 'sinatra/base'

module Sinatra
  module HTMLEscapeHelper
    def h(text)
      Rack::Utils.escape_html(text)
    end
  end

  helpers HTMLEscapeHelper
end
```

ヘルパーならこんな感じで定義する。

これで、クラシックの時は暗示的に、モジュラーな時は明示的に`helpers`で利用宣言、という風にできる

* `Sinatra.register`

↑と同様ですね。

```ruby:sample2.rb
require 'sinatra/base'

module Sinatra
  module LinkBlocker
    def block_links_from(host)
      before {
        halt 403, "Go Away!" if request.referer.match(host)
      }
    end
  end

  register LinkBlocker
end
```

なお、クラシックSinatraの場合、`Sinatra.register`でクラシックでの利用を宣言したら、一緒にトップレベルにメソッドが生える。

この辺のトップレベルにメソッドが生える仕組みは、 `Sinatra::Delegator.delegate` というメソッドが握っている。

* https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1742

この辺りの処理の通り。

## Sinatra向けクラスマクロ

モジュールに普通に定義したメソッドはそのままクラスマクロになる。要するに、内部で、 `extend` してるんですね。

このクラスマクロ内部で普通に `get` とか呼んじゃっていいんでよしなにしてください。

あと、ゲッター、セッター系は特殊な扱いになる。詳細は書いてます。

* http://qiita.com/items/e1ad9832f8e34906b089

## `self.registered`

`register` されたときに呼ばれる挙動を定義する。`self.included`などと同じノリで書く。

```ruby
def self.registered(base)
  base.set :foo, "BAR"
end
```

このマクロ感が大事な気がする。

## Extensionを書くのに便利なライブラリ

sinatra-contrib にある。

* <https://github.com/sinatra/sinatra-contrib/blob/master/lib/sinatra/extension.rb>

```ruby:sample3.rb
module MyExtension
  extend Sinatra::Extension

  configure :development do
    set :reload_stuff, true
  end

  get '/' do
    'Hello World'
  end
end
```

こうでもいい

```ruby:sample3.rb
module MyExtension
  extend Sinatra::Extension

  registered do
    configure :development do
      set :reload_stuff, true
    end
  end
end
```

少し大きなSinatraアプリケーションなら、設定やヘルパーなどをExtensionに切り出すことは当たり前のティップスなので[要出典]、そういうときに少し便利かも。そうでもないか？

## まとめ

まあ読め。

* http://www.sinatrarb.com/extensions.html
mox generator とか欲しい (2)

前回[mox generator とか欲しい](http://qiita.com/items/05542d74991787a676e8)とか書いた続きです。

やっぱり戻り値が欲しくなったので、`ret=` を追加しました。ついでに繰り返し呼ぶとエラーになるので、それを防ぐべくinstanceをチェックしてますが、、、これはスマートじゃないなあ・・・

```python:mox_generator.py
    def stub(self, stub_class, stub_method, num_args, ret=None):
        stubbed = getattr(stub_class, stub_method)
        if not isinstance(stubbed, mox.MockAnything) and not isinstance(stubbed, mox.MockObject):
            self.mox.StubOutWithMock(stub_class, stub_method)
            stubbed = getattr(stub_class, stub_method)
        args = tuple([mox.IgnoreArg() for i in range(num_args)])
        stubbed(*args).AndReturn(ret)
```

あと真面目な（まともな）テストライターなら引数もチェックするだろってことで。

```python:mox_generator.py
    def stub_with_args(self, stub_class, stub_method, num_args,
                        *args, **kwds):
        if kwds.has_key('ret'):
            ret = kwds.pop('ret')
        else:
            ret = None

        stubbed = getattr(stub_class, stub_method)
        if not isinstance(stubbed, mox.MockAnything) and not isinstance(stubbed, mox.MockObject):
            self.mox.StubOutWithMock(stub_class, stub_method)
            stubbed = getattr(stub_class, stub_method)

        stubbed = getattr(stub_class, stub_method)
        stub_args = tuple(map(self.stub_arg, args))
        stub_kwds = {}
        for key in kwds.keys():
            stub_kwds[key] = self.stub_arg(kwds[key])
        stubbed(*stub_args, **stub_kwds).AndReturn(ret)

    def stub_arg(self, arg):
        if arg is None:
            return mox.IgnoreArg()
        elif type(arg) == type(MoxGenerator):
            return mox.IsA(arg)
        else:
            return arg
```

`type` の比較方法がわからず。
ま、とりあえずという形で。
次は、```repeat_stub``` とか作りたい。
curlでデータを標準入力から受け取ってPOSTする

curlでは

    $ curl http://hoge.com -X POST -d 'a=1&c=2'

などとしてPOSTでデータを送ることができますが, `-d`オプションに`@-`を渡せば受け取った標準入力をデータとしてcurlを撃てます.

    $ なんかの処理 | curl http://hoge.com -X POST -d @-

夢が広がります.
Windows + Python 3.3 で watchdog をインストールする

# watchdog is 何
watchdog は Python で書かれたファイルシステム監視ツールです。

see also: [watchdogモジュールのwatchmedoコマンドが便利 - 偏った言語信者の垂れ流し](http://d.hatena.ne.jp/nullpobug/20120331/1333125058)

# インストール
watchdog は現在 Python 2.5 以上で動作するので、大抵の環境は以下のコマンドを実行すればおしまいです。

```
pip install watchdog
```

## Windows + Python 3.3
しかし、Windows 環境かつ、pip を入れた Python のバージョンが 3.3 の場合、以下のエラーで失敗するかもしれません。
(私の場合、Python 3.2 は問題なく、Python 3.3 ではこのエラーが発生しました)

```argh.py
UnicodeDecodeError: 'cp932' codec can't decode byte 0x94 in position 112: illegal multibyte sequence
```

## 対応策
この状況になったら、以下の手順でインストールを続行します。

### argh/setup.py の修正
インストール中の作業ディレクトリが、お使いの Python のインストール先または virtualenv で作った仮想環境にできていると思います。
argh のインストールに失敗しているので、argh/setup.py を開いてみましょう。
エラーメッセージで指摘された行数付近で、タブ文字が入っている箇所があるので、これを半角スペース4つに置換します。

### argh のインストール
setup.py を修正したら、argh フォルダに移動し、以下のコマンドを叩いて argh をインストールします。

```
python install setup.py
```

### watchdog のインストール再試行
これであなたを妨げるものはいない(はずな)ので、再び `pip install watchdog` を叩きましょう。
なお、まだ argh フォルダにいるようなら、パスを移動した方が良いかもしれません。

# おまけ
喜び勇んで watchdog を使うと、すぐに次のエラーが発生するでしょう。

```bricks.py
    if not sys.version < (2, 6, 0):
TypeError: unorderable types: str() < tuple()
```

大変残念な感じなので、この bricks.py を watchdog をインストールしたフォルダから開き、 `sys.version` を `sys.version_info` に書き換えてあげてください。
F#でofなんたらとtoなんたらの使い分け

F#には、`T seq` から `T list` に変換する関数として、

- Seq.toList
- List.ofSeq

の2つの関数があります。
この2つの関数はまったく同じシグネチャを持つため、どちらかしか使っていない、という人もいると思います。

toなんたらと、ofなんたらは、次のように使い分けるといいでしょう。

- パイプライン演算子でつなぐ場合は toなんたら
- そうでない場合は ofなんたら

```fsharp
let xs = seq { 1..100 }
let lst =
  xs
  |> Seq.filter (fun x -> x % 2 = 0)
  |> Seq.map string
  |> (* ここまではseq *) Seq.toList (* ここからlist *)
     //                  seq -> list
```

```fsharp
let xs =
  seq { 1..100 }
  |> Seq.filter (fun x -> x % 2 = 0)
  |> Seq.map string
let lst (* この型はlist *) = List.ofSeq xs (* こっちの型はseq *)
        //                   list <- seq
```
Googleで2段階認証を使っているときにRailsのActionMailerでGmailを使う方法


## 問題
RailsでActionMailerを使って、Gmailでメールを送信しようとすると、
**Application-specific password required**
なるエラーが発生しました。

調べたところ、
Stackoverflowでも同様の質問がありました。
http://stackoverflow.com/questions/11007061/error-when-sending-email-confirmation-using-actionmailer-on-ror

## 解決方法
```/config/environments/development.rb
  config.action_mailer.smtp_settings = {
    address: "smtp.gmail.com",
    port: 587,
    domain: "gmail.com",
    authentication: "plain",
    enable_starttls_auto: true,
    user_name: ENV["GMAIL_USERNAME"],
    # 消す password: ENV["GMAIL_PASSWORD"],
    password: "ここに、アプリケーション固有のパスワードを入れる"
  }
```

というように、アプリケーション固有のパスワードを設定すれば、問題なくメール送信できました。通常のログインに使うパスワードは不要です。
tar(1) の使い方

よく忘れるのでメモ。

## 作成
- `tar -cv -f hoge.tar /etc`: /etc 以下をアーカイブ
- `tar -cv /etc`: /etc 以下をアーカイブしてデータを stdout に出力する
- `tar -chv -f hoge.tar /etc`: シンボリックリンクを追跡する
- `tar -cv -f hoge.tar -C /etc apache2`: /etc に移動してから apache2 以下をアーカイブ。展開すると apache2/ 以下に展開される
- `tar -zcv -f hoge.tar.gz /etc`: gzip 圧縮する

## 展開
- `tar -xvf hoge.tar`: カレントディレクトリに展開
- `tar -xv < hoge.tar`: stdin からデータを読み込んで展開する
- `tar -xvf hoge.tar -C /tmp/hoge`: /tmp/hoge/ 以下に展開
- `tar -zxvf hoge.tar.gz`: gzip 解凍する
CoffeeScriptをcoffeeコマンドぬきで実行する時

Shebang!を使います。
まずスクリプトの一行目に #!/usr/bin/env coffee を追加

```CoffeeScript:hello.coffee
#!/usr/bin/env coffee
console.log 'hello'
```
ターミナルで

```
$ chmod +x hello.coffee
```
使ってみよう

普通はこうですが

```
$ coffee hello.coffee
```

coffeeぬきでも動く


```
$ ./hello.coffee
hello
```

[node.jsも同様です](http://qiita.com/items/dc913324b693acef6fc1)

```javascript
#!/bin/env node
console.log('hello');
```
リストの評価の遅延(force)


http://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E2%80%95Haskell%E3%81%A7%E5%AD%A6%E3%81%B6%E5%8E%9F%E7%90%86%E3%81%A8%E6%8A%80%E6%B3%95%E2%80%95-Richard-Bird/dp/427406896X でパーサのとこでforceって出てきてなんのこっちゃいなと思ったんだけど、こういうことか。

```haskell:
force :: [(a, b)] -> [(a, b)]
force xs = (fst (head xs), snd (head xs)) : tail xs
```

```haskell:
> let x = force undefined
> let y = undefined
> null x
False
> null y
*** Exception: Prelude.undefined
```

`undefined`を、未計算の値で次は`1:undefined`、さらに`1:2:undefined`・・・みたいに順次計算されていくリストと見るとよい。そういう観点で見ると、この手法によって特に無限リストにおいて、長さが1以上のリストであることを強制できる。
[エラー] Titanium Studio 3 で "Launching simulator process failed Unable to locate the CLI executable." がでてコンパイルできない

# エラー

**Titanium Studio 3**をつかっていて、さらに**zsh**を使っていると遭遇するのが、

```
Launching simulator process failed
Unable to locate the CLI executable. Please restart Studio or use 
Help > Check for Titanium Updates to install Titanium CLI.
```
というエラー。

# 原因

これは、Titanium Studioがデフォルトで`bash`を利用していて、`npm`でインストールした`titanium cli`を見つけられないから。

# 解決法
`.bash_profile`に

```sh:.bash_profile
export PATH=$PATH:/usr/local/share/npm/bin
```

を記述する。

# 参考
http://developer.appcelerator.com/question/145794/launching-simulator-process-failed
nginxの出力先をカスタマイズする。

参考サイト：http://heartbeats.jp/hbblog/2012/02/nginx02.html

今回の環境：
【linux】CentOS6.2
【nginx】1.2.6

nginxの出力先を考えずにソースからコンパイル～インストールを行うと、
proxy_tempやら、fastcgi_tempなどが${NGINX_ROOT}なディレクトリ配下に作成されるので、
どーもディレクトリ構成がすっきりしない。
それと、実行ファイルと設定ファイルとその他でディレクトリを分けて置いて、
後々のバージョンアップにも耐えられるような構成を目指す。

```text:目指すディレクトリ構成
${NGINX_ROOT}
  　＋－－－1.2.6
      　＋－－sbin
      　＋－－conf
    ＋－－－running
        ＋－－logs
        ＋－－html
        ＋－－temp
           ＋－client_body_temp
           ＋－proxy_temp
           ＋－fastcgi_temp
           ＋－uwsgi_temp
           ＋－scgi_temp
（デフォルトでは～_tempのディレクトリがlogsとかと一緒の場所に作成されてしまい、
　htmlとかlogsの存在が埋もれてしまいそうになる。）
```

実際のコマンドは以下のとおり。(ここでは${NGINX_ROOT}を/var/opt/nginx/ としている)

```bash:NGINXのインストールログ的手順
$ tar xzf ./nginx-1.2.6.tar.gz
$ cd ./nginx-1.2.6
$ ./configure --user=nginx --group=nginx \
    --with-http_ssl_module \
    --with-http_random_index_module \
    --with-http_dav_module \
    --without-select_module \
    --prefix=/var/opt/nginx/running \
    --sbin-path=/var/opt/nginx/1.2.6/sbin/nginx \
    --conf-path=/var/opt/nginx/1.2.6/conf/nginx.conf \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/lock/subsys/nginx \
    --http-client-body-temp-path=temp/client_body_temp \
    --http-proxy-temp-path=temp/proxy_temp \
    --http-fastcgi-temp-path=temp/fastcgi_temp \
    --http-uwsgi-temp-path=temp/uwsgi_temp \
    --http-scgi-temp-path=temp/scgi_temp
$ make
$ make isntall
```

もしかしたら、./configureのとこで以下のようなエラーが出るかもしれない。

```bash:PRCEが無いよ的なエラー
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
```

その時はタイトルにも書いたとおり[PRCEライブラリ](http://www.pcre.org/ "PRCE")が無いのでインストールした後、
また./configureを実行すると良い。

インストールが完了したら、ディレクトリの作成を忘れないこと。

```bash:tempディレクトリを作成する
$ mkdir /var/opt/nginx/running/temp
```

もし忘れたまま起動するとこんなエラーが出る。（というか出た。）

```bash:tempディレクトリ作成エラー例
nginx: [emerg] mkdir() "/var/opt/nginx/running/temp/client_body_temp" failed (2: No such file or directory)
```

あとは、nginxのディレクトリ専用のユーザを作成したりと、セキュリティ対策も忘れずに。
gistからcloneしようとすると、error: RPC failed; result=22, HTTP code = 400 ってでる。


	$ git clone https://gist.github.com/xxxxxxxxxxxxx.git 
	Initialized empty Git repository in /root/xxxxxxxxxxxxxx/.git/
	error: RPC failed; result=22, HTTP code = 400

gitのバージョンを確認する。

	$ git --version
	git version 1.7.1

最新ではないようだ。

##とりあえず最新にしたら治りました。

以下の通りにソースコードから入れました。

[CentOS6.3にgitをソースコードから入れる](http://qiita.com/items/54c8e3436212ad6686b3)


	$ git --version
	git version 1.8.1.1

cloneしてみる。

	$ git clone https://gist.github.com/xxxxxxxxxxx.git 
	Cloning into 'xxxxxxxxxxxxxx'...
	remote: Counting objects: 3, done.
	remote: Compressing objects: 100% (2/2), done.
	remote: Total 3 (delta 0), reused 0 (delta 0)
	Unpacking objects: 100% (3/3), done.
	
できた。
formで非同期通信をした時、2回サブミットされるのは解決する方法

ファイルを非同期通信で保存したとき、2回サブミットされる現象が起こりました。
ファイル以外を保存するときに起こるかは、未確認です。

結果として、Mixpanelが原因でした。

下記のコードで、2回サブミットされました。

```haml:form.haml
= form_for @hoge, :html => {:multipart => true}, :remote => true do |f|
  = f.file_field :file
  = f.submit '保存', :class => 'submit'

:javascript
  $(function(){
    mixpanel.track_forms('form', 'FormSave',{hoge:hoge});
  });
```

Mixpanelのformイベントを登録する処理が原因だったので、下記のように修正することによって、解決されました。

```haml:form.haml
= form_for @hoge, :html => {:multipart => true}, :remote => true do |f|
  = f.file_field :file
  = f.submit '保存', :class => 'submit'

:javascript
  $(function(){
    $('.submit').click(function(){
      mixpanel.track('FormSave',{hoge:hoge});
    });
  });
```



今回はMixnapelが原因でしたが、そのほかの原因で、formを非同期で保存した時、2回サブミットされる現象が起こることがあるみたいので、下記のリンクも参考にしてみてください。
[form submitting twice with :remote => true Rails 3.2](http://stackoverflow.com/questions/10013287/form-submitting-twice-with-remote-true-rails-3-2)
[Form submitted twice, due to :remote=>true](http://stackoverflow.com/questions/7411271/form-submitted-twice-due-to-remote-true)
[Rails 3 - Forms - Jquery :remote make duplicates and prompts 2x?](http://stackoverflow.com/questions/5551278/rails-3-forms-jquery-remote-make-duplicates-and-prompts-2x)
CentOS6.3にgitをソースコードから入れる


CentOS6.3のyumでインストールできるgitが1.7系だったのでソースコードから最新版を入れる事に


##まずは必要なパッケージを入れておく

	$ yum install -y zlib-devel perl-devel gettext

##ソースコードをwgetでダウンロード
	$ cd /usr/local/src
	$ wget http://git-core.googlecode.com/files/git-1.8.1.1.tar.gz

上記は13/1/15現在の最新バージョン
最新バージョンはこちらから確認して下さい
https://code.google.com/p/git-core/

## 展開して、tarballは削除
	$ tar zxvf git-1.8.1.1.tar.gz 
	$ rm git-1.8.1.1.tar.gz

## make install
		
	$ cd git-1.8.1.1/
	$ ./configure 
	$ make
	$ make install	

##インストールできたか確認
	$ git --version
	-bash: /usr/bin/git: そのようなファイルやディレクトリはありません

**Oops!!!**

	$ which git
	/usr/local/bin/git

ん、よくわからないけど、シンボリックリンクつくっておきます。

	$ ln -s /usr/local/bin/git /usr/bin/git 
	$ git --version 
	git version 1.8.1.1

無事インストールできました。


##おまけ　アンインストール

やった事無いですが、今回は
	
	$ /usr/local/src
内にMakeFileを残してあるので、
	
	$ cd /usr/local/src/git-1.8.1.1
	$ make uninstall

上記でアンインストールできるはず。
ただ、シンボリックリンクなどは消えないと思うので注意。

本当はパッケージ管理システム上でぬくぬくしていたいです。
NSNotificationの使い方


ある値が変更されたタイミングで、動かしたい処理がある場合に有効（キー値監視）

```objective-c:Notification.m
// NSNotificationCenterを作る
- (void)viewDidLoad {
	// 通知を管理するNSNotificationCenterを生成
	NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
	// centerに「identifier」という名前の通知が来たときに、「getPost:」を実行することを設定
	[center addObserver:self selector:@selector(getPost:) name:@"identifier" object:nil];
}

// 通知を送る
- (IBAction)sendNotification {
	// NSNotificationを作成する
    NSNotification* notification = [NSNotification notificationWithName:@"identifier" object:@"ここにgetPostで使いたいオブジェクトを指定できる"];
    // NSNotificationCenterを取得する
    NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
    // 通知を行う
    [center postNotification:notification];
}

// 通知を受け取って実行されるメソッド
- (void)getPost:(NSNotification*)notification {
	// 通知のときに渡したオブジェクトを使うことができる
    NSLog(@"%@", notification.object);
}
```

``` 出力
ここにgetPostで使いたいオブジェクトを指定できる
```


NSNotificationは、NSObjectクラスで実装されているので、どこでも使える。
Jenkins先生のログを色付けして見やすくする


Jenkins先生のビルドで色々やるようになると、ついついログの量が多くなってしまって、失敗した時の原因を調べるためにログを追うのが大変になってきがちです。

そんな時は下の画像のように、Jenkins先生のログ出力に色付けをして、Warningを黄色くしたり、失敗した箇所を赤くしたりするとログ全体を追いやすくなります。

![](http://gyazo.com/32f8e1aa219d34cb033206491446b539.png?1358255375)


## AnsiColorプラグイン

Jenkinsで色付けを実現するのはAnsiColorプラグインを使えば簡単です。
https://wiki.jenkins-ci.org/display/JENKINS/AnsiColor+Plugin

このプラグインは、ログ中のANSIエスケープシーケンスを解釈して、色付けをしてくれます。

プラグインをインストールすると、Jenkinsのジョブの設定画面で"Color ANSI Console Output"という設定項目が加わるので、そこにチェックを入れるだけで有効になります。

## Mavenの場合

僕はMavenでビルドしているので、Mavenの出力を色付けしたかったのですが、出力にANSIエスケープを入れるうまいやり方がわからなかったので、今はsedで置換しています。
こちらを参考にしました。
https://github.com/builddoctor/maven-antsy-color/blob/master/mvn

## 注意点

このプラグインを有効化すると、Jenkins上に保存されるログのファイルサイズがかなり大きくなります(手元の環境だと8倍ほど)。
そのため、ログ出力の量が多く、Jenkinsのディスク容量に余裕がない方はやめておいた方が良いかもしれません。
【論理演算子】｜｜のデフォルト値を与えるイディオム

論理演算子の性質を利用した変数にデフォルト値を与える、よくある書き方。

```
name = "Ruby"
if var != nil
 name = var
end
```

が、１行で書くことができる。

```
name = var || "Ruby"
```

# 例 OmniAuthにて
```
user = User.find_by_provider_and_uid(auth["provider"], auth["uid"])
user ||= User.create_with_omniauth(auth)
```
【Git】リモートリポジトリのタグを削除する

## Git のリモートリポジトリにpushしちゃったタグを取り消したい場合

```bash
 git tag tag_name
 git push origin tag_name

# あ、リモートにpushしちゃったけどタグ名ミスった・・・とか。

```

まずはローカルリポジトリで消したいタグを削除して、それをpushする

```bash
 git tag -d tag_name
 git push origin :refs/tags/tag_name
```

これでリモートリポジトリから該当のタグが削除された。
後はタグを切り直してpushし直せばいい。

```bash
$ git tag tag_name
$ git push origin tag_name
```
JavaScriptのクラス書き方(テンプレート )

よく忘れるのでメモ。

```js:example.js

(function(){

  var Animal;
  Animal = (function(){

    // private method
    var getDistance = function(speed){
      return speed * 60;
    };

    //class変数
    Animal.JapaneseName = "動物";

    //class method
    Animal.called = function(a){
      console.log(a + " called.");
    };

    //constructor
    function Animal(name){
      //private
      this.name = name;
      this.data = {
        weight:1
      }
    }

    //setter
    Animal.prototype.setName = function(name){
      this.name = name;
    };

    //getter
    Animal.prototype.getName = function(){
      return this.name;
    };

    //public method
    Animal.prototype.move = function(speed){
      console.log(this.name + " moved " + getDistance(speed) + " m/h.");
    };

    /* この書き方でも可
     Animal.prototype = {
       getRow: function(){
       },
       setRow: function(r){
       }
     };
     */
    return Animal;
  })();

  //呼び出し
  console.log(Animal.JapaneseName);
  Animal.called("bird");

  var a = new Animal("dog");
  console.log(a.getName());
  a.setName("wolf");
  console.log(a.getName());
  var a2 = new Animal("cat");
  
  console.log(a.data.weight);
 
  a.data.weight = 10;
  console.log(a.data.weight);
 
  a2.data.weight = 5;
  console.log(a2.data.weight);
  
  a.move(30); // 600 m/h
  a2.move(10); // 1800 m/h
  
})();


```
yumでインストールしたrpmを消さずに残す設定

/etc/yum.conf に

```
keepcache=1
```

と書いておきます ( man yum.confによるとデフォルトは1ですが、CentOS 6.3の/etc/yum.confにはkeepalive=0と書いてあるので、残したい場合は1に変更する必要があります)。

キャッシュされたrpmの一覧は以下のコマンドで見られます。

```
find /var/cache/yum -name '*.rpm'
```


なお、```yum clean all```とか```yum clean packages```を実行すると消えますので注意。

参考: [yum.conf(5): config file for yum - Linux man page](http://linux.die.net/man/5/yum.conf)
[ruby] hello! Tumblrする


tumblrへらくがき画像を投稿するドロップレットみたいなのが欲しくて拾ってこようと思ったら意外となかったのでとりあえずコマンドラインで動くようにしてみた。
言語はなんでもよかったんですが、Rubyだとすごい便利なパッケージがあったのでRubyにしました。ただGitHubに上がってるってことは、ご本人の手での開発は停止なのかな？

##Appを作ってOAuth tokenをもらう

もらうといっても、お金やメールのやりとりなんかはないです。ありがたいことにトークンをもらうサービスが公開されているので、サーバーすらいりません

1. アプリケーションを作ります。http://www.tumblr.com/oauth/apps にアクセスし、必要事項を記入。

	| こうもく|にゅうりょく|
|---|---|
| Application name|適当に。あとで変えられます|
| Default callback URL|http://gettumblraccesstoken.heroku.com/callback|

1. OAuth Consumer Key と Secret Key をメモる
1.  http://gettumblraccesstoken.heroku.com/callback にアクセスし、先ほどの OAuth Consumer Key と Secret Key を入力してSubmit。

まとめ:

- OAuth Consumer Key を てにいれた！
- Secret Key を てにいれた！
- Access Token を てにいれた！
- Access Token Secret を てにいれた！


## rubyでテスト投稿スクリプトを作る

tumblifeというrubyのパッケージを使います。

https://github.com/mitukiii/tumblife-for-ruby

こちらに書いてある通りなんですが、まあ使うためにはまずインストール。ターミナルで

```gem install tumblife```

して、
その下のサンプルプログラムをコピペしてデスクトップにtest.rb
とでも保存します。

```ruby
require 'tumblife'

Tumblife.configure do |config|
  config.consumer_key = YOUR_CONSUMER_KEY
  config.consumer_secret = YOUR_CONSUMER_SECRET
  config.oauth_token = YOUR_OAUTH_TOKEN
  config.oauth_token_secret = YOUR_OAUTH_TOKEN_SECRET
end

client = Tumblife.client

avatar = client.avatar('mitukiii.tumblr.com')
avatar.avatar_url # => http://24.media.tumblr.com/avatar_87fdfd3ea0e3_64.png

info = client.blog_info('mitukiii.tumblr.com')
info.blog.name # => mitukiii
info.blog.url # => http://mitukiii.tumblr.com/

dashboard = client.dashboard
dashboard.posts.each do |post|
  # ... do something
end

client.text('mitukiii.tumblr.com', :body => 'Hello, Tumblr!')
client.photo('mitukiii.tumblr.com', :data => Faraday::UploadIO.new('/path/to/image.png', 'image/png'))
```

1. トークンの入力
	- YOUR_CONSUMER_KEY
	- YOUR_CONSUMER_SECRET
	- YOUR_OAUTH_TOKEN
	- YOUR_OAUTH_TOKEN_SECRET
	を、修正。ダブルクォーテーション忘れずに。

1. URLの修正
	mitukiii を、ご自分のtumblrのアカウントに修正します。ドメイン指定してる時はわかんない。コメントの人が教えてくれるでしょう。
1. まだ画像ないのでとりあえず25行目のclient.photo('〜はコメントアウト。

とりあえずコレでterminalで、ruby test.rbすると、Hello, Tumblr!が投稿されました。

##次の目標
任意のタグ付けをしたいっす。2月だなー。
プロセスをプロセス名でkillする方法

プロセスをkillする際、今まではプロセス番号を打ち込んでkillしていました。

```bash
ps aux | grep netbeans
sudo kill -9 111
```

しかし、pkillコマンドを使うと名前からプロセスをkillすることができます。

> -fはフルコマンドラインでマッチさせるオプションです。

```bash
pkill -KILL -f netbeans
```

```bash
OPTIONS
       -c     Suppress normal output; instead print a count of matching processes.

       -d delimiter
              Sets the string used to delimit each process ID in the output (by default a newline).  (pgrep only.)

       -f     The pattern is normally only matched against the process name.  When -f is set, the full command line is used.

       -g pgrp,...
              Only match processes in the process group IDs listed.  Process group 0 is translated into pgrep's or pkill's own process group.

       -G gid,...
              Only match processes whose real group ID is listed.  Either the numerical or symbolical value may be used.

       -l     List the process name as well as the process ID. (pgrep only.)

       -n     Select only the newest (most recently started) of the matching processes.

       -o     Select only the oldest (least recently started) of the matching processes.

       -P ppid,...
              Only match processes whose parent process ID is listed.

       -s sid,...
              Only match processes whose process session ID is listed.  Session ID 0 is translated into pgrep's or pkill's own session ID.

       -t term,...
              Only match processes whose controlling terminal is listed.  The terminal name should be specified without the "/dev/" prefix.

       -u euid,...
              Only match processes whose effective user ID is listed.  Either the numerical or symbolical value may be used.

       -U uid,...
              Only match processes whose real user ID is listed.  Either the numerical or symbolical value may be used.

       -v     Negates the matching.

       -x     Only match processes whose name (or command line if -f is specified) exactly match the pattern.

       -signal
              Defines the signal to send to each matched process.  Either the numeric or the symbolic signal name can be used.  (pkill only.)

```
Ordered List の数字の並びを揃えたい


ol要素の二桁以降がズレてしまうので、それを揃える方法。scss表記で。

    ol 
    {
        list-style: none;
        counter-reset: num;    
        
        > li:before 
        {
            content: counter(num) ". ";
            counter-increment: num;
            display: inline-block;
            width: 2em;
        }
    }
リストをシャッフルする

たまーに使う、リスト要素をランダムに並べ替える方法を、いくつかの言語について調べてみた。

#####Perl
```perl
use List::Util qw/shuffle/;

say shuffle 0..9;
```
[List::Util](http://search.cpan.org/~pevans/Scalar-List-Utils-1.27/lib/List/Util.pm#shuffle)にshuffleがある

#####Python
```py
import random

list = range(10)
random.shuffle(list)
print list
```

#####Ruby
```ruby
list = (0..9).to_a
puts list.shuffle
```

#####JavaScript
```js
var list = [0,1,2,3,4,5,6,7,8,9];
console.log(_.shuffle(list));
```
要[underscore.js](http://underscorejs.org/#shuffle)

自前でやりたい時は、[Fisher-Yates法](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)というのを使うのがよいようだ
Rでプロット点に画像を使う

例として、R本体に含まれているロゴをjpegパッケージを使って読み込み、`rasterImage()`関数で表示させてみます。

``` s:code
library(jpeg)
jpegPath <- paste(R.home(),"/doc/html/logo.jpg",sep="")
image <- readJPEG(jpegPath)

plot(cars)
```

![cars](https://dl.dropbox.com/u/80771782/Qiita/Rplot.png)

```
rasterImage(image, 
            cars$speed-0.5, cars$dist-2.5, cars$speed+0.5, cars$dist+2.5)
```

![cars2](https://dl.dropbox.com/u/80771782/Qiita/Rplot01.png)

このロゴ大好きなんですけどさすがにこんな並んでると精神が不安定になりますね。

- - -

gridパッケージを使う場合はこのあたりをどうぞ。
http://stackoverflow.com/questions/14102655/users-own-pch-clip-in-r
VirtualBoxでNAT + Host-Only Network環境を構築する


Debian系のディストリビューションで綺麗にはまってしまったのでメモ。
Redhat系が予期に計らってくれるおかげで3週間ほどずっとはまっていました…。
<font color="E0E0E0">OSを５回くらいインストールし直しました。</font>

## 0.前提
- [VirtualBox](https://www.virtualbox.org/) + UNIX系OSでローカル環境にサーバを構築したい。
- 無駄なマシンパワーを使いたくないので、GUIはインストールしない。
- 外部ネットワークに接続したい(インターネットを使いたい)。
- ポートフォワーディングは使わない。

## 1.ネットワーク構成
+ ゲストはホストのNICを利用してNATで外部ネットワークに接続する。
+ ホストオンリーネットワークでゲストにSSHで接続する。
+ ホストオンリーネットワーク側のゲストのIPアドレスは固定する。

![ネットワーク構成](http://i.imgur.com/RgTte.jpg?1)

## 2.OSインストール
インストール手順自体は[VirtualBox 4.0でCentOS 6.0を動かしてみたよ。 - 大人になったら肺呼吸](http://d.hatena.ne.jp/replication/20110716/1310800353)などで画像つきで紹介されているので割愛します。

注意する点として、ネットワークインターフェースはインストール前に指定しておくことです。
インストール時点でOSが自動設定してくれるので予め指定しておくほうが楽です。

## 3.ネットワーク設定
ハマったポイントがここです。注意事項は１つだけです。

<font size="+3" color="red">**ホストオンリーネットワーク側のゲートウェイは指定しない。**</font>

### Redhat系

```/etc/sysconfig/network-scripts/ifcfg-eth0
EVICE="eth0"
BOOTPROTO="static"
HWADDR="08:0F:46:5A:CD:37"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="0f25669f-6928-4c31-8343-98ba7752f1f6"
IPADDR="192.168.56.10"
NETMASK="255.255.255.0"
```

```/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="dhcp"
HWADDR="08:1A:34:99:12:34"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="f68320a2-2454-4dd7-2356-52256804eb58"
```

### Debian系
```/etc/network/interfaces
auto lo
iface lo inet loopback
 
auto eth0
iface eth0 inet static
address 192.168.56.10
netmask 255.255.255.0

auto eth1
iface eth1 inet dhcp
```

## 4.原因
ゲートウェイを指定した状態で両方のインターフェースを起動すると、`route`コマンドの実行結果におそらく以下の２行が現れます。
デフォルトゲートウェイが２つ指定されている状態になるため、外部ネットワークに接続できなくなってしまいます。

```route
default         10.0.2.2       0.0.0.0         UG    0      0        0 eth0
default         192.168.56.1   0.0.0.0         UG    0      0        0 eth1
```


## 5.補足
現状で確認している限り、

- CentOSはゲートウェイを指定しても問題ありません。
- Debian/Ubuntuはゲートウェイを指定するとつながらない場合が多いです。が、たまに繋がってしまうので厄介です。

ですが、ゲートウェイを指定しないのが無難です。

## 参考
- [VirtualBox を利用する際のネットワーク設定の話 - ゆどうふろぐ](http://d.hatena.ne.jp/Yudoufu/20100117/1263677767)
オフラインリアルタイムどう書く。ruby による実装その2


問題は http://nabetani.sakura.ne.jp/hena/ord6kinship/
「aunt は母の姉妹」ということを（実行効率を無視して）ソースにそのまま書こうという試み。

```ruby
#!ruby
#coding:utf-8

class Proc
    def * ( x )
        ->n{ self.(n).map{ |i| x.(i) }.flatten }
    end
end

def mothers;  -> n { [(n+1)/3] }; end
def daughters; -> n { ((n*3-1)..(n*3+1)).to_a }; end
def sisters; -> n { (mothers * daughters).(n) - [n] }; end

def kinship(s,d)
    [
        [ -> n {[n]}, 'me' ],
        [ mothers, 'mo' ],
        [ daughters, 'da'],
        [ sisters, 'si' ],
        [ mothers*sisters, 'au' ],
        [ sisters*daughters, 'ni' ],
        [ mothers*sisters*daughters, 'co' ]
    ].find do | proc, sym |
        return sym if proc.(s).include?( d )
    end || '-'
end

def solve i
    kinship( *i.split( /\D+/ ).map( &:to_i ) )
end

DATA.each do |line|
    num, i, ex = line.split /\s+/
    ac = solve( i )
    raise "#{line} -> #{ac}" unless ac == ex
end

__END__
0   5->2    mo
1   28->10  au
2   1->1    me
34  13->14  -
```

演算子 * を使ってみたけど順序が逆のほうが自然なような気もする。
日本語の語順に合わせたのでこうなったんだけど。
オリジナルの「loadingView」をサクッとつくるために「SVProgressHUD」をforkしてみた。


##標準のUIActivityIndicatorで満足できない方に
まずは超有名なこちらの[SVProgressHUD](https://github.com/samvermette/SVProgressHUD)をお試しすることをおすすめします。
これだけで、大概の方は用が足せてしまうのではないのでしょうか。

**しかしながら**、仕事上、または己のアプリのデザインポリシー上、特殊なローディングビューを使うことを余儀なくされている方は一度、次のリポジトリを試してみてはいかがでしょう。

[somtd / SVProgressHUD](https://github.com/somtd/SVProgressHUD)

![toggleView_design1](http://f.cl.ly/items/0t1l1c0H432E0Z1V0T2Z/svhud_01.png)

こちらは前述したSVProgressHUDを一部改変したものです。このライブラリを使うことで下記のことが実現できます。

- **ローディング中の背景画像とグルグル画像をお好きな画像に変えることができます。**
- **ローディングのビューをお好きなアニメーションに変えることができます。**

##ローディング中画像の背景とグルグルを変えたい方
せっかくSVProgressHUDが用意してくれているシックなグレーの背景とUIActivityIndicatorが気に入らないという稀有な方に。

元のSVProgressHUDを使うように記述できます。
maskType:の引数としてSVProgressHUDMaskTypeCustomを指定してください。

```ViewController.m
[SVProgressHUD showWithStatus:@"TEST" maskType:SVProgressHUDMaskTypeCustom];
```

テキストを表示しない場合、

```ViewController.m
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeCustom];
```

ぐるぐるを止める時、

```ViewController.m
[SVProgressHUD dismiss];
```

### ※オリジナルの背景画像、グルグル画像への差し替え

**SVProgressHUD.m**で独自の背景、独自のグルグル画像を指定する必要があります。
ローディング画像のサイズはnon-retinaで36px-36px、retinaで72px-72pxぐらいになることを想定して作られています。（大きいサイズでも表示可能だと思いますが、バランスを確認していません。）

```SVProgressHUD.m
NSString *const CUSTOM_HUD_BACKGROUND = @"custom_hud_bg.png";
NSString *const CUSTOM_SPINNER_IMAGE  = @"spinner.png";
```

##ローディングビューを好きなアニメーションに変えたい方
せっかくSVProgressHUDがシンプルな読み込み中の画面を用意してくれているというのに、それが気に入らないだけでなく、さらに自分でアニメーションまで用意して使いたいという稀有な方に。

※背景は先程のカスタム背景画像と同じになることをご了承ください。
maskType:の引数としてSVProgressHUDMaskTypeAnimationを指定してください。

```ViewController.m
[SVProgressHUD showWithStatus:@"TEST" maskType:SVProgressHUDMaskTypeAnimation];
```

テキストを表示しない場合、

```ViewController.m
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeAnimation];
```

ぐるぐるを止める時、

```ViewController.m
[SVProgressHUD dismiss];
```


### ※オリジナルのアニメーション画像への差し替え

![toggleView_design1](http://f.cl.ly/items/3S200x3h3P0m3n333r2O/animation01.png)

コマ画像のサンプルは、リポジトリの/Demo/Resources以下に保管されています。
デフォルトは``spinner0@2x.png``,``spinner1@2x.png``・・・のように連番で書き出しています。
独自の画像に置き換える場合、下記のように**SVProgressHUD.m**でアニメーションのコマ画像、コマ数を指定する必要があります。

```SVProgressHUD.m
//animation hud image setting
NSString *const ANIMATION_SPINNER_IMAGE  = @"spinner%d.png";//ファイル名の不変部分
const int ANIMATION_COUNT = 8;//コマ数
```

## まとめ
[以前の記事](http://qiita.com/items/9a8d6a31f3b2a7c8fab4)でUI周りのカスタマイズは結構需要がありそうな感じだったので、書きっぱなしにしてたものをまとめてみました。
使う中で不便に感じるところはまた書きなおしていこうと思います。
ローディングの画面に個性があると、アプリのオリジナリティが増すのではないでしょうか。

[somtd / SVProgressHUD](https://github.com/somtd/SVProgressHUD)
>> と >>> の違い


`>>` は符号（先頭ビット）を保存し、`>>>` は保存せず 0 で埋めてしまうそうです。

負の値を負のまま使いたい場合は `>>` なんですかね。

一方で、バイナリデータを扱うときは `>>>` の方が安全そうです。

```js
console.log(-9 >> 2);
// -3
console.log(-9 >>> 2);
// 1073741821
```

参考
[Bitwise Operators - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators)
Evernote APIのいろいろ

**Railsを利用**
<参考URL>
Evernote API Reference
http://dev.evernote.com/documentation/reference/NoteStore.html#Fn_NoteStore_findNotes


## tokenの取得方法

```ruby:Gemfile
gem "omniauth-evernote"
gem "evernote_oauth"
```

```session_controller.rb
token = params[:oauth_token]

auth = request.env["omniauth.auth"]
provider = auth["info"]["provider"]
name = auth["info"]["nickname"]
uid = auth["uid"]
```
（注）sandbox modeでは、下記で取得したtokenを利用する
https://sandbox.evernote.com/api/DeveloperToken.action

## notebook listの取得方法

```ruby
client = EvernoteOAuth::Client.new(token: session[:token])
@note_stores = client.note_store.listNotebooks
```

## note listの取得方法

```ruby
filter = Evernote::EDAM::NoteStore::NoteFilter.new
filter.notebookGuid = @note_stores.first.guid  #先頭のnotebookのguidを指定
@note = client.note_store.findNotes(session[:token], filter, 0, 100)  #offset -> 0 , max_size -> 100
```

## note listの表示方法

```notes.html.erb
<% @note.notes.each do |n| %>
  <%= n.title %>
<% end %>
```



## Evernote guidのフォーマット

`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`
[エラー] rubyで"Segmentation fault in relation.rb:241"がでる

ruby1.9.3-p362で起こるエラー。

railsを実行していると突然セグメンテーション・フォールトを起こしabortする、厄介な現象。

実はrubyのバグらしく、解決法は ruby1.9.3-p327へのダウングレード。

参考: https://github.com/gitlabhq/gitlabhq/issues/2436
第6回オフラインリアルタイムどう書く。groovy による実装。


イベントは http://atnd.org/events/34368 ( 終了してます )
問題は http://nabetani.sakura.ne.jp/hena/ord6kinship/
で。
groovy による実装。
(自分+1)/3 で母親になることに気づかない場合でも計算できるよ、ということを示すためにツリー情報をソースコードに埋め込んだものも当日書いた。
ruby, C と書いたので groovy で。

```groovy

def parent( i )
{
    [
        [1,null],
        [4,1],
        [7,2], [10,3], [13,4],
        [16,5], [19,6], [22,7], [25,8], [28,9], [31,20], [34,11], [37,12], [40,13]
    ].find{ 
        i<=it[0]
    }[1]
}

def solve( i )
{
    def a=i.split( /\D+/ ).collect{ it.toInteger() }
    if ( a[0]==a[1] ) {
        return "me";
    }
    def p0=parent( a[0] )
    def p1= parent( a[1] )
    if ( p0 == a[1] ){
        return "mo";
    } else if ( a[0] == p1 ){
        return "da";
    } else if ( p0==p1 ){
        return "si";
    }
    def gp0=parent( p0 )
    def gp1= parent( p1 )
    if ( gp0 == p1 ){
        return "au"
    } else if ( p0 == gp1 ){
        return "ni"
    } else if ( gp0 == gp1 ){
        return "co"
    }

    return "-";
}

def test( i, ex ){
    String actual = solve( i );
    if ( actual != ex ){
        println( [ i, ex, actual ].join( " / ") );
    }
}

/*#0*/ test( "5->2", "mo" );
/*#1*/ test( "28->10", "au" );
/*#2*/ test( "1->1", "me" );
```

たまにしか groovy を書かないので、toInteger とか collect に慣れない。今回は null と書くべき所で nil と書いて怒られた。とほほ。

それとは関係なく、groovy girls( https://twitter.com/Nabetani/status/290387786249404416/photo/1 )。
第6回オフラインリアルタイムどう書く。C言語による実装。

イベントは http://atnd.org/events/34368 ( 終了してます )
問題は http://nabetani.sakura.ne.jp/hena/ord6kinship/
で。
C言語 による実装。

当日その場で書いた。
配列の引き算がなければ素直に if 文をたくさん書くのが普通かなということで。

```c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int parent( int s )
{
    return (s+1)/3;
}

char const * solve( char const * input )
{
    int from = atoi( input );
    int to = atoi( strchr( input, '>')+1 );
    if ( from == to ){
        return "me";
    } else if ( parent( from ) == to ){
        return "mo";
    } else if ( from == parent(to) ){
        return "da";
    } else if ( parent( parent( from ) )== parent(to) ){
        return "au";
    } else if ( parent(from) == parent(to) ){
        return "si";
    } else if ( parent(from) == parent(parent(to)) ){
        return "ni";
    } else if ( parent(parent(from)) == parent(parent(to)) ){
        return "co";
    }
    return "-";
}

void test( char const * input, char const * expected )
{
    char const * actual = solve( input );
    if ( 0 != strcmp( actual, expected ) ){
        printf( "%s / %s / %s\n", input, expected, actual );
    }
}

int main()
{
/*#0*/ test( "5->2", "mo" );
/*#1*/ test( "28->10", "au" );
/*#2*/ test( "1->1", "me" );
return 0;
}
```

ruby のとき( http://qiita.com/items/9e305b6c7fce0204c1cf )は mother だったけどここではなんで parent なのか、自分でも不思議。
第6回オフラインリアルタイムどう書く。ruby による実装。

オフラインでリアルタイムに「どう書く」をやるイベント(http://atnd.org/events/34368 )を行いました。
問題は http://nabetani.sakura.ne.jp/hena/ord6kinship/
当日を迎える前に最初に書いた ruby による実装。

```ruby
#!ruby
#coding:utf-8

def mother(n)
    (n-2)/3+1
end

def mseq(n)
    if n<=1
        [1]
    else
        [n]+mseq(mother(n))
    end
end

def kinship(s,d)
    ss=mseq(s)
    sd=mseq(d)
    {
        0=>"me",
        10=>"mo",
        1=>"da",
        11=>"si",
        21=>"au",
        12=>"ni",
        22=>"co",
    }[(ss-sd).size*10+(sd-ss).size] || "-"
end

def solve i
    kinship( *i.split( /\D+/ ).map( &:to_i ) )
end

DATA.each do |line|
    num, i, ex = line.split /\s+/
    ac = solve( i )
    raise "#{line} -> #{ac}" unless ac == ex
end

__END__
0   5->2    mo
1   28->10  au
2   1->1    me
```

例によって、テストデータの大半は省略。

if 文をたくさん書くのを避けようと思い、配列の引き算→size という計算で一意な ID を作ることにした。
Buffer の assertion には deep equal


Node の Buffer は chai の `deep.equal()` でテストできます。

```test/buffer_test.js
require('chai').should();

var a = new Buffer('Hello, World!');
var b = new Buffer('Hello, World!');

describe('Buffer', function () {
  it('is not equal to another buffer', function () {
    a.should.not.equal(b);
  });

  it('is deeply equal to another buffer', function () {
    a.should.deep.equal(b);
  });
});
```

```result
$ ./node_modules/.bin/mocha -R spec test/buffer_test.js 


  Buffer
    ✓ is not equal to another buffer 
    ✓ is deeply equal to another buffer 


  2 tests complete (7 ms)

```
長くなりがちなRailsのモデルをきれいに分割する

FrogApps 技術ブログ始めました！
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

---

Railsでアプリを作っていると、app/models/以下にあるモデルファイルの行数が非常に長くなることになります。

そこでincludeメソッドを使ってモデルファイルを機能毎に分割してみましょう。

ファインダー関係のメソッドだけを、user/finder.rbに切り出します。
このときクラスメソッド関係は通常の定義方法が異なります。

クラスメソッドの定義は、ClassMethodsモジュールの中で行う様にします。

has_many, belongs_toなどのクラスメソッドの実行は、self.includedの中でbase.has_manyの様にして呼び出します。

```ruby:app/models/user.rb
class User < ActiveRecord::Base
   include User::Finder
end
```

```ruby:app/models/user/finder.rb
module User::Finder
  def self.included(base)
    base.extend ClassMethods
    
    # クラスメソッドの呼び出し
    base.has_many :items
  end

  # クラスメソッドの定義
  module ClassMethods
    def hot
      ...
    end
  end

  # インスタンスメソッドの定義
  def search(str)
    ...
  end
end
```

このようにしてファイルを分けることで、モデルファイルが大きくなるのを避けられ機能毎に整理することができます。
BubbleWrapとNSUserDefaultsでお手軽設定管理。


[BubbleWrap](https://github.com/rubymotion/BubbleWrap)には様々な機能がありますが、その中に``NSUserDefaults``を扱う機能があります。

```ruby
App::Persistence['hoge'] = true
p App::Persistence[name] # => true
```

こんな感じで型を考慮せず使えて楽ができますが、一工夫を加えて更に楽をします。

```ruby
class Settings

  class << self
    def instance
      Dispatch.once { @instance ||= Settings.new }
      @instance
    end
  end

  # 各種設定の名前
  Properties = %w(hoge fuga)

  # getter、setterを動的に生成
  Properties.each do |name|
    define_method("#{name}=") do |v|
      App::Persistence[name] = v
    end
    define_method("#{name}") do
      App::Persistence[name]
    end
  end
end
```

```ruby
settings = Settings.instance
settings.hoge = 1
settings.fuga = true

p settings.hoge # => 1
p settings.fuga # => true
```

``App::Persistence``をそのまま使うと設定内容と紐づく文字列が複数箇所に散らばってしまいますが、こうすることで1箇所にまとめられスッキリします。
javascriptでEventDispatcherを使うときのメモ

## なぜEventDispatcherが必要なのか

例えば以下のような関数を定義した場合。

```javascript:sample.js
var global = {}

(function() {
    function class1() {
        function method1() {
        }

        return {
            method1: method1
        }
    }

    global.class1 = class1;
})();

(function() {
    function class2() {
        // class2で発火するなにかしらのEventに対してclass1のmethod1を実行したい
    }

    global.class2 = class2;
})();

(function() {
    function class3() {
        var instance1 = new global.class1,
            instance2 = new global.class2; 
    }
})();
```
class2の中でclass1のmethod1を実行したい場合。
普通に考えるとclass2はclass1のインスタンスにアクセスできなければいけないが、class1のインスタンスはclass3しか持っていない。

## EventDispatcherを使わない場合

EventDispatcherを使わずに実現させようとするとおそらく下記の様になると思う。(他にも方法はいくらでもあると思うけど)

```javascript:not_event_dispatcher.js
var global = {}

(function() {
    function class1() {
        function method1() {
        }

        return {
            method1: method1
        }
    }

    global.class1 = class1;
})();

(function() {
    function class2(instance1) {
        // class2で発火するなにかしらのEventに対してclass1のmethod1を実行したい
        function clickEvent() {
            instance1.method1();
        }
    }

    global.class2 = class2;
})();

(function() {
    function class3() {
        var instance1 = new global.class1,
            instance2 = new global.class2(instance1);  // instance1を引数で渡す
    }
})()
```
こうすることで確かに実行は可能だが、class3で定義したinstance1を他のクラスでも使いまわすと、依存関係が強くなってしまいあまり好ましくない。

## EventDispatcherを使うと

EventDispatcherを使うことでこの依存関係を取り除くことができる。
次の例は、class1, class2, class3はすべてEventDispathcerを継承し、そのインターフェースを持っているものとする。

```javascript:use_event_dispatcher.js
var global = {}

(function() {
    function class1() {
        function method1() {
        }

        return {
            method1: method1
        }
    }

    global.class1 = class1;
})();

(function() {
    class2.prototype.EVENT1 = 'EVENT1';

    function class2(instance1) {
        var self = this;

        // class2で発火するなにかしらのEventに対してclass1のmethod1を実行したい
        function clickEvent() {
            // この時点で、class1のインスタンスを知っている必要はなく
            // あくまでもEVENT1が発火されたことだけをEventDispathcerに伝える。
            self.dispatchEvent(self.EVENT1);
        }
    }

    global.class2 = class2;
})();

(function() {
    function class3() {
        var instance1 = new global.class1,
            instance2 = new global.class2;

        // instance2のEVENT1というイベントに対して関数を追加する
        instance2.addEventListener(instance2.EVENT1, function() {
            instance1.method1();
        });
    }
})()
```

上記の様にすれば、class2はclass1のインスタンスを知る必要はなく、依存関係を取り除くことができる。