OmniAICreator/Qiita-1.07M huggingface dataset:
macOS SierraでKarabiner-Elementsのdevicesが認識されなかったのでいろいろ調べて解決した


SierraにKarabiner-Elementsをインストールしてもdevicesが認識されなくてこまっていました。
devicesというのは以下のことです。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/b7e5a0be-2c5f-f9a6-f99a-cbaa961146dd.png)

# 解決方法

[WinK Pro](http://www.trinityworks.co.jp/software/WinKPro/index.php?menu=install)というのがインストールされていたためそれを削除すればいい

# 削除方法

```
sudo rm -rf /Library/Extensions/WinKPro.kext
sudo rm -rf /Library/PreferencePanes/WinKPro.prefPane 
```
Jetty v8 on CentOS7

# まえがき
Tomcatより軽量かつ高速なことで有名なJettyをCentOS7上でyumなしで構築するときのメモ
サービスの再起動とかも爆速で終わるので個人的には本当に好き。(Tomcatは下手すりゃ5分とかかかったりする)

# 前提
* CentOS7.3を想定
* OpenJDKではなく、OracleオリジナルのJDKを使用
* Jettyはyum経由でインストールするのではなく、公式から落としたアーカイブから個別にインストールする

# 構築作業

## 下準備
jettyユーザを追加(ユーザ名は何でも良いがわかりやすく)

```
[root@localhost ]# useradd jetty
[root@localhost ]# passwd jetty
```


## Javaインストール
下記URLからJDKのrpmをダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
※agree押したりなどする必要があるのでwget/curlで持ってくるのが厳しい

落とした.rpmを対象サーバに持っていく
※私の場合は自PCに落として、対象サーバにsftpで持っていきました

```
[root@localhost ]# yum localinstall jdk-8u111-linux-x64.rpm
# rootとjettyの.bash_profileに export Java_HOME=/usr/Java/jdk1.8.0_111/jre/ を追記
```

## Jettyインストール

jetty公式から落としてきて解凍 => オーナ/グループ変更
以下の例では、/optに配置しているが、どこでもお好みのパスでどうぞ。

```
[root@localhost ]# wget http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/8.1.21.v20160908/jetty-distribution-8.1.21.v20160908.tar.gz
[root@localhost ]# tar xzvf jetty-distribution-8.1.21.v20160908.tar.gz
[root@localhost ]# mv jetty-distribution-8.1.21.v20160908 /opt/jetty
[root@localhost ]# cd /opt
[root@localhost /opt]# chown -R jetty:jetty jetty
```

# systemdへサービスの登録
yumでは自動的にやってくれるこの辺も手動で作る/登録する必要あり

```
[root@localhost /opt]# vim /usr/lib/systemd/system/jetty.service
[Unit]
Description=Jetty Application Containar

[Service]
Type=simple
EnvironmentFile=-/opt/jetty/etc/jetty-env
PIDFile=/opt/jetty/jetty.pid
User=jetty
Group=jetty
ExecStart=/opt/jetty/bin/jetty.sh start
ExecReload=/opt/jetty/bin/jetty.sh restart
ExecStop=/optjetty/bin/jetty.sh stop

StandardOutput=null

[Install]
WantedBy=multi-user.target

[root@localhost /opt]# systemctl daemon-reload
```


## firewalld用に新規サービスの登録(オプション)
検証目的などで、firewalldを使用しないならスキップしてOK

```
[root@localhost ]# vim /usr/lib/firewalld/services/jetty.xml

<service>
  <short>WWW (HTTP-jetty)</short>
  <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="8080"/>
</service>

[root@localhost ]# systemctl restart firewalld
[root@localhost ]# firewall-cmd --add-service=jetty --zone=public --permanent
success
[root@localhost ]# systemctl restart firewalld
```

# 動作確認
まずはJettyを起動させる。
また、OS起動時に自動的にサービスが立ち上がるようにもしておく。

```
[root@localhost ]# systemctl enable jetty
[root@localhost ]# systemctl start jetty
[root@localhost ]# systemctl status jetty
[root@localhost ]# ss -nat | grep 8080
LISTEN     0      100                      :::8080                    :::*
```

Webブラウザでhttp://[ip_addr]:8080にアクセスして、jettyのトップページが表示されたらOK
Tomcat v8 on CentOS7

# まえがき
Javaアプリケーションサーバとして、みんな大好きなTomcatをCentOS7上でyumなしで構築するときのメモ。
特に理由がない限り、yum使うほうが全然早いと思います。

# 前提
* CentOS7.3を想定
* OpenJDKではなく、OracleオリジナルのJDKを使用
* tomcatはyum経由でインストールするのではなく、公式から落としたアーカイブから個別にインストールする

# 構築作業

## 下準備
tomcatユーザを追加(ユーザ名は何でも良いがわかりやすく)

```
[root@localhost ]# useradd tomcat
[root@localhost ]# passwd tomcat
```


## Javaインストール
下記URLからJDKのrpmをダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
※agree押したりなどする必要があるのでwget/curlで持ってくるのが厳しい

落とした.rpmを対象サーバに持っていく
※私の場合は自PCに落として、対象サーバにsftpで持っていきました

```
[root@localhost ]# yum localinstall jdk-8u111-linux-x64.rpm
# rootとtomcatの.bash_profileに export JAVA_HOME=/usr/Java/jdk1.8.0_111/jre/ を追記
```

## tomcatインストール

tomcat公式からバイナリを落としてきて解凍 => オーナ/グループ変更
以下の例では、/optに配置しているが、どこでもお好みのパスでどうぞ。

```
[root@localhost ]# wget http://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-8/v8.5.6/bin/apache-tomcat-8.0.39.tar.gz
[root@localhost ]# tar xzvf apache-tomcat-8.0.39.tar.gz
[root@localhost ]# mv apache-tomcat-8.0.39 /opt/tomcat
[root@localhost ]# cd /opt/
[root@localhost ]# chown -R tomcat:tomcat tomcat
```

## systemdへサービスの登録
yumでは自動的にやってくれるこの辺も手動で作る/登録する必要あり

```
[root@localhost ]# vim /etc/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat 8
After=network.target

[Service]
User=tomcat
Type=forking
EnvironmentFile=/etc/sysconfig/tomcat
KillMode=none
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target



[root@localhost ]# vim /etc/sysconfig/tomcat

Java_HOME="/usr/Java/jdk1.8.0_111/jre/"
Java_OPTS="-DJava.security.egd=file:/dev/./urandom"

[root@localhost ]# systemctl daemon-reload

```

## firewalld用に新規サービスの登録(オプション)
検証目的などで、firewalldを使用しないならスキップしてOK

```
[root@localhost ]# vim /usr/lib/firewalld/services/tomcat.xml

<service>
  <short>WWW (HTTP-tomcat)</short>
  <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="8080"/>
</service>

[root@localhost ]# systemctl restart firewalld
[root@localhost ]# firewall-cmd --add-service=tomcat --zone=public --permanent
success
[root@localhost ]# systemctl restart firewalld
```

# 動作確認
まずはTomcatを起動させる。
また、OS起動時に自動的にサービスが立ち上がるようにもしておく。

```
[root@localhost ]# systemctl enable tomcat
[root@localhost ]# systemctl start tomcat
[root@localhost ]# systemctl status tomcat
[root@localhost ]# ss -nat | grep 8080
LISTEN     0      100                      :::8080                    :::*
```

Webブラウザでhttp://[ip_addr]:8080にアクセスして、おなじみのtomcatのトップページが表示されたらOK
RedmineのREST API (PUT)でチケットを更新するExcel VBAのサンプル

# 概要

既存のRedmineチケットをREST API (PUT)経由で更新するExcelマクロ(VBA)のサンプル。

# コード

```vb

Option Explicit

Public Const REDMINE_URL As String = "http://myserver/redmine/"

Public Sub Test1()
    
    Dim requestStatus As String
    requestStatus = UpdateIssue( _
        1, _
        "94811293a201319fbaea04af5c0fd8a52b06c65f", _
        "説明の更新テスト", _
        "注記の追加テスト")
    MsgBox requestStatus

End Sub

Public Function UpdateIssue( _
    ByVal issueId As Integer, _
    ByVal apiKey As String, _
    ByVal description As String, _
    ByVal notes As String) As String

    Dim sendBody As Variant
    sendBody = "<?xml version=""1.0""?><issue>"
    If Len(Trim(description)) > 0 Then
        sendBody = sendBody & "<description>" & description & "</description>"
    End If
    If Len(Trim(notes)) > 0 Then
        sendBody = sendBody & "<notes>" & notes & "</notes>"
    End If
    sendBody = sendBody & "</issue>"
    
    Dim xmlHttp As New MSXML2.XMLHTTP60
    With xmlHttp
        .Open "PUT", REDMINE_URL & "issues/" & CStr(issueId) & ".xml?key=" & apiKey, False
        .SetRequestHeader "Content-Type", "text/xml"
        .Send sendBody
        UpdateIssue = CStr(.Status)
    End With
    Set xmlHttp = Nothing

End Function
```

# 補足

- 参照設定で「Microsoft XML, v6.0」を選択する必要がある。
![vba_references.png](https://qiita-image-store.s3.amazonaws.com/0/135864/c0d717be-37f3-425c-e5dd-ebd60b0faa16.png)

- このサンプルでは説明(description)の更新と注記(notes)の追加を試したが、それ以外のParametersも指定できるはず。
参考 http://www.redmine.org/projects/redmine/wiki/Rest_Issues#Updating-an-issue
jQuery で select タグに optgroup タグを追加する

### 参考
+ [jQuery で select タグに option タグを追加する](http://qiita.com/QUANON/items/5822f805d558ad078db3)
+ [【jQuery】セレクトボックスの選択要素を抽出](http://qiita.com/tomcky/items/8f1868f1fb963732de39)

### きっかけ
multipleなselectタグにoptgroupをappendしている参考になりそうなサイトが見つからず、optionと同じようにoptgroupをselectにappendするとグルーピングされず困りました。
たぶんoptgroupにoptionをappendしてからselectにappendしていけば平気だろうという予測のもと、試しました。

### サンプルソース
``` sample.html
<!DOCTYPE html>

<html>

<head>
    <title>sample</title>
    <meta charset="utf-8">
</head>

<body>
    <select id="my-list" size="12" multiple></select>
    <input id="my-btn" type="button" value="選択された要素を確認する">

    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="sample.js"></script>
</body>

</html>
```

``` sample.js
$(function() {

  $('#my-btn').on('click', function() {
    console.log($('#my-list').val());
  });

  generateSelectList();
});

function generateSelectList() {
  var $select = $('#my-list');

  //削除
  $select.empty();

  // optgroupとoptionを入れる配列
  var opts = new Array();
  // オプション
  opts.push($('<option>', { value: null, text: "title", disabled: true, selected: true }));

  // グループ1つ目
  var $optgroup = $('<optgroup>', { label: "group 1" });
  $optgroup.append($('<option>', { value: "11", text: "opt1" }));
  $optgroup.append($('<option>', { value: "12", text: "opt2" }));
  $optgroup.append($('<option>', { value: "13", text: "opt3" }));
  opts.push($optgroup);

  // グループ2つ目
  $optgroup = $('<optgroup>', { label: "group 2" });
  $optgroup.append($('<option>', { value: "21", text: "opt1" }));
  $optgroup.append($('<option>', { value: "22", text: "opt2" }));
  $optgroup.append($('<option>', { value: "23", text: "opt3" }));
  opts.push($optgroup);

  // 追加
  $select.append(opts);
}
```
サンプルなのでベタ書きです。すみません。

### 結果
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/86588/2bb3ed9c-e154-522a-e368-bc038b02cb66.png)

できました(∩´∀｀)∩
画像は、3つの要素を選んだところ。
jQueryの.val()を使うと、選択中optionのvalue配列が返ってきます。

``` console.log
["11", "13", "22"]
```

↓optgroupの閉じタグも、望みの位置に無事できているようです。

``` 生成されたElements（Chromeで確認）.txt
<select id="my-list" size="12" multiple="">
  <option disabled="disabled" selected="selected">title</option>
  <optgroup label="group 1">
    <option value="11">opt1</option>
    <option value="12">opt2</option>
    <option value="13">opt3</option>
  </optgroup>
  <optgroup label="group 2">
    <option value="21">opt1</option>
    <option value="22">opt2</option>
    <option value="23">opt3</option>
  </optgroup>
</select>
```

### 関係ない感想
GoとTypeScriptに慣れ始めると、JavaScriptの末尾;(セミコロン)書き忘れてブラウザにすごい回数叱られます。
初心者向け iTerm2のインストールと設定方法


## 概要
プログラミングを始めて使い始めるのが、ターミナルだと思います。

しかしながら、ターミナルよりも見た目的にも使いやすさ的にも優れたツールがあります。

それが、`iTerm2` です。

ここでは、初心者向けにiTerm2の良さやインストール、設定方法を紹介します。

## iTerm2の良い点
- 私としては、大きく2点になります。

#### (1) 見た目のキレイさ
#### (2) 使いやすさ


- 詳細は後で説明します。
- 現状、ターミナルに劣っている点は感じられないので、インストールして使ってみることをオススメします。

## インストール方法
- 以下をご参考にしてください。

#### [初心者向け iTerm2のインストール方法](http://qiita.com/iwaseasahi/items/301e1f3b18aa49990763)


- インストールが完了したら、以下の画面が表示されます。

![スクリーンショット 2017-04-07 23.08.16.png](https://qiita-image-store.s3.amazonaws.com/0/142810/9892c9e7-17bd-9476-208c-731023377368.png "スクリーンショット 2017-04-07 23.08.16.png")

正直、表示されているものは、ターミナルと全く変わりがありません。ターナルもiTerm2もターミナルエミュレーターなので基本的な機能は一緒です。

しかしながら、iTerm2の方がターミナルよりも以下の点で優れています。

## (1) 見た目のキレイさ

- こちらがデフォルトのターミナルです。

![スクリーンショット 2017-04-07 23.17.12.png](https://qiita-image-store.s3.amazonaws.com/0/142810/ad987250-da0c-a827-50df-a8ec12b46ae0.png "スクリーンショット 2017-04-07 23.17.12.png")

- こちらがデフォルトのiTerm2です。

![スクリーンショット 2017-04-07 23.08.16.png](https://qiita-image-store.s3.amazonaws.com/0/142810/29490435-00bf-fb0e-f157-8186f7957841.png "スクリーンショット 2017-04-07 23.08.16.png")

比べてみるとわかりますが、若干iTerm2の方がフォントがキレイで見やすいです。

少しの差ですが長時間使っていると、この若干の差が作業の効率に影響が出てきます。
やはり見た目がキレイな方が良いです。

さらに見やすくするには、フォントを変更することをオススメします。

### [iTerm2をプログラミングに最適なフォントに変更する方法](http://qiita.com/iwaseasahi/items/c755ba1c26f94d2536f6)

## (2) 使いやすさ
- iTerm2の使いやすさは主に以下の2つになります。

#### ① 画面分割
#### ② ショートカットキー

- それぞれ順番に説明していきます。

## ① 画面分割
### 画面分割(縦)
#### command + d

![スクリーンショット 2017-04-10 20.25.55.png](https://qiita-image-store.s3.amazonaws.com/0/142810/7a2ef02f-ad43-7316-1d10-d1418c074629.png "スクリーンショット 2017-04-10 20.25.55.png")

### 画面分割(横)
#### command + shift + d

![スクリーンショット 2017-04-10 20.27.44.png](https://qiita-image-store.s3.amazonaws.com/0/142810/aa0f70ab-00d9-80ac-abdb-20c7f28426bf.png "スクリーンショット 2017-04-10 20.27.44.png")

### 応用
- 画面分割は縦と横を組み合わせることができるので、以下のような画面構成も出来ます。

![スクリーンショット 2017-04-10 20.30.04.png](https://qiita-image-store.s3.amazonaws.com/0/142810/ef304cc7-d9b0-5d67-02f0-82e8d0cc9856.png "スクリーンショット 2017-04-10 20.30.04.png")

## ② ショートカットキー
### 新規タブ作成
#### command + t

![スクリーンショット 2017-04-10 20.38.05.png](https://qiita-image-store.s3.amazonaws.com/0/142810/329d211d-5fc3-26a6-90a5-dc1d528c1f11.png "スクリーンショット 2017-04-10 20.38.05.png")

### タブ移動
#### command + 左右の矢印キー

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/142810/977d3f9b-96a6-8a93-c85e-aa6978341760.gif "Untitled.gif")

### 画面分割の移動
#### command + option + 矢印キー

![Untitled2.gif](https://qiita-image-store.s3.amazonaws.com/0/142810/558bbcef-975b-d31a-86f4-4b88f8f8dd03.gif "Untitled2.gif")

### タブを閉じる
#### command + w

![Untitled3.gif](https://qiita-image-store.s3.amazonaws.com/0/142810/f58cbcea-a1f0-705d-1c5e-87d43d3fdeaa.gif "Untitled3.gif")

### その他
#### [iTerm2で外せないショートカットキー一覧](http://qiita.com/kenju/items/3bcd9707266a0b427da3)

- こちらを参考にしてショートカットキーを覚えれば、さらに使いやすくなると思います。

## 総括
以上、簡単でしたが `iTerm2` のインストールと設定方法について紹介しました。

これ以外にも色々な設定があるので調べてオリジナルにカスタマイズすれば、もっとプログラミングが楽しくなると思います。
Android Studio の文字列置換

# Android Studio での文字列置換方法
時々必要になるけれど，手作業でやると面倒な作業の代表格が文字列置換．
Android Studio　には，3種類の文字列置換があります．
（ちなみに，それぞれの置換に対応する検索もあります．）

- 単一ファイルに対する置換 Replace
- 複数ファイルに対する置換 Replace in Path
- テンプレートにマッチする文字列を置換 Replace Structually

順番に見ていきましょう．

# 単一ファイルに対する置換
ほかのテキストエディタでもよくある文字列置換です．
あるファイル内の文字列を置換します．
正規表現での置換もできるうえに，変換する前に変換後の結果を表示してくれるので便利です．

Windows なら `control + r`, Max なら `command + r` がショートカットに割り当てられているでしょう．

# 複数ファイルに対する置換
複数のファイルから文字列を検索・置換できます．
パッケージをまるごと移動することになったときのように，複数ファイルに対する変更が必要になったときに重宝します．

ショートカットは Windows なら `control + shift + r`, Max なら `command + shift + r` です．

# テンプレートにマッチする文字列を置換
最後のこちらはあまり使ったことがない方が多いのではないでしょうか．
残念ながら，私も使ったことないので，紹介する程度になります．
デフォルトではショートカットに設定されていないので， 伝家の宝刀 Search Action (`control + shift +r`(Windows), `command + shift + r`) から検索して実行するのがよいでしょう．

テンプレートにマッチするコードを検索できるようです．
検索用のテンプレートが豊富に揃っているので，それらを見て検索してみるのがよいと思います．
すべてのフィールド名とクラスを検索したりできます．
ただ，置換となると，フィールド名のリネームやメソッドのシグネチャ変更はリファクタリング機能を使ったほうが簡便であるため，あまり出番はなさそうです．
まだまだ・ArchLinux インストール覚書

[ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)より始めたArchLinuxプロジェクト。[ArchLinuxサーバとFreeNASをiSCSIで接続する事に決めました](http://qiita.com/katz_engineer/items/45771a7bb904d0424373)。そこでFreeNASをiSCSIターゲットとするように設定します。
その為の基礎知識などは[まだ・ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/b9f54dd544a4a905e626#_reference-cbdd1fa5d56d15942a84)にまとめたので、必要に応じて参照ください。

# zvol作成

1. ストレージ>ボリューム でボリューム一覧を表示。
2. tankの下のtankを選択。
3. 画面最下に並んでいるアイコンの右端のCreate zvolアイコンをクリック。
4. 表示されるCreate zvolダイアログの必要項目を設定。
 1. zvol name: 名前を付ける、今回は iscsi0 とする。
 2. Size for this zvol: 後述の通りシン・プロビジョニングできるので、残り容量にこだわらず目一杯の最大値を指定できる。今回は利用可能容量ギリギリ(2TiB)とする。
 3. Force size: 80%を超える容量を使用可能にするかどうか、らしい。今回はとりあえずチェックしておく。
 4. 圧縮レベル: 継承を選択。今回は親がlz4なので、それを継承する事になる。
 5. Spase Volume: チェック。シン・プロビジョニングの事らしい。シン・プロビジョニングの基礎知識は[ここ](http://www.fujitsu.com/jp/products/computing/storage/disk/eternus-dx/feature/055/)がわかりやすい。
5. Add zvol ボタンをクリック。
6. tank/tank/iscsi0 が出来た事をGUI上で確認。

ここまでは簡単です。

# iSCSIターゲット設定

基本的に[まだ・ArchLinux インストール覚書](http://qiita.com/katz_engineer/items/b9f54dd544a4a905e626#_reference-cbdd1fa5d56d15942a84)で紹介した参考文献の手順通りにやっています（手順公開ありがとうございます！）。それなりの分量になりますが、１つずつ丁寧に設定していくだけです。

## 共有>Block(iSCSI)

### Target Global Configuration

基本的には何もいじりません。デフォルトのまま。

### ポータル

このFreeNASマシンのNICの情報というか、iSCSIイニシエータからの接続を待ち受ける窓口の設定です。複数NICを使用するような場合を想定しているようです。

- コメント: 後で思い出し易い一言を書いておきます。
- Discovery Auth Method: 指定なし。参考: [iSCSI ベースのストレージネットワークにおける認証の構成](http://docs.oracle.com/cd/E19253-01/819-0386/fmvdu/index.html)
- 認証グループの探索: 指定なし。というか、選択肢がそれしかありません…
- Portal IP
 - IPアドレス: このFreeNASマシンのIPアドレスが表示されるので、それを選択。今回はNICが1枚しかないしIPアドレスも1つなので、深く考えずに 0.0.0.0 でOK。
 - ポート: こういう所で変なポートを選択しても仕方ありません、デフォルトの 3260 にしておきます。

### イニシエータ（複数）

ここは、接続元をしっかりと限定しておいた方が、防犯の意味で望ましいでしょう。うっかりミスすると全くつながらなくて四苦八苦する事になりますが。
その辺のバランスを考慮した上、家庭内LANである事を踏まえて、ネットワークだけ指定する事にしました。

- イニシエーター（複数）: ALL
- 認証されたネットワーク: 192.168.0.0/24 とか、なんかそんな指定。
- コメント: 適当に。

### 認証されたアクセス

何も設定しません。この設定が何を意味するか、実はまだよくわかっていません…

### ターゲット

- ターゲット名: iscsi0 にしました。忘れにくく思い出し易い名前にしましょう。
- ターゲットエイリアス名: 空欄。ターゲット名が長い場合に、別名を付けられるようです。
- iSCSI Group
 - ポータルグループID: 上記で設定したポータルが選択肢に表示されるので、それを選択。
 - イニシエータグループID: 上記で設定したイニシエーターが選択肢に表示されるので、それを選択。
 - 認証方法: 指定なし
 - 認証グループナンバー: 指定なし

### エクステント

- エクステント名: iscsi0 にしました。忘れにくく思い出し易い名前にしましょう。
- エクステントタイプ: デバイスを選択。
- シリアル番号: デフォルトのままでよろしいかと。
- デバイス: 上記で作成したzvolを選択。
- 論理ブロックサイズ: 512。これが推奨らしい。
- Disable Physical Block Size Reporting: デフォルトのままチェックしない。良くわかりませんが、一部でうまく動かないとヘルプに書いてあるので、その場合にチェックすればいいと思います。
- Available Space Threshold (%): 80にしときました。
- コメント: 今回は空欄で。
- Enable TPC: デフォルトのままチェック。
- Xen initiator compat mode: デフォルトのままチェックしない。Xen使いませんし。
- LUN RPM: デフォルトのままSSD。windowsで使用する時に、デフラグがどうとかでSSDにしといた方がいいらしい。VMWareでもスワップデバイスとして使用する時はSSDとか。

### Associated Targets

- ターゲット: 上記で作成したターゲットを選択。
- LUN ID: Auto。SCSIを多少でも理解していたら設定してもいいかも知れませんが、元々LUN IDの設定なんか面倒以外の何者でもありませんでしたし。
- エクステント: 上記で作成したエクステントを選択。

## サービス

iSCSIサービスをONにします。

# 以上

とりあえずエラーは出てない…のかな？次はいよいよArchLinuxサーバマシンでiSCSIイニシエータを設定します。その際の挙動などによっては、この投稿を修正する可能性があります。
VS Code March 2017 で入った、日本人なら今すぐ有効にすべき新機能

`files.autoGuessEncoding` に`true`を設定して、今すぐ VS Code の自動エンコード推定を有効にすべし。

https://code.visualstudio.com/updates/v1_11#_auto-guess-encoding-of-files
JavaScript ショートカット演算子(短絡演算)

##ショートカット演算子(短絡演算)
論理積/論理和演算を利用する場合、
「左式だけが評価されて、右式が評価されない」ケースがあります。
例えば、　&&　演算子の場合、左式がfalseと評価された時点で条件式全体がfalseとなるので、右式は評価(実行)されません。
このような演算のことをショートカット演算子(短絡演算)と言います。

そのため、
これらの式は意味的に等価です。

```
if(x === 1){console.log('Hello');}//1
x === 1 && console.log ('Hello');//2
```

1　では変数xが１である場合にメッセージを表示します。
2では左式がfalseの場合、&&演算子では右式は実行されません。
つまり2では、変数xが１である場合のみ右式が実行されるのです。

しかし、2のような記述は原則として避けるべきものです。
それは、右式が実行されるかどうかあいまいになるため、思わぬバグが発生する可能性を孕むためです。

ではショートカット演算子はどのような時に使うのでしょうか？

##ショートカット演算子の使いどころ
デフォルトの値として設定するときに使う

```
var msg = '';
msg = msg || 'Hello, world!';
console.log(msg);//Hello, world!
```

変数がfalsyな値、つまり空文字列などの場合に、デフォルト値として　Hello, world!　を代入します。

*falsyな値に意味がある場合
空文字や０などfalsyな値に意味がある場合、
以下のように条件演算子を利用します。

```
msg = (msg === undefind ? 'Hello, world!':msg);
```
これによって、変数msgがundefind（未定義）の場合にだけ、デフォルト値が適用されます。
Unityでマウスカーソルが消えた場合の対処法

手元のSurfacePro3 + Windows10環境でのこと
Unityエディタ起動後にPCにマウスを認識させる(USBマウスを接続する)と、エディタ上ではマウスカーソルが表示されなくなる。

【対処法】
マウス認識させたままUnity再起動
SketchファイルをZIPとして展開した後にSketchファイルに戻す方法

Sketch 43よりファイルフォーマットが変わり、ドキュメント情報やレイヤー構成などを記述したJSONファイルやビットマップファイルを内包するZIPアーカイブ形式になりました。ファイルの拡張子を`.zip`に変更し展開すれば、内包するファイルを直接取り出すことができます。

- 関連記事：[New file format in Sketch 43](http://sketchplugins.com/d/87-new-file-format-in-sketch-43)

Sketchファイルを展開した状態は次の通りです。
![SketchファイルをZIP化し、展開した状態](https://qiita-image-store.s3.amazonaws.com/0/4304/e79b5a54-7b47-4983-1cd4-4c71e62e3382.png)

しかし、展開して生成されたフォルダをZIP化して拡張子を`.sketch`に変更した場合、Sketchで開くことができなくなってしまいます。43へのアップデートの目玉のはずですが、可逆性がないのでしょうか？

実はフォルダを圧縮するのではなく、展開されたフォルダ内にあるファイルやフォルダをそのままZIP化する必要があります（先に提示した関連リンクを読み進めると、実は書かれています）。
![Sketchファイルへ戻すには、展開されたフォルダ内にあるものをZIP化する必要がある](https://qiita-image-store.s3.amazonaws.com/0/4304/835ed61f-34dc-c55e-5d3d-638efd055edf.png)

これで心置きなくGitで管理ができるようになりますね。
iTerm2をプログラミングに最適なフォントに変更する方法


## 概要
プログラミングが少しずつできるようになると、普段使っているツールも色々と設定を変えていきたくなります。

ここではターミナルエミュレーターであるiTerm2のフォントをオシャレにする方法を紹介します。

## 結果
- 先にどのように変わるか以下に示します。

### デフォルトのiTerm2

![スクリーンショット 2017-04-07 23.08.16.png](https://qiita-image-store.s3.amazonaws.com/0/142810/29490435-00bf-fb0e-f157-8186f7957841.png "スクリーンショット 2017-04-07 23.08.16.png")

### フォントを変えたiTerm2

![スクリーンショット 2017-04-10 21.58.47.png](https://qiita-image-store.s3.amazonaws.com/0/142810/3de28aa2-5783-1c1c-4a5b-93974d2e2741.png "スクリーンショット 2017-04-10 21.58.47.png")


## 手順
- Homebrewを使ってフォントをインストールします。
- まだHomebrew自体をインストールしていない方は、こちらを参考にしてください。

#### [初心者向け Homebrewをインストールする方法](http://qiita.com/iwaseasahi/items/6713631f9bc9c4f74097)

### フォントのインストール
- フォントをインストールするための準備をします。

```
$ brew install automake
$ brew install pkg-config
```

- まずは以下のコマンドを実行します。

```
$ brew tap sanemat/font
```

- 次のコマンドを実行するとパスワードが聞かれるので、入力してください。

```
$ brew install Caskroom/cask/xquartz
==> We'll set permissions properly so we won't need sudo in the future
Password:
```

- 以下のコマンドで `ricty` フォントをインストールします。

```
$ brew install ricty
```

- インストールが終わると、以下のように表示されます。

![スクリーンショット 2017-04-10 21.31.20.png](https://qiita-image-store.s3.amazonaws.com/0/142810/205b62bb-0b38-2c4e-005b-157402314ee5.png "スクリーンショット 2017-04-10 21.31.20.png")

- ここで表示されたバージョンから以下のコマンドを実行します。

```
$ cp -f /usr/local/Cellar/ricty/4.1.0_2/share/fonts/Ricty*.ttf ~/Library/Fonts/
```

```
$ fc-cache -vf
/Users/test_user/.fontconfig: not cleaning non-existent cache directory
fc-cache: succeeded
```

### フォントの変更
- iTerm2のPreferencesを開きます。

![スクリーンショット 2017-04-10 21.35.15.png](https://qiita-image-store.s3.amazonaws.com/0/142810/fbc16d5a-e29c-9bb2-d93e-eedee4d9568c.png "スクリーンショット 2017-04-10 21.35.15.png")

- Profilesをクリックします。

![スクリーンショット 2017-04-10 21.35.42.png](https://qiita-image-store.s3.amazonaws.com/0/142810/5613435a-9067-f4ff-0836-5f3a81201e9d.png "スクリーンショット 2017-04-10 21.35.42.png")

- Textを選択します。

![スクリーンショット 2017-04-10 21.36.14.png](https://qiita-image-store.s3.amazonaws.com/0/142810/158486c9-4c6d-a952-0c2f-8bb0195a1102.png "スクリーンショット 2017-04-10 21.36.14.png")

- フォントの種類をクリックします。

![スクリーンショット 2017-04-10 21.56.20.png](https://qiita-image-store.s3.amazonaws.com/0/142810/01208e1b-3cd4-d829-0da1-bc4deac58068.png "スクリーンショット 2017-04-10 21.56.20.png")

- `Ricty Discord` を選択します。

![スクリーンショット 2017-04-10 21.56.11.png](https://qiita-image-store.s3.amazonaws.com/0/142810/da92c9d9-ee15-c4f2-c4e3-8bb903f5e551.png "スクリーンショット 2017-04-10 21.56.11.png")

- フォントサイズも14にして見やすくします。

![スクリーンショット 2017-04-10 21.57.30.png](https://qiita-image-store.s3.amazonaws.com/0/142810/9a3ac6ce-3fe9-3ba4-4b0b-e75cf348b506.png "スクリーンショット 2017-04-10 21.57.30.png")

- 以上でフォントの変更は完了です。
XcodeのbuildSettingsをxcconfigに展開するスクリプトを書きました


この作業いつも手でやっていたのですが、さすがに面倒になってきてスクリプトをガッと書いてみました。
https://github.com/toshi0383/xcconfig-extractor


*Update: その後Swiftにポートして、いろいろと機能追加しています。*

プロジェクト及びそれぞれのターゲットのBuild Settingsの値をそれぞれ別々のxcconfigに書き出します。
例えばApp.xcodeprojの中にApp, AppTests, AppUITestsの3つのターゲットがあるとしたら、以下の通りxcconfigが生成されます。Debug, Release以外のConfigurationがあれば、その分もちゃんと出力されます。

```bash
$ main.sh App.xcodeproj/project.pbxproj configs
$ ls configs/
Base-Debug.xcconfig
Base-Release.xcconfig
App-Debug.xcconfig
App-Release.xcconfig
AppTests-Debug.xcconfig
AppTests-Release.xcconfig
AppUITests-Debug.xcconfig
AppUITests-Release.xcconfig
```

書き出したらawkでbuildSettingsを削っています。ここは見てもらうと正規表現が力技すぎて笑えると思います。

それぞれBaseを `#include` しても良いのですが、必ずしもそうしたい場合ばかりではないと思うので、シンプルにそれぞれ書き出して終わり！にしています。

そのあとのxcodeprojへのファイル追加を自動化するにはシェルでは限界があるので、それ用にコマンドでも作ったほうがいいのだろうなーと思っています。

## Tips
### pbxprojはPlistBuddyで読める
内部の処理はPlistBuddyのPrintコマンドで成り立っています。pbxprojはPlist形式の亜種だとかどこかで聞いた気がして、使ってみたら普通に読めました。さすがにAddとかSetを使うと`<key>hoge</key>`みたいなデータが書き込まれてしまってダメでしたが。
もちろん、`plutil -p`でも読めますが、出力される形式が若干違いました。

### pbxprojのobjectのIDはなんでも良い
Xcodeで生成すると24桁のハッシュみたいになってますが、その形式にこだわる必要はないようです。
`swift package init --type empty && swift package generate-xcodeproj` としてxcodeprojを生成してみると objectのIDは `OBJ_1` とか設定されていました。ファイル内で一意になっていればいいようです。

### SwiftPMで生成したxcodeprojをXcodeから編集すると差分がpbxprojファイル全体に出る
SwiftPMで生成したxcodeprojを少しでもXcodeから触ると差分がツラいことになりました。SwiftPMで生成すると`*.xcodeproj`を`.gitignore`に含めてくるので、そもそもそういう互換性は考えられていないのではと思います。もちろん互換性がないわけではなくて、触ると差分が出てしまうというだけなのですが、何も変えていないつもりの部分は差分も出ないでほしいところですよね。。
一応今回作成したツールではどちらのpbxprojにも対応しています。

以上です！
備忘録的なやつ

```csharp:Arrow.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Arrow : MonoBehaviour {

	[SerializeField]
	Rigidbody r;

	[SerializeField]
	Transform left;

	[SerializeField]
	Transform right;

	[SerializeField]
	Transform left2;

	[SerializeField]
	Transform obj;

	float speed = -1f;


	void Update(){
		//CirclarMotion ();
		ElliptiicalMotionBy2Points();
	}

	//2点間を直径とする正円運動
	void CirclarMotionByDiameter(){
		//cosθ = a(底辺)/c(斜辺)
		//a = c*cosθ
		//a = radius*cosθ

		//sinθ = b(高さ)/c(斜辺)
		//b = c * sinθ;
		//b = radius * sinθ

		//円の中心
		Vector3 a = left.position;
		Vector3 b = right.position;
		Vector3 center = new Vector3 ((a.x + b.x) / 2, (a.y + b.y) / 2, (a.z + b.z) / 2);

		//円の半径
		float radius = Vector3.Distance (a, center);
		float c = Time.time * speed;
		float x = radius * Mathf.Cos (c);
		float y = radius * Mathf.Sin (c);
		obj.position = new Vector3 (x, y, obj.position.z) + center;
	}

	//2点を通る楕円運動
	void ElliptiicalMotionBy2Points(){
		Vector3 a = left2.position;
		Vector3 b = right.position;
		Vector3 center = new Vector3 (a.x , b.y, (a.z + b.z) / 2);

		//円の半径
		float radiusX = Vector3.Distance (b, center);
		float radiusY = Vector3.Distance (a, center);

		float c = Time.time * speed;
		float x = radiusX * Mathf.Cos (c);
		float y = radiusY * Mathf.Sin (c);

		obj.position = new Vector3 (x, y, obj.position.z) + center;

	}

	//3点を通る正円運動
	void CirclarMotionBy2Points(){
		//中心(a,b)の円の半径を求める式は
		//(x-a)^2 + (y - b)^2 = r^2
		//これを一般形にすると、(aとbになんでもいいから入れるとわかる）
		//x^2 + y^2 +lx + my + n = 0
		//となるので、まず3点を定義する
		//とやろうと思ったけどプログラムで連立方程式なんてできるの。。。？

		//なので、
		//中心をO(x,y)とすると、OA=OB=OCであるので、

		Vector3 a = left2.position;
		Vector3 b = right.position;
		Vector3 c = left.position;

		


	}
}

```
Git BashをCygwinとして代用

#はじめに
Git for WindowsにはGit Bashというプログラムが含まれています。Git Bash上ではCygwinのようにシェル環境と色々なUnixコマンドを利用できるようになります。
https://git-for-windows.github.io

既にCygwinに色々なパッケージを導入して利用している人にはメリットはほとんどありませんが、Cygwinが導入されていないWindows環境でもUnix環境を使えるため知っておいて損はないと思います。

#まとめ
Git for Windowsを導入することにより、Git Bashで以下のような操作ができるようになります。

- bash (パイプ、リダイレクト等も利用可能)
- ls, cd, mv, cp, find, grep, awk, sed等の基本操作
- git
- ssh, scp
- curl
- vim (Huge版), vimgrep
- perl

※「何故Perlがあって、PythonやRubyがないんだ！」と疑問をもつ人もいるかもしれませんが、単純にGitの一部がPerlで実装されているためPerlが含まれているからでしょう。

#使用バージョン
- Git for Windows v2.12

#Git Bashの起動方法
起動方法は大きく二通りあります。

- スタートメニューから「Git」→「Git Bash」を選択する。
- デスクトップ上またはエクスプローラ上で右クリックして「Git Bash Here」を選択する。

右クリックから選択できる「Git Bash Here」は意外と便利なため、インストール時に有効にしておくことをお勧めします。

#利用可能なコマンド一覧 (抜粋)
個人的にLinux環境などでよく使用するコマンドの一覧です。より多くのコマンドを知りたい人はlsコマンドで `/mingw64/bin` と `/usr/bin` あたりを確認するとよいです。

- awk
- basename
- bash
- bunzip2
- bzcat
- bzip2
- cat
- cksum
- clear
- cd (bashシンタックス)
- cp
- curl
- cut
- date
- dd
- df
- diff
- du
- echo
- egrep
- expr
- file
- find
- fmt
- git
- grep
- gunzip
- gzip
- head
- kill
- ldd
- less
- ln
- ls
- md5sum
- mkdir
- mktemp
- mv
- nohup
- od
- patch
- perl
- printenv
- ps
- pwd
- rm
- rmdir
- scp
- sed
- sftp
- sh
- sleep
- sort
- ssh
- ssh-agent
- ssh-keygen
- tail
- tar
- tee
- test
- timeout
- touch
- uname
- uniq
- unzip
- vi
- view
- vim
- vimdiff
- wc
- which
- xargs
- xxd
- yes
- zcat
- zdiff


#ファイルおよびディレクトリのパス指定
Git Bash上では、Cygwinと同様にUnix形式パスとWindows形式パスを指定できます。ちなみに共有ディスク(NAS)等のパスを指定して作業することもできます。

##Unix形式パス
以下のようにルート直下のドライブ名(ex. C, D, E)を指定することができます。ちなみに `ls / ` で確認してもドライブ名は表示されませんが、ちゃんとアクセスできます。

```bash
cd /c/Users/taro/Desktop
```

ちなみにCygwinだと /cygdrive 配下にCドライブ等の各ドライブのディレクトリが配置されているためGit Bashとはパスが異なります。

```bash
# Cygwinの場合
cd /cygdrive/c/Users/taro/Desktop
```

##Windows形式パス
スラッシュでもバックスラッシュ(円マーク)のどちらでも指定可能です。ただしバックスラッシュの場合はエスケープする必要があります。

```bash
# スラッシュ
cd c:/Users/taro/Desktop

# スラッシュ×2
cd c://Users//taro//Desktop

# バックスラッシュ(エスケープあり)
cd c:\\Users\\taro\\Desktop
```

シングルクオートまたはダブルクオートで囲むことにより、Windows形式パスのバックスラッシュ版をエスケープ無しで記述することができます。

```bash
# バックスラッシュ(エスケープ無し)
cd "c:\Users\taro\Desktop"

# パスの最後に\があるとダブルクオートがエスケープされるためNG
cd "c:\Users\taro\Desktop\"  
```

##ドラッグ＆ドロップ
フォルダ等をGit Bash画面上にドラッグ＆ドロップすると、現在のGit Bashのカーソル位置に「エスケープ無しのバックスラッシュ版Windowsパス形式」の文字列が貼り付けられます。
Bashのシェル上で使用する場合は、以下のような手順でドラッグアンドドロップを活用できます。

 1. 最初にダブルクオート2個を入力
 2. その中にカーソルを移動
 3. ファイルやフォルダをGit Bash画面にドラッグドロップ
 4. ダブルクオートの間にWindows形式パスがフルパスで貼り付けられる
Bluemix IaaS (旧SoftLayer) で ExpanDriveを使う

#内容
ExpanDriveを使って、VSI(Windows)からBluemixのObject Storageをマウントします。

#概要
VSI(Windows)からObject Storageをマウントするには、以下のルートを経由する方法があります。

- Bluemix IaaS (旧SoftLayer)
    - 1 - Public NW 経由でOpenStack Swiftベースのエンドポイントにアクセス
    - 2 - Public NW 経由でS3 APIベースのエンドポイントにアクセス
    - 3 - Private NW 経由でOpenStack Swiftベースのエンドポイントにアクセス
    - 4 - Private NW 経由でS3 APIベースのエンドポイントにアクセス
- Bluemix Public (PaaS)
    - 5 - Public NW 経由でOpenStack Swiftベースのエンドポイントにアクセス

<img width="982" alt="Screen Shot 2017-04-10 at 21.42.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/3a6a08fc-2b1c-d3d3-5b32-2fc6a62e5a58.png">

#ExpanDriveとは
ExpanDriveは、有料ソフトウェア（1ライセンス49.95ドル）ですが、1週間無償トライアルが可能です。
MacとWindowsのどちらでも使えるので、便利です。

今回試した中では、「2. Bluemix Public (PaaS)」には対応していないようでしたので、「1. Bluemix IaaS (旧SoftLayer)」での設定方法を紹介します。

まずはこちらからダウンロードしてインストールしましょう。
<img width="1106" alt="Screen Shot 2017-04-02 at 1.00.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/d94b70a4-85e5-6969-05ac-a18fea62dd2b.png">

今回は評価版で試しました。
<img width="461" alt="Screen Shot 2017-04-02 at 1.12.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/b5b08215-6cc9-8f00-e552-e0e3bc724d15.png">

#接続方法
以下の中から、接続の方式によって選びます。
Bluemix IaaS (旧SoftLayer)には、「Amazon S3」「OpenStack Swift Storage」が使えます。
<img width="460" alt="Screen Shot 2017-04-02 at 1.13.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/4209cd89-eced-f9e7-ac29-95aac89a6506.png">

#OpenStack Swiftベースの場合
Bluemix IaaS (旧SoftLayer)の画面から、エンドポイントの情報と認証情報をとってきましょう。
Storage > Object Storage > ACCOUNT NAME > Datacenter > View Credentials から情報を確認できます。
<img width="537" alt="Screen Shot 2017-04-10 at 21.30.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/09aa472b-8485-f023-7fbb-9db35f718105.png">

「OpenStack Swift Storage」を選択して、以下のように入力します。
（プライベートから使う場合は、プライベートエンドポイントのURLを入力します。）
<img width="461" alt="Screen Shot 2017-04-02 at 1.16.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/1c8d7e15-0f8a-c263-14b5-b551fa7a9a3e.png">

以下のようになったので、接続されたことが確認できましたね。
<img width="459" alt="Screen Shot 2017-04-02 at 1.17.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/a34acedc-997d-5189-41f7-9d103c624967.png">

#S3 APIベースの場合
Storage > Object Storage > ACCOUNT NAME > Show Credentials から情報を確認できます。
<img width="846" alt="Screen Shot 2017-04-10 at 21.33.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/16e622e1-0a89-95e6-fd3a-3d45a3e99268.png">

「Amazon S3」を選択して、以下のように入力します。
（プライベートから使う場合は、プライベートエンドポイントのURLを入力します。）
<img width="462" alt="Screen Shot 2017-04-02 at 1.30.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/5a5a39e7-a10e-5b5b-e303-542fc0c960ae.png">

#まとめ
BluemixのObject Storageには、いろいろな接続方式があり、便利ですね。
**プライベートから使えたり、S3互換のソフトが使えたり、料金についてもS3より割安に設定されている**ので、これからも便利に使わせてもらいたいと思います！
独学で一度躓いたTDD、初学者の為にその訳を分析する

周りに教えてくれる人が居なかった為、TDDというものを1から勉強しましたが、途中何度も躓きました
今となってはそれなりにTDDこなせるようになったので、何故躓いたか、理由を分析してみました
誰かに教える際の参考にしてくれたら幸いです

# TDDはそもそも難しい
本来、TDDというのは難しい技術です
何故ならば、前提条件にテストファーストを理解する必要性があると、私は思うからです
テストファーストを理解する為には、前提条件にテストコードの理解が必要でしょう
テストコードを理解する為には、テストを理解する必要性があります

テストファースト、テストコード、テストを理解せずにTDDを理解させるのは、言ってしまえば行列をベクトルも三角関数も三角比もわからないような人間に、いきなり覚えろって言うようなものではないでしょうか。つまり初めから無茶なのです

## そもそもなんでテストをするか
端的に言うと、人間は間違えるからです

しかし、プログラミングで間違えた事のない人にはなかなか理解しにくい分野でもあります
その場合は、一度失敗してから理解するのが一番手っ取り早いでしょう
適当に競プロをやればなんとなくテスト出力が必要な理由が解ってくる筈です。間違えないで出来た天才肌の方はこんな記事なんて読まずにレッドコーダー辺り挑戦してみてはいかがでしょうか

## テストコードの意味
テストコードは、要するにテストの自動化です
TDDを独学する際に、ここで躓く人も多いと思われます
それは当然で、何故ならば短期間だけ見るならテストコード書くより人力テストをした方が楽だからです
しかし、長い目で見ると自動化した方が何十倍も楽になります。これがテストコードのメリットだと私は思います

テストを何度も手動で実行するより、コードにテストしてもらった方が早いんじゃないか、という所に自力で到着するのは至難の業でしょう
ここは、printデバッグを覚えて貰ってから、試しにテストコードを書いてみてからでも遅くないと思います
少なくとも、私はそれでテストファーストを理解しました

## テストファーストの意味
テストコードを書いてる途中にある人は思いました。「テストを先に書いておけば、それに通るコード書くだけでいいんじゃね？」と
実際に試してみたら上手く行ったので、この開発手法は強烈な支持を集めました

実際にテストから先に書いてみて、それに通るコードを書いてみるのが手っ取り早いです
何せ現場で生まれた技術なので、実際に使ってみないと効力がなかなか発揮できないからです

## テスト駆動開発について
実は、私には人に説明出来る程TDDの理解がないので、別の記事を当たって頂ければ幸いです
幸い、TDDだけなら色々な本で取り上げられているので、そちらを読む事をおすすめします

ただ、私の経験として以下のものがあります

  * 複雑なロジックを採用する場合は、レッド→グリーン→リファクタリング　のサイクルが肝心になる
  * 複雑なロジックを採用しない場合は要らないかもしれない

# 最後に
私もTDDを深く理解しているわけではないので間違いは多いと思います。その為、ここが間違っていると指摘してくれる人が居たら幸いです
ansible-vault のメモ

# はじめに

久しぶりにansibleを使って環境構築をしていて、以前は使っていなかった vault をちゃんと使うようになったのでメモ。

（以前はパスワード等のファイルはgitに乗せないで手動共有していた。。。正確には自分しか触らなかったので自分だけが持っていた）

# ３行で

* 暗号化ファイルに秘密鍵ファイルを使用すると便利なんじゃね
* create または encrypt 時に `--vault-password-file=~/.ssh/project_id_rsa` って付けるだけ
* ansible.cfg に `vault_password_file = ~/.ssh/project_id_rsa` 書いておくと実行時は何も気にしなくていい！

# やりたかったこと

* クレデンシャルを平文でgit管理に含めない
    * そもそもプライベートリポジトリだけど
    * そもそもgit管理に入れてなかったのも、チームの人数が増えるとよくない（暗黙の手渡しとか。。。_no）
    * つまり vault を使う
* 忘れちゃうようなパスワードを使わない and たくさん暗号化キー（パスワード持ちたくない） and わかる人に伝わる共有の情報を使う
    * secret.txt とか手動管理やめたい
    * vault ファイル毎とかプロジェクト毎にパスワード違うとか。。。
    * チームで共有の秘密鍵（terraform用の鍵とか、実行可能ユーザが持っていていいもの）を使うといいんじゃない？
* 今までと実行時引数を変えたくない
    * タグだったりホストだったり実行時に渡す引数が多いので --ask-vault-pass とかやりたくない
    * ansible.cfg に書いておけば大丈夫。vaultを使っていない時は無視される

# 具体的に

* 鍵は自分のではなく、プロジェクトやチームで共有している鍵を使う
    * プロジェクトが複数あってそれぞれ proja_id_rsa, projb_id_rsa みたいにして管理しているので
* vars ディレクトリ（ロールでもグローバルでも）に拡張子.vaultでファイルを作る
    * .yml である必要ないし、暗号化された状態で管理されるので、IDE等の影響を受けなくなって便利
    * vault を使わないで書いておいて、うまくいくのを確認してから暗号化
* 暗号化する際に、`ansible-vault encrypt --vault-password-file=~/.ssh/proja_id_rsa secret.vault` とする
    * view, edit とかも同じ
* ansible.cfg に `vault_password_file = ~/.ssh/proja_id_rsa`とする
* 暗号化された値を使用する直前のタスクで `include_vars: secret.vault` とするとわかりやすい？

# 結果的に

* チームで共有する際にパスワードテキストの中身なんだっけ？がなくなった
* 復号化に手間がかからず、暗号化が推進されて、構築のコード化が進んだ
* `export ANSIBLE_VAULT_PASSWORD_FILE=~/.ssh/proja_id_rsa` ってしておくといちいち--vault-password-fileをつけなくて済むので楽になった
* 自分用のプロジェクトは当然自分の id_rsa を使うことでめっちゃ楽になった
Fastfile の import 機能を使い、複数のプロジェクトで共通の Fastfile を使う

# [import_from_git](https://docs.fastlane.tools/actions/#import_from_git)

[fastlane](https://fastlane.tools/) の action の中に [import_from_git](https://docs.fastlane.tools/actions/#import_from_git) というのがあり、これを利用すると特定の Fastfile を import してそのまま利用することができます。

弊社は iOSアプリ3つ, Androidアプリ3つの計6こあり、メンテしていくのが大変なので import 機能を利用し共通 Fastfile を作成しました。

[classi/fastlane\-example](https://github.com/classi/fastlane-example) にある Fastfile を実際に import して利用しています。

# import 方法

```ruby
fastlane_version "2.17.0"

import_from_git(
  url: 'https://github.com/classi/fastlane-example',
  path: 'iOS/fastlane/Fastfile'
)
```

このように書くことで import することができます。
import されたファイルの中でさらに import することも可能です。


私は `Util/Fastfile` に iOS / Android で共通の処理をまとめ、 `iOS/fastlane/Fastfile` と `Android/fastlane/Fastfile` からその Util を import する構成になっています。
iOS と Android をまとめて 1 つの Fastfile にすることも可能ですが、そうすると Fastfile が長くなってしまうので分割しました。

| iOS  | Android   |
|---|---|
|Util/Fastfile<br>　　↑<br>iOS/fastlane/Fastfile<br>　　↑<br>個別iOSアプリのFastfile  |Util/Fastfile<br>　　↑<br>Android/fastlane/Fastfile<br>　　↑<br>個別AndroidアプリのFastfile  |

という構成になっています。

# 環境変数

Fastfile で個別のアプリを動作させるために、 Fastfile に埋め込みで書いているような文字列を環境変数での設定に変更する必要があります。

ローカル環境では [direnv](https://github.com/direnv/direnv#setup) などを使うと良いです。

個別のプロジェクトでそれぞれ以下のように設定することで、共通の Fastfile を利用することができます。

```
export CRASHLYTICS_API_TOKEN=""
export CRASHLYTICS_BUILD_SECRET=""
export SLACK_URL="https://hooks.slack.com/..."
export CRASHLYTICS_GROUPS="classi"
export XCOV_WORKSPACE="classi.xcworkspace"
export XCOV_SCHEME="ClassiTests"
export XCOV_EXCLUDE_TARGETS="GoogleToolboxForMac.framework,Rswift.framework"
export BETA_MATCH_TYPE="development"
export SLACK_CHANNEL="classi_app"
export RELEASE_GYM_SCHEME="Production"
export XCODEPROJ="classi.xcodeproj"
export GITHUB_REPOSITORY="classi/fastlane-example"
```

# サンプル

[classi/fastlane\-example: fastlane example by Classi Corp\.](https://github.com/classi/fastlane-example)

上記レポジトリに fastlane 関連ファイルを公開していますので、参考にしてみてください :pray:
Atomでアウトライン表示可能なreStructuredTextとmarkdownの編集環境をつくる

reStructuredTextやmarkdownを使ってドキュメントを書くときに、分量が増えてくると、全体を見渡せるように、アウトラインを表示するための機能が欲しくなります。

vimやemacsにはこれらのための拡張機能がありますが、筆者の場合、プログラミングに使うエディタはviですが、実体がnviでなくvimの場合、vimの拡張部分が肌に合わないため、set compatibleして使っているクチなので、vim拡張は避けたくあります。かといってemacsは、使うのをやめてからもう二十年近くになるため、どちらも敷居が高いのです。

日本語テキストを書く場合には、viではモーダルなおかげで日本語入力の切り替えにいろいろと辛いところがあるため、テキストエディタほかものもでもかまいません。ただ、下書きではどのようなエディタでもよいのですが、
見かけに関わる部分について、修正をするときは、プレビューをしながらとなります。

いままでは、これらの作業には、markdownテキストの時は [Texts](http://www.texts.io/)を、reStructuredTextのときは[ReText](https://github.com/retext-project/retext)を使用していました。この二つは、プレビューもついてはかなりレスポンスがよいのですが、テキストエディタとしての機能がかなり劣り、とくに検索や置換が不自由です。そして冒頭で書いたように、文章の分量が増えてくると、全体を見渡せるように、アウトラインを表示するための機能が欲しくなります。

というわけで、いくつかのエディタを試して検討していたところ、ひとまず下記のような環境に落ち着きました。

  * エディタ Atom
  * reStructuredText の Syntax highlight に language-restructuredtext を追加
  * reStructuredText のプレビューに rst-preview を追加
  * markdown のプレビューに markdown-preview-plus を追加
  * アウトライン表示に document-outline を追加

document-outline は reStructuredText に対応していませんでした、簡単な修正で対応できました。
またmarkdownのSetext-styleの見出しについても、簡単な修正で対応できました。
これらの修正点については作者にプルリクエストを送ってありましたが、先日めでたくマージされたため、次のリリースでは反映されていると思われます。

(2017/4/11 追記)
document-outline 1.2.0 がリリースされています。
reStructuredText 対応、markdownのSetext-styleの見出し対応になりました。
（追記ここまで）

rst-previewはプレビューにpandocを使用してHTMLに変換しているため、Sphinxの入力にするreStructuredTextのようにroleを使用しているケースでは、変換できない部分が出てきますが、これはmake htmlしてブラウザで確認するようにしています。
Prometheus Tokyo Meetup #1　の個人メモ


# Prometheus Tokyo Meetup #1

* [Prometheus Tokyo Meetup #1](https://prometheus.connpass.com/event/53894/)に参加してきました。
* 自分が興味を持った部分を備忘録的にメモしています。
* ハッシュタグ：[#prometheustokyo](https://twitter.com/hashtag/prometheustokyo?f=tweets&vertical=default&src=hash)

# Monitoring k8s

* NTT Communications のクラウドサービス開発をしている人
* [BlackboxExporter](https://github.com/prometheus/blackbox_exporter)
    * あ、これは知らなかった
    * ブラックボックスでアクセスして、APIの死活監視とかレスポンスチェックに使えるらしい
    * AlertManager
        * まだ触れてないけど、アラートをIF文で細かく制御できる
        * アラートをまとめるのが楽
* 日本で使っているところが少ない
* BlackboxExporterがchartsが対応していない
* k8sの監視をするのにk8s環境下のコンテナーで監視するの嫌じゃない？
    * クラスター組んでるのである程度信じている
    * でも死なないことはないので、k8sの別環境の監視でやる
    * クラスター分ける
* Prometheusがシングルポイントになってない？どうするの？監視がいっぱいだと？
    * pull先を分けるとか…
    * 正直経験ないのでわからない。
    * 保存は一ヶ月。
    * PrometheusをHAにしたいはissueで[Close](https://github.com/prometheus/prometheus/issues/1500)してる
        * For HA, simply run the two Prometheus servers independently with the same configuration. They'll have the same data, modulo sample timings.
        * [面白い意見](https://github.com/prometheus/prometheus/issues/1500#issuecomment-208618456)。
            * We generally recommend running Prometheus servers in the same failure domain as the jobs they monitor. 

# labelをいい感じに使う

* ラベルはカーディナリティ最大10個ぐらいがいいと思う
* Grafanaのtemplateのall困っているらしい。
    * [公式](http://docs.grafana.org/features/datasources/prometheus/)によると標準対応しているみたい
    * 「Include All」オプションを選択すると、良きように対応してくれる。
    * 「=~」は「=」に勝手に置換してくれるからクエリはプレインテキストでいいよ

# fluent-plugin-prometheus

* fluent-plugin-prometheus(https://github.com/kazegusuri/fluent-plugin-prometheus)
* [mtail](https://github.com/google/mtail) でいいんじゃないの？ってなってる。
* fluentdはretry監視しないといけないけど、不足している。
* 足んないから作った！
    * prometheus_output_monitor
    * prometheus_tail_monitor


# k8s上のノードのHDDを監視

* node_exporterはTEXTFILE COLLECTORがある
    * スクリプトを追加して収集するメトリックスを追加できる
    * なんと！便利そう。
    * [sample](https://github.com/prometheus/node_exporter/tree/master/text_collector_examples)がここで提供されている
        * S.M.A.R.Tもあるらしいw

# Prometheus最初に悩む３つのこと

* 自分が登壇したLT
* [スライド](https://www.slideshare.net/ssuser88ff5b/prometheus-74804542)のっけました
SSH 接続先で走っている Docker コンテナ内で実行した X アプリの GUI を SSH クライアントで表示する

SSH + X11 転送で接続しているリモートホスト上で走っている Docker コンテナの中で X アプリ (X クライアント) を実行し、その GUI を SSH 接続元のクライアントのディスプレイで表示・操作したい (手元の X サーバと繋げたい)。そのため、Docker コンテナからホスト (SSH サーバ) の SSH X11 転送ポート (6000 + ディスプレイ番号) が見えるようにする。

## 環境

- Docker 1.12.6
- Docker イメージ: debian:latest
- Docker ホスト・SSH サーバ: Ubuntu 16.04.2 LTS (Kernel 4.4.0-64-generic)
- SSH クライアント: Mac OS X 10.11.6 + XQuartz 2.7.9

## 手順

1. Docker コンテナを走らせるホストに X11 転送付きで SSH 接続する (`% ssh -Y hoge@fuga`)。
2. Docker コンテナを作成する。このとき (a) コンテナとホストのネットワークインターフェースを共有し (`--net=host`)、(b) ホストの環境変数 `DISPLAY` をコンテナに渡して (`-e DISPLAY=$DISPLAY`)、(c) ホスト側ユーザの .Xauthority をコンテナ側 root (デフォルトユーザ) と共有する (`-v $HOME/.Xauthority:/root/.Xauthority:rw`)。

        % docker run --rm -i -t --net host -e DISPLAY=$DISPLAY \
            -v $HOME/.Xauthority:/root/.Xauthority:rw \
            debian /bin/bash

3. Docker コンテナ内で X アプリを実行する → 手元の画面に GUI が表示されたら OK

        # apt-get update
        # apt-get install -y x11-apps
        # xeyes

ちなみに、単純に Docker のホスト・コンテナ間で X サーバとクライアントを繋ぐには、ホストの X サーバがローカルからの接続をすべて受け入れるようにして (`% xhost +local:`)、ホストとコンテナで /tmp/.X11-unix を共有して UNIX ドメインソケットでやりとりするのが楽 (ただしセキュリティ的にはアレ)。

    % xhost +local:
    % docker run --rm -i -t -e DISPLAY=$DISPLAY \
        -v /tmp/.X11-unix:/tmp/.X11-unix \
        debian /bin/bash

## 参考

- [Docker X11 Client Via SSH - DZone Integration](https://dzone.com/articles/docker-x11-client-via-ssh)
- [» Dockerコンテナの中でGUIアプリケーションを起動させる](http://unskilled.site/docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E4%B8%AD%E3%81%A7gui%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B/)
- [docker0.11 の `--net=host` って何？ - Qiita](http://qiita.com/harasou/items/6c05a0cd99a1da1ab4a2)
Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week11)

# Coursera Week11
## はじめに
CourseraのWeek11を実施しましたので、私のメモを公開します。
Courseraってなんだ？という方は[Week1](http://qiita.com/KirariGlock/items/d41bdcc6f5ec5ad255fb)から御覧ください。

## Photo OCR problem
写真の中のテキストを解析する問題で、以下のような手順で実施する。（Potho OCR pipelineという。）
1.写真の中のどこがテキストなのかを判断
2.そのテキストを１文字ずつに分割
3.なんの文字なのか解析
4.解析した文字の意味を考えて誤解析を訂正(例 "1"を"l"に訂正。)
　※4はこのビデオでは解説しない

これが高い精度で実現できることで、盲目の人がカメラを持って歩いたときに標識の内容などを教えるようなことができる。

### 画像の歩行者検出について
テキストの検出より歩行者の検出の方が一般的に簡単である。
なぜなら歩行者は大体アスペクト比が一緒だから。（テキストは色々。）

歩行者検出の手順
1.まずアスペクト比を決定する。（ビデオでは82x36）
2.教師データとして歩行者を含む画像($y=1$)と含まない画像($y=0$)を用意する。(それぞれ1000~10000くらい)
3.教師あり学習を実施する。
4.解析したい大きい画像から学習したアスペクト比の部分だけ切り出して歩行者がいるかどうか検出する。（これを少しずつずらしながら何度も繰り返す。）
5.検出するアスペクト比の矩形を大きくして４と同じことを繰り返す。（これでサイズが大きい人（手前にいる人）も検出できる。）

このやり方をSliding window detectionという。
写真からテキストを検出する方法も同様のやり方でできる。

### 文字の分類
文字の分類も教師あり学習で実現する。
切り抜いた画像のちょうど真ん中が文字の切れ目のデータを$y=1$とし、文字の切れ目ではないデータを$y=0$と考える。
これもSliding window detectionで分類をする。

## 人工データ合成
大量のトレーニングデータを集めるために、トレーニングデータを作成する手法。
ビデオの例では写真内のテキスト画像を人工的に作成する。
例では文字のフォントを変えたり、背景を変えたり、歪ませたりする。
また、音声でも同様に雑音を入れるなどしてトレーニングデータを増幅させることができる。

人工データ合成でトレーニングデータの増幅をする前に、分類器が低バイアスか、多くのトレーニングデータが本当に役立つのかを検証しておくことが必要である。
次に、現在持っているデータセットを10倍にするのにどれだけの仕事が必要か考えることが必要である。
データセットが10倍になれば機械学習のパフォーマンスは大きく向上するはず。

## Ceiling Analysis
パイプラインでの解析を実施する際に、パイプラインのどのセクションを改善すれば効果的かを判断する。
それぞれのセクションでの何%の改善余地があるかを算出して一番効果がある箇所を改善の対象とする。
初めて後輩を持った、教育担当者になったエンジニアに贈る心構え

新社会人が続々と入社してきて数日が経過しました。
新社会人が生まれるという事は、新しい先輩や教育担当者もそこかしこで生まれていると思います。
新卒エンジニアや未経験エンジニアの教育担当をしたり非エンジニア向けにプログラミング勉強会を開いている経験を元に
今回は新しく先輩や教育担当者に向けて、特にエンジニア諸兄に向けて
心構え的なものを書いていければと思います。


# 「教育」におけるゴールは何か？

マナーや振る舞いに始まり、技術の基礎知識にコーディング規約にと
とにかく教えることはたくさんあると思います。
でも新しいメンバーに対して言葉の発声方法からバイナリの読み方まで教えることは時間的に無理です。
では教育のフェーズでのゴールはどこに設定するべきでしょうか。
それは「自走出来るエンジニア」であることで「何でも出来て全部を知っている」ということではないべきです。
言い換えると「チームのメンバーとして許容出来るスキルまで引き上げる」ことですし
他のメンバーに大きな負荷をかけない状況にしていく事が重要です。


## 具体的な教育ゴールの要素

具体的には何を知っていれば「自走出来るエンジニア」と言えるでしょうか。
チームの状況や会社の方針にも左右されると思いますが

* わからない事を自分で調べて解決していくスキル
* わからない事を加味した上でスケジュールを引くスキル
* わからない事をわからないと言える度胸
* わからなかった事を知識として蓄積していく学習フロー

あたりかなと思っています。
特にスケジュールを引くスキルや学習フローに関しては人それぞれ合ったやり方があるので
詳細な部分は個々人に任されてしまうかなとも思っています。
様々なフレームワークがある中で、必ずしも本人にマッチしない可能性があるので
そこに関しては許容していかなくてはいけません。


# 教育する上での心構え

ところで自身は上に挙げた要素を明確に「こうしている」と答えられるでしょうか。
「答えられる」と言える人は素晴らしいエンジニアの一人だと思います。
では、隣の席の人はこれらの要素をどう解決しているか知っていますか。
おそらく自身とは別のアプローチであると思います。
しかし明確に答えられたならばその方も素晴らしいエンジニアの一人なのです。
つまりはやり方が幾通りもある問題で、不正解はあれど正解の無い問題です。
新人がやっているやり方が非効率であると感じたならば

* なぜそれをしようと思ったか
* 代案としてどんなものがあるのか

という話をしてみて下さい。
おそらく新しい発見があると思います。


## 人が人に何かを「教える事が出来る」は間違った認識

人は「何かをしてもらった経験」と「何かをした経験」が
3対7の割合で覚えているそうです。
つまりは何かを「してあげた」としても覚えていないのが大半だと思った方が良いです。
伝えようとした事は本人にとって「知るきっかけ」に過ぎず
知った事を活用出来るかどうかは本人のモチベーションと集中力にかなり左右されます。
辛抱強く何回も同じ事を言わなくてはいけない場面も多いですが
大切なのは「あなたが教えた」ということではなく「本人が知った」という事です。
うまく伝わらないとしても、あまり腐らずに辛抱強く付き合っていく必要があると思っていて下さい。


## 知らないという事を知る事がとても大切

実は色々な会社で新人教育の話をしている中で一番多い勘違いなのですが
教育担当者が知っている事を詰め込んでいく方式は非常に効率が悪いです。
理由は簡単で、担当者は新人が何を知っていて何を知らないのかを「知らない」からです。
「まずは知ってそれを活用して納得していく」という教育フローを目指す担当者が
知らない事を知らないままに物事を進めていくのがいかに非効率で危険な事かは想像するに難くないですね。
まずはしっかりと事前ヒアリング、教えた事がちゃんと理解できたかの事後ヒアリング
日々のコミュニケーションをしてしっかりと対象者を知る事で
より効率の良い教育をしていく事が出来ます。


## 互いに知らないという事を認識して一緒に解決していく

もうひとつ知らない重要な事があります。
上に挙げた4つの要素を新人がどう解決していくかです。
それは担当者も新人本人も知りません。
お互いに知らない問題であれば「共通の課題」として一緒に悩んでいく必要があります。
もし担当者が解決方法にいくつか心当たりがあるのであれば提案してみて試してもらいましょう。
逆に新人の方で解決策に心当たりがあるのであればそちらを採用してみても良いかもしれません。
最終的には意識をせずに各課題をこなしていく事になると思いますが
最適解が見つからないうちは、解決方法の設定、実施、経過の観測、修正方法の検討という
いわゆるPDCAを回すのが良いかなと思います。
優れた教育者はいくつものフレームワークを持っていて最適な提案をしていける人だと思いますし
その部分を対象者に寄り添って実施していく事で、今後の伸びしろとも言える「考える力」を伸ばしていける人だと思います。

# まとめ
新しい経験は人を成長させてくれます。
それは教育担当者も同様です。
いかに効率良く情報を吸収し伝達していくか、という事に着眼点を持ってくるとスムーズに物事が運ぶかなと思います。
アンチパターンとしては「俺が言ったことをやれ」「こうすれば大丈夫だから」という
作業の押し付けや対話無き教育ですね。
相手がコンピュータなら持っているリソースの中でそういう事をしても良いかもしれませんが
感情を持った人間が相手であり、教育担当者の振る舞いが今後の新人の伸びしろに大きく関わるという事をよく考えて日々の対話をしていって欲しいと思います。
正直、スキルが一番伸びるのは教育担当になったあなた自身です。
日々悩みながらも新人と一緒に課題を解決していってくれる事を切に願っています。
AWSドキュメントを日本語で読む方法	


AWSを触っていて分からないことが出てくると
`emr gzip input` のようにググると
`http://docs.aws.amazon.com/` に分かりやすいドキュメントが引っかかる

### ただ、如何せん英語...


![S3DistCp_-_Amazon_EMR.png](https://qiita-image-store.s3.amazonaws.com/0/210/2eace884-5fd1-fd97-0dd8-80d1e8ac915c.png "S3DistCp_-_Amazon_EMR.png")


### つらい...


そこでドメインの後ろに `/ja_jp` を入れれると日本語ドキュメントが現れる

![S3DistCp_-_Amazon_EMR.png](https://qiita-image-store.s3.amazonaws.com/0/210/f4dfc5e1-eab0-5d37-4870-ade24409945b.png "S3DistCp_-_Amazon_EMR.png")


### ありがとうアーマーゾーン！
fast-forwardマージから理解するgit rebase

## 要約

- git rebase時には`git push -f`することが(頻繁に)ある。
    - -fは怖いオプションなので一体何のためにそれが必要なのか理解して使いたい。
- `git push`はリモートがローカルをfast-forwardマージで取り込めるという前提がある。rebaseではそれを満たさなくなることが多いため、-fが必要になるになる
- 「**リモートがローカルをfast-forwardマージで取り込めるという前提がある。rebaseではそれを満たさなくなることが多い**」を理解するためには、rebaseの仕組みとfast-forwardマージの意味を抑えると良い。

なお、この記事ではgit rebaseについては詳しく説明せず、fast-forwardについてまとめた。




## rebase
```text
A--B--C------F--G  (master)
       \    
        D--E  (feature)
```

この状態で(= featureブランチを切ったあとにmasterに変更が加えられている状態)

```
$ gco feature
# git rebase master
```
をすると、

```text
A--B--C------F--G  (master)
                 \
                  D'--E'  (feature)

# なお、rebaseをすると従来のD, Eとは異なるコミットIDが振られ直される。
# 従来のD, Eは新たにD’, E'に生まれ変わっており、そのコミットIDはもうない。
```

こうなる。
(ここまでの理解が怪しい場合はrebase = 付け替えということが理解できるまでggるとよい。)

この時点で重要な点は、**今ローカルのfeatureブランチはリモートのfeatureブランチとは異なるログを持つということ。**

```text
A--B--C------D--E (remote/feature)
A--B--C------F--G--D'--E' (local/feature)
```

今この状態でローカルからリモートに`git push` すると怒られる。

なぜならば **git pushはリモートがローカルをfast-forwardマージとして取り込める前提**にたっているから。

結論としては、`git push -f` すれば良いのだけど、理解せずに-fするのは怖いのでfast-forwardをここで理解する

## fast-forwardマージ
ブランチXと、そこから切ったブランチYがあるとする。
YがXでの変更をすべて含むときに行われるマージをfast-forward（早送り）マージという。
**つまり、分岐後に、元ブランチXにおいて変更がないときに行われるマージ**のこと

```text
A--B--C  (X)
       \
        D--E  (Y)
```
このようなとき、

```text
$ gco X
$ git merge Y
```
をすると、するするとブランチXの先頭がブランチYの先頭に移動する。 = 合流が行われない。

このようなマージをfast-forwardマージといい、git pushにおいてはこれができることが前提となっている

## つまり
featureブランチで作業しているとmasterと差分が出るのはよくある話である。
したがって、rebaseをするとremote/localで上記のように異なるログを持つので、そのままでは`git push`できない。

**この場合は気にせず`git push -f`してよい。**
単にremote/featureのブランチがローカルのそれによって強制上書きされるだけであるため。

安心。

## ref
Git push rejected after feature branch rebase - Stack Overflow
http://stackoverflow.com/questions/8939977/git-push-rejected-after-feature-branch-rebase

ブランチの統合【ブランチ】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
http://www.backlog.jp/git-guide/stepup/stepup1_4.html