OmniAICreator/Qiita-1.07M huggingface dataset:
git便利帳

## git repository作成
### 初期設定
git init --bare --shared

## file名修正
[file名修正](https://qiita.com/shoheiyokoyama/items/0fd9f688a269bbdc9da3)

* default branch設定

>
git symbolic-ref HEAD refs/heads/develop 

##git ログ周り##
###ログ周り
* get a file from a specific revision
>
git show commit_version:file_path  

* あるファイルの変更履歴
>
git log --name-only -p filename

* 特定のソースコードの履歴
>
git log -p -S '文字列'

* ログカスタマイズする
>
git config alias.logs "log --date=format:'%Y-%m-%d' --pretty=format:'%h %an(%ad):%s'"
git logs [--name-only] file    そのコミットに変更したファイルリストも出てくる

* List all the files for a commit in Git
>
git show --name-only commit_version

* pushしたコミットを取り消す
>
git push -f origin HEAD^:master

* 修正コミットコメントから検索
>
git log --grep xxxx --author xxxx

* stash内容を覗く
>
git stash show -v

###ファイル追加と削除
* 削除

>
git rm $(git ls-files --deleted)
git rm `git status | grep deleted | awk '{print $3}'`
git status | awk '$2 == "deleted:" {print $3}'

参考：[How to 'git rm' all deleted files shown by 'git status'](http://tylerfrankenstein.com/code/how-git-rm-all-deleted-files-shown-git-status)

###submodule
* 追加

>
`git submodule add git_repo local_path`         gitフォルダーに.gitmodulesが生成される

* clone

> git submodule initする前に確認できること
git submodule         `-hash-key   submodule name(submoduleがまだregisterしていない)`
.git/config           `submoduleに関しての情報がない(submoduleがまだregisterしていない)`

* submodule list

> git ls-files --stage | grep 160000

* 後悔する

> git cherry-pick
http://te2u.hatenablog.jp/entry/2013/11/02/130740
git cherry-pick -m 1 SHA
マージされたやつをrevertされたので、そのコミットをもう一度コミットする

* あるコミットから指定されたファイルを復元する

> git checkout commit -- FILE_PATH でファイルが今いるブランチに復元されてステージされます。

* submoduleのクロンいろいろ

> 
git submodule update --init  = git submodule init && git submodule update
git submodule --recursive    = 素晴らしすぎる存在
git submodule  foreach --recursive  |  tail  -r | sed 's/Entering//' | xargs -I% cd % ; git add -A \& git commit

参照資料: 
[Git Submodule功能](http://www.kafeitu.me/git/2012/03/27/git-submodule.html)
[レポジトリにsubmoduleの追加](http://rcmdnk.github.io/blog/2013/10/18/computer-git/)
[一括commit](http://stackoverflow.com/questions/14846967/git-submodule-foreach-robust-way-to-recursively-commit-a-child-module-first)

###branch
git remote show origin
git remote prune origin
[Gitでリモートの共有リポジトリにあるブランチを消す時のメ](http://longkey1.net/blog/2011/02/23/delete-git-remote-branch/)

>
####remote branch一括削除(master以外)
```
for b in `git ls-remote -h origin | cut -f2 | sed -e 's/refs\/heads\///' | grep -v 'master'`; do git push --delete origin $b; done;
```
####local branch一括削除(master以外)
```
for b in `gbr | grep -v master`; do gbr -d $b; done
```

##マージ
[git stash popでコンクリフトした時の解決方法](http://chulip.org/entry/20120831/1346381439)

##gitツール
###git自動更新
```shell-session
WORKSPACE=$(cd $(dirname $0)/../;pwd)

source ~/.bash_profile
cd $WORKSPACE
remote_sha=$(git ls-remote origin HEAD | cut -f1)
local_sha=$(git log -1 --pretty=format:%H)

# 変更がある時、ソースを更新する
if [ $remote_sha != $local_sha ]; then
-   git pull origin master
-   git submodule update --init
fi
```
Arch Linux の PKGBUILD を cURL して見るシェル関数

これを .zshrc とか .bashrc とかにコピペするなりしてください。

```bash
pkgbuild-preview () {
    if [ `curl -LI "https://projects.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?h=packages/$1" -o /dev/null -w '%{http_code}\n' -s | grep 200` ] ; then
        curl "https://projects.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?h=packages/$1" | less
    else
        curl https://aur.archlinux.org/packages/`echo $1|sed -e "s/^\(.\{2\}\).*/\1/"`/$1/PKGBUILD | less
    fi
}
```

## 使用例
```
% pkgbuild-preview bash # 公式レポジトリ
% pkgbuild-preview mikutter # AUR
```
これでいい感じに less した奴が見られると思います。
netstatで接続数カウント

### 接続状態の確認と接続元IPのカウントをnetstatで行う。

80番ポート状態カウント

```
netstat -tan | grep ':80 ' | awk '{print $6}' | sort | uniq -c

      2 ESTABLISHED
      1 LISTEN
     18 TIME_WAIT
```

接続元ホストカウント

```
$ netstat -tan | grep ':80 ' | awk '{print $5}'  | cut -d : -f1 | sort -n | uniq -c | sort -n

      1 0.0.0.0
      1 1.78.2.xx
      1 180.9.50.xx
      1 182.249.240.xx
      1 182.249.246.xx
      1 203.139.205.xx
      1 210.147.29.xx
      1 221.191.193.xx
      1 27.142.240.xx
      1 61.125.133.xx
      2 221.189.114.xx
      2 49.98.130.xx
      2 59.128.83.xx
      2 66.249.79.xx
      6 60.138.174.xx
```
金貨が本物かどうか見極める

# CodeIQ の問題を解く

一年以上前の問題ですが CodeIQ に掲載された機械学習の問題をひとつ解いてみます。

「機械学習基礎」簡単な問題を解いて理解しよう！前篇
http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002315

これの第一問にチャレンジです。

## 線形分離問題

### 問題

```
週末に海賊船で催されたPRML読書会に参加したN君は、船内に山のように積まれた金銀財宝に目を奪われました。 近くにあった宝箱の1つを開けてみると、きらきらと輝くコインが何枚も入っていました。
手に取ってみるとどれもずっしりと重みがあります。金貨に違いありません。
好きなだけ持って帰ってよいと言われ、勉強会帰りに何枚か鞄に詰め込んで帰ることにしました。
家に帰ってから少し冷静になったN君は「気前よく配っていたけれど、この金貨は本物なのだろうか」と疑い始めました。
鞄には20枚の金貨が入っていましたが、友人のアルキメデスに計測してもらったところ、20枚とも体積も重さも異なりました。
ネットで検索してみたところ、金貨の体積と重さと真贋のデータを得られました。
このデータを参考に、貰ってきた金貨の真贋を見分けてください。
```

元記事にある通り、綺麗に線形分離できそうなデータです。

いつも通り scikit-learn を使って解きます。

### データの読み込み

```py3
import numpy as np
from sklearn.svm import LinearSVC
import matplotlib.pyplot as plt

auth = np.genfromtxt('CodeIQ_auth.txt', delimiter=' ')

# 教師データ
train_X = np.array([[x[0], x[1]] for x in auth])
# 教師データのラベル
labels = [int(x[2]) for x in auth]

# テストデータ
test_X = np.genfromtxt('CodeIQ_mycoins.txt', delimiter=' ')
```

### データ可視化

まずはデータをプロッティングしてみます。

```py3
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

# 教師データから正解を抽出
correct = np.array([[x[0], x[1]] for x in auth if x[2] == 1]).T
# 同じくニセモノを抽出
wrong   = np.array([[x[0], x[1]] for x in auth if x[2] == 0]).T

# これらを散布図にプロッティングする
ax1.scatter(correct[0], correct[1], color='g')
ax1.scatter(wrong[0],   wrong[1],   color='r')
ax2.scatter(train_X.T[0], train_X.T[1], color='b')
ax2.scatter(test_X.T[0],  test_X.T[1],  color='r')

plt.legend(loc='best')
plt.show()
plt.savefig("image.png")
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/30319de7-33d6-efb6-cd98-923ea7665508.png)

上図の緑が正解、赤がニセモノの金貨です。元記事のプロット通りですね。

下図は真贋データ (青) に対する、手に入れた金貨 (赤) の分布となります。

### 解法

線形分離問題なので LinearSVC を使います。

```py3
clf = LinearSVC(C=1)

# 訓練
clf.fit(train_X, labels)

# 分類
results = clf.predict(test_X)
for result, feature in zip(results, test_X):
    print(result, feature)
```

### 結果

```
1 [  0.988  17.734]
0 [ 0.769  6.842]
0 [ 0.491  4.334]
1 [  0.937  16.785]
1 [  0.844  13.435]
0 [ 0.834  9.518]
1 [  0.931  16.62 ]
1 [ 0.397  6.705]
1 [  0.917  16.544]
0 [ 0.45   3.852]
0 [ 0.421  4.612]
1 [ 0.518  9.838]
1 [  0.874  14.113]
0 [ 0.566  6.529]
0 [ 0.769  8.132]
1 [  1.043  16.066]
0 [ 0.748  9.021]
0 [ 0.61   6.828]
0 [  1.079  12.097]
1 [  0.771  13.505]
```

左側の 0 1 が解答になります。というわけで、例と同じ解答を得られるに至りました。
MacOSX(10.9) + Sublime Text 3 + Compass 環境を作る

備忘録です．
Sublime Text 3, Package Controll は導入済みを仮定してます．

# 環境

+ MacOSX 10.9
+ Sublime Text 3
+ Sass 3.2.19
+ Compass 0.12.6
+ rbenv 環境です．

# Sass, Compass のインストール
Sass, Compass をインストールする前にRuby Gems のアップデートを行います．
`sudo gem update --system`

無事終わったらCompassをインストールします．
ちなみに，Compassをインストールする際Sassは一緒にインストールされます．
`sudo gem install compass`
`rbenv rehash`

一応動作確認もします．
`sass -v`
`compass -v`

# Sublime Text 3 へパッケージの追加
Sublime Text 3 から.scssファイルをコンパイルするための準備をします．
`Command + Shift + p` + `install` + 以下

+ Sass
+ SASS Build
+ Scss
+ Compass

ちゃんと入ったかどうかは，`Command + Shift + p` + `List Package` で確認できます．

次にCompassのビルド設定ファイルにMacOSX用のPathを追記します．
`Command + Shift + p` + `List Package` + `Compass` を選択します．
Finderが開くので，`Compass/Compass.sublime-build`を探して以下を追記します．
`"osx" {"path": "/usr/local/bin:/Users/username/.rbenv/shims:$PATH" }`

# コンパイルしてみる
まず，任意の場所で適当にディレクトリを作成します．今回はsampleにします．
次にsample以下にsassディレクトリとCompassの設定ファイルを作成します．
設定ファイルは真似して書いちゃえばいいです．

```rb:config.rb
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "css"
sass_dir = "sass"
images_dir = "images"
javascripts_dir = "js"
output_style = "expanded"
```
Sublime Text 3に戻って`Project -> Save Project As...` で
先ほど作成したsample以下を指定してプロジェクトを作成します．

適当にscssファイルを作成してsample/sass以下に保存します．

```scss:style.scss
@import "compass"

div {
  width: 200px;
}
```
最後に，`Command + b` でコンパイルをします．
sample/css以下にstyle.cssというファイルが生成されていればおしまいです．

# ひとこと
誰かがさっき歌ってたSOS!!が，頭の中でCSS!!CSS!!ほらほら呼んでいるよ〜に置き換わってループしててこわたん
CentOS 6.5でLeoFSがmakeできない

**[2014/07/02追記]この記事のエラーのworkaroundをコメントにて指摘されています。また、公式ドキュメントにもこのworkaroundが載る予定とのことです。**

**[2014/07/03追記]コメントにて教えていただきました、workaroundが公式ドキュメントにも反映されています。この記事よりも公式ドキュメントを参考にしてください。**

# 概要
LeoFSを入れなおしているのだが、CentOS 6.5だとleofsをmakeしたときにエラーが出る。erlang関連っぽいが、よくわからない。

```
[leofs@centos leofs]$ make
Uncaught error in rebar_core: {'EXIT',
                               {undef,
                                [{crypto,start,[],[]},
                                 {rebar,run_aux,2,
                                  [{file,"src/rebar.erl"},{line,165}]},
                                 {rebar,main,1,
                                  [{file,"src/rebar.erl"},{line,58}]},
                                 {escript,run,2,
                                  [{file,"escript.erl"},{line,747}]},
                                 {escript,start,1,
                                  [{file,"escript.erl"},{line,277}]},
                                 {init,start_it,1,[]},
                                 {init,start_em,1,[]}]}}
make: *** [deps] Error 1
```

# 解決策
[LeoFS - The Lion of Storage Systems](http://leo-project.net/leofs/download.html)

LeoFSサイドが用意しているパッケージを入れる。

```
$ sudo rpm -ivh http://leo-project.net/leofs/packages/rpm/x86_64/leofs-1.0.2-1.x86_64.rpm
```

再起動してみたが、治らない。openssl関連の問題だという情報を掴んだので、入れてみたが、治らなかった。

```
$ yum install http://mirror.centos.org/centos/6/os/x86_64/Packages/openssl-1.0.1e-15.el6.x86_64.rpm
```

なんかerlangのversionを新しくすると治るというページが有ったので、17.1をいれる。

```
$ cd /usr/local/src
$ wget http://www.erlang.org/download/otp_src_17.1.tar.gz
$ tar xzvf otp_src_17.1.tar.gz
$ cd otp_src_17.1
$ ./configure --prefix=/usr/local/erlang/17.1 \
              --enable-smp-support \
              --enable-m64-build \
              --enable-halfword-emulator \
              --enable-kernel-poll \
              --without-javac \
              --disable-native-libs \
              --disable-hipe \
              --disable-sctp \
              --enable-threads \
              --with-libatomic_ops=/usr/local
$ make
$ make install
$ vi ~/.bashrc

export PATH=$PATH:/usr/local/erlang/17.1/bin

```

~~上記でmake通った。~~ 最初のエラーは消えたが、結局leofs側で、erlangは15or16使えと怒られた。

R15B03でいけた…
疲れた
プログラミング初心者の勉強方法について

[前回の投稿](http://qiita.com/cervomansan/items/b08b3a9f5c7fc6a957a8)から数日経っていますが毎日、何かしらのJavaScriptを書いています。勉強開始から2週間が経ちました。まだまだ振り返るには早すぎるのかもしれませんが、勉強方法について少し疑問を持ち始めたので書いてみます。

#プログラミングの勉強とは？
私は小さい頃から運動神経が良さに恵まれてスポーツが得意です。どんなスポーツにも共通していることは **思い通りに体を動かせるかどうか** に尽きます。武井壮さんが同じことを言っていたのを見て、とても共感できました。思い通りに体を動かせるとスポーツの専門的な技術練習に時間をさほど費やさなくとも、普通の人以上のパフォーマンスは発揮できるんです。

そして、最近考えるのがプログラミングにおける **思い通りに動かせる** 部分というのは何にあたるのだろうということです。ここ1週間は写経に近いことをやりました。写経といっても、ただ写すのでは効果が低いことは想像できたので意味や動きを考えながら動画やソースを見ないで完成させることを試しました。

##ソースを見ない写経の効果
```Math.floor(Math.random() * xxx.length);```を利用する簡単なおみくじ、```new Date().getTime();```で現在までの経過ミリ秒との差を求めることで誕生日からの経過日数の取得、```setTimeout(function() { xxx(); ), 100};```を利用した1秒ごとに更新させるタイマーの表示なら何も考えずに作ることができるようになりました。右も左もわからなかった2週間前から見れば夢のようです。しかし、2週間という時間と効果を考えると、この方法をこのまま続けてよいものかどうか凄く不安になります。

##プログラミングの基礎
スポーツの話で **思い通りに体を動かせるかどうか** と書いたようにプログラミングにも何か基礎的なものがあるのではないかと感じ始めました。どんな言語にも共通するような根っこの考え方のようなものです。近道を探して楽をしたいという気持ちではなく、根っこの部分を鍛えたいと考えています。ソースを見ない写経は文字の打ち方を間違えなければよいだけの話で、それはスポーツでいうところのカーブのかけ方やルールに相当する気がします。

```new Date().getTime```と書いて書き方が間違っているというエラーが出ても、それは書き方のルールを覚えているかどうかの話で、書き直せばいいだけですし忘れていれば調べるだけで済みます。それはプログラミングの基礎力とはまた別の話ではないでしょうか。ソースを見ない写経を繰り返していて同じところで、つまずき「また忘れていた」と感じたときに今やっていることは暗記に近いのではないのかと疑問を抱きました。物事を覚えることを軽く考えているわけではありませんが、暗記に時間を費やすことは遠回りのような気がするんです。かといって、どういう方法をとれば基礎が身につくのか全くわかりません。わからないからと立ち止まっていても時間がもったいないので、何かしら触っている毎日です。

##質問です
Qiitaはプログラミングの情報を共有する場所らしいので、こういうエントリーは場違いかもしれませんがプログラミングの先輩である、みなさんの勉強当初の経験や考えをお聞かせ願えませんでしょうか？
javascript継承(prototypeとconstructor)

##prototypeとconstructor##
```js
var Func = function () {};
var func_obj = new Func();
```
* prototypeはFuncクラスの属性
> 
func_objはオブジェクトなので、prototype => \__proto__

* constructorはprototypeの属性、かつconstructorはFuncを指している
>
Func.prototype.constructor === func_obj.constructor  => true

* クラス判断
>
func_obj.constructor === Func   <===> func_obj instanceof Func

参照資料
[揭开Javascript属性constructor/prototype的底层原理](http://blog.csdn.net/hikvision_java_gyh/article/details/8937157)
Node.js+MySQLの開発で、MySQL側でBIGINTで定義していたカラムのセレクトでハマった話


Node.jsでMySQLに接続してセレクトした時の話。

`MySQL側でBIGINTで定義していたカラムから情報を取得したときに上手く変数に値が入ってくれなくてハマりました。`

console.log()で調べてみると中身が'9379140374103748913'だったのが'9379140374103700000'みたいな形で途中から0になっていました。
Javascriptではnumber型という型に整数は入りますが、10の15乗桁くらいまでしか表現出来ないらしいです。それが原因でこいう現象になったのかも。

参考: [データ型 (JavaScript)](http://go.shr.lc/VAJSaO)
参考: [JavaScript 型の解説 - Wikibooks](http://go.shr.lc/1jDR0Iw)

##MySQLでキャスト変換してセレクトしてくることで解決
ということで、javascirptで処理する前にキャスト変換して文字列として取得してみます。(今回の実装はそれだけで問題回避出来たので)

###例えば,hoge_idのカラムがBIGINT型だったとして、
元々のセレクト文は
`select user_id, hoge_id from my_table where user_id = 1;`こんな感じです。

###cast関数を使ってcharに変換します
```
select user_id, cast(hoge_id as char) from my_table where user_id = 1;
```
これでhoge_idの値を文字列で取得することが出来ました!

参考: [MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.8 キャスト関数と演算子](http://go.shr.lc/1m3lJTq)

###カラム名をもとのものに合わせる

↑の書き方だとcast(hoge_id as char)というカラムで取得してしまうので、asでhoge_idにエイリアスを組みます。

```
select user_id, cast(hoge_id as char) as hoge_id from my_table where user_id = 1;
```

参考: [カラムに別名(AS句)](https://wlan.m-zone.jp/wlan/portal.jsp)


なんか勉強になりました。
Spray: 静的ファイルの目次を出したい


Sprayで静的ファイルを表示したい場合は `src/main/resouces` にファイルを置く。

```console
% tree src/main/resources/test/
src/main/resources/test/
├── a.html
├── b.html
└── index.html
```

`getFromBrowseableDirectory` ディレクティブを使うことで、静的ファイルを置いてある特定のディレクトリのインデックスを自動生成することができる。

```scala
...
pathPrefix("test") {
  compressResponse() {
    getFromBrowseableDirectory(getClass.getResource("/test").getPath)
  }
} ~
...
```

インデックスページの様子:

![Index_of__test_.png](https://qiita-image-store.s3.amazonaws.com/0/889/cc88cb73-a4db-479b-f430-b99a9b36e15e.png "Index_of__test_.png")


`index.html` はSprayではただのいちファイルでしかないので、Apacheのように目次ページとして使われることはないみたい。

単にディレクトリを公開したいだけであれば `getFromResourceDirectory` を使ってもいい。

```scala
pathPrefix("test") {
  compressResponse() {
    getFromResourceDirectory("test")
  }
} ~
```

ちなみに配置したファイルはコンパイル時に、`target/scala-2.10/classes` にコピーされるので、ファイルを変更した時はコンパイルし直す必要がある。
PostgreSQL の timestamp with time zone の等価判定について


とあるプロジェクトで PostgreSQL を利用していて、日時を主キーの一部に利用しているテーブルがありました。

そのカラム型が TIMESTAMP WITH TIME ZONE だったので、ふと「あれ？これってタイムゾーンが違う場合は違うレコードになるのかな？」と思って試してみたのでメモしておきます。

## 問題のテーブル

問題となったテーブルは以下のような感じです。本当は他にもっとカラムがたくさんあるんですが、今回は必要ないので割愛しています。
よくある受発注を扱うようなシステムで、「【注文】はある【商品】を【いつ注文したか】で一意に識別できる」という前提のもとで`product_id`と`ordered_at`を主キーにしていました。

```psql
postgres=# CREATE TABLE orders ( product_id integer, ordered_at timestamp with time zone, CONSTRAINT pkey PRIMARY KEY (product_id, ordered_at) ) ;
CREATE TABLE

postgres=# \d orders 
               Table "public.orders"
   Column   |           Type           | Modifiers 
------------+--------------------------+-----------
 product_id | integer                  | not null
 ordered_at | timestamp with time zone | not null
Indexes:
    "pkey" PRIMARY KEY, btree (product_id, ordered_at)
```

さて、ご覧の通り、`ordered_at`のデータ型は`timestamp with time zone`となっており、時刻だけでなくタイムゾーン情報も含みます。この場合、同じ時刻だけどタイムゾーンが違う場合には主キー制約違反になるのだろうかというのが冒頭の問題です。

## そもそも timestamp with time zone って？

その名の通りですが、時刻にタイムゾーン情報も含めて保持するデータ型です。
timestamp without time zone という型もあり、PostgreSQL では別の型として扱われます。

PostgreSQL の Date/Time 関係のデータ型には以下のページを参照してください。
http://www.postgresql.jp/document/9.3/html/datatype-datetime.html

## 早速試してみた

まずは商品 ID が 1 の商品に対して注文レコードを作ってみます。

```psql
postgres=# INSERT INTO orders (product_id, ordered_at) VALUES (1, '2014-07-01 14:00:00') ;
INSERT 0 1
```

僕の手元の Mac ではタイムゾーンが JST になっているので特にタイムゾーンを明示していない上記のクエリは
 JST 扱いでレコード登録されているようです。

```psql
postgres=# SELECT product_id, ordered_at FROM orders ;
 product_id |       ordered_at       
------------+------------------------
          1 | 2014-07-01 14:00:00+09
(1 row)
```

次に UTC を指定して注文をしてみます。

```psql
postgres=# INSERT INTO orders (product_id, ordered_at) VALUES (1, '2014-07-01 14:00:00 UTC') ;
INSERT 0 1
postgres=# SELECT product_id, ordered_at FROM orders ;
 product_id |       ordered_at       
------------+------------------------
          1 | 2014-07-01 14:00:00+09
          1 | 2014-07-01 23:00:00+09
(2 rows)
```

JST に変換されて登録されました。

あれ、ということは…？

```psql
postgres=# INSERT INTO orders (product_id, ordered_at) VALUES (1, '2014-07-01 05:00:00 UTC') ;
ERROR:  duplicate key value violates unique constraint "pkey"
DETAIL:  Key (product_id, ordered_at)=(1, 2014-07-01 14:00:00+09) already exists.
```

同時刻のレコードを登録しようとしたら主キー制約違反となりました。

## PostgreSQL のドキュメントを参照

http://www.postgresql.jp/document/9.3/html/datatype-datetime.html

> timestamp with time zoneについて内部に格納されている値は常にUTCです（協定世界時、歴史的にグリニッジ標準時GMTとして知られています）。 時間帯が明示的に指定された入力値は、その時間帯に適したオフセットを使用してUTCに変換されます。 入力文字列に時間帯が指定されていない場合は、システムのTimeZoneパラメータに示されている値が時間帯とみなされ、timezone時間帯用のオフセットを使用してUTCに変換されます。

とのことで、内部的には UTC で保持しているらしいですね。

逆に言えば入力時のタイムゾーンはデータとして残らないということになります。
時刻は時刻であってそれ以上の情報は別途データとして記録できるように設計しないとダメということですね。例えば、その注文をおこなったのが日本支社のオペレータかイギリス支社のオペレータか等をタイムゾーンから判断することもできるかと思っていましたが、そんなことはないようです。

## 最後に

そもそも時刻を主キーにしてんじゃねーよ！というツッコミはここでは受け付けません。(笑)
自然キーが見つからず、かと言ってサロゲートキーを設定するほどグローバルに識別する必要性が低い場合、何を主キーとして選択するかは結構難しい課題だと思ってます。

今回の例は「注文」なので「注文番号」のようなキーはありそうですが、トランザクション系のテーブルだと登録日時を主キーに含めたりしますよね？（え、しない？ｗ
[Ansible] コマンドチートシート

#Ansibleとは
ChefやPuppetになどに代表される構成管理ツールのひとつ。

##Ansibleチートシート

### yum でのインストール
```yaml
- name: Install git
  yum: name=git state=latest
```

### github からの clone
```yaml
- name: clone ffmpeg
  git: repo=git://source.ffmpeg.org/ffmpeg.git dest=/tmp/ffmpeg
  sudo: yes
  poll: 30
  async: 600
```
poll と async は処理に時間が掛かる場合にタイムアウトしないように付ける。

### filesディレクトリにあるファイルをコピー
``` yaml
- name: create sshd_config
  copy: src=sshd_config dest=/etc/ssh/sshd_config mode=600
  sudo: yes
```

### templatesディレクトリにあるファイルをコピー
``` yaml
- name: Copy httpd.conf
  template: src=httpd.conf dest=/etc/httpd/conf/
  sudo: yes
```

### ファイルをコピーしたときに、所有者・グループ・パーミションを指定する
owner、group、mode をつける

``` yaml
- name: create install.sh
  copy: src=install.sh dest=/home/myuser/scripts/ owner=myuser group=mygroup mode=755
  sudo: yes
```

### ファイルをダウンロード
``` yaml
- name: download php
  get_url: url=http://jp1.php.net/get/php-5.3.28.tar.gz/from/this/mirror dest=/tmp
```

### エラーを無視
下記を追加する

``` yaml
  ignore_errors: yes
```

### 特定のディレクトリにcdしてコマンド実行
chdir=*** をつける

```yaml
- name: make qmail
  command: make chdir=/tmp/qmail-1.03
  sudo: yes
```

### ループ処理
```yaml
- name: create dirs
  command: mkdir -p /tmp/{{item}}
  sudo: yes
  with_items:
      - dir_a
      - dir_b
      - dir_c
      - dir_d
```

## その他
ここも参考になる
http://inforno.net/articles/2013/10/15/ansible-tips
私のChrome Extension


私が使っているChrome Extensionを一覧してみた。
上からよく利用している順です。下の方はほぼ使ってないのもあります。

## META SEO inspector

https://chrome.google.com/webstore/detail/meta-seo-inspector/ibkclpciafdglkjkcibmohobjkcfkaef

## Page Analytics (by Google)

https://chrome.google.com/webstore/detail/page-analytics-by-google/fnbdnhhicmebfgdgglcdacdapkcihcoh

## PixelGuide

https://chrome.google.com/webstore/detail/pixelguide/icgkmjbgjfhaofgfgolkeghoincaibhj

## Vimium

https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb

## EditThisCookie

http://www.editthiscookie.com/

## JSONView

https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc

## JavaScript Errors Notifier

https://chrome.google.com/webstore/detail/javascript-errors-notifie/jafmfknfnkoekkdocjiaipcnmkklaajd

## Google Publisher Toolbar

https://chrome.google.com/webstore/detail/google-publisher-toolbar/omioeahgfecgfpfldejlnideemfidnkc

## Eye Dropper

https://chrome.google.com/webstore/detail/eye-dropper/hmdcmlfkchdmnmnmheododdhjedfccka

## Emoty

https://chrome.google.com/webstore/detail/emoty/kgljgnbhcigffgoifhjbbifhbdkapmgm

## MISAWA::MD

https://chrome.google.com/webstore/detail/misawamd/legplkhbgdelfceignhcchogkmoflagl

## Speed Tracer

https://chrome.google.com/webstore/detail/speed-tracer-by-google/ognampngfcbddbfemdapefohjiobgbdl

## SPDY indicator

https://chrome.google.com/webstore/detail/spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin

## Ruby on Rails API Search

https://chrome.google.com/webstore/detail/ruby-on-rails-api-search/nbhhppofdccphcpbilanmljnlkmbgike

## PageSpeed Insights

https://developers.google.com/speed/docs/insights/using_chrome

## Awesome Screenshot

https://chrome.google.com/webstore/detail/awesome-screenshot-captur/alelhddbbhepgpmgidjdcjakblofbmce

## ハングアウト

https://chrome.google.com/webstore/detail/hangouts/nckgahadagoaajjgafhacjanaoiihapd

## goo.gl URL Shortener

https://chrome.google.com/webstore/detail/googl-url-shortener/iblijlcdoidgdpfknkckljiocdbnlagk

## Google Cast

https://chrome.google.com/webstore/detail/google-cast/boadgeojelhgndaghljhdicfkmllpafd

## Evernote Web Clipper

https://chrome.google.com/webstore/detail/evernote-web-clipper/pioclpoplcdbaefihamjohnefbikjilc

## LiveReload

https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei

## Chrome リモート デスクトップ

https://chrome.google.com/webstore/detail/chrome-remote-desktop/gbchcmhmhahfdphkhkmpfmihenigjmpp

## Docs PDF/PowerPoint Viewer

https://chrome.google.com/webstore/detail/docs-pdfpowerpoint-viewer/nnbmlagghjjcbdhgmkedmbmedengocbn
Selenium2: RemoteWebDriverでスクリーンショットを撮影する



`RemoteWebDriver` はそのままではスクリーンショットが取れない。`RemoteWebDriver` は `TakesScreenshot` インターフェイスを実装していないためだ。そこで、 `Augmenter` を使って、ドライバのインスタンスに `TakesScreenshot` が実装される。

```scala
import org.openqa.selenium.{ OutputType, TakesScreenshot }
import org.openqa.selenium.remote.{Augmenter, RemoteWebDriver}

val driver = new RemoteWebDriver(...)
val screenshot = new Augmenter().augment(driver).asInstanceOf[TakesScreenshot].getScreenshotAs(OutputType.BASE64)
```

なお、この例ではスクリーンショットを Base64 形式で取得するようにしているが、直接ファイルに落とすこともできる。
ブラウザ画面をフルスクリーン表示するブックマークレット

# 画面全体をフルスクリーン表示

以下をブックマークレットに登録して実行すると、`ctrl+0`でフルスクリーン表示できる。

```js
javascript:var a=document.documentElement,b='RequestFullScreen';a.addEventListener('keydown',function(e){e.which==48&&e.ctrlKey&&(a['ms'+b]?a['ms'+b]():a['moz'+b]?a['moz'+b]():a['webkit'+b]())});
```

* Firefoxでは直接`mozRequestFullScreen()`が実行できないため`keydown`内から呼び出し
* ChromeとSafariでは、フルスクリーン中は入力できない仕様
* Chromeに限って`webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)`と変更すれば入力可能
* 古いバージョンでは動作しない。IE, Operaでは試してすらいないので動くか不明。

# 任意のエレメントのみフルスクリーン

例としてはあまり良くないが、以下のようにすればQiitaの編集画面のみフルスクリーン表示で編集できる。（Chrome専用）

```js
javascript:document.querySelector('form.draftForm').webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
```

こんな感じで画面いっぱい使える。

![スクリーンショット 2014-06-30 21.52.11.png](https://qiita-image-store.s3.amazonaws.com/0/14471/cffcb4a2-3817-78aa-8190-ab99aa020f23.png)
hubot + ぐるなびAPIで飲食店検索

## Installation

```
$ npm install hubot-harahe --save
```

インストールしたら `harahe.coffee` を編集して API Key と検索アドレスを入力してください。


https://www.npmjs.com/package/hubot-harahe


## scripts/harahe.coffee

```coffeescript
# Description:
#   Get restaurant data from Gurunavi API
#
# Commands:
#   hubot harahe - Reply with restaurant info

Client = require("node-rest-client").Client
client = new Client()
parseString = require('xml2js').parseString

apiHost     = 'http://api.gnavi.co.jp/RestSearchAPI/20150630/?'
keyId       = 'YOUR API KEY ID'
address     = '福岡県福岡市博多'
hitPerPage  = 1

module.exports = (robot) ->
  robot.respond /HARAHE ?(.*)$/i, (msg) ->
    attr = msg.match[1].trim()
    address = attr if attr != ""
    req = "#{apiHost}keyid=#{keyId}&hit_per_page=#{hitPerPage}&offset_page=1&address=#{encodeURIComponent(address)}"

    client.get req, (data, response) ->
      parseString data, (err, result) ->
        totalCount = result['response']['total_hit_count']
        offsetPage = Math.floor Math.random() * totalCount
        req = "#{apiHost}keyid=#{keyId}&hit_per_page=#{hitPerPage}&offset_page=#{offsetPage}&address=#{encodeURIComponent(address)}"

        client.get req, (data, response) ->
          parseString data, (err, result) ->
            items = result['response']['rest'][0]
            msg.send "Recommend: #{items['name']}"
            msg.send "Category: #{items['category']}"
            msg.send "Address: #{items['address']}"
            msg.send "URL: #{items['url']}"
            msg.send "Image: #{items['image_url'][0]['shop_image1']}"
```


https://gist.githubusercontent.com/taketin/146d1412d11f5596770b/raw/harahe.coffee

※ `total_hit_count` 取得するためにAPI2回叩いてるのがエコじゃない..

## Usage

### get ぐるなびAPI key id
http://api.gnavi.co.jp/api/use.html

### run hubot

```
# default address
hubot harahe

# with address
hubot harahe 福岡市天神
```

enjoy!
Configuration for Akka application


akkaでアプリケーションを作るときに設定値の読み込みをどうするか、という話。

1. akka.actor.Extension
=======================

`akka.actor.Extension` を使って各アクターで共通化させることができる。

```scala
import akka.actor.{ExtendedActorSystem, Extension, ExtensionId}

class SampleExtentionImpl(system: ExtendedActorSystem) extends Extension {
  val hoge = "HOGE"
}

object SampleExtension extends ExtensionId[SampleExtensionImpl] {
  def createExtension(system: ExtendedActorSystem) = new SampleExtensionImpl(system)
}
```

Extensionを定義しておくことで、アクターから呼び出すことができる。

```scala
import akka.actor.Actor

class SampleActor extends Actor {
  val ext = SampleExtension(system)

  def hoge = ext.hoge //=> "HOGE"
}
```

手っ取り早い方法ではあるが、ExtensionIdのオブジェクトを直接呼ぶ必要があり、実行時切り替えなどには向かない。
また、Actorクラス以外では`system: ActorSystem`がないと利用できない。

主にActorSystemにおける共通処理の集約やシングルトンな処理に向いている気がする。

2. TypesafeConfig
=================

akkaはデフォルトで`reference.conf`と`application.conf`をクラスパスから読み込み、`system.settings.config`から利用可能にしている。

cf. http://doc.akka.io/docs/akka/2.3.4/general/configuration.html

書式はTypesafeがライブラリとして提供するHOCON(Human-Optimized Config Object Notation)というものになる。

Actorクラスであれば先述したように`system.settings.config`から取得できるが、他クラスではsystemが無いため利用できない。
直接初期化時の引数に渡すこともできるが、configに依存したクラスであることを明示するため、DIを試みる。

```scala
import com.typesafe.config.Config
import akka.actor.ActorSystem

// configを定義するtrait
trait ConfigSupplier {
  val config: Config
}

// configから読み込む設定情報の実装
trait DatabaseSetting { this: ConfigSupplier =>
  import scala.util.Try
  val dbHost = Try(config.getString("sample.db.host")).getOrElse("localhost")
  val dbPort = Try(config.getInt("sample.db.port")).getOrElse(5432)
}

// 設定情報を利用するクラス
class SampleApplication { this: DatabaseSetting =>
  val connection = getConnection(dbHost, dbPort)
}

object Main extends App {
  val system = ActorSystem()

  // インスタンス化のときに配線と注入
  val app = new SampleApplication with DatabaseSetting with ConfigSupplier {
    val config = system.settings.config
  }

  //...
}
```
Peco & ec2list で快適にEC2インスタンスにSSHする

「[AWSのAPIをカジュアルに](https://speakerdeck.com/naoya/awsfalseapiwokaziyuaruni)」の 24 ページ目に"Unix的な小道具を作る"とあるのですが、これがとても便利そうでした。
何をするのかというと EC2 インスタンスの一覧を取得し、選択したホストに SSH します。
というわけでさっそく Zsh に設定してみました。

## 事前準備
「[IAM Management Console](https://console.aws.amazon.com/iam)」に登録して API のアクセスキーを発行し、`~/.aws/config` に保存しておく。
この時に role をあたえていなくて API にアクセスできていなかったので要注意。

## Peco をインストール

Homebrew を使っている場合

```
$ brew tap peco/peco
$ brew install peco
```

Go の環境がある場合

```
$ go get github.com/peco/peco/cmd/peco
```

## ec2list をインストール

```
$ gem install ec2list
```

(※) ec2list は memoize しているので毎回リクエストが発生するわけではありません。


```
$ ec2list
```

これで一覧が表示されていれば成功です。
default 以外の profile を使用する場合は以後、 s/ec2list/ec2list --profile [profile名]/ で置換してください。
エラーがでる場合は Policy の設定がおかしいか、`~/.aws/config` の設定がおかしいかだと思います。


## Zsh の設定

```
$ ec2list | peco | cut -f 3 | xargs -o -n 1 ssh
```
このコマンドで選択したホストに SSH ができれば成功です。
毎回これを実行するのもめんどくさいので alias か、もしくは keybind を設定しておけば幸せになれるかと思います。


### alias


```~/.zshrc
alias peco-ec2ssh="ec2list | peco | cut -f 3 | xargs -o -n 1 ssh"
```

### keybind


```~.zshrc
function peco-ec2ssh() {
  echo "Fetching ec2 host..."
  local selected_host=$(ec2list | peco | cut -f 3)
  if [ -n "${selected_host}" ]; then
    BUFFER="ssh ${selected_host}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-ec2ssh

bindkey '^q' peco-ec2ssh
```

こうすることによって `^q` を押せば SSH できるようになりました。
便利ですね。

Peco と ec2list の組み合わせでやりましたが、[ec2ssh](https://github.com/mirakui/ec2ssh) と `grep -E '^Host[[:space:]]+[^*]' ~/.ssh/config | peco | awk "{print \$2}" | xargs -o -n 1 ssh` の組み合わせでもいいと思います。

ではでは。
Google IO 2014で発表された Android L を実機に入れてみる


優しい[esmasui](https://twitter.com/esmasui)様が情弱なわかめさんにやり方教えてくれたのでメモしておく。
やると、端末が無保証になったり色々あると思うので、お金持ちで壊れたら新しいの買えばいいや。という人だけ鵜呑みにしてください。

1. N5かN7のイメージが[ここ](http://developer.android.com/preview/setup-sdk.html#installImage)にあるので拾ってくる。
2. 僕はN5のイメージを落とした。`hammerhead-lpv79-preview-ac1d8a8e.tgz`
3. 適当に解凍して、できたフォルダ`hammerhead-lpv79`にcdしておく。
4. 実機をUSBケーブルでPCにつないで`$ adb reboot bootloader`とすると端末が再起動する。
5. `$ fastboot oem unlock`でunlockされる(たぶん無保証になる)。
6. `./flash-all.sh`して待ってればおしまい。ちょっと怖いメッセージが流れてくけど我慢してほっといたら無事に終わった。
Windows7からvirtualboxをuninstallする

# 経緯
vagrantのsaharaが固まったのでctrl-cで停止したら、vagrant upが動かなくなった。半日以上かけて修復方法を試していたのだが、上手く行かなかった。発狂しながらも開発環境を構築しなおしていたら、disc容量が足りないとか言われて、拡張していたら、マネージャーが動かなかった。試行錯誤していたらvirtualbox自体が動かなくなった。みんなしねばいいのに。完璧にvirtualboxを消滅する必要がある。

# Documentations
[[Windows] How to uninstall, remove, or delete VirtualBox drivers (Bridged Networking driver, Host-Only Network Adapter driver, etc.) | Reviews, news, tips, and tricks | dotTechdotTech](http://dottech.org/101997/how-to-uninstall-virtualbox-drivers-on-windows/)

なんかこれ、最終的にやるやつな気がする。

# アンインストール
とりあえず、virtualboxを起動して、removeで仮想マシンをバッサバッサ消していく。

その後、コントロールパネル＞プログラムと機能＞プログラムのアンインストール＞Oracle VM VirtualBoxでアンインストールを試みる。すると、以下の様な症状がでて、とまる。virtualbox地雷すぎる。
[VirtualBoxをアップグレードしようとしたら”Installation failed! Error:インストール中に致命的なエラーが発生しました。”となってしまいインストールが進まない | Ultraひみちゅぶろぐ](http://ultrah.zura.org/?p=5980)

ifixitとかいうのの、今すぐ起動を押したら、windowsが再起動された。もうwindows怖すぎる

これで消えたのか？とりあえず、インストールをしてみる。

# 追記
新しいのをインストールしたら、上手くいったので、これでよかったっぽい。windowsアレルギー過ぎて、アンインストールだけで調べまくってしまった。
LPC1114をXtalで動かす

内蔵のIRCをmainclockにするのではなく、Xtalを繋いでシステムオシレータを動作させ、これをmainclockにしてみました。

http://nora66.com/mbed/cpuman.html#2014/07/01xtal

64MHzのオーバークロックでも動いた。
エライ！(笑)
Cocoapodsの任意のバージョンをインストールする


## WHY

チームでiOS開発を行っていると、みんなが同じCocoapodsのバージョンを利用しないとPodfile.lockの行末にあるバージョンに差異が出てしまいます。gitでcommitするときに差分が出てしまい不便なので、任意のバージョンを利用するようにしました。

執筆時点のCocoapodsの最新バージョンは`0.33.1`ですが、みんなの開発環境が`0.32.1`なのでダウングレードします。

## HOW

```Shell
$ pod --version
0.33.1

$ gem uninstall cocoapods --version '=0.33.1'
Successfully uninstalled cocoapods-0.33.1

$ gem install -v 0.32.1 cocoapods

$ pod --version
0.32.1

```
LPC1114のDIPとQFPの対応図

LPC1114のQFP版を使ってみました。
エクステンダへの配線50本ハンダ付け(^^;

で、DIPの足がQFPではどこになるのかを絵で描いてみました。

http://nora66.com/mbed/cpuman.html#1114dipqfp

しかしQFPは素直に動かなかった。
だってVDDとVSSが二カ所ずつあって、どっちもマジメに配線しないと駄目なんだもん。オラてっきりコモンかと思ってた･･･3日つぶしたっす。
LPC1114のクロック観察

LPC1114のクロックを観察してみました。

クロックや割り込みコントローラ、タイマーなんかは新しいCPUを使うときには結構面倒くさい部分ですよね。
でもmbedからExportしたクロック設定の関数が良くできてるんで、ちょっと追いかけたら結構分かってきたような･･･

CLKOUTピンにオシロを繋いで波形を見ながら色々いじってみました。

http://nora66.com/mbed/cpuman.html#2014/07/01clock
4時間でダイエットアプリを開発してみる(Angular.jsキャッチアップ)

##はじめに
やろうやろうと思っていたができなかったので、今更な感じだがAngular.jsを
キャッチアップしてみる。
ちなみに[こんなアプリ](http://smile-systems.com/diet/)を開発しました。
[英語はこちら](http://azumaxlife.smile-systems.com/archives/1035?lang=en)

##特徴
表面しか触れていませんが、MVCでちゃんと分けれる様になってる。
当たり前か。結構好印象。

##題材
最近ダイエットしてるので、体重記録アプリにします。

##開発時間
4時間くらいでできました。Angular.jsって簡単ですね。
ソースは自信をもって公開できませんが。

アプリとしてはかなり荒いですが、
下記を満たせているのであしからず。
１、とりあえず短時間でキャッチアップ
２、自分が最近思っている体重管理ができる

##手順の前にミスったこと
1. angularjsチュートリアル的なものと、githubからangularjs取得の方法で頭がコンフリクトした。
2. html5boilerplate使うより、grunt packageした後にできるテスト用アプリのほうが良かったので、再インストールになってしまった。

##手順
ここ見た。
https://docs.angularjs.org/misc/contribute

1. Angularjsを落としてくる
git clone https://github.com/angular/angular.js.git

2. angular.jsフォルダに移動

3. npm install
	
4. bower install
*みすった。入ってない。nodejsをインストールしているフォルダに移動し、下記コマンド実行後、
再度上記コマンド実行
npm install bower -g

5. grunt package

6. angularjs のテンプレート使ってみる。
 ng-app="アプリ名"
 ng-controller="コントローラ名"
 {{変数名}}
 こんな感じで使える。

７． モジュール入れてみる
d3.js, n3-charts/line-chart, ngStorage

##アウトプッ
<a href="http://smile-systems.com/diet/" target="_blank">こんな体重管理アプリになりました</a>

##最後に
DOM操作をしたら怒られるので、ちゃんと意識できると思いました。
モジュール入れようとするとngLocaleがありませんってよくわからないエラーが
出てきた。誰か教えてください。

アプリ自体はかなりドラフト版なので、記録以外ほとんどできません。
意見をいただければどんどん機能載せていきます。
peco-snippets

[peco/percolでCUIなスニペットツールを作ってみる - Glide Note - グライドノート](http://blog.glidenote.com/blog/2014/06/26/snippets-peco-percol/)
を簡単に管理出来るように、`history` から登録したり、指定行を削除するコマンドを追加して、拡張してみました。

```bash:.bashrc
peco-snippets() {
  local name="peco-snippets"
  local snippets="${HOME}/.snippets"

  local command="$1"

  _trim() {
    sed -i '' -E 's/^[[:blank:]]+//;s/[[:blank:]]+$//' "$snippets"
    sort -u -o "$snippets" "$snippets"
  }

  _peco_snippets() {
    _trim
    grep -v "^#" "$snippets" | peco
  }

  if [ "$command" = "add" ] ; then
    local NUM=$(history | wc -l)
    local FIRST=$((-1*(NUM-1)))

    if [ $FIRST -eq 0 ] ; then
      echo "No history" >&2
      return 1
    fi

    fc -l $FIRST | sort -k 2 -k 1nr | uniq -f 1 | sort -nr | sed -E 's/^[0-9]+[[:blank:]]+//' | peco >> "$snippets"

    _trim
    return
  fi

  if [ "$command" = "rm" ] ; then
    local lines=$(_peco_snippets)

    local IFS=$'\n'

    for line in $lines ; do
      line=${line//\//\\\/}
      IFS=" "; sed -i '' -E "/^${line}$/d" "$snippets"
    done

    return
  fi

  if [ "$command" = "list" ] ; then
    cat "$snippets"
    return
  fi

  if [ "$command" = "help" ] ; then
    cat <<EOF
Usage: $name [command]

Select a snippet in the snippets file ($snippets) using peco

command:
  add   Add the selected command history to the snippets file
  rm    Remove the selected snippets from the snippets file
  list  List snippets in the snippets file

  help  Show this message
EOF
    return
  fi

  local line=$(_peco_snippets | head -n 1)

  if [ -n "$line" ] ; then
    # Replace the last entry, "peco-snippets", with $line
    history -s $line

    if type osascript > /dev/null 2>&1 ; then
      # Send UP keystroke to console
      (osascript -e 'tell application "System Events" to keystroke (ASCII character 30)' &)
    fi
  fi
}
alias pecos="peco-snippets"
```
Hash からクエリ文字列を生成する

ActiveSupport の [Hash#to_param](http://apidock.com/rails/Hash/to_param) (もしくは [Hash#to_query](http://apidock.com/rails/Hash/to_query)) を使えば
Hash から URL のクエリストリングの生成が簡単にできます。自前で key と value を連結して文字列を作るよりも安全ですしね。

``` ruby
require 'uri'
require 'active_support/core_ext'

# Google 画像検索 API 用の URL を生成する。
uri = URI("http://ajax.googleapis.com/ajax/services/search/images")
uri.query = {
  rsz: 8, v: 1.0, safe: "active", as_filetype: "gif", imgsz: "large",
  as_sitesearch: "tumblr.com", q: "ラブライブ！"
}.to_param
#=> "as_filetype=gif&as_sitesearch=tumblr.com&imgsz=large&q=%E3%83%A9%E3%83%96%E3%83%A9%E3%82%A4%E3%83%96%EF%BC%81&rsz=8&safe=active&v=1.0"
uri.to_s
#=> "http://ajax.googleapis.com/ajax/services/search/images?as_filetype=gif&as_sitesearch=tumblr.com&imgsz=large&q=%E3%83%A9%E3%83%96%E3%83%A9%E3%82%A4%E3%83%96%EF%BC%81&rsz=8&safe=active&v=1.0"
```
peco-nico-bgm

[percolを使ってコマンドラインから出ずに聞きたいジャンルの作業用BGMを検索して再生する - Qiita](http://qiita.com/tigberd/items/af8e1ef9c151ee958cc7)
をシンプルにして、検索して選択したものをブラウザで開くだけにしてみました。

```bash:peco-nico-bgm
#!/bin/sh

TAG="作業用BGM"

if [ -n "$*" ] ; then
  TAG="${TAG} $*"
fi

URLS=$(ruby -r rss -r uri -e "RSS::Parser.parse(\"http://www.nicovideo.jp/tag/\" + URI.encode(\"$TAG\") + \"?rss=2.0\").channel.items.each {|item| puts item.link + \"\t\" + item.title}" | peco | awk '{print $1}')

if [ -n "$URLS" ] ; then
  open $URLS
fi
```
Stan で相関係数を推定する

Stan で相関係数を推定してみます。

```r
library(rstan) 

N <- 1000
x <- rnorm(N, mean = 50, sd = 10)
y <- 10 + 0.8 * x + rnorm(N, mean =0, sd = 7)
data <- data.frame(x, y)

stancode <- '
  data{
    int<lower=0> N;
    vector[2] y[N];
  }
  parameters {
    vector[2] mu;
    real<lower=0> var_x;
    real<lower=0> var_y;
    real cov;
  }
  transformed parameters {
    matrix[2,2] sigma;
    sigma[1,1] <- var_x;
    sigma[2,1] <- cov;
    sigma[1,2] <- cov;
    sigma[2,2] <- var_y;
  }
  model{
    for(i in 1:N)
      y[i] ~ multi_normal(mu, sigma);
  }
  generated quantities {
    real cor;
    cor <- cov / sqrt(var_x * var_y);
  }
'
datastan <- list(N=N, y=data)
fit <- stan(model_code=stancode, data=datastan, iter=1000, chain=4)
traceplot(fit, ask=FALSE)
print(fit, digit=2)
```

```:結果
               mean se_mean   sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
mu[1]         50.04    0.01 0.33    49.41    49.82    50.04    50.26    50.69   658 1.01
mu[2]         50.51    0.01 0.34    49.83    50.28    50.50    50.73    51.18   693 1.01
var_x        106.88    0.18 4.69    98.30   103.69   106.76   109.84   116.71   652 1.00
var_y        119.10    0.21 5.53   109.02   115.21   118.86   122.81   130.27   679 1.00
cov           87.69    0.19 4.55    79.13    84.55    87.59    90.67    96.63   587 1.00
sigma[1,1]   106.88    0.18 4.69    98.30   103.69   106.76   109.84   116.71   652 1.00
sigma[1,2]    87.69    0.19 4.55    79.13    84.55    87.59    90.67    96.63   587 1.00
sigma[2,1]    87.69    0.19 4.55    79.13    84.55    87.59    90.67    96.63   587 1.00
sigma[2,2]   119.10    0.21 5.53   109.02   115.21   118.86   122.81   130.27   679 1.00
cor            0.78    0.00 0.01     0.75     0.77     0.78     0.79     0.80   887 1.00
lp__       -5248.75    0.05 1.48 -5252.37 -5249.52 -5248.47 -5247.65 -5246.71   824 1.00
```

普通に計算した値と一致することを確かめます。

```r
cor(x, y)
```

```:結果
[1] 0.7771426
```
promiseと参照透過型関数を使って 順次／分岐／反復

`promise` 便利すぎて、手続き型アルゴリズムの 3 つの基本的な構造、順次／分岐／反復 を作ってみた。

# 順次
これは簡単。もともと `promise.then` は関数を順番に実行してくれる。

```coffeescript
promise
.then f
.then g
.then h
# ...
```

# 分岐
`promise.then` は関数を2つ受け取る事ができる。promise （約束）が果たされたら第1引数に渡した関数が、果たされなかったら第2引数に渡した関数が実行される。これを使えば、分岐ができる。

```coffeescript
angular.module("app").factory "p_if", ["$q", ($q) ->
  return (_bool, _val) ->
    return if _bool then $q.when _val else $q.reject _val
]
```

```coffeescript
# test
describe "test for p_if", (done) ->
  it "第1引数に true を渡せばその後の then で第1引数に渡した関数が実行される", ->
    inject ["$rootScope", "p_if", ($rootScope, p_if) ->
      p_if true, 1
      .then (res) ->
        expect(res).toBe 1
      .finally done
      $rootScope.$apply()
    ]
  it "第1引数に false を渡せばその後の then で第2引数に渡した関数が実行される", ->
    inject ["$rootScope", "p_if", ($rootScope, p_if) ->
      p_if false, 1
      .then (->), (res) ->
        expect(res).toBe 1
      .finally done
      $rootScope.$apply()
    ]
```

# 反復
これは、関数の再帰呼び出しを使って実現出来る。

```coffeescript
angular.module("app").factory "p_while", ["$q", "p_if", ($q, p_if) ->
  return (_init, _cond, _stat) ->
    deferred = $q.defer()
    f = (promise) ->
      promise.then ((res) ->
        p_if _cond(res), res
        .then ((res) ->
          f $q.when _stat res
        ), ((res) ->
          deferred.resolve res
        )
      ), ((error) ->
        deferred.reject error
      )
    f $q.when _init
    return deferred.promise
]
```

```coffeescript
# test
describe "test for p_while", ->
  it "_cond(res)の評価値が true である限り反復する", (done) ->
    inject ["$rootScope", "p_while", ($rootScope, p_while) ->
      _init = [0, 10]
      _cond = (res) -> res[1] > 0
      _stat = (res) -> [res[0] + res[1], res[1] - 1]
      p_while _init, _cond, _stat
      .then (res) ->
        expect(res).toEqual [55, 0]
      .finally done
      $rootScope.$apply()
    ]
  it "_stat(res) が reject した場合は 全体のプロミスは失敗する。", (done) ->
    inject ["$rootScope", "p_while", "p_if", ($rootScope, p_while, p_if) ->
      _init = 5
      _cond = (n) -> n > -5
      _stat = (n) ->
        return p_if n > 0, n - 1
      p_while _init, _cond, _stat
      .then (->), (res) ->
        expect(res).toBe -1
      .finally done
      $rootScope.$apply()
    ]

```
Atom Packageで編集可能なPaneを表示したい

plugin作成のメモ
AtomのPackage作成中、編集可能な(Editor View)を右Paneに表示したい場合

```coffeescript
# 右Pane取得
pane = atom.workspace.getActivePane().splitRight()

# 編集可能な領域を設定
{EditorView} =require 'atom'
editorView = new EditorView(mini:true)

# 右Paneに編集可能な領域を設定
pane.addItem EditorView.getEditor()
```
FuelPHPでDoctrine2のコマンドを使えるようにするやり方


ここ連日Doctrine2と戯れていますが、コマンドが使えないと非常に不便なので何とかした話。
全然難しいことはなかったので、後回しにするんじゃなかった。

## 事前準備

以前の記事と同じ構成の環境を使うので、同じ様にセットアップしておく。
http://qiita.com/gyhino@github/items/188d207d26f608269b3a

## やることの整理

1. コマンドの在処の確認
2. 設定
3. 使えるか確認

## コマンドの在処の確認

Doctrine2のコマンドはcomposerでインストールした場合、`vendor/bin`に置かれている。
今回インストールした先は、`app/vendor`なので`app/vendor/bin/doctrine`が存在する。

`oil`に組み込むのを紹介している記事もあったが、そのまま使えるので今回はそのまま使うことにする。

## 設定

`cli-config.php`を作って動くようにする。
実行時にカレントディレクトリ、もしくはカレントディレクトリの`config`ディレクトリの`cli-config.php`を読み込むので、
参照しやすい場所に置いておく。

今回はプロジェクトのrootディレクトリに置くことにした。（`core`,`packages`,`app`と同列の場所）


```php:cli-config.php
<?php

/**
 * Website document root
 */
define('DOCROOT', __DIR__.DIRECTORY_SEPARATOR);

/**
 * Path to the application directory.
 */
define('APPPATH', realpath(__DIR__.'/fuel/app/').DIRECTORY_SEPARATOR);

/**
 * Path to the default packages directory.
 */
define('PKGPATH', realpath(__DIR__.'/fuel/packages/').DIRECTORY_SEPARATOR);

/**
 * The path to the framework core.
 */
define('COREPATH', realpath(__DIR__.'/fuel/core/').DIRECTORY_SEPARATOR);

// Boot the app
require APPPATH.'bootstrap.php';

// Setup ConsoleRunner
$em = \Fuel\Doctrine::manager();
return ConsoleRunner::createHelperSet($em);
```

## 使えるか確認

以下のコマンドでhelpが表示されれば使える。

```
./app/vendor/bin/doctrine
```

`yaml`などから`Entity`を作りたい場合は、

```
./app/vendor/bin/doctrine orm:generate-entities ./app/classes
```


`yaml`などから`Repository`を作りたい場合は、

```
./app/vendor/bin/doctrine orm:generate-repositories ./app/classes
```

という風に使う。
docker上のCPU負荷を計測する方法

# 概要
dockerで動かしているサーバのCPU負荷を計測しようとして、「docker上のサーバからtopとかで見れるんでしょ？」って思ってたら実はそれで取得できるのはホストサーバの負荷だったということでじゃあどないすんねんっていうお話

# 方法
コンテナごとにcpuやらメモリやらのメトリクスがファイルに出力されているのでその情報をもとにしてCPU負荷を算出する。

cpu使用時間 (動作確認環境では100ミリ秒というよくわからない単位に・・)
`$ cat /pathto/cgroup/lxc/$container/cpuacct.stat
user 163
system 137`
サーバ稼働時間(ナノ秒)
`$ cat /pathto/cgroup/lxc/$container/cpuacct.usage
10130485311`
これらそれぞれの差分を割り算することで単位時間あたりのCPU負荷を計算する。
`($cur_user_cpu - $prev_user_cpu) / ($cur_time - $prev_time)`
シェルでやると以下のようになった。
ただし、LXC_CPU_DIRの部分は環境によって違うかもしれないのでそこは適宜変えてもらいたいです。

```bash:cpu.sh
#!/bin/sh

# usage: cpu.sh [-d] [container]
#
# cpu使用率を出力.
#

LXC_CPU_DIR=/cgroup/cpu/cpuacct/lxc
USAGE="usage: cpu.sh [-d] [container]"

cpu(){
  container=$1
  dir=$LXC_CPU_DIR/$container
  cpu_file=$dir/cpuacct.stat
  time_file=$dir/cpuacct.usage
  if [ ! -e $cpu_file -o ! -e $time_file ]; then
    return 1
  fi

  #経過時間の差分を計算
  cur_time=`cat $time_file` 
  egrep [0-9]+ /tmp/$container.usage > /dev/null 
  if [ $? -eq 0 ]; then
    prev_time=`cat /tmp/$container.usage` > /dev/null 
  else
    prev_time=0
  fi 
  diff_time=`expr $cur_time - $prev_time | xargs -i echo "scale=5;{} / 1000 / 1000 / 1000" | bc`

  #CPU使用時間の差分を計算
  user_cpu=`grep user $cpu_file`
  cur_cpu_time=`echo $user_cpu | cut -d " " -f 2`
  egrep [0-9]+ /tmp/$container.stat > /dev/null 
  if [ $? -eq 0 ]; then
    prev_cpu_time=`cat /tmp/$container.stat` > /dev/null
  else
    prev_cpu_time=0
  fi 
  diff_cpu_time=`expr $cur_cpu_time - $prev_cpu_time | xargs -i echo "scale=5; {} / 100" | bc`
  if [ -n "$DEBUG_FLG" ]; then
    echo $container
  fi
  res_cpu=`echo "scale=5; $diff_cpu_time / $diff_time * 100" | bc`
  echo $res_cpu
  #現在経過時間の格納
  echo $cur_time > /tmp/$container.usage
  echo $cur_cpu_time > /tmp/$container.stat
}

all(){
for dir in `find $LXC_CPU_DIR/* -type d`; do
  container=`basename $dir`
  cpu $container
done
}

while getopts d opt
do
  case ${opt} in
    d)
      DEBUG_FLG=1
      ;;
    \?)
      echo $USAGE
      exit 1
      ;;
  esac
done

shift $((OPTIND - 1))

if [ $# -eq 0 ]; then
  all
  exit 0
fi

if [ $# -eq 1 ];then
  container=$1
  cpu $container
  if [ $? -eq 1 ]; then
    exit 1;
  fi
  exit 0
else
  echo $USAGE 
  exit 1
fi
```

動かすとこんな感じ

```bash
$ sh ~/autoscaling/cpu.sh -d
f57a5e6c6d827362d458b712a1fc66cb75f273a84a4436edeabc978ba70a797b
0
# docker上のサーバでyesコマンド打ってちょっと負荷を挙げてみた
$ sh ~/autoscaling/cpu.sh -d
f57a5e6c6d827362d458b712a1fc66cb75f273a84a4436edeabc978ba70a797b
20.25800
```
たまに0になったりありえないくらい大きな数字になったりするけど概ね合ってそう。
watchすると楽しい。

[追記]
メモリに関しても同じ要領でできるのかな？とか言ってたけどメモリの場合は/pathto/cgroup/memory/lxc/${container}/memory.usage_in_bytesを見ればいいだけだった。楽だね。

#まとめ
docker上のサーバのcpu負荷を計測する方法とそのためのスクリプトを載せてみた。試してないけどメモリも同じ要領でできるのかな？
10ストックいったらやってみる。
#参考
http://wtatsuru.hatenadiary.com/entry/2013/12/23/190644
https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-cpuacct.html
Haml メモ


## 複数行でさっくり書きたい時
- 複雑なパラメータにしたいときなど、1行が長くなって↓こんな風によくなる

```haml
= render partial: 'shared/hoge', locals: { hoge: 'hoge', fuga: 'fuga', ... #その他いろいろもっと長くなるやつ }
```

- 可読性があったもんじゃなくなるので、↓のようにするとよさそう。

```haml
:ruby
  locals = {
    hoge: 'hoge',
    fuga: 'fuga',
	... # その他いろいろもっと長くなるやつ
  }

= render partial: 'shared/hoge', locals: locals

```

- `|` で繋ぐというのもありますが、可読性よくないし、毎行打つのめんどくさいので...
- そもそも helper メソッドにするのがいいこともありそうですね:)

## 不要な空白が入ってしまう時

- たとえばこんな時

```haml
= "表示したい何か"
%i.fa.fa-pencil
```

- こんな風に出力される
- まあ表示上困ること少ないけど、ときどき困ることもあるのでスペース消したい

```html
"表示したい何か
          "
<i class="fa fa-pencil"></i>
```

### 解決策
- `<` とか `>` を使おう
- リファレンス: http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_

```haml
= "表示したい何か"
%i.fa.fa-pencil>
```

- ↑ `>` が付いてると ↓ のようになる

```html
"表示したい何か"
<i class="fa fa-pencil"></i>
```
brew install caskした場合のcask.elの場所

* 記事訂正しました。

@mather314 さんからの[コメント](http://qiita.com/toshiwo/items/84cfa5e940ffdd69afaa#comment-d907cee4383e133462b5)にあるように、emacs/cask共にhomebrewでインストールした場合、下記の設定でよいようです。
(@mather314さんコメントありがとうございました)

```
(require 'cask)
(cask-initialize)
```

* * *

* 以下、元の記事

`brew install cask`した場合の`cask.el`ファイルは`~/.cask/cask.el`には無いっぽいので注意

`$(brew --prefix)/opt/cask/cask.el`つまり`/usr/local/opt/cask/cask.el`にある

`~/.emacs.d/init.el`に追加する設定も下記の通りで良いはず

```
(require 'cask "/usr/local/opt/cask/cask.el")
(cask-initialize)
```

公式のドキュメントには無かったので書いてみた
peco(percol)を使ってコマンドラインから作業用BGMを検索・再生する


## 概要
[前回の投稿](http://qiita.com/tigberd/items/9530714391340472ad96)の続きでニコニコから動画を検索してコマンドラインから再生します。
使ってみると思ったより実用的な感じだったので別に書きます。作業用BGMなのでコマンドラインのみで完結させてウィンドウも出さないようにします。

## 必要なもの
- peco (or percol)
- curl
- ruby
- mplayer

## スクリプト
前回使ったnicovideo-dumpを少し修正したものを使います。
環境変数```NICOVIDEO_DUMP_EMAIL```と```NICOVIDEO_DUMP_PASSWORD```を事前に設定しておきます。

```bash:nicovideo-dump
#! /bin/sh

if [ $# -eq 0 ]; then
    TARGET=$(cat -)
else
    TARGET=$1
fi

if [ -z "$TARGET" ]; then
    exit 1
fi

SAVEDIR=/tmp
COOKIE=/tmp/nico_cookie
FILENAME=`echo $TARGET | ruby -e "print $<.read.chomp.split('/').pop"`

curl -s -c $COOKIE -d "mail=$NICOVIDEO_DUMP_EMAIL" -d "password=$NICOVIDEO_DUMP_PASSWORD" "https://secure.nicovideo.jp/secure/login?site=niconico" -3 -i > /dev/null
curl -s -b $COOKIE -c $COOKIE $TARGET -i > /dev/null
FLAPI_POSTFIX=`echo $FILENAME | ruby -e 'print $<.read.chomp[0,2] == "nm" ? "?as3=1" : ""'`
FLAPI_RES=`curl -s -b $COOKIE "http://flapi.nicovideo.jp/api/getflv/$FILENAME$FLAPI_POSTFIX"`
VIDEO_URL=`echo $FLAPI_RES | ruby -r cgi -e 'print CGI.unescape(Hash[*($<.read.chomp.split("&").map{|e| e.split("=")}.flatten)]["url"])'`
curl -s -b $COOKIE $VIDEO_URL
curl -s -b $COOKIE "https://secure.nicovideo.jp/secure/logout" -3 -i > /dev/null

exit 0
```

今回は作業用BGMを探したいのでpecoに渡す要素としてニコニコ動画から作業用BGM+αのタグで検索したものを使います。
以下のコマンドを実行すると引数なしの場合は「作業用BGM」タグ、引数を渡すと「作業用BGM」タグと引数名のタグで検索した結果がヒットします。
RSSの都合上32件しか候補が出ないですが、デフォルトではコメントが新しい順で検索されているので1時間おきに内容が適当に変わるはず。

mplayerのオプションに-novideoを指定しているので選択するとウィンドウが出ずに再生が始まります。

```bash:.zshrc
function peco-nico-bgm() {
    TAG=`echo "作業用BGM $*" | nkf -WwMQ | tr -d '\n' | tr = % | sed -e 's/%%/%/g'`
    ruby -r rss -e "RSS::Parser.parse(\"http://www.nicovideo.jp/tag/$TAG?rss=2.0\").channel.items.each {|item| puts item.link + \"\t\" + item.title}" | peco | while read line; do
        echo $line
        echo $line | awk '{print $1}' | nicovideo-dump | mplayer - -novideo
    done
}
```

### タグ無し検索
![スクリーンショット 2014-07-01 00.41.49.png](https://qiita-image-store.s3.amazonaws.com/0/32836/ffa01503-bc3e-722e-540c-39f2bc04520c.png "スクリーンショット 2014-07-01 00.41.49.png")

### タグ追加検索
![スクリーンショット 2014-07-01 00.42.08.png](https://qiita-image-store.s3.amazonaws.com/0/32836/90b07162-50de-a4a7-cec3-474413e1ac5c.png "スクリーンショット 2014-07-01 00.42.08.png")

便利