OmniAICreator/Qiita-1.07M huggingface dataset:
EGitで複数のコミットをまとめる(git rebase -i)

最近ローカルにGitの複数のコミットがある場合に、わかりやすい単位でまとめるようになりました。

今まではそのままにしていたため、コミット数が多くなったり、
コミット数が多くなることを嫌って変な単位でコミットをしたりしていましたが、
まとめるようになってからはコミットし放題です。

今回はEGitでコミットをまとめる手順について書いてみます。


# 初期状態
下記のような「Test.rb」というRubyファイルがある状態で初回コミットをしました。
このファイルの更新とコミットを繰り返し、最後に1つにまとめてみようと思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/53590/6cc94701-5e19-b976-497c-dd18c89970bd.png)


# commit1

足し算を行うメソッドを追加しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/53590/ece7ca41-6b01-d2f4-ec69-63104b6a0ecf.png)


# commit2

引き算を行うメソッドを追加しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/53590/2f192353-81bf-61da-b5b2-6683829e6133.png)


# commit3

掛け算を行うメソッドを追加しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/53590/e3a78efa-b5d2-ee15-8218-c4d4ed15531f.png)


# commit1から3を一つにまとめてコミットメッセージを修正する
## 対話式リベースの開始
「init」コミットを選択して右クリック⇒対話式リベースを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/53590/c0fc67ec-0bda-ef76-06ff-963c3aa5477a.png)
## commit2をまとめる
対話式リベースのウィンドウでcommit2を選択して右クリック⇒「フィックスアップ」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/53590/d9ca429e-faff-b6e6-822e-b269cb49e416.png)
## commit3をまとめる
commit3を選択して右クリック⇒「フィックスアップ」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/53590/f7fe2842-2ada-a740-a926-c6899a7168b8.png)
## コミットメッセージの修正を設定
commit1を選択して右クリック⇒「リワード」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/53590/b7d0ead6-c940-e767-172a-9201bd6028f1.png)
## リベース開始
対話式リベースのウィンドウで「開始」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/53590/026afa38-ad4f-f16d-6842-8c20df2f70b0.png)
## コミットメッセージを修正
ダイアログでコミットメッセージを修正し、「OK」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/53590/c07a0d0c-31d5-9c6c-eb38-5408eb234c38.png)
## 結果
コミットがひとつにまとまりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/53590/dccb27bb-3ffb-ebf0-99ba-8cf1aeb25b8d.png)
## 比較結果
比較結果もこのようになります
![image](https://qiita-image-store.s3.amazonaws.com/0/53590/7eec9cba-294d-5087-86ac-9cf70bed518e.png)
qwikLABSでAWSを安全に勉強する


AWSを勉強する際に、会社のアカウントが自由に使える場合は良いですが、使えない場合は個人アカウントを作成して、無料枠をうまく使って勉強することになります。AWSは従量課金で初期投資がないため、個人でもはじめやすいですが、使い方を間違えると課金が青天井になりクラウド破産するという不安があります。

AWSの研修でも利用される[qwikLABS](https://qwiklabs.com)を利用すると最新のサービスを **安全に試すこと** ができるのでご紹介します。

AWS 10周年を記念して2016年3月31日まで、すべてのトレーニングコースが無料になっていますので、この機会にお試しされることをおすすめします。

- [qwikLABS](https://qwiklabs.com)


## アカウントの作成

[本URL](https://run.qwiklab.com/users/sign_up?locale=ja)からアカウントを作成します。作成の際にはクレジットカード登録は不要で、無料で受けられるコース（各サービスのIntroductionサービスはたいてい無料です）だけであれば、そのまま受講することができます。なお、サイト自体は日本語化されていますが、実際のハンズオンテキストは英語になります。


## 学習コースの選択

アカウントが作成できたら、ログインして、 **ラボカタログ** のページに進みます。

ラボカタログは、 **クエスト** と **ラボ** から構成されています。クエストは「Bigdata」や「Web Apps」などテーマがあり、いくつかのラボを通してその分野のスキルを身につけるものです。AWSの資格対策のクエストもあり、実際にAWSを利用して勉強できるので試験勉強が捗りそうです。クエスト内のすべてのラボを終了するとバッチが発行され、LinkedIn等でのアピールで利用できるようになっています。ラボには執筆時において95種類のハンズオンが用意されており、30分程度のものから、2時間を超えるものまであります。また、対象サービスもAWSの基本であるIAMやEC2、VPCから、比較的新しいLambda、ECSまで幅広くそろっています。

![Screen_Shot_2016-03-16_at_22_36_36.png](https://qiita-image-store.s3.amazonaws.com/0/27509/8b77f92f-b423-b688-a0a4-6631eaef3caa.png "Screen_Shot_2016-03-16_at_22_36_36.png")


## 実機でのハンズオン
勉強するコースがを選んだら、 **ラボ開始ボタン** を押します。制限時間付きのログインアカウントが払い出されるので、AWSにログインし、ハンズオンテキストに従って勉強を進めていきます。ハンズオンテキストには、利用するサービスの概要の後、ステップバイステップでハンズオン手順が書かれているので初めて方でも進めていくことができます。払いだされたアカウントにはきちんとロールが設定されており、ハンズオンに関係のないサービスは利用できないようになっています。

<img width="1440" alt="Screen_Shot_2016-03-16_at_22_37_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/27509/686dd86e-3e6c-270c-0b73-9d6a78b6dfb0.png">

ハンズオンが終了したら、 **終了ボタン** を押してアンケートに答えれば完了です。

是非一度お試しください。
Refinement で追加したメソッドが irb で呼べない？

先日，「[Refinement で追加したメソッドが send で呼べない](http://qiita.com/scivola/items/9a8887a5a864a7252d75)」件を書いたんだが，その後，別のデキナイコトを見つけた。

ただ，refinement に課された制約というわけではないのだと思う。

# まず動く例を

まず，ふつうに動く例をお見せする。

以下のコードは，Integer に，〈3 の倍数か（10進で）3 が付く場合に「あほ」を返す〉ようなメソッド `nabeatsu` を追加する。

```rb:sample.rb
module Nabeatsu
  refine Integer do
    def nabeatsu
      "あほ" if modulo(3).zero? || to_s.match(/3/)
    end
  end
end

using Nabeatsu

puts 31.nabeatsu
#=> "あほ"
```

この sample.rb は期待通りに動く。

# irb ではダメ

上記のコードをコピーして，irb 上でペーストしてみる。
すると

```rb
using Nabeatsu
```

までは OK だが，最後の

```rb
puts 31.nabeatsu
```

で

```
undefined method `nabeatsu' for 31:Fixnum
```

が出た。

なんでやねんっ？

irb は 1 行ずつ標準入力を読み込んでいって，式が完結するごとに逐次実行される。おそらく，`using` の行を実行するときと，次の `puts` の行を実行する時とでは，refinement のスコープとしてつながっていないんだろうな。

だとすると，両者を 1 行で表現すればイケるのでは？
試しに，

```rb
using Nabeatsu; puts 31.nabeatsu
```

と入力してみたら，期待通り「あほ」が表示された。

そうか，じゃあ

```rb
begin
using Nabeatsu
puts 31.nabeatsu
end
```

もイケるか？　うん，イケた。

この例では，`puts` の行を読み込んでも `begin` に対応する `end` がまだ現れていないので，Ruby の式として完結せず，実行が行われない。

次の `end` を読み込んで初めて一つの式として解釈でき，ようやく `begin` から `end` までが実行されるわけだ。

# その後（2018-12-27 追記）

この記事の内容が少し古くなったので追記。

この記事の時点では，

```rb
using Nabeatsu
```

はエラーを出さなかったが，少なくとも Ruby 2.3.3 以降は

```
RuntimeError: main.using is permitted only at toplevel
```

が出る。

記事を書いたときの Ruby のバージョンが分からない。ちゃんと書いておくべきだった。反省。

irb 上で `self` ってやると `main` と表示されるのに，トップレベルじゃない，ってどーゆーこと？

で，（**ここ重要**）この記事で書いた問題は，irb の起動時のオプションで解消することが分かった。
つまり，

```
irb --context-mode=1
```

で起動すれば，irb 上でも最初に掲げたようなコードが期待どおりに動作する。

この issue にそのへんのことが書かれていた。
[Bug #9580: Refinements regression in IRB - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/9580#note-4)

~~この話はたしか Qiita の記事で知ったはずだが，いくら探しても記事が見つからず。~~
この話は以下の記事で知った（2018-12-28 追記）。
[数値クラスに逆数を取得するメソッドを追加（＋refinementsの勉強） - Qiita](https://qiita.com/HMMNRST/items/cea491b7c3c542252186)

ちなみに pry にはこういうオプションは無いっぽい。
ステルスズンドコ


最近はやっているらしいズンドコキヨシ、ズンドコしているような形跡を見せずにズンドコしたいと思って書いてみました。

```ruby
require 'time'

Z = '2009-07-13 00:28:51 +0900'
D = '2009-07-30 09:07:47 +0900'
K = '2009-06-27 23:22:19 +0900'
Y = '2009-09-04 06:15:39 +0900'
S = '2009-07-10 03:48:01 +0900'

str = [85, 84, 70, 45, 56].map{|a| a.chr}.join('')
l = ->(dt){Time.parse(dt).to_i.to_s.scan(/.{1,#{5}}/).map{|a| a.to_i.chr(str)}.join('')}
cnt = 0
s = nil.to_s

loop do
  r = rand(2)
  if r == 1
    cnt += 1
  else
    cnt.times{s += l.call(Z)}
    s += l.call(D)
    if cnt >= 4
      s += l.call(K)
      s += l.call(Y)
      s += l.call(S)
      puts s
      break
    else
      cnt = 0
    end
  end
end
```

出力結果
`ドコドコドコズンズンドコドコズンズンドコズンドコドコズンドコドコドコドコドコズンズンズンドコドコドコズンドコズンズンドコズンドコズンズンドコズンズンズンズンドコキ・ヨ・シ！`

`'ズン'`、`'ドコ'`、`'キ・ヨ・シ！'`を文字列として定義してしまうとズンドコしたいのがばれてしまうので、DateTime文字列に偽装しています。

このコードだと標準出力に吐き出すのは一回だけなので、微妙にレギュレーション違反な気もします。
あと、出来ればloopの中身も難読化したいところですね。

## 追記
そんなわけで、都度出力、カウンタを使わないバージョンを書きました

```ruby
require 'time'

dates = [ 
  '2009-07-13 00:28:51 +0900',
  '2009-07-30 09:07:47 +0900',
  '2009-06-27 23:22:19 +0900',
  '2009-09-04 06:15:39 +0900',
  '2009-07-10 03:48:01 +0900',
]

s1, s2, s3, s4, s5 = dates
str = [85, 84, 70, 45, 56].map{|a| a.chr}.join(nil.to_s)
l = ->(dt){Time.parse(dt).to_i.to_s.scan(/.{1,#{5}}/).map{|a| a.to_i.chr(str)}.join(nil.to_s)}
que = Array.new

loop do
  r = rand(2)
  que << dates[r]
  if que.length == 5
    if que == [s1, s1, s1, s1, s2]
      que.concat([s3, s4, s5])
      print que.map{|q| l.call(q)}.join(nil.to_s)
      print "\n"
      break
    else
      print l.call(que.shift)
    end
  end
end
```

`ズンドコズンドコドコズンズンズンドコズンズンドコドコドコドコズンズンドコドコドコドコドコドコドコズンズンドコズンドコズンズンドコズンドコズンズンドコズンズンドコドコドコズンドコズンズンズンズンズンドコキ・ヨ・シ！`

なにをしているのかわかりにくいコードを書くのは難しいですね。

## リファクタリング

```ruby
require 'time'

dates = [ 
  '2009-07-13 00:28:51 +0900',
  '2009-07-30 09:07:47 +0900',
  '2009-06-27 23:22:19 +0900',
  '2009-09-04 06:15:39 +0900',
  '2009-07-10 03:48:01 +0900',
]

str = [85, 84, 70, 45, 56].map{|a| a.chr}.join(nil.to_s)
l = ->(i){Time.parse(dates[i]).to_i.to_s.scan(/.{1,5}/).map{|a| a.to_i.chr(str)}.join(nil.to_s)}
que = Array.new

loop do
  que << rand(2)
  if que == [0, 0, 0, 0, 1]
    print "#{que.concat(2.upto(4).to_a).map{|q| l.call(q)}.join(nil.to_s)}\n"
    break
  end
  print l.call(que.shift) if que.length == 5
end
```

とりあえず完成形？
homebrewでインストールしたelastic(elasticsearch)のプロセスを手軽に止める


## はじめに

elastic(elasticsearch)はhomebrewでこんな感じで簡単にインストールできる

```sh
> brew install elasticsearch
```

起動方法はシンプルにelasticsearchをコマンド名としているので簡単に起動する

```sh
> elasticsearch
```

また、バックグラウンド実行させる場合は

```sh
> elasticsearch &
```

ただ、バックグラウンド起動した場合にはこのelastic(elasticsearch)のプロセスを削除するのはけっこう面倒
こんな感じでpsコマンドでプロセスの一覧をgrepして絞り込んでプロセスIDを見つけてから、killコマンド打つのがだるい

```sh
> ps aux | grep elasticsearch
user          19246   0.0  0.1  2526452  12172   ??  S     9:54PM   0:00.13 xxxxx/elasticsearch
> kill 19246
```

# 面倒なプロセス停止を簡単にする解決策
elastic(elasticsearch)をデーモンで起動し、pidファイルにプロセスIDを書き出してやり、pidファイルを指定してkillコマンドを実行してやれば良い。詳細は以下

### elastic(elasticsearch)を起動時にオプションを付ける

elastic(elasticsearch)時に以下のオプションを付ける

* -d オプションでデーモン化
* -p オプションでファイルにpidファイルの場所を指定　今回はtmpディレクトリの下を指定

```sh
> elasticsearch -d -p ./tmp/pid
```

### elastic(elasticsearch)を停止する際にpidファイルを利用する

pidファイルを読み込んでその中身(12345 とかのプロセスID)を指定してkillコマンドを実行

```sh
> kill `cat ./tmp/pid`
```	

# おまけ

## Makefileで一発起動・停止

Makafileを使って一発で起動と停止出来るようにしておくと楽
(実際はRailsのプロジェクトで起動するミドルウェアをまとめて起動している)

```Makafile

# 起動
es_start:
	elasticsearch -d -p ./tmp/pid

# 停止
es_stop:
	kill `cat ./tmp/pid`
```

## git管理している場合はうっかりpidファイルをコミットしないようにする
git管理している場合は、.gitignoreで無視する領域にpidファイルを指定してうっかりコミットしてしまう心配がなくなる

.gitignoreファイルが以下の様なディレクトリがある場合

```.gitignore

/tmp
```

起動時に
./tmp/pid　ファイルは、git管理しているプロジェクトの.gitignoreにかかれている領域に置いてやると紛らわしくなくてよいでしょう


refs:

* https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html#setup-installation-pid
* http://stackoverflow.com/questions/14119062/restart-elasticsearch-node
CGContextRef

#グラフィックコンテキスト
　グラフィックスコンテキスト（単にコンテキストと言ったりするのかな）とは、描画内容のデータ（とでも考えたらいいのだろうか）のことで、構造体となっている。CGContextRefはその構造体へのポインタ。

次の関数は、（現在描画対象となっている）カレントグラフィックコンテキストを取得する。

```objc
CGContextRef UIGraphicsGetCurrentContext();
```

`UIView`の`drawRect:`内でこの関数を呼ぶことによって、その`UIView`のグラフィックコンテキストを取得できる。

　リファレンスによると、

>カレントグラフィックスコンテキストは、デフォルトでは`nil`となっています。
>ビューオブジェクトは、`drawRect:`メソッドを呼ぶに先立って、有効なコンテキストをスタックにプッシュし、それをカレントとします。
>描画を行うにあたり`UIView`を利用しなかったとしても、`UIGraphicsPushContext`関数を手動で呼び出すことによって有効なコンテキストをスタックにプッシュしなければなりません。

ということなので、この関数はスタックに積まれているコンテキストの一番上のコンテキストを返す。ということとなる。

　次の関数はカレントグラフィックコンテキストに対して描画を行う。

```objc
void UIRectFill(CGRect rect)
void UIRectFrame(CGRect rect)
void UIRectFillUsingBlendMode(CGRect rect, CGBlendMode blendMode)
void UIRectFrameUsingBlendMode(CGRect rect, CGBlendMode blendMode)
void UIRectClip(CGRect ret)
```

関連
　`UIGraphicsPushContext`
　`UIGraphicsPopContesxt`

　カレントでないコンテキストに対する描画関数は引数でコンテキストを指定する。そのような関数がいっぱいあり、通常は、上記の`UIGraphicsGetCurrentContext()`でカレントを取得したうえで、それらの関数で細かい描画を行う。（ようだ）

##コンテキストの形式
コンテキストには用途によっていろいろ種類があるようだ。
PDF用のコンテキストとか...
画面表示用のコンテキストにはビットマップ形式のものが用いられる。（形式というよりビットマップデータが付随している感じ？）

次の関数のようにビットマップデータの情報を取得したりするものは、ビットマップ形式のコンテキストのみに利用できる。（ビットマップ形式でないコンテキストを渡すとエラーや警告が発生する。）

```objc
void *CGBitmapContextGetData(CGContextRef context)
size_t CGBitmapContextGetWidth(CGContextRef context)
size_t CGBitmapContextGetHeight(CGContextRef context)
size_t CGBitmapContextGetBitsPerComponent(CGContextRef context)
size_t CGBitmapContextGetBitsPerPixel(CGContextRef context)
size_t CGBitmapContextGetBytesPerRow(CGContextRef context)
CGColorSpaceRef CGBitmapContextGetColorSpace(CGContextRef context)
CGImageAlphaInfo CGBitmapContextGetAlphaInfo(CGContextRef context)
CGBitmapInfo CGBitmapContextGetBitmapInfo(CGContextRef context)
```

##コンテキストの作成
次の二つの関数のうちいずれかを使うが、どう使い分けるの？
(1)

```objc
CGContextRef CGBitmapContextCreate(void *data, size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow)
```
ビットマップ形式のコンテキストを作成する。
得られるコンテキストはカレントではない。
この関数で作成したコンテキストを利用した後は、次の関数により解放する。

```objc
void CGContextRelease(CGContextRef context)
```

(2)

```objc
void UIGraphicsBeginImageContext(CGSize size)
```
ビットマップ形式のコンテキストを作成し、カレントとする。
見ての通りこの関数はコンテキストを返さないので、コンテキストを取得する際は、`UIGraphicsGetCurrentContext`を利用する。
この関数で作成したコンテキストを利用した後は、次の関数によりコンテキストを破棄する。

```objc
void UIGraphicsEndImageContext()
```

また、作成したコンテキストから次の関数で`UIImage`を取得できる。

```objc
UIImage * UIGraphicsGetImageFromCurrentImageContext()
```

`UIImage`で取得できることで、pngファイルとしてもとりだすことができる。
これが最大の利点なのでしょうか？
hitTestの仕組み


# `- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event`
　少し調べてみたのでメモ。推測も入っているので注意。
　`UIView`のメソッドです。
　`hitTest:withEvent:`は、画面がタッチされた時にシステム（UIKit?)がタッチイベントの対象となるビューを特定するためのテストへの返答を行います。

#動作
　画面がタッチされると、まずメインウィンドウの`hitTest:withEvent:`が呼ばれます。これを起点とし、`hitTest:withEvent`を呼ばれたビューがサブビューの`hitTest:withEvent:`を呼び、それを繰り返すことでビュー階層を辿り最終的にタッチイベントの対象となるビューを特定します。
　`hitTest:withEvent:`を呼ばれたビューは、`point`で示されるタッチ位置が自身に含まれるかをチェックします。含まれていないなら`nil`をスーパービューに返します。
　タッチ位置を含んでいてかつ自身がサブビューを保持していなければ、自身のインスタンスを返すことで、タッチイベントの対象であることをスーパービューに伝えます。
　タッチ位置を含んでいてかつサブビューを保持していれば、サブビューの中で最も前面にあるものの`hitTest:withEvent:`を呼びます。そのサブビューがタッチ位置を含んでいなければその次に前面にあるサブビューの`hitTest:WithEvent:`を呼ぶことを繰り返します。
　サブビューの中でインスタンスを返すものがあれば、自身もそのインスタンスをスーパービューに返し、サブビューが全て`nil`を返せば自身のインスタンスをスーパービューに返します。
　たぶんこんなことをしているのだと思う。

#利用
　このメソッドをオーバーライドすることで、本来なら他のビューの背面にあることでタッチイベントの対象とならないようなビューにもタッチイベントを受け取らせるようにすることができたりします。（その場合前面にあるビューにおいてこのメソッドで`nil`を返すようにする。）
gradlew connectedCheckでNo tests found.エラー

# gradlew connectedCheck

コマンドラインから実機テストを行う場合， connectedCheck を行うのが一般的かと思います．
このあたりのコマンドが何をするかは `gradlew tasks` で一覧できるので見てみると

- check
   - Runs all checks.
- connectedAndroidTest
    - Installs and runs instrumentation tests for all flavors on connected devices.
- connectedCheck
    -    Runs all device checks on currently connected devices.
- connectedDebugAndroidTest 
    - Installs and runs the tests for debug on connected devices.
- deviceAndroidTest 
    - Installs and runs instrumentation tests using all Device Providers.
- deviceCheck 
    - Runs all device checks using Device Providers and Test Servers.

こんな感じになっています．

# Junit4を導入してハマる

JUnit4の書き方はデフォルトの書き方とは少し異なります．
大きく分類すると

- `@RunWith` でrunnerを指定
- `@Test` でテストメソッドを指定
- テストメソッド名は何でも良い

といった感じです．
コードを示すと

```
@RunWith(AndroidJUnit4.class)
public class ApplicationTest {
    @Test
    public void hogehoge() {
        Assert.assertTrue(true);
    }
}
```

こんな感じ．

ただ，gradlew connectedCheckを実行したところ，以下のエラーで失敗しました．

```
:app2:connectedDebugAndroidTest                 
                                                
com.android.builder.testing.ConnectedDevice > No tests found.[ xxx - 4.4.2] FAILED 
No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack @Test annotations).
:app2:connectedDebugAndroidTest FAILED
```

No tests found. って言われます．テストあるのに．

## デフォルトのコード生成は `InstrumentationTestCase` を継承したJunit3形式

この `InstrumentationTestCase` の継承を削除しないと，テストが通りませんでした．
うっかりデフォルトのテストコードに `@RunWith(AndroidJUnit4.class)` を指定するとハマります．
AndroidStudio上ではエラーにならないのが，またくせ者です．

また， RunWith と InstrumentationTestCase どちらも読み込んでいても，メソッド名が `test~` となっていればテストが実行されます．
`test` で始まったメソッドで無ければ `@Test` アノテーションを付けていても失敗します．

うーん，ややこしい．

時間が無いので殴り書きになってしまった…．

```java:○
@RunWith(AndroidJUnit4.class)
public class ApplicationTest {
    @Test
    public void hogehoge() {
        Assert.assertTrue(true);
    }
}
```

```java:×
@RunWith(AndroidJUnit4.class)
public class ApplicationTest extends InstrumentationTestCase {
    @Test
    public void hogehoge() {
        Assert.assertTrue(true);
    }
}
```

```java:○
@RunWith(AndroidJUnit4.class)
public class ApplicationTest extends InstrumentationTestCase {
    @Test
    public void testHogeHoge() {
        Assert.assertTrue(true);
    }
}
```
Q: singleton_method_added() って何？ A: 「フック」

# きっかけ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">rubyのこの挙動何が起こってるの… <a href="https://t.co/SeioDJ8DDA">https://t.co/SeioDJ8DDA</a></p>&mdash; Urabe, Shyouhei (@shyouhei) <a href="https://twitter.com/shyouhei/status/709628871843254272">2016年3月15日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
を見かけて、いったい何がおかしいのか、そもそも`singleton_method`ってなんだ？と思ったところが始まり。
　クラスの理解もおぼつかない初心者が @shyouhei を質問攻めにしながらその謎に迫ります。

# singleton_methodとは？
　日本語で言うところの特異メソッド。普通のメソッドはクラス定義に書かれており、そのクラスから作ったインスタンスで利用できるものだけれど、特異メソッドはとある一つのインスタンスにだけ追加されるメソッドのこと。

```ruby:singleton_method_test1.rb
str1 = String.new
def str1.new_singleton_method
  puts "str1の特異メソッドだよ"
end
str1.new_singleton_method
# => str1の特異メソッドだよ

str2 = String.new
str2.new_singleton_method
# => undefined method `new_singleton_method' for "":String (NoMethodError)
```

　しかし、ruby-doc ( http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fdef.html#singleton_method ) を見てみるとクラスの特異メソッドと書いてある。しかも継承されると。クラスの特異メソッドってなんだ！？インスタンス化されたものにだけ追加できるメソッドじゃないのか！？と思ったら、私のクラスに対する理解が浅いだけでした。**クラスはClassというクラスのインスタンス**。 ( http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fdef.html#class ) にそう書いてある。だからクラスにも特異メソッドを追加できる。でもそれはクラスメソッドと同じように見える。というかクラスメソッドをクラスの特異メソッドとして実装している？書き方としてはこんな感じ。

```ruby:singleton_method_test2.rb
class Foo
  def Foo.new_singleton_method
    puts "Fooの特異メソッドだよ"
  end
end

Foo.new_singleton_method
# => Fooの特異メソッドだよ
```

　見た目クラスメソッドと差がないですね。ちなみにこれが継承される、という話はちょっと変。とある一つのインスタンスにのみ追加されるメソッドが特異メソッドのはずなので。でもここは「変だけど使い勝手優先」by @shyouhei らしいです。

# では、 singleton_method_added() って何？
　これは

```ruby:singleton_method_added_sample1.rb
class Foo
  def singleton_method_added(n)
    puts "新しく追加された特異メソッドは以下だよ"
    p n
  end
end

foo = Foo.new
def foo.new_singleton_method1
end
# => 新しく追加された特異メソッドは以下だよ
# => :new_singleton_method1
```

こんな風に使える。
　この `singleton_method_added()` の中身が、新たに特異メソッドが追加された時に実行されるのだ。引数として渡せるのは新たに追加された特異メソッド名のシンボル ( http://docs.ruby-lang.org/ja/2.2.0/class/Symbol.html ) 。

　その振る舞い方はわかった。けれども、この`singleton_method_added()`ってなんて呼べばいいんだろう？名前があらかじめ決まっている、という意味ではビルトインメソッドのように思えるけど、呼び出されるタイミングは決まってる上その振る舞いは定義されていないので、ビルトインメソッドとはまた違う。メソッドであることは確かだけど、その名前を自由に決められないし、どのタイミングで動くのかということもあらかじめ決まっているから、単純にメソッドと呼ぶのにも抵抗がある。
　なので、なんて呼べばいいか @shyouhei に聞いてみたところ、「フック」との答えが。なるほど。特定のタイミングで割り込むからフックなのか。となんだか納得。

# そして、冒頭のバグ？の意味
　冒頭のバグ#12131は、singleton_method_added()そのものをインスタンス化したオブジェクトの特異メソッドとして追加した時に、singleton_method_added()自体が動いてしまうのはおかしくないか？という問いだったのだ。
　そして、それはおかしくないよね、いやおかしい、という感じでTwitterで議論がされている、と。
　この議論についてはベテランの皆様に任せるのが一番いいと思うので、私の探求はここで終わり。
AD2 > ハムノイズの対策 > 金属板にGNDを落としてみた > 振幅が３分の１にはなった

```txt:動作確認
Analog Discovery 2 (以下 AD2)
Windows 8.1 pro (64bit)
```

http://qiita.com/7of9/items/2eae755efc040d4fb2bf
の続き。

50Hz/60Hzのノイズは「ハムノイズ」というものらしい。

参考 [ハム（５０／６０Ｈｚ）ノイズ対策](https://bbs.ednjapan.com/index.php?bid=4&one=1310224487gIGNBd&kid=1311918694SUfopr)


上記のリンクを参考に金属板にGNDを落としてみるのを試した。


## 接続

AD2のピンからの接続は以下とした。

- Scope 1 Positive <- プローブ -> Scope 1 Negative
- GND <-> 金属板

金属板は探したところ、フロッピーディスクドライブが出てきたので、それにした。
多分2005年ころにFortranで数値計算していた時の2台のPCのremnant。

![DSC_0155.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/d85accc7-0257-d4d6-0d75-e0a26d103fc2.jpeg)


## 結果

### GNDを金属板に落としていない場合

ハムノイズの振幅は±150mV程度。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/790ef12c-0620-47c0-4141-92f71e67933b.png)


### GNDを金属板に落とした場合

ハムノイズの振幅は±50mV程度。
確かに改善はしたが、自分が望んでいる振幅(±1mV程度）は達成できていない。

![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b4efb8ef-f830-75a2-413b-5ab3090a37dc.png)
Railsで、eachメソッドで配列の中身を展開するとき、任意の要素でスタイルを変える

<h2>
eachで回すとき、要素ごとにスタイルを変える
</h2>
<p>
RubyのArrayクラスでは
each
と共に、
each_with_indexを提供しています。<br>
indexとは要素の番号を表したもので、配列なので０から始まります。
</p>
<p>
今回はproductというモデルからデータをすべて持ってきて、４つだけ表示。それ以上のデータはもっと見るというリンクを作る。
</p>
といったデザインにします。つまり要素の４つ目だけにリンクをつける、ということです。
<p>
マイグレーションマイル、controller、viewは以下のとおりにします
</p>

```ruby:20160225054421_create_products.rb
class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.string :name,                 null: false
      t.integer :price,               null: false
      t.text :description,            null: false

      t.timestamps null: false
    end
  end
end

```

```ruby:product_controller.rb
class ProductsController < ApplicationController

  def index
    @products = Product.all
  end

end
```

```ruby:products/index.html.haml
  - @products.limit(4).each_with_index do |product,i|
    - if i == 3
      %p= product.name
      %p= "¥" + product.price.to_s
      %p= product.description    
      %a{href:""} もっと見る
    - else
      %p= product.name
      %p= "¥" + product.price.to_s
      %p= product.description
```

いろいろ応用がきくと思います♪(´ε｀ )
MySQLでlocalhostを設定していたら127.0.0.1じゃないと通らなかった件(MySQL 5.7の罠)

# 出たエラー
unitテストを普通にしていたらMySQLについて怒られた。

```
sa_as@hoge~
$ phpunit test/unit/app/Test.php
 An exception occured in driver: SQLSTATE[HY000] [2002] No such file or directory
```

怒られた。見たことない。どうしよう。急。
そういえば直前にdatabase.ini的な何がしかをpullした気はする

#いろいろ確認
優しい先輩方に言われて色々と調べるsa_as

```
sa_as@hoge~
$ mysql -uroot -p
Enter password:
mysql> select user,host from mysql.user;
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| mysql.sys | localhost |
| root      | localhost |
+-----------+-----------+
2 rows in set (0.00 sec)
```

localhostで入れた。何の問題もなかろう？

```
sa_as@hoge~
// mysqlのversion確認
$ mysqladmin -uroot -p version
Enter password:
mysqladmin  Ver 8.42 Distrib 5.7.10, for osx10.11 on x86_64
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version		5.7.10
Protocol version	10
Connection		Localhost via UNIX socket
UNIX socket		/tmp/mysql.sock
Uptime:			16 days 1 hour 33 min 36 sec
```

5.7ですね。(あれ、前職5.6だった気もする…そして先輩方も皆さん5.6らしい)

#調べてみた
[MySQLについて](http://www.network-learning.net/centos6/database/post-493)

> ・初期ユーザの相違
> MySQL 5.6までは”root@localhost”, “root@127.0.0.1”, “root@サーバのホスト名”など複数のrootアカウントと、yum版ではそれに加えて匿名ユーザ “”@localhost”などが作成されていましたが、MySQL 5.7では”root@localhost” のみを作成します。skip_name_resolveオプションが有効な環境下ではlocalhostと127.0.0.1は別のホストとして扱われるため、TCP接続の場合は注意してください。

んんん？
初期ユーザだからか
使ってるPC真っさらだから致し方なし(<-2月に転職しました。)

#結論

* MySQL5.7にすると上記みたいにlocalhostと127.0.0.1は違うものとして扱われるので注意
matplotlib ログスケール表示とグリッド表示

使おうと思ったときに忘れるのでメモ。matplotlibでのログ(対数)スケール表示とグリッド(目盛線)の表示方法。

# 環境
- Python 3.5.1
- matplotlib 1.5.1

# 準備
まずはmatplotlibをインポートします

```py3
import matplotlib.pyplot as plt
```
# ログスケール表示
y軸をログスケールにするためにはyscaleを'log'に指定します。x軸をログスケールにしたい場合は`plt.xscale('log')`です。

```py3
plt.plot([10,20,30],[10,100,1000],marker='^')
plt.yscale('log')
plt.show()
```

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/95987/e6540d41-2984-284a-58e8-3e1ccd02be82.png)

# グリッド表示
グリッドを表示するには`plt.grid()`を指定します。`which=`の'major'と'minor'はそれぞれ主目盛線と補助目盛線です。`color`と`linestyle`で色や線種も指定できます。

```py3
plt.plot([10,20,30],[10,100,1000],marker='^')
plt.yscale('log')

plt.grid(which='major',color='black',linestyle='-')
plt.grid(which='minor',color='black',linestyle='-')

plt.show()
```

![figure_.png](https://qiita-image-store.s3.amazonaws.com/0/95987/594d64bb-0cd2-adce-878c-90ff2e97a323.png)
AWSとGitHubに2段階認証の導入

#AWSへ2段階認証の導入
##Multi-Factor Authentication(MFA)機能による2段階認証
1. 最初にrootユーザーでAWSのマネジメントコンソールにアクセス。

2. 画面右上の(IAM User)@(Account)のボタンをクリックして、Security Credentialを選択。

3. 画面左メニューのUsersを選択して表示されるユーザー一覧から対象のユーザーを選択する。Security Credentialsのタブを選択して、Sign-In Credentialsを押す。
4. ポップアップが表示され、A virtual MFA deviceとA hardware MFA deviceの項目があるので、A virtual MFA deviceを選択して、Next Stepを押す。
するとQRコードとAuthentication Code1とAuthentication Code2の2つのテキスト入力欄が表示される。

##スマホアプリAuthyのダウンロード
1. 最初に自身で使用するスマートフォンにAuthy( https://www.authy.com/ )というアプリケーションをGoogle Play, Apple Storeからインストール。

2. アプリを起動して指示に従っていく。

3. 30秒の時間毎に続いて表示されるパスワードを先ほどAWS上の画面のAuthentication Code1とAuthentication Code2に入力する。

4. 登録完了。


以降、AWSへログインするときに通常のログイン画面に加えて、MFAコードを入力するがAuthy上に30秒ごとに更新されるコードを入力する2段階認証となる。

(参考)http://qiita.com/macoshita/items/06e2a2474bc8eca1a67d


#GitHubへの2段階認証の導入
1. 以下のURLへアクセス
https://github.com/settings/security

2. Set up two-factor authenticationをクリックする。

3. Set up using an appを選択する。

4. 表示されるQRをAuthyから読み取る。
(※ただし、この段階でgitでpush/pullがhttpsでできなくなる。)

(参考)http://qiita.com/katsukii/items/9773e9cfea7d929fcf9c

#2段階認証下でgit push/pullを可能にする
2段階認証によりgit push/pullできなくなるので以下のようにアクセストークンを発行する必要がある。

##アクセストークンの発行
1. GitHubのマイページからSettingsを選択
2. Personal Access Tokensを選択
3. Generate new tokenを押す
4. Token descriptionには自分の分かりやすい識別情報を記述
5. Select scopesでrepoにチェックを入れてレポジトリへの権限付与
6. Generate tokenを押す
7. 黄緑色のところに表示されるコード（アクセストークン）を控えておく

(参考)https://help.github.com/articles/creating-an-access-token-for-command-line-use/

##gitの認証を毎回問われるのを省略する
2段階認証下でhttpsでgit push/pullするときにはこれまで使っていたパスワードの代わりに発行したパスワードを入力する必要がある。
これは手間になるのでいかのように.netrcを以下のように編集する

```bash
vim ~/.netrc
```

```.netrc
machine github.com
login GitHubユーザー名
password 発行したアクセストークン
```

(参考)http://wada811.blogspot.com/2014/05/failed-to-push-to-github-over-https.html

以上の動作でgit push/pullできるようになる。
javascriptで変数をコピーする方法

javascriptの変数の渡し方は、基本文字列や数字以外は全て参照渡しです

うっかり渡して追加したり削除したりするともとの変数が変更されてしまいます

そのため、元の変数を上書きしないコピーが時々欲しくなります

jqueryだったら$.extend()を使えば良いのですが、javascriptだけの場合どうすればいいのか？

```
var variable2 = JSON.parse(JSON.stringify(variable1));
```

これでイケそうです

一度、変数を文字列に変換して、それから元に戻すって感じです

ただしこれ、配列や連想配列のみ使えて、複雑なobjectでは使えないっぽいです

いい方法ご存知の方がいらっしゃいましたら是非ご教示お願いします！
composer updateでartisanコマンドのエラーが出る時の対処法

Laravel4から5.1にアップデートをして、composer updateをする時に下記のようなエラーが出ました。

```bash:
$ composer update   
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files
> php artisan clear-compiled

                                            
  [InvalidArgumentException]                
  Command "clear-compiled" is not defined.  
                                            

Script php artisan clear-compiled handling the post-update-cmd event returned with an error

                      
  [RuntimeException]  
  Error Output:       

```

どうやら、artisanコマンドが動作していないようです。 
laravelの[githubリポジトリのconfig](https://github.com/laravel/laravel/blob/5.1/config/app.php)をよく見てみると、 
5.1のブランチでは、ArtisanServiceProviderがservice providerのところに定義されています。 
5.2のものをコピーしたため、これが不足していたようです :sob: 

```php:
'providers' => [
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
...
```

定義を追加すると、無事updateできました。 :relaxed: 

```bash:
$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files
> php artisan clear-compiled
> php artisan optimize
Generating optimized class loader
```
yumパッケージ(rpm)の中身を確認する


あらかじめ yumdonwloader コマンドを使えるようにしておく

```
$ sudo yum install yum-utils
```

## yum リポジトリから rpm をダウンロード

たとえば openldap-servers パッケージの場合

```
$ yumdownloader openldap-servers
```

これで `openldap-servers-2.4.40-8.el7.x86_64.rpm` がダウンロードされる。

## パッケージに含まれているファイルの一覧を表示する

```
$ rpm -qlp openldap-servers-2.4.40-8.el7.x86_64.rpm
```

これでパッケージ内のファイル一覧が表示される

```
/etc/openldap/check_password.conf
/etc/openldap/schema
/etc/openldap/schema/collective.ldif
/etc/openldap/schema/collective.schema
/etc/openldap/schema/corba.ldif
/etc/openldap/schema/corba.schema
/etc/openldap/schema/core.ldif
（略）
```

## パッケージに含まれているファイルを取り出す

`rpm2cpio` コマンドと `cpio` コマンドを組み合わせるとパッケージからファイルを展開することができる

cpio はカレントディレクトリ配下に展開するので適当な作業用ディレクトリを作ってその中で実行する


```
$ mkdir tmp
$ cd tmp
$ rpm2cpio openldap-servers-2.4.40-8.el7.x86_64.rpm | cpio -id
```

# 参考

* [rpmやyumでパッケージの内容を確認する方法 - tetsuyai’s blog](http://tetsuyai.hatenablog.com/entry/20110127/1296111515)
* [＠IT：RPMパッケージからファイルを取り出すには](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/522rpmcpio.html)
bitbucketにpushできない


#現象
新しく作成したレポジトリにpushすると何故かエラーになる

```
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

#解決策
bitbucketに再度sshキー登録したらpushできた


sshキーの登録はこちらからできる（XXXは自分のID入れる）
https://bitbucket.org/account/user/XXXXXXXX/ssh-keys/


違うレポジトリには普通にpushできるのでsshキーが登録されてないってことはないと思ったのだが、何がいけなかったのか。

前やった時はリモートの設定を削除して登録しなおしたら出来たんだけどな

```リモートの削除
git remote rm origin
```

```リモートの登録
git remote add origin git@bitbucket.org:XXXXXXXX(ID)/XXXXX(レポジトリ名).git
```
NSE Librariesを触ってみる

#NSE Librariesとは
NSE LibrariesとはNmapが提供しているスクリプトライブラリです。略してnselibと言いたいのですが、Nselibという研究目的のソフトウェアリポジトリがあるそうなのでNSE Librariesと表記した方が良さそうです。ライブラリはluaで書かれており、ライブラリを使用する際にも基本的にluaで書く形になります。

#何ができるん？
普段コマンドを手入力して使っているNmapをコマンドラインオプション以上に詳細に、かつ簡単に指定ができます。そのため、複数台サーバを対象にした検証スクリプトを簡単に作成することができます。

#サンプルコード
スキャン対象サーバがHTTPSに対応している場合にスキャン対象サーバのホスト情報を出力するスクリプトです。

```lua:hello_nselib.nse
local nmap = require "nmap"
local shortport = require "shortport"

description = [[This is test scripts]]

---
--@usage
--nmap --script hello_nselib

author = "Your name"

license = "Same as Nmap--See https://nmap.org/book/man-legal.html"

categories = {
    "test_nselib",
}

-- スクリプトを実行する条件を指定(今回はHTTPS)
portrule = shortport.portnumber({443})

-- 条件に一致した際に実行する処理
function action(host, port)
    local ret_list = {}
    ret_list["port"] = port
    ret_list["host"] = host
    return ret_list
end
```

以下のスクリプトで実行できます。(適宜置き換えてください)

```
nmap ${対象サーバのIP} --script=${スクリプトのパス名}
```

#出力結果
ローカル(nemumu.com → nemumu.com)にスキャンをしているためRTTやIPが少し異なるかもしれませんが、以下の様な結果が出力されると思います。

```
[nemumu@nemumu ~]$ nmap nemumu.com -p 443 --script=./hello_nselib.nse

Starting Nmap 7.01 ( https://nmap.org ) at 2016-03-16 19:40 JST
Nmap scan report for nemumu.com (127.0.0.1)
Host is up (0.00014s latency).
Other addresses for nemumu.com (not scanned): ::1
rDNS record for 127.0.0.1: localhost.localdomain
PORT    STATE SERVICE
443/tcp open  https
| hello_nselib: 
|   host: 
|     reason: syn-ack
|     reason_ttl: 0
|     interface_mtu: 0
|     times: 
|       srtt: 0.000137
|       rttvar: 0.003777
|       timeout: 0.1
|     targetname: nemumu.com
|     name: localhost.localdomain
|     bin_ip: \x7F\x00\x00\x01
|     ip: 127.0.0.1
|     registry: 
| 
|   port: 
|     protocol: tcp
|     reason: syn-ack
|     reason_ttl: 0
|     service: https
|     version: 
|       service_dtype: table
|       name: https
|       name_confidence: 3
|       cpe: 
| 
|       service_tunnel: none
|     number: 443
|_    state: open
```

スクリプト内でjson出力してごにょごにょできるため大量のサーバを検証する場合には有用かもしれません。
WindowsとRuby2.2とbcrypt

Windows上でRails環境を構築しようとした際に、トラブルが待ち受けていることがよくあります。最近、そのうちの1つが解決したので、メモ代わりに残しておきます。

# Ruby 2.2にしてみたら
もともとRuby 2.1でRails開発を行っていましたが、「せっかくWindows版もあるんだし、サーバも2.2を使っているし」ということで、Ruby 2.2に上げることにしました。

`bundle install`も終わって、さあ`rails s`としてみたところ、エラーが起きてしまいました。内容としては、bcrypt Gemがうまくロードされない、とのことでした。

# bcrypt Gemの事情
調べてみると、bcryptはC言語部分を含むエクステンションで、Windows用はバイナリもついてきます。ところが、このバイナリが**Ruby 2.1までのしかない**ために、Ruby 2.2だとエラーになってしまいました。挙句の果てに、`gem install bcrypt --platform=ruby`としてWindows用のバイナリがないバージョンを入れてみると、DevKitでコンパイルしてすんなりインストールが終わる、という本末転倒なことになっていました（これに対応したことをBundlerでやる方法は、はっきりしないままでした）。

# バージョンアップ♪

そんなある日のこと、何気なくGemのバージョンをチェックしていると、bcryptの3.1.11が出ていることに気づきました。CHANGELOGを見てみると、

> - Add support for Ruby 2.2 in compiled Windows binaries

とあって、そのまますんなりインストールできるようになっていたのでした。

# まとめ
RubyをWindowsでやると、どうしても引っかかるところがあるけど、そう悪いものではない気もする。
Processingで二重振り子(Double Pendulum)の軌跡を描く

<img width="692" alt="スクリーンショット 2016-03-16 17.33.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/26043/9205b00f-5ab2-f9b1-082e-07df7388c85c.png">
<img width="633" alt="スクリーンショット 2016-03-16 17.33.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/26043/ba6e2f0f-7d15-c4f6-529d-72f6f354da90.png">
二重振り子はカオスな運動をすることで知られている。その軌跡をProcessingで書くと美しい。

https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%87%8D%E6%8C%AF%E3%82%8A%E5%AD%90

# 単振り子の作り方
The Nature of Code「3.9 Trigonometry and Forces: The Pendulum」を読もう。
http://natureofcode.com/book/chapter-3-oscillation/

# 二重振り子の加速度
```math
\theta_1'' = \frac{-g(2m_1 + m_2){\sin \theta_1} - m_2g{\sin (\theta_1 - 2\theta_2) -2{\sin (\theta_1 - \theta_2)}}m_2(\theta_2'^2L_2+\theta_1'^2L_1{\cos(\theta_1 - \theta_2))}}{L_1(2m_1+m_2-m_2{\cos(2\theta_1 - 2\theta_2))}}
```

```math
\theta_2'' = \frac{2{\sin (\theta_1 - \theta_2)(\theta_1'^2L_1(m_1+m_2)+g(m_1+m_2){\cos \theta_1}}+\theta_2'^2L_2m_2{\cos(\theta_1 - \theta_2))}}{L_2(2m_1+m_2-m_2{\cos(2\theta_1 - 2\theta_2))}}
```
二重振り子の加速度は上のようなエグい数式で表される。


## 親の振り子
内側の振り子を親とする。
###角速度
角度の一回微分が角速度になることに注意する。

```java
float alpha = -gravity * (2 * mass1 + mass2) * sin(angle)-mass2 * gravity * sin(angle - 2 * childAngle) - 2 * sin(angle - childAngle) * mass2 *(childAngleVelocity * childAngleVelocity * l2 + angleVelocity * angleVelocity * l1 * cos(angle - childAngle));

float beta = l1 * (2 * mass1 + mass2 - mass2 * cos(2 * angle - 2 * childAngle));

angleAcceleration = alpha / beta;
```

###角度を求める
```java
angleVelocity += angleAcceleration;
angle += angleVelocity;
```

## 子の振り子
外側の振り子を子とする。
###角速度
```java
float gunnma = 2 * sin(angle - childAngle) * (angleVelocity * angleVelocity * l1 *(mass1 + mass2) + gravity * (mass1 + mass2) * cos(angle) + childAngleVelocity * childAngleVelocity * l2 * mass2 * cos(angle - childAngle));

float phai = l2 * (2 * mass1 + mass2 - mass2 * cos(2 * angle - 2 * childAngle));


childAngleAcceleration = gunnma / phai;
```

###角度を求める
```java
childAngleVelocity += childAngleAcceleration;
childAngle += childAngleVelocity;
```

# 描画
```java
void display() {
　// 親の振り子
  location.set(l1 * sin(angle), l1 * cos(angle), 0);

  location.add(origin);

  translate(0, height / 3);
  float c = map(location.x,0, width, 0, 255);
  stroke(96, 230,c);
  fill(255);


  line(origin.x, origin.y, location.x, location.y);
  ellipse(location.x, location.y, mass1 * 3, mass1 * 3);

  // 子の振り子
  childLocation = location.get();
  childLocation.add(l2 * sin(childAngle), l2 * cos(childAngle));

  line(location.x, location.y, childLocation.x, childLocation.y);
  ellipse(childLocation.x, childLocation.y, mass2 * 3, mass2 * 3);
  // ellipse(childLocation.x, childLocation.y, 1, 1);
}
```

- 参考  
    - http://www.myphysicslab.com/dbl_pendulum.html
三次元の球面上でパーティクルを動かす

<img width="351" alt="スクリーンショット 2016-03-16 17.23.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/26043/bd1ddaa6-c680-b9c6-83a6-e4cf24dae914.png">

二次元平面上でパーティクルを動かし、それを三次元の球面上で動かすことを考えます。

# 単位ベクトルを使う
```java:Mover.pde
void display() {
    // 位置に合わせて色を変える
    stroke(255 * location.x / width,255 * location.y / height,255 * location.z / width);
    strokeWeight(1);
    fill(175);

    
    PVector l = location.get();
    // 単位ベクトルにする
    l.normalize();
　　// 球の半径だけ伸ばす
    l.mult(300);

　　// 中心付近に移動
    l.add(width, 0, 0);

    point(l.x, l.y, l.z);
}
```

- コード  
https://github.com/naoyashiga/p5/tree/master/Theme/NatureOfCode/Forces/ThreeDimension
こんなズンドコキヨシは嫌だ with PHP


- http://qiita.com/uzulla/items/dabe815ff9d793535d86 に触発された
- PHP7.0.3

### こんなズンドコキヨシは嫌だ
- `__toString()`に実装されている
- 変数、クラス名は全て日本語
- `ズン`, `ドコ`, `キ・ヨ・シ！`は定義せず変数名やクラス名から取得する
- クロージャの即時呼び出しのジェネレータでループ

```php
<?php
class ズンドコキ・ヨ・シ！
{
    public function __toString()
    {
        $ズンズンズンズンドコ = null;
        foreach ((function($ズンドコ) {
            loop: yield $ズンドコ[mt_rand(0, 1)];
            goto loop;
        })(str_split(__CLASS__, 6)) as $どっちか) {
            echo $どっちか, PHP_EOL;
            $ズンズンズンズンドコ .= $どっちか;
            if (strstr($ズンズンズンズンドコ, key(get_defined_vars()))) {
                return mb_substr(__CLASS__, -6) . PHP_EOL;
            }
        }
    }
}

echo new ズンドコキ・ヨ・シ！();
```

### こんなズンドコキヨシは嫌だ
- バッファした標準出力を用いて比較
- `ズン`, `ドコ`の出力がクラスの`__get()`内
- クラス変数の名前とクラス名を用いて`ズン`, `ドコ`を出力
- `goto`でループ処理
- `key(array_reverse(get_defined_vars()))`で`ズンズンズンズンドコ`を取得したいがために余計な変数を定義させずクロージャにした


```php
<?php
class ズンドコキ・ヨ・シ！
{
    private $_0_2;
    private $_2_2;

    public function __get($name)
    {
        list(, $offset, $limit) = explode('_', $name);
        echo mb_substr(__CLASS__, $offset, $limit);
    }
}

ob_start();
$ズンズンズンズンドコ = new ズンドコキ・ヨ・シ！();
start:
    ((function($zundoko) {
        $zd = (new ReflectionClass(get_class($zundoko)))->getProperties()[mt_rand(0, 1)]->getName();
        $zundoko->$zd;
    })($ズンズンズンズンドコ));
    if (strstr(ob_get_contents(), key(array_reverse(get_defined_vars())))) {
        echo mb_substr(get_class($ズンズンズンズンドコ), -6), PHP_EOL;
        ob_end_flush();
        exit();
    }
goto start;
```
MacでZIPにするとき.DS_Storeを含めない(GUI)

1. Keka をインストールする
2. Keka を起動して Zip タブの「Mac のリソースフォークを含めない」にチェックを入れる
<img width="488" alt="スクリーンショット 2016-03-16 19.32.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/115844/ac8b3a02-c735-eac1-e33e-0e34f06c70d3.png">
3. Keka を Dock に追加する
<img width="178" alt="スクリーンショット 2016-03-16 19.33.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/115844/07cb6640-ed29-8267-1e3d-cdceca2238ea.png">
4. zip にしたいフォルダを Keka のアイコンにドロップする
vm.vfs_cache_pressureを変更してもページキャッシュの解放には効きません

Linux でページキャッシュにメモリが費やされてメモリ不足になる問題を抱えて、vm.vfs_cache_pressureを変更してみたけれど、効果がなかったというひとはたくさんおられるでしょう。

Linux の vm.vfs_cache_pressure は、slabメモリのdentryとiノードのキャッシュの割り当てを調整するだけで、ページキャッシュ(ファイルI/Oのバッファキャッシュ)の解放には関係がありません。

vfs_cache_pressure についての説明を見てみましょう。

[Documentation for /proc/sys/vm/*	kernel version 2.6.29] (https://www.kernel.org/doc/Documentation/sysctl/vm.txt) より引用

vfs_cache_pressure
------------------

This percentage value controls the tendency of the kernel to reclaim
the memory which is used for caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

Increasing vfs_cache_pressure significantly beyond 100 may have negative
performance impact. Reclaim code needs to take various locks to find freeable
directory and inode objects. With vfs_cache_pressure=1000, it will look for
ten times more freeable objects than there are.


超約

このパーセント値はカーネルがディレクトリとiノードオブジェクトのキャッシュに使用されるメモリを再利用するときの傾向を制御します。

vfs_cache_pressureのデフォルト値は100で、このときカーネルはdentryとiノードキャッシュの再利用は、ページキャッシュとスワップキャッシュの再利用と同等の割合になります。

vfs_cache_pressureを小さくすると、dentryとiノードキャッシュの割り当てメモリを保持する傾向が高くなり、vfs_cache_pressure=0とした場合、カーネルはdentryとiノードキャッシュのメモリをまったく再利用しなくなります。この設定はたやすくメモリ不足の状況につながるでしょう。
vfs_cache_pressureを100より大きくすると、カーネルはdentryとiノードキャッシュのメモリをより積極的に再利用するようになります。

vfs_cache_pressureを100から大幅に大きくすると、パフォーマンスが悪くなるかもしれません。
キャッシュメモリの再利用では、解放可能なメモリ見つけるために様々なロックをかけます。vfs_cache_pressure = 1000 では、より多くの解放可能なオブジェクトを見つけようとするため、デフォルト値の10倍の処理を要します。

------------------

vfs_cache_pressure の説明では、dentryとiノードのキャッシュに割り当てられたメモリを、どの程度再利用するかの傾向を制御するとは書かれていますが、ページキャッシュやスワップキャッシュを解放するとは書かれていません。

そして、カーネルのソースを vfs_cache_pressure で grep した限りでも、ファイルシステムのメタ情報や dcache など、ファイルシステム関係のソースは引っかかりますが、mm の下にあるものはページングに関係したものは引っかかりません。簡単にマッチしたソースを見ましたが、いずれの部分もページキャッシュに関する処理やカーネル変数を操作するようなコードはないようでした。

このようなことから、ページキャッシュのメモリ回収はこのパラメータは見ていないと思われます。
Elemental テーマのエリア一覧

concrete5 でオリジナルテーマを作成するときのエリア名の命名方法の TIPS です。

エリア名は、できるだけ、互換性を保つために Elemental が使っているエリア名をベースにしましょう。

参考まで、Elemental で使われているエリア名一覧です。

## 最新版

この Qiita の最新版はこちら。
https://concrete5.co.jp/blog/elemental-area-list

## concrete5 のエリア名の基本

- 半角英大小数字、スペースが使えます
- 多言語機能をオンにし、翻訳インターフェースを使うと、エリア名の翻訳ができます。
- できるなら、グローバルエリア名とエリア名は重複しないように
- Sidebar をグローバルエリア名としたい場合は、できるだけ「空白」の concrete5 テーマをインストールすること


## Elemental で使用している グローバルエリア名

- Header Search
- Header Site Title
- Header Navigation
- Footer Site Title
- Footer Social
- Footer Legal
- Footer Navigation
- Footer Contact

## Elemental で使用しているエリア名

- Page Header
- Main
- Page Footer
- Sidebar
smarty ～テンプレートファイルから別のテンプレートファイルを呼び出す～

今思い出すと、なぜすぐに気づかなかったのか不思議ですが、
smartyを使ってファイルのincludeをしたら、以下のエラーが出てしまいました。
今回は、このエラーの解決方法を書いていきます。

```
 Unable to read template file 'hoge.tpl'
```

## そもそも何を作ろうとしたのか
テンプレートファイルの中から
テンプレートファイルを読み込もうとしました。
例えば下記↓


```html:index.tpl
<html>
<head><title></title></head>
<body>
   {include file='hoge.tpl'}
</body>
</html>
```

```html:hoge.tpl
hogehoge
```

画面の表示結果は、こうなるはず。（ここで冒頭のエラーが出てしまった…。）

```html:表示結果
hogehoge
```


フォルダ構成は以下

```text:フォルダ構成
views
  ┗ templates
        ┗ test
            ┣ index.tpl
            ┗ hoge.tpl
```

## さて、解決していきましょうか。
必要な知識を確認っと・・・。
まず、smartyのマニュアルから下記の文言が…
参照：http://www.smarty.net/docsv2/ja/template.resources.tpl


```
使用したいテンプレートへのパスを、 $template_dir のルートディレクトリからの相対パスで指定します。
```

おぉっと、$template_dirとはなんなのか。
こちらもsmartyマニュアルでは、
参照：http://www.smarty.net/docsv2/ja/api.variables.tpl#variable.template.dir

```
$template_dir
これは、デフォルトのテンプレートディレクトリの名前です。 
ファイルのインクルード時にリソースの種類を指定しなかった場合は、 
このディレクトリから探します。デフォルトは ./templates で、 
これは、実行しているスクリプトと同じ場所にある templates/ ディレクトリを探すということです。
```

となっており、./templates から対象のファイルをパス指定すべきであることが分かります。

ここまでの情報を得ておきながら、ずっとうまくいかず悩んでいたのですが、
私の場合は、下記の文章をちゃんと読んでいなかったせいだということが分かりました。

```
$template_dir のルートディレクトリからの相対パス
```
ずっと、呼び出し元からの相対パスを指定していました。
ルートディレクトリからの相対パスなので、この場合は、以下のようになります。

```html:index.tpl
<html>
<head><title></title></head>
<body>
   {include file='../test/hoge.tpl'}
</body>
</html>
```


```text:フォルダ構成
views
  ┗ templates
        ┗ test
            ┣ index.tpl
            ┗ hoge.tpl
```


解決しました。お疲れ様ですー。
ズンドコ by CMake

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

プログラミングとか良くわからない初心者なので、CMakeで書いてみました！

```cmake:zd.cmake
set(kiyoshied false)
set(zun 0)

while(NOT kiyoshied)
    string(RANDOM LENGTH 1 ALPHABET 01 number)
    if(${number})
        message("ズン")
        math(EXPR zun "${zun}+1")
    else()
        message("ドコ")
        if(${zun} EQUAL 4)
            message("キ・ヨ・シ！")
            set(kiyoshied true)
        endif()
        set(zun 0)
    endif()
endwhile()
```

```bash
$ cmake -P zd.cmake
ズン
ドコ
ズン
ドコ
ドコ
ドコ
ドコ
ズン
ドコ
ドコ
ドコ
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ！
```
Convert Markdown to PDF

MarkdownをPDFに変換する
=======================

markdown-pdfをつかう。自分用のメモ。

インストール
-------------

インストール等はこちらを参考にした。

- [Markdown ファイルを PDF に変換する。](http://qiita.com/spiegel-im-spiegel/items/cdea4a17b44fb59d6320)

CSS
------

githubからいただいた。

     $ git clone https://github.com/mixu/markdown-styles.git

jasonm23-swissが良かったのでこれを使わせていただく。

変換
------

     $ markdown-pdf -s markdown-styles/layouts/jasonm23-swiss/assets/style.css -o output.pdf input.md
Unity Collaborate ちょっと調べたメモ

UnityCollaborateのベータ版が公開されて気になったので合間にちょっと調べたメモ
※まだ使ってみてないので間違ってたらゴメンナサイ

####・ベータ期間中はすべて無料で使用可能
####・Unity5.4以降で使用可能
####・ストレージは15GBまで使える
####・ベータ版からの使った人にはベータ期間終了後も追加費用無しでストレージ容量を維持してくれる
####・AWSを使ってる


##使用開始手順
①Unityプロジェクト作成
②Collaborateとリンク
③メンバーを追加
以上
webmockが勝手にrequireされないようにする

# Problem

RspecでAPIのスタブを作成するために[webmock](https://github.com/bblimke/webmock)を導入したら、specを実行してない時にも勝手にスタブが有効になり、apiアクセスが出来なくなった。

# Solution

Gemfileに書いたgemは勝手にrequireされるようです。そして、webmockはrequireされると勝手にスタブをつくるため、apiアクセスが出来なくなります。

requireしたくない場合は、`require: false`オプションをつけます。

```
# Gemfile: 

gem 'webmock', require: false
```
YAMAHA RTX810 DHCPサーバー設定例

設定内容
---
以下の利用を想定し、YAMAHA RTX810にてDHCPサーバーを構成する。
設定内容については以下の通り。

| 設定項目 | 設定内容 |
|----------|----------|
| 利用ポート | lan1
| DHCPスコープ | 192.168.0.50 ～ 192.168.0.100/24 |
| DHCPリース予約設定 | 「00:01:8e:ae:30:88」のMACアドレスを持ったPCに対して「192.168.0.90」をリース |
| DHCPによるDNSサーバー設定のリース | DNSサーバーとして「192.168.0.11」、「192.168.0.12」を設定  


Config投入例
---
```
ip lan1 address 192.168.0.1/24
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.0.50-192.168.0.100/24
dhcp scope bind 1 192.168.0.90 ethernet 00:01:8e:ae:30:88
dhcp scope option 1 dns=192.168.0.11,192.168.0.12
```
※`dhcp server rfc2131 compliant except remain-silent`は一部のPC OSでDHCPサーバーが応答を返さない場合に正しくないネットマスク値を使用してしまう不具合がある為、該当の現象を回避する為に本コマンドを投入

利用環境
---
YAMAHA RTX810
rails_adminで日本語表示してたら、日付が保存されなくなった


rails_admin (0.8.1)

更新画面で、日付を選択すると2016年1月1日（木）となり、
localeのformatの:longが選択されてしまう。
保存するときにparseできなくて、nullが保存されてしまう！

## とりあえず全ての、date, datetimeのformatを:defaultへ

```config/initializers/rails_admin.rb 
module RailsAdmin 
  module Config 
    module Fields 
      module Types 
        class Datetime < RailsAdmin::Config::Fields::Base
          register_instance_option :date_format do 
            :default
          end
        end
        class Date < RailsAdmin::Config::Fields::Types::Datetime 
          register_instance_option :date_format do 
            :default
          end
        end
      end 
    end 
  end
end
```
Xcode7で"The data couldn’t be read because it isn’t in the correct format"エラー

備忘録として

Xcode7で古いアプリのAdhoc ipaファイルを作成しようとしたら表題のようなエラーがでて、ipaファイルが作成されなかった。
Provisioning Profileは正しいのにおかしいと数時間悩んでいたら、どうやらBitcodeの設定がいけなかったらしい。
「Build Settings」から「Bitcode」を「NO」にしたらうまく作成された。

- 参考
https://forums.developer.apple.com/thread/21193
Ansible2.0に対応したansible-playbook-debuggerが便利！


Ansibleの利用にあたり便利なansible-playbook-debuggerが
Ansible2.0に対応していましたのでご紹介です！

GitHub:[ansible-playbook-debugger](https://github.com/ks888/ansible-playbook-debugger)

## できること

plyabook内でタスクが失敗した時に、モジュールの引数や変数などを確認できます。また、デバッガ内でモジュールの引数を変更して、失敗したタスクの再実行ができます。

## 注意点

このデバッガーはAnsibleのバージョン1系には対応していません。

## 導入方法

### ダウンロード

playbookが存在するディレクトリにて以下を実施します。

```
mkdir strategy_plugins
cd strategy_plugins
wget https://raw.githubusercontent.com/ks888/ansible-playbook-debugger/master/strategy_plugins/debug.py
```


### playbookの編集

```playbook.yml
- hosts: all
  strategy: debug #追加
  tasks:
```

## 使い方

通常通り`ansible-playbook`コマンドを発行します。
そしてtaskが失敗すると以下のようになります。


```
TASK [shared_usage/roles/os : ネットワーク設定] ****************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ImportError: No module named gi.repository
failed: [xxxxx] => (item={u'conn_name': u'eth0', u'ifname': u'eth0', u'type': u'ethernet', u'ip4': u'xx.xx.xx.xx/24', u'gw4': u'xx.xx.xx.xx'}) => {"failed": true, "item": {"conn_name": "eth0", "gw4": "xx.xx.xx.xx", "ifname": "eth0", "ip4": "xx.xx.xx.xx/24", "type": "ethernet"}, "parsed": false}
Debugger invoked
(debug) 
```

`(debug)`が表示されたらデバッグモードに入ったことになります。

## デバッグモードでできること

|コマンド|出力結果|
|:---------|:------|
|p task|失敗したタスクの表示|
|p task.args|タスク内で指定された引数（copyモジュールにおけるsrc/destなど）を表示します)|
|p vars|変数の一覧を表示します(gather_factsがTrueの場合は収拾した変数も表示します)|
|p host|対象のホスト名を指定します(inventory内の設定）|
|p result|タスクの実行結果を表示します|
|task.args[key] = value|モジュールの引数keyをvalueで更新します|
|vars[key] = value|変数keyをvalueで更新します|
|redo/r|失敗したタスクを再実行します|
|continue/c|Playbookの実行を継続します|
|quit/q|デバッグモードを終了します（Playbookの実行は中止されます）|
dotfiles, アプリケーションの設定をMackupで管理する

# Macでdotfilesやアプリケーションの設定のバックアップをどうやって管理してますか

## dotfilesとは
.zprofile, .gitconfig, .bashrc など先頭に.がつく設定ファイル。

## 今までほかの人はどうやって管理してたか
qiitaで[dotfiles](http://qiita.com/search?q=dotfiles&sort=rel) タグを検索すると幾つか出てきます。

* [dotfilesをgithubに置く](http://qiita.com/844196/items/5426b0fbc4f18fcc62c8)
* [dotfilesを管理しよう](http://qiita.com/okamos/items/40966158d0271ae7198b)
* [ミニマルに始めるDotfiles自動化計画](http://qiita.com/massy22/items/5bdb97f8d6e93517f916)

その多くは

* githubで管理する
* gitのrepositoryの中にdotfilesを配置する
* シンボリックリンクを貼るscriptを作成する

という流れです。

このやり方でももちろん出来ますが、

* dotfileが増えるたびに自分でコミットする必要がある
* 初心者に教えるにはある程度説明が必要になる

などの問題があります。

## Mackupで管理する
Mackupでは

* Dropboxを使う(保存場所は変更可能)
* dotfilesをDropboxなどのフォルダに配置する
* シンボリックリンクを貼る

とほぼおなじ事を行っています。それを

`mackup backup`

のコマンドを1発叩くだけでやってくれます。便利！

## インストール

`brew install mackup`

## 使い方

### `mackup backup`

設定をバックアップします。裏ではこんな感じでうごいてます。

```sh
cp ~/.gitconfig ~/Dropbox/Mackup/.gitconfig
rm ~/.gitconfig
ln -s ~/Dropbox/Mackup/.gitconfig ~/.gitconfig
```

### `mackup restore`

設定をリストアします。リストアといってもシンボリックリンクを貼るだけ。

## Mackupが対応しているツール

`mackup list`

で確認することが出来ます。
Atom, SublimeText, Vim, Emacsなど多くのEditorの設定ファイルにも対応してます。

またはMackupのリポジトリのapplicationsフォルダを直接見るとどのファイルが対象かも確認できるので参考になると思います。
https://github.com/lra/mackup/tree/master/mackup/applications

## Mackupの設定
[公式のドキュメント](https://github.com/lra/mackup/tree/master/doc)に書いてますが抜粋。


### Storage
Mackupで管理するファイルを置く場所を設定できます

```~/.mackup.cfg
[storage]
engine = iCloud
```

### 特定のアプリケーションだけ管理する

```~/.mackup.cfg
[applications_to_sync]
zsh
```

### 特定のアプリケーションを管理しないようにする

```~/.mackup.cfg
[applications_to_ignore]
emacs
```

### 独自の管理パターンを追加する

`~/.mackup` に xxx.cfg を追加することで可能。

**!!! `~/.mackup.cfg`とは別のファイルなので注意!**

```~/.mackup/sshrc.cfg
[application]
name = sshrc

[configuration_files]
.sshrc
.sshrc.d
```

# まとめ
特別な知識がなくてもとりあえずMackup入れておけば管理できるので新人プログラマーとしてデビューした方、あまりMacになじみにのない方から、管理を簡略したい方まで多くの人にとって便利なのではと思います。

Dropboxではファイルの過去の状態に戻ったり、消したファイルを復元することは出来ますが、Editorの設定や.zshrcの設定の変更履歴がほしい人はGitのリポジトリを中で作成し、保持することでgit logで変更履歴を見れるようにするといいと思います。


## 注意
Mackupはアプリケーションが独自の設定ファイルバックアップ機能があるアプリケーションには対応していないことがあります。例えば、Alfred、iTerm2はそれぞれ独自の設定ファイルバックアップを行ってください。