OmniAICreator/Qiita-1.07M huggingface dataset:
【Mac】zshでwhichコマンドの代替

Ruby on Rails チュートリアルをMacで行っている。

[1.2.2 Ruby、RubyGems、Rails、Git ~RubyGemsのインストール~](http://railstutorial.jp/chapters/beginning?version=4.0#sec-install_rubygems) 
を行っている途中、

```bash
$ which gem
/Users/UserName/.rvm/rubies/ruby-2.0.0-p0/bin/gem
```

となるはずが、

```bash
$ which gem
gem () {
	typeset result
	(
		typeset rvmrc
		rvm_rvmrc_files=("/etc/rvmrc" "$HOME/.rvmrc")
		if [[ -n "${rvm_prefix:-}" ]] && ! [[ "$HOME/.rvmrc" -ef "${rvm_prefix}/.rvmrc" ]]
		then
			rvm_rvmrc_files+=("${rvm_prefix}/.rvmrc")
		fi
		for rvmrc in "${rvm_rvmrc_files[@]}"
		do
			[[ -s "${rvmrc}" ]] && source "${rvmrc}" || true
		done
		unset rvm_rvmrc_files
		command gem "$@"
	) || result=$?
	hash -r
	return ${result:-0}
}
```

と表示された。
調べたら、以下のコマンドで確認できた。

```bash
$ type -p gem
gem is /Users/UserName/.rvm/rubies/ruby-2.0.0-p451/bin/gem
```

## 結論
zshの`which`コマンドは、bashの`which`コマンドと挙動が異なるようだった。

## 参考
* ['which gem' and 'which rvm' print bash scripts instead of location](
http://stackoverflow.com/questions/15305616/which-gem-and-which-rvm-print-bash-scripts-instead-of-location)

* [How to use `which` on an aliased command?](
http://unix.stackexchange.com/questions/10525/how-to-use-which-on-an-aliased-command)
jQuery2.xとjqPlotで棒グラフを描く方法

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20140502/1398999898">jQuery2.xとjqPlotで棒グラフが簡単に描けるよ。 - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20140502/1398999898"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20140502/1398999898" alt="はてなブックマーク - jQuery2.xとjqPlotで棒グラフが簡単に描けるよ。 - 大人になったら肺呼吸" border="0" /></a>
Android2.3対策用の backgrond linear-gradient の Mixin

複雑なMixin作ったことなかったけど、とりあえず作ってみた。
もっと簡略化出来るはずだけど、なんか上手くコンパイル出来なかったりしたので、結果的にこうなった。

グラデーションの方向を `to` 付きのものにしたので、
2.3以降の Android 用の構文も用意した。

```scss:Mixin
@mixin background-gradient($direction, $colors...) {
	@if $support-android23 {
		$len: length($colors);
		$i: 1;
		$_colors: "";
		$_direction: "";
		@each $color in $colors {
			@if 1 == $i {
				$_colors: $_colors + from($color);
			}
			@else if $len == $i {
				$_colors: $_colors + ", " + to($color);
			}
			@else {
				$_pos: nth($color, 2) / 100 / 1%;
				$_val: color-stop(unquote($_pos + ", " + nth($color, 1)));
				$_colors: $_colors + ", " + $_val;
			}
			$i: $i + 1;
		}
		@if      $direction == "to bottom"           { $_direction: left top, left bottom; }
		@else if $direction == "to top"              { $_direction: left bottom, left top; }
		@else if $direction == "to left"             { $_direction: right top, left top; }
		@else if $direction == "to right"            { $_direction: left top, right top; }
		@else if $direction == "to bottom left"      { $_direction: right top, left bottom; }
		@else if $direction == "to bottom right"     { $_direction: left top, right bottom; }
		@else if $direction == "to top left"         { $_direction: right bottom, left top; }
		@else if $direction == "to top right"        { $_direction: left bottom, right top; }
		background-image: -webkit-gradient(linear, $_direction, unquote($_colors));
	}
	@if $support-android44 {
		$_direction: "";
		@if      $direction == "to bottom"           { $_direction: top; }
		@else if $direction == "to top"              { $_direction: bottom; }
		@else if $direction == "to left"             { $_direction: right; }
		@else if $direction == "to right"            { $_direction: left; }
		@else if $direction == "to bottom left"      { $_direction: top right; }
		@else if $direction == "to bottom right"     { $_direction: top left; }
		@else if $direction == "to top left"         { $_direction: bottom right; }
		@else if $direction == "to top right"        { $_direction: bottom left; }
		background-image: -webkit-linear-gradient($_direction, $colors);
	}
	background-image: linear-gradient(unquote($direction), $colors);
}
```

実行はこんな感じで。

```scss:sample
$support-android23: true;
$support-android44: true;
.sample {
	@include background-gradient("to bottom", #ccc, #f00 30%, #00f 70%, #333);
}
```
creating RGEX

Specifying 1 special character on RGEX

*A textbox must not accept [ or ] symbols
 (Of course it will accept other symbols)

It takes me a lot of time thinking how to create an RGEX expression with the condition above.
As a rails beginner I tried to research online for the sample expressions. I thought maybe I can imitate the pattern and create my own expression. But unfortunately, I only saw RGEX example expression for all group of alphabets, numbers and symbols only. So I decided to study the rules and create I needed expression with my own.

This is an example
/([A-Z])\w+/
The "[" and "]" is used as a character set specifier. Basically, if I will explain its function in easy way, the "[]" tells  "Please match the character set inside me"
But no, I wanted to create an expression line "Find and match a symbols like "[" and "]" "

I found the rules on creating RGEX for special characters.
Special characters . * + ? ^ $ { [ ( | ) \ have special meaning and must be escaped with \ to be used without the special meaning : \. \* \+ \? \^ \$ \{ \[ \( \| \) \\.

so I created

            /\ ] | \ [/g

            | is the OR expression and g for global search
and it worked fine
I used a helpful site to test my RGEX and it works!
![RegEx.png](https://qiita-image-store.s3.amazonaws.com/0/41038/1daff3a0-63b3-9cd6-3502-dbc96792a504.png)
MacOS MavericksにRails4 + Ruby2.0を構築する方法

今回、下記のリンクを参考にしました。

[Mountain Lion で Ruby 2.0 + Ruby on Rails 4 を導入する](http://t.nzk.me/entry/2013/05/16/144817)

### rbrev,ruby-buildをインストールする

rbrevは、インストールしたrubyを簡単に切り替えたり出来るバージョン管理用のツールです。

ruby-buildは、その名の通りrubyのビルドに必要になります。

<pre>
$ brew install rbenv

$ brew install ruby-build
</pre>

### openssl, readlineをインストールする

<pre>
$ brew install openssl

$ brew install readline
</pre>

brewでopenssl を入れた時に、証明書エラーが発生するようなので、curl-ca-bundle を入れます。

<pre>
$ brew install curl-ca-bundle

$ brew list curl-ca-bundle

$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
</pre>

### rbenvを利用してRuby2.0.0-p0をインストールする

<pre>
$ RUBY_CONFIGURE_OPTS="–with-readline-dir=brew --prefix readline –with-openssl-dir=brew --prefix openssl" rbenv install 2.0.0-p0
</pre>

### Ruby2.0を有効にする
<pre>
$ rbrev global 2.0.0-p0

$ ruby -v
</pre>

2.0.0-p0と出たらちゃんとインストール出来てます。

### Rais4.0をインストールする
<pre>
gem install rails -v 4.0.0.beta1
</pre>

けっこう時間かかるので根気よく待ちます。

### railsプロジェクトを試しに作ってみる
<pre>
$ rails new rails-example
</pre>

### サーバーを立ち上げる
<pre>
$ rails server
</pre>
最低限覚えておきたいSublime Text2のショートカットまとめ

### 検索系

<pre>
cmd + shift + f ファイル全体を検索

cmd + f 開いているファイル内を検索

cmd + p ファイル名で全体を検索
</pre>

### 移動系

<pre>
ctrl + g 指定の行へ移動

cmd + r 指定のメソッドへ移動

cms + ←↑⇛↓ 端へ移動

cms + shift + p コマンド入力

alt + カーソル 単語単位の移動
</pre>

### コピー・削除

<pre>
cmd + c (行の操作) 選択しているものがあればそれをコピーする。
何も選択していない状態では行全体をコピーする。

control + shift + k 行の削除

cmd + shift + d 現在の行の複製
</pre>

### マルチカーソル

<pre>
control + shift + ↑↓ マルチカーソル

cmd + d 単語の選択(選択された状態でcmd + dを押すとマルチカーソル)

cmd + k, cmd + d マルチカーソルでスキップ

cmd + u マルチカーソルで前に戻る
</pre>

### よく使うもの

<pre>
cmd + p ファイル名で全体を検索

ctrl + g 指定の行へ移動

cmd + r 指定のメソッドへ移動

cmd + shift + ↑↓ マルチカーソル

cmd + d 単語の選択(選択された状態でcmd + dを押すと同じ単語を複数選択)
</pre>
Android エミュレータのデバイスキーとキーボードの対応


[Android Emulator | Android Developers](http://developer.android.com/tools/help/emulator.html) より抜粋

|エミュレータ上のデバイスキー|キーボード|
|-----------------------|--------|
|Home                   |`Home`    |
|Menu                   |`Page-up` |
|Back                   |`ESC`     |
|縦持ち/横持ちの切り替え    |`Ctrl` + `F11`|
[Rails 4.x] bundle install 時に起きたエラーの対処

Gemfileをイジイジして、bundle install叩いたら以下のエラーが出た。
状況としては、git pullしようとしたら、事前にmergeしてくださいと出て、
めんどくさいからGemfileとGemfile.lockをcheckoutしたという感じです。

```pl
vagrant-hoge hoge$ bundle install

Fetching source index from https://rubygems.org/
Unfortunately, a fatal error has occurred. Please see the Bundler
troubleshooting documentation at http://bit.ly/bundler-issues. Thanks!

/home/hoge/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/bundler-1.6.2/lib/bundler/source/git/git_proxy.rb:114:in ``': Cannot allocate memory - git (Errno::ENOMEM)
・
・
・
```

指示通り、http://bit.ly/bundler-issues にアクセスしたら解決法が書いてあった。

```pl
# remove user-specific gems and git repos
$ rm -rf ~/.bundle/ ~/.gem/bundler/ ~/.gems/cache/bundler/

# remove system-wide git repos and git checkouts
$ rm -rf $GEM_HOME/bundler/ $GEM_HOME/cache/bundler/

# remove project-specific settings
$ rm -rf .bundle/

# remove project-specific cached gems and repos
rm -rf vendor/cache/

# remove the saved resolve of the Gemfile
rm -rf Gemfile.lock

# uninstall the rubygems-bundler and open_gem gems
$ rvm gemset use global # if using rvm
$ gem uninstall rubygems-bundler open_gem

# try to install one more time
$ bundle install
```

とりあえずこの通りにやってみたらうまくいきました。


ネットをあさると他の解決策も載っていましたが、わたしの場合はこれで解決しました。
LinuxでLINEを使う方法

http://maguro.2ch.net/test/read.cgi/linux/1369804335/135
> 135 ：login:Penguin：2014/03/31(月) 14:20:03.35 ID:p+a8TxD3
wineでLINE最新版を利用する方法。 
wineは最新の1.7.14以降。 
msvcp9,msvcrt9をネイティブ版使用に変更。 
これで大体はうまくいっている。 

msvcp90,msvcr90を入れるのはwinetricksからvcrun2008を選択する。
javascript 画像ロード後に処理する方法（IE対応版）

## コード
```coffeescript:imagesLoaded.coffee
$.fn.imagesLoaded = () ->
  deferreds = $.map @, (el, i) ->
    d = new $.Deferred
    img = new Image()
    if "onreadystatechange" in el
      el.onreadystatechange = (e) -> d.resolve() if el.readyState is "loaded" || el.readyState is "complete"
    else
      img.onload  = -> d.resolve()
      img.onerror = -> d.resolve()
    img.src = el.src
    d
  $.when deferreds...
```

## 実行方法
```coffeescript:script.coffee
$('body img').imagesLoaded().done () ->
  console.log 'images loaded.'
```

### 参考
[画像や外部.jsファイルの読み込み完了のタイミングを知る - とくにあぶなくないRiSKのブログ](http://sscrisk.hatenablog.com/entry/20120826/1345986280)
[.map: Underscore.js versus jQuery](http://jsperf.com/map-underscore-vs-jquery/2)
MacOSでスクリーンをロック

`キーチェーンアクセス`-> 環境設定 を開く。

![スクリーンショット 2014-05-02 9.26.25.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3e85ec7f-dc8a-c159-f93b-6cb1df3e2eb4.png)

`メニューバーにキーチェーンの状況を表示`

![スクリーンショット 2014-05-02 9.28.21.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e6671a34-a2c5-3b7b-a11a-54b7d18fa674.png)

`スクリーンをロック`を選択。
XilinxがIBM POWER8とFPGAをつなげてKVS作った話


IBMのPOWER8が昨年8月に発表されたとき、ひときわ怪しかったのがCAPIなる機能。

![kobito.1398953260.546886.png](https://qiita-image-store.s3.amazonaws.com/0/38290/dc4b83a1-7153-3f95-dca7-3dc608acfbd8.png "kobito.1398953260.546886.png")
From https://twitter.com/Daniel_Bowers/status/372101503936253952

CAPIはCoherence Attache Processor Interfaceの略で、外部ハードウェア上のメモリとCPUキャッシュ間のコヒーレンス（整合性）をものっすごい高帯域で維持してくれるインタフェース。そして注目すべきは、その外部ハードウェアとして左下にちらっと「FPGA or ASIC」と書かれていること。つまりIBMは、POWER8を外部のFPGAやASICとつないで、それをほとんどCPUの一部分のような速度で使うための仕組みを用意した、というわけだ。

これを見て、うーむ、こいつはPOWER8とFPGAの組み合わせで何か面白いもの出してくるな！　とニラんでところ、案の定。つい先日開催されたIBM Impact 2014でXilinxとAlteraがPOWER8＋FPGAの事例を出してきたと[@ogawa_tterさんが教えてくれた](https://twitter.com/ogawa_tter/status/461860315269824512)。以下はXilinxのプレスリリース。


![kobito.1398954058.202357.png](https://qiita-image-store.s3.amazonaws.com/0/38290/0cc84f2b-d862-3c1d-cb86-4bf5ad071ca2.png "kobito.1398954058.202357.png")
From http://press.xilinx.com/2014-04-25-Xilinx-Demonstrates-FPGA-Based-Acceleration-Technology-for-Next-Generation-Data-Centers-at-IBM-Impact-2014

## POWER8＋FPGAでKey Value Storeを実装

このプレスリリースで注目すべきは次の部分：

```
The Xilinx demonstration is a broadly applicable CAPI-based key value store workload acceleration engine (i.e. Memcached and NoSQL) that delivers significant performance/watt acceleration at substantially lower latency and compliments the OpenCL™ design environment for Xilinx devices. 
```

つまり、Key Value StoreのアクセラレーションをFPGAで実装しているって点だ。Xilinxはこれまでにも[実効10Gbpsで動くMemcachedのFPGA実装](https://www.usenix.org/sites/default/files/conference/protected-files/blott_hotcloud13_slides.pdf)を発表したりと、FPGAのデータ処理やアプリケーション処理への応用に積極的。しかし実用化を考えると、FPGA単独でのアプリロジック実装には限界がある。例えばMemcacheの例ではメモリ領域管理やエラーハンドリングなど、複雑なロジックが要求される部分をすべてハードウェア実装するのは難しく、大幅な機能面での制約が生じてしまうのだ。

そこでキーとなるのが、FPGAによるハード実装とCPUによるソフト実装の協調設計。HP Labs/Facebook/ARM/Univ of Michiganが発表した[Thin Servers with Smart Pipes](http://web.eecs.umich.edu/~twenisch/papers/isca13.pdf)というコンセプトでは、ARM＋FPGAのヘテロコアの利用を前提に、get()等の単純処理はFPGAで、put()や例外処理等の複雑な処理はCPUで、という協調実装が提案されている。つまり、POWER8のCAPIは、こうしたソフト＋ハード協調実装が今後どんどん普及していくことを見込んで投入された技術なのだ。

![kobito.1398955479.642090.png](https://qiita-image-store.s3.amazonaws.com/0/38290/22f89978-8f87-0fae-832a-66a9afa511c0.png "kobito.1398955479.642090.png")
From http://web.eecs.umich.edu/~twenisch/papers/isca13.pdf

## Alteraはモンテカルロによる金融リスク分析をデモ
[@ogawa_tterさん情報](https://twitter.com/ogawa_tter/status/461504782356578304)によると、IBM Impact 2014ではAlteraからも*Financial Risk Modeling with CAPI Accelerator (Monte Carlo)*という発表があったらしい（が資料は見当たらない）。おそらくは、モンテカルロ・シミュレーションの部分のみをFPGA上のハード実装で大規模並列に実行し、その前後処理はPOWER8が担当、といったものと想像される。

というわけで、CPUとFPGAによるハード＋ソフト協調実装のビッグウェーブが遠くから押し寄せつつあるのを感じる今年のGWであった。

----
Disclaimer この記事は個人的なものです｡ここで述べられていることは私の個人的な意見に基づくものであり､私の雇用者には関係はありません｡
Pythonでキー入力


## コンソールから文字列を入力するのに使う

```py
#!/usr/bin/env python2.7
#-*- coding: utf-8 -*-

if __name__ == '__main__':

    input_data = raw_input('>>> ')
    print input_data
```

## コンソールから数値を入力するのに使う

```py
#!/usr/bin/env python2.7
#-*- coding: utf-8 -*-

if __name__ == '__main__':

    input_data = input('>>> ')
    print input_data
```
twitter bot 作成

下記を見ると10分で作れるそうな！なんて簡単な（まとまった情報ありがたし）。
http://morizyun.github.io/blog/twitter-bot-ruby-rails/

ただし、twitterのgemがバージョンアップしていて古いのは使えない。今の最新は5.5系の様子。下記のようにしたら対応できた。コードの部分にさえ引っかからなければ10分でもいけそう。20分以内なら確実と思う。

```rb
require 'twitter'

namespace :twitter do
  desc "ツイートする"
  task :tweet => :environment do
    ## アプリ登録時に取得したCONSUMER_KEY/CONSUMER_SECRET
    CONSUMER_KEY = 'xxxxx'
    CONSUMER_SECRET = 'xxxxx'
    ## irbで取得したAccess Token/Access Secret
    OAUTH_TOKEN = 'xxxxx'
    OAUTH_TOKEN_SECRET = 'xxxxx'

    config = {
        :consumer_key    => CONSUMER_KEY,
        :consumer_secret => CONSUMER_SECRET,
        :oauth_token => OAUTH_TOKEN,
        :oauth_token_secret => OAUTH_TOKEN_SECRET
    }

    client = Twitter::REST::Client.new(config)
    tweet = "from service. this is test. "
    update(client, tweet)
  end

  def update(client, tweet)
    begin
      tweet = (tweet.length > 140) ? tweet[0..139].to_s : tweet
      client.update(tweet.chomp)
    rescue => e
      Rails.logger.error "<<twitter.rake::tweet.update ERROR : #{e.message}>>"
    end
  end
end
```
vimperator で既存のキーマッピングをラップしたい

# 概要

Linux 環境下の vimperator にて、コマンドモードやヒントモード時に IME の ON/OFF を制御したかった。

方法は色々あるようだが、どうせ Linux 環境下では結論が同じ(外部コマンドの利用)なので自作することに。

# こんな感じ

(例えば `t` キーの場合)

1. `t` キーを押す
2. 外部コマンドを `io.run()` で呼び、IME を切る
3. 普通に `t` キーを押した際のイベントへ

こんな感じで IME の OFF 処理さえぶち込めれば、後は通常通りで構わない。

# で

下記の様になった。

(ibus-disable コマンドについてはまた別の機会に)

```vim
nnoremap t :<C-u>js<Space>io.run('ibus-disable')<CR>t
```

しかし、上手くいったりいかなかったりと不安定。

おそらく、IME が OFF になる前に入力欄(コマンドライン)のフォーカスが外れてしまっているのだろう。

# 手抜きをしない

ググった。あっているか不安。

```js
js <<EOM
mappings.addUserMap(
  [modes.NORMAL], ['t'], ':tabopen',
  function() {
    events.feedkeys('t', true);
    io.run('ibus-disable');
  },
  { rhs: ':tabopen', noremap: true }
);
EOM
```

やっている事は先ほどと同じ。

- `mappings.addUserMap()` は `map コマンド` 相当
    - 引数で `nnoremap` 相当に
- `events.feedkeys()` で通常のキーイベントを発生させる
- 入力欄にフォーカスが当たっている事を確実にするため、IME の OFF は後回しに

一応、期待どおりに動いている。

# おまけ: IME を制御する方法いろいろ

- CSS の `ime-mode` プロパティを使う
    - Linux 環境では肝心の `inactive` が使えない
- 外部コマンドを呼ぶ
    - `io.system()`: PATH が通っていない場合
    - `io.run()`: PATH が通っている場合
- `ime_controller.js`
    - 未確認。Windows XP のみ?
- `imekeys.js`
    - 定番っぽい
    - 環境に合わせて良きに計らってくれる
スコープと命名規則について（グローバル変数とローカル変数）

# スコープと命名規則について（グローバル変数とローカル変数）

スコープについて、書籍を読んだ部分を自分のメモ用としてまとめました。

## スコープとは

スコープとは「変数や関数を利用できる範囲（有効範囲）」のことを言います。
JavaScriptの変数や関数はそれらが宣言・作成された箇所よりも内側でのみ利用できます。

スコープ外（宣言・作成された箇所よりも外側）からは利用できない。

### スコープの種類（グローバル変数とローカル変数）

スコープの種類には、2種類あります。

|    種類    |     説明     |
|:----------------------|:-----------------------|
|    グローバルスコープ   | プログラム内のどこからでも使用できる変数や関数のスコープ |
|    ローカルスコープ     | プログラム内の限られた範囲内でしか使用できない変数や関数のスコープ |

## ローカル変数の有効範囲

ローカル変数に関して厳密には、宣言された関数全体で有効な変数になります。

```js
var scope = 'Global Scope'; // グローバル変数を宣言

function getValue(){
    console.log(scope); // 1.undefined（未定義）で出力
    var scope = 'Local Scope'; // ローカル変数を宣言
    return scope;
}
console.log(getValue()); // 2.Local Scopeを出力
console.log(scope); // 3.Global Scopeを出力
```
なぜ、1.はundefinedが出力されるのか。
ローカル変数は「関数全体で有効」ですので、1の時点ではローカル変数scopeは有効になっています。
しかし、1の時点ではローカル変数が確保されているだけで、var命令は実行されていないため、1の時点は中身が未定義になります。

変数の宣言する箇所を誤ると思わぬ不具合が起きたりします。
ソースが長くなると、デバッグ作業が難しくなるため↓↓↓↓
##### ローカル変数はかならず関数の先頭で宣言する

## 変数宣言にvar命令は必須
JavaScriptでは、宣言を表すvar命令は省略可能です。

```js
scope = 'Global Scope'; // グローバル変数を宣言

function getValue(){
    scope = 'Local Scope'; // ローカル変数を宣言
    return scope;
}
console.log(getValue()); // Local Scopeを出力
console.log(scope); // Local Scopeを出力
```
このような記述の場合、最後に入れたconsole.log(scope);が
console.log(getValue());に上書きされます。

宣言を表すvar命令がない場合

##### グローバルで定義された変数を出力する

結果、最初に宣言したscopeは、次に宣言したscopeに上書きされてしまう状態になります。

ローカル変数は「< var命令で定義された >変数は、定義する場所によって変数のスコープが決まる」

##### ローカル変数を定義するには、かならずvar命令を使用する

* 「関数内でグローバル変数を書き換える」ような用途を除いては、原則var命令を省略すべきではない。
* グローバル変数を宣言する場合も「グローバル変数にはvarをつけない。ローカル変数にはつける」などをしてしまうと混乱のもとになる。

##### 無用なバグをを防ぐため「変数宣言はvar命令で行う」ことが望ましい
CasperJSを試してみる

以前から試してみたかったCasperJSを試してみたのです。

# CasperJSとPhantomJSのインストール

CasperJSはnpmからインストールしてそのまま使えるんですね。

```bash:Terminal
$ npm install -g casperjs
```

インストールすると、CasperJSが自動的にPhantomJSもダウンロードしてくれます。ただ、そのままでは使えなかったので（パスが通っていなくて）ちょっとだけ手間をかけてあげます。

```bash:.bashrc
# PhantomJS with CasperJS from npm
phantomjs=$HOME/.nodebrew/current/lib/node_modules/casperjs/node_modules/phantomjs/bin
[ -d "$phantomjs" ] &&
  export PATH=$phantomjs:$PATH
[ ! -x "$phantomjs/phantomjs" ] &&
  chmod +x "$phantomjs/phantomjs"
```

`.bashrc`にこんな感じのことを書いておくとすぐに使えて幸せかも。

例はnodebrewを使用している場合のものなので、直接node.jsをインストールしている場合などは若干パスが変わるかもしれません。

```bash:Terminal
$ casperjs --version
1.1.0-beta3
```

と出力されれば使用できます。

# サンプルコードを書いてみる

[Quickstart](http://docs.casperjs.org/en/latest/quickstart.html)にあったコードを書いてみます。

```coffeescript:sample.coffee
casper = require('casper').create()

casper.start('http://qiita.com/', ->
  @echo(@getTitle())
)

casper.run()
```

```bash:Terminal
$ casperjs sample.coffee
Qiita - プログラマの技術情報共有サービス
```

http://qiita.com/ のタイトルが出力できました。

# テストを書いてみる

テストも書けるみたい。

```coffeescript:test.coffee
casper.test.begin 'Hello, Test!', 1, (test) ->
  test.assert(true)
  test.done()
```

```bash:Terminal
$ casperjs test test.coffee
Test file: test.coffee
# Hello, Test!
PASS Subject is strictly true
PASS 1 test executed in 0.053s, 1 passed, 0 failed, 0 dubious, 0 skipped.
```

---

まだ`getElementsByTagName`してみたりだとか、画面キャプチャを撮ってみたりだとか、全然使ってないけどインストールが簡単だったのでこれからいろいろ試して行きたい。なかなか面白いことに使えそうな気がする。
キーボードにあわせてテキストビューの位置を変える（変換候補、予測変換対応バージョン）


ググるといろいろネットで出てきたけど、情報が古かったりしていまいちわかりにくかったので、改めてここに投稿します。


```objectivec
//viewDidAppear:(BOOL)animated等でこれを呼び出す
- (void)registKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UITextInputCurrentInputModeDidChangeNotification object:nil];
}
```

```objectivec
//viewDidDisappear:(BOOL)animated等でこれを呼び出す
- (void)removeKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextInputCurrentInputModeDidChangeNotification object:nil];
}
```

```objectivec
//以下のメソッドを追加
- (void)keyboardWillShow:(NSNotification*)notification
{
    CGRect keyboardFrameEnd = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    [self moveTextView:(self.navigationController.view.frame.size.height - textView.frame.size.height - keyboardFrameEnd.size.height) notification:notification];(*)
}

- (void)keyboardWillHide:(NSNotification*)notification
{
    [self moveTextView:(self.navigationController.view.frame.size.height - textView.frame.size.height) notification:notification];(*)
}

- (void)moveTextView:(CGFloat)moveTo notification:(NSNotification*)notification
{
    NSTimeInterval duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve curve  = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
    void (^animations)(void);
    animations = ^(void) {
        CGRect keyboardFrameEnd = [[notification.userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
        if (keyboardFrameEnd.size.height > 0.0f) {
            textView.frame = CGRectMake(textView.frame.origin.x, moveTo, textView.frame.size.width, textView.frame.size.height);
        }
    };
    [UIView animateWithDuration:duration delay:0.0f options:(curve << 16) animations:animations completion:nil];
}
```

私の場合は、NavigationControllerにテキストビューをのせているので上記のようになっていますが、それぞれの必要に応じて、(*)の部分は調整してください。
標準のメッセージアプリやLineのような見た目のアプリを作りたい人向けです。
SQLは3値論理 (達人に学ぶSQLより)

#SQLは3値論理


##SQLはtrue, false, unknownの3値論理である。

3値論理になる理由はNULLがあるから。
NULLは値でも変数でもない。
比較述語を使えるのは比較する物が値の時だけ。
NULLを正しく判別するためにはISNULLを使う
下記は全てunknownになる


* data = NULL
* data > NULL
* data < NULL
* data <> NULL
* NULL = NULL

###NOTの真理値表

| x | NOT x | 
|:-----------|------------:|
| true     | false |  
| NULL     | unknown |   
| false       | true |    

###ANDの真理値表

| x | true | unknown | false |  
|:-----------|------------:|------------:|------------:|
| true     | true | unknown |false | 
| NULL     | unknown |unknown | **false** |    
| false       | false | **false** | false    

###ORの真理値表

| x | true | unknown | false |  
|:-----------|------------:|------------:|------------:|
| true     | true | **true** |true | 
| NULL     | **true** | unknown | unknown |    
| false       | **true** | unknown | false    

###NOT INはNULLが含まれると結果は空になる
###EXISTSはNULLがあってもtrueとfalseしか返さない

>達人に学ぶSQL徹底指南書より
リモート環境のファイルをFinderで確認できるようにする

FTPクライアントがあればVagrant環境にSSHでログインして好きなエディタで編集することは出来るんですが、それもやっぱりめんどい
ドットインストールではVagrantの仮想マシンにあるファイルをFinderで確認したりしてたので、同じようにするやり方を調べてみました。

↓参考にしました
http://ottan.me/2013/04/01/operated-from-finder-wordpress-environment-built-on-virtual-machine/


## sshfsのインストール

`brew install sshfs`
homebrew辺りでsshfsをインストールします。

## リモート環境のディレクトリをマウント
`sshfs vagrant@192.168.33.10:/home ./test`
ホストのIPが192.168.33.10、ユーザー名がvagrantだった場合はこんな感じ
リモート環境の/home以下がローカルの./testにマウントされます

![スクリーンショット 2014-05-02 0.51.37.png](https://qiita-image-store.s3.amazonaws.com/0/42654/a887557d-4736-2781-0a6c-910bba781247.png)

もしPermission関連のエラーが出たら、マウントしたいリモート環境側でグループ外ユーザーに対してchmod等で権限を与えてあげる必要があるみたいです。


後はFinderと同様に使えるので、ローカルとほとんど同じように作業ができます。
ちょっとしたファイルの編集を行いたい時などわざわざSSHでログインしたり一旦ローカルにファイルを転送する作業を挟まなくて済むのでとても便利ですね。
今日、昨日なら文字列で「今日」「昨日」と返し、それ以外の日付ならユーザーの日付フォーマットにあわせた文字列の日付を返すソース


```objectivec
+ (NSString *)stringDate:(NSDate *)date{
    NSString *strDate = [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterNoStyle];
    NSDate *today = [NSDate date];
    NSString *strToday = [NSDateFormatter localizedStringFromDate:today dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterNoStyle];
    if ([strToday isEqualToString:strDate]){
        return NSLocalizedString(@"today", nil);
    }    
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *comps = [[NSDateComponents alloc]init];
    [comps setDay:-1];
    NSDate *yesterday = [cal dateByAddingComponents:comps toDate:today options:0];
    NSString *strYesterday = [NSDateFormatter localizedStringFromDate:yesterday dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterNoStyle];
    if([strYesterday isEqualToString:strDate]){
        return NSLocalizedString(@"Yesterday", nil);
    }
    return strDate;
}
```

今日や昨日（場合によっては明日等）は、日付の文字列（例　2014/01/01）を返すよりも、今日や昨日と返した方がユーザーにはわかりやすい場合があるので、そんなとき用に。
ansbleのinstall


## mac

1. [Xcode](https://itunes.apple.com/us/app/xcode/id497799835?ls=1&mt=12)を入れる
2. `sudo easy_install pip`
3. `sudo pip install ansible`

で行けるはずだったんだけど、なんかエラー

~~~~
clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]

clang: note: this will be a hard error (cannot be downgraded to a warning) in the future

error: command 'cc' failed with exit status 1
~~~~

なんかXcode5.1からおかしくなっちゃったみたい。

解決策は、

~~~~
sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install ansible
~~~~

pipの前に環境変数つけたら何とかなるみたいです。

`vars_prompt`の暗号化を使う場合には、

~~~~
sudo pip install passlib
~~~~

もお忘れなく。



## linux

shell scriptにしてplaybookと一緒に同梱して配布しとくと何かと便利だったりする。
vagrantでtest環境作るときとかさ。

~~~~
sudo yum -y install python-devel.x86_64 python-setuptools gcc
sudo easy_install pip
sudo pip install passlib ansible

echo ""
echo "install complete"
ansible --version
~~~~
pushd: not foundというエラー

一定時刻にサーバ側でいろいろなスクリプトを実行させたいので、
スクリプトをまとめたリポジトリを作って、
cronで一定時間ごとにpullして実行するスクリプトを作ってました。

コードはこんな感じです

```bash
#!/bin/bash

if [ $# -ne 1 ]; then
  echo "plese set folder" 1>&2
  exit 1
fi

dir=$1
main=${dir%/}
today=`date "+%d.txt"`

log=“${main}/log/${today}"

pushd $(dirname $0)

git checkout .
git pull origin master

./scripta/start.sh $main $log
./scriptb/start.sh $main $log

popd
```

ところが実行したところ、
`pushd: not found`
というエラーが出て全く起動していませんでした。

原因は上のスクリプトの
`#!/bin/bash`を
`#!/bin/sh`
と書いており、shにpushdはないため失敗していました。 

とりあえずbash使っておけばOKですね…
xinetd と netcat で簡易中継サーバを作る

reverse proxy をさせたいけど、nginx や apache を使うほどでもないようなときに。

/etc/xinetd.d/proxy-http

```
# default: on

service http
{
  port = 80
  socket_type = stream
  protocol = tcp
  wait = no
  user = nobody
  server = /usr/bin/nc
  server_args = -w 5 192.168.4.99 80
  disable = no
}
```

https の場合:

/etc/xinetd.d/proxy-https

```
# default: on

service https
{
  port = 443
  socket_type = stream
  protocol = tcp
  wait = no
  user = nobody
  server = /usr/bin/nc
  server_args = -w 5 192.168.4.99 443
  disable = no
}
```
Rails4.1 Enum

Rails4.1の新機能 ActiveRecored Enum についての理解と誤解

```rb
class Bug < ActiveRecord::Base
  enum status: {
    unverified: 0,
    confirmed: 1,
    in_progress: 3,
    resolved: 4,
    rejected: 5,
    reopened: 6
  }
end
```

こんなモデルがあったとして statusを responsedにする場合、intでもいいし、シンボルでもOK
```rb
bug = Bug.first
bug.status = 6
bug.status = :reopened
```

んで、値を評価したいときは。。。

```rb
bug.status = :unverified
bug.status == :unverified
=> false
```

false になる。

なるほど、ちょっと誤解していた。
モデルの属性の状態を表すのではなくモデルそのものの状態を表すということなのですね。

```rb
bug.unverified?
=> true
```
underscore.jsを読む#2 map,reduce,reduceRight

第二回。

まずはmap。

```map.js
_.map = _.collect = function(obj, iterator, context) {
  var results = [];
  if (obj == null) return results;
  if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
  each(obj, function(value, index, list) {
    results.push(iterator.call(context, value, index, list));
  });
  return results;
};
```
nullが入った場合などの処理がありますが、eachでループしてpushしていくだけです。
次はreduce。

```reduce.js
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
  var initial = arguments.length > 2;
  if (obj == null) obj = [];
  if (nativeReduce && obj.reduce === nativeReduce) {
    if (context) iterator = _.bind(iterator, context);
    return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
  }
  each(obj, function(value, index, list) {
    if (!initial) {
      memo = value;
      initial = true;
    } else {
      memo = iterator.call(context, memo, value, index, list);
    }
  });
  if (!initial) throw new TypeError(reduceError);
 return memo;
};
```

inititalは初期値が存在するかを判定しています。初期値がなかった場合はlistの先頭の値を初期値としてeachによりループを回していきます。

ネイティブのreduceがあったときに少し特殊なことをしていて、contextをiteratorにbindしています。これは[ネイティブのreduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)にそのような機能がないことによります。

最後はreduceRight


```reduceRight.js
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
  var initial = arguments.length > 2;
  if (obj == null) obj = [];
  if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
    if (context) iterator = _.bind(iterator, context);
    return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
  }
  var length = obj.length;
  if (length !== +length) {
    var keys = _.keys(obj);
    length = keys.length;
  }
  each(obj, function(value, index, list) {
    index = keys ? keys[--length] : --length;
    if (!initial) {
      memo = obj[index];
      initial = true;
    } else {
      memo = iterator.call(context, memo, obj[index], index, list);
    }
  });
  if (!initial) throw new TypeError(reduceError);
  return memo;
};
```
reduceが「左」からなら、reduceRightは「右」から縮めていく関数です。配列が渡された場合はlengthを取得して1減らしながらeachでループを回していくだけになります。

オブジェクトがきた場合はlengthが定義できないので、まずkeyの配列を取得してそのlengthをとります。そして配列と同じように1減らしながらkeyからvalueを取得してループを回します。

eachで取得したvalueは完全に無視していますが、ループの回数は同じになるはずなので問題なしです。

reduce、reduceRightにオブジェクトを渡すのは使い所がよく分からないですね、、、for inの順番で左or右から縮めていくので実行環境によってしまいますし。

[Annotated Sourceにも書いています](http://takushi-m.github.io/underscore/docs/underscore.html#section-16)
iOSの言語環境に合わせて月表示を取得する。

月ごとの一覧画面を作ることがあって、文字列をこんな風に作っていたのですが、

    NSString *mString = [NSString stringWithFormat:@"%d %@", month, NSLocalizedString(@"Month",@"") ];

英語のリソース作ってなかったばっかりに、"3 Month"とか訳の分からないことになったので、きちんとやることにしました。そんなメモです。

現在のiOSの言語を取得します。

    NSArray *langs = [NSLocale preferredLanguages];
    NSString *langID = [langs objectAtIndex:0];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:langID];

日付書式を設定します。    

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setLocale:locale];

月表示の一覧を取得します。    

    NSArray *monthSymbols = [dateFormatter monthSymbols];

言語に合わせて、1月,2月だったり、January, Febraryだったり、、がNSArrayに入ってくるので、あとは取得するだけです。

    NSString *month = [ monthSymbols objectAtIndex: 0 ];
MacOSX でファイルのタイムスタンプを EXIF に合わせる

うちのプリンターには SD カードから画像を読み込んで印刷する機能がある。このプリンターで日付を焼き込もうとすると、EXIF ではなく、ファイルのタイムスタンプを参照するらしく、レタッチしたデータを印刷するとおかしな日付が焼き込まれてしまう。
そこで [MacOSXでファイルの作成日時と更新日時を変更する](http://qiita.com/mazgi/items/79f4be1af10d42f76ea6) を参考に、ファイルのタイムスタンプを操作してみた。

# 任意の日時に設定する

```zsh
$ datetime="2014-04-08:12:00:00"
$ d=`date -jf "%Y-%m-%d:%H:%M:%S" "$datetime" +'%m/%d/%Y %H:%M:%S'`
$ setfile -m "$d" hoge.jpg
```

FAT32 な SD カードで作成日と変更日を変更できた。

# EXIF の撮影日時に合わせる

EXIF データの読み込みのため、パッケージをインストールしておく。

```zsh
$ brew install exif
```

撮影日時は　`Date and Time (Original)` というタグで取り出せる。
取り出せたら、あとは先ほど同様 `setfile` で設定するだけ。

```zsh
$ exif_datetime=`exif -m -t 'Date and Time (Original)' hoge.jpg`
$ d=`date -jf '%Y:%m:%d %H:%M:%S' "$exif_datetime" +'%m/%d/%Y %H:%M:%S'`
$ setfile -m "$d" hoge.jpg
```

# まとめ

```zsh
#!/bin/sh -e

adjust_to_exif()
{
    exif_datetime=`exif -m -t 'Date and Time (Original)' "$1"`
    d=`date -jf '%Y:%m:%d %H:%M:%S' "$exif_datetime" +'%m/%d/%Y %H:%M:%S'`
    setfile -m "$d" "$1"
    echo "$1: $d"
}

adjust_to_exif "$1"
```
Parse.comのホスティングを利用する

***
2015/07/11 追記
parseコマンドのパラメータなどが若干変わったようなので修正しました。
***

ParseでWebサイトをホスティングする方法を紹介します。
Parse上でのアプリの作成はすませておいてください。

この後、 **手順さえわかっていれば、世界中で閲覧できるHello worldの表示まで3分くらい**でしょうか。おそろしやおそろしや。

## コマンドラインツールをインストールする

Mac/Linx

```shell-session
$ curl -s https://www.parse.com/downloads/cloud_code/installer.sh | sudo /bin/bash
```

Win
[ここからダウンロード](https://www.parse.com/downloads/windows/console/parse.zip)

## プロジェクト（サイト）用ディレクトリを生成する

```shell-session
$ parse new
Please login to Parse using your email and password.
Email: ninja@gmail.com
Password (will be hidden):
Would you like to create a new app, or add Cloud Code to an existing app?
Type "new" or "existing": existing
1:	MyApp1
2:	MyAwesomeApp2
3:	app
Select an App to add to config: 2
Awesome! Now it's time to setup some Cloud Code for the app: "MyAwesomeApp2",
Next we will create a directory to hold your Cloud Code.
Please enter the name to use for this directory,
or hit ENTER to use "MyAwesomeApp2" as the directory name.

Directory Name: MyWebsite
Your Cloud Code has been created at /Dir/of/MyWebsite.
Next, you might want to deploy this code with "parse deploy".
This includes a "Hello world" cloud function, so once you deploy
you can test that it works, with:

curl -X POST \
 -H "X-Parse-Application-Id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
 -H "X-Parse-REST-API-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
 -H "Content-Type: application/json" \
 -d '{}' \
 https://api.parse.com/1/functions/hello
$ cd MyWebsite
```
これでカレントディレクトリにMyWebsiteというディレクトリが作成されます。

ディレクトリ構成は次のとおり。（勝手に作られます）

```
-config/
  global.json
-cloud/
  main.js
-public/
  index.html
```

## サイトを作成する（Hello world）

一旦、テストのためにindex.htmlに`こんにちは 世界!` と書いて次の手順でデプロイしてみます。

## デプロイ（アップロード）する

```shell-session
$ parse deploy
```

## サイトにアクセスする
URLは

```
{サブドメイン名}.parseapp.com
```
になります。{サブドメイン名}はParseの管理サイト（下記）で任意に決められます。
（有料プランはカスタムドメイン利用可）

https://www.parse.com/apps/アプリ名/edit#hosting

![Edit_Your_App___Parse.png](https://qiita-image-store.s3.amazonaws.com/0/40758/34831dbf-e324-85df-05fc-8646f7a776ce.png)

サブドメイン名が決まったら、ブラウザからアクセスしてみましょう。
「こんにちは 世界!」
と表示されたら成功です。

## サイトを改良する

public ディレクトリ配下が公開ディレクトリになりますので、ここにcssディレクトリなりjsディレクトリなりを作成、ファイルを配置していきます。
配置・ファイル編集が終わったら `parse deploy` でデプロイします。

Expressやcloud code等を利用することでサーバサイドプログラミングも実装できますが、ここでは割愛します。
↓興味がある方はこの辺参照。
https://www.parse.com/docs/hosting_guide#custom

サーバサイドプログラミングを行わず、Parse javascript SDK, angularJS, Bootstrap等でParseクラウドのデータを表示するサンプルを作ってみたので、そのうち紹介します。

## 最後に

実質、`parse new`, `parse deploy` だけで公開完了です。
簡単にサイトホスティングができますねー。いい時代だなぁ。

* Parseを使ったAndroidやiOSのアプリの紹介ページ
 * インストールユーザ数をリアルタイムで表示したり。
 * ゲームアプリでハイスコアユーザを表示したり。
* スマホから登録されたデータを閲覧・管理する管理者向けサイト

などいろいろ使い道はありそうです。
KnockoutJSとAngularJSの話

#ドキュメント
```markdown:共通
嵌りどころ等で英語必須。
公式の日本語訳が有志により存在する。
開発ドキュメントは一式揃っている。
```
```markdown:Knockout
Githubでの戦闘力が4900とナッパ並
公式のチュートリアルが秀逸で、その場でHTMLとJSを修正して動作させながら学習することができる。
```
```markdown:Angular
Githubでの戦闘力が23000と3倍界王拳悟空並
公式のドキュメントが見辛いので、AngularJS Hubを参照するとよい
```
[AngularJS Hub](http://www.angularjshub.com/)

# ソースコード
```js:Knockout:JavaScript
function AppViewModel() {
  this.firstName = ko.observable("Bert");
  this.lastName = ko.observable("Bertington");
  this.fullName = ko.computed(function () {
    return this.firstName() + " " + this.lastName();
  }, this);
}

// Activates knockout.js
ko.applyBindings(new AppViewModel(), $("#main")[0]);
```
```html:Knockout:HTML
<div id="main">
  <p>First name: <input type="text" data-bind="value: firstName"/></p>
  <p>Last  name: <input type="text" data-bind="value: lastName"/></p>
  <p>Full  name: <strong data-bind="text: fullName"></strong></p>
</div>
```

```js:Angular:JavaScript
angular.module("mainModule", [])
  .controller("myController", function ($scope) {
    $scope.firstName = "John";
    $scope.lastName = "Doe";
    $scope.getFullName = function () {
      return $scope.firstName + " " + $scope.lastName;
    }
  });
```
```html:Angular:HTML
<div ng-app="mainModule">
  <div ng-controller="myController">
    <p>First name: <input type="text" ng-model="firstName"/></p>
    <p>Last  name: <input type="text" ng-model="lastName"/></p>
    <p>Full  name: <strong>{{getFullName()}}</strong></p>
  </div>
</div>
```

# 所感
簡単なコードでは記述方法はさほど変わらない。
だがAngularは定義すら関数を使用する必要があるのでAngularの作法をきっちりと身につける必要がある。
Knockoutの場合はJavaScriptの記述を壊していないので直感的に自由に記述ができる。

例えば継承は`$controller('ParentCtrl', {$scope: $scope});`を実行することにより継承可能となる。
Knockoutならextendsするだけだ。
CoffeeScriptとの親和性も壊してはいない。

# 結論
好きなほう使え

# よもやまばなし
Angularが人気高いんだけど、記述方法がどうも受け付けない。
すごい雑多で後からソースコードを見直したときに、はてなマークが大量に浮かんできそうな気がする。
DIはあるけどいらないです。

現時点でみるとscopeで通知する仕組みはグッド。
knockoutはko.observable()と関数になってしまうので、非常に書きづらくなる。
ES5が使える場合はdefinePropertyで通知するのでknockoutのほうがよくなる。

バインドの反映がデフォルトで
Knockoutはfocusout
Angularはkeypress
どっちがいいかは謎。

Routerの仕組みはAngularはださいね。
Sinatraの記法でいいような気がするんだが、テンプレート使いたいからだめだったのか？

Angularはフルスタックなのでもう少し深く触れば見えてくるものがありそうだけど
書き方がださいので実践投入しても責任が持てない不安感。

Angularの記法に違和感がないならAngularでもいい気はする。

今気づいた、DI使ってるからこんなに記述方法がださいのか。
DIをなくしたAngularを所望する。

ああ、軽くしか使ってないのにAngular批判になってるわ。
そんな僕はKnockout押しです。
何個連続@をつなげられるか？@@@@@@@@@@@@


* contrib等の外部ライブラリを使用しないで
* 同じ関数は1回だけ使えて（使用した関数内部で他の関数が呼ばれるのはよい）
* ループや再帰等の無限実行はせずに
* マクロによる多重実行もせずに
* 元の値（下記例では9）を取得可能 

といった条件とすると

```deref_sample.clj
(with-local-vars [x (promise)
                  y (future-call (fn [] x))
                  z (reify clojure.lang.IDeref (deref [this] y))]
  (deliver x (-> 9 ref atom agent delay future reduced))
  (str @@@@@@@@@@@@z))
```

12回はできた。
nginx 1.6/1.7 のインストール

Ubuntuにnginx 1.6/1.7をインストールする方法。
2014/05/01現在、Ubuntu標準?だと1.4.6のインストールになるので公式レポジトリを追加する。

### 公式レポジトリ

下記をsources.listに追記すればいい。

```bash:/etc/apt/sources.list
# nginx 1.6
deb http://nginx.org/packages/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/ubuntu/ trusty nginx

# または

# nginx 1.7
deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
```

`trusty`を`saucy`にすれば、Ubuntu 13.10用。

### インストール

```bash
# sources.listに追記
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sh -c 'echo "# nginx" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb-src http://nginx.org/packages/ubuntu/ trusty nginx" >> /etc/apt/sources.list'

# レポジトリ署名を追加
cd /tmp
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key

# インストール
sudo apt-get update
sudo apt-get install nginx
```

### 参考
- [nginx: Linux packages](http://nginx.org/en/linux_packages.html)
QCon2014: Cloud Design Pattern Azure 版

[QCon Tokyo 2014](http://www.qcontokyo.com/program.html)
[QCon2014 My Report Top](http://qiita.com/kozayupapa/items/97012d2d6f663712249e)

Detail Report#7/8 

[AWS の Cloud Design Pattern](http://aws.clouddesignpattern.org/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)(CDP)は読んだことがあったのですが
[Asure版のCloud Design Pattern](http://msdn.microsoft.com/en-us/library/dn568099.aspx)は初めて知りました。

両方とも上記リンクから参照できるので比較してみると面白いですね！


# Enterprice Cloud Design pattern 大量データ処理アーキテクチャ
上坂貴志：Nextscape
Architect

[発表資料](http://www.slideshare.net/uesaka/enterprise-cloud-design-pattern)

![alt](http://image.slidesharecdn.com/enterpriseclouddesignpattern-140501015042-phpapp01/95/slide-4-638.jpg?cb=1398927091)

## ACE (Azure Council Experts)
Azureを使う企業のあつまり、社団法人

## Cloud Design Patterns
(AWSしかしらなかったけどMicrosoft版もあるんですね)
* 24 design pattern
* 10 guidance
* code sample

![alt](http://image.slidesharecdn.com/enterpriseclouddesignpattern-140501015042-phpapp01/95/slide-12-638.jpg?cb=1398927091)
![alt](http://image.slidesharecdn.com/enterpriseclouddesignpattern-140501015042-phpapp01/95/slide-13-638.jpg?cb=1398927091)
![alt](http://image.slidesharecdn.com/enterpriseclouddesignpattern-140501015042-phpapp01/95/slide-14-638.jpg?cb=1398927091)

### 例えば10のguidance 
* 非同期メッセージング
* オートスケール
* キャッシュ
* アプリケーション分割
* データ整合性
* データパーティション
* データレプリケーション
* 同期方法
* インストールと通信
* 複数データセンター



## 今回のデモdata 処理概要
* 楽曲データを配信用に加工する処理
* エンコード処理、トランスコード処理、暗号化処理、アップロード
* 1曲あたり 2:30-3:30 以下に解決するかを例に説明します

## PaaS と Scalling
（いまさらな説明を、、、　なんだ　このコンファレンスに来ている人はPaaSとScalling知らない人がおおいのか、、　セッションを間違えたかも、、）


## Azureにおける PaaS
* "Cloud Service"という名前
* VisualStudioからデプロイ
* WebRole, WorkerRole
* Staging/Production へスワップ可能
* リモートデスクトップで接続可能（最大のメリットといっているけどそんなにうれしいのか？）

## Scale Out を前提とするなら処理の受け渡しQueを使う
* Storage Queue (順番保証なし64KB)
* Service Bus Queue (FIFO 265KB)
* AutoScale はQueの数をベースにオートスケール

## タスク統合
(まとめちゃってるけど、いいのかな？　細かくしておいたほうがよいように思うけど、、)
(汎用機の例を出すあたりがどうなんだろう。。)

![alt](http://image.slidesharecdn.com/enterpriseclouddesignpattern-140501015042-phpapp01/95/slide-26-638.jpg?cb=1398927091)

## 今回使ったパターン
* 競合する消費者パターン
* パイプとフィルターパターン
* リソース統合パターン　（計算ユニットをまとめよう）

## クラウド汎用パターン
* [Retry Pattern](http://msdn.microsoft.com/en-us/library/dn589788.aspx)
* Asure SDK Storage Accessには　Retryの仕組みが容易されている
* Asure SQLでもRetryPolicyが定義されているので利用できるし、拡張できる

（なるほど、AWSでもSDKに同じような仕組みがあるのか、しらべてみようと思いました。）
QCon2014: So-net Logicad, Gree Glossom

[QCon Tokyo 2014](http://www.qcontokyo.com/program.html)
[QCon2014 My Report Top](http://qiita.com/kozayupapa/items/97012d2d6f663712249e)

Detail Report#5/8 

#ビッグデータのリアルタイム応用:ユーザー事例

安田 崇浩:ソネット・メディア・ネットワークス株式会社
技術・開発部 開発リーダー
月間600億件を処理するリアルタイム広告　Logicad

田中 聡:Glossom株式会社
アドプラットフォーム事業部開発グループ1 Blossomチーム

田村 俊明:Aerospike, Inc.
nCountry Manager, Japan



## はじめに
* いままでは金融(Enterprise)→他業種
* 現在　Ad ->  Enterprise にひろがっている仕組みが多くなっている

## RTB (Real Time Bidding)
* 広告主が入札して、表示される
* だいたい150ms - 180ms ですべての処理が終わる
* データアクセスは、3ms 以下で終わらす

# Sonet 安田さん　Logicad
(logicadの仕組みの説明はぜひ下記のSlideShareをご参照！)
<http://www.slideshare.net/yasuda/logicad>
## 広告配信規模
* 600億http request / 月
* 1か月 UU １億UU
* Log 10TB

## request 規模
* 24000 req / sec
* ピークは夜間　平均の倍

## 50000 req/sec を処理するとは、
* 4msec / req で処理できたとしても
* 250 req/sec 1 core　1coreではこれだけ
* CPU 200 core　トータルで必要
* 1 server cpu 16 core　のっていたとして
* 12.5 X 50%余剰　　25台あれば処理できる

## Little's law　[リトルの法則](http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%88%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87)
* 待ち行列理論
* 到着率 A: 50000
* 顧客が費やす時間W  : 4msec
* 顧客数　L = A W  : 200 core, 25 server

* 処理時間が非常に重要（4->8 msec にふえると　コストが倍）


## Amdahl's Law　[アムダールの法則](http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A0%E3%83%80%E3%83%BC%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87)
* 複数のプロセッサを使い並列計算するばあい逐次処理がある場合あしかせになる
* 例えば5% 逐次処理がのこっていると20倍以上には高速化しない

## 50000  HTTP Req/sec
* 通常のLBを使うとどうしても100 micro 秒単位で処理がかかる
* やり取り先が、SSP（固定 IP ）ということもある
* AWS Route 53 weighted round robin のほうがはやい

## DB traffic
### IOPS
1 HTTP requestごとに2回のRead処理が必要
100,000 read / sec

* HDD IOPS: 200 IOPS -> 500 HDD
* SSD IOPS:20000 IOPS -> 5 SSD
* Memory : 1000000 IOPS 

### Cost
* Memory : 8 USD/GB 8000 USD
* SSD 0.5USD/GB 500USD


### Distributed Hashtable(分散ハッシュ)
* KVS Sharding 時に、キーによってアクセス先のサーバーが決まる
* どこかに問い合わせる必要がない
* 0.2 ミリ秒でread している

結論：[Aerospike](http://www.aerospike.com/japanese/) を SSD KVS のために使っている

## まとめ
* Little, Amdahls's law
* Latency を低く: 最新CPU, SSD, less GC
* 直列の部分を少なく: DNS RR, DHT, Message, Ques
* 並列性によって
* キャパシティを確保



# 田中さん : Glossom
経歴：
 Yahoo　-> Gree -> Glossom (DSP配信エンジン)

## About Glossom
* 2013 11 月　インターネット広告会社
* AD Network
 
## システム
下記の3機能のトライアングル

### 配信
* 広告閲覧者

### 集計
* 広告主

### 入稿ツール
* Analyst

レポートデータ

## 広告配信システムに求められる
* 高速レスポンス
*　きめ細やかな 属性配信
- Re-targeting
- Behavior targeting
- Frequency control

## 柔軟性確保のため、LUAを使用
言語をまたいだ関数呼び出し

* C/C->LUA
* LUA->C/C++

### 配信サーバーの実装ポリシー
### 配信フレームワークをC/C++
* リクエストのParse/Validation
* User情報の取得
* Log出力

### 細かいところをLuaで
* 案件データ中のターゲッティング条件を　値ではなくLUAの式をいれる

### メリット
* 配信フレームワークに修正をいれない
* LUA式を書き換えることで色々柔軟な配信が可能
* 実装導入スピードが上がる
* Stored procedureとしてLuaも使える

### デメリット
* 複雑度
* C++でそのまま実装するよりは工数がかかる

##  LUA導入事例
### 広告のこまかい条件指定　
[例](http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CEoQFjAE&url=http%3A%2F%2Fads.gree.net%2Fja%2Fmedia-kit%2Fpdf%2FAdLantis_for_Smartphone_2014_4-6.pdf&ei=8jtiU62pK4mXkQWJ0IHQCA&usg=AFQjCNGe1t6eCLyUAabaiVNhtdcHG7Nasw&sig2=AxTJ2qN__aiar4j72o7pzw&bvm=bv.65636070,d.dGI&cad=rja)
Automator + Run Shell Scriptでフォルダ・ファイルを日付付きでZIP圧縮

### Create a workflow document and add "Run Shell Script" action from the left side pane.

![Untitled-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/22048/9b783382-b146-bb5d-5fb4-c8ecfab3a60f.jpeg)

### Copy and past the code below.

```bash
while read file; do

	dir=`dirname "$file"`
	file_src=`basename "$file"`
	delimiter='_'
	timestamp=`date +%Y%m%d`-`date +%H%M%S`
	file_dst=$file_src$delimiter$timestamp

	/usr/local/bin/terminal-notifier -title "Archiver" -message "Start archiving "$file_src"."

	cd $dir
	cp -rfp ./$file_src ./$file_dst
	find ./$file_dst -name '*.DS_Store' -type f -delete
	zip -r9 $file_dst ./$file_dst
	rm -rf ./$file_dst

	/usr/local/bin/terminal-notifier -title "Archiver" -message $file_src" is now archived as "$file_dst"." -sound Glass

done
```

### Activate the service from System Prefernces > Keyboard > Keyboard Shortcuts > Service Menu.

![Untitled.jpg](https://qiita-image-store.s3.amazonaws.com/0/22048/fc1ac704-d9a1-5fb9-dc3c-497e826eb7d8.jpeg)
任意の周期でコマンドを実行する


while コマンドの使い方を学んだので備忘録程度に

```
while sleep 10
do
〜何らかの処理〜
done
```

sleep 後の値を変えれば実行周期を変えられる。


巨大なデータをインポートする作業を行った。
その際、ディスク容量を食いつぶさないか定期的にチェックしたかった。
定期的なチェックを自動化するために下記のようなコマンドを実行した。


```
     % while sleep 10
while> do
while> df -gH /
while> done
```
CentOSにgit-flowをインストールする方法

# 経緯

git-flowを使おうと思い、[git-flowのサイト](http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html)通りに`$ apt-get install git-flow`でインストールしようと思ったら`bash: git-flow: コマンドが見つかりません`と怒られたのでメモ。

# 方法

### ①root権限になる
`$ sudo su -`
### ②インストールディレクトリまで移動
`$ cd /usr/local/src`
### ③インストール
`$ wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash
`

### ④以下実行されればOK
````
### gitflow no-make installer ###
Installing git-flow to /usr/local/git/bin
Cloning repo from GitHub to gitflow
Cloning into 'gitflow'...
remote: Reusing existing pack: 1407, done.
remote: Total 1407 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1407/1407), 623.29 KiB | 208.00 KiB/s, done.
Resolving deltas: 100% (689/689), done.
Updating submodules
Submodule 'shFlags' (git://github.com/nvie/shFlags.git) registered for path 'shFlags'
Cloning into 'shFlags'...
remote: Reusing existing pack: 454, done.
remote: Total 454 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (454/454), 130.79 KiB | 55.00 KiB/s, done.
Resolving deltas: 100% (338/338), done.
Submodule path 'shFlags': checked out '2fb06af13de884e9680f14a00c82e52a67c867f1'
install: creating directory `/usr/local/git'
install: creating directory `/usr/local/git/bin'
`gitflow/git-flow' -> `/usr/local/git/bin/git-flow'
`gitflow/git-flow-init' -> `/usr/local/git/bin/git-flow-init'
`gitflow/git-flow-feature' -> `/usr/local/git/bin/git-flow-feature'
`gitflow/git-flow-hotfix' -> `/usr/local/git/bin/git-flow-hotfix'
`gitflow/git-flow-release' -> `/usr/local/git/bin/git-flow-release'
`gitflow/git-flow-support' -> `/usr/local/git/bin/git-flow-support'
`gitflow/git-flow-version' -> `/usr/local/git/bin/git-flow-version'
`gitflow/gitflow-common' -> `/usr/local/git/bin/gitflow-common'
`gitflow/gitflow-shFlags' -> `/usr/local/git/bin/gitflow-shFlags'
````

### ⑤インストールされているか確認
`$ git flow`

下記のように表示されればインストール完了。

````
$ git flow
usage: git flow <subcommand>

Available subcommands are:
   init      Initialize a new git repo with support for the branching model.
   feature   Manage your feature branches.
   release   Manage your release branches.
   hotfix    Manage your hotfix branches.
   support   Manage your support branches.
   version   Shows version information.

Try 'git flow <subcommand> help' for details.
````
今更始めるCVS

※この順番通りコマンド打ってもダメだけれど、メモ用
これぐらい使えればとりあえず問題ないはず。

```bash
# 初期化する
CVSROOT=`pwd`/var/cvs
export CVSROOT

# プロジェクトを登録する
$ cvs import -m "initial" proj vendor inital

# ファイルを追加削除する
$ cvs add file.tx
$ cvs add -kb binary.so 
$ cvs rm -f del_file.txt

# コミットする
$ cvs ci -m "commit file" file.txt

# チェックアウトする
$ cvs co proj

# インデックス（現在の作業分）と比較する
$ cvs diff -u file.txt

# 行単位でいつ変更されたか調べる
$ cvs ann file.txt

# CVSディレクトリを除いてプロジェクトを取り出す
$ cvs ex -D now proj

# RCSキーワードを埋め込む(コミット時に展開される)
$ echo '# $Header' >> file.txt
# $Header: /home/ymko/var/cvs/card/card.pl,v 1.2 2014/05/01 10:50:13 ymko Exp $

# ログ
$ cvs log file.txt

# 過去の履歴から差分を取る
$ cvs diff -u -r 1.1 -r 1.2 file.txt

```


# 参考
* [UNIXの部屋 コマンド検索:CVSチュートリアル基礎編 (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?CVS%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB%B4%F0%C1%C3%CA%D4)
* [Section 5.3](http://www.mikamama.com/CVSBook/draft2nd/sec5-3.html)
[Unity勉強:0001] Unity2Dで囲碁盤作成

最底辺プログラマーだけど少しは自分で何か作りたいなぁと思ってUnityを触り始めました。

Unityが公式で2Dに対応する前に、
ちょっと入門ページにのっているブロック崩しでも作ろうかと思って前に少し触っていたんですが、
(そのときつくったもの→　https://dl.dropboxusercontent.com/u/37890205/BlockBrakeGame_web.html )

3Dゲームは自分のスキルじゃまだ無理だなぁ・・・と思ったので、

簡単な2Dゲームを作りまくって、少しずつでもUnityに慣れようとしています。

ということで、

とりあえずボードゲーム的なのがまずは作りやすそうだなぁと思って、
ただ囲碁盤に石を置いて石を囲んだら取れる的なものを作成してみました。

(Unity WebPlayer)
https://dl.dropboxusercontent.com/u/37890205/iGo_Web.html

(GitHub)
https://github.com/yakumi226/iGo

まだ着手禁止点とかコウとか細かい処理の実装はこれからだけど、

Unity2DのSprite作成方法とLayerでの順番管理とかの概要は理解しました。

少しでも優秀な方々のスキルについていけるようにこれから頑張ろう。