OmniAICreator/Qiita-1.07M huggingface dataset:
matplotlibでリアルタイム描画

## モチベーション
センサーとかの値を確認したり，機械学習の学習状況とかそんなんをリアルタイムにグラフにプロットしながら見たいときがある．
pythonには``matplotlib``っていう便利なグラフ作成ライブラリがあるのでこれを使いたい．

## 既知の問題とか
普通``matplotlib``でグラフを作るときは

```py
import matplotlib.pyplot as plt

"""
plotしたいデータを計算する処理
...
"""
plt.plot(data)
plt.show()
```
とかやる．
だけど，``show()``を呼ぶとプログラムがそこでブロックされてリアルタイムな描画ができない．
調べてみると``show()``ではなくて``draw()``を使おう!みたいな記事とか，``Tkinter(tkinter)``とか``Qt``とかのGUIライブラリと組み合わせた方法とかがでてくるんだけど，Windows環境だとグラフに一度でも触るとGUIが固まったりしてとてもじゃないけど使えなかったりした．
(たしかMacとかのUnix環境だったら使えたような気がする．)

## pause()を使おう!!!
例の如くstackoverflowにそれ関係のやりとりがあった．
[参考: real-time plotting in while loop with matplotlib](http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib)

結論は``plt.show()``の代わりに``plt.pause(interval)``を使うということ．
下に簡単なsin関数を永遠にplotする例を載っける．

注意点などはコメントに書いたので，読んでください．

```py:matplotlib_realtime_plot_example.py
# -*- coding: utf-8 -*-
"""
matplotlibでリアルタイムプロットする例

無限にsin関数をplotし続ける
"""
from __future__ import unicode_literals, print_function

import numpy as np
import matplotlib.pyplot as plt


def pause_plot():
    fig, ax = plt.subplots(1, 1)
    x = np.arange(-np.pi, np.pi, 0.1)
    y = np.sin(x)
    # 初期化的に一度plotしなければならない
    # そのときplotしたオブジェクトを受け取る受け取る必要がある．
    # listが返ってくるので，注意
    lines, = ax.plot(x, y)

    # ここから無限にplotする
    while True:
        # plotデータの更新
        x += 0.1
        y = np.sin(x)

        # 描画データを更新するときにplot関数を使うと
        # lineオブジェクトが都度増えてしまうので，注意．
        #
        # 一番楽なのは上記で受け取ったlinesに対して
        # set_data()メソッドで描画データを更新する方法．
        lines.set_data(x, y)

        # set_data()を使うと軸とかは自動設定されないっぽいので，
        # 今回の例だとあっという間にsinカーブが描画範囲からいなくなる．
        # そのためx軸の範囲は適宜修正してやる必要がある．
        ax.set_xlim((x.min(), x.max()))

        # 一番のポイント
        # - plt.show() ブロッキングされてリアルタイムに描写できない
        # - plt.ion() + plt.draw() グラフウインドウが固まってプログラムが止まるから使えない
        # ----> plt.pause(interval) これを使う!!! 引数はsleep時間
        plt.pause(.01)

if __name__ == "__main__":
    pause_plot()
```

これで色々捗る!!!

## おまけ
上で載っけたstackoverflowに``drawnow``というパッケージを使った方法も載っているので紹介する．
``drawnow``は``pip``で入るので

```bash
$ pip install drawnow
```
でOK．

### 使い方
```py:matplotlib_drawnow_realtime_plot_example.py
# -*- coding: utf-8 -*-
"""
matplotlibでリアルタイムプロットする例

無限にsin関数をplotし続ける
"""
from __future__ import unicode_literals, print_function

import numpy as np
import matplotlib.pyplot as plt
from drawnow import drawnow, figure

def drawnow_plot():
    # drawnowパッケージに含まれているfigure関数を使って
    # figureオブジェクトを作る
    fig = figure()
    x = np.arange(-np.pi, np.pi, .1)
    y = np.sin(x)

    def draw():
        """
        drawnow関数に渡すplotに必要な処理を記述
        plotに必要な変数はこの関数がアクセスできるスコープの変数にしておく
        """
        plt.plot(x, y)

    while True:
        x += .1
        y = np.sin(x)
        drawnow(draw)
```

...書いてからソースコード見てみたが，``drawnow``は結局中で``draw()``を呼んでるみたいで，Windowsでやると上手く行かなかった(GUIが固まる現象)...

## 結論
リアルタイムにプロットしたいときは``plt.pause()``を使おう!!!
コマンドプロンプト＆Powershellあれこれ

#コマンドプロンプトやpowershellの備忘録

PowerShellもコマンドプロンプトから

```
powershell -command "{command}"
```
の形式で起動する形で記載する

##Windowsでtailする
```sample0.cmd
powershell -command "gc test.log -Wait"
```
##設定ファイルから環境変数を読み込む

```setting.INI
NAME1=hogehoge
NAME2=fugafuga
```

```sample1.cmd
for /F "eol=; tokens=1 delims=" %%i in (setting.INI) do @set %%i
echo NAME1=%NAME1%
echo NAME2=%NAME2%
```



##自身のprocessid取得
```sample2.cmd
powershell -command "get-wmiobject win32_process -filter processid=$pid | foreach-object {$_.parentprocessid;}"
```


##ファイルの更新時間が24時間以内か判定
```sample3.cmd
set cmd="$ft=$(Get-ItemProperty hoge.txt).LastWriteTime;"
set cmd=%cmd%"$checkpoint=$(Get-Date).AddMinutes(-1440); "
set cmd=%cmd%if ($ft -gt $checkpoint){exit 0}else{exit 1}
powershell  -Command %cmd%
IF %ERRORLEVEL% EQU 0 (
  ::hoge.txtの更新時間は24時間以内
)
```


##DELコマンドのエラー判定
```sample4.cmd
DEL hoge.txt 2>&1 | FIND /V ""
IF %ERRORLEVEL% EQU 0 (
  ::ファイル削除失敗
)
```


##ファイルの中の文字列が存在する行をカウントして件数を変数に格納
```sample5.cmd
FOR /f "DELIMS=" %%A IN ('FINDSTR /R /C:"FIND: STR!!" hoge.txt ^| find /c /v "" ') DO SET COUNT=%%A
```


