OmniAICreator/Qiita-1.07M huggingface dataset:
データサイエンスの面接において知っておくべき２１のQ＆A（日本語訳その７「価格の最適化、価格弾力性、在庫管理、競合他社の情報に精通していますか？例を挙げてください」）

Originally published in KDnuggets: <a href="http://www.kdnuggets.com/2016/02/21-data-science-interview-questions-answers.html">21 Must-Know Data Science Interview Questions and Answers</a>
*KDnuggetsより正式に和訳を書くことの許可を得ました。*
*Gregory-san thank you for the approval*

まとめページを作りました。他の質問は[こちら](http://qiita.com/ogamiki/items/8d69d938bc0d3171c203)から。

#7.Are you familiar with price optimization, price elasticity, inventory management, competitive intelligence? Give examples.
和訳すると「価格の最適化、価格弾力性、在庫管理、競合他社の情報に精通していますか？例を挙げてください」となります。

原文
>Those are economics terms that are not frequently asked of Data Scientists but they are useful to know. 

データサイエンティストに頻繁に聞かれる質問ではありませんが、有用な知識であると始まっています。

原文
>Price optimization is the use of mathematical tools to determine how customers will respond to different prices for its products and services through different channels. 

価格最適化は、顧客が製品やサービスによって違う価格や、サービスのチャネルの違いによって、行動がどう変わるかを数学的な手法によって決めることです。

原文
>Big Data and data mining enables use of personalization for price optimization. Now companies like Amazon can even take optimization further and show different prices to different visitors, based on their history, although there is a strong debate about whether this is fair. 

ビッグデータとデータマイニングは、価格最適化を個人レベルで使用可能にします。今はAmazonでは、顧客の過去の行動履歴に基づき、それぞれの顧客に異なる価格を表示することができます。ただ、これが公正であるかどうかについては議論がなされています。

原文
>Price elasticity in common usage typically refers to
- Price elasticity of demand, a measure of price sensitivity. It is computed as: 
Price Elasticity of Demand = % Change in Quantity Demanded / % Change in Price.

価格弾力性の一般的な利用方法は、
- 需要における価格弾力性は、価格の変動によって、ある製品の需要が変化する度合いを示します。
計算手法は、$$需要における価格弾力性　= \frac{需要の変化率}{価格の変化率} $$

原文
>Similarly, Price elasticity of supply is an economics measure that shows how the quantity supplied of a good or service responds to a change in its price. 

同様に、供給の価格弾力性は、供給がその価格の変化にどのように応答するかを示します。

原文
>Inventory management is the overseeing and controlling of the ordering, storage and use of components that a company will use in the production of the items it will sell as well as the overseeing and controlling of quantities of finished products for sale. 

在庫管理は、販売するモノの発注、貯蔵だけでなく、それが組み込まれるモノまで含めての監督と制御をすることを表します。

競合に対してはリンクだけが張られています。
- [Competitive Intelligence Metrics, Reports](http://www.kaushik.net/avinash/competitive-intelligence-analysis-tools-metrics-reports-techniques/) by Avinash Kaushik
- [37 Best Marketing Tools to Spy on Your Competitors](https://blog.kissmetrics.com/james-bond-of-the-web/) from Kissmetrics
- [10 best competitive intelligence tools from 10 experts](http://barnraisersllc.com/2014/10/10-best-competitive-intelligence-tools-10-experts/)

#まとめ
データサイエンティストには直接関係ない知識ではあるかもしれないという言葉の通り、データサイエンティストのスキルとしては違和感のあるものです。ただ、データサイエンティストは他のビジネス部門とやり取りすることも多いため、別部門での言葉にも広く知見を持つ必要があると私は思いますので、このような質問に対しても最低限の答えを返せるようにしておくことはいいことだと思います。
Macのdashboardが邪魔なので起動しないようにする

##Macのdashboardが邪魔

以前使っていたmacではdashboardが邪魔だった(特に使えるアプリもなく、他のもので代用できる)ので
offにしていたのだがやり方を忘れたのでメモ。

###Terminalを起動する

```
$ defaults write com.apple.dashboard mcx-disabled -boolean true
```

###Dockの再起動

```
$ killall Dock
```

終わり。

###dashboardが再度使いたくなったら

```
$ defaults delete com.apple.dashboard mcx-disabled
```

そして再度Dockを再起動する。

以上。
GitHubのwebhookを受け取って、自動でgit pullするスクリプト

GitHubのwebhook機能を使うと、Pushされた時に自動でサーバーに通知を送ることができます。
その通知を処理して、自動でgit pullを実行し、サーバー上のレポジトリを最新に保つスクリプトを書きました。
webhookの設定は、GitHubのレポジトリの「Settings」→「Webhooks & services」→「Add webhook」から行ってください。
以下のスクリプトをサーバー上に設置し、「Payload URL」にスクリプトのアドレスを指定してください。

# PHPの場合

```php
<?php

// 設定
$LOG_FILE = dirname(__FILE__).'/hook.log';
$SECRET_KEY = 'your key';

$header = getallheaders();
$hmac = hash_hmac('sha1', $HTTP_RAW_POST_DATA, $SECRET_KEY);
if ( isset($header['X-Hub-Signature']) && $header['X-Hub-Signature'] === 'sha1='.$hmac ) {
	$payload = json_decode($HTTP_RAW_POST_DATA, true);	// 受け取ったJSONデータ
	// ここに実行したいコードを書く
	exec('git pull 2>&1');
	file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." ".$_SERVER['REMOTE_ADDR']." git pulled: ".$payload['after']." ".$payload['commits'][0]['message']."\n", FILE_APPEND|LOCK_EX);
} else {
	// 認証失敗
	file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." invalid access: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND|LOCK_EX);
}
```

hash_hmac()を使ってハッシュ値をつくり、X-Hub-Signatureヘッダーと一致するか調べます。
一致しなければ、正しくGithubから送られてきたものでないので何もせず終了します。
$SECRET_KEYには、githubに設定したキーをそのまま設定してください。


# Rubyの場合

```rb
#!/usr/bin/env ruby
# coding: utf-8

# 設定
LOG_FILE = 'hook.log'
SECRET_KEY = 'your key'

require 'openssl'
require 'json'
require 'logger'

log = Logger.new(LOG_FILE)
body = STDIN.read	# 生のPOSTデータの受け取り
HMAC_DIGEST = OpenSSL::Digest.new('sha1')
hmac_signature = 'sha1='+OpenSSL::HMAC.hexdigest(HMAC_DIGEST, SECRET_KEY, body)
if ENV["HTTP_X_HUB_SIGNATURE"] == hmac_signature
	payload = JSON.parse( body )
	# ここに実行したいコードを書く
	system('git pull')
	log.info "#{ENV['REMOTE_ADDR']}  git pulled: #{payload['after']} #{payload['commits'][0]['message']}"
else
	# 認証失敗
	log.warn "invalid access from #{ENV['REMOTE_ADDR']}"
end

puts "Content-Type: text/html\n\n"
```

やっていることは、PHPの場合と同じです。


# 参考

https://developer.github.com/v3/repos/hooks/#create-a-hook
http://blog.manaten.net/entry/573  (情報が古いです)
データサイエンスの面接において知っておくべき２１のQ＆A（日本語訳その６「根本原因解析(RCA)とは何ですか？」）

Originally published in KDnuggets: <a href="http://www.kdnuggets.com/2016/02/21-data-science-interview-questions-answers.html">21 Must-Know Data Science Interview Questions and Answers</a>
*KDnuggetsより正式に和訳を書くことの許可を得ました。*
*Gregory-san thank you for the approval*

まとめページを作りました。他の質問は[こちら](http://qiita.com/ogamiki/items/8d69d938bc0d3171c203)から。

6.What is root cause analysis?
和訳すると「根本原因解析(RCA)とは何ですか？」となります。

[根本原因解析](https://ja.wikipedia.org/wiki/根本原因解析)をWikipediaから引用すると
>根本原因解析（英：Root cause analysis (略：RCA)）は、問題解決の中の一つの部類に属し、問題や事象の根本的な原因を明らかとすることをねらいとする。単にあきらかな兆候に即座に対処するのに対して、根本原因自身を修正、及び除外する試みによって、最高の問題解決を図る考えの実践を基調としている。根本原因の度合いを直接修正することによって、問題の再発の見込みが最小限になることが期待される。しかしながら、一方的な介入による完璧な再発防止は常に出来るとは限らない。従って、根本原因分析は反復処理であることと、継続改善（改善と同義語）の道具としての視点であると考えられている。

原文
>Root cause analysis was initially developed to analyze industrial accidents, but is now widely used in other areas, such as healthcare, project management, or software testing.

根本原因解析は、最初に労働災害を分析するために開発されましたが、現在では広くそのような医療、プロジェクト管理、またはソフトウェアのテストなどの他の分野で使用されています。

MDHの[Root Cause Analysis Toolkit](http://www.health.state.mn.us/patientsafety/toolkit/)が紹介されています。

原文
>Essentially, you can find the root cause of a problem and show the relationship of causes by repeatedly asking the question, "Why?", until you find the root of the problem. This technique is commonly called "5 Whys", although is can be involve more or less than 5 questions. 

基本的に、問題の根本を見つけるまで繰り返し、「なぜ？ 」と質問することによって原因の関係を示すことができます。一般的にこのテクニックは質問が5個より大きい場合や少ない場合もありますが、**5 Whys**と呼ばれます。

#まとめ
RCAとか根本原因解析と言われるとなんだろうと思う方がいるかもしれませんが、5 Whysというと知名度が高いかと思います。
データサイエンスの面接において知っておくべき２１のQ＆A（日本語訳その５「アルゴリズムがよくなったことをどう証明しますか？」）


Originally published in KDnuggets: <a href="http://www.kdnuggets.com/2016/02/21-data-science-interview-questions-answers.html">21 Must-Know Data Science Interview Questions and Answers</a>
*KDnuggetsより正式に和訳を書くことの許可を得ました。*
*Gregory-san thank you for the approval*

これまでと同じように全記事へのリンク張っていくことに限界を感じ、まとめページを作りました。他の質問は[こちら](http://qiita.com/ogamiki/items/8d69d938bc0d3171c203)から。

#5.How can you prove that one improvement you've brought to an algorithm is really an improvement over not doing anything?

和訳すると「アルゴリズムに対して行った一つの改善が、何もしなかったことに比べて改善されているか、どのように証明しますか？」となります。

原文
>Data scientists do not let their human emotions overrun their logical reasoning. While the exact approach to prove that one improvement you've brought to an algorithm is really an improvement over not doing anything would depend on the actual case at hand, there are a few common guidelines:

データサイエンティストは自分たちの持っている論理的な理由を他の人々の感情に流されてはいけません。いくつかの一般的なガイドラインによって、アルゴリズムに対して行った一つの改善が、何もしなかったことに比べて改善されているか正しく証明します。

原文
>- Ensure that there is no selection bias in test data used for performance comparison
- Ensure that the test data has sufficient variety in order to be symbolic of real-life data (helps avoid overfitting)
- Ensure that "controlled experiment" principles are followed i.e. while comparing performance, the test environment (hardware, etc.) must be exactly the same while running original algorithm and new algorithm
- Ensure that the results are repeatable with near similar results
- Examine whether the results reflect local maxima/minima or global maxima/minima


- 性能比較のために使用されるテストデータには選択バイアスが存在しないことを確認します
- テストデータは、現実のデータの象徴であるために十分な多様性を持っていることを確認します（オーバーフィッティングを回避するのに役立ちます）
- 「コントロール実験」の原則が守られていることを確認し、すなわち元のアルゴリズムと新しいアルゴリズムのパフォーマンス比較を実行する場合、テスト環境(ハードウェアなど)が元のアルゴリズムを実行しているときとまったく同じであることを確認します
- 同様の結果で再現可能であることを確認します
- 結果が極大値/極小値または最大値/最小値を反映するかどうかを調べます

原文
>One common way to achieve the above guidelines is through A/B testing, where both the versions of algorithm are kept running on similar environment for a considerably long time and real-life input data is randomly split between the two. This approach is particularly common in Web Analytics. 

上記のガイドラインを満たす1つの一般的な方法はA/Bテストです。A/Bテストでは、実データを無作為に2つに分割して、新しいアルゴリズムと旧来のアルゴリズムでそれぞれに対して実行される状態を、同様の環境で長時間にわたりテストします。A/Bテストはウェブ解析では特に一般的です。

#まとめ
今回のパートで紹介されているガイドラインはとても当たり前の内容ですが、その手前の何よりも感情に論理的な理由を流されてはいけないというのが一番ポイントだと思います。まだまだ日本においては、データをビジネスに活用するという文化は根付いておらず、データサイエンティストの地位もとても低いため、皆さん苦労されているかと思います。
SVNユーザーに伝えたいGitのよさ

私は業務でのバージョン管理ではSubversionしか使ったことがありません（こっそりローカルでGitを使ったことはあるけど）
多くのOSSがGitで管理され、GitHubで公開されるようになっているのも最早「最近」とは言えないようになってきている今日、なんとかGitを導入したい、させたい。という方の一助となればと思い、メモしておきます。

## 既にGItが主流になっている
冒頭でも触れましたが、既に多くのOSSはもうGitでバージョン管理されています。
Googleトレンドでバージョン管理ソフトの検索件数も、2012年には逆転されています。
![google_trend.png](https://qiita-image-store.s3.amazonaws.com/0/48832/2d9a4086-39d8-299a-722e-564b481991f3.png)
現在の状況は[こちら](https://www.google.co.jp/trends/explore#q=%2Fm%2F05vqwg%2C%20%2Fm%2F012ct9%2C%20%2Fm%2F08441_&cmpt=q&tz=Etc%2FGMT-9)から見てみてください。


## 何が違うのか
Subversionは集中型、Gitは分散型のバージョン管理システムと呼ばれています。
Subversionでは「レポジトリ」をチェックアウトしてきた「作業コピー」上でファイルに変更を加え、その内容をレポジトリへコミットします。
一方でGitは、作業者全てが「レポジトリ」を持っている形になります。GitHubなどで管理しているレポジトリは「これがアップストリーム」と決めているだけで、レポジトリの1つに過ぎません。
![SVNイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/48832/07b00643-b63e-2cbe-0187-579d10ae92d0.png)![Gitイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/48832/69a13b86-35b2-480a-5754-76320ec2a90a.png)

分散型の場合は、ひとつのレポジトリの中でバージョン管理が完結しているということになります。
※それによる恩恵は後述。

## いいこと

### コミットを溜められる
「新規機能は単体テスト終わってからコミットしてね」と言われたとします。絶望しか無い。実際にコードを書いていると、もっと細かい単位で状態を保存しておきたいと感じるかと思います。色々面倒な設定を乗り越えてDBからデータを取得できるようになった時、できるかわからないけど試してみたい修正がある時 etc...
そんな時にGitはコミットしてもプッシュするまでは、状態をローカルのみに保持しています（SVNのコミットがGitのプッシュに相当している）。気軽にゲームのセーブデータが作成できるようなものです。詳細は割愛しますが、完成したらコミットをまとめてpushすることもできます。

### ローカルブランチを切れる
前述の溜めた"汚い"コミットの状態は誰も使いませんが、差分やログだけ参照したいものです。説明の順番が前後しましたが、開発時にはmaster（SVNのtrunkに相当）からブランチを切って、masterは常に"綺麗な"状態に保つことができます。
![histryイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/48832/8d8c6a73-ccd3-9c5b-371c-c49559264f3e.png)

### オフラインで作業ができる
今日ではあまり有り難みがないかもしれませんが、レポジトリの情報全てを保持しているためpush（SVNのcommit）とpull（SVNのupdate）以外の作業はほとんど可能です。個人のローカルだけで何かをバージョン管理したい場合でも、簡単にできるということになります（SVNでもローカルでサーバー立てて云々とできることにはできますが）。
ログの確認も、特定のリビジョンにおけるファイルの内容もできます。

## 悪いこと

### 学習コストが高い
Subversionで多くのユーザーが使っているであろうTortoiseSVNでは、用語さえわかっていれば右クリックひとつでなんとなく把握出来てしまうくらいに、使いやすくシンプルです。
一方でGitはできることが多いために、覚えるために少し、ほんの少し時間がかかる場合もなきにしもあらずです。

### 部分チェックアウト・更新ができない
できないのです（厳密にはできなくないが、面倒）。
しかし、更新漏れが無くなる＝レポジトリ内の不整合がなくなる。というメリットでもあります。
部分チェックアウトが本当に必要か、考えなおしてみましょう。

### リビジョンが番号じゃない
Gitのリビジョンはハッシュです。（例：7c5b61696a13550b7a8592324cc9368622990007）
リビジョン番号だけで内容が分かる変態同士の会話でない以上は、ログを参照しながら会話することになるのでそこまで大きなデメリットではありませんが、少しだけ面倒です。
余談ですが、仕組み上コミットは頭4桁だけでほぼ一意に定まるそうです。

## まとめ
以上、簡単にSubversionと比較してGit導入のメリット・デメリットを紹介しました。
記事の長さのバランスのために割愛しましたが、まだまだ沢山できること・小ネタもあります。
もし本記事で興味を持ってくださった方いらっしゃいましたら、使ってみてください。とても楽しいです。そしてGitユーザーが増えたらいいな、と思います。
New Android app For tv Show Time Schedule

 New Android app For tv Show Time Schedule Today evening time will air the scene 2 of season 6 of Game of Thrones, titled "Home", in which we can find the arrival of the child Stark, Bran! 

Amid the night, scene 2 of season 6 of Game of Thrones will air in the US on HBO. We have as of late possessed the capacity to come back to different data about the arrangement, in planning for the telecast of this scene 2: first we could disclose our forecasts about whatever is left of the season 6 of Game of Thrones Daenerys for. At that point we returned on the demise of (spoilers) in scene 1 of season 6 of Game of Thrones, which was very typical. Here likewise the broad data effectively revealed on scene 2 circulated the previous evening. 

[watch game of thrones season 6 episode 2 online](http://wiki.wargaming.net/en/User:Watch_game_of_thrones_season_6_episode_2_On_line_F.r.e.e._1080p:eu)
フィボナッチ例題（Erlang）

フィボナッチ数列の桁数を求めるアルゴリズム。本来であれば、Erlangによる並列性を実装するアルゴリズム問題ですが、自身のサーバはコア数1であるため、今回はErlangを利用する癖にシングルスレッドで実装します。

**例１（プログラム）**
wikipediaのアルゴリズムを、そのまま再帰実装する。

```erlang:fib.erl
-module(fib).
-export([fib/1]).

fib(0) -> 0;
fib(1) -> 1;
fib(N) -> fib(N - 1) + fib(N - 2).
```

**例１（実行）**

```erl:erl
2> timer:tc(fib,fib,[10]).
{7,55}
3> timer:tc(fib,fib,[20]).
{596,6765}
4> timer:tc(fib,fib,[30]).
{69800,832040}
```

数値が増えるごとに、桁数が激増していますね。
fib(100)など実行すると、5分以上反応がありませんでした。
少しだけアルゴリズムに手を加えて、結果を出すよう高速化を試みます。

**例２（プログラム）**

```erlang:fib.erl
-module(fib).
-export([fib/1]).

fib(0) -> 0;
fib(1) -> 1;
fib(2) -> 1;
fib(N) when N rem 2 == 0 ->
  ((fib(N div 2 + 1) * 2) - fib(N div 2)) * fib(N div 2);
fib(N) ->
  fib(N div 2 + 1) * fib(N div 2 + 1) + fib(N div 2) * fib(N div 2).
```

**例２（実行）**

```erl:erl
2> timer:tc(fib,fib,[10]).
{7,55}
3> timer:tc(fib,fib,[20]).
{27,6765}
4> timer:tc(fib,fib,[30]).
{20,832040}
5> timer:tc(fib,fib,[100]).
{187,354224848179261915075}
```

例１の時点では、fib(100)で５分以上反応がなかったが、例２では187ミリ秒で結果を出せるようになりました。今後は複数プロセスなどErlangの強みに観点を当てていきたいと存じます。
今更ながら初めてEmacsを使ってみた

![emacs logo](http://ergoemacs.org/emacs/emacs_logo/emacs_logo_no_border.png)
初めてEmacs触ってみたけど色々わからなくて
調べたことを備忘録にしておこうかと。

# 0. 環境
- kona Linux 3.0

# 起動の仕方
普通に
$ emacs
で起動するんですけど、
GUI環境なのでこれだけだとGUI版が起動してしまうので
> $ emacs -nw

nwオプションを付けて起動
-nw, --no-window-system

GUIでも悪いわけじゃないけど、
ターミナル上で作業することが多いから
致し方無い。

# 終了の仕方
Ctrl-x をして
Ctrl-c を押す

# 操作間違えた時（キャンセル）
Ctrl-g

#とりあえず最初なのでこれだけ
文字入力のモード切り替えが無いのは楽で良いですね。
入力以外の操作は全部CtrlかAltもしくはEscで
出来るのも良いところですね。
もう少し使ってみようと思います。
リダイレクションの「>」「 >>」とパイプ「 | 」の違い。

####概要
***
Unix、Linuxのコマンドで、標準出力の結果を何かに渡したい時に、リダイレクションである「>」「>>」、パイプの「 | 」の違いを説明します。

####リダイレクション
***
リダイレクションは、標準出力をテキストファイルに渡したいときに使用します。

「>」「>>」の違い

| 項目 | 説明 | 
|:-----------:|:------------:|
| >       |   ファイルへの<Font color="red">上書き</font> |  
| >>   |  ファイルへの<Font color="red">追記</font> | 

####サンプル

```bash:sample.list
$ cat sample.list 
1 Ichiro ichiro@sample.com
2 Jiro   jiropsample.com
```

「 >> (追記)」の場合

```bash:
#変数varに"3 tarou tarou@sample.com"の情報を設定
$ var="3 tarou tarou@sample.com"
$ echo ${var}
3 tarou tarou@sample.com

# >>で追記します。
$ echo $var >> sample.list 
$ cat sample.list 
1 Ichiro ichiro@sample.com
2 Jiro   jiropsample.com
3 tarou tarou@sample.com
```
「 > 」の場合

```bash:
# sample.listの中身
$ cat sample.list
1 Ichiro ichiro@sample.com
2 Jiro   jiropsample.com

#変数varに"reset"を設定
$ var="reset"
$ echo ${var}
reset

# 結果
$ echo ${var} > sample.list
$ cat sample.list
reset
```

####パイプ
***
パイプは、標準出力をコマンドに渡したいときに使用します。

サンプル

```bash:
# sample.listの中身
$ cat sample.list 
1 Ichiro ichiro@sample.com
2 Jiro   jiropsample.com
3 tarou tarou@sample.com

# Q sample.listのIchiroさんのアドレスを知りたい。
# A grepコマンドとawkコマンドをパイプを使って、抽出しています。
$ grep 'Ichiro' sample.list | awk '{print $3}'
ichiro@sample.com 
```
CTest でのテスト実行時にファイルを渡す

ファイル内容を読み込む関数とか、まぁなんかファイルを必要とするテストケースがあると思うんだけどそれは次のようにすればいける。

読み込むファイルはテストケースを書いた cpp ファイルと同じ場所においておく。で、次のようなテストを書く。ポイントは main 関数の中で引数をグローバル変数に退避して、最後に `RUN_ALL_TESTS` を呼んでいるところ。

```cpp
/*
 * ini.cpp
 * */

#include "gtest/gtest.h"

#include "filetype/ini.hpp"

char const * ini01;
char const * ini02;

int main (int argc, char * argv[]) {
    ::testing::InitGoogleTest(&argc, argv);
    assert(argc == 3);

    ini01 = argv[1];
    ini02 = argv[2];

    return RUN_ALL_TESTS();
}

TEST(Read, InSuccessWithValidFile) {
    auto settings = FileType::Ini::Read(ini01);
    // snip
}

TEST(Read, InFailureWithInvalidFile) {
    auto settings = FileType::Ini::Read(ini02);
    // snip
}
```

これを次のように設定してやる。何の事はない、 `COMMAND` に引数を追加しているだけなんだけど、 `${CMAKE_CURRENT_SOURCE_DIR}` の下にあるファイルを指定することでテスト用ファイルが分散しないようにしてるのがちょっとした工夫。

```cmake
cmake_minimum_required(VERSION 2.8)

add_executable(IniTest ini.cpp)
target_link_libraries(IniTest
    gtest
    gtest_main
    pthread
    gcov
    )

add_test(
    NAME Ini
    COMMAND $<TARGET_FILE:IniTest> "${CMAKE_CURRENT_SOURCE_DIR}/test01.ini" "${CMAKE_CURRENT_SOURCE_DIR}/test02.ini"
    )
```
3-way mergeについて調べた

今更過ぎるが`3-way merge`について勉強。

## 結論

* 2-wayだと片方に削除がある場合、`もう片方が追加した`とみなされる
    * 適切にマージできなかった場合、削除した機能が残っている。という事態になってしまう
* 3-wayだと元のファイルがあるため、それぞれの差分がわかり、自動マージでも2-wayのような事態は発生しづらい

## サンプル

データベースに管理者を登録するシステムがあったとする。
(コードはほんっとうに適当)

マネージャから自分には`管理者以外のユーザも利用できるように認証機能を外すよう`依頼された。

同僚には`名前とパスワードの重複を防ぐ`事を依頼された。


### 今まで

**older.rb**

```ruby
require 'database'

data = Database.new

puts "are you admin? [y/N]"
unless gets.chomp == 'y'
  puts "canceled"
  exit 0
end

puts "enter your name"
name = gets.chomp
puts "enter your password"
pass = gets.chomp

data.insert(name, pass)

puts "save your info!"
```

### 自分の差分

管理者だけじゃなく、誰でも追加して良くなったので認証部分を削除する

**mine.rb**

```diff
 require 'database'

 data = Database.new

-puts "are you admin? [y/N]"
-unless gets.chomp == 'y'
-  puts "canceled"
-  exit 0
-end

 puts "enter your name"
 name = gets.chomp
 puts "enter your password"
 pass = gets.chomp

 data.insert(name, pass)

 puts "save your info!"
```

### 他の人の差分

名前とパスワードに重複があるかチェックする

**your.rb**

```diff
 require 'database'

 data = Database.new

 puts "are you admin? [y/N]"
 unless gets.chomp == 'y'
   puts "canceled"
   exit 0
 end

 puts "enter your name"
 name = gets.chomp
 puts "enter your password"
 pass = gets.chomp

+data.uniq?(name, pass)
 data.insert(name, pass)

 puts "save your info!"

```

## diff

```diff
-> % diff -u mine.rb your.rb
--- mine.rb     2016-05-02 00:20:21.000000000 +0900
+++ your.rb     2016-05-02 00:25:28.000000000 +0900
@@ -2,11 +2,18 @@

 data = Database.new

+puts "are you admin? [y/N]"
+unless gets.chomp == 'y'
+  puts "canceled"
+  exit 0
+end
+
 puts "enter your name"
 name = gets.chomp
 puts "enter your password"
 pass = gets.chomp

+data.uniq?(name, pass)
 data.insert(name, pass)

 puts "save your info!"
 ```

2-way mergeの場合、自分の認証部分の削除が機能として追加されてしまうことになる。

(削除した機能が残ってしまっている!!)

## diff3

3-way mergeのためのdiff

```diff
-> % diff3 mine.rb older.rb your.rb
====1
1:4a
2:5,10c
3:5,10c
  puts "are you admin? [y/N]"
  unless gets.chomp == 'y'
    puts "canceled"
    exit 0
  end

====3
1:9a
2:15a
3:16c
  data.uniq?(name, pass)
```

* `1:4a`と言うのは1つめのファイル(`mine.rb`)の4行目には存在しない。という意味
* `2:5,10c`と言うのは2つめのファイル(`older.rb`)の5行目-10行目には存在する。という意味

元となるファイル(`older.rb`)から自分と同僚それぞれの差分を取るため、認証機能は削除、重複チェック機能は追加される。ということがわかる。

## 参考にしたもの

* [Why is a 3-way merge advantageous over a 2-way merge? - stack overflow](http://stackoverflow.com/questions/4129049/why-is-a-3-way-merge-advantageous-over-a-2-way-merge)
* [man diff3](https://linuxjm.osdn.jp/html/gnumaniak/man1/diff3.1.html)
外部ntpサーバとの同期が切れたときの対処法

先日、nict.jpとのntpの同期が切れているという事象が発生した。

nictの公式HPを見ると、下記のように書いてある。

```
2016/04/26 14:50～4/28 14:40頃
上流ネットワークでNTP DoS攻撃対策のために
NTPパケットのポート１２３番同士の通信がブロックされましたが、
その後設定が解除され、現在は正常に通信できています。
```

http://www2.nict.go.jp/aeri/sts/tsp/PubNtp/oldnews.html

ポートが閉じられてしまったため、同期が切れてしまったようだ。
現在、復旧しているようだが、急にntpと同期が切れてしまうと困る。
リスク回避のため、実施した策を下記に記載する。


# ■ ntpサーバの冗長化

同期先のntpサーバを増やして、1つが切れても、別のntpサーバと同期できるようにする。


/etc/ntp.confに下記のように書く。
```
server ntp.nict.jp
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
```

nictと同期が切れても3つのMFEEDと同期が取れるようになる。
http://wiki.nothing.sh/page/NTP/%BF%E4%BE%A9%B8%F8%B3%AB%A5%B5%A1%BC%A5%D0

# ■ ローカルクロックと同期
冗長化しても、外部サーバが全部落ちてしまっては意味が無い。
そこで、ローカルクロック(自分自身)と同期できるようにする。

```
server 127.127.1.0
fudge  127.127.1.0 stratum 5
```
NTPでは時刻をstratumと呼ばれる階層で管理する。
http://www.atmarkit.co.jp/ait/articles/0812/26/news120_2.html

fugeで指定したstratumは、同期先のサーバの優先順位となる。
これにより4つの外部ntpとの同期が切れても5番目のローカルクロックと同期するようになる。
http://www.oss-d.net/ntp
http://d.hatena.ne.jp/incarose86/20110505/1312522379
CMake で Boost を静的リンクする

CMake で Boost を静的リンクする
===============================

CMake では静的リンクするために対象のファイルそれぞれに `add_library` と `set_target_properties` という前準備が必要。
なんだけど、 Boost のようにたくさんあるものをひとつひとつ対処するのもなぁ、ということでスクリプトを書いてみた。

```rb:generate-boost-static-settings.rb
#!/usr/bin/env ruby

#
# generate-boost-static-settings.rb
#
#   ./generate-boost-static-settings.rb > boost-static.cmake
#

CMAKE_VERSION = 2.8
LIB_PATH = '/usr/local/lib'
CMAKE_TEMPLATE = <<EOS
# ${libname}
add_library(boost_${libname}_static
    STATIC
    IMPORTED
)

set_target_properties(boost_${libname}_static
    PROPERTIES
    IMPORTED_LOCATION #{LIB_PATH}/libboost_${libname}.a
)

EOS

puts "cmake_minimum_required(VERSION #{CMAKE_VERSION})"
puts

Dir.glob(LIB_PATH + '/*') {|file|
    if matched = /libboost_(\w+)\.a/.match(file)
        libname = matched[1]
        puts CMAKE_TEMPLATE.gsub(/\$\{libname\}/, libname)
    end
}
```

`LIB_PATH` は適宜書き換えておくんなさい。
これを実行すると次のような出力になるのでファイルに保存してプロジェクトルートの CMakeLists.txt から include とか、直接 CMakeLists.txt に書くとかしてください。

```cmake
cmake_minimum_required(VERSION 2.8)

# atomic
add_library(boost_atomic_static
    STATIC
    IMPORTED
    )

set_target_properties(boost_atomic_static
    PROPERTIES
    IMPORTED_LOCATION /usr/local/lib/libboost_atomic.a
    )

#
# snip
#

# unit_test_framework
add_library(boost_unit_test_framework_static
    STATIC
    IMPORTED
    )

set_target_properties(boost_unit_test_framework_static
    PROPERTIES
    IMPORTED_LOCATION /usr/local/lib/libboost_unit_test_framework.a
    )
```

リンク指定する際は普通に `target_link_libraries` に `boost_<target>_static` を指定するだけ。 Boost Filesystem を静的リンクしたい場合は次のように。


```cmake
# filesystem
add_library(boost_filesystem_static
    STATIC
    IMPORTED
    )

set_target_properties(boost_filesystem_static
    PROPERTIES
    IMPORTED_LOCATION /usr/local/lib/libboost_filesystem.a
    )

add_executable(my-command
    main.cpp
    )

target_link_libraries(my-command
    boost_filesystem_static
    )
```
CordovaをWindowsで。その1

#はじめに
なるべく簡単にCordovaをWindowsで試してみる。 その1。

# 手順
Windowsだとどのコンソールを使うかも難しいとおもうのですが、ここでは Windows で Git を使っている人なら比較的入っている ``Git Bash`` でコマンド実行しています。
## npm をインストール
(省略)

## Cordova をインストール
```
$ npm install -g cordova
```
npm で Global でインストールすることで、``cordova``コマンドを使えるようにします。

## サンプルアプリケーション作成
```
$ cordova create MyApp
Creating a new cordova project.
$ ls
MyApp/
```
``MyApp``という名前でサンプルアプリを作ります。作ったアプリと同じ名前のフォルダが作られます。

## アプリケーションが動くプラットフォームを作成します。
```
$ cd MyApp
$ cordova platform add browser
```
ここで addrinfo などのエラーが出た場合、Proxyが原因の可能性がほとんどなので、下記のようにプロキシの設定をしてください。

```
$ npm install -g plugman
$ plugman config set proxy http://proxy_address:port
```

## アプリケーションを動かす
```
$ cordova run browser
Running command: cmd "/s /c ""...MyApp\platforms\browser\cordova\run.bat"""
Static file server running @ http://localhost:8000/index.html
CTRL + C to shut down
200 /index.html (gzip)
200 /css/index.css (gzip)
200 /cordova.js (gzip)
200 /img/logo.png
200 /cordova_plugins.js
200 /js/index.js (gzip)
404 /favicon.ico
```
のようにコンソールに出て、ブラウザが立ち上がってアプリが起動します。

## ちょっとだけアプリケーションをいじる
アプリ起動中であれば Ctrl + C で止めてから ``www/index.html`` を適当なエディタで開いて、

```
    <body>
        <div class="app">
            <h1>Apache Cordova</h1>
            <div id="deviceready" class="blink">
                <p class="event listening">Connecting to Device</p>
                <p class="event received">Device is Ready</p>
            </div>
        </div>
```
例えばここの ``<h1>Apache Cordova</h1>`` あたりを ``<h1>hogehgoe</h1>`` とでも編集してみて、再度 ``cordova run browser`` を実行してください。
タイトルが変わっていたら成功です。

あとは少しずついじっていって、自分好みのアプリにしていきましょう。
Apache Sparkをセットアップしてみる

#事前準備
##何もないけどOSのバージョン確認(今回はCentOS 6.7 final)
```cat /etc/redhat-release```
##Javaのインストール
###Open Javaをyumでインストールする
####まずはインストール可能なopenjdkを検索します
```yum search openjdk```
<img width="568" alt="スクリーンショット 2016-05-01 23.39.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/123800/07d42c20-aeeb-edd6-a294-53b6decffb15.png">
####ランタイムのインストール
```sudo  yum install java-1.8.0-openjdk```
<img width="566" alt="スクリーンショット 2016-05-01 23.47.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/123800/39ec9ecd-a5ce-e658-e5fc-bbd7b635084a.png">
####開発環境のインストール
```sudo  yum install java-1.8.0-openjdk-devel```
<img width="564" alt="スクリーンショット 2016-05-01 23.52.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/123800/7657ad71-5be4-48e6-3140-8b8523f51fe3.png">


#Apache Sparkのインストール
##パッケージをダウンロード

[ここ](http://spark.apache.org/downloads.html "Apache Sprak")からダウンロード可能です。
<img width="675" alt="スクリーンショット 2016-05-01 22.58.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/123800/5d15fc93-488f-2a28-97a0-3711347bd9d1.png">
##今回はコマンドで！
###Hadoop 2.6が含まれているバージョンを入れます
<img width="723" alt="スクリーンショット 2016-05-01 23.57.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/123800/248fb496-d890-8ba1-9abc-999f9b3df7f1.png">
####お好きなところからダウンロード
```wget http://ftp.jaist.ac.jp/pub/apache/spark/spark-1.6.1/spark-1.6.1-bin-hadoop2.6.tgz ```
<img width="565" alt="スクリーンショット 2016-05-01 23.10.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/123800/0d824371-86dd-ddca-d743-cf113df87fd9.png">

###解凍
```tar zxvf spark-1.6.1-bin-hadoop2.6.tgz -C /usr/local/lib/```
<img width="559" alt="スクリーンショット 2016-05-01 23.59.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/123800/96b4fbbe-7190-fdcc-2101-37b808c6f6db.png">
###シンボリックリンクを作成
```ln -s /usr/local/lib/spark-1.6.1-bin-hadoop2.6 /usr/local/lib/spark```
###環境変数の追加
```sudo vi /etc/profile.d/spark.sh```

以下の2つの設定を挿入
```export SPARK_HOME=/usr/local/lib/spark```
```export PATH=$SPARK_HOME/bin:$PATH```
保存が終わったら再読み込み
```source /etc/profile```
###最後に正常にセットアップできたか確認
```spark-shell --version```
<img width="533" alt="スクリーンショット 2016-05-02 0.15.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/123800/efd80e82-62b6-0ce2-cd6b-8431bd012320.png">
RailsのActiveRecordで共通の親クラスを定義する時の覚書

リハビリを兼ねて自分の思うがままにコードを書いているので、一応メモ書きを残すことにしました。
最近趣味で作っているプロダクトで、これって他のActiveRecordでも使うからConcernにするのも良いけど、
共通親クラスに定義して、他のモデルはこのクラスを継承するようにしてみようと思い、それを作ったので
サンプルを残しておく。

<code>self.abstract_class = true</code>みたいに書いておかないと、hoge_basesというテーブルを探してしまう。
共通で使うメソッドは、method_missingに書いているが、created_at_ymdやupdated_at_ymdというメソッドを生やしている。

```HogeBase.rb
class HogeBase < ActiveRecord::Base
  self.abstract_class = true

  ####################################################################
  ################### クラスメソッド #####################################
  ####################################################################
  class << self
  end

  ####################################################################
  ################### インスタンスメソッド #################################
  ####################################################################
  def method_missing(method_name,  *args,  &block)
    return unless method_name.to_s.end_with?("_ymd")

    method_name_except_format_value = method_name.to_s.sub!(/_ymd/, '')
    column_names = self.class.column_names.select { |column_name| column_name =~ /.*_at/ }

    return unless column_names.include?(method_name_except_format_value)

    read_attribute(method_name_except_format_value).strftime("%Y/%m/%d")
  end
end
```

上の例だと表示でしか使わない系だったら、decoratorに書くべきかもしれないけど、ちょっと実験的な要素も強いので一旦このままで。
[Rails]rails serverでエラーが発生した時の対処

MacのVMにRuby on Railsの環境構築して、rails serverコマンドを実行したら以下のエラーが発生してWebサーバの起動に失敗した。

`/usr/local/share/gems/gems/sqlite3-1.3.11/lib/sqlite3.rb:6:in require': cannot load such file -- sqlite3/sqlite3_native (LoadError)`

色々と調べて何とか解決したのでメモしときます。

## 環境

VM Centos7
Rails4
Sqlite3

***

まず以下のコマンドを実行する。

```bash
$ find /usr/local/share/gems/gems/ -name sqlite3_native*
```

出力結果
`/usr/local/share/gems/gems/sqlite3-1.3.7/ext/sqlite3/sqlite3_native.so`

次にviで以下のRubyファイルを編集する。

```bash
$ vi /usr/local/share/gems/gems/sqlite3-1.3.11/lib/sqlite3.rb
```

デフォルトのrequireをコメントアウトして、最初のfindの出力結果で取得したパスをrequireする（最後の拡張子.soは無くて良い）。

```rb
#　コメントにする
#　require "sqlite3/#{$1}/sqlite3_native"
  require "/usr/local/share/gems/gems/sqlite3-1.3.11/ext/sqlite3/sqlite3_native"
〜 省略 〜
```

viで上書き保存したら、Webサーバを起動する。

```bash
$ rails server
```

これで無事、ローカル環境でWebサーバが起動しました。
Hinemosでエラーとなったジョブネットを途中から再実行する方法


リランする方法、再実行方法、リカバリーを記載。

# 問題点
同一ジョブネット上(例:JOBNET01)に、下記の５つのジョブを順番に動くジョブネットが
あったとして
JOB1 → JOB2 → JOB3 → JOB4 → JOB5


JOB1 正常終了
JOB2 正常終了
JOB3 異常終了
JOB4 未実行
JOB5 未実行

JOB3のエラー要因を取り除き、再実行すると
JOB3 → JOB4 → JOB5の順番で実行できるか？

# 対策

* 対象ジョブネット(例:JOBNET01)の設定で、待ち条件の「条件を満たさなければ狩猟する」のチェックボックスを外す
 ![スクリーンショット 2016-05-01 23.49.44.png](https://qiita-image-store.s3.amazonaws.com/0/22057/d60d9f34-a310-f0ff-b37c-9fc1c023434a.png "スクリーンショット 2016-05-01 23.49.44.png")
 設定者はこれになかなか気づかない。
  
* 実際にJOB3でエラーとなっても、JOBNET01は実行中のままであり、実行状況確認のビュー上でエラーとなったJOBを再実行するとJOB3 → JOB4 → JOB5の順番で実行される。


* 代わりに各ジョブ(例:JOB1〜JOB5)の通知設定で障害通知を行う。そうしないと何時迄も実行が保留された状態となる。
　![スクリーンショット 2016-05-01 23.48.56.png](https://qiita-image-store.s3.amazonaws.com/0/22057/6b42de1e-0e7e-bb1c-03a0-ae5c2e3eb98f.png "スクリーンショット 2016-05-01 23.48.56.png")





### 前提条件
hinemos 4 or 5 で動作確認済み
Deviseで条件によって強制ログアウトさせる時に使った方法

##目的として、active_flagが「active」でないならログイン出来ないようにしたい。

###1)deviseのログアウト用にルーティングを追加する。

destroy_user_sessionへリダイレクトさせると、エラーになる。
そこで「devise/sessions#destroy」へ別名を付ける。

```
  devise_scope :user do
    get '/logout', to: 'devise/sessions#destroy', as: :logout
  end
```

###2)コントローラーのbefor_filterに処理を追加

```
class HogehogeController < ApplicationController
  before_filter :check_login

  def check_login
    redirect_to logout_path if current_user && current_user.active_flag != 'active'
  end
```
Learning Rails 14 (Use before action)



There are so many duplication in this code.

app/controllers/users_controller.rb

This code is used several times

```
@user = User.find params[:id]
```

We always must think.
###Don't Repeat Yourself.

Create this method.

```ruby:users_controller.rb
  private
    def set_user
      @user = User.find params[:id]
    end
```

Add this line

```ruby:users_controller.rb
before_action :set_user, only: [:show, :edit, :update, :destroy]
```

Delete this line from show, edit, update, destroy.

```
@user = User.find params[:id]
```      

It means that before running show, edit, update, destroy actions, set_user action runs.
program flow is always like this.

+ set_user → show
+ set_user → edit
+ set_user → update
+ set_user → destroy

current code.

```ruby:users_controller.rb
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  def index
    @users = User.all
    render status: 200
  end

  def show
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to users_path
    else
      render 'new'
    end
  end

  def update
    if @user.update(user_params)
      redirect_to users_path
    else
      render 'edit'
    end
  end

  def edit
  end

  def destroy
    @user.destroy

    redirect_to users_path
  end

  private
    def user_params
      params[:user].permit(:name)
    end

    def set_user
      @user = User.find params[:id]
    end
end
```
【CakePHP】リダイレクト先を動的に設定する

動作環境が結構古くて2.5.6なので3系でもそのままいけるかは不明です。

1. メルマガ等にコンテンツのリンクを貼る
2. 未ログインの場合はログイン画面に飛ばす
3. ログイン完了後にコンテンツに飛ばす

といった動きをしたい時なんかに使えます。

### 1. リダイレクトURL（パス）を保存するfunctionを用意
親クラス(AppControllerとか)に実装すると良さげです。

```AppController.php
private function storeRedirectPath() {
  // このパスは保存しない
  $exclude = ['/login', '/aaa', '/bbb'];
  $currentPath = Router::url();
  if (!in_array($currentPath, $allow)) {
	  $this->Auth->redirectUrl($currentPath);
  }
}
```

### 2. 1.のfunctionを呼び出す処理を追加
このへん

```AppController.php
public function beforeFilter()
{
  $this->storeRedirectPath();
}
```
あるいは

```AppController.php
public function beforeRender()
{
  $this->storeRedirectPath();
}
```
※この辺のfunctionは初期表示時以外にも呼ばれるので確認してからの方が良いです。

### 3. 保存したパスにリダイレクトする処理を追加
```AppController.php
protected function redirectToStoredPath() {
  $this->redirect($this->Auth->redirectUrl());
}
```

```LoginController.php
public function index()
{
  // ログイン済みの場合はリダイレクト
  if ($this->Auth->login()) {
    $this->redirectToStoredPath();
  }
}
```
ansibleのコマンド実行時の冪等性を簡単にするためのモジュール（ansible2にも対応）

**ansible2にも対応しました。**

ansibleは色々なモジュールがあり便利ですね。
クライアントインストールレスが嬉しいです。
構成管理以外にもリリース作業の自動化や、情報収集や調査タスクにも使えますね。今後ansibleを中心に進めていこうと思っているのですが。

しかし、複数行のコマンドを実行した際の冪等性の考慮が難しいです。参考：http://lab.tricorn.co.jp/kamo/4836
やってられなくはないですが、

```
- name: check default conf
  stat: path=/etc/nginx/conf.d/default.conf
  register: is_exists
- name: move default conf
  shell: mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.backup
  when: is_exists.stat.md5 is defined
```

 * YAMLの行数が増えて、可読性が落ちる。
 * register等のプログラミング的な要素が出てきて書きにくい。

#そこでモジュールを作りました。

コマンド実行の冪等制のために開発したモジュール
ansible_commanderを作成した。
名前 command モジュールとshellモジュールの進化版なので、command + er を命名

#配布場所


git clone https://bitbucket.org/takao_yasuhiro/ansible_commander.git
https://bitbucket.org/takao_yasuhiro/ansible_commander

#インストール

下記に配置

	 library/commander.py

#使い方

  * command:必須、実行するコマンド。**複数行呼び出し可能。**
  * **test_command：(任意) commandを実行前後でチェックするためのコマンド群**
  * **test_command_rc：(任意)デフォルト 0、test_commandの実行のリターン値の期待値。**
  * test_command_msg：(任意)test_commandの標準エラーと標準出力の期待値。
  * chdir:(任意)コマンドを実行する前にcdコマンドでディレクトリを移動する。
  * creates:(任意)指定したファイル名が既に存在する場合、コマンドを実行しない。
  * executable:(任意)実行するシェルを絶対パスで指定する。
  * removes:(任意)指定したファイル名が存在しない場合、コマンドを実行しない。
  * warn:(任意)『no』または『false』を指定した場合、コマンド警告を出さない。

#実行サンプル
	  - name: 3.4 mysql_secure_installation
		commander:
		args:
		  command: |
			expect -c "
			set timeout 5
			spawn /usr/bin/mysql_secure_installation
			expect \"Enter current password for root \"
			send \"\n\"
			expect \"root password\"
			send \"Y\n\"
			expect \"New password:\"
			send \"{{ root_password }}\n\"
			expect \"Re\-enter new password\:\"
			send \"{{ root_password }}\n\"
			expect \"Remove anonymous users?\"
			send \"Y\n\"
			expect \"Disallow root login remotely?\"
			send \"Y\n\"
			expect \"Remove test database and access to it?\"
			send \"Y\n\"
			expect \"Reload privilege tables now\"
			send \"Y\n\"
			interact
			"
		  test_command: "echo exit|mysql -u root -p{{root_password}}"
	


##返り値を判別方式

	  - name: sample repo
		commander:
		args:
		  command: |
			cd /mnt/iscsi/svn
			svnadmin create sample
			chown -R apache:apache sample
		  test_command: |
			test -e /mnt/iscsi/svn/sample/
	      test_command_rc: "0"

1. test_commandを実行
2. test_commandの実行結果が
	* test_command_rcと等しい場合は３へ
	* test_command_rcと等しくない場合はSKIP
3. commandを実行
4. 3が実行が正常完了したら、test_commandを再度実行。
5. 4の実行結果がtest_commandの実行結果が
	* test_command_rcと等しくない場合はエラーとして挙げる。
	* test_command_rcと等しい場合は正常終了

##返り値を判別方式

	  - name:  bundle install
		commander:
		args:
		  command: |
			cd /var/lib/redmine
			source /root/.bash_profile
			bundle install
		  test_command: |
			cd /var/lib/redmine
			bundle check
		  test_command_msg: "dependencies are satisfied"

1. test_commandを実行
2. test_commandの標準出力、標準エラーが
	* test_command_msgと等しい場合は３へ
	* test_command_msgと等しくない場合はSKIP
3. commandを実行
4. 3が実行が正常完了したら、test_commandを再度実行。
5. 4のtest_commandの標準出力、標準エラーが
	* test_command_rcと等しくない場合はエラーとして挙げる。
	* test_command_rcと等しい場合は正常終了

# 所感
 従来の手順書の記載をそのままplaybookに記載すればよく
 わかりやすくなったのではと思っています。
FizzBuzz例題（Erlang）

言語を覚える際にお決まりのアルゴリズム問題を解いていて、FizzBuzzします。ご存知の通り、FizzBuzzはカウントアップしていき、一定の数で割り切れる場合はFizz、Buzz、FizzBuzzを出力する、ループと分岐を実装するアルゴリズムです。

今回はErlangで実装するにあたり、if/caseでも実装は可能ですが、せっかくなので関数型言語の機能であるパターンマッチ/再帰で実装いたします。

##実装する機能
・1〜100までカウントアップする
・3で割り切れる場合は「This」を出力する
・5で割り切れる場合は「is」を出力する
・3と5で割り切れる場合（公倍数）は、「This is」を出力する
・100まで到達したら「This is Anfield」と出力して処理終了する

##プログラム
**Erlang**

```erlang:thisisanfield.erl
-module(thisisanfield).
-export([func/0]).

func() ->
  func(1).
func(100) ->
  io:format("This is Anfield！\n");
func(N) when N rem 3 == 0, N rem 5 == 0 ->
  io:format("~p This is\n", [N]), func(N + 1);
func(N) when N rem 3 == 0 ->
  io:format("~p This\n", [N]), func(N + 1);
func(N) when N rem 5 == 0 ->
  io:format("~p is\n", [N]), func(N + 1);
func(N) when N < 100 ->
  func(N + 1).
```

**出力（一部省略）**

```erl:erl
1> thisisanfield:func().
78 This
80 is
81 This
84 This
85 is
87 This
90 This is
93 This
95 is
96 This
99 This
This is Anfield！
ok
```

関数型言語の機能として、パターンマッチは直感利用でき、わかりやすいです。とくにErlangは関数型言語の中でも、動的なデータ型付けの縛りがある中で、柔軟なパターンマッチが可能で、楽しくコーディングできますね！
StripeがRailsで動く仕組み


###決済サービスAPIのStipeをRailsで使う
Stripeとは：クレジットカード決算のためにカード情報さえ取得すれば、あとは引き落としがRailsサイドでできるようになるものです。
本家のサイトは[こちら](https://stripe.com/docs/checkout/rails)

**前提**
<b>クレジットカードなどプライベートな個人情報は、直接サーバーに保管することは法律で禁止されている（らしい）です</b>
なので、railsのsecure_passwordでユーザーからうけとったpasswordをめちゃめちゃな文字列に変換すること同様にクレカ情報はStripe側のサーバにのみしか渡りません

まずは、
`gem 'stripe'`で`bundle install`します


Stripeが利用できる大きなフローとしては４つあり

```
1. クレカ情報をユーザがStripeが提唱してるjsで送信する
2. それを受け取ったStripe側が（上の通り）、情報をめちゃめちゃな文字列に入れる
3. StripeのAPIが提供してるクラス、Stripe::Customerクラスで`:email`, `:source` のハッシュでその情報を受け取る
4. Stripe::Chargeクラスで、決めた金額を引き落とす
```
では、流れに沿ってコメントを入れながら実装していきます

###まずはコントローラを作成
`$ rails g controller charges`

```ruby:config/routes.rb
resources :charges
```

```ruby:app/controller/charges_controller.rb
def new
end

def create
  # Amount in cents
  @amount = 500#引き落とす金額
　　　 ###この操作で、Stripe から帰ってきた情報を取得します
  customer = Stripe::Customer.create(
    :email => params[:stripeEmail], #emailは暗号化されずに受け取れます
    :source  => params[:stripeToken] #めちゃめちゃな文字列です 
  )


  ###この操作で、決済をします
  charge = Stripe::Charge.create(
    :customer    => customer.id,
    :amount      => @amount,
    :description => 'Rails Stripe customer',
    :currency    => 'usd'
  )

rescue Stripe::CardError => e
  flash[:error] = e.message
  redirect_to new_charge_path
end

```

###Stripeでアカウントを作って、API_keyを環境変数にいれる

```ruby:config/initializers/stripe.rb
Rails.configuration.stripe = {
  :publishable_key => ENV['PUBLISHABLE_KEY'],#stipeのページに行って自分のアカウントから取ってくる
  :secret_key      => ENV['SECRET_KEY']
}

Stripe.api_key = Rails.configuration.stripe[:secret_key]
```

###Viewでjsのformを実装

```ruby:app/views/charges/new.html.erb
<%= form_tag charges_path do %>
  <article>
    <% if flash[:error].present? %>
      <div id="error_explanation">
        <p><%= flash[:error] %></p>
      </div>
    <% end %>
    <label class="amount">
      <span>Amount: $5.00</span>
    </label>
  </article>

  <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
          data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
          data-description="A month's subscription"
          data-amount="500"
          data-locale="auto"></script>
<% end %>

```

フローとしては、以上ですm(_ _)m
Power BIのチュートリアル

# ダウンロード

日本語版
https://powerbi.microsoft.com/ja-jp/downloads/

英語版
https://powerbi.microsoft.com/en-us/downloads/

# ダウンロードからサンプルデータの取込み

https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-getting-started/

# データの整形と結合

https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-shape-and-combine-data/

```
別のクエリに追加する 1 つ以上の列がある場合は、クエリをマージします。
既存のクエリに追加するデータの追加の行がある場合は、クエリを追加します。
```

上記、英語直訳なのか、非常にわかりにくいが、

* 列追加→マージ
* 行追加→クエリ追加

ということらしい。


## 適用して閉じる　のところでエラー

![2016-05-01_230752.png](https://qiita-image-store.s3.amazonaws.com/0/53477/2226a6a6-3db4-3abe-0ad2-5a5ac8f8aacd.png)

* 手順にあった、１行目を見出しにするという手順を削除したら、上手くいった。
* このクエリの変更の適用がやたらと重い。データソースがWEBだからなのか？。適用して閉じるでなく、適用だけの場合は早いことが多かった。

# レポートの作成

https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-getting-started/#-5

```
ご覧ください。Power BI Desktop により、地図ベースの視覚エフェクトが自動的に作成されました。
```

とありますが、[フィールド] リストからレポート ビューにフィールドをドラッグしても以下の通り。。。

![2016-05-01_232604.png](https://qiita-image-store.s3.amazonaws.com/0/53477/20a4340e-68be-25a0-21fc-47760f65a76d.png)

視覚エフェクトで、マップを選択してから、地域欄にstateをドラッグドロップしたら、地図になった。

![2016-05-01_232847.png](https://qiita-image-store.s3.amazonaws.com/0/53477/73b73254-2272-c407-10db-207031f8a572.png)


![2016-05-01_233040.png](https://qiita-image-store.s3.amazonaws.com/0/53477/713edf14-df47-bcae-6733-edd554547b1b.png)

# Power BI Desktop のレポート ビュー

レポートの作成の途中で以下ページを見ることに。

https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-report-view/

```
ヒント: 必ず複数の視覚化をお試しください。データの情報を明確に伝える視覚化を使用することが重要です。
```

確かにそうだな。
↑ページのサンプルデータがないのでほしいです。＞MSさん。


# 再びレポートの作成ページに戻る

https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-getting-started/#-5

途中からいきなり↓のレポートが作られてる前提で話進めるの厳しい！せめてサンプルありかぐらい教えてほしい。

![alt](https://dpspowerbi.blob.core.windows.net/powerbi-prod-media/powerbi.microsoft.com/ja-jp/documentation/articles/powerbi-desktop-getting-started/20160331073412/designer_gsg_report1.png)


# サンプルの共有

https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-getting-started/#-6


作業共有する方法

1. Power BI Desktop から直接 Power BI サービスに発行する
1. 作業を共有するもう 1 つの方法は、Power BI サービス内から Power BI Desktop ファイルを読み込むこと

# 残り

https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-tutorial-importing-and-analyzing-data-from-a-web-page/

あたりからチュートリアルしてみる。
Adafruit Trinketで、USBケーブルによるトラブル

[Adafruit Trinket - Mini Microcontroller - 5V Logic](https://www.adafruit.com/product/1501)

 AdafruitのArduino互換機「Adafruit Trinket」を買ってきて色々してみようとしていたところ、全然スケッチが書き込めなくて困っていました。

## 症状

### ``Error: Could not find USBtiny device (0x1781/0xc9f)``というエラーが出る

Arduino IDEからスケッチを書き込もうとすると、上記のエラーが出ます。 
これ自体は[公式解説](https://learn.adafruit.com/introducing-trinket/setting-up-with-arduino-ide)にも一番に載っている、よくあるエラーらしく、対処法も書いてあります。

> That means the bootloader wasn't active. Make sure to press the button on the Trinket to activate the bootloader before clicking the Upload button.

Trinketボード上のボタンを押してブートローダーをアクティブ化した状態で、スケッチを書き込んで下さいとの事。 
また、ブートローダーがアクティブになっている間は、赤いLEDがじわ〜っと点滅（pulse）するらしい。[解説動画](https://www.youtube.com/watch?v=4HC2T0FGMH4)が分かりやすい。

ただ、今回はボード上のボタンを押しても、赤いLEDが **数秒間点灯** するだけで、動画のようなじわ〜っと点滅状態にはなりませんでした。


## 対策

最終的に、 **USBケーブルを交換** することで解決しました！

以下、試してみた組み合わせ。

* ケーブルA + iMac => NG
* ケーブルA + PC => NG
* ケーブルA + USBハブ + iMac => NG
* ケーブルA + USBハブ + PC => NG
* ケーブルB + iMac => **OK!!**
* ケーブルB + PC => **OK!!**
* ケーブルB + USBハブ + iMac => NG
* ケーブルB + USBハブ + PC => **OK!!**

えらく苦労させられましたが、何とか解決できました。 
品質の悪いケーブルだったりUSBハブを経由したりすると、電力が若干足りなくなったりするのかな？

何か調子が悪いときはケーブルも疑ったりしてみて下さい。
Learning Rails 13 (Destroy data)



![スクリーンショット 2016-04-26 18.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/39073/bc1651b1-7196-6f66-86e9-fa31138bbf53.png "スクリーンショット 2016-04-26 18.57.13.png")

We use this line in this time.

|Prefix | Verb | URI | Controller#Action| Explanation |   
|:-----------|:------------|:------------|:------------|:------------|
||DELETE|/users/:id|users#destroy|users controller and destroy action|


```bash
vi app/views/users/index.html.erb
```

Add this line

```ruby:index.html.erb
<%= link_to 'delete', user_path(user.id), method: :delete, data: {confirm: "Are you sure?"} %>
```

current this file


```ruby:index.html.erb
<h1>Users</h1>
 
<ul>
  <% @users.each do |user| %>
    <li>
      <%= link_to user.name, user_path(user.id) %>:<%= user.approved%>;
      <%= link_to 'edit', edit_user_path(user.id) %>;
      <%= link_to 'delete', user_path(user.id), method: :delete, data: {confirm: "Are you sure?"} %>
    </li>
  <% end %>
</ul>
 
<p><%= link_to "Add New", new_user_path %></p>
```

```bash
vi app/controllers/users_controller.rb
```

Add this line

```ruby:users_controller.rb
def destroy
  @user = User.find params[:id]
  @user.destroy
 
  redirect_to users_path
end
```

![スクリーンショット 2016-05-01 22.04.08.png](https://qiita-image-store.s3.amazonaws.com/0/39073/fb611657-8a63-1454-bb82-e927475941ba.png "スクリーンショット 2016-05-01 22.04.08.png")
Wordpress用フレームワーク「Herbert」プラグイン名の設定

#はじめに

前回に引き続き，Wordpress用フレームワーク「Herbert」の導入を行っていこう
前記事→[Wordpress用フレームワーク「Herbert」を試してみる](http://qiita.com/tonchan1216/items/c7aac9f2efe7e8e56989)

#環境
ホストOS:Windows 10
ゲストOS:CentOS 6.7
Vagrant(ローカル開発環境)
vccw(Wordpress導入用)
Wordpress 4.5.1–ja
PHP ~~5.4.45~~←5.4だと動きませんでした．
＝＝＞5.6.21

#**Getting Started**

##プラグイン名を指定(Naming your Plugin)
プラグイン名を設定する．合わせてAuthorなどの情報を変えておこう

```plugin.php
/**
* @wordpress-plugin
* Plugin Name:       My Plugin ←ここをオリジナルにする
* Plugin URI:        http://plugin-name.com/
* Description:       A plugin.
* Version:           1.0.0
* Author:            Author
* Author URI:        http://author.com/
* License:           MIT
*/
```

##名前空間の指定(Namespacing your Plugin)
他のプラグインやWordPressコアシステムとの競合を避けるため，名前空間を設定する必要がある．

###composer.jsonの変更
composer.json内のautoloadと記載された部分を変えていく.
下記において「MyPlugin」と書かれた部分を自作プラグイン名に修正
ただしスペースや括弧は使用禁止とのこと
（サンプルではSocial Icons (pro)→SocialIconsPro）

```composer.json
"autoload": {
    "psr-4": {
      "SocialIconsPro\\": "app/"
    }
  }
```

以上のように修正できたらコマンドラインで`composer dump-autoload`を実行

###Helper.phpの修正
`composer dump-autoload`が実行できたら，app/Helper.phpが生成されるだろう．
Helper.phpの一行目にも名前空間を指定しているので修正

```app/Helper.php
<?php namespace SocialIconsPro;
```

###herbert.config.phpの修正
最後にherbert.config.php内にあるプラグインも修正しちゃおう
修正箇所は全部で4箇所（検索か置換機能で「MyPlugin」を探すと早い）

```herbert.config.php
/**
* The routes to auto-load.
*/
'routes' => [
  'SocialIconsPro' => __DIR__ . '/app/routes.php'
],

/**
* The panels to auto-load.
*/
'panels' => [
  'SocialIconsPro' => __DIR__ . '/app/panels.php'
],

/**
* The APIs to auto-load.
*/
'apis' => [
  'SocialIconsPro' => __DIR__ . '/app/api.php'
],

/**
* The view paths to register.
*
* E.G: 'MyPlugin' => __DIR__ . '/views'
* can be referenced via @MyPlugin/
* when rendering a view in twig.
*/
'views' => [
    'SocialIconsPro' => __DIR__ . '/resources/views'
],
```

#おさらい
各々プラグイン名を考え，各設定ファイルに反映させる地味な作業
ただ，意外と大事であるので漏れなきよう．

- composer.json
- Helper.php
- herbert.config.php

以上３つのファイルを修正した．

今回はここまで
次回は**Config**編
より詳しい設定ファイルを読み解いていきましょう
NSUserDefaults で保存したデータが消えるという記事が上がったので

# NSUserDefaults で保存したデータが消える
[気をつけろ！NSUserDefaultは消えるぞ！ – Qiita](http://qiita.com/batibati/items/52a7a72b7aa93ed4c6fc "気をつけろ！NSUserDefaultは消えるぞ！ – Qiita") という記事が Qiita に上がっていました。

私も iOS 9.3 beta 3 の時からこの現象に悩まされていましたので、重い腰を上げて筆を取りました。

詳しい内容については私のポートフォリオ的サイトに書きましたので、そちらをご覧頂ければと思います。
[NSUserDefaults についてやっと書きます | treastrain Press](http://press.treastrain.jp/nsuserdefaults-broken/ "NSUserDefaults についてやっと書きます | treastrain Press")
[iOS 9.3.2 の NSUserDefaults | treastrain Press](http://press.treastrain.jp/ios-9-3-2-nsuserdefaults/ "iOS 9.3.2 の NSUserDefaults | treastrain Press")

さて、この記事には NSUserDefaults で保存したデータが消えるバグがいつ発生するかについてのみ書いておきますね。

# Xcode が怪しい
私の長い iOS 9.3.x 付き合いの経験から言うと、「Xcode で開発中のアプリを Run した後」もしくは「Run している最中」にかなりの確率でこのバグに遭遇します。

電車の中で LINE を何気なく使おうとした時に「新規登録」画面になっていることもありますが、Mac に iPhone を繋げているときがかなり怪しいです。

私は LINE の他に Outlook for iOS を使っていますが、
例えば LINE のデータが消え、「うわ、まただよ」と思って Outlook を開いて無事だったとき、LINE に再度ログインしてもう一度 Outlook に戻ると Outlook も死んでいる……という様な感じで、とにかく、**抜かりなくデータが消えます。**
どれかのアプリデータが無事、ということはまずありません。


Apple さんにはぜひとも、WWDC16 の前に iOS 9.4 をリリースして、このバグを解消していただきたいと思っています。

# 2016年5月17日 追記
iOS 9.3.2 がリリースされました。このバグは未だ残っていますが、LINE に関しては iOS のおかげか、LINE バージョン 6.2.0 以降でバグに遭遇することがなくなったので、何らかの修正が行われたかと思います。
これについても記事を書きました。
[iOS 9.3.2 の NSUserDefaults | treastrain Press](http://press.treastrain.jp/ios-9-3-2-nsuserdefaults/ "iOS 9.3.2 の NSUserDefaults | treastrain Press")


# 関連リンク
* [NSUserDefaults についてやっと書きます | treastrain Press](http://press.treastrain.jp/nsuserdefaults-broken/ "NSUserDefaults についてやっと書きます | treastrain Press")
* [iOS 9.3.2 の NSUserDefaults | treastrain Press](http://press.treastrain.jp/ios-9-3-2-nsuserdefaults/ "iOS 9.3.2 の NSUserDefaults | treastrain Press")
* [気をつけろ！NSUserDefaultは消えるぞ！ – Qiita](http://qiita.com/batibati/items/52a7a72b7aa93ed4c6fc "気をつけろ！NSUserDefaultは消えるぞ！ – Qiita")
Learning Rails 12 (Use same form for register and edit)


You might notice that new.html.erb and edit.html.erb are almost same.
We have to always think that
###Don't Repeat Your self.

Shall we refactor.

```bash
vi app/views/users/new.html.erb
```

```ruby:new.html.erb
<h1>Add New</h1>

<%= render 'form' %>
```

```bash
vi app/views/users/edit.html.erb
```

```ruby:edit.html.erb
<h1>Edit</h1>

<%= render 'form' %>
```

We will create partial file. The prefix should be under bar.

```bash
vi app/views/users/_form.html.erb
```

```ruby:_form.html.erb
<%= form_for @user do |f| %>
  <p>
    <%= f.label :name %><br>
    <%= f.text_field :name %>
    <% if @user.errors.any? %>
      <%= @user.errors.messages[:name][0] %>
    <% end %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>
```