OmniAICreator/Qiita-1.07M huggingface dataset:
Mercurial 参考Webサイト

# Mercurial ユーザへの参考サイト提示リンク

ハッシュタグ [#mercurialjp](https://twitter.com/hashtag/mercurialjp?src=hash) に反応するときに使えるかなと思って、ちょっと拾って書いてみた。

* コマンドヘルプ: http://mercurial-users.jp/manual/hg.1.html
    * ヘルプの URL 末尾に#rebaseなどをつけることで、それぞれの機能のヘルプへのリンクになる。revesets, bisect, rebase
* 設定ファイルヘルプ: http://mercurial-users.jp/manual/hgrc.5.html
* ブックマーク: http://d.hatena.ne.jp/flying-foozy/20120803/1343994576
* revsets
    * TortoiseHg 上での revsets: http://d.hatena.ne.jp/flying-foozy/20120511/1336713963
    * ファイルを登録除外したリビジョンの検出: http://d.hatena.ne.jp/flying-foozy/20140105/1388886301)
* Git とのコマンド比較: http://mercurial.selenic.com/wiki/GitConcepts#Command_equivalence_table
* Api の変更あれこれ: http://mercurial.selenic.com/wiki/ApiChanges
	* Api 互換性を維持する方法: http://mercurial.selenic.com/wiki/ApiChanges#How_to_keep_your_extension_compatible

こちらの情報が参考になれば幸いです。
GitHubクローン「GitLab」を日本語化して使う方法


日本語化パッチ作りました。
2014/7/5現在、GitLab最新バージョン7.0.0まで対応してあります。

![スクリーンショット 2014-07-05 15.26.41.png](https://qiita-image-store.s3.amazonaws.com/0/29368/ad843b7b-7f71-431a-c3d9-f7c9a944b565.png "スクリーンショット 2014-07-05 15.26.41.png")

## GitLabについて

GitHubクローンの中でも有名な「GitLab」ですが、開発速度が非常に速く、機能も充実しています。
「GitHubだとソースコードを外に置くことになるNG…でもGitHubのようなワークフローで仕事をしたい」という場合に非常に便利です。
ですが、このGitLab、開発スピードを重視しているので英語のみで開発されています。
(i18n対応がissueに上がっていたものも見かけましたが、上記理由でdeclineされていました)
「チームには英語だと抵抗のあるメンバーもいるし、日本語で使いたい…だったら作ろう」と思い立って、日本語化パッチを作りました。
GitLabの導入、パッチの適用方法、簡単に試してみる方法、等々がこの記事の内容です。

## GitLabの導入

導入は数年前に比べて遥かに簡単になっています。
Ubuntu, CentOS, Debianなら以下からパッケージをダウンロードしてインストールし、コマンドをいくつか叩くだけで使えるようになります。
https://www.gitlab.com/downloads/
(詳細は上記ページに書いてあります)

## GitLab日本語化パッチの適用

ここから最新のリリースを取得してきます。
https://github.com/ksoichiro/gitlab-i18n-patch

patches/[GitLabバージョン]/app_ja.patchがパッチです。
例えばホームディレクトリにパッチファイルを配置した場合、以下で適用します。

```sh
$ cd /opt/gitlab/embedded/service/gitlab-rails
$ patch -p1 < ~/app_ja.patch
```

JavaScriptファイルを変更するため、パッチ適用後にプリコンパイルされたファイルを一度削除してプリコンパイルし直してください。

例：

```sh
$ cd /opt/gitlab/embedded/service/gitlab-rails
$ rm -rf public/assets
$ export PATH=/opt/gitlab/embedded/bin:$PATH
$ bundle exec rake assets:precompile RAILS_ENV=production
```

この辺りの手順は変わるかもしれませんので、
実際に試す場合は上記リポジトリのREADMEもご参照ください。

## Vagrantで試す

いきなりGitLab用のサーバを用意して導入する、というのも難しいと思いますので、Vagrantで試せるようにしてあります。
上記パッチのプロジェクトをダウンロードorクローンしてきた上で、
以下のようにするとローカルでGitLabが立ち上がります。
(VirtualBoxとVagrantはインストールしておいてください)

```sh
$ cd gitlab-i18n-patch/
$ vagrant up v700
```

セットアップはこんな感じで出力されます。

```sh
$ vagrant up v700
Bringing machine 'v700' up with 'virtualbox' provider...
==> v700: Importing base box 'precise64'...
==> v700: Matching MAC address for NAT networking...
:
(中略)
:
Provisioning GitLab v7.0.0...
Installing gitlab...
Reconfiguring gitlab...
Updating apt-get...
Installing patch...
Creating backup of gitlab-rails...
Applying patch...
Refreshing assets (this may take minutes)...
Restarting gitlab...
Done!
GitLab v7.0.0 has been installed: http://localhost:9700/
```

上記でセットアップが終わった後、http://localhost:9700/ でアクセスできます。
他のバージョンを試す場合は、ポート番号を`9000 + バージョンから'.'を取った値`に読み替えてください。

セットアップ直後はGitLabの管理ユーザでログインできます。
ユーザ名は`root`(もしくは`admin@local.host`)、初期パスワードは`5iveL!fe`です。

### VMのチューニングなど

現状、VirtualBoxでメモリを1GB、CPUを2で割り当てています。
メモリが足りないor使い過ぎ、等の場合は`Vagrantfile`の以下の部分を修正してください。

```ruby
  config.vm.provider "virtualbox" do |v|
    v.memory = 1024
    v.cpus = 2
  end
```

## 注意点など

* 利用される場合は自己責任でお願いします
* 日本語化できていない部分もあります
* 訳がおかしい部分があればご指摘いただけると幸いです

## おまけ：パッチの内容と成り立ちについて

Ruby on Railsで作られているので、そのi18nなどの仕組みに乗っかれれば良かったのですが、国際化対応しない方針ということもありGitLabそのものがそういう作りになっていません。
作り込んでも良いですが、あまり本体からロジック的に変えてしまうとバージョンアップに追随していけなくなる、と判断し直接ソースコード中の英語を書き換える方法を採っています。
(実際、3月頃に6.6.4をベースに開始して以来、すでに7回もパッチをアップデートさせています)

最初に取り組んだのがv6.6.4でしたので、これをベースにGitLab-CEをフォークしたリポジトリに日本語化ブランチを作り、以降のバージョンアップではこの日本語化ブランチにアップデートをマージし、コンフリクトを手動で解消していく、という地道な作業からできあがっています。
(一度に100ファイル以上コンフリクトすることも…)
Rails4.2, ActiveSupportの新機能 Hash#transform_values を見てみた

Rails 4.2.0.alphaのコミットログを眺めてたんだけど、せっかくだし理解を深めるためにもブログという形で書いておくことに。

#Railsのmaster branchをインストールする
通常は安定バージョンのRailsをインストールすると思いますが、コードを読んだり試しに実行するのが目的なので、開発中の最新バージョンを入れたいです。

Gemfileに下記を記述して`bundle install`すると怒られました。

```rb
gem 'rails', github: 'rails/rails'
```

```
Could not find gem 'arel (~> 6.0.0) ruby', which is required by gem 'rails (>= 0) ruby', in any of the sources.
```

arelも最新バージョンを入れればいいっぽい。

```rb
# Gemfileに追記
gem 'arel', github: 'rails/arel'
```

```console
$ bundle install
```

OKですね。無事2014/7/5時点最新の4.2.0.alphaが入りました。

```console
$ rails -v
Rails 4.2.0.alpha
```

#Hash#transform_valuesを試してみる
下記のコミットログ見てた。

- [Add \`Hash#map_values\` to ActiveSupport to simplify a common pattern](https://github.com/rails/rails/pull/15819/files)

Railsはコマンドライン実行が簡単だから助かる。メソッドのコメント通りに実行してみる。


```console
$ rails c
```

```rb
{ a: 1, b: 2, c: 3 }.transform_values { |x| x * 2 }
#=> {:a=>2, :b=>4, :c=>6}
```

なるほど、全ての値に式を評価してその結果値を元の値と置き換えるわけか。実装もシンプルだった。見ればすぐわかる。

```rb
def transform_values(&block)
  result = self.class.new
  each do |key, value|
    result[key] = yield(value)
  end
  result
end
```

文字列の結合もイケる。

```rb
original = { a: 'a', b: 'b' }
original.transform_values { |v| v + '!' }
#=> {:a=>"a!", :b=>"b!"}
```

以前からあった`Hash#transform_keys`の値版ということですね。

```rb
original.transform_keys { |k| k.upcase }
#=> {:A=>"a", :B=>"b"}
```

これってどんな時に使うんだろうか。便利だとは思うけど。

active_supportのcore_extensionsを見てると知らなかったのとかちょいちょいあって楽しいよ！
http://guides.rubyonrails.org/active_support_core_extensions.html#extensions-to-hash
TravisCIでRedisを使うときの.travis.ymlの設定

趣味でRailsアプリを書いてて、TravisCIの結果を[GitHub :octocat:](https://github.com/kentana20/pl_info/) のREADME.mdにバッチとして貼っているんですが、スクレイピングで取得した情報をRedisを使ってキャッシュするようにしたらTravis側で

### Redisがないからアプリ動かない

という問題が発生。
「TravisCI、Redis動くのかなー」と思って調べたら速攻で解決したので、メモ程度に残しとく。

変更するのは、TravisCIの設定ファイル「.travis.yml」1つだけ。

```yaml:.travis.yml
services:
    - redis-server
```

を追記するだけです。カンタンですねー。TravisCI便利です :blush: 

これで、GitHubへソースをpushすればTravisCI側でビルドが走るときにRedisが勝手に起動します。

![redis_travis.jpg](https://qiita-image-store.s3.amazonaws.com/0/31059/544ee942-05d1-00fb-f2d0-0f7ad540a61f.jpeg)
[入門Julia] よく使うパッケージまとめ


Juliaで使えそうなパッケージをまとめてます。

[パッケージ一覧(METADATA.jl)](https://github.com/JuliaLang/METADATA.jl)

定番のAwesomeシリーズ
https://github.com/greister/Awesome-Julia


## 開発支援

### IJulia
JupyterのJulia版

[Github](https://github.com/JuliaLang/IJulia.jl)

```jlcon
julia> Pkg.add("IJulia")
```

## データフレーム

### DataFrames

[Github](https://github.com/JuliaStats/DataFrames.jl)

## データセット

### RDatasets

Rのデータ・セットをJuliaでも使いたい場合

[公式ページ](http://vincentarelbundock.github.io/Rdatasets/)
[Github](https://github.com/vincentarelbundock/Rdatasets)

```jlcon
julia> Pkg.add("RDatasets")
```

## 可視化

### Gadfly

[Github](https://github.com/dcjones/Gadfly.jl)

```jlcon
julia> Pkg.add("Gadfly")
```

### PyPlot

PythonのMatplotlibをJuliaのPyCallから呼び出して使えるようにしたライブラリ

[Github](https://github.com/stevengj/PyPlot.jl)

```jlcon
julia> Pkg.add("PyPlot")
```

## 統計

### JuliaStates

[Github](https://github.com/JuliaStats)

### StatsBase

[Github](https://github.com/JuliaStats/StatsBase.jl)

## 最適化問題

### JuliaOpt

[公式ページ](http://www.juliaopt.org/)
[Github](https://github.com/JuliaOpt/)
Google Apps ScriptからHTTP POST


Google Driveのスプレットシートをハックしようと思って勉強してます。

ここのサンプルをもとに書いたらあっさりいけました。
[Class UrlFetchApp - Google Apps Script — Google Developers - ](http://go.shr.lc/1komPFd)

##サンプルリクエスト例

```
curl http://example.com -X POST -d 'message=google apps scriptより'
```

##Google Apps Scriptで書くとこんな感じ

```httppost.gs
/* 
* messageをpostする関数
*/
function sendHttpPost(message){
   var payload =
   {
     "message" : message
   };

   var options =
   {
     "method" : "post",
     "payload" : payload
   };

   UrlFetchApp.fetch("http://example.com", options);
}

function myFunction(){
  var message = 'google apps scriptより';
  sendHttpPost(message);
}

```

めちゃカンタンですね。
UITabBarController のタブを別の StoryBoard から読み込む


# StoryBoard の肥大化を避けたい

UITabBarController を使って Tabbed Application をつくる時、全部のタブ(ViewController)を同じ StoryBoard の中に作っていくと StoryBoard が肥大化していったり、複数人で編集する時に大変なことになったりします。

そこで UITabBarController を作った StoryBoard とは別の StoryBoard を作って、そこに タブ(ViewController) を作って読み出すようにしました。

# UITabBarController setViewControllers

UITabBarController の viewDidLoad のところで、setViewControllers を使ってタブを指定します。

```MyUITabBarController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSArray *viewControllers = [NSArray arrayWithObjects:
                                [self createViewControllerA],
                                [self createViewControllerB],
                                [self createViewControllerC],
                                nil];
    
    [self setViewControllers:viewControllers];
}

- (UIViewController*)createViewControllerA{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryBoardA" bundle:nil];
    UINavigationController *controller = [storyboard instantiateInitialViewController];
    return controller;
}

- (UIViewController*)createViewControllerA{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryBoardB" bundle:nil];
    UINavigationController *controller = [storyboard instantiateInitialViewController];
    return controller;
}

```

コードもですが StoryBoard/xib もできるだけ疎に作った方が変更に対応しやすくてよさそうです。
Stan で increment_log_prob()

<blockquote class="twitter-tweet" lang="ja"><p>Stan で model にモデル式追加するのと increment_log_prob() で対数尤度関数追加するのは同じことって認識でいいのかな？</p>&mdash; hoxo_m (@hoxo_m) <a href="https://twitter.com/hoxo_m/statuses/485210759287152641">2014, 7月 4</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで、これを確認するために、以前書いた[二番目に簡単な rstan コード](http://qiita.com/hoxo_m/items/ad4ffb091aec535f3125)を increment_log_prob() で書き直してみます。

書き直すのは model のこの部分。

```stan
model{
  for(i in 1:N)
    y[i] ~ normal(alpha + beta * x[i], s);
  s ~ inv_gamma(0.001, 0.001);
}
```

これを次のように increment_log_prob() で対数尤度関数に書き換えてみます。

```stan
model{
  for(i in 1:N)
    increment_log_prob(-0.5 * log(2 * pi() * s^2) -0.5 * ((y[i] - (alpha + beta * x[i])))^2/s^2);
  s ~ inv_gamma(0.001, 0.001);
}
```

`set.seed(314)` を最初に実行して、データをそろえた場合のモデル式バージョンと対数尤度関数バージョンの結果を比較してみます。

```:モデル式バージョンの結果
          mean se_mean   sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
alpha     8.69    0.06 1.18     6.27     7.90     8.72     9.43    10.99   371 1.00
beta      0.83    0.00 0.02     0.78     0.81     0.83     0.84     0.88   373 1.00
s         7.01    0.01 0.17     6.66     6.91     7.01     7.12     7.33   478 1.01
lp__  -2449.55    0.07 1.34 -2453.09 -2450.15 -2449.17 -2448.58 -2448.10   362 1.03
```

```:対数尤度関数バージョンの結果
          mean se_mean   sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
alpha     8.77    0.05 1.18     6.40     7.97     8.76     9.61    11.08   480 1.00
beta      0.83    0.00 0.02     0.78     0.81     0.83     0.84     0.87   477 1.01
s         7.02    0.01 0.15     6.71     6.92     7.01     7.12     7.31   593 1.01
lp__  -3368.42    0.05 1.17 -3371.37 -3369.02 -3368.13 -3367.55 -3367.04   527 1.00
```

ほぼ一致しました。

つまり Stan は尤度関数の形さえ分かってしまえば、どんなモデルでも自由に MCMC できるということですね。

この事実を知ったことで、自分の中でかなり Stan の理解が進んだように思えます。

### 追記

上記2つの結果で `lp__` だけ大きく違いますが、これは Stan のモデル式が対数尤度の定数を計算しないためだと考えられます。

そこで、`increment_log_prob()` から定数を取り除いてみましょう。

```stan
model{
  for(i in 1:N)
    increment_log_prob(-0.5 * log(s^2) -0.5 * ((y[i] - (alpha + beta * x[i])))^2/s^2);
  s ~ inv_gamma(0.001, 0.001);
}
```

```:定数項を除いた対数尤度関数バージョンの結果
          mean se_mean   sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
alpha     8.83    0.05 1.11     6.66     8.09     8.86     9.56    10.93   413 1.01
beta      0.83    0.00 0.02     0.78     0.81     0.82     0.84     0.87   409 1.01
s         7.02    0.01 0.16     6.73     6.91     7.02     7.13     7.35   597 1.00
lp__  -2449.44    0.05 1.13 -2452.24 -2450.02 -2449.18 -2448.59 -2448.09   545 1.01
```

おー、`lp__` もほぼ一致しましたね。

Stan はモデル式を対数尤度関数に変換していると考えると、理解がしやすいように思えます。

以上です。
【iOS】簡単にScrollViewをフルスクリーンに出来るAMScrollingNavBar


## はじめに

今回は`UITableView`や`UIScrollView`を実装したページでスクロールした時に、ナビゲーションバーが隠れる`AMScrollingNavBar`というプラグインを使ってみました。

もちろん`cocoapods`に登録されています。

[andreamazz/AMScrollingNavBar](https://github.com/andreamazz/AMScrollingNavbar)

`tableView`とか`collectionView`を見せるときに、できるだけ多くの情報を見せたいなー（見たいなー）って思ったので、使ってみました。

ページに遷移した時は、そこがどのページがわかるようにタイトルは表示するべきだと思いますが、それ以降は特にいらないかと思います。

iOS（特にiPhone）の１つのページの情報量なんてたかがしれていると思うので、その情報に集中出来るようにしたいなと思い、このプラグインを使ってみることにしました。

[ryokosuge/SampleAMScrollNavBar](https://github.com/ryokosuge/SampleAMScrollNavBar)

## 使ってみた感想

とにかく導入が簡単で、`delegate`やら`datasource`を追加することなく導入することが出来ます。

ただこのプラグインはプラグイン名からもわかるように`NavigationBar`専門になります。

`TabBar`は対応していないので、お気をつけください。

（ソースを読んだ感じ、`TabBar`の処理はなにもなかった...）  

なので、メニューがない or サイドメニューを導入していて（`TabBar`を使っていない）スクロールするページがある場合には導入する価値があると思います。

しかし、このライブラリを使う上で制限があるので、そこについても書いておきたいと思います。

## 良かった点

### 導入が簡単
これにつきます。

制限に則っていれば１行追加するだけで済みます。

`UITableView`を使っている場合、まずライブラリの`<AMScrollingNavbar/UIViewController+ScrollingNavbar.h>`をインポートした状態で

```objectivec
- (void)viewDidLoad
{
	[super viewDidLoad];
	[self followScrollView:self.tableView withDelay:6.0];
}
```

と実装すれば導入完了です。

とっても簡単ですね。

こういうプラグインは結構需要があると思うので、まずは試しに使ってみることをおすすめします！

### 複雑なことはしないで済む

これも結構重要な部分だと思います。

独自実装のプラグインだと`delegate`や`datasource`を実装しないと行けないやつが多いです。

そういうのを導入する度に、`delegate`のこのメソッドはいつ呼び出されるのかの確認等がとってもめんどくさいです。

逆に言えば、なにもcallbackは受け取れません。

このプラグインで言えば`UINavigationBar`が隠れた時とか表示した時の`callback`メソッドを実装したという場合は使えません。

そういうことをしたかったら他のプラグインを使えということなんですかね。

とにかく邪魔するものもなく、ソースコードを汚すこともないので、とってもオススメです。

## 悪かった点

### 制限あり
これは[andreamazz/AMScrollingNavBar](https://github.com/andreamazz/AMScrollingNavbar)のREADME.mdに書いてあるんですが、これを守らないと使い物になりません。

ということで紹介していきます。

> Make sure to have a barTintColor for your UINavigationBar, or you won't see the fade-in and fade-out effects. Also make sure that you are not using a translucent navigation bar. E.g., in your controller:
> ```[self.navigationController.navigationBar setTranslucent:NO];```

絶対に`translucent`は`NO`にしてください。

これはソースコードでも、storyboardでやっても同じでした。

ソースコードの場合は

```
[self.navigationController.navigationBar setTranslucent:NO];
```

ですね。

また`view constraints`もしっかり指定してください。

僕は最初Storyboardの`UITableView`で実装していたのですが、やっぱこういうのにむいてないですね。

なので`UIViewController`に`UITableView`を乗っけました。

その時の`View Constraints`は以下の様にしました。

![スクリーンショット 2014-07-05 4.59.00.png](https://qiita-image-store.s3.amazonaws.com/0/47302/8119a7ae-f737-1c67-4623-1c0c4461ec7f.png "スクリーンショット 2014-07-05 4.59.00.png")


という感じでうまく実装できました。

以上になります。
xcodeにiOS Frameworkを追加する方法

iosアプリ開発時は様々なフレームワークを使いますよね。
本ブログではxcodeにiOSのフレームワークを追加する方法を紹介します。

+ プロジェクトSetting画面 > Linked Frameworks and Libraries > + ボタンをクリック。

![framework追加.png](https://qiita-image-store.s3.amazonaws.com/0/46268/14714167-625e-ee5a-6ca6-735fd1165916.png)

+ フレームワークを選択し、Addボタンをクリック。

![スクリーンショット_2014_07_05_12_23.png](https://qiita-image-store.s3.amazonaws.com/0/46268/3b4fcc3d-7d40-c80a-c899-15ba61e9a34f.png)

+ 正しくフレームワークが追加されてるか確認。

![swift-twitter.png](https://qiita-image-store.s3.amazonaws.com/0/46268/ab40fb95-6fb3-23c8-1ce4-9ef448ad94f4.png)

簡単にフレームワークの追加ができましたね！！

[IOS8アプリ開発日誌掲載中！！](http://qiita.com/kilhyungdoo/items/087dcbf971ac5e05d3f0)
Zend\LogでFingersCrossedモード(問題発生時に過去ログを一気に出力)

アプリケーションログは、何か障害が発生した時は調査の起点になりますので大事ですよね。

ロガーは通常、ログレベルを設定できて、debug用の情報などは開発環境だけ出力し、本番環境では抑制しておきます。無駄な大量のログ出力は、それなりにパフォーマンスに悪影響を与えますからね。

しかし、何かエラーが起きたときは、ログ出力が抑制されていることにより、原因がわかりにくくなってしまいます。

Monolog特有の機能であるFingersCrossedは、このジレンマを解消します。
ある特定のレベル(CRITICALなど)のログ出力を指示した瞬間、ログレベルを切り替え、過去にさかのぼってINFOなどのすべてのログを出力します。

これにより、問題が起きた時だけ詳細にログを吐くことができ、障害対応に効果を発揮します。

- [Monologのfingers_crossedがようやくわかった - ゆっくり*ゆっくり](http://d.hatena.ne.jp/Fivestar/20110801/1312217024)
- [[Monolog][Symfony] Monolog が神過ぎる件 ～エラーログをメールで送ろう～ - Issei.M's Techlog](http://issei-m.hatenablog.jp/entry/2013/04/15/130804)

で、本題なのですが。

[Zend Framework2](http://framework.zend.com/)の公式ロガーである[Zend\Log](http://framework.zend.com/manual/2.3/en/modules/zend.log.overview.html)には似たような機能がないか調べていたら、Monologからポーティングされているようでした。しかしマニュアルには使い方が書かれていませんでしたので、メモしておきます。

# Zend\Logのインストール
まあ、composerでインストールするのが楽ですかね。zf2全体のパッケージ(zendframework/zendframework)をインストール済みなら、Zend\Logも含まれています。

```bash
$ mkdir some-project
$ cd some-project
$ composer require 'zendframework/zend-log:*'
```

Zend\Logはロギング自体を提供するコア部分、出力先へ実際の出力を行うWriter部分、ログ出力の抑制を行うFilter部分、すべてバラバラに作られており、使う場合は組み立て作業が必要です。

# Zend\Log\Writer\FingersCrossed の例

```php
<?php
require 'vendor/autoload.php';

use Zend\Log;
use Zend\Log\Writer;

$logger = new Log\Logger;

//実際は適当なファイルなどを指定する。ここではお試しなので標準出力を指定
$writer = new Writer\Stream('php://output');

//FingersCrossed でラッピングする
$fingersCrossed = new Writer\FingersCrossed($writer, Log\Logger::CRIT);

$logger->addWriter($fingersCrossed);

// ここまででloggerの使用準備完了

$logger->debug('debug!!');
$logger->info('info!!');
$logger->notice('notice!!');
$logger->warn('warn!!');
$logger->err('error!!');
sleep(2);
$logger->crit('crit!!');
$logger->alert('alert!!');
$logger->emerg('emerg!!');
```

Zend\Logのログレベルは[syslogのRFC](http://tools.ietf.org/html/rfc5424)に準拠して決められていて、debugが一番緩やかなレベル、emergが一番ヤバいレベルとなっています。

ただのロガーであれば、上記コードはdebugからerrまで出力した後、2秒待って、crit以降を出力するはずです。

FingersCrossedでは、critが最初に呼ばれるまでdebugからerrまでのログ出力は抑制されているので、２秒待ってから、一気にdebugからemergeまで出力される挙動になります。


# Filter\Priorityとの組み合わせ

なお、FingersCrossedモードで出力する場合でもdebugレベルは出力しなくてよい、というのであれば、予めwriterにpriorityによるfilterを設定しておきましょう。

```php
<?php
require 'vendor/autoload.php';

use Zend\Log;
use Zend\Log\Writer;

$logger = new Log\Logger;

//実際は適当なファイルなどを指定する。ここではお試しなので標準出力を指定
$writer = new Writer\Stream('php://output');
$writer->addFilter(new Log\Filter\Priority(Log\Logger::INFO)); //info以降のみ出力するよう抑制

//FingersCrossed でラッピングする
$fingersCrossed = new Writer\FingersCrossed($writer, Log\Logger::CRIT);

$logger->addWriter($fingersCrossed);

// ここまでで使用準備完了

$logger->debug('debug!!'); //これが出力されることはない
$logger->info('info!!');
$logger->notice('notice!!');
$logger->warn('warn!!');
$logger->err('error!!');
sleep(2);
$logger->crit('crit!!');
$logger->alert('alert!!');
$logger->emerg('emerg!!');
```

FingersCrossedが使いたいがために、ロガーだけはMonologを使う、なんてことはしなくても大丈夫そうです。ZF使いならZend\Logを使ってしまう方が楽でしょう。


全部バラバラに作ってあるのはお作法として正しいのですが、使うまでの設定処理はこのままだと面倒ですので、実際はフレームワーク付属のDIコンテナなりサービスロケータなりの中で組み立てるとよいでしょう。
Dockerのコンテナ間での連携


# Container同士のリンク

webという名前のコンテナーとdbという名前のコンテナーをリンク
リンクしておくとリンク先の情報が環境変数と/etc/hostsに反映される

```bash
$ #--linkでdb containerをweb containerとリンク
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

```

```bash
$ #web container内の環境変数の表示
$ sudo docker run --rm --name web --link db:db training/webapp env
    . . .
    DB_NAME=/web2/db
    DB_PORT=tcp://172.17.0.5:5432
    DB_PORT_5000_TCP=tcp://172.17.0.5:5432
    DB_PORT_5000_TCP_PROTO=tcp
    DB_PORT_5000_TCP_PORT=5432
    DB_PORT_5000_TCP_ADDR=172.17.0.5
    . . .
```

```bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db
```

### 参考URL

http://docs.docker.com/userguide/dockerlinks/

# Container間のデータ共有

データボリューム機能によりコンテナ間のデータ共有が可能

以下のコマンドでコンテナ(dbdata)にデータボリューム(/dbdata)を追加できる

```bash
$ sudo docker run -d -v /data --name dbdata training/postgres
```

--volumes-fromを使ってdbdataのデータボリューム(/data)を他のコンテナー(web)にマウントする

```bash
$ sudo docker run -d --volumes-from dbdata --name web training/webapp
```


* training/webapp及びtraining/postgresはdocker hubにあるオフィシャル？のdocker イメージ


### 参考URL

http://docs.docker.com/userguide/dockervolumes/

# コンテナの連携を図にしてみた

![data container (2).png](https://qiita-image-store.s3.amazonaws.com/0/13615/00494d1b-87d3-be04-6723-705fbb1fe9d1.png "data container (2).png")
GitHubでforkしたprivateリポジトリの変更に追従しようとしてエラーになる系です

privateリポジトリをforkして作業している最中に、fork元の変更を取り込もうとして

```
git remote add upstream git://github.com/foo/bar.git
git fetch upstream
```

としたら

```
>fatal: remote error:
>  Repository not found.
```

となった。forkしなおすといけるけど格好わるい。

#解決策

privateリポジトリの場合はgit:ではなくhttps:を使え、ということらしい。
なので、正しくはこうしよう。

```
git remote add upstream https://github.com/foo/bar.git
git fetch upstream
>Username for 'https://github.com':
>assword for 'https://username@github.com':
```

##(おまけ)前の設定を消す

```
git remote add upstream https://github.com/foo/bar.git
```
で

```
> fatal: remote upstream already exists.
```

となったら

```
git remote rm upstream 
```
で、前の設定を消そう。

##(おまけ)状況確認
自分のローカルとfork元との間の設定はどうなってんだっけ、の時:

```
git remote -v
>origin	git@github.com:username/bar.git (fetch)
>origin	git@github.com:username/bar.git (push)
>upstream	https://github.com/foo/bar.git (fetch)
>upstream	https://github.com/for/bar.git (push)
```
----
#参考
http://www.skyverge.com/blog/github-repository-not-found-workaround/
MacOSXからDockerコンテナへのssh接続ではまったところ

dockerはじめました。@MacOSX
docker1.0以降、インストーラ方式になってからの導入です。

あちこちの情報を見ながら導入してみましたが、ひっかかりがいくつかあったのでリストアップしてみます。

事前に参考にした情報サイトは、

* [Dockerで立てたコンテナにsshで接続する $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2013/12/07/233510)
* [Dockerizing an SSH Daemon Service](http://docs.docker.com/examples/running_ssh_service/)
* [docker のコンテナイメージに ssh でアクセスしてみる ようへいの日々精進 XP](http://inokara.hateblo.jp/entry/2013/09/29/090500)

で、この辺を参考にしてみたりしつつも繋がらない。なんでや！

### MacOSX => boot2docker_vm間のポートフォワーディングができてない

boot2dockerよくできてて、MacOSX上で普通にdockerコマンド走るのでついつい忘れてしまいそうになりますが、MacOSXの上でboot2docker_vm走ってて、その上でdockerコンテナ走ってるんですよね。
なので、dockerコンテナの22番ポートがホストの49153にフォワードされたと言っても、それをさらにMacOSXにフォワーディング必要。
VirtualBoxのboot2docker_vmの、設定=>ネットワーク=>ポートフォワーディングから、設定できます。

![ポートフォワーディング設定](https://qiita-image-store.s3.amazonaws.com/0/10108/f3e76924-633d-fe2e-c546-f659af07bbcf.png)

とりあえず、docker側のポートフォワーディングは49153以降で割り振られるようなので、それ以降で必要な数割り振っとけばそれでいいんじゃないかと思います。
明示的にdockerコマンドで指定するなら、それに応じた設定を。

これでMacOSXからも、

```bash
$ ssh root@127.0.0.1 -p 49153
```

でsshログインコンソールが出るようになりました。

### rootのパスワードがわからない！

…Dockerfileからイメージ作れば、できたてほやほやのサーバ環境だから当たり前ですよね…。
とりあえずdockerコンテナをbashで起動して、

```bash
$ passwd root
```

でパスワード設定してから、コンテナイメージコミットしましょう。

### それでも繋がらない！何度設定してもパスワードがはじかれる！

ちゃんとsshのログインコンソールは出るのですが、何度正しいPWを指定してもはじかれます。
調べてみると、sshdのセキュリティ設定でした。
再びdockerコンテナをbashで起動して、

```bash
$ vi /etc/ssh/sshd_config
```

してやると、デフォルトの設定は

```text
# Authentication:
LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes
```

となってるので、それを

```text
# Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
```

に変えてやります。
もちろん変えた後は、コンテナイメージコミット。

これでようやっと、sshで接続できるようになりました。

### sshdだけ起ち上がっても…

これ以降は私もこれから勉強なのですが、dockerは起動時に一つのコマンドしか受け付けないらしいので、sshdだけ起ち上がってもどうするの、という感じですよね。
その辺はsupervisordというのを使えば解決できるらしいので、次は

* [Dockerってなんじゃ？（Supervisorで複数のサービス起動） memorycraft](http://memocra.blogspot.jp/2014/02/dockersupervisor.html)

あたりに進めばいいのかなと。
Reftexで"Sorry, no matches found"


emacsでRefteXを使用して，`C-c [`としたらBibtexデータベースからある文字列にマッチするエントリを探す．しかし，エントリは存在しているはずなのに，何故か"Sorry, no matches found"と表示されることがある．

こんな場合，`Reftex-parse-all`とすることで，おそらくemacsのメモリにBibtexデータベースが読み込まれるので，エントリにヒットするようになる．
OSXでDocker使っていてssh接続で怒られる時に対処法

# 背景
例えば、Dockerのコンテナの22版ポートを1022で外から繋ぐようなコンテナイメージをトライアンドエラーで作ってる時など、イメージをビルドして再度sshで繋ごうとすると例のSSHのWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! で怒られる。

# 対応方法
もちろん[Atomエディタ](http://atom.io/)やEmacsで~/.ssh/known_hostsを直で編集できるが、21世紀的でない感が半端ないｗ

```
ssh-keygen -R [$(boot2docker ip 2>/dev/null)]:1022
```

# まとめ

まぁ、行番号が出力されるので、[sedでの方法](http://qiita.com/wnoguchi/items/690f3f4651f8f11e4ed3)も割りと良い気もするが、

```
boot2docker ip 2>/dev/null
```

で、IPアドレス取り出せるのは割りとOSXでのDockerが少し分かり始めた自分には必要だったので記事にしてみた。

そんな訳で、朝からDockerでGoogle App EngineのGo版の使い捨て開発環境のイメージの作成に悪戦苦闘中でした。

# 関連記事

- [Dockerやって知ったmoshの残念な点](http://abrakatabura.hatenablog.com/entry/2014/07/26/043530)
- [EC-CUBEをh2oと連携させてdocker for macで動かしてosxfsが大変遅いことを体感した件](http://abrakatabura.hatenablog.com/entry/2017/03/11/094319)
- [DockerでIPython Notebookを動かして、数え上げおねえさんを救う](http://abrakatabura.hatenablog.com/entry/2014/11/30/214133)
- [Dockerで音を鳴らす](http://abrakatabura.hatenablog.com/entry/2014/08/21/062305)
- [JavaScriptをDockerを使って黒い画面に表示する](http://abrakatabura.hatenablog.com/entry/2014/08/09/224138)
- [OSXでDocker入れるとTimeMachineが遅くなるかも #solved](http://abrakatabura.hatenablog.com/entry/2014/07/19/075732)
- [Dockerやって色々勉強になってる件](http://abrakatabura.hatenablog.com/entry/2014/07/15/065931)
- [Dockerの画面をiPhoneに表示する - non vorrei lavorare](http://abrakatabura.hatenablog.com/entry/2014/09/10/205608)
- [Docker入れてからのVirtualBoxのアップデート](http://abrakatabura.hatenablog.com/entry/2014/03/30/080156)
- [DockerのAlpine Linuxでタイムゾーンでハマった](http://abrakatabura.hatenablog.com/entry/2017/07/16/081952)
MacBookAirを再インストールしたときの備忘録 (初回設定編)


# 環境

* MacBookAir Mid 2011
* Mac OS X 10.9.4

# 再インストール

1. optionキー押しながら起動して、修復用のボリュームから起動する。
2. ディスクユーテリティーでMacintosh HDをフォーマットする。
3. OSの再インストールを選択する。

ちなみにネットワーク環境がないとできないっぽい。
あと、うっかりアクティブスピーカー繋げっぱなしにしてたら、音量最大でVoice Overでしゃべられて心臓止まるかと思った。

# 初期設定など

## ソフトウェアアップデート

とりあえず男は黙ってソフトウェアアップデート。

## Kobitoのインストール

単純にこの記事を書くために。

## 設定変更

システム環境設定やFinderの環境設定などを好みに変更。

### キーボードの設定

F1〜F12キーは多用するので標準のファンクションキーとして使うように変更。

![キーボードの設定](https://qiita-image-store.s3.amazonaws.com/0/28352/34df9a02-5c70-e13a-c301-0aa98b089233.png "キーボードの設定")

キーボードは何となく下のようなキーバインドにしてる。

![修飾キーの設定](https://qiita-image-store.s3.amazonaws.com/0/28352/ca77738e-8cea-f8c2-4fbb-b21791e78526.png "修飾キーの設定")

### トラックパッドの設定

タップでクリックを有効に。

![トラックパッドの設定](https://qiita-image-store.s3.amazonaws.com/0/28352/b66cde31-46f2-22f2-bd51-0752a95aafc3.png "トラックパッドの設定")

### コンピュータ名の設定

好きな名前で。

![なんや！龍驤ちゃん関係ないやろ！](https://qiita-image-store.s3.amazonaws.com/0/28352/f5f9dfde-ac4a-71ff-49cf-40d51c671ac7.png "なんや！龍驤ちゃん関係ないやろ！")

### 時計の設定

カレンダーとか見ないと今日が何日かわからない人なので常に表示。

![時計の設定](https://qiita-image-store.s3.amazonaws.com/0/28352/f1c541f6-437e-3da3-4270-b407cefddd4a.png "時計の設定")

### Finderの設定

拡張子なしは気持ち悪いので。
あと検索の設定も微妙に変更。

![07.png](https://qiita-image-store.s3.amazonaws.com/0/28352/24576ca7-0978-450b-99a5-7c4399920704.png "07.png")
[Rails][Middleman] Bootstrapを実践で使うならカスタムビルドしてみよう

## 前提

アセットパイプラインを使った手順で説明します（Webpack等を使っていても同じ考え方でできます）。つまり対象は下記になります。

- Rails
- Middleman 3
- `middleman-sprockets` gemを導入した Middleman 4

## やりたいこと

* Rails や Middleman に Bootstrap を組み込む
* Bootstrap 全部の機能は不要なので、使わないコンポーネントは削りたい
* Bootstrap は日本語のことをあまり考慮してなかったり、好みの色にしたいなど、変数に手を入れたい
* 自分で追加するスタイルシートにも共通の変数が使いたい

## 手順

Gemfile に下記追加して `bundle install` します（Bootstrap 3の場合は `bootstrap-sass` を使うことになろうかと思います）。

```rb:Gemfile
gem 'bootstrap', require: false
```

この gem を使うと、

```scss
@import "bootstrap";
```

を書けとあります。そもそもこれ何やってるかって話なんですが、 [Bootstrap 内部の _bootstrap.scss](https://github.com/twbs/bootstrap-rubygem/blob/master/assets/stylesheets/_bootstrap.scss) を呼んでるんですね。じゃあこれ、自分のいるやつだけ `@import` するようにしてやればいいということになります。

このファイルをコピーして、たとえば `_boostrap-custom.scss` という名前で保存すると、このように呼び出せます。

```scss
@import 'bootstrap-custom';
```

変数の Override がしたい場合は、この前に書くといいでしょう。

```scss
$font-family-sans-serif:  'Lucida Grande', 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif;
// :
// :

@import 'bootstrap-custom';
```
linux システムコール straceで確認、調査

# straceでシステムコールトレース
strace -p 12345 -o /tmp/strace.txt

# straceでシステムコールの統計情報取得 Ctrl + cで止める 
strace -p 12345 -c

下記みたいのがでる。

```text:text
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 93.94    0.827378        8530        97           clone
  5.00    0.044060         454        97           wait4
  0.62    0.005423           3      2161        99 read
  0.15    0.001279           1      1769           poll
  0.07    0.000612           0     18949      2648 stat
  0.05    0.000462           0      5082           munmap
  0.04    0.000387           0      8543           getcwd
  0.03    0.000269           0      1548           write
  0.02    0.000205           0      5483       204 open
  0.02    0.000174           0      5695           close
```

# 値がおかしそうなsyscallのものを出力したファイルで確認する
iOSアプリのFacebook、Twitter連携する際の選択肢


iOSアプリでFacebook、Twitter連携させるときの実装する方法は、たくさんの選択肢があるので簡単にまとめてみました。

## Facebook

Facebookの場合は[iOS SDK](https://developers.facebook.com/docs/ios/getting-started/jp)があるので、一択のような形ですが、割り切ればSDKなしでもやれます。

### iOS5対応のアプリの場合、iOS標準のFacebook連携を使いたくない場合

[Facebook iOS SDK](https://developers.facebook.com/docs/ios/getting-started/jp)の一択。
iOSのFacebook連携をしていないユーザもいるので、iOS SDKで実装しておけば、iOS標準のFacebook連携、SafariやFacebookアプリでの認証を勝手に切り替えてやってくれるので楽です。

### iOS6以降対応で、iOS標準のFacebook連携だけでよい場合

Social.frameworkを利用すれば、iOS標準のダイアログでの投稿ができ、Account.frameworkでアクセストークンも取得できるため、内部でFacebook APIの呼び出しなども可能です。

## Twitter

Twitterは特にiOS SDKなどが標準で用意されていないので、実装方法に迷うことが多いです。

### アクセストークンが必要な場合

Twitter connectなどで自サーバと認証する必要がある場合など、アクセストークンが欲しい場合は、[Reverse auth](https://dev.twitter.com/docs/ios/using-reverse-auth)という仕組みを利用しないとアクセストークンが取得できません。自前で実装するのはそれなりに手間なので、[STTwitter](https://github.com/nst/STTwitter)などのライブラリを利用するのがよいでしょう。

### iOS標準のTwitter連携を利用する場合

Facebook同様、Social.framework, Account.frameworkを使って、ダイアログによる投稿、内部でAPIによる投稿も可能。注意すべきはiOS5対応が必要な場合、Twitter.frameworkを分岐して併用しないといけないというところ。

### iOS標準のTwitter連携を利用しない場合

iOS5以降は、iOS標準のTwitter連携が利用できるので、このパターンは考慮しないでよいかなと個人的には思います。
やるなら、WebViewを利用してCallbackのURLからアクセストークンを取得するような実装を自前でやる方法でいくかなと思います。

--

あまりまとまりませんでしたが、ご参考までに。
javascriptのメモリリーク対策(随時更新)


## クロージャの安易な利用を避ける

最近のモダンなブラウザでは対策されているが、
それでもメモリリークは怖いので慎重に利用する。

### 典型的な悪い例

```html:badSample.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
	<title>サンプル</title>
	<script type="text/javascript">
	function test() {
		var elt = document.getElementById('i0');
		elt.src = 't2.png';
		elt.onclick = function() {
			location.href = 't2.html'; 
		}
	}
	</script>
</head>
<body>
	<div><img id="i0" src="t1.png"></div>
	<div><input type="button" onclick="test()" value="Test"/></div>
</body>
</html>
```

クロージャによる循環参照を引き起こしてる。

```js
function test() {
		var elt = document.getElementById('i0');
		elt.src = 't2.png';
		elt.onclick = function() {
			location.href = 't2.html'; 
		}
	}
```


### メモリリークの間違った検証の仕方
この確かめ方はメモリリークという問題の主眼がわかっていない。

```html:badTest.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
	<title>サンプル</title>
	<script type="text/javascript">
	function test() {
		var elt = document.getElementById('i0');
		elt.src = 't2.png';
		elt.onclick = function() {
			location.href = 't2.html'; 
		}
	}
	</script>
</head>
<body>
	<div><img id="i0" src="t1.png"></div>
	<div><input type="button" onclick="test()" value="Test"/></div>
</body>
</html>
```

メモリリークとは、別のページに遷移してもメモリが開放されない問題。
このコードは同じfunctionを何度も呼んで検証しているが、そもそもtest()の中では
メモリ食いまくるようなたいした処理をしてないのでメモリリークは微々たるもの。
言いたいのは、こんな書き方してるといつか痛い目見るぞって話。

### 痛い目を見た例
がんがんリークする。

```html:memoryLeak.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
	<title>サンプル</title>
	<script type="text/javascript">
	function test() {
		var dummy = [];
		for(var i=0;i<100000;i++){
			dummy[i] = i; 
		}
		var elt = document.getElementById('i0');
		elt.src = 't2.png';
		elt.onclick = function() {
			location.href = 't2.html'; 
		}
	}
	</script>
</head>
<body>
	<div><img id="i0" src="t1.png"></div>
	<div><input type="button" onclick="test()" value="Test"/></div>
</body>
</html>
```

### 対応策
明示的にnullを代入して参照を切る。

```html:bugfixSample.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
	<title>サンプル</title>
	<script type="text/javascript">
	function test() {
		var elt = document.getElementById('i0');
		elt.src = 't2.png';
		elt.onclick = function() {
			location.href = 't2.html'; 
		}
		elt = null;
	}
	</script>
</head>
<body>
	<div><img id="i0" src="t1.png"></div>
	<div><input type="button" onclick="test()" value="Test"/></div>
</body>
</html>
```

いちいちnull代入するのめんどいから他の手を探す(追記予定)
[参考]
[参考]:http://monmon.hateblo.jp/entry/20080416/1208325055
LeapJSのpluginで独自イベント発行


## LeapJSのプラグインについて

LeapJSにはプラグインの機構があるため、下記を分離して開発することが可能. 

 * frameの状態からイベントの発火
 * イベントリスナでイベントに応じた処理

「気づいたら``Leap.loop.on('frame')``に登録したハンドラがバカでかくなっていた」なんて時は適宜独自イベントに切り出すとよいかと。

Leapプラグインの作成で抑えておくべきは以下.

 * LeapJsのプラグイン開発は``Leap.plugin``を利用してファクトリを登録
 * ファクトリは``{hand:function(hand){...}}``や``{frame:function(frame){...}}``の形式で、フレームに対する処理を作成する必要がある.
 * ファクトリの関数内部で、``this.emit(イベント名, イベント引数)``を実行することで、独自イベントを発火することができる.
 * プラグインの利用側は``contoller.use(プラグイン名, オプション).on(イベント名, ハンドラ)``とする

## 実装例

例えば、``hand.garbStrength``を見て「手が握られたとき(handGrab)」と「手が開いたとき(handOpen)」のイベントを発行するようなプラグインは下記のようになる.

```js:handGrab.js
 Leap.plugin('handGrab', function(options){
   var opts = options || {};
   var threshold = opts.threshold || 1;
   return{
     hand: function(hand){
       if(hand.grabStrength >= threshold){   
         if(!hand.data('_grabbing')){
           hand.data('_grabbing', true);
           this.emit('handGrab', hand);
         }
       }else{
         if(hand.data('_grabbing')){
           hand.data('_grabbing', false);    
           this.emit('handOpen', hand);
         }
       }
     }                                       
   };
 });

```

```js:main.js
var controller = new Leap.Controller({}).use('handHold').use('handGrab', {threashold:0.75});
controller.on('handGrab', function(hand){
  console.log('grab! ' + hand.id);
}).on('handOpen', function(hand){
  console.log('ungrab! ' + hand.id);
});

```

なお、handGrabプラグインの中で、``hand.data``関数をつかっているが、これは別のLeapプラグイン[leapjs-plugins](https://github.com/leapmotion/leapjs-plugins)に含まれる``handHold``が提供する機能であるため、``controller.use('handHold')``で事前に読み込んでいる.


## 参考

 - https://github.com/leapmotion/leapjs/wiki/Plugins#plugin-development
いまさら fluentd（まだ） をはじめてみた Apache + Elasticsearch + Kibana なにそれ美味しいの？、その４

# いまさら fluentd はじめてみる４
その前に、[Elasticsearch + Kibana](http://www.elasticsearch.org/) のインストール方法がバージョンにより色々とあり、毎度のごとくはまる私。2014/7/4版として最新の Elasticsearch + Kibana を簡単にインスコできるようになったので自分メモ。

# Elasticsearch + Kibana って
日本語全文検索エンジンですって。懐かしい [Namazu](http://www.namazu.org/index.html.ja) を思い出しますわ。歳がばれてしまいますねｗ
[実践！Elasticsearch](http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html)であるように、蓄積データに対しクエリーを発行できるんですね～ それを Kibana を使用し[ロングテールグラフ](http://markezine.jp/article/detail/111)を作るんのが流行っていると・・・たしかに Kibana おされだわ。

> [ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ](http://www.slideshare.net/y-ken/elasticsearch-kibnana-fluentd-management-tips)

# インストール
いつものごとく [vm](http://qiita.com/murachi1208/items/99daa3ca069d907a7b50) を用意してから１０分で終わります。ほんとうに。あと CentOS6.5 にインスコしてます。


# Elasticsearch をインストール
外部レポジトリの追加(EPEL)をおこないます。また Elasticsearch には java が必要なのでそれもインストールします。形態素解析器の [Kuromoji](http://www.mwsoft.jp/programming/lucene/kuromoji.html) プラグインもインストールしてもよさげ。

```
# rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch
# vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-1.1]
name=Elasticsearch repository for 1.1.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.1/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

# yum install elasticsearch java-1.7.0-openjdk
# chkconfig --add elasticsearch
# chkconfig elasticsearch on
# service elasticsearch start
```

動作をチェック

```
$ curl -X GET http://localhost:9200/
{
  "status" : 200,
  "name" : "Wilbur Day",
  "version" : {
    "number" : "1.1.2",
    "build_hash" : "e511f7b28b77c4d99175905fac65bffbf4c80cf7",
    "build_timestamp" : "2014-05-22T12:27:39Z",
    "build_snapshot" : false,
    "lucene_version" : "4.7"
  },
  "tagline" : "You Know, for Search"
}
```

# Apach のインストール
ここは、いつものごとくす。

```
# yum install httpd
# /etc/init.d/httpd start
# chkconfig httpd on
```

# kibana のインストール
3.1.0 最新版をインストール(2014/7/4時点)。

```
# curl -sL https://download.elasticsearch.org/kibana/kibana/kibana-3.1.0.tar.gz | sudo tar zxf - -C /var/www/html
# mv /var/www/html/kibana-3.1.0 /var/www/html/kibana
# /etc/init.d/httpd restart
```

## アクセス
http://localhost/kibana

![kibana.png](https://qiita-image-store.s3.amazonaws.com/0/44540/f31c73f0-ad1c-2d63-431f-c815fcb098e2.png)

# 次は
ようやっと [fluentd + GrowthForecast を使った方法を勉強してみる（その５）](http://qiita.com/murachi1208/items/73ca933fb3dc4457b224) できたー

## 参考サイト
> [CentOS 6.5 に Elasticsearch をインストールする](http://blog.manabusakai.com/2014/02/centos-elasticsearch-install/)
> [FluentdからElasticsearchに転送してKibanaで可視化する](http://okochang.hatenablog.jp/entry/2014/03/21/191523)
CentOS 5.xにgitを入れる


## 発端
* CentOS 5.8(Final)にyumでgitをインストールしようとするとNo package git available.と言われインストール出来ない。

```text:cmd
# yum install git
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
Setting up Install Process
No package git 
```
* 環境

```text:cmd
# cat /etc/redhat-release ; arch
CentOS release 5.8 (Final)
x86_64
```
※ arch:アーキテクチャ確認コマンド(OSが32bit, 64bitとちらなのか)

## gitのインストール

* epelリポジトリの取得(2014/7現在で最新のものを確認)

```text:cmd
# rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
```
* epelリポジトリを指定してgitをインストール

```text:cmd
# yum install --enablerepo=epel git
```
* インストールの確認

```text:cmd
# git --version
git version 1.8.2.1
```
→2014/7現在で最新のバージョンは1.9系なのでまあまあ。

* ついでtigもインストール

```text:cmd
# yum install --enablerepo=epel tig
```

## 所感
最初はパーケージをwget->makeでやろうとしたが依存関係のインストールで諦めた。
やはりyumのパッケージは遣りやすい。

参考URL
<http://blog.hypermkt.jp/centos5-8%E3%81%AByum%E3%81%A7git%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/>
Docker Meetup Tokyo #3


Docker Meetup Tokyo

* 240人くらい参加
* 200人の枠が2時間ぐらいで終わった
* Docker 1.0がリリースされたばかりでいいタイミングの開催
* dockerをプロダクションで使っている人、3,4人くらい
* 開発環境で使っている人、半分くらい


# Ochestration Tools

@philwhin さん

bit.ly/libswarm
bit.ly/coreos
bit.ly/docker-golub
bit.ly/etcd-brandon
bit.ly/consul-explained

* オーケストレーション
* protable runtime environment just like a lego block, like an entity
* but, orchestrastionはない
* distributed systemではない
* libswarm: orchestration system
* 1 machine 1 container は簡単、 1 machine 沢山のコンテナは難しい、沢山のマシン、ゾーン、コンテナは更に大変。

Monitering
Self-healing
Horizonal Scaling
Auto-scaling

Netfix


Configuration Management
Chef Puppet Ansible Salt

IAAS


Google deploys as "Pods"

Service Discovery

* Apache ZooKeeper (before Docker)
* etcd (after Docker)
* Consul
	* gossip protocol
	* random health checks

Cluster Mnagement

* mesos
* CoreOs Fleet


Distributed Logging

* each containers have logs
* logstash...populer
* syslog + logstash + elasticsearch + kibana = logsearch.io

Scaling

Self-healing

Cloud Foundry + docker

# Monitoring Docker with Mackerel

@stanaka さん

コンテナ側からのモニタリングの課題: コンテナ側からはホスト全体しか見えない
ホスト側からのモニタリング: cgroupのレポートを利用

/sys/fs/cgroup/cpuacct/docker/{container-id}/cpuacct.stat
/sys/fs/cgroup/memory/docker/{container-id}/memory.stat


共通レポート

cat /sys/fs/cgroup/memory/docker.../cgroup.procs

Deployment with Docker Hub

GitHub -> Docker Hub -> hubot でデプロイ

* チャットツールでデプロイ
* ビルドが成功すると、チャットで通知
* チャットでデプロイを指示

Monitering Docker with Mackerel

NewrelicみたいなSaaS。
はてなでサーバ管理ツールをSaaSにしたもの。
サービスとロール

mackerel-docker: ホストからDockerコンテナをモニタリングするツール
Dockerfileに組み込むこともできる。

Blue-green Deployment対応
* ロール単位で可視化しているので、リソースグラフを連続して見ることができる

モニタリングは1ホスト:1コンテナのほうがやりやすい。

# Dive into Docker: ネットワーク

@mainyaa さん

* -link
	* いい点:手軽・便利
	* 悪い点:スケールしない
* ホストネットワーク機能
	* docker run --net=host
	* 1:1の環境でいいかも
	* 悪い点: ポートが被らないようにしないといけない
* Open vSwitch
	* 複数のホストに展開できる
	* IPが被る
* オーケストレーションツール
	* lbswarm
	* Serf, Consul, etcd-fleet

# The age of flynn

@deeeet さん

dmux = docker + tmux
cli-init = goのコマンドラインツールを簡単に生成する

Flynn: Dockerを使ったオープンソースのPaaS
ほぼすべてのコンポーネントがDockerコンテナで動く

アーキテクチャ
layer0(The Grid): リソースフレームワーク層
layer1: 高位なコンポーネント
RailsアプリでSQLを発行している場所を特定するのにquery_traceとかいうgemがぐう便利

# RailsアプリでクソみたいなSQLを大量に発行している箇所を知りた〜い

Railsアプリで、発行されるSQLの量を頑張って減らすときに、例えばN+1問題をなんとかしたいと思ってBulletとかいうgemを入れて、N+1を出している箇所を特定したりする場合は多いと思います。

実際bulletはすっごい便利なんですが、N+1問題を発生させている箇所を検出できない場合があったり、そもそもの原因がもともと書いているロジックが悪くて、それの見直しで解決しなきゃいけない場合だったりとかする場合がよくあると思います。

で、それで前々から
**「このTerminalに出てくるSQL文、Railsアプリのどこが出してるのかな〜それがわかったら超ベンリなのにな〜〜〜」**と思ってました。
会社の同期に聞いたらめっちゃ便利なのがあったんで以下に書きます。もっと早く知りたかった。

# query_traceをぶっこむ

query_traceとかいうgemがあります。これを入れます。
https://rubygems.org/gems/query_trace
ただ、↑の奴はバージョンが古く、
最近のrailsに対応しているのがgithubにありますのでそっちを入れます。↓
https://github.com/dolzenko/query_trace

Gemfileに以下を追記。

```rb:Gemfile
group :development, :test do
  gem 'query_trace', :git => 'http://github.com/dolzenko/query_trace.git'
end
```

あとはTerminalで

```shell-session
$ bundle install
```

# 実行方法

rails sするときに以下みたいな感じで起動

```shell-session
$ QUERY_TRACE=true rails s
```
以降、発行されるSQLがどこから来たのかが出てきます。


## おまけ

**N+1問題ってなによ**
http://www.syboos.jp/hibernate/doc/20080806135128920.html

**Bulletについて**
http://morizyun.github.io/blog/speed-up-rails-bullet/
doctest使ってみた

## doctestライブラリ
pythonには関数定義の直後に `''' foo bar buzz ''' `みたいにして関数の説明書きみたいなのを入れられる。これを`docstring`という。doctestはこの`docstring`を使って関数の動作テストもしちゃおうっていう話。

## 使ってみた
### 概要
なにか関数書かないといけないわけで。`factorial`とか普通すぎるので`fizzbuzz`にした。pythonには`one liner`という縛りがあって、[ここ](http://stackoverflow.com/questions/6890037/python-fizzbuzz-in-one-line)のコードを使ってみました。

```python:fizzbuzz.py
def fizzbuzz(n):
    """
    This function returns a list whose elements are
    converted into fizzbuzz form.

    >>> fizzbuzz(10)
    [1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz']
    >>> len(fizzbuzz(9))
    9
    >>> fizzbuzz(10) + 1
    Traceback (most recent call last):
      File "/Users/yourname/python/fizbuzz.py", line 32, in <module>
        fizzbuzz(10) + 1
    TypeError: can only concatenate list (not "int") to list
    """
    for i in range(1,n+1): res.append("FizzBuzz"[(i**2)%3*4:8--(i**4)%5] or i)
    return res


if __name__ == '__main__':
    import doctest
    doctest.testmod()

```

### FizzBuzz関数について
ちょこっと説明すると、"FizzBuzz"という文字列を切り分けてプリントしている。`:`で区切った左右の数を調整することで所望のストリングを切り出しているというわけ。要するに

```
case(i):
  iが [3の倍数] かつ [5の倍数]:
    "FizzBuzz"[0:8]

  iが [3の倍数] かつ [5の倍数ではない]:
    "FizzBuzz"[0:4]

  iが [3の倍数ではない] かつ [5の倍数]:
    "FizzBuzz"[4:8]

  iが [3の倍数ではない] かつ [5の倍数ではない]:
    "FizzBuzz"[4:4] /* Empty String => None */
```

ということ。これを実現するためには、`3の倍数の時に0、その他は4`のものと、`5の倍数の時に8、その他は4`というものを用意すればいい。one-linerなので無理やり剰余で頑張ってるけど、別に関数つくってもいいと思う。




## 感想
### エラーが起きるとこうなる
ちなみにシミュレートしたのは、返す値を増やした場合。

```
**********************************************************************
File "/Users/hiroberry/python/foo.py", line 8, in __main__.fizzbuzz
Failed example:
    len(fizzbuzz(9))
Expected:
    10
Got:
    9
**********************************************************************
1 items had failures:
   1 of   3 in __main__.fizzbuzz
***Test Failed*** 1 failures.
[Finished in 0.1s]
```
一目瞭然。便利すぎでしょう。

### Tracebackについて
動かない例ををわざわざ作って試してみた。Traceback以下の文はぴったり一致してる必要はなさそう。どうやら、`TypeError: can only ...`の文だけを見ているようだ。
ViewPagerで現在のpageを取得する


Google検索などで出てくる推奨されている方法だとArgumentに保存してその値を毎回取り出している。

しかしすべてのPageを一つのFragmentで使い回す&Asynctaskで非同期処理を行っていたら正しいPageのpositionが取得できなかった。

どうすればいいのか分からなかったので取りあえず以下のようにした

```java:

----ViewPager class----
public static int pagePosotion;

@Override
	public void onTabSelected(ActionBar.Tab tab,
			FragmentTransaction fragmentTransaction) {
		// When the given tab is selected, switch to the corresponding page in
		// the ViewPager.
		currentPage = tab.getPosition();
		mViewPager.setCurrentItem(tab.getPosition());
	}


----Fragment class----

Log.e("Page position", "" + ViewPagerClassName. pagePosotion)
```


多分もっと良いやり方とかあると思います。
知っている人がいたら是非教えてください。
whenever で定期処理をcronに設定したメモ

月次で数字を記録する処理をしたかったのでwheneverを使ってみた。

##タスクの作成
something.rbをrailsプロジェクト内のlib/tasks/以下に作成
`class Tasks::Something
  def self.execute
    print "some action!!\n"
  end
end`

下記コマンドで実行されるかテスト
`rails runner Tasks::Something.execute`

##whenever
Gemfileに追加してbundle install
`gem 'whenever', :require => false`

下記コマンドでconfig以下にschedule.rbが作成される
`bundle exec wheneverize .`

schedule.rbに設定を記述（参考：http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/）
`every '0 1 1 * *' do
  runner "Tasks::Something.execute", :environment => :production
end`

crontabに登録して完了
`bundle exec whenever --update-crontab`

削除するとき
`bundle exec whenever --clear-crontab`
Cubaseの再インストール


# UR-22のドライバ設定

# Cubaseのインストール

1. Cubase　AIでなくElements体験版をダウンロード
http://japan.steinberg.net/jp/support/downloads/cubase_elements_7.html#c237480

2. インストール
3. Cubaseを起動し、今すぐ登録を選択
4. MySteinbargよりライセンスの再発行を行う
5. eLicenseプログラムを起動
6. コードの登録からコードを入力
Alfredで選択したファイルをEmacsで開く


[Alfred](http://www.alfredapp.com/)でファイルを選択し、"Open with..."でファイルを開く時、emacsclientを指定したい。
が、Alfredが.appなファイルしか拾ってくれないみたいなので、候補にemacsclientが出てこない。

ということで、emacsclientを.app化してみた。
参考にしたのは[このブログ](https://kozikow.wordpress.com/2013/10/31/making-emacsclient-default-editor-on-mac/)(というか、そのまんま(- -;;)

環境はMac OS X 10.9.3。それ以前で使えるかどうかは未確認です。

## Automaterを使う

1. Automaterで新規ワークフローを作成する。書類の種類は"アプリケーション"を選択
2. アクションは、"シェルスクリプトを実行"を選択
3. 入力の引き渡し方法は、"引数として"を選択
4. 以下のシェルスクリプトを入力して、保存。保存先はAlfredの検索対象になってる場所に

```shell-script:
for f in "$@"
do
	emacsclient --alternate-editor="" -n "$f"
done
```
わたしはMacPortsのemacs-appを使ってるので、emacsclientはそちらのが実行されるようにフルパスで指定してます。

動作確認のためにAutomaterで実行しようとすると、

    このアプリケーションは Automator で実行する場合、入力を受け取りません。

とお叱りのダイアログが。対処法はそのダイアログに書いてある通り。
"指定されたFinder項目を取得"アクションを前に追加して適当なファイルを追加してやる。
このアクションのオプションで"このアクションの入力を無視"にチェックを入れてから保存すれば、実際にアプリとして実行する時には無視されるようになる。

これで晴れて"Open with..."から選択して、Emacsで指定されたファイルが開くことが出来た。
RuboCop | Style/GuardClause

# RuboCop | Style/GuardClause

## 概要

RuboCopの「Style/GuardClause」警告について。

ガード節の使用をチェックします。
デフォルトでは condition 内の処理が 1 行以上の場合にチェックします。

## GuardClause

各設定値での検証結果をまとめます。

### 検証プログラム

guard_clause.rb

~~~ruby
def test
  if something
    a = 1
    print a
    work
  end
end

def test
  return unless something
  a = 1
  print a
  work
end

def test
  a = 1
  print a
  work if something
end
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
GuardClause:
  MinBodyLength: 1

IfUnlessModifier:
  Enabled: false
~~~

~~~bash
$ rubocop guard_clause.rb
Inspecting 1 file
C

Offenses:

guard_clause.rb:2:3: C: Use a guard clause instead of wrapping the code inside a conditional expression.
  if something
  ^^

1 file inspected, 1 offense detected
~~~

### 実行結果 4行以上 の場合にチェックするように設定します

.rubocop.yml

~~~yaml
GuardClause:
  MinBodyLength: 4

IfUnlessModifier:
  Enabled: false
~~~

~~~bash
$ rubocop guard_clause.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~
MongoDBのAggregationについて基本的なこと

最近RailsでMongoDBを使うことがあって、集計処理の部分でちょっと基本的な知識が不足気味な感じがしたので、公式ドキュメントを漁って理解を深めるなどしてみようかと。
http://docs.mongodb.org/manual/meta/aggregation-quick-reference/

#$group
SQLでいうgroup byのようなものを実現する。

こんな感じのドキュメントがあるとして

```
db.items.insert([{
	name: "pencil",
	category: "stationery",
	price: 105,
	stock: 12
},
{
	name: "eraser",
	category: "stationery",
	price: 140,
	stock: 5
},
{
	name: "ballpoint",
	category: "stationery",
	price: 110,
	stock: 7
}
]);
```

文具(stationery)の中で最も高価な商品を抽出します。

```
db.items.aggregate([
	{ $group: { _id:  "$category", max_price: { $max: "$price" } } }
]);

=> { "_id" : "stationery", "max_price" : 140 }
```

#$match
これに抽出条件を追加してみます。SQLでいうwhere条件みたいなものですね。
消しゴム(eraser)を除いて、最も高価な商品を抽出します。

```
db.items.aggregate([
  { $match: { name: { $ne: "eraser"} } },
  { $group: { _id:  "$category", max_price: { $max: "$price" } } }
]);

=> { "_id" : "stationery", "max_price" : 110 }
```

ちなみに、この`$match`や`$group`というものはpipelineと呼ばれています。

#$project
projection(射影とか投影とか)
出力する項目を指定することが出来る。SQLでいうSELECT col1, col2 〜 みたいな感じ。

```
db.items.aggregate([
  { $project: { name: 1, stock: 1 } }
]);

=> { "_id" : ObjectId("53b6994517e790c63de53329"), "name" : "pencil", "stock" : 12 }
{ "_id" : ObjectId("53b6994517e790c63de5332a"), "name" : "eraser", "stock" : 5 }
{ "_id" : ObjectId("53b6994517e790c63de5332b"), "name" : "ballpoint", "stock" : 7 }
```

_id列がいらない場合

```
db.items.aggregate([
  { $project: { _id: 0, name: 1, stock: 1 } }
]);

=> { "name" : "pencil", "stock" : 12 }
{ "name" : "eraser", "stock" : 5 }
{ "name" : "ballpoint", "stock" : 7 }
```

一律40円値上げしてみる(price + 40)。
"raised_price"が列別名になる。

```
db.items.aggregate([
  { $project: { _id: 0, name: 1, raised_price: { $add: ["$price", 40] } } }
]);

=> { "name" : "pencil", "raised_price" : 145 }
{ "name" : "eraser", "raised_price" : 180 }
{ "name" : "ballpoint", "raised_price" : 150 }
```

単に列別名にするだけにも使える。

```
db.items.aggregate([
  { $project: { _id: 0, alias_name: "$name" } }
]);

=> { "alias_name" : "pencil" }
{ "alias_name" : "eraser" }
{ "alias_name" : "ballpoint" }
```

サブドキュメントを含めた形式で返す。

```
db.items.aggregate([
  { $project: { 
    _id: 0,
    name: 1,
    new_item: { 
      new_price: { $add: ["$price", 40] },
      added_stock: { $add: ["$stock", 3] }
    }
  }}
]);

=>
{ "name" : "pencil", "new_item" : { "new_price" : 145, "added_stock" : 15 } }
{ "name" : "eraser", "new_item" : { "new_price" : 180, "added_stock" : 8 } }
{ "name" : "ballpoint", "new_item" : { "new_price" : 150, "added_stock" : 10 } }
```

うむむ。少し基本的なところが理解できた。
他にも`$unwind`, `$redact`, `$out`など気になるのがたくさんあるのでもう少し継続してみることにしますね！