##ファイル内の文字列を置換して別名保存（文字コード指定可）
コマンドプロンプトで置換すると文字化ける場合などに便利
[Encodingで指定できるコード ](https://technet.microsoft.com/ja-jp/library/hh847788.aspx)

```sample6.cmd
set cmd="gci hoge.INI | %{(Get-Content -Encoding UTF8 $_)|%{$_ -replace'FIND: STR!','REPLACE: STR!!'}|Set-Content -Encoding UTF8 $_'_EDIT'}"
powershell  -Command %cmd%
```
%%はForEach-Objectのエイリアス
コマンドプロンプトで直接実行する場合は%にする

##ディレクトリのファイルに対して個別に処理を行なう(ラベル版)
forにまとめて書くと長くなる場合に使ったりする

```sample7.cmd
for /f "delims=;" %%i in ('dir /b /od c:\target_dir\*') do CALL :SAMPLE_CMD %%i

::バッチの最後にラベルを配置
::ファイルごとにこのラベルが呼ばれる
:SAMPLE_CMD
set FILENAME=%1
::ファイルごとの処理を書く
```

##ファイルのタイムスタンプ変更
```sample8.cmd
powershell  -Command "Set-ItemProperty hoge.txt -Name LastWriteTime -Value \"01/31/2010 13:50\""
```
投稿一覧とかで無限ループする場合

一覧ページで投稿記事などが無限にループして表示されてしまうパターンがまれにある。

私がハマったパターンだと、

```
<?php 
while(the_repeater_field('author_profile')):
    query_posts($args);
    if (have_posts()):while(have_posts()):the_post();

    <?php endwhile; else:?>

    <?php endif;?>

    <?php endwhile;?>

<?endwhile;?>
```

というパターンで、advanced custom fieldsのループの間に記事のループを入れていた。

http://2inc.org/blog/2013/03/06/3020/
によるとwordpressループ内にhave_postsを入れると無限ループするよう。
対策としてforeachを使えば良いとのことだったので、以下のようにやってみた。

```
<?php 
while(the_repeater_field('author_profile')):
	$relate_posts = get_posts( $args );
	foreach($relate_posts as $post) :setup_postdata( $post );


	<?php endforeach; ?>
<?endwhile;?>
```

とりあえず、これで今のところ問題なさげ。
Collectors.toMap の NullPointerException に気をつける

以下のテストは成功しません。

```java
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;

public class MapCollectorTest {

    @Test
    public void test() {
        Map<Integer, Object> map1 = new HashMap<>();
        map1.put(1, null);

        Map<Integer, Object> map2 =
                map1.entrySet().stream().collect(
                        Collectors.toMap(x -> 1 + x.getKey(), Map.Entry::getValue));

        assertThat(map2, notNullValue());
    }

}
```

動かしてみるとわかるのですが、```NullPointerException``` が発生します。理由は ```Collectors.toMap``` の中で ```Map.merge``` が使われていて、```Map.merge``` では **value が null の時にも NullPointerException が発生**するからです。

stackoverflow ([Java 8 NullPointerException in Collectors.toMap](http://stackoverflow.com/questions/24630963/java-8-nullpointerexception-in-collectors-tomap)) でも解説されています。
UIView.animateWithDurationのinitialSpringVelocityについて


今更ですが、UIViewにiOS7で追加された、animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completionの、initialSpringVelocityブロパティが何を示しているのか、Google先生も教えてくれなかったので調べました。

頑張って簡単に答えをいうと、アニメーションの初速が、
**「アニメーション全体をLinearに1秒で終わらせる速度の何倍の速度か」**
を示すプロパティのようです。混乱しますが、
**「アニメーション全体をLinearに何秒で終わらせる速度か」**
ではありません。

リファレンスを読むと、
>A value of 1 corresponds to the total animation distance traversed in one second.
For example, if the total animation distance is 200 points and you want the start of the animation to match a view velocity of 100 pt/s, use a value of 0.5.

と書いてあり、全体が200ptを動くアニメーションで、初速を100pt/sにしたい場合、200ptを1秒で終わらせる速度(200pt/s)の1/2なので、0.5になります。

このパラメータは、ユーザのフリックで物体を動かすときにユーザのフリック速度からスムーズにアニメーションに繋げたいような場合に便利です。
例えば指にy軸だけついてくるアニメーションを考えると、

```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var topConstraint: NSLayoutConstraint! //動かすviewの上からの距離の制約
    private var topConstraintConstantWhenBegan = CGFloat(0) //動かしはじめの上からの距離保存用変数
    private let minTopConstraintConstant = CGFloat(0) //動かすviewの上からの最小の距離
    private var maxTopConstraintConstant: CGFloat { //動かすviewの上からの最大の距離
        get { return view.frame.height - 50 - topLayoutGuide.length }
    }
    
    @IBAction func panned(sender: UIPanGestureRecognizer) {
        switch sender.state {
        case .Began: //保存
            topConstraintConstantWhenBegan = topConstraint.constant
        case .Changed: //指についてくる
            topConstraint.constant = sender.translationInView(view).y + topConstraintConstantWhenBegan
        case .Ended: //アニメーション
            let velocity = sender.velocityInView(view).y //離した瞬間の速度
            let beforeConstant = topConstraint.constant //離した瞬間の上からの距離
            let afterConstant = velocity > 0 ? maxTopConstraintConstant : minTopConstraintConstant //アニメーション後の上からの距離
            let distance = afterConstant - beforeConstant //アニメーションする距離

            topConstraint.constant = afterConstant

            UIView.animateWithDuration(3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: velocity / distance, options: .CurveLinear, animations: {
                self.view.layoutIfNeeded()
            }, completion: nil)
        default: break
        }
    }
}
```

initialSprintVelocityが、velocity / distance になっています。
大分混乱するのですが、1秒でアニメーションが終わる速度は、`distance(pt) / 1(s) = distance(pt/s)` です。
なので、`velocity(pt/s) / distance(pt/s)`が、initialSpringVelocityになります。

##コード
https://github.com/malt03/Animation
Xcode7で作ってます。適当にpushしただけなので、動くか分かりません。

##リファレンス
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/clm/UIView/animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:
CentOS7導入時に調べたsystemdの話

筆者はsystemdどころかinit自体よくわからない状態からスタートしています。

* 従来のSysVinitやUpstart（RHEL6における実装）に代わるサービス管理のアーキテクチャー。
* Fedora15で採用後、2014年リリースのRHEL7（CentOS7）でも正式採用、事実上の標準となりつつある。

## 従来
* `/sbin/init`が`/etc/inittab`に記載された各ランレベルごとの設定に従ってすべてのプロセスをrcスクリプトによって起動していく。
* rcスクリプトの実体は`/etc/init.d`内のシェルスクリプトのシンボリックリンク。`/etc/init.d`は`service`コマンドでの起動終了等でも操作しているもの（実際は直接スクリプトを叩くのと`service`コマンドとでは[差異がある模様](http://heartbeats.jp/hbblog/2013/06/service-start-stop.html)で、直接だとカレントの環境を使ってしまうので望まぬっ結果となる可能性があるらしい）。
* この他にも`/sbin/init`にはデバイスの読み込みやらファイルシステムのマウントやら、起動時に必要な処理が様々組み込まれている。
* SysVinitはPIDを直接には知らず、PIDファイルを介してアクセスしている。

## systemd
* `/sbin/init`が実行していた処理をUnit単位で分割、並行起動できるようにしている。
* Unit定義ファイルの実体は2箇所に存在。
    * システムデフォルトは`/usr/lib/sytemd/system`配下
    * 管理者がカスタマイズする内容は`/etc/systemd/system`配下
    * 従ってデフォルト設定を変更する場合は前者から後者のパスへコピーして編集すればよい
* Unitの種類は拡張子によって判別でき、サービスを管理する`.service`、マウントポイントを表す`.mount`、デバイスに対応した`.device`等がある。
* Unit間は依存関係を定義できる。ひとつはUnitファイル内の[Unit]セクションにて、`Wants=`や`Require=`オプションで定義すること。もうひとつはそのUnitの名を関した`wants`ディレクトリ内に、依存するUnitのシンボリックリンクを置くこと。
* 前後関係の定義は同じく[Unit]セクションの`After=`と`Before=`オプションを使用する。
* Unitにはデバイスやマウントポイントも存在しているので、これらを対象とした依存関係も書くことができる。

### 起動時のプロセス
1. systemdが`default.target`を起動する。これは`multi-user.target`や`rescue.target`のシンボリックリンクであり、従来のランレベルに相当する。
2. 例えば`multi-user.target`が呼ばれた場合、`/etc/systemd/system/multi-user.target.wants`ディレクトリ内の各サービスを起動する。これらは各service unitのシンボリックリンクに相当する。つまりサービスの自動起動化とは、このシンボリックリンクを張ることに相当している（`systemctl enable`コマンドの出力を見るとわかる）。
3. その後は各Unitの前後関係、依存関係に基づいて起動処理が実行されていく。

## 操作
Unitの操作には`systemctl`コマンドを使用する
* `start/stop` 起動終了
* `reload/restart` 設定ファイルの再読み込み、サービスの再起動
* `enable/disable` 自動起動の有効化無効化（chkconfigにあたる）
* `mask/unmask` サービス自体の有効化無効化（unmask状態だと起動不可となる）
* `status` 状態確認
* `list-unit-files` 全ユニット表示
* `list-units` 起動中のユニット表示

ランレベル変更に相当する`default.target`のターゲット変更には`set-default`を用いる。

```shell-session
# systemctl set-default multi-user.target
```

Unitファイルに変更を加えた際は`daemon-reload`で変更内容を読み込ませる。

```shell-session
# systemctl daemon-reload
```

### Unitファイルの作成
* Unitファイルは自分で書くことももちろんできる。
* 参考：[Linux - systemdの*.serviceファイルの書き方 - Qiita](http://qiita.com/masami256/items/ef0f23125cf8255e4857)

## 未消化
* プロセス管理にはcgroupsを用いているらしいがよくわからない。
* journaldがsyslogに代わって使われているらしいが、そもそもsyslogからよくわかってない。

## 参考
* [Windowsユーザーに教えるLinuxの常識（10）：Linux起動の仕組みを理解しよう［init/inittab編］ (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0204/02/news002.html)
* [Windowsユーザーに教えるLinuxの常識（最終回）：Linux起動の仕組みを理解しよう［rcスクリプト編］ - ＠IT](http://www.atmarkit.co.jp/ait/articles/0206/04/news001.html)
* [systemdを本番運用してわかったこと - mixi Engineers' Blog](http://alpha.mixi.co.jp/entry/2013/12063/)
* [Linux女子部　systemd徹底入門](http://www.slideshare.net/enakai/linux-27872553) 正直これだけ読んでてもよいのではないかという細かいまとめ
* [systemd - ArchWiki](https://wiki.archlinuxjp.org/index.php/Systemd) ArchWikiは元来Arch Linuxの設定に向けたWikiだが、Linux全般的な情報が集まっていて重宝する
Jackson 2.6.0 から parse時のrequired fieldをチェックできるようになった。

# コード

```kotlin

data class CustomClass(
    JsonProperty("id", required = false)
    val id: Int,
    JsonProperty("name", required = true)
    val name: String
)

fun test() {
    val mapper = ObjectMapper().configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true)
    var raiseError = false

    try {
        var customClass = mapper.readValue("{\"id\":10}", javaClass<CustomClass>())
    } catch (e: JsonMappingException) {
        raiseError = true
    }

    assertTrue(raiseError)
}
```

こんな感じで、 `JsonProperty(required = true)` の AnnotationをつけたfieldはExceptionを投げてくれる。
便利！

# 参考

- [Add support for basic "is-required" checks on deserialization using `@JsonProperty(required=true)`](https://github.com/FasterXML/jackson-databind/issues/230)
JenkinsでGitをポーリングしてクラウドストレージにアップロードする

Gitを定期的に監視して、変更があったブランチを全てニフティクラウドの、クラウドストレージに上げてみたいと思います。
# ニフティクラウドの設定

* 適当な名前のバケットを作成しておきます

```:バケット名
test-app
```

# s3cmdの設定

Jenkinsからニフクラストレージを操作するために、s3cmdというツールを使います。
s3cmdはAwsSS3のツールですが、ニフティクラウドでも互換性があって使えるみたいですね。

* インストール

```
apt-get install s3cmd
```

* 設定

```
s3cmd --configure
アクセスキーと、シークレットーキーを入力
vi ~/.s3cfg
以下３行を変更
host_base = ncss.nifty.com
host_bucket = %(bucket)s.ncss.nifty.com
signature_v2 = True
```

# Jenkinsの設定

* プラグインの管理より、GIT pluginを入れておきます

## ジョブの作成
 
* ソースコード管理でGitを選択
* Repository URL、Credentialsを入力
* 全てのリポジトリを対象にしたいため、	Branch Specifierは「*」を指定しておきます。
* ビルド・トリガのSCMをポーリングにチェックを入れ、スケジュールに以下のように入力します

```
H/5 * * * *
```
これで、5分毎にgitを監視してくれます。

* ビルド欄より「シェルの実行」を選択し、以下のように入力します

```
#!/bin/bash
for remote_branch in `git branch -a | grep remotes`; do
  remote_name="$(echo -n "$remote_branch" | cut -d/ -f2)"
  branch_name="$(echo -n "$remote_branch" | cut -d/ -f3-)"
  git checkout -b $branch_name $remote_name/$branch_name
  git archive --format=tar HEAD | gzip > module.tar.gz
  path_name=${branch_name/\//_}
  s3cmd put module.tar.gz s3://test-app/$path_name/module.tar.gz
  rm -f module.tar.gz
done
```

全てのブランチをアーカイブして、クラウドストレージにアップロードします。
実行されると、クラウドストレージの作成したバケットの中にブランチ名と同じ名前のフォルダが作成されます。
フォルダの中にアーカイブされたモジュールが格納されています。

※クラウドストレージのフォルダ名には「/」が使えないみたいなので、「_」に変更してます。
　例　fix/branch ⇒ fix\_branch
IE8この野郎っていう今更の

##はじまり

[これって使えたっけ？今だからこそ IE8 対応コーディングのポイントをおさらい](http://bashalog.c-brains.jp/15/07/17-120100.php)
を読んでいて、そういえばこんなこともあったなと思い出したのでメモ。

HTML5になってから省略できるタグってあるじゃないですか。
直後にli要素が続く`</li>`とか、直後に特定の要素が続く`</p>`とか。
もしくは大胆に`<html></html>`を省略しちゃうとか。

細かいところは各位調べてもらいたいんですけど。

##で、何が問題？
ただ、省略しちゃうとIE8でスタイルが崩れたりするんですよね。
体感では特にli要素かなぁ。ぐっちゃぐちゃになったりする。
よくよく考えればタグの省略自体がHTML5の仕様なので当然なんですけど。

でもIE9以上とか他のブラウザだとちゃんと見れたりするので、
**やっぱりお前かこの野郎**ってなったりする。
あと省略に慣れてると原因特定がわかりにくかったりする。

コーディングしてる間は省略してサクサク書けて楽でも、
確認作業でその分の時間取られてたら意味がないのでIE8対応しなくて良くなるまでは省略はできないなー。

あと、省略可能/不可能の条件が地味にめんどくさいのでそこもね。
うまいこと付き合っていきたいですね。IE8死なないかなー
Vagrant 1.7 〜 で vagrant package する場合の注意

背景
==============
Vagrant 1.7〜 での SSH 鍵の扱い
----------
Vagrant 1.7 以降では、`vagrant up` 時に旧来の `insecure_key` を検知した場合、その仮想マシン用の別の鍵ペアを生成して `insecure_key` を置き換える。

生成した秘密鍵は `.vagrant/machines/default/virtualbox/private_key` に置かれ、それ以降そのマシンへのアクセスは新しい鍵が使われるようになり、`insecure_key` での SSH はできなくなる。

`vagrant package`
----------
`vagrant package` コマンドはその時点の仮想マシンイメージをファイルにエクスポートする。

よく使うプロビジョニングを済ませた状態の box を作っておいて、`vagrant box add` して効率よく使いまわしたりができる。

注意点
======
よく使うプロビジョニングを Vagrant で済ませようとして、

- どこかで `vagrant up` して中身をもにょもにょ （Vagrant 1.7使用）
- `vagrant package`
- `vagrant box add myprebuildbox ./package.box`

とかやるとすると

別のところで `myprebuildbox` を `vagrant up` しようとした時に、box の中身の公開鍵が `insecure_key` から差し替えられていることで、デフォルト設定で起動できないことになる。

なので、`vagrant package` するつもりの仮想マシンは、`insecure_key` を置き換えないように、`config.ssh.insert_key = false` して置くのが無難


Vagrant 公式ドキュメント http://docs.vagrantup.com/v2/vagrantfile/ssh_settings.html より
> This only has an effect if you don't already use private keys for authentication or if you are relying on the default insecure key. If you don't have to take care about security in your project and want to keep using the default insecure key, set this to `false`.
LayoutInflater の生成方法、View の inflate 方法比較

TL;DR
=====
どれも同じだから使えるの使え

`context#getSystemService(Context.LAYOUT_INFLATER_SERVICE);`
===

最もベース？の生成方法。

`Layoutinflater.from(Context context)`
======================================
これでも生成出来る。でもこれも中で何をやっているかというと、与えた `context` に対して上記の `getSystemService()` をコールしている為ほぼ同等。例外とか投げてくれるしキャストもやってくれるんでこれを使うのが一番妥当な気がする。

`View.inflate(Context context, int resource, ViewGroup root)`
========================
こんなものもあり、与えた `resource` を直接 `Inflater#inflate()` してくれる。何をしているかというと、与えた `context` を引数に上記の `Layoutinflater.from()` を呼び出し以下略。
但し `Inflater#inflate()` する際に第 3 引数の無いメソッドをコールしている為、ArrayAdapter で getView をオーバーライドする際などに使用すると

> addView(View, LayoutParams) is not supported in AdapterView

などと怒られることがある。こういったケースは素直に一旦 inflater を作成して、第三引数を false に指定したほうが良さそう。
SCTPとは


Stream Control Transmission Protocolの略で、TCP/UDPと同じTransport層のプロトコルである。
[RFC4960](https://tools.ietf.org/html/rfc4960)。2000年に定義された、ってことはもう15年も前なのね。
これまで、あまり出会いがなかったけどどうしてだろう。


## ようするに
TCPのような信頼性と、UDPのような少ないオーバヘッドのいいとこ取りを目指したものである、と。


# 特徴

## マルチホーミング
複数のI/Fを束ねる機能のことらしい。bondingや、昔のISDNのMPみたいなものだね、きっと。
[![Multi-homing](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/figure2.gif)](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/)
* IBMのサイトから拝借（クリックで飛べます）。上がTCPの場合、下がSCTPの場合。

各I/Fをモニタリングして、フェイルオーバーもする仕様らしいので、この辺のプロトコル実装はちょっと大変そうかも。

WiFiとBLEのマルチなんかも考えると便利そうかも。あれ、iOSのI/Fを意識させないフレームワークも実はSCTPを使っているとか！？（もしくはQUICとか）




## マルチストリーミング
一つのストリームの中で複数のストリームを同時に流すことができる。これもいいね。これを聞いて、自分はVLANのTag付けや、MPLS(Multi-Protocol Label Switching)みたいな感じかなぁ、という印象。一つが詰まっても他を止めない、てのはよいね。
特にHTTP的な使い方を想定すると、1本のストリーム内で複数の部品転送ができると、通信効率もさることながら体感速度として格段に良くなりそう。

[![Multi-streaming](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/figure3.gif)](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/)
* IBMのサイトから拝借（クリックで飛べます）。


## 接続、切断処理
接続処理は、TCPの3wayから4wayに増えたんだって。
理由は、SYNフラッドを避けるため。へぇへぇ。

[![4way](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/figure4.gif)](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/)
* IBMのサイトから拝借（クリックで飛べます）。

逆に、終了処理はTCPの4wayから3wayに変更なんだって。こちらはハーフクローズを避けるためらしい。

[![3way](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/figure6.gif)](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/)
* IBMのサイトから拝借（クリックで飛べます）。

いずれも、TCPではハーフオープン、ハーフクローズ時点での主導権がクライアント側にあったのを危ないのでやめたってことのよう。

サーバからのSHUTDOWNに応えなかったら、ハーフクローズ状態のままになってしまいそう、と思ったり思わなかったり。。


## メッセージ・フレーミング
UDPのように、メッセージ単位でフレーム化ができる。
つまり、送った単位で受け取れる。これはいいね。TCPはバイト指向なので素のまま使おうとするとちょっと不便よね。

[![Message-Oriented](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/figure5.gif)](https://www.ibm.com/developerworks/jp/linux/library/l-sctp/)
* IBMのサイトから拝借（クリックで飛べます）。

## 構成可能な順不同配送
TCPは順番通りに到着することが保証されるので、とっても便利。UDPだと、必要に応じて自前で管理する必要があるので、かなり面倒よね。
SCTPは各ストリームごとに指定できるっぽい。なるほど、これもいいね。


# 所感
WebRTCや、QUIC絡みでSCTPにたどり着きました。
SCTPは、使ってみたことも実装したこともないけど、話だけみると、今までよく感じていた「TCPだとやりすぎ、UDPだと足りなすぎ」な部分を程よくいいとこ取りしていて、TCPを置き換える勢いがあってもよさそうなのに、と思います。
ここ15年間、そうはならなかった理由はわかりませんが、普及しすぎてしまったTCPも一因なのかもしれませんね。もしくは、知らないところで実は既にかなりの部分置き換えられているとか。そう、SPDYのように。

ここにきて、GoogleによるSPDYが一気にHTTP/2として、HTTPの代替わりを促そうとしているように、SCTPも日の目をみるかもしれません。
いや、その前にQUICが標準となってしまうかもですかね。

おわり。
historyで”年-月-日 時間”表示の設定

#目的
historyコマンドで年-月-日 時間”を表示させる。

#方法
bashrcにHISTTIMEFORMAT環境変数を定義する。

#設定

```bashrc.
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
HISTTIMEFORMAT='%Y-%m-%d %T'
export HISTTIMEFORMAT

```
gocode + goenv で標準パッケージが autocomplete できない

goenv でいれた go で gocode を go get すると、autocomplete で標準パッケージを解決できなくてサジェストしてもらえない。

いまのところ、goenv やめて brew install go で、gocode も入れなおすことでしか解決できない。

GOROOT が /usr/local/go に向いてるからってのまでは解ってるが...

✧＼\ g( 'ω' )o /／✧
Dockerコンテナのログをローテートする

#コンテナログのrotateについて

コンテナを実際の環境で運用しようと思うと、各種ログをローカルに保存する必要があります。

しかし、そのままにしておくとログが肥大化してしまいますので`logrotate`が必要です。
[参考にしたページ](https://sandro-keil.de/blog/2015/03/11/logrotate-for-docker-container/)

##環境

* rhel 7.1
* docker 1.6.2


##手順

* 格納先を作成する

```
mkdir /var/log/docker/rhel1
```

　


* logrotateを実装する


```
vi /etc/logrotate.d/docker-container
```


```vi:/etc/logrotate.d/docker-container
#設定は好みで変えて下さい
/var/log/docker/*/* {
  rotate 7
  daily
  compress
  size=1M
  missingok
  delaycompress
  copytruncate
}
```

　

 
* コンテナを起動する

private resistryから取得しているため、
環境によってimageの取得先を変えて下さい

```
docker run -it  --name=rhel1 -v /var/log/rhel1:/var/log/ localhost:5000/library/rhel:latest /bin/bash
```

 　

* ログ生成

```
echo aaa > /var/log/messages
```

　
 
* Ctrl+p+qでコンテナを抜ける

##以降はテスト

* ローテートの手動実行

```
logrotate -fv /etc/logrotate.d/docker-container
```
 
　

 
* ログ確認

```
ls /var/log/docker/rhel1/
messages  messages.1
```

##概要説明

コンテナからOS上のディスクをボリュームマウント（-vオプション）して、ログをローカルに吐き出しています。これを`logrotate`の対象とすることでローテートを実現しています。


logrotateの実行タイミングはどういじればいいの？という方は、[こちら](http://qiita.com/kiimiiis/items/b9bc67922fb0baf37a1e)にまとめた記事がありましたのでご覧ください。
SQL*PlusでLinuxコマンドのlsっぽいものを使えるようにしてみたい。


# 内容
SQL*Plusで、以下のようなlsコマンドっぽいものを作成する。

```sql
SQL> @ls

OBJECT_TYPE         OBJECT_NAME                    CREATED             LAST_DDL_TIME
------------------- ------------------------------ ------------------- -------------------
INDEX               TEST_TABLE01_IDX               2015-08-04 10:49:28 2015-08-04 10:49:28
TABLE               TEST_TABLE01                   2015-08-04 10:48:10 2015-08-04 10:57:21
TABLE               TEST_TABLE02                   2015-08-04 10:59:27 2015-08-04 10:59:27
TRIGGER             TEST01_TRG                     2015-08-04 10:57:21 2015-08-04 10:57:21
```

# 環境

* OS
    Red Hat Enterprise Linux Server release 6.4 (Santiago)

* ORACLE
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production


# 手順

1. ls.sqlの作成
	以下の`ls.sql`ファイルを作成する。

    ```sql:ls.sql
    SET LINES 1000
    COL OBJECT_NAME FOR A30
    COL OBJECT_TYPE FOR A19
    SELECT OBJECT_TYPE,OBJECT_NAME,CREATED,LAST_DDL_TIME
    FROM USER_OBJECTS
    ORDER BY 1,2,3,4;
    ```

2. ls.sqlファイルの配置
    ls.sqlを配置する。今回は`/home/oracle/sql/`配下に配置したとする。

3. SQL*Plusの起動
以下のどちらかの方法で、SqlPlusを起動する。
    
    ```sh
    cd /home/oracle/sql/
    sqlplus sample/sample
    ```
    
    または
    
    ```sh
    export SQLPATH=/home/oracle/sql/
    sqlplus sample/sample
    ```

4. lsの実行

    ```sql
    SQL> @ls
    
    OBJECT_TYPE         OBJECT_NAME                    CREATED             LAST_DDL_TIME
    ------------------- ------------------------------ ------------------- -------------------
    INDEX               TEST_TABLE01_IDX               2015-08-04 10:49:28 2015-08-04 10:49:28
    TABLE               TEST_TABLE01                   2015-08-04 10:48:10 2015-08-04 10:57:21
    TABLE               TEST_TABLE02                   2015-08-04 10:59:27 2015-08-04 10:59:27
    TRIGGER             TEST01_TRG                     2015-08-04 10:57:21 2015-08-04 10:57:21
    ```
MVC Viewでエリア名を取得する

部分Viewをいくつかのエリアをまたがって使用している場合、
特定のエリアでは表示したくない項目があったりする。

Razor構文なら、こう記述しておけば部分Viewでもエリアごとに異なる処理を記述できる。
@if(ViewContext.RouteData.DataTokens["area"] == "エリア名")
{
処理
}


1.viewContext
ビューの表示に関連する情報をカプセル化している。
コントローラー名を取得したり、エリア名を取得出来るので便利！

2.RouteData
URL ルート データを取得または設定する。
・コントローラー名、アクションメソッド名の取得→RouteData.Value
・エリア名→RouteData.DataTokens
Eclipseが起動しなくなった時の対処法

#### 対処法①eclipseのクリーンアップ
- Macの場合
コマンドで一発!  
`$ /Applications/eclipse/eclipse -clean`
- Windowの場合  
コマンドプロンプトを開いて  
`eclipse.exe -clean`  
ぶっちゃけこれで開く可能性が高い(らしい)です。僕は開きませんでしたが。  

#### 対処法②snapファイルの削除
一時ファイルと呼ばれる「snap」ファイルが壊れているせいでeclipseが開けなくなるといったことがあるようです。
この場合「snap」ファイルを削除すればよいとのことでしたので
削除しました。  
`rm 自分が使用しているワークスペース/.metadata/.plugins/org.eclipse.core.resources/.snap`  
僕はsnapファイルを削除することで、開くことができました！

#### 結果
とりあえず僕は対処法①②をすることでeclipseを開くことができました。
ググると他にもたくさんの方法があるようなので、あくまで一例として参考になればと思います。
Raspberry Pi ツール part 1 (遠隔操作)

Telegramでの遠隔操作
======

どんな環境
----
- 今回の環境構築は Raspberry pi B 以上をおすすめ
- 使用しているOSはRaspbian　3.18 
- 使用レポジトリー　https://github.com/vysheng/tg

背景
---
![380011_10151105753244475_58885166_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/58439/6887c95d-09b2-fef5-444f-7a1bd0822409.jpeg)
家に犬がいるとします。
自分がいない時に何をしているか気になりますよね？
そんな時は Raspberry pi で確認しましょう！

インストール
---

### Telegram

librariesをインストール

```
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev make
```

vyshengさんのTelegramのコンソール用クライアントを使用

```
git clone --recursive https://github.com/vysheng/tg.git && cd tg 
```
configureファイルを使用

```
./configure && make
```

使い方
---

***
Telegramを携帯にインストール
https://telegram.org/
サインアップする際に電話番号とエリアコードを登録
+81 ＊＊＊　＊＊＊＊　＊＊＊＊
SMSにメッセージが届くので登録を確認

***

Telegramクライアントを起動

``` 
bin/telegram-cli -k tg-server.pub -W
```

コンソールでアカウント作成時に登録した番号を入力（エリアコードを含む）
+81＊＊＊＊＊＊＊＊＊＊＊

### メッセージ送信でのテスト

メッセージ送信はコンソールに...

```
msg 名前_名字 hogehoge
```

luaを使用してのTelegrambot
---

Telegramのアクションスクリプトを作成

```
sudo nano /home/pi/tg/action.lua
```

単純な Ping - Pong テスト用のサンプルコード

```
function on_msg_receive (msg)
    if msg.out then
        return
    end
    if (msg.text=='ping') then
       send_msg (msg.from.print_name, 'pong', ok_cb, false)
    end
end
 
function on_our_id (id)
end
 
function on_secret_chat_created (peer)
end
 
function on_user_update (user)
end
 
function on_chat_update (user)
end
 
function on_get_difference_end ()
end
 
function on_binlog_replay_end ()
end
```

先ほど作った action.luaを使用して再度telegramを起動

```
bin/telegram-cli -k tg-server.pub -W -s action.lua
```

###最後にカメラをtelegramにつなげましょう

写真の保存のためにdirectoryを作成

```
sudo mkdir /home/pi/camera
```

カメラ起動のためのアーカイブ・shellファイルを用意

```
sudo nano /home/pi/camera/camera.sh
```

ファイルの内容は以下のようにしてください

```
#!/bin/bash  
 
raspistill -w 800 -h 600 -o /home/pi/camera/photo.jpg 
```

ファイルにパーミッションをわたします

```
sudo chmod -R 0655 /home/pi/camera/camera.sh
```

もう一度作成したaction.luaを開き以下のコードでcamera.shを実行

```
if (msg.text=='photo') then
   os.execute('/home/pi/camera/camera.sh')
   send_photo (msg.from.print_name, '/home/pi/camera/photo.jpg', ok_cb, false)
end
```

###結果、telegramに 'photo'と書く事でカメラが起動！

細かい内容
---
http://www.emmeshop.eu/blog/node/44
可変長オブジェクト in C

C言語gnu拡張の説明を読んでいたら出てきたので。

#可変長オブジェクトとは
こんなやつである。(gccドキュメント [6.17 Arrays of Length Zero](https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html)より引用)

```c
     struct line {
       int length;
       char contents[0];
     };
```
`char`配列の要素数が0である。これはC言語gnu拡張のひとつ。
ISO C では配列の要素数は1以上でなければならない。

さて、これをどうやって使うのか。
とりあえずドキュメントから引用する。

```c
     struct line *thisline = (struct line *)
       malloc (sizeof (struct line) + this_length);
     thisline->length = this_length;
```

1,2行目で構造体`line`を確保している。
面白いのは、`this_length`で領域を余分にもらっていることだ。
この、余分にもらった分は`char contents[0]`の領域として使える。
つまり、実質的には`char contents[this_length]`として働くわけだ。

0要素の配列で宣言していないと、意図しない余計な領域を食う羽目になる。
何とかしようとすると`malloc`の引数が複雑になる。
それを避けるための拡張、というわけらしい。

3行目では、`length`に要素数を代入している。
単純に配列の長さを取っておくだけだ。

#感想
構造体の中身からは「いかにも可変長」っぽさが伝わってこないのでこわい。
C++の`std::vector`とかで書いて邪悪さを減らせないものか。
Ansibleを使ってRaspberryPiをセットアップ

# はじめに
　Raspberry Pi(RasPi)のセットアップ、毎回同じことをやるには手間がかかるので、Ansibleを使って初期セットアップをする。

# 動作環境および準備
## ホスト側
- CentOS 6.6
- Ansible 1.9.2
- sshpass 1.05

## リモート側:RasPi
- Raspberry Pi (typeB)

## 事前準備
1. RasPiが起動できるよう、SDカードにRASPBIAN(Debian Wheezy,Release date:2015-05-05)をインストール
2. RasPiを起動。IPアドレスをメモする
3. ホスト側にAnsibleをインストール。Ansibleがsshでリモート接続するとき、sshが必要になるので、sshpassもインストール

## できること/できないこと
### できること

- タイムゾーン設定
- キーボード設定
- MySQLインストール
- PHP5インストール
- Apache2インストール
- Wordpress

### できないこと

- Expand Filesystem …… raspi-config内に書いてある内容を移植すればできるかも
- pi/root password …… 初期パスワードのまま

# Playbookいろいろ
　Ansibleを使ってRasPiをセットアップするPlaybookを用意する。
躓いた部分のPlaybookを掲載していきます。全体像はGitHubを参照してください。

## インベントリファイル設定
INVENTORY:棚卸し表

　初期セットアップをするRasPiをリストアップ。事前に調べておいたIPアドレスをインベントリファイルに羅列する。ここに羅列されたIPアドレスへ順次 Playbookの内容が実行されていく。

　RASPBIANのパスワードも固定＆公開されているのでインベントリファイルに記載してしまう。

```inventory
[raspi]
192.168.1.2

[raspi:vars]
ansible_ssh_port=22
ansible_ssh_user=pi
ansible_ssh_pass=raspberry
#ansible_sudo_pass=
backup=yes
````

【参考】

* [ansibleでSSHのユーザ、パスワードを指定する方法](http://qiita.com/suin/items/ab40779347c910a74d05)

## Playbook
YAML形式で作業を内容を記述していく。

### raspi.yml

　RasPiのSDカードを書き換えのたびにサーバ側のホスト鍵指紋が変わってしまうため、同一IPアドレスを指定してSSHを接続した時 キャッシュ保持されているホスト鍵指紋と一致しない。そのためAnsibleがリモート(RasPi)側にssh接続するときにエラーが出てしまうため、``ssh-keygen -R {{ inventory_hostname }}``でホスト鍵指紋のキャッシュを削除している。

　``inventory_hostname``はマジック変数。対象となるインベントリが代入される。

　あとは、roles/setup内のPlaybookが実行されていく。

```raspi.yml
---
- name: remove Raspberry Pi ssh-publickey
  hosts: 127.0.0.1
  tasks:
   - name: remove ssh publickey
     shell: ssh-keygen -R {{ inventory_hostname }}

- name: Setup Raspberry Pi
  hosts: raspi
  sudo: yes

  roles:
   - setup
```

### timezone.yml
　タイムゾーンを設定。``Asia/Tokyo``を``/etc/timezone``に書き込むだけなので、copyで直接文字打ちしてしまう。

```timezone.yml
---
- name : Create Timezone file.
  copy : content='Asia/Tokyo'
         dest=/etc/timezone
         owner=root
         group=root
         mode=0644
         backup={{ backup }}

- name: update timezone
  shell: dpkg-reconfigure --frontend noninteractive tzdata
```

### keyboard.yml
 キーボード設定。
 複数行あるので、あらかじめ用意したファイルをcopy。


```keyboard.yml
---
- name: Create keyboard keymap file.
  copy: src=keyboard
        dest=/etc/default/keyboard
        owner=root
        group=root
        mode=0644
        backup={{ backup }}

- name: update keymap
  shell: /etc/init.d/keyboard-setup reload
```

```
# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS=""

BACKSPACE="guess"
```


# GitHub
https://github.com/yyano/ansible-raspi-jp
Aurelia docs update: 8/4


Aurelia日本語ドキュメントの更新について記載します。8/4 現在、pull request中でまだ更新されていない内容も含まれるため、本エントリの内容については[fork先](https://github.com/bohnen/documentation/tree/update-japanese-docs)を確認してください。

Aurelia自身の機能は安定していると言われた5月の宣言通り、ドキュメントの更新はほぼ記載ミスの修正や、サンプルの細かい更新で、追加機能は2つでした。（単にドキュメントに載っていない機能や使い方も多く存在し、コミュニティからの貢献が歓迎されています）

## 進行中の翻訳

ポルトガル語の翻訳が追加されました。現在6ヶ国語に翻訳されています。更に、近々ドキュメント構成の大幅な変更もあるという話で、戦々恐々です。

## テンプレートパート: 1402行目

カスタムエレメントは固有のビューを持ちますが、ビューモデルやそれが含むロジックは同じなんだけど、ビューが若干異なりそのままでは使えない、というケースはよくあります。同じリストなんだけど、画面によって表示項目が異なったりするケースですね。

このような状況に対応するため、カスタムエレメントのテンプレートの一部を利用時に置換可能とすることができます。

カスタムエレメント側のビュー定義で、置き換えたい箇所をtemplateタグと、`part` 属性で指定します。

```markup
<template>
  <ul>
    <li class="foo" repeat.for="item of items">
      <template replaceable part="item-template">
        Original: ${item}
      </template>
    </li>
  <ul>
</template>
```

利用時は、カスタムエレメントのコンテンツに、置き換える内容をtemplateタグと、`replace-part` タグで指定します。

```markup
<template>
  <require from="./demo"></require>

  <demo>
    <template replace-part="item-template">
      Replacement: ${item} ${$parent.$parent.fullName} <button click.delegate="$parent.$parent.welcome()">Test</button>
    </template>
  </demo>
</template>
```
`demo` が上で定義したカスタムタグです。

## インターセプター: 1660行目

HTTPClientでは、リクエストとレスポンスにそれぞれフックを指定することが可能です。これをインターセプターと呼んでいます。共通処理を行ったり、ログ出力したりといった目的ですかね？

インターセプターは複数指定可能で、指定された順番にチェインして実行されます。

コード例は http://aurelia.io/docs.html#interceptors を見て下さい。
iOS SWTableViewCellをSwiftで使用

iOS開発初心者による初投稿です。
Twitter fabricを利用してTimelineを表示させた上に、オープンソースのSWTableViewCellを追加してセルを左右からスワイプできるようにしたいと思っております。SWTableViewCellのコードをSwiftに変換してTimelineのSwiftファイルに組み込もうとしているのですが、下記のようにエラー表示が出て困っております。
- 1.Type of expression is ambiguous without more context
- 2.Cannot invoke 'configureWithTweet' with an argument list of type 'TWTRTweet'

![スクリーンショット 2015-08-03 19.25.24.png](https://qiita-image-store.s3.amazonaws.com/0/88491/32a60266-2713-01ce-9fed-6328faa3be21.png)


なお、classの最初で各変数を定義しております。
![スクリーンショット 2015-08-03 19.30.46.png](https://qiita-image-store.s3.amazonaws.com/0/88491/cd3873f0-cba9-3b18-edd8-76f907c02abb.png)

2点目はSWTableViewCellを導入する前は問題なかったのですが、動かなくなってしまいました。。
Objective-CとSwiftの変換等、各サイトを参考にしていろいろと格闘しましたが、ここで完全に行き詰まってしまいました。大変お忙しいところ恐縮ですが、エキスパートの方にご回答頂けますと大変幸いです。どうぞよろしくお願い致します。

(ご参考)
SWTableViewCell https://github.com/CEWendel/SWTableViewCell
powが使えなくて詰まる

https://github.com/basecamp/pow

```
$ curl get.pow.cx | sh
$ cd ~/.pow
$ ln -s /path/to/myapp
```

リンクを張ったら`http://myapp.dev`で動くはずが動かない。

google先生に聞く。

powderを使ってみる。
https://github.com/Rodreegez/powder

```
$ gem install powder
```

`powder config`コマンドがとても参考になりました。

```
dstPort      80
httpPort     20559
dnsPort      20560
timeout      900
workers      2
domains      dev
extDomains   
```

httpPortのポート番号をしていする。
`http://myapp.dev:20559`
これでようやく動いてくれました。

http://techracho.bpsinc.jp/annotunzdy/2011_10_19/4596
ここによるとポートを振り替えてくれるデーモンがうまく動いていないようです。
踏み台サーバーを超えてfabricを実行する

以下の様な状態の場合にtargetサーバーに対してfabricを実行できる様にした時のメモ。

local(fabric実行)--->fumidai(公開鍵認証)--->target(パスワード認証) 

# 参考

+ [今日からすぐに使えるデプロイ・システム管理ツール Fabric 入門](http://shiumachi.hatenablog.com/entry/20130414/1365920515)
+ [複数プロジェクトを抱えるチームでのデプロイ自動化](http://deeeet.com/writing/2014/10/30/fabric/)
+ [Fabricで接続情報を指定する方法いろいろ＆FabricからPHPスクリプトを実行してみたメモ](http://k-holy.hatenablog.com/entry/2013/04/09/202545)

# 環境

+ fabric利用->Ubuntu 14.04.1 LTS
+ fabricの操作対象->EC2(Amazon Linux AMI 2015.03)

# fabricのインストール

```
$easy_install fabric
$ fab --version
Fabric 1.10.2
Paramiko 1.10.1
```
# 踏み台サーバーを超えてfabricを実行する 

まずtargetサーバーに一発でsshログイン出来るように`~/.ssh/config`の設定をする。

```lang:~/.ssh/config
Host fumidai
  HostName 11.22.33.44
  User fumidai-user
  IdentityFile ~/Keys/id_rsa

Host target
  HostName 111.222.333.444
  User target-user
  Port 22
  ProxyCommand ssh -W %h:%p fumidai
```

これで`$ssh target`とコマンドを実行することでtargetサーバーにsshログイン出来るはず（パスワードは聞かれる)

もし、公開鍵認証でもパスフレーズ入力が必要な場合、`ssh-agent`を使えば都度入力の手間を省けます。

[ssh-agent でパスフレーズの入力を省く](http://webos-goodies.jp/archives/50672669.html)

これでfabric的には踏み台の事は気にせず、targetに対して実行すれば良いので次にfabricでtargetサーバーの設定を行います。

```lang:fabfile.py
from fabric.api import *

env.use_ssh_config = True
env.user = 'target-user'
env.password = 'target-user-password'

def test():
  sudo('hostname')
```

これでfabric実行時にsudo実行時にパスワードが必要な場合でも都度入力がいらず、実行が可能です。

```
$fab -H target test
```

簡単でっす。
Arduino UnoのSoftwareSerialが不安定


# 未解決

[ESP8266モジュールでArduinoからWi-Fiを使う](http://ehbtj.com/electronics/esp8266)を参考に、ESP8266繋いで115200でD2,D3で通信しているのだけれど、ESP8266からのデータがかなりの確率で文字化けしてしまって非常に不安定なんですよね。時々うまくいく程度。

Arduino UnoのTxD/RxDを使ってシリアルモニタからの手動通信はわりと安定。
そして、IDEからのArduinoへのFW書き込みは全く問題なし。

となると、SoftwareSerialがうまくタイミング取れてないのかなぁ、が今のところの印象。信号線にあたっていないので想像でしかないですが、300円で購入したArduino Uno自体も疑う部分かもしれないですね。
イマココ。

おわり。
pryで日本語入力ができなくて詰まる

google先生に聞く。
http://attonblog.blogspot.jp/2015/04/pry-rails-multibyte-char.html
上記を参考に設定ファイルをいじる。
`~/.pryrc`にある、なければ新しく作ったファイルに書き込みます。

```
Pry.history.instance_eval do
   @saver = ->(line) { save_to_file (line.force_encoding(STDIN.external_encoding))}
end
```

・・・、でもできない。
再度google先生に聞く。

railsではなくrubyの問題だという事で、
http://qiita.com/kidach1/items/d0137d96bed9ac381fd5
上記をためす。

```
# 適用したいrubyバージョンが既にインストール済みの場合は一度uninstall
$ rbenv uninstall 2.1.1

# readlineのinstall
$ brew install readline
$ brew link readline --force

# readlineを利用してruby再install
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
$ rbenv install 2.1.1
```

rubyを再インストールすると、
 `The rails command exists in these Ruby versions`
と怒られたので、
http://qiita.com/akiks/items/94ffef41ae29066f6883
上記を参考に、

```
gem install bundler  
bundle install
```

よくみたら以前もお世話になってました。
これで僕は無事日本語入力できるようになりました。
herokuのforkを利用してステージング環境を作成し、CircleCIで自動デプロイする


# 概要
Rails4アプリの本番環境をherokuにデプロイしている。
今まではステージング環境を完全に別アプリとして構築していたが、
forkを使うといい感じにできるらしいので、改めて設定し直してみた。
また、既存のcircle.ymlもそれに合わせて設定し直す。

# fork
今回はすでに本番環境があるので、そこからforkしてステージングを作る。
（下記のログを見ると、アドオンや環境変数もコピーされているのが分かる）

```
$ heroku fork --from (APP) --to (APP_FOR_STAGING)
Forking (APP)... done. Forked to (APP_FOR_STAGING)
Setting buildpacks... done
Deploying f4e5b0d to (APP_FOR_STAGING)... done
Adding addon papertrail:choklad to (APP_FOR_STAGING)... done
Adding addon newrelic:wayne to (APP_FOR_STAGING)... done
Adding addon heroku-postgresql:hobby-dev to (APP_FOR_STAGING)... done
Transferring DATABASE to DATABASE...
Progress: done                      
Copying config vars:
  LANG
  RAILS_ENV
  RACK_ENV
  SECRET_KEY_BASE
  RAILS_SERVE_STATIC_FILES
  MAILER_USER
  MAILER_PASSWORD
  NEW_RELIC_APP_NAME
  ... done
Fork complete. View it at https://(APP_FOR_STAGING).herokuapp.com/
```

以上！簡単すぎる！
今度からforkを活用しよう。

※ ちなみにfork元がなく新規に作成する場合は、createコマンドを利用する。

```
$ heroku create --remote (APP)
```

# CircleCI設定
上記設定を元にcircle.ymlを書き直す。
以下、デプロイ部分を抜粋。

```
deployment:
  production:
    branch: master
    heroku:
      appname: (APP)
  staging:
    branch: staging #ステージングデプロイに紐付けたいgitのブランチ名
    heroku:
      appname: (APP_FOR_STAGING)
```

以上で自動デプロイも完了！

# 備考
本番環境は有料プラン（Hobby dynos）を利用しているので、forkしたステージングも同じく有料になってしまうか心配だったが、
herokuダッシュボードを確認したところ無料プランで設定されていた。
これで一安心 ε-(´∀｀*)ﾎｯ

# 参考資料
[Managing Multiple Environments for an App | Heroku Dev Center](https://devcenter.heroku.com/articles/multiple-environments#managing-staging-and-production-configurations)
[Forking Applications | Heroku Dev Center](https://devcenter.heroku.com/articles/fork-app)
[Continuous Deployment with Heroku - CircleCI](https://circleci.com/docs/continuous-deployment-with-heroku)
c++ > インラインコードにする第一の方法 > .hに実装を入れる

引用: C++のためのAPIデザイン by マーティン・レディ
第7章 パフォーマンス

> インラインにする第一の手法は、以下のように、クラスの本文にメソッドの実装をインクルードするシンプルなやり方だ。

```
class Vector
{
public:
   double GetX() const { return mX; }
   double GetY() const { return mY; }
   ...
private:
   double mX, mY, mZ;
};
```

> これは、ヘッダファイルに実装の詳細を含める問題をそのまま実演している。このAPIのユーザは、ヘッダを見るだけでインラインメソッドの実装方法を知ることができる。

> ...
> インライン化にするもう一つの手法は、C++のinlineキーワードを使うことだ。
c++ > スライス問題 > 派生クラスを渡したときにこの派生クラスに他のフィールドがあると、それが切り取られる > const参照で引数を渡す

引用: C++のためのAPIデザイン by マーティン・レディ
7.1

```
void SetObjectByValue(MyObject obj);
```

> あるメソッドが基本クラスの引数を（値で）受け取った場合、あなたが派生クラスを渡したときにこの派生クラスに他のフィールドがあると、それが切り取られるという問題だ。これは、値で渡されるオブジェクトのサイズは、コンパイル時に、基本クラスのサイズであると判断されるからだ。値ではなく、const参照で引数を渡せば、このスライス問題を回避できる。
継承 > C++では、複数のクラスから継承（多重継承）できますが、JavaやC#では１つのクラスからの継承（単一継承）しかできません。しかし、抽象インタフェースの実装に関しては制限がなく、複数の抽象インタフェースを１つのクラスに実装できます。

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

>継承 > C++では、複数のクラスから継承（多重継承）できますが、JavaやC#では１つのクラスからの継承（単一継承）しかできません。しかし、抽象インタフェースの実装に関しては制限がなく、複数の抽象インタフェースを１つのクラスに実装できます。
c++ > 抽象インタフェース > クラスの詳細を完全に隠蔽し、カプセル化できる

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん

```txt:描画抽象インタフェースの例
class Drawable {
public:
  virtual ~Drawable() {} // 仮想デストラクタ
  virtual void draw(Renderer& renderer) = 0; // 純粋仮想関数のみ
};
```


> 抽象インタフェースの利用者から、実装しているクラスの詳細を完全に隠蔽し、カプセル化できます。
技術英語 > one step at a time

@ Star Trek Voyager > Eye of the needle

> one step at a time

「一度に一歩ずつ」という意味。

<hr>

one step at a timeで思い出したもの: 1

引用: ソフトウェアの世界でキャリアを築く by Sam Lightstone

Linus Torvalds
> たった一回のジャンプで、高層ビルの上まで跳ね上がることはできません。一つひとつ階段のステップを歩んで行くものです。何か面白いところに辿り着くまでに１００階以上登りつづけたとしても、決してそれは苦になることはないでしょう。遥かかなたの目標だけに目を向けていたら、足下の階段ですら気づかず一歩すら踏み出すことができないのです。

<hr>
one step at a timeで思い出したもの: 2

引用: アップルを創った怪物 (Computer Geek to Cult Icon) by スティーブ・ウォズニアック

> 結果をあまり気にせず、今していることに集中し、それをできるだけ完璧に仕上げることが大事だということを学んだんだ。...途中のやるべきことをすっとばして最終段階だけをなんとかしようとする人をたくさん見た。そんなの、うまくいくはずがないんだ。絶対に無理なんだ。

<hr>
実行時にTabボタンを消せるコントロールHiddenableTabControl作った

久しぶりにC#でWindowsのFormアプリを作ったりしています。

設定のウィザード画面を作っていて「確か昔、ウィザード画面ってタブコントロールを作ってたなあ」と
思い出しました。

で、TabControlを持ってきたら、ボタンを隠せない、うーむ。調べたらメッセージ送ればできるらしい。
なるほど。とりま、それを採用したコントロールを作成してみました。

https://github.com/PharaohKJ/HiddenableTabControl

これをcloneして実行すればなんとなくわかると思いますが、プロジェクトをコピって参照するなり、
ファイルをコピーするなりしてうまいこと使ってください。

デザイン時には常時表示、実行時にはon/offする機能付き。(HiddenTabプロパティを触ってください)
「進捗・どう・です・か」をPerlで

> [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム](http://elephnote.com/blog/archives/936)


元ネタと全然処理が違うけど書いてみた。
[Perl6版](http://qiita.com/B73W56H84/items/ed46c7844b4446ea456a)もどうぞ。

```pl:進捗.pl
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
binmode STDOUT, ":encoding(UTF-8)";

my @words = qw( 進捗 どう です か );
my $regex = qr/${ \join('', @words) }$/;

&main;exit;

sub main {

    my $word_buffer = '';
    while() {
        $word_buffer .= $words[ int( rand(@words) ) ];

        if( $word_buffer =~ /$regex/o ){
            print $word_buffer, "???\n", length( $word_buffer ), "文字で煽られました。\n";
            exit;
        }
    }
}
```

```bash:出力
どう進捗かです進捗です進捗かです進捗どうか進捗かですですかかどうどうどうです進捗ですですかか進捗進捗ですかかどうか進捗進捗ですですどうですかどう進捗進捗どうですか???
81文字で煽られました。
```

そして、進捗は芳しくない。

# あわせて読みたい

| 言語 | リンク |
|:-----------|:------------|
| Perl | [進捗どうですかブーム???に Perl でのりかかる](http://qiita.com/b_wind/items/06c56c898a988c2463fe) |
| Ruby | [進捗どうですかブーム?にrubyでのっかってみる](http://qiita.com/kataware/items/edc8d0f02a16a21c47dc) |
| Python | [進捗どうですかブーム??にPythonでのりかかってみる](http://qiita.com/hisatoshi/items/0ccca55168d58a940661) |
| ShellScript | [進捗どうですかブーム???にShellScriptで挑むフリしてExpectに逃げる](http://qiita.com/mpyw/items/e5a93e7195d8a8284a1f) |
| Haskell | [「進捗・どう・です・か」をHaskellで書いてみた](http://qiita.com/lotz/items/b47913cb27052cf9e127) |
| Gauche | [進捗どうですかブームに乗り遅れてみる](http://qiita.com/X___MOON___X/items/aec02c9a4baabff24890) |
| Clojure | [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるClojure](http://qiita.com/esehara@github/items/c57cafa57aa92dc1e3c2) |
| Crystal | [進捗どうですか Crystal](http://qiita.com/abey1192/items/482ae7805c324e3f00b6) |
| PHP | [「進捗・どう・です・か」をPHPで書いてみた](http://qiita.com/kiimiiis/items/2f98e19d00616d95d0ce) |
| Scala | [Scalaの進捗どうですか](http://qiita.com/Peranikov/items/fde7715c839f413695ff) |
| D言語 | [d言語で「進捗どうですか」](http://qiita.com/reika/items/4fd035f7bb26f8637632) |
| golang | [golang の進捗どうですか](http://qiita.com/mattn/items/4b4ce89396d660a155a9) |
| PowerShell | [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（PowerShell）](http://qiita.com/shoooo/items/5494192779ebb6a8fd1b) |
| SQL | [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるSQL](http://qiita.com/damassima/items/a2262cb19d66cb284508) |
| C# | [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム（C#で挑戦）](http://qiita.com/moto_pipedo/items/e7f924585c762b0da4a7) |
| Elixir | [Elixirで進捗どうですか？](http://qiita.com/A-gen/items/6a8974d4dc7e3f4695f7) |
| bat | [「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるバッチ](http://qiita.com/sawa_tsuka/items/d8d43d4b1f8e7865ad5c) |
| Vim script |[「進捗・どう・です・か」をVim scriptで](http://qiita.com/mattn/items/500e124ba26fa66b2624) |
| golang + C言語 | [今年(2015年)に流行った「進捗・どう・です・か」をcgo + stringerで作ってみる。](http://qiita.com/178inaba/items/efd708437e51215da1cb) |
| Perl6 | [【Perl6】あの素晴らしい「進捗どうですか？？？」をもう一度](http://qiita.com/B73W56H84/items/ed46c7844b4446ea456a) |
| Kotlin | [Kotlinに煽られる](http://qiita.com/mtbt03/items/1b957ccccdb310658dad#_reference-ff1de4cea1843aaa78db) |
| bash,Ruby | [「進捗・どう・です・か」をbashで](http://qiita.com/arc279/items/002b377d284c7696f325) |
| bash | [「進捗・どう・です・か」 -- コマンドパイプ版](http://qiita.com/nakataSyunsuke/items/417a5ddb67d6e271791c) |
Androidで端末をスリープにするとネットワークに接続できなくなった問題

一定時間ごとにAPIを叩くアプリの開発中、端末によってスリープ状態になるとAPIを叩けなくなる問題が発生したのでまとめ。
### 原因
最初はバックグラウンドでの処理がおかしいのかと思いましたが、ただ単に端末のWi−Fi設定で「スリープ時にWi-Fi接続を維持」の設定が「使用しない」になっており、更にWi-Fiモデルの端末だったのでネットワークに接続できなかっただけでした。
この設定が「使用しない」になっていると端末がスリープになった場合にWi-Fiの接続が切れてしまうようです。
![wifi_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/88056/f41cc81b-47d3-fdc8-1411-a6081fd8dac2.jpeg)
### 対応
ひとまずは端末の設定を「常に使用する」に変更することで対応しました。
端末やOSによって多少異なると思いますがNexus7(2013) Lolipopでは、

```
設定 -> Wi-Fi -> メニューの詳細設定 -> スリープ時にWi-Fi接続を維持 -> 常に使用
```
から変更できました。
（一体なんのためにスリープ時にWi-FiをOFFにする設定が存在するのかと思いましたが電池消費対策でしょうか・・・）

ちなみにこの設定の情報は

```java

try {
    ContentResolver contentResolver = getContentResolver();
    // Settings.System.WIFI_SLEEP_POLICY は API level 17 から deprecated なので
    // Settings.Global.WIFI_SLEEP_POLICY を使用する
    int policy = Settings.System.getInt(contentResolver, Settings.Global.WIFI_SLEEP_POLICY);
    switch (policy) {
        case Settings.Global.WIFI_SLEEP_POLICY_DEFAULT:
            // 使用しない
            break;
        case Settings.Global.WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED:
            // 電源接続時にのみ使用する
            break;
        case Settings.Global.WIFI_SLEEP_POLICY_NEVER:
            // 常に使用
            break;
    }
} catch (Settings.SettingNotFoundException e) {
    e.printStackTrace();
}
```

で取得できます。
設定画面への遷移は

```java

startActivity(new Intent(Settings.ACTION_WIFI_IP_SETTINGS));
```
で出来ました（※Wi-Fiの詳細設定画面までしか遷移できません）
### まとめ
スリープ状態で大量の通信をしたり、Wi-Fiモデルでスリープ状態になっても通信ができるように`WIFI_SLEEP_POLICY_NEVER`以外の場合はユーザに通知するというのもよいと思います。
### 参考
[Settings.System : Android Developers](http://developer.android.com/reference/android/provider/Settings.System.html)
[スリープ時にWi-Fi（無線LAN）が切断されないようにするAndroidの設定](http://kosukety.org/2011/08/01/setting-wi-fi-not-disconnect-when-sleep-for-android/)
MacBookをEl Capitanにして新しくセットアップする 2 〜環境設定・OSインストール編〜


### 親記事 
[MacBookをEl Capitanにして新しくセットアップする](http://qiita.com/marmot1123/items/1b15d0855472c5f9eacf)

## 購入直後

とりあえず電源を入れたら指示に従ってWi-Fiなどの設定。
Apple IDやメールの関係でGoogleのアカウントを色々聞かれたので入力。
HDDでのデータの移行は全くやらないのだが、
Apple IDに紐付いてGmailとTwitterは自動的に設定された模様。

## システム環境設定

最低限のシステム環境設定をしていきます。

### 一般

サイドバーのアイコンサイズを小に設定。

### デスクトップ

お好みでお好みに。

### Dock

個人の好みでサイズ小さめ、拡大有り、画面左に配置。
ウインドウをアプリケーションアイコンにしまい、Dockを自動的に隠します。

### キーボード

#### キーボード

リピート、リピート入力認識までの時間を速く、短く。
ファンクションキーはファンクションキーにする。

その他のタブは保留で。

### トラックパッド

トラックパッドではタップもしたいのでとりあえずタップでクリックをチェック。
軌跡の速さもいじります。

## OS X El Capitan Public Beta

AppleからもらったメールからEl Capitan の Public Betaをダウンロード・インストール。
~~すでにbeta 2が出てるのでそちらにアップデート。~~
5日にbeta 3が出ました。アップデートしました。
CentOS7にnginx+PHP環境を導入するメモ

Azure仮想マシンに作ったCentOS7にnginx+PHPの環境を作る。

## nginxのインストール
/etc/yum.repos.d/nginx.repoを新規作成、以下のように記述。

```bash
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```

ファイルを保存後、

```bash
# yum install nginx
```

インストールできたら、

```bash
# systemctl start nginx
```

ブラウザからサーバにアクセス、テストページが表示されるか確認。
ファイアウォールなどの設定は割愛してますが、お忘れなく。

## phpのインストール
nginxでPHPを使うため、PHP-FPMを利用する。

```bash
# yum install php-fpm
```

/etc/php-fpm.d/www.conf を編集。

```bash
…
user = nginx
…
group = nginx
…
```

### nginxの設定変更
nginxにphpファイル関連の設定を記述。
ついでにドキュメントルートとかを変更してもいい。

```bash
location ~ \.php$ {
#    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /home/***/www/html$fastcgi_script_name;
    include        fastcgi_params;
}
```

fastcgi_paramのパスは適宜変更。

以上の設定が終わったら、

```bash
# systemctl start php-fpm
# systemctl restart nginx
```

で動作確認。ドキュメントルートにphpinfoでも置いておく。
[Unity] Rigidbodyの軌道を自前で計算する


Rigidbodyでの物理計算、便利ですよね。
ただ、自分で計算して位置を出しているわけではないのでそれが実際にどう動くのか、数秒後の世界を見ようとしてもすぐには確認できません。

そこで、今回はこちらの記事（[Unity: n秒後のRigidbodyの移動先の位置を取得するスクリプト書いた](http://takashicompany.hatenablog.com/entry/2015/03/06/200454)）を参考にさせてもらい、どういう計算がなされているのかを解説しつつメモしておきたいと思います。

![動作サンプル](http://i.gyazo.com/1dc882fd99bedad543795dc52ae71b5c.gif)
*実際の動作の動画キャプチャ*

[2015.08.04] この[動作サンプルをGithubにアップ](https://github.com/edom18/RigidbodyOrbit)しました。


### サンプルコード

上記の記事を元にメソッドを以下のように実装しました。

[2015.08.04 追記]
コメントで指摘をもらいました。（startPosition使ってなかった・・）


```c#
Vector3 CalcPositionFromForce(float time, float mass, Vector3 startPosition, Vector3 force, Vector3 gravity) {
	Vector3 speed = (force / mass) * Time.fixedDeltaTime;
	Vector3 position = (speed * time) + (gravity * 0.5f * Mathf.Pow(time, 2));
	
	return startPosition + position;
}
```

上記メソッドは、引数で与えられた「時間、質量、初期位置、力、重力」を元に、最初の引数である時間後の位置を計算するものです。

さて、ではなにをどう計算しているのか。それをざっくりと解説したいと思います。

#### 加速度から位置を計算

重力は加速度です。一般的に $9.8 m/s^2$ という値が使われます。
そして加速度から一定時間後の位置を計算するには以下の式を使います。

```math
pos = \frac{1}{2}\alpha t^2
```

位置は、加速度を1/2にしたものに時間の2乗を掛けたものとして計算することができます。
仮に重力加速度だけが影響し、2秒後の位置を求める場合は以下のようになります。

```math
pos = \frac{1}{2}(9.8)(2^2) = 19.6m
```

※ 基本的に物理エンジンの単位は「Kg, m, S（キログラム、メートル、秒）」が使われます。


#### 力から加速度を計算

簡単な物理的計算を行う場合、ニュートン力学が比較的手頃でしょう。
ニュートンの運動方程式として以下が有名です。

```math
F = ma
```

ここで$F$は力（単位はニュートン）、$m$は質量（mass）、$a$は加速度です。
加速度を求めたいので式を変形して、

```math
a = \frac{F}{m}
```

とします。
つまり、力を質量で割ったものが加速度、ということです。

以上を元にプログラムを見直すとなにをしているかが分かるかと思います。
特に、

```c#
Vector3 speed = (force / mass) * Time.fixedDeltaTime;
```

変数名を見てもらうと、公式をそのまま使っているのが分かります。
ちなみに`Time.fixedDeltaTime`を掛けているのは「瞬間的に」力が加わったとみなすためです。

プログラムは連続的な計算ではなく「離散的な」計算を行います。
つまり、線ではなくあくまで計算可能な範囲で分割した「点」をつないで計算を行うのです。

`Time.fixedDeltaTime`はまさにこの計算可能な範囲でのひとつの時間の単位となります。
結果として「瞬間的に」力を加えたことをシミュレートしているわけですね。

つまり、ごく短い時間だけ求めた力を物体に与え続けた、としているわけです。
加速度ｘ時間なので、求めているのは「速度」となります。

そして

```c#
speed * time
```

の部分で「速度ｘ時間」を計算し、結果として位置を求めている、というわけです。
あとは上記で計算した重力の部分も足しあわせてあげることで、引数で渡された時間後にどこに物体があるかを導き出しているというわけですね。


ちなみに物理エンジンと言えば、過去に（2Dですが）本やネットの情報を参考に物理エンジンを自作してみたときの記事があるので興味がある人は見てみてください。（ただし学習のために作っただけなので処理が最適化されておらず、だいぶ重いです・・）

[自作2D物理エンジンを作った話](http://qiita.com/edo_m18/items/f7698c5bd262df4f9cf3)