OmniAICreator/Qiita-1.07M huggingface dataset:
デイリースクラムの開催(朝会)時間

# デイリースクラムの開催時間
## 本当に朝会がいいの？
全て、チームと目的に依存します。
デイリースクラムの目的を考えてください。デイリースクラムの目的は、スクラムにおける透明性を保ち、プランニングにおけるスプリントバックログの状態について、検査・適応することです。
スプリント中に見つかった課題により、プランニング時の計画どおり進まなかった場合、どう適応していくか筋道を立てます。ただし、デイリースクラム自体は１５分以内のタイムボックスですので、筋道立てが難しければ、別の会を必要なチームメンバーで実施します。
「チーム全員」というところがポイントです。全員が適切に無理なく集まれる時間帯であれば、いつでもいいです。
実施している組織が営業であれば、朝会のほうがいいかも知れません。その日やることを全員で共有するからです。
開発の場合は、その日やることにフォーカスするよりも、これまでやってきたことを共有する意味合いが強いので、朝に縛られる必要はないと考えます。

## スクラムマスターは、チームメンバーが無理をしていないかを随時確認する
日本では根性論が多いです。決めた時間に必ずこないと、白い目で見られますが、なぜ来られないのか考えて見ることが大切です。
もし社内にいて、単純な不注意で集まれないのであればその人自身に問題があるかも知れません。しかし、何か外部要因が絡んでしまい来られないのであれば、
その時間帯を見直したほうが賢明です。日本では公共交通機関が主に電車やバスであることが多いでしょう。電車やバスは遅れやすいです。そのあたりを加味した上でのデイリースクラムの時間帯になっていれば良いと考えます。
また、子供を保育園に連れていく場合等もこれに当てはまります。保育園は保護者の出勤時間を把握して子供の登園時間帯を決めますので、雨が降ったから通常より早く連れていくなんてことはできないのです。一番怖いのは事故です。デイリースクラムに間に合わせるために、急いでしまう。急いだことによって二次災害を起こしてしまうこともあります。いつでもゆとりは大切なのです。
スクラムマスターは、スクラムが適切に運用しているかを把握する役割ですが、デイリースクラムに欠席者がポツポツと出る場合は、これらの環境も考慮した上で、時間帯の変更を提案しましょう。

## ではいつがいいのか？
全て、チームと目的に依存します。ただ、日本ではお昼が良いのではないかと考えています。
交通機関の乱れも吸収できます。私の経験ではお昼ごはん前もしくはお昼ごはん後が良いと思います。
大切なのは、15分以内に終えるということです。タイムボックスです。「15分」が隙間的にある時間帯も利用価値があります。
例えば、12:00-12:45までお昼休みという就業規則の場合、12:45-13:00は皆意識せずにだらだらと休み時間の延長として過ごしてしまうのではないでしょうか。そのような隙間時間を利用すると良いと思います。

### お昼ごはん前

* 前回のデイリースクラムから何をしたか
* 次回のデイリースクラムまで何をするか
* 困っていること

を全員が共有した後に、一緒にお昼ごはんを食べる、という流れになります。
困ったことをランチを取りながら検討してもいいかも知れません。効率的ではあります。ただ、お昼ぐらいは仕事のことを忘れたい、というメンバーが多い場合には煙たがられるかも知れません。

### お昼ごはん後

* 前回のデイリースクラムから何をしたか
* 次回のデイリースクラムまで何をするか
* 困っていること

を全員が共有した後に、午後の仕事に取り掛かります。お昼ごはん後の眠い時間に、スタンドアップでミーティングをするために多少の眠気覚ましにはなると思います。

## まとめ
結局はチームのために行うものですので、目的を明確にして、チーム内で議論をして決めれば良いと思います。
スプリント毎に時間帯を変えてみて、一番しっくりくる時間帯を決めるのもいいと思います。

[ブログにも同じ記事を載せています](http://kshimizu.hatenadiary.jp/entry/2016/09/27/012735)
findの結果からファイル名だけ取り出す

# はじめに
[findでファイル名のみ表示](http://qiita.com/skkzsh/items/40b661a043c9b60f8426)とかを参考に、`awk`とか`sed`とかで頑張ってみようとしたけれど、よくよく考えたら`-exec`オプションでシンプルに解決できたのでメモ。

# -execオプションを使う
`-exec`オプションに`basename`コマンドを組み合わせる。（速度については分かりません）

```bash
find . -type f -exec basename {} \;
```

# 応用編（おまけ）
抽出したファイルと同名のファイルが、別のディレクトリに存在するかを確認する。

```bash
find . -maxdepth 1 -type f -exec basename {} \; | xargs -n 1 find /hoge -maxdepth 1 -name
```

[こんなの](http://qiita.com/ryskiwt/items/2dba11ab37412b6be5e9)と合わせて、ワイルドカード指定でコピーするときの、同名ファイルの存在確認なんかに使えそう。

```bash
#!/bin/bash
function FindCopy () {
  SRC_DIR=`dirname "$1"`; FILE_PATTERN=`basename "$1"`; DEST_DIR="$2"
  FINDCMD="find $SRC_DIR -maxdepth 1 -name $FILE_PATTERN"

  RES=`$FINDCMD -exec basename {} \;` || return 2 # エラー終了
  [ -z "$RES" ] && { echo "src files not found."; return 0; } # コピー元ファイルなし⇒スキップして正常終了

  RES=`echo "$RES" | xargs -n 1 find $DEST_DIR -maxdepth 1 -name` || return 2 # エラー終了
  [ -n "$RES" ] && { echo "dest files already exist."; return 1; } # コピー先ファイル競合⇒エラー終了

  $FINDCMD -exec cp -p {} $DEST_DIR \; || return 2 # エラー終了
  return 0 # 正常終了
}

# 使用例
FindCopy "/hoge/*.text" "/huga"
```
html circle

```html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<style type="text/css">
#circle {
  width: 20px;
  height: 20px;
  margin: auto;
  border-radius: 50%;
  -moz-border-radius: 50%;
  -webkit-border-radius: 50%;
  -o-border-radius: 50%;
  -ms-border-radius: 50%;
  font-size: 10px;
  color: #000;
  background-color: #f00;
  text-align: center;
}

#circle p {
  position: relative;
  top:50%;
  transform: translateY(-50%);
}

</style>
</head>
<body>
<table border="1">
<tr height="100px">
<td>1111</td>
<td>2222</td>
<td width="100px">
  <div id="circle">
    <p>有</p>
  </div>
</td>
<td>3333</td>
<td>4444</td>
<tr>
</table>

</body>
</html>

```

参考：
http://original-game.com/css-center-of-the-circle/
Django1.9 環境非依存のwsgi.pyの書き方

よくこういう書き方してるけど、

```wsgi.py
import os
import sys

from django.core.wsgi import get_wsgi_application

sys.path.append("/path/to/project/hoge")
sys.path.append("/path/to/project/hoge/hoge")

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hoge.settings")

application = get_wsgi_application()

```

こう書けば環境が変わっても使えるっぽい。

```wsgi.py
import os
import sys

from django.core.wsgi import get_wsgi_application

FILE_PATH = os.path.dirname(__file__)
PROJECT_NAME = os.path.basename(FILE_PATH)

sys.path.append(os.path.dirname(FILE_PATH))
sys.path.append(FILE_PATH)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", PROJECT_NAME + ".settings")

application = get_wsgi_application()
```
shell scriptで現在のディレクトリを変更して移動する

たとえば下記のようなスクリプト

```shell-session:mycd.sh
#!/bin/sh

cd /path/to/destination
```

ShellScript内で現在のディレクトリを移動すると、終了時にディレクトリの変更は保持されない.
簡単な方法でディレクトリを位置を変更して、それをscript実行後も保持したかった。

きれいではないけどとりあえず実用的な方法をメモ。

# source + alias

普通に実行するとカレントディレクトリは変化しない

```shell-session
$ sh mycd.sh # 実行後カレントディレクトリは変化しない
```

sourceコマンドを使うと、現在のshell-session上で状態変更してくれる

```shell-session
$ source mycd.sh # 実行後カレントディレクトリは変化
```

常にsourceをつかって実行すればよいのだけど、コマンドやユーティリティとして利用する際には不便だ.
そこで元コマンドの実行からaliasを貼って実行する方式だとタイプ数がへってよいと思う.

```shell-session:.zshrc/.bashrc
alias mycd='source mycd.sh'
```

これですっきり、コマンド化できた。

```shell-session
$ mycd # 実行後カレントディレクトリは変化
```
actionLayout を使ったらボタンが反応しなくなった

Action Bar の アイコンを icon = “” ではなく actionLayout で読み込むようにしたらボタンが反応しなくなりました。
イベントリスナーのセットの仕方を変える必要があるとわかったので内容をメモします。

onOptionItemSelected() 内にボタンが押された際の処理を switch 文で次のように書いていました。

```
@Override
public boolean onOptionsItemSelected(MenuItem item) {   
    switch (item.getItemId()) {        
        case android.R.id.foo:            
            finish();      
            return true; 
        case R.id.bar:
            return true;
        default:            
            return super.onOptionsItemSelected(item);    
    }
}
```
しかし、ボタンに actionLayout を使うように変更を加えたところ処理が実行されなくなりました。

[stackoverflow の記事](http://stackoverflow.com/questions/11627892/onoptionsitemselected-not-called-when-using-actionlayout-sherlockactionbar) によると actionLayout を使う場合には onCreateOptionsMenu() でボタンにリスナーをセットするのがいいようです。

```
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.hoge, menu);
    for (int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        if (item.getItemId() == R.id.fuga) {
            itemChooser = item.getActionView();
            if (itemChooser != null) {
                itemChooser.setOnClickListener(this);
            }
        }
    }
    return super.onCreateOptionsMenu(menu);
}
```
ファイルの存在確認でワイルドカードを使う

# はじめに
単一ファイルの存在確認であれば、`[ -e file ]`で確認が出来ますが、この構文ではワイルドカードが使えず、ほかの方法を模索したのでメモ。

# lsのエラーをつかむ方法
ググったときによく出てきたのは、下記のように`ls`叩いてエラーを拾う方法。一致するものが無い場合にエラー終了（終了ステータス2）することを利用して、判定をしています。

```bash
ls /hoge/*.txt >/dev/null 2>&1
if [ $? -ne 0 ]; then
  # 存在しない場合
else
  # 存在する場合
fi
```

# その他のエラーと分離したい
上の方法で困るのは、エラー終了のときに、まるっとすべて存在しない扱いになってしまうこと。「`/bin/ls`削除してシェル叩きまっせ」とかいう変態テストでNGになってしまったため、急遽別の方法を模索することに。

そこで採用したのが下記の方法。`find`の`-name`オプションを使用してあげれば、ファイルが存在しないときには正常終了・標準出力なしになるため、エラーと分離が出来ます。（ただし、捜索先のディレクトリは存在していないとエラーになります。これは`[ -e dir ]`とかで確認できるし問題ないかな）

```bash
RES=`find /hoge -maxdepth 1 -name *.txt 2>/dev/null`
if [ $? -ne 0 ]; then
  # 予期せぬエラーの場合
elif [ -z "$RES" ]; then
  # 存在しない場合
else
  # 存在する場合
fi
```
Android アプリケーション技術者認定試験ベーシック合格法

[Androidアプリケーション技術者試験ベーシック](http://oesf-edu.com/ace/application-exam/)に合格するために、最低限やるべきことをまとめました。
受験しようと思うけどどのくらい、どうやって勉強すればいいかわからないという方の役に立てれば幸いです。


#試験について
インターネットから申し込み・会場の予約をして受験します。
日本全国のテストセンターで、ほとんど毎日受験することができます。
受験料は15000円です。
制限時間は90分、問題は70問ですべて四択、7割以上の正答で合格です。

#勉強法

##参考書
[携帯OS教科書 Androidアプリケーション技術者ベーシック](https://www.amazon.co.jp/gp/product/4798124540/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=466449256&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=4822202968&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=1WYN41EKB6GVNJYPGNBV)

##時間が十分にある人 
参考書を読みましょう。コードを書きながら読めるとより覚えがいいと思います。
一章読んだら章末の練習問題を解き、わからなかったところを戻って復習しましょう。
これだけやれば合格はもちろん高得点間違いなしです。
##時間がない人
参考書の本文はいったん置いておいて問題を解きましょう。
章末の練習問題と巻末の模擬試験をすべて解いて、解答を覚えましょう。
この参考書に載っている問題と類題が解けるようになるだけで本番でも7割はとれます。
ただし、参考書の問題は完ぺきにしておきましょう。
勉強を始めた時点での知識量にもよりますが、一週間がんばれば暗記できるはずです。

##最後に
本当にこれだけでいいのかと不安でしょうか。大丈夫です。
私が試験を受けたときには、参考書に載っていた問題と同じ問題が4割、問題文や選択肢が少し変わっただけの類題が3割ほど出題されました。この一冊の問題に対応できれば十分です。
時間が十分にあればほかの参考書を読むのもいいですが、まずは一冊を完ぺきにしてからにしましょう。
時間がない場合は何をするかで悩まずに勉強を始めましょう。
leap-sec & chronyd

# chrony operation
## ntpq
`chronyc sources`

## amazon linux default config
```/etc/chrony.conf
# use the local instance NTP service, if available
server 169.254.169.123 prefer iburst

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.amazon.pool.ntp.org iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking

# save data between restarts for fast re-load
dumponexit
dumpdir /var/run/chrony

# use a key to secure communication between chronyc and the daemon
commandkey key1
```

# Support leap-sec ???
http://qiita.com/kirksencho/items/f789af7ed6046278b9d3

Default, NO but...

# `leapsecmode` directive
- Maybe from ver > 2.x.
- RHEL7(cent7) updated to 2.1 https://www.scientificlinux.org/sl-errata/slsa-20152241-3/
- RHEL6(cent6) + EPEL ???

https://chrony.tuxfamily.org/doc/2.4/chrony.conf.html

```
leapsecmode slew
maxslewrate 1000
smoothtime 400 0.001 leaponly
```

# Verification
Confirmed
オプショナル型の考え方とSwiftでの使い方のまとめ

## 概要
ObjCからSwiftに切り替えて一番面食らったのがオプショナル型です。馴染みのない概念なのですが、最近はC#やJavaでも採用されているそうです。

後述するようにNULL代入そのものを避けようとする考え方には、正直なかなか受け入れがたいものがあります。とはいえヌルポによって今まで多くの不具合が生まれてきたのも事実。今後活用していけるように、その考え方と使い方をまとめてみました。

```
＊Swift2系を前提としています。
最近の3系では構文が変わっている可能性があるので、ご指摘いただけたら幸いです。
```

## 考え方
1. 既存のC系言語は変数にNULLが代入されることを許していた
    - 変数を参照するときは必ずNULLチェックが必要になる
    - かつ、チェックが漏れた場合はヌルポインタ例外によってプログラムが落ちる

2. 対してSwiftなど近代的な言語では、基本的に__変数にNULL(nil)を代入できない__。
    - 変数にNULLが代入できることがバグの温床となるため、いっそ代入できないようにした
    - NULLが入る可能性がないので、チェックが不要になった

3. でも、実際にはNULLを使いたい場合がある
    - そこで、NULLを基本的に使えない言語で、__特別にNULL代入を許す型がオプショナル型__

4. ただし、オプショナルが無制限に使えると既存の言語と同じでNULLだらけになってしまう
    - そこで、オプショナル型を使う場合にはそれがNULLでないことをチェックしてからでないと使えないようになっている(= __アンラップ__)


## Swiftでの構文
### オプショナル型の定義
型の末尾に`?`あるいは`!`をつけるとオプショナル型になる。両者の違いは後述。

	
```swift
let foo: Foo?
foo = nil		// OK
```

### アンラップしないで使う
オプショナルの変数をそのまま使うと、その値はオプショナル型として扱われる。たとえば`Int?`の値はInt型ではなく、あくまでOptional(Int)型のため、Int型との互換性はない(比較できない)


```swift
let foo: Int? = 123
println(foo)	// Optional(123)
```


### アンラップの方法
#### 1. 強制アンラップ
変数の__評価時__に変数の末尾に`!`をつけると、その値を強制的にアンラップする。強制アンラップした変数がnilだった場合は、__実行時エラー__となる。

```swift
let foo: Int? = 123
let baz: Int? = nil

println(foo!)	// 123
println(bar!)	// ERROR
```

#### 2. 暗黙アンラップ
変数の__宣言時__に型の末尾に`!`をつけると、その変数は暗黙アンラップ・オプショナル型となる。暗黙アンラップ・オプショナル型は、評価時に自動的に強制アンラップされる。

```swift
let foo: Int! = 1
let bar: Int! = nil
println(123 + foo)	// 暗黙的にアンラップされる
println(123 + bar)	// ERROR
```

#### 3. オプショナルバインディング
if構文の判定式にて、オプション変数を別の変数/定数に代入できる。

アンラップできる(nilでない)場合はif文が実行される。
nilだった場合は実行されない。


```swift
let foo: Int? = 123
let baz: Int? = nil

if let f = foo{
    // 実行される
}
if let b = bar{
    // 実行されない
}
```

#### 4. オプショナルチェイニング
変数の末尾に`?`を付加するとオプショナルチェインとなる。
チェインされた変数(レシーバ)がnilの場合は、その後につづく変数アクセス/メソッドが実行されない。
つまり__Objective-Cのメソッド呼び出しの挙動と同じ__。

```swift
var foo: Foo? = Foo()
var fee: Foo? = Foo()

foo?.bar()		// 正しく実行される
fee?.bar()		// feeはnilだがエラーにならない
```
swift3.0での変更点（一部）

swift3.0がリリースされ、変更が入った箇所のうち、
よく使いそうなところをメモしました。

# 「CGRectMake」→「CGRect」

**＜変更前＞**

```lang:swift
private let mylabel = UILabel(frame:CGRectMake(0, 0, 100, 100))
```

**＜変更後＞**

```lang:swift
private let mylabel = UILabel(frame:CGRect(x: 0, y: 0, width: 100, height: 100))
```

# 「CGSizeMake」→「CGSize」

**＜変更前＞**

```lang:swift
myScrollview.contentSize = CGSizeMake(100, 100)
```

**＜変更後＞**

```lang:swift
myScrollview.contentSize = CGSize(width: 100, height: 100)
```

# UIColor

**＜変更前＞**

```lang:swift
myScrollview.backgroundColor = UIColor.clearColor()
```

**＜変更後＞**

```lang:swift
myScrollview.backgroundColor = UIColor.clear
```


# フォントのサイズ指定

**＜変更前＞**

```lang:swift
mylabel.font = UIFont.boldSystemFontOfSize(18)
```

**＜変更後＞**

```lang:swift
mylabel.font = UIFont.boldSystemFont(ofSize: 18)
```


# bringSubview

**＜変更前＞**

```lang:swift
self.view.bringSubviewToFront(mylabel)
```

**＜変更後＞**

```lang:swift
self.view.bringSubview(toFront: mylabel)
```

# openURL、NSURL

**＜変更前＞**

```lang:swift
let otherAction = UIAlertAction(title: "はい", style: .Default) {
    action in
    UIApplication.sharedApplication().openURL(NSURL(string: "tel://119")!)
}
```

**＜変更後＞**

```lang:swift
let otherAction = UIAlertAction(title: "はい", style: .default) {
    action in
    UIApplication.shared.openURL(URL(string: "tel://119")!)
}
```

**＜変更前＞**

```lang:swift
let myURL = NSURL(string:myAppURL)
```

**＜変更後＞**

```lang:swift
let myURL = URL(string:myAppURL)
```


# 「NSDate」→「Date」
# 「NSCalendar」→「Calendar」
# 「NSDateComponents」→「DateComponents」

**＜変更前＞**

```lang:swift
self.view.bringSubviewToFront(mylabel)
```

**＜変更後＞**

```lang:swift
self.view.bringSubview(toFront: mylabel)
```

# 「dismissViewControllerAnimated」→「dismiss」

**＜変更前＞**

```lang:swift
dismissViewControllerAnimated(true, completion: nil)
```

**＜変更後＞**

```lang:swift
dismiss(animated: true, completion: nil)
```

# 「popViewControllerAnimated」→「popViewController」

**＜変更前＞**

```lang:swift
self.navigationController?.popViewControllerAnimated(true)
```

**＜変更後＞**

```lang:swift
self.navigationController?.popViewController(animated: true)
```

# 「rangeOfString」→「range」

**＜変更前＞**

```lang:swift
let loc = itemsSearchText[i].rangeOfString(sMySearchBar!).location
```

**＜変更後＞**

```lang:swift
let loc = itemsSearchText[i].range(of: sMySearchBar!).location
```

# 「NSDateFormatter」→「DateFormatter」

**＜変更前＞**

```lang:swift
let myDateFormatter: NSDateFormatter = NSDateFormatter()
```

**＜変更後＞**

```lang:swift
let myDateFormatter: DateFormatter = DateFormatter()
```

# NSTimeZone

**＜変更前＞**

```lang:swift
myDatePicker.timeZone = NSTimeZone.localTimeZone()
```

**＜変更後＞**

```lang:swift
myDatePicker.timeZone = TimeZone.autoupdatingCurrent
```
商の導関数の公式って積の導関数の公式で行けるよね、の証明

※このエントリはSchemeの例題を解くにあたって必要に迫られ、数学3の微分(導関数)をやり直した記録です。


```math

\frac{f(x)}{g(x)}
```
って

```math
f(x)  \times g(x)^{-1}
```
と書き直すことが出きるので、商の導関数の公式は積の導関数の公式で行けるはずだよね、と思ったのですが、その証明に手間取ったので記録。「そんなんネットに転がってるだろ」とググりまくったんですが、見付けられないものですなぁ。
さてまずの前提。

・積の導関数の公式

```math
y=f(x) \times g(x)
```
ならば、yの導関数、y'は

```math
y'=f'(x) \times g(x) + f(x) \times g'(x)
```
・商の導関数の公式は

```math
y= \frac{f(x)}{g(x)}
```
ならば

```math
y'= \frac{f'(x) \times g(x) - f(x) \times g'(x)}{{g(x)}^2}（式１）
```



さて証明すべきは

```math

y = \frac{f(x)}{g(x)}
```
すなわち

```math
y=f(x)  \times g(x)^{-1}
```
を積の導関数の公式で微分した式が、商の導関数の公式（式１）と一致すれば良いわけですな。では積の導関数の公式にしたがって展開してみましょう。

```math
y' = f'(x) \times g(x)^{-1} + f(x) \times [g(x)^{-1}]'（式２）
```


（式１）の分母、分子に 

```math
g(x)^{-2}
```
を掛けると

```math
y' = f'(x) \times g(x)^{-1} - f(x) \times g'(x) \times g(x)^{-2}（式３）
```


ところで

```math
y=\frac{1}{g(x)}
```
のとき

```math
y' = \frac{1' \times g(x) - 1 \times g'(x)}{g(x)^2} = -\frac{g'(x)}{g(x)^2} = -g'(x) \times g(x)^{-2} = [g(x)^{-1}]'（式４）
```


なので（式３）を

```math
y' = f'(x) \times g(x)^{-1} - f(x) \times g'(x) \times g(x)^{-2}
   = f'(x) \times g(x)^{-1} + f(x) \times [-g'(x) \times g(x)^{-2}]
```
と変形して（式４）を代入すると

```math
y' = f'(x) \times g(x)^{-1} + f(x) \times [g(x)^{-1}]' 
```
よって

```math
y = \frac{f(x)}{g(x)} 
```
を商の導関数の公式にしたがって微分した式、（式１） = （式３）は、積の導関数にしたがって微分した式、（式２）と等しい。
QED.


余談（もしくは、「波よ、俺の苦心を聞いてくれ」）
・2週間くらい暇を見付けては、紙に鉛筆でごにょごにょ書いて、あーでもないこーでもないと試行錯誤した。
・肝は

```math
y=\frac{1}{g(x)}
```
を微分すると

```math
y' = -\frac{g'(x)}{g(x)^2}
```
となることに気付いて、（式４）を導き出せたことですな。まあ某古書店で立ち読みした「チャート式数学３」に記してあるのを発見したわけですが実は。
しかし2週間ほど試行錯誤を重ねていたからこそ、この式を見た瞬間、閃いたに違いない。
というわけで誰か頑張った私を褒めてください。（厚かましい）

###追記１

@ma-oshita さんがコメントで対数微分法の使用を提案されていたので
「あー、対数微分法ねー。対数微分法ってアレかー、アレだよねー……モスバーガーの新メニューのアレだっけ？」
状態になったのでまたチャート式数学３を立ち読みして勉強し直しました。もう高校数学の軽い復習本くらい買っとこうかしら。

では

```math

y = f(x) \times g(x)^{-1}　（式１）
```
と

```math

y = \frac {f(x)} {g(x)}　　（式２）
```
を対数微分法で微分した式が一致したら、商の導関数の公式が積の導関数の公式でも代用可能としましょう。**（これでいいのか？）**

式１のとき

```math

\log y = \log (f(x) \times g(x)^{-1})\\

\begin{align}
\frac {y'} {y} &= \log (f(x) \times g(x)^{-1})' \\
&= ( \log f(x))' + ( \log g(x)^{-1})' \\
&= ( \log f(x))' - ( \log g(x))' \\
\end{align}
```

よって

```math

y' = y \times [( \log f(x))' - ( \log g(x))']　──Ａ
```

また、式２は

```math

\log y = \log \frac {f(x)} {g(x)}\\

\begin{align}
\frac {y'} {y} &= [\log \frac {f(x)} {g(x)}]' \\
&= ( \log f(x))' - ( \log g(x))' \\
\end{align}
```

よって

```math

y' = y \times [( \log f(x))' - ( \log g(x))'] ──Ｂ
```

よって、式１を対数微分した式、Ａと、式２を対数微分した式、Ｂは同値。Q.E.D.

……**本当にこれで証明になっているのか疑問**ですが、あの、間違っていたらコメント等で指摘していただけると幸いです。

###追記２

@7shi さんにコメントで、私のゴチャゴチャした証明を、すっきりと証明しなおしていただきました。
展開した式をどうまとめるかばかりに気が向いてしまい、式の展開に気をつかえば良かったのですね。
ありがとうございました。
カテゴリの挙動について覚え書き


### 継承してもカテゴリのメソッドは使える

```objc:Foo.h/m
@interface Foo : NSObject
@end

@implementation Foo
@end
```

```objc:Foo+Some.h/m
@interface Foo(Some)

- (void)some;

@end

@implementation Foo(Hoge)

- (void)some{
    NSLog(@"some");
}

@end
```

```objc:Bar.h/m
@interface Bar : Foo
@end

@implementation Bar
@end
```

```objc:main.m
// ...
Bar *bar = [[Bar alloc] init];
[bar some];    // "some"

```

### カテゴリと元のクラスでメソッドが重複した場合は、元のクラスが優先される

```objc:Foo.h/m
@interface Foo : NSObject

- (void)some;

@end

@implementation Foo

- (void)some{
    NSLog(@"some original");
}

@end
```

```objc:Foo+Some.h/m
@interface Foo(Some)

- (void)some;

@end

@implementation Foo(Hoge)

- (void)some{
    NSLog(@"some category");
}

@end
```

```objc:main.m
// ...
Foo *foo = [[Foo alloc] init];
[foo some];    // "some original"

```
Unity for iOS で GameObject.CreatePrimitive() が原因の EXC_BAD_ACCESS が起きた時の対処法

## 現象

Unity からの XCode プロジェクト書き出しでは問題ないのに、ビルドして実行すると`SetSharedMesh()`で`EXC_BAD_ACCESS`が発生してしまう。

![](http://i.imgur.com/TLzo6TE.png)

## 対処法

`PlayerSettings > iOS > Strip Engine Code` のチェックを外してビルドしなおす

## 原因

必要なメッシュデータがstripされた状態で実行しまったから。
2011年からバグ報告されているけれども、修正困難としてずっと放置されているとのこと。

## 情報元
* https://community.unity.com/t5/iOS-tvOS/errors-and-crash-inside-CreatePrimitive-on-iOS/td-p/2632475
Laravel Eloquent でデータベースレコードをコピーする

### Laravel でデータベースの1行をカンタンにコピーする方法はありませんか？

はい。あります。

こちらに。
http://stackoverflow.com/questions/34257741/laravel-copy-record-and-duplicate-with-new-values

なのですが、意訳と補足をさせていただきます。

## 【基本】->replicate() を使う

```php
$oldrow = MyModel::find($id);
$newrow = $oldrow->replicate();
$newrow->some_column = 'new data';
$newrow->save();
```
これが基本形です。
なのですが、ちょっと疑問が幾つか……。

### id は更新しなくて大丈夫なんですか？

ついつい、以下のようにやりたくなります（上記のサイトでもやってます）。でないと、同じIDを持たせたままだったら、コピーじゃなくて上書きになってしまうのでは？

```php
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();

$newrow->id = null;

$newrow->some_column = 'new data';
$newrow->save();
```

いやいや、それじゃ replicate した意味ないっすよ。そこはちゃんと考えられていて、このようになっています。

```php
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();

var_dump( $oldrow->id ); // 2145
var_dump( $newrow->id ); // NULL

$newrow->some_column = 'new data';
$newrow->save();
```

### タイムスタンプ created_at updated_at は更新しないとですよね？

これは必要でしょ！（上記のサイトでも以下略）

```php
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();

$newrow->created_at = date('Y-M-D H:m:s');

$newrow->some_column = 'new data';
$newrow->save();
```

いやいや、意外と大丈夫です。

```php
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();

var_dump( $oldrow->created_at ); // 2016-09-26 23:15:33
var_dump( $oldrow->updated_at);  // 2016-09-26 23:15:33
var_dump( $newrow->created_at ); // NULL
var_dump( $newrow->updated_at);  // NULL

$newrow->some_column = 'new data';
$newrow->save();

var_dump( $newrow->created_at ); // 2016-09-26 23:22:51 save()した日時
var_dump( $newrow->updated_at);  // 2016-09-26 23:22:51

```

### save()しないとダメなんですか？

いままでの結果からなんとなくわかりますが、replicate した時点では実体を持たないデータのようです。実際にデータベースのレコードが複製保存されるのは、save()したタイミング。

```php
$oldrow = MyModel::find(2145);
$newrow = $oldrow->replicate();

$newrow->some_column = 'new data';
return;
// saveしない
$newrow->save();
```

このように、replicateしたレコードをsaveしないとデータベースのレコードは増えません。
Mac標準「プレビュー」の意外と知られていないTips

※ "意外と知られていないか"の基準は筆者の主観です。
※ ~~動作確認環境は、MacOSX Yosemite、プレビュー v8.0です。~~
※ ~~MacOSX Sierra, プレビュー v9.0で動作確認しました。~~
※ mac OS Mojave, プレビュー v10.1 で動作確認しました。


## 更新履歴
2019/03/06 macOS Mojave 10.14.1 での動作を確認
2017/05/01 Mac OS Sierra での動作を確認
2016/10/12 7. クリップボードから開く
2016/09/27 6. 画像を回転させる
2016/09/27 5. PDFを暗号化する
2016/09/27 4. PDFのファイルサイズを圧縮する


## 1. インスタントアルファ😄
同じような色のエリアを選択し透過してくれる機能

![スクリーンショット_2016-09-26_22_53_07.png](https://qiita-image-store.s3.amazonaws.com/0/82699/fc9794bc-4f75-92ba-e1c6-0d3d360c0d78.png "スクリーンショット_2016-09-26_22_53_07.png")


これを何回かやってみると？

![ia.png](https://qiita-image-store.s3.amazonaws.com/0/82699/61f75d62-1f88-2743-12de-608589a74026.png "ia.png")

ポテトチップスの袋もあっという間にでロゴだけになりました。

## 2. 豊富な書き出しの種類😵
jpgをpngに書き出したり、画像をpdfとして書き出したりしたことがあると思います。
そのときの書き出しの項目を増やすことができます。

1. ファイル > 書き出し...
2. フォーマット: をoptionキーを押下しながらクリック

すると、このように項目が増えます！

![スクリーンショット_2016-09-26_23_05_52.png](https://qiita-image-store.s3.amazonaws.com/0/82699/c7d00dcd-767a-f2c9-7560-1bd3d6e46dc5.png "スクリーンショット_2016-09-26_23_05_52.png")

ここで注目すべきはMicrosoftアイコン（.ico）。
これまでWebサービスを使ってfaviconの作成をしていましたが、プレビューで完結します。



## 3. まとめてリサイズ😊
Photoshopなどを起動しなくとも、標準アプリがやってくれるよっていう話です。

1. まずはリサイズしたい画像を全部開く
![スクリーンショット 2016-09-24 2.04.01.png](https://qiita-image-store.s3.amazonaws.com/0/82699/5e86f6b4-ea2d-ff19-713e-870c15cc95d3.png "スクリーンショット 2016-09-24 2.04.01.png")


2. リサイズしたい画像全てをプレビュー上で選択（左サムネイルサイドバー参照）
![スクリーンショット 2016-09-24 2.06.44.png](https://qiita-image-store.s3.amazonaws.com/0/82699/3bc67aee-52fb-a42f-e82f-b6b6d23615ca.png "スクリーンショット 2016-09-24 2.06.44.png")

3. その状態で、[ツール] > [サイズを調整]とすれば良いです。

ばらばらのサイズだったポテトチップスも、ご覧の通りきれいに高さが揃いました。

![スクリーンショット 2016-09-26 23.14.34.png](https://qiita-image-store.s3.amazonaws.com/0/82699/6ec0d8a7-99aa-f446-eb02-7063e8ea7cb1.png "スクリーンショット 2016-09-26 23.14.34.png")

これでいちいちAdobeソフトの起動待ちをしなくて済みますね！


## 4. PDFのファイルサイズを圧縮する😋
1. まずは圧縮したいPDFを開きます
2. ファイル > 書き出し...  
Quartzフィルタ： にて、[Reduce File Size]を選択します。  
![スクリーンショット 2016-09-27 11.17.33.png](https://qiita-image-store.s3.amazonaws.com/0/82699/e05db130-c02d-ae31-5fb5-8131bd2cc696.png)


そしてそのまま書き出すと・・、2.1MB -> 565KBと**約73%の削減**になりました。

「PDF 圧縮」で検索した某Webサービスでは、2.1MB -> 502KBと約76%の削減となりました。


## 5. PDFにパスワードをかける😇
1. 4と同じく、PDFを開き、ファイル > 書き出しと行います。
2. [レ] 暗号化にチェックしましょう！    
![スクリーンショット 2016-09-27 11.31.18.png](https://qiita-image-store.s3.amazonaws.com/0/82699/174bfc41-fbf5-66a2-0ad9-d4d317171385.png)

すると新たに入力フォームが出てきます。ので見ての通りパスワードを入力すれば良いです。

簡単にできましたねー！！

![スクリーンショット 2016-09-27 11.33.20.png](https://qiita-image-store.s3.amazonaws.com/0/82699/dc104a1e-4b2c-3740-896d-320ad2754a2d.png)


## 6. クリップボードから開く 😉
コメントにてご教示くださった[osmoc-1970](http://qiita.com/osmoc-1970)さんありがとうございました。

プレビュー上で`⌘ + N`でクリップボードに保管されているファイルを開くことができます。

* 画像やPDFファイルをアップロードしたURL
    * Slackに投げられたPDFを開くとブラウザが開きますよね！あのURLでも出来ますよ。
* `Ctrl + Shift + Command + 3`でスクリーンショットをクリップボードに撮ったもの
* 右クリックで[画像を保存]したもの
* Finder上のファイルをコピーしたもの

スクリーンショットについて詳しくはここに書きました。
[Mac標準「スクリーンショット」の意外と知られていないTips](http://qiita.com/mtmtkzm/items/30b7ffaf9b3fbab50b36)


## おわりに
また、プレビュー.appの"意外と知られていない"ものを発見したら追加していこうと思います😆
Apexとpython-lambda-localではじめるAWS Lambda開発

# 概要

1. python-lambda-localでローカル開発
2. Apexでデプロイする

組み合わせた環境を説明します

***

# 事前準備

## 必要なライブラリをインストール
```bash
pip install python-lambda-local
pip install boto3
```

## Apexをインストール
```bash
curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sudo sh
```
※ AWS　config/credentialsを事前に設定
※ IAMユーザにiam:CreateRoleを割り当てる必要あり

***

# Apexプロジェクトを作成

## scaffoldを作成

```bash
mkdir hello-project
cd hello-project
apex init

... 対話モードで入力 ...

```

## 設定ファイルを変更
```project.json
{
  ...
  "runtime": "python",
　　　　"environment": {} //共通の環境変数
  ...
}
```

```.apexignore
event.json
requirements.txt
*.pyc
```

***

# Lambdaを作成

## Functionを作成
```functions/hello/_apex_main.py
def handle(event, context):
  print 'Hello Lamba'
  return 'success'
```

## 設定ファイルを作成
ここでも環境変数を設定できる

```functions/hello/event.json
{
  "description": "about this function"
}
```

## Lambdaに渡すデータを作成
動作確認に必要

```functions/hello/event.json
{
  "key": "value"
}
```

## 依存ライブラリをインストール
```bash:functions/hello
pip install $ライブラリ名 -t .
pip freeze > requirements.txt
```

***

# AWSで実行

## デプロイ

```bash
apex deploy
```

## 実行

```bash
apex invoke < event.json
```

***

# Localで動作確認

## python-lambda-localを実行
毎回AWSにデプロイするのは手間

```bash:functions/hello
python-lambda-local -l . -f handle -t 5 _apex_main.py event.json
```

***

# 課題

## 環境変数
AWS LambdaのPythonランタイムは環境変数を使えない

* Apexがアップロードするzipファイルには、環境変数を定義する`.env.json`が含まれている
* 実行時に`.env.json`の内容を環境変数に設定してあげる

```_apex_main.py
import json
with open('.env.json') as f:
    os.environ.update(json.load(f, encoding='utf-8'))

def handle(event, context):
```
この前書いたProguard一覧

まあ、探せばいくらでも出てくるんですが、宣伝もかねて。
https://play.google.com/store/apps/details?id=com.collection.wather.weathertools
本当はもっといろいろ作っていたのだけれども、完成の日の目を見たいがために機能を削りまくってます。その結果、意味をなしていないProguardも備忘録を兼ねて記しておきます。

# Glide
画像ライブラリ
Picassoと悩んだのですが、こちらの記事でGlideにしました。
http://qiita.com/rejasupotaro/items/ead90beaeaa2a6eace35

```
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
    **[] $VALUES;
    public *;
```

# Gson
パーサー
ここに書かれているものだけではだめで、デシリアライズしたデータを格納するクラスもkeepを忘れずにしないといけません。

```
-keep class com.google.gson.**
-keepattributes *Annotation*
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
```

# OkHttp
通信ライブラリ
いわずもがな。

```
-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
```

# Retrofit
通信ライブラリ
GsonとOkHttpと組み合わせて使ってます。

```
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-dontwarn com.google.appengine.api.urlfetch.*
```

# Maps
グーグルマップ
地図を表示させたかったんです。

```
-keep class com.google.android.gms.maps.** { *; }
-keep interface com.google.android.gms.maps.** { *; }
```

# Crashlitics
クラッシュ解析
いまならfirebaseの方がいいかも。

```
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
```

# ButterKnife
View Injectionライブラリ
v7からか？これを使うとビルドがすこぶる遅くなったので速攻で消去しました。

```
-keep public class * implements butterknife.internal.ViewBinder { public <init>(); }
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * { @butterknife.* <methods>; }
-keepclasseswithmembernames class * { @butterknife.* <fields>; }
```

# Twitter4J
Twitter非公式ライブラリ
楽になりますね。

```
-dontwarn twitter4j.management.**
-dontwarn twitter4j.TwitterAPIMonitor
-dontwarn twitter4j.internal.**
-dontwarn twitter4j.Annotation
-keep class twitter4j.** { *; }
```

# おわりに
proguardの設定はデバックビルドだと気づけないので、意外とはまるポイントの１つですね。gradleでsyncしたときに自動で挿入されるようになるといいですね。
Rails 開発環境のログからクエリを整理して並べる

Railsでの開発を続けていればパフォーマンス良くするため、クエリのログを目でみて探すのが辛く感じてきます
少しでも楽になるようにコントローラーのアクションごとにクエリの遅い順に並べて整理するスクリプトを書きました

```rb
#!/usr/bin/env ruby

# query profiling ツール
# ファイルログ

# カレントパス
current_path = `pwd`.chomp
file_content = File.read("#{current_path}/log/development.log")

file_content.scan(/Started GET[\s\S]*?Completed.*/).each do |val|
  arr = []
  scan_reg = ""
  # gem 'activerecord-cause'を入れている場合
  if val.match(/.*Load.\(.*ms\)[\s\S]*?Load \(ActiveRecord::Cause\)[\s\S]*?.rb.*/)
    scan_reg = val.scan(/.*Load.\(.*ms\)[\s\S]*?Load \(ActiveRecord::Cause\)[\s\S]*?.rb.*/)
  else
    scan_reg = val.scan(/.*Load.\(.*ms\)[\s\S].*/)
  end

  next if scan_reg.empty?

  val2 = "#{val.slice(/\S*Controller*\S*/)}のクエリを#{scan_reg.count}件検知"
  print "\033[34m#{val2}\033[0m" # colorで出力

  # 取得したクエリの時間をarrに格納
  scan_reg.each do |val|
    # gem 'activerecord-cause'を入れている場合
    if val.match(/.*Load \(ActiveRecord::Cause\).*caused by/)
      val.gsub!(/.*Load \(ActiveRecord::Cause\).*caused by/, "  検知箇所:")
    end

    temp = val.slice(/\(\d?.*ms\)/)[1..-4]

    arr << [ temp.to_f, val ]
  end

  arr.sort! { |a, b| b[0] <=> a[0] }

  arr.each.with_index(1) do |val, ind|
    puts
    puts " \033[36m #{ind}:" + val[1] # colorで出力
  end
  puts
end

```

.bashrc, .zshrcに取り込んでもらえばどのRailsのプロジェクトでも使えるかと思います

```:.bashrc
function query_profiling() {
  filename="ファイル名"
  ruby $filename
}
```
長い正規表現を読みやすく管理する

正規表現はとても便利なツールですが、長いものを書いていくと、とたんに読みづらくなってきます。Rubyでは、そんなときに対応するための手段がいくつかあります。

# 区切り文字の変更
これは[以前に書きましたが](http://qiita.com/jkr_2255/items/c134a7a4f4d272238a3b#ruby)、スラッシュを含む文字列を検索したい場合には`%r@...@`のようにパーセントエンコードで書くと、`\/`のようにエスケープする必要がなくなります。

# 複数行で書く
これまた[詳しく説明してくださっている方がいらっしゃいます](http://qiita.com/scivola/items/04270095eb4c17ab8c92)が、正規表現のオプションとして`x`を付けると、「改行やスペースを無視する」「`#`から改行までをコメントとして扱う」ようになります。入れ子などの正規表現をインデントしつつ書けるようになって、見やすさも増します。

# 正規表現を式展開する
二重引用符の文字列リテラルと同様に、正規表現中でも変数展開が可能ですが、与えたものは`#to_s`で展開されます。

そして、[`Regexp#to_s`](https://docs.ruby-lang.org/ja/latest/method/Regexp/i/to_s.html)では、「返される文字列は他の正規表現に埋め込んでもその意味が保持されるようになっています」。

ということで、これを使えば要素ごとに正規表現を区分して、それを組み立ててより大きな正規表現を作っていけます。

# 具体例

ここでは、「HTMLの属性値が0個以上続いた後に、タグを閉じる`/>`あるいは`>`が来る」、という正規表現を考えてみます（これを`(?=)`で囲めば、「タグの中、属性の外」というアンカーとして使えます）。

まずは、HTML5の勧告に従って、要素文字列を定義しておきます。

```rb
# from HTML5 specification 2.4.1
SPACE_CHARACTER = /[ \t\r\n\f]/

# from HTML5 specification 8.1.2.3
ATTRIBUTE_NAME_REGEX = %r{(?>[^\x00'">/= \t\r\n\f]+)}
UNQUOTED_VALUE_REGEX = /(?>[ \t\r\n\f"'=<>`]+)/
QUOTED_VALUE_REGEX = /'.*?'|".*?"/m
```

あとは、これらを組み合わせて全体の正規表現としていきます。

```rb
IN_TAG_OUT_VALUE = %r{
  (?:#{SPACE_CHARACTER}*+
    #{ATTRIBUTE_NAME_REGEX}
    (?:
      #{SPACE_CHARACTER}*+
      =#{SPACE_CHARACTER}*+
      (?:#{UNQUOTED_VALUE_REGEX}|#{QUOTED_VALUE_REGEX})
    )?
  )*
  #{SPACE_CHARACTER}*+/?>
}x
```

さて、この正規表現をバカ正直に書くとどうなるでしょうか。

```rb
/(?:[ \t\r\n\f]*+(?>[^\x00'">\/= \t\r\n\f]+(?:[ \t\r\n\f]*+=[ \t\r\n\f]*+(?:(?>[ \t\r\n\f"'=<>`]+)|'.*?'|".*?"))?)[ \t\r\n\f]}*+\/?>)/m
```

…確実に読む気がしませんし、間違いがあっても多分気づきません。
Vagrant と Virtualbox

###Vagrant Virtualbox で出来ること
1.実行環境を開発と本番で揃えたい
2.開発環境を構築する際に個人のローカル環境に依存しないようにしたい
3.すぐに使える仮想環境を構築したい
4.環境構築を自動化したい。
5.チームで同一の環境を簡単に構築したい

※
1 2 は Virtualbox だけでもできる
3 は、Vagrant　で便利。公開されているBoxファイルを使えばコマンド一つでダウンロードできる。
4 Chefなどの構成管理ツールを使い環境構築を自動に出来る。
5 ネットワーク上にあるBoxファイルを共有することが容易なので、簡単にチームで同一環境を構築できる

###Vagrant
vagrantは開発環境の構築と共有を簡単に行うためのツール(ソフトウェア)。
VM(仮想マシン)を起動する際に、仮想化ソフトウェア ( プロバイダとも呼ぶ ) を選択できる。
アプリケーションやシステム開発のバックエンドを簡単にパッケージ化するツールであり
このパッケージ化された環境を「box」という単位で管理します。
Vagrant は VirtualBox などのソフトウェアのフロントに立つソフトウェア。
仮想マシンの設定をファイルに書き込むと、設定での再利用がしやすい。どこでも同じ環境を複製できる。
つまり、Vagrant を使って構築される仮想マシンは、VirtualBox や VMwereで構築される仮想マシンは、なんら変わりありません。
Vagrant自体には、仮想化に関する機能は搭載されていないので、仮想マシンソフトが必要。


###VirtualBox
vagrantでは、仮想マシンとしてVirtualBoxを利用する。
virtuakboxはvagrantのプロバイダのことを指し。、agrantが利用できるプロバイダは他にもある。
つまり、Virtualboxというプロバイダを利用して、Vagrant環境を構築することとなる。
Vagrant環境は、他のプロバイダにも使える。


例えるなら、
VirtualBox が「野球場」であり、
Vagrant が、チームごとの「マネジャー」になります。
VirtualBox があれば、どこでも仮想環境を構築することができるけど、
Vagrant があれば、チームメンバーのコンディション(仮想環境)を
管理・把握した上で、同じ開発環境を構築することができます。

具体的にはネットワークの設定や割り当てる容量など。
Vagrantなしで、Virtualboxのみで構築すると、毎回、ネットワークの設定から、割り当てるメモリやなどの容量も設定しなくてはならない。vagrantを使い、vagrantfileに常に同じものを記述していることにより、vagrant up というコマンド一つで、常に同じ環境が構築できます。
tig でstagingされた変更を表示しながらcommit logを編集したい

最初tigで設定しようと考えたが、git commitも-vがデフォルトであったほうが自分の場合良いので、git configで対応した。git version 2.9からはgit commit -v をデフォルトにする方法がある。

```sh:
$ git config --global commit.verbose true
```

これでtigからcommitする際にも-vが有効になる。
RailsのActionMailerでGmailを使ったらNet::SMTPAuthenticationErrorが出た

# 概要

Railsからメールを送信する機能を作る必要があったので
ActionMailerでGmailを使ってメールを送ろうとしてみました。
そしたらUserNameもPasswordも合ってるのにNet::SMTPAuthenticationErrorが出たので
対策を残しておきます。

## 2段階認証でアプリ パスワードを発行

以下のリンクから2段階認証を有効後、アプリパスワードを発行します
https://myaccount.google.com/security#signin

![スクリーンショット 2016-09-26 22.26.27.png](https://qiita-image-store.s3.amazonaws.com/0/35462/cedc7008-98d7-0be4-243b-6b5c42b47a1a.png)

適当に生成したら、そのパスワード(16文字)をコピーして環境変数に入れました。

```bash:~/.zshrc
export MAIL_ADDRESS='メールアドレス'
export MAIL_PASSWORD='さっきコピーしたアプリパスワード'
```

## 環境変数を使って直接指定したらダメ！

最初は以下のように書いていました。

```ruby:config/environments/development.rb
config.action_mailer.smtp_settings = {
    enable_starttls_auto: true,
    address: 'smtp.gmail.com',
    port: '587',
    domain: 'gmail.com',
    authentication: 'plain',
    user_name: ENV['MAIL_ADDRESS'],
    password: ENV['MAIL_PASSWORD']
  }
```

そこで以下のように変更。。。

```ruby:config/environments/development.rb
# 一旦変数に入れておく
mail = ENV['MAIL_ADDRESS']
pass = ENV['MAIL_PASSWORD']

config.action_mailer.smtp_settings = {
    enable_starttls_auto: true,
    address: 'smtp.gmail.com',
    port: '587',
    domain: 'gmail.com',
    authentication: 'plain',
    user_name: mail,
    password: pass
  }
```

なんで直接指定したら動かないんだろう。。。
何かわかることがありましたら教えてください。
(もしかしたら僕だけに発生した問題かもしれないけど)
GCMを使ってみた

Push 通知のテストを使ってみたかったので確認した時のメモ。

[Try Cloud Messaging for Android](https://developers.google.com/cloud-messaging/android/start)

[googlesamples/google-services](https://github.com/googlesamples/google-services)

# 前提

以下を実行し、AndroidStudioやEmulatorの設定済み


# やってみる

サンプルソースコードをダウンロード

```bash
$git clone https://github.com/googlesamples/google-services.git
```

AndroidStudioを起動し、File->Openと選択後、先程cloneしたGitのパス配下のgoogle-services/android/gcmを選択します。

# google-services.jsonの作成

GCMの設定ファイルであるgoogle-services.jsonを作成します。

[Androidプロジェクトの新規作成からプッシュ通知受信確認まで](http://qiita.com/kwmt@github/items/6f81eaa9d0abe9c5fa96)

AppName->GCMTest
AndroidPackageName->gcm.play.android.samples.com.gcmquickstart

指定後、以下のような画面が表示されるので、GCMでEnableにする

![スクリーンショット 2016-09-26 10.29.49.png](https://qiita-image-store.s3.amazonaws.com/0/20193/44de31f1-1193-f124-47b4-4480c8aebfad.png "スクリーンショット 2016-09-26 10.29.49.png")

画面下部に表示されるServerAPIKey及びSenderIDをメモする。
また、Generate configuration filesを選択し、jsonファイルをダウンロードします。

ダウンロード後、google-services/android/gcm/app/配下にjsonファイルを配置します。

ファイルコピー後、Build->Rebuild Projectを選択するとビルドが成功するかと思います。

# コードの変更

GcmSender.javaに先程メモしたServerAPIKEYを指定します。

```GcmSender.java
    public static final String API_KEY = "API_KEY";
```
 	
# 実行してみる

```bash
$./gradlew run -Pmsg="poyo"
Incremental java compilation is an incubating feature.
:gcmsender:compileJava UP-TO-DATE
:gcmsender:processResources UP-TO-DATE
:gcmsender:classes UP-TO-DATE
:gcmsender:run
{"message_id":xxxxxx}
Check your device/emulator for notification or logcat for confirmation of the receipt of the GCM message.

BUILD SUCCESSFUL

Total time: 10.748 secs
```

あれー、メッセージIDは返却されてているのにエミュレーター側が何も変わらない。。
試しにSenderIDに変更しても駄目。。。
うーむ、GCMサーバーからは成功が返却されているのでAndroidアプリが悪いのか!?とはいってもjson配置しただけだしなぁ。。。

エミュレーターでなく、実機でやったら成功しました。
むー、Google APIを選んでいるし、エミュレーターでもできそうな気がするけどなぁ。。。
Java MavenでStackOverflowError

JavaをMavenでビルドした際に、StackOverflowErrorが発生したときの解決方法をメモ。

- エラー内容

```
[ERROR] システム・リソースが不足しています。
[ERROR] 詳細は次のスタック・トレースで調査してください。
[ERROR] java.lang.StackOverflowError
```

- 原因
これは初めから予測はついていた。他システムと連携するAPI関連のモジュールクラスが5万ステップに達するほど大きかったため。コードをなんとかするのが一番きれいな解決策だが、そうできない事情があったため今回は以下で対応

- 対応
2つの対応方法があります。
  - 対応方法1  
MAVENの環境変数でビルド時のStackサイズを増やす。  
```SET MAVEN_OPTS=-Xms256m -Xmx1024m -Xss2048k```  
**-Xss2048k**でStackサイズを指定しています。

  - 対応方法2  
pom.xml内でStackサイズをセットする。  
**※compilerArgsはmaven-compiler-plugin3.1以降で対応です**

```pom.xml
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<fork>true</fork>
<compilerArgs>
  <arg>-J-Xss2048k</arg>
</compilerArgs>
```


Pull request の作成

# Pull request の作成ページへ移動

* Web ブラウザで GitHub 上の、Pull request を作成するリポジトリのページを開く。

![WS000063.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/dc9e9dec-cae8-0b85-eb5c-53238fdd4dbe.jpeg)

* `Pull requests` タブを開く。
* `New pull request` をクリックする。

![WS000064.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/b6329261-23ce-95e1-4b03-560efae83313.jpeg)


# 比較するブランチを決める
![WS000065 - コピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/066cc7a8-ebb4-0b8b-c1be-d7a66719ab51.jpeg)

| 項目 | 説明 |
|:-----|:-----|
| base | 元になるブランチ（変更を流し込まれる側） |
| compare | 比較対象のブランチ（今回の変更の入ってる側） |

ブランチが決まったら『Create pull request』をクリック。

# Pull request の設定を行う

![WS000071.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/b4610c65-392a-1f3c-a3ea-907899c29703.jpeg)


| 項目 | 説明 |
|:-----|:-----|
| Title | Pull request のタイトルを書く |
| Leave a comment | Pull request の詳細 |
| Labels | Pull request にラベルを付ける |
| Millestone | Pull requeset にマイルストーンを付ける |
| Assignees | Pull request を見てほしい人を指名する |

詳細設定が完了したら『Create pull request』をクリック。
ブランチ操作 - SourceTree

# ローカルでのブランチ操作

## ブランチを作成する

SourceTree のツールバーにある『ブランチ』をクリック。

![WS000040.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/7f36ad86-f392-8b80-8009-7db8fd309402.jpeg)

出てきた『ブランチ』ダイアログに必用な情報を入力する。

![WS000041.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/3cf9eb87-bfe8-5732-2ab1-ea8e7dcb9908.jpeg)

| 項目 | 説明 |
|:-----|:------|
| 新規ブランチ | 新しく作成するブランチ名 |
| コミット | 新しいブランチの起点となる位置。<br/>現在の状態からの場合は『作業コピーの親』を選択。<br/>特定のコミットの続きに作りたい場合は『特定のコミット』を選択する。 |
| 新規ブランチを作成してチェックアウト | 新しいブランチを作成した後にそのブランチに切り替えるならチェックする。 |


## ブランチを切り替える

SourceTree 画面左側のツールボックスの『ブランチ』で、切り替えたい先のブランチ名をダブルクリックする。

* 現在のブランチは太字で強調表示される。

![WS000042.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/059eba78-dd87-63bd-2966-8e0059e468cc.jpeg)


## ローカルのブランチを削除する

1. SourceTree 画面左側のツールボックスの『ブランチ』から、削除したいブランチを右クリック
1. コンテキストメニューから『[ブランチ名] を削除』を実行する。

![WS000043.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/49401579-da43-a7a4-044c-23ca83267589.jpeg)


# リモートとのやり取り

## リモートにあるブランチを取得して切り替える

* リモートリポジトリにはあるが、ローカルリポジトリには無いブランチを取得して切り替える。
* SourceTree 画面左側のツールボックスの『リモート』から、対象となるリモートリポジトリを選択し（多くの場合は `origin`）、取得するブランチを右クリック
* コンテキストメニューの『[リモート名]/[ブランチ名] をチェックアウト...』を実行

![WS000044.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/e5d342bb-1750-d703-f16e-442b6d848443.jpeg)

出てきた『チェックアウト』ダイアログに必用な情報を入力する。

![WS000046.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/99521a33-2c76-3b52-1ab1-61bd9972dc74.jpeg)

| 項目 | 説明 |
|:-----|:-----|
| チェックアウトするリモートブランチ | 今回取得するリモートブランチ |
| 新ブランチ名 | 取得するブランチのローカルでのブランチ名 |

通常はそのまま『OK』で問題ない。


## リモートにあるブランチを削除する

* SourceTree 画面左側のツールボックスの『リモート』から、対象となるリモートリポジトリを選択し（多くの場合は `origin`）、取得するブランチを右クリック
* コンテキストメニューの『[リモート名]/[ブランチ名] を削除』を実行

![WS000045.JPG](https://qiita-image-store.s3.amazonaws.com/0/28936/b82b5233-80a0-1430-50d7-03fe4518cb6f.jpeg)
アジャイル開発時におけるプロジェクトの進め方（その4）

# アジャイル開発におけるプロジェクトの進め方
アジャイル開発において、色々悪い意味で誤解をしている方々が沢山いるので、
アジャイル開発をした事が無い方々の指針になればと思い書いております。

その1については下記を参照の事
[アジャイル開発時におけるプロジェクトの進め方（その1）](http://qiita.com/sinaku-developer/items/bd74bde161b640b75b70)

その2については下記を参照の事
[アジャイル開発時におけるプロジェクトの進め方（その2）](http://qiita.com/sinaku-developer/items/816ddb7a7b256a883fe9)

その3については下記を参照の事
[アジャイル開発時におけるプロジェクトの進め方（その3）](http://qiita.com/sinaku-developer/items/b88bff45155d12e24889)

## プロダクトバックログのメンテナンス

一番はじめの頃のプロダクトバックログは、大まかな機能や実装したい内容が書かれていると思います。
初めの頃は、先を見通そうとしても、見通せないので、ストーリーの粒度は大きなものになると思います。

しかしながら、プロジェクトが進んでいくにつれて、仕様が明確になってくるものが都度あります。
プロダクトオーナーは、その都度、プロダクトバックログのメンテナンスを行い、内容をより詳細化し、優先度をつけ直す必要があります。

例をあげます。

一番最初は、以下のようなストーリーがあったとします。

- ユーザーのログインをする為に、ユーザー登録を行いたい

プロジェクトが進行し、詳細なユーザーというものについても顧客とすり合わせができました。
その際オープンIDでのログインユーザーも認めるため、ユーザーは自分たちのアプリ側で管理するものと、外部のオープンIDでログインするユーザーがいる事が判明しました。
そうすると、プロダクトバックログは、以下のように分割されていきます。

- ユーザーのログインをする為に、ユーザー登録を行いたい
 - 自サイトで登録するユーザーの管理を行いたい。
 - オープンIDで登録するユーザーの管理を行いたい。

当然オープンIDについて、何処のものを使うか等、さらに顧客と詳細が詰められれば、
今後さらにプロダクトバックログは分割されるでしょう。

プロダクトオーナーの中には、以下のような勘違いをしている方々が多いです。
「一度作ったプロダクトバックログは普遍であり、メンテナンスはしないです。」

**そんな事はありえません。**

機能の詳細がわかり、ユーザーストーリーの一部として落とし込めるようになったものは、随時落とし込んでいき、再度プロダクトバックログとして全体の優先順位を考慮するのです。

逆に、機能の詳細が随時わかってきているにも関わらず、プロダクトバックログのメンテナンスをしないプロダクトオーナーがいるのであれば、それはもはや自分の仕事を何処かに放り投げている状態です。

## 仕様について誰が抑えるべきか

回答からいいます。

**プロダクトオーナーが全ての仕様を知っている状態でなければいけません。**

これは新規の開発案件にしろ、既存の改修案件にしろです。

そもそも、プロダクトオーナーは、製品に対しての最終責任者で、それをビジネスとしてどう価値あるものとして提供するかの最終的な意思決定を行う人間です。

この人間が、製品の詳細がどうなっているかわからないなんて事は、ありえないのです。

しかしながら、現実的な問題として、製品の規模が大きい場合、プロダクトオーナー一人で仕様を把握出来るかと言われると、不可能なパターンもあります。

この場合は、プロダクトオーナーが、仕様調査が必要である事をチームメンバーに説明し、
スプリント0として、ある程度のクリティカルな仕様を洗い出し、調査する必要があるでしょう。

逆に一番やってはいけないのは、プロダクトオーナーが以下のような認識でいる場合です。
「仕様はわからないから、実装担当にまかせるよ。」

もはや、プロダクトオーナーとして役に立っていません。

製品の仕様をバラバラに確認し始めると、当然仕様として、不整合が起こった場合の調整すらもチームメンバーの担当機能単位で話し合う必要があります。

そんなバカげたことがまかり通るはずが無いのです。

もう一つの方法が、人数的に余裕があれば、チームを2つに分割し、プロダクトオーナーを二人にして、機能単位で、チームを別々に動かす方法です。

これであれば、使用調整は、プロダクトオーナー同士で行うので、チーム単位での実作業の優先順位等は、それが反映されている物として実装が行えます。

必ず意識する必要があるのが、プロダクトオーナーが仕様を抑える必要がないから、
直近の作業予定しか確認しないアジャイル開発ではないのです。

プロダクトオーナーが製品に対して責任を持つのであれば、その製品の利用方法についてもプロダクトオーナーは理解して、それをチーム内のメンバーに伝える事は当たり前の事であり、プロダクトバックログとならぶ最重要となるプロダクトオーナーの仕事なのです。

ここを勘違いしていると、そもそも物が出来上がってこなくなり、チーム内でも何がどうなってるのかわけがわからない状態になります。
パーセント（%）とポイント（pt）

最近、パーセント（％）とポイント（pt）が混同されて使われている事が多い。
NHKや大手新聞はほぼ正しく使い分けているが、民放はかなり怪しい。

有名コンサルが作成した資料でも、正しく使い分けられていないと非常に残念な感じがする。
それだけで、資料の質も疑いたくなるレベル…。

例えば、内閣支持率（別に視聴率でも良い）が20%から25%に上昇したとする。
この場合、内閣支持率は**5ポイント**上昇したことになる。**5パーセント**上昇は間違え。
5パーセント上昇したとなると、20%の5パーセントだから1ポイント上昇（20%→21%）したことになる。

機械学習の分野では精度を適合率や再現率などで表現することが多いが、パーセント（％）とポイント（pt）の違いは気を付けておいた方が良い。
テスト用iOSアプリの配布方法

記事の内容はこちらを参照してください。
https://mishimay.github.io/47f7680014fc6141f5c4/
<!--

ドッグフーディングなどでアプリ公開前にアプリを配布したいとき、どのような方法を採択すべきかの検討に使えるように各種特徴を表にまとめました。

なお、2016年9月時点での情報です。

| | Ad Hoc | エンタープライズ | TestFlight 内部テスト | TestFlight 外部テスト |
| -------- | --- | --- | --- | --- |
| 料金     | 99ドル/年 (Apple Developer Program) | 299ドル/年 (Apple Developer Enterprise Program) | 99ドル/年 (Apple Developer Program) | 99ドル/年 (Apple Developer Program) |
| 配布方法 | - 自前サーバに置く[[1]] <br> - 端末をMacに接続し、iTunesを使ってipaファイルをインストール[[1]] <br> - DeployGateやFabricなどの配布サービス | - _Ad Hoc と同様の方法_ <br><br> - MDM利用 | iTunesConnectにアップロードして、TestFlightアプリからインストール | _内部テストと同様の方法_ |
| 事前準備 | 端末のUDIDを登録 | (自前サーバに置く場合) <br> サーバアクセス時の認証用パスワードを周知 | - 端末にTestFlightアプリをインストール <br> - iTunesConnectでテスト対象者に開発者権限以上の権限を与える | - 端末にTestFlightアプリをインストール <br> - iTunesConnectでテスト対象者のメールアドレスを追加 |
| 上限     | 100端末 | なし | 25ユーザ[[2]] | 2000ユーザ[[2]] |
| 有効期限 | Provisioning Profile の期限が切れるまで (最大1年) | Provisioning Profile の期限が切れるまで (最大1年)[[3]] | 60日[[2]] | 60日[[2]] |
| 審査     | 不要 | 基本的には不要[[4]] | 不要 | **必要** (ただし普通の審査よりも早くて緩い) |
| UUID管理 | **必要** | 不要 | 不要 | 不要 |
| 備考     | | - 法人のみ <br> - 関係者以外にインストールされないよう管理が必要 | iTunes Connect へのアップロードに30分ほど時間がかかる | _内部テストと同様_ |


# 参考

1: [Exporting Your App for Testing (iOS, tvOS, watchOS)][1]
2: [TestFlight Beta Testing (Optional)][2]
3: [\[iOS\] Apple Developer Program と Apple Developer Enterprise Program の違い ｜ Developers\.IO][3]
4: [iOSDeveloperProgram Enterprise版 Tips - Qiita][4]
5: [iOSライセンス＆配布方法まとめ - Qiita][5]
6: [TestFlightにおける内部テスターと外部テスターの比較と使い分け - Qiita][6]


[1]: https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/TestingYouriOSApp/TestingYouriOSApp.html
[2]: https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/BetaTestingTheApp.html#//apple_ref/doc/uid/TP40011225-CH35
[3]: http://dev.classmethod.jp/smartphone/difference-between-developer-and-enterprise-program/
[4]: http://qiita.com/nofrmm/items/0b6b6ae82c0a1743141d
[5]: http://qiita.com/isaac-otao/items/126bced83d9af86c7ce5
[6]: http://qiita.com/koyopro/items/323e457cc39a75534aae







-->
Powershellで全引数引き渡し

shellscriptの$@（全引数引き渡し）みたいなことをやりたくて書いてみたテストコード
一応できたけど、もう少しスマートなやり方がないかな

```powershell:test.ps1
function test($a,$b){
   Write-Host "a:${a}"
   Write-Host "b:${b}"
   foreach($arg in $args){
      Write-Host $arg
   }
}
Invoke-Expression "test $($args -Join " ")"
```
```
. .\test.ps1 1 2 3 4
a:1
b:2
3
4
```
railsで404や500といったエラーを捕捉（エラーハンドリング）するには？



### 参考: http://ruby-rails.hatenadiary.com/entry/20141111/1415707101

- 適切なエラー処理の仕方が書いてある
- 500エラー用Viewもサンプルで書いてある
- 以下コード一部抜粋

```app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  # 他のエラーハンドリングでキャッチできなかった場合に
  # 500 Internal Server Error(システムエラー)を発生させる
  # NOTE: rescue_from は下から評価されるので記載箇所はここが正解
  rescue_from Exception, with: :handle_500 unless Rails.env.development?

  # 例外に合わせたエラーハンドリング
  # 404 Not Found リソースが見つからない。アクセス権がない場合にも使用される
  rescue_from ActionController::RoutingError, with: :handle_404 unless Rails.env.development?
  rescue_from ActiveRecord::RecordNotFound,   with: :handle_404 unless Rails.env.development?
  #rescue_from ActiveRecord::RecordNotUnique, with: :render_409
  #rescue_from UnauthorizedError,             with: :render_401
  #rescue_from IllegalAccessError,            with: :render_403

  # エラーハンドリング処理
  def handle_500(exception = nil)
    logger.info "Rendering 500 with exception: #{exception.message}" if exception

    if request.xhr?
      # Ajaxのための処理
      render json: { error: '500 error' }, status: 500
    else
      render template: 'errors/error_500', status: 500, layout: 'application', content_type: 'text/html'
    end
  end

  def handle_404(exception = nil)
    logger.info "Rendering 404 with exception: #{exception.message}" if exception

    if request.xhr?
      # Ajaxのための処理
      render json: { error: '404 error' }, status: 404
    else
      render template: 'errors/error_404', status: 404, layout: 'application', content_type: 'text/html'
    end
  end

end
```

---

### 他参考

- [どうも思った通りにrescue_fromが例外を捕まえないと思ったらrescue_fromの走査は下から上だった。](http://qiita.com/ms2sato/items/249ec3aa186dd42176fb)
- [RailsでAPIをつくるときのエラー処理 - Qiita](http://qiita.com/r7kamura/items/2e88adbdd1782277b2e7) ←とても参考になる★★★
- 議論「どこにエラー処理を書くか？」： [Railsでエラー処理を共通化する | 株式会社ランチェスター](http://www.lanches.co.jp/blog/3050)

### エラー通知用Webサービス（Rails）

[Airbrake](https://airbrake.io/)

>- エラー通知用のウェブサービス Airbrake の ruby 用プラグイン airbrake
>- airbrakeの良い点
>  - exception_notification とは違い同種のエラーであれば複数回発生しても通知は一回だけ送られる
>  - web上にエラー内容がまとまってくれる
>- ただ値段に見合っているかはちょっとわからないです。
>
>*http://blog.willnet.in/entry/2012/10/21/160240*

![image](https://qiita-image-store.s3.amazonaws.com/0/17342/591eec2c-72bc-69db-4b66-14851ad58e6d.png)
導線設計について考える 


Webサイトの導線設計について考えるフロー

## AIDMA

広告宣伝に対する消費者の心理プロセスを示したもの。

- Attention（注意）
- Interest（関心）
- Desire（欲求）
- Memory（記憶）
- Action（行動）

電通の提唱するAISASというのもあり、こちらは購買の後にshareが来るのが興味深い。

- Attention（注意）
- Interest（関心）
- Search（検索）
- Action（購買）
- Share（情報共有）

これをReachの広がりと、Engagement の深さの二軸で考える Dual AISASなんてものもあるらしい。


## IUCOF

とはいえ、今はマーケティングの話ではなく、あくまでWebサイトの導線設計についての考察なのでもう少し単純化して考える。

下記のサイトではAIDMAをWebサイト向けに拡張したIUCOFという概念が紹介されていた。

http://homepage.aluha.net/column-wp/archives/1193

- Interrest(興味付け) 商品・サービスにたいして興味・関心を抱く段階
- Understanding(理解促進) 商品・サービスの概要を理解する段階
- Conviction(確信) 商品・サービスの良さを確信してもらう段階
- Offer(行動促進) 商品・サービスについてもっと知りたいと思ってもらう段階
- Form(行動) 商品・サービスに対して問い合わせを行う段階

このあたりをベースにサイトページ各部を割り振っていくと不足するページ等が見えやすくわかりやすい。

サイトマップやナビゲーションもIUCOFをベースに割り振ってやるとユーザの関心に沿ったナビゲーションになりやすいとのこと。
terraformでsubnetにroute_tableをマッピングする


知っている人には、当然のことかもしれないがterraformでaws環境を作っていてネットワーク周りではまった(中々見つけられなかった)事があったのでメモ。

##やりたい事

- [x] public_subnetをterraformで作りたい


##VPC RESOURCE達

terraformが提供しているVPC RESOURCEで最低限のネットワーク環境を作成するのに必要なのは下記かと思う。

|RESOURCE|用途|
|---|---|
|aws_vpc|VPC作成|
|aws_internet_gateway|インターネットゲートウェイ作成(vpc指定)|
|aws_route_table|ルーティングテーブルを作成(vpc指定)|
|aws_subnet|サブネット作成(vpc指定)|

##ハマったとこ

上記の各々のリソースを作成するといい感じにEC2のインスタンスに紐付けるサブネットが出来る。(5行目で指定するsubnet_id)

```
1 resource "aws_instance" "fluentd-st" {
2   ami = "ami-374db956"
3   instance_type = "t2.micro"
4   key_name = "xxx_publickey"
5   subnet_id = "${aws_subnet.log-subnet.id}"  ###ここで指定する
6   vpc_security_group_ids = ["${aws_security_group.allow_ssh_es.id}","${aws_security_group.allow_forward_log.id}" ]
7   associate_public_ip_address = "true"
8   tags {
9     Name = "st-log"
10   }
11 }
```

自分の中で勝手に作成したsubnetに対して、route_tableがあたっていると思いこんでいてEC2をpublic_ipつきで起動したのにsshできないぞ、あれなんでだと悩んだ。。

###GUIで作っている時は、subnetに対して、publicかprivateかを意識して作っていたんだが、新しいツール使ってたってのもあってその関連付けのところが丸々頭から抜けていたという話。。。

##解決策

###aws_route_table_associationを使って、subnetに対して、route_tableのマッピングをしてあげる。(35行目からの部分がないと作られたprivate_subnetとして同一vpc内しか通信が出来ない。。)

```
  1 resource "aws_vpc" "xxxvpc" {
  2   cidr_block = "10.0.0.0/16"
  3   tags {
  4     Name = "xxxvpc"
  5   }
  6 }
  7
  8 resource "aws_internet_gateway" "main-gw" {
  9   vpc_id = "${aws_vpc.xxxvpc.id}"
 10   tags {
 11     Name = "internet-gw"
 12   }
 13 }
 14
 15 resource "aws_route_table" "r" {
 16   vpc_id = "${aws_vpc.xxxvpc.id}"
 17   route {
 18     cidr_block = "0.0.0.0/0"
 19     gateway_id = "${aws_internet_gateway.main-gw.id}"
 20   }
 21
 22   tags {
 23     Name = "xxx-routing-table"
 24   }
 25 }
 26
 27 resource "aws_subnet" "abc-subnet" {
 28   vpc_id = "${aws_vpc.xxxvpc.id}"
 29   cidr_block = "10.0.1.0/24"
 30   tags {
 31     Name = "abc-subnet"
 32   }
 33 }
 34 
 35 resource "aws_route_table_association" "a" {
 36   subnet_id = "${aws_subnet.abc-subnet.id}"
 37   route_table_id = "${aws_route_table.r.id}"
 38 }
```

新しいツール使うと色々ハマるし忘れるので、ちゃんとメモしとくのが大事。


##参照

https://www.terraform.io/docs/providers/aws/r/route_table_association.html