OmniAICreator/Qiita-1.07M huggingface dataset:
ADDA > runtime argument > -store_int_field / -store_dip_pol > store internal fields and dipole polarizations

```txt:Environment
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

Excerpt from `manual.pdf` (last revised: February 20, 2014) related to save the internal fields.

### runtime parameter > -store_int_field / -store_dip_pol

@ manual.pdf > 11.7 Internal fields and dipole polarizations

> `-store_int_field`
> `-store_dip_pol`
> These options allow one to study in details the accuracy of the DDA (see e.g. [17]) or the
physics behind it. To save internal fields for future use by ADDA consider using checkpoints of
type “always” (§12.5).

### Field files

```
$ ./adda -grid 25 -store_int_field -maxiter 100
```

```IntField-Y
x y z |E|^2 Ex.r Ex.i Ey.r Ey.i Ez.r Ez.i
-0.2094395102 -1.466076572 -5.235987756 1.117036835 -0.02405501404 0.01851210121 0.4265089085 0.9619413614 0.0789243352 -0.05143356113
0.2094395102 -1.466076572 -5.235987756 1.117036835 0.02405501406 -0.01851210123 0.4265089085 0.9619413614 0.0789243352 -0.05143356113
-1.047197551 -1.047197551 -5.235987756 1.080829273 -0.03701212691 0.09467516163 0.4467058558 0.9303997369 0.0629824475 -0.0365979255
-0.6283185307 -1.047197551 -5.235987756 0.8888575386 -0.01687903824 -0.0712841231 0.4031262231 0.8443906708 0.08152662539 -0.0365822794
...
```

@ manual.pdf > B.7 Field files

> For each following data line first four numbers are ignored and next six numbers define the complex vector field in the following order: real and imaginary parts of x-component, the same for y-component, and then for z-component (all in particle reference frame).

> **It should be stressed that** dipole coordinates (first three numbers) are ignored, and correspondence between a field value and a dipole is based solely on the order of lines in the file. In other words, index of non-trivial data line exactly equals index of dipole.

### IntField, DipPol, and IncBeam

@ manual.pdf > C.9 IntField, DipPol, and IncBeam

> Internal fields, dipole polarizations (§11.7), and incident fields (§9) are saved to files IntField-X , DipPol-X , and IncBeam-X respectively. A separate file is used for each simulated incident polarization, their names end with different suffixes (X or Y ).

`x y z |E|^2 Ex.r Ex.i ... Ez.i`

> suffixes r and i denote real and imaginary parts respectively.

> All values are specified in the particle reference frame (§6.1).

> Symbol used in the first row for column labels is different for different fields. It is “ E ” for the
internal field, “ P ” for the dipole polarization, and “ Einc ” for the incident field.
技術英語 > What they have in common is that

@ http://thecodist.com/article/the-six-goals-of-every-programming-project

> I see that people hated when it was obvious the developers never looked at similar products or features from other companies:

意訳「他社の類似製品の機能を見ずに独自の機能だけ実装した製品をユーザは嫌う」

@ ３０代から大きくのびる人の勉強法 by 堀 紘一さん
> 最初に聞いてみて違和感のある話には、自分の知らないことが３０％以上入っている。３０％というのはデータに基づいた数字ではないが、私の経験則からは、人は３０％以上知らないことが含まれている話に接すると、まずは拒否反応が出るものだ。

UIについても30%以上独自のものになると拒否反応が出るのかもしれない。
Martin Heideggerの「存在と時間」を読んでいたら拒否反応(眠くなる）が出るのも同じだろうか。

<hr>
関連して思い出したのは

> What they have in common is that

[Linguee](http://www.linguee.jp/%E8%8B%B1%E8%AA%9E-%E6%97%A5%E6%9C%AC%E8%AA%9E/%E7%BF%BB%E8%A8%B3/what+they+have+in+common.html)

> What they all have in common is the fact that the switching device is installed in badly accessible locations. 

> これらの用途に共通するのは、 開閉器がアクセス性の悪い場所に設置されているという事実です。
誤差逆伝播法等に用いる 計算グラフ の基本パーツ

計算グラフ(computational graph)の 基本パーツ の図解です。

ニューラルネットワークの誤差逆伝播法を学習時に 計算グラフを 知りました。
局所的な計算を連鎖させていく考え方で、理解しやすくて良いですね。

#計算グラフの基本パーツ
本記事の図では、黒線・黒文字は順伝搬、赤線・赤文字は逆伝播を示します。

## z=f(x)
![BN_A_5_OneWay.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/2c45d364-2def-9fad-553c-c25ee1d05e18.png)

順方向 z=f(x) の計算の場合、
その逆伝播は 入力値$E$に f(x)の微分値を掛けた値が 出力となる。

## 加算ノード
![BN_A_1_Plus_E.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/93b6f59f-a278-f820-85df-f13a2874192c.png)

加算ノードの逆伝播は、 **入力値$E$ をそのまま** 伝達する。

>順方向 $z=x+y$ に対し、
　　$x$ の微分値 $\frac{\partial z} {\partial x}$ は $1$
　　$y$ の微分値 $\frac{\partial z} {\partial y}$ も $1$
のため、入力$E$ を そのまま伝達 となる。

## 乗算ノード
![BN_A_2_Multiply_E.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/98367463-bf18-b889-c4ce-d37390958f0c.png)

加算ノードの逆伝播は、 **入力値$E$ × 順伝播を入れ替えた値** を伝達する。

>順方向 $z=xy$ に対し、
　　$x$ の微分値 $\frac{\partial z} {\partial x}$ は $y$
　　$y$ の微分値 $\frac{\partial z} {\partial y}$ は $x$
のため、入力値$E$ × 順伝播を入れ替えた値を 伝達となる。


##分岐ノード
順伝播の式中の２か所で $x$が参照されている場合に、$x$の分岐と扱う。
![BN_A_6_Branch.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/a4fa56cf-d69e-c66d-b88a-18ed15dd8035.png)

逆伝播は、分岐先からの**逆伝播値の和** を伝達する。 

## 総和ノード
伝播する行列での一方向で(下図の例では$N$の方向で)総和を求める場合、(N,D)の行列は (D,)の次元になる。
![BN_A_3_Sum_0.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/db110497-949e-c540-2f1a-40ba05d2a86b.png)

総和は 下図の様に **多数の加算ノード** と読みかえ出来る。
![BN_A_3_Sum_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/ce310478-dcb4-0721-53c2-3fff574ec311.png)

総和の逆伝播は、(D,)次元の逆伝播の入力行列を、**そのまま$N$個に伝達し(N,D)次元**の行列を生成する。

![BN_A_3_Sum_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/66a67251-c441-b4ec-28c7-158d5d3115c7.png)

## Broadcast ノード
行列のアダマール積にて 
(N,D)次元の行列A と (D,)次元の行列Bの積を求める場合、Bは下図で示す Broadcast が行われ(N,D)次元の行列として演算する。

![BN_A_4_BroadCast_0.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/4e3d7e5e-b8f3-5bbb-a65a-77477c70f970.png)

Broadcastは N個への分岐ノードと読みかえが出来る。
逆伝播は、(N,D)次元の行列から (D,)次元への 総和となる。

![BN_A_4_BroadCast_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/169589/484af985-ae7c-70f3-6a29-65e16a1e1e4b.png)



#参考文献
* <a  href="https://www.amazon.co.jp/gp/product/4873117585/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117585&linkCode=as2&tag=noriaki0213-22">ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=noriaki0213-22&l=as2&o=9&a=4873117585" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />(第５章)

* ["Understanding the backward pass through Batch Normalization Layer"](https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html)

関連項目
　 [Mind で Neural Network (準備編2) 順伝播・逆伝播 図解](http://qiita.com/t-tkd3a/items/9bf50f2e10e6a15b6ed5)
vimでtabと<C-i>を使い分ける(mac)

## はじめに
キーボードのスキャンコードの仕様上、`tab`と`<C-i>`は等価扱いのようです[^1]
> Both the keys produce the same key scan code.

> ```
Ctrl-I      Tab
Ctrl-[      Esc
Ctrl-M      Enter
Ctrl-H      Backspace
```

上記より、vimで`tab`のキーバインドを登録したいけど
`<C-i>`(ジャンプリスト進む)が使えない、といった問題が発生します

Linuxでは下記の手法で分ける事ができるようです
http://qiita.com/norio13/items/9c05412796a7dea5cd91

macは上記のような解決法が中々見つかりませんでした

## 使い分け方法

1. Karabiner[^2]を使って`<C-i>`を`F12`等適当なキーに割り当てる

	```private.xml
	<only>TERMINAL</only>
	<autogen>--KeyToKey-- KeyCode::I, ModifierFlag::CONTROL_L, KeyCode::F12</autogen>
	```

2. vimで`F12`を`<C-i>`にする
	
	```.vimrc
	nnoremap <F12> <C-i>
	```
	
---

これにより、`tab`のマッピングを変更しても`<C-i>`に影響が出なくなります
後は`tab`を好きにマッピングする
	
```.vimrc
nnoremap <Tab> %
```

## おわり

[^1]: http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_2)?action=edit&section=2
[^2]: https://pqrs.org/osx/karabiner/
Kerasでウェブカメラから顔領域を検出し、年齢・性別を推定する

# はじめに
[顔画像から年齢・性別を推定するためのデータセットIMDB-WIKI](http://qiita.com/yu4u/items/a2410f46669c5f20ee8e)で紹介したデータセットを利用して、顔画像から年齢・性別を推定するネットワークを学習し、ウェブカメラからの入力画像を認識するデモを作成する。実装は[GitHub](https://github.com/yu4u/age-gender-estimation)を参照。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/139809/daa6a416-0078-4b5a-f430-7f5466e7fdcb.png)
IMDBのデータで学習し、WIKIのデータで検証した例。

## デモ
学習済みモデルもアップロードしているので、とりあえず学習なしでお試し可能（自動的に重みがダウンロードされます）。ウェブカメラからの入力画像からdlibで顔領域を検出し、年齢と性別をCNNで推定している。MBAでも1fpsくらいでてる気がする。
macOS Sierra, Python 3.6.0, Keras 2.0.2, Tensorflow 1.0.0, dlib 19.1.0, OpenCV 3.2.0, NumPy 1.12.0で動作確認。

```sh
git clone https://github.com/yu4u/age-gender-estimation.git
cd age-gender-estimation
python3 demo.py
```

# 年齢・性別を推定するネットワークを学習する
下記では、自分でデータセットをダウンロードし、ネットワークを学習する手順。

## データセット
[IMDB-WIKIデータセット](https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/)を利用する。このデータセットは、Internet Movie Database (IMDB) およびWikipediaをクローリングして作られたデータベースで、プロフィール画像、プロフィール画像から顔領域を抽出した画像、人物に関するメタデータから構成される。
下記により、IMDBおよびWIKIのデータセットがダウンロードできる。

```sh
git clone https://github.com/yu4u/age-gender-estimation.git
cd age-gender-estimation
./download.sh
```

下記で、学習に必要なデータ一式を`.mat`ファイルに変換する。顔画像（顔検出器で検出された顔領域の前後左右を40%拡張した画像）、年齢、性別がセットで格納される。

```sh
python3 create_db.py --output data/imdb_db.mat --db imdb --img_size 64
```

パラメータとか。

- `output`：出力`.mat`ファイル名
- `db`：利用するデータベース名（`wiki` or `imdb`）
- `img_size`：利用する画像サイズ（ネットワークへの入力）
- `min_score`：利用する顔画像のスコアのしきい値

データセットさえ整えてしまえば、別にKerasでなくても他のフレームワークでも簡単に同様の実装が可能。

## ネットワークモデル
CNNであれば何でも良い。元の論文 [1] では、pre-trainされたVGG-16をfine-tuningしている。ここでは、ResNet系で、より効率的に学習できるWideResNet [2] を利用する。[1] では、年齢と性別を推定するネットワークを別々に構築していたが、ここでは両方を同時に推定するため、global average poolingの出力に、出力数101のFC層と、出力数2のFC層をくっつける。
出力数101のFC層では、入力された顔画像を0〜100歳に分類する問題を解く。そして、推定された各年齢の確率と年齢をかけることで、年齢の期待値を年齢の推定値とする。[1] では、単純に年齢をRegressionするよりもこちらのほうが精度が良いことが示されている。
出力数2のFC層は単純に男女のクラス分類を解く。
本来はこれらの2つのタスクのロスに対して混合率$\lambda$のようなパラメータを設定してチューニングすべきかもしれないが、単純に1:1で足しても問題なさそうだったので特に何もしていない。

<img width="350" src="https://qiita-image-store.s3.amazonaws.com/0/139809/bc02bbc2-83fe-243f-b4b6-4e3fba88c024.png">

入力画像のサイズを64x64とした際のWideResNetの構成。幅のパラメータ$k$と深さのパラメータ$N$が存在する。

## 学習結果
上記のネットワークで、小さめのパラメータ$k=8$、$N=2$でIMDBデータセットを学習した結果は下記。OptimizerはベタにSGD+Momentumを利用。

<img width="450" src="https://qiita-image-store.s3.amazonaws.com/0/139809/586825d6-3392-1c57-a4f3-69e07e73a18c.png">
精度

<img width="450" src="https://qiita-image-store.s3.amazonaws.com/0/139809/16a42386-3343-091e-661a-fe95a5d14221.png">
ロス

データ数がある程度大きいので、数エポックでかなり収束する。学習率を0.1、0.02、0.004、0.0008と下げているが、途中から過学習するようだ。GTX1080で1エポック30分くらい。まだまだチューニングの余地がありそうだが、とりあえず上記の設定で`val_loss`が一番良かったモデルをデモ用に保存してある。


[1] R. Rothe, R. Timofte, and L. V. Gool, "Deep expectation of real and apparent age from a single image without facial landmarks," in IJCV, 2016.
[2] S. Zagoruyko and N. Komodakis, "Wide Residual Networks," in Proc. of BMVC, 2016.
A3Cでテトリスを強化学習させてみた (失敗例その1)


強化学習が流行っている昨今、自分も何か勉強せねばと思い、テトリスを強化学習で解かせてみることにしました。
強化学習というと、少し前に流行ったDQN、その後続いた研究成果の集大成であるA3Cの2種類が今まず学ぶべきものだろうということで、その2つを試しています。ただ、DQNではお話にならないくらい性能が出なかったのでわざわざ記事にはせず、思い出の中にしまいこみました。

一方、A3Cの方は多少「それっぽい」挙動を示し始めています。タイトルに「失敗例」としている通り、全然満足なレベルには到達していません。それでも、うちの妻曰く「何か考えている様子は見られる」と一定の評価をもらいましたので、一応、記しておく次第です。

# 参考にした論文・コード
- [googleの原論文](https://arxiv.org/abs/1602.01783)
- [googleの原論文の再現を試みた方のコード](https://github.com/miyosuda/async_deep_reinforce)
- [(まだ読んでいないが)より詳しい解説を試みていらっしゃる方のコード](https://medium.com/emergent-future/simple-reinforcement-learning-with-tensorflow-part-8-asynchronous-actor-critic-agents-a3c-c88f72a5e9f2)
- [TetrisをDQNで解いた実験論文](http://cs231n.stanford.edu/reports/2016/pdfs/121_Report.pdf)

# 実装
githubは[こちら](https://github.com/ysasaki6023/tetrisA3C/tree/v2.0)を参照。
- gameMgr.pyの中で、テトリスの動作を記述
- agent.pyの中で、A3Cの学習動作を記述
- train.pyで学習を実行。ループを管理。
- test.pyで、学習したモデルを使ったデモを実行。

今後もアップデート予定なこともあり、実験途中のコードを、きれいにせずそのまま載せています。間違い等ありましたら、ご指摘いただけますと幸いです。現状、(pythonなのに)メモリリーク的な症状がありますので、長時間の実行の際には工夫をお願いいたします。

## 

# 実験
- 実行環境: GeForce 960。なのであまり早くは無いです。
- 学習時間: 2~3日程度

- Model構造: Conv2Dを2層、その後Fully Connected層を2層、その後二股に分けて、ActorとCriticの出力を作り出しています
- Optimizer: Adam
- Leraning rate: 1e-4にて2日程度。その後、10万ゲームをこなすごとに半分にし、最終的に1e-5前後になっていたと思います

上記で最も重要だったのが、OptimizerとLearning rateの選定でした。
まず、Optimizer=RMSprop、Learning rate=1e-3の組み合わせではほぼ全く学習が進まず、Learning rate=1e-4へと変えてようやく学習が進むようになりました。ただそれでも一定のところまで行くと性能が伸び悩みを迎えてしまうことがわかり、Optimizer=Adamへと変えたところ、学習がより早く進むようになりました。

Optimizer=Adamが多くのケースで最強というのはよく知られています。強化学習の場合でも、同じく非常によい性能を持つということが一つの発見です。

Learning rateのスケジューリングは、学習をより良く進めていく上で大きなポイントのようです。どの強化学習の論文でも、スケジューリングに関しては行を割いて記載があります。
未知の課題に関しては、スケジューリングを事前に決めることは難しいですので、学習がサチり始めたなと思ったら、適宜止めて、学習係数を下げていくのが良いでしょう。

# 結果
下記画像は、1ゲーム中(積み上がって再スタートとなるまでを"ゲーム"と定義しています)で消せた行の平均をプロットしたものです。徐々に学習が進んでおり、消せる率も向上しています。ただ、2~3日学習させた時点では、最終的にまだ1にすら及んでおらず、つまり、大半のゲームで1列も消すことができずに終わっていることがわかります。


これを以て、本実験はタイトルの通り「失敗例」としています。
このまま続けていけば徐々に性能は向上していくのかもしれませんが、他に試したいことがある関係上、一旦ここで学習を止め、まとめとしています。

![スクリーンショット 2017-04-17 0.58.50.png](https://qiita-image-store.s3.amazonaws.com/0/124438/2a2fe9a8-c952-f59b-fea5-40d11c508249.png "スクリーンショット 2017-04-17 0.58.50.png")


Youtubeにプレイ動画をアップロードしています。よろしければ御覧ください。
[![Youtube movie](http://img.youtube.com/vi/WLDox5gBLqo/0.jpg)](http://www.youtube.com/watch?v=WLDox5gBLqo)

# 改善を検討している点
実はいくつか改善を検討できるポイントが見え始めています：
- Layerが浅すぎるので、もう一歩深くする: 既存の論文でテトリスに取り組んだものを見ると、実は結構深いネットワークを使用しています。今のネットワークに追加を行う予定です
- LSTMの追加: 今のネットワークは、1手前の自分がどのような戦略を行おうとしていたかすら覚えていません。各盤面を見ながら、反射的にボタンを操作しているような状況です。長期的な戦略を踏まえるという意味で、LSTMの採用は性能を大きく向上する可能性があります
- メモリリークの解消: 実は今のコードは、(pythonなのに) メモリリークのような挙動があり、長期間安定して走らせることができません。改善を検討しています

上記の改善を行った実験結果を、近々公開できればと思っています。
SSLで運用しているmastodonとS3の連携のハマりどころ

mastodonの画像とか動画をS3で管理しようと思ったらハマったので解決策を書きます。

# ハマりどころ

`.env.production`のS3の設定項目のうち、`S3_PROTOCOL`だけでなく`S3_ENDPOINT`も設定しないと、S3のSSLがうまく働かない。

# 原因

`S3_ENDPOINT`を設定しないと、画像のURLが`https://${bucket-name}.sp-${region}.amazonaws.com/.....`のようになる。
ところが、S3のSSL鍵は`sp-${region}.amazonaws.com`ドメインに対してのものなので、「不正なSSL鍵です」という警告が出て、ブラウザでアクセスできない。

# 結論

`.env.production`に以下のようなオプションを書き加えればよい。

```
S3_ENABLED=true
S3_BUCKET=${your-bucket-name}
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
S3_REGION=${your-bucket-region}
S3_PROTOCOL=https
S3_ENDPOINT=https://s3-${your-bucket-region}.amazonaws.com
```

# 感想

`.env.production.sample`の書き方がわかりづらいと思った。

# 備考

他の記事へのコメントで、 `S3_PROTOCOL` は設定しなくていいよっていうのがありました。 もしかしたら、`S3_PROTOCOL`を指定しなければ全部うまくいくのかもしれません（未確認）。
redmineの有償plugin

redmineの有償pluginを比較中です。
Qiita記事として沿わない内容かもしれませんので、削除するかもしれません。

# いいところ

- UNDO
- ツリーのレベルを一発で決めるボタン▲
- チケットの移動
- チケット右クリックメニューが出る★（EASYはWBSプラグイン）

# EASY

## いいところ

- リソースプラグインとの連携（工数割り当てみながら日程管理）★
- マウスでドラッグスクロール
- チャート側にチケット名が表示される

## おしいところ

- 開始日順にソートされる
- スケールが日、週、月に限定されている
- データの更新が遅い


# Lychee

## いいところ

- 曜日★
- ソート順を設定出来る★
- 全画面モード★
- REDO★
- マイルストーン表示★
- チケットの説明欄がみれる★
- 遅延の赤色表示が進捗までチェックしている

## おしいところ

- リソース管理との連携がない
自鯖Mastodonを更新したらうまく動かなくなったので元のバージョンに戻す

## 何か失敗したことに気づく
### 前のrevisionの戻そうと思う

そんな時のための git reflog

```
$ git reflog
c99fc08 HEAD@{0}: merge origin/master: Fast-forward
7447e7a HEAD@{1}: clone: from https://github.com/tootsuite/mastodon.git
```

元は 7447e7a で更新して c99fc08 になった状態です => 7447e7a に戻します

### 差分を確認するのです(確か更新したときに db:migrate をしたので戻さないといけません)

```
$ git diff 7447e7a..c99fc08 --name-status
A       db/migrate/20170409170753_add_last_webfingered_at_to_accounts.rb
A       db/migrate/20170414080609_add_devise_two_factor_backupable_to_users.rb
```
抜粋です 20170409170753 と 20170414080609 ですね

### とりあえず鯖落とします
systemdでないので自作init.dで止めます(node.jsはまあいいや)

```
# /etc/init.d/mastodon_web stop
# /etc/init.d/mastodon_sidekiq stop
```

### gitを戻す前にmigrateを戻します
migrateは昇順に適用されるので戻す時は降順に戻します。

```
$ RAILS_ENV=production bundle exec rake db:migrate:down VERSION=20170414080609
$ RAILS_ENV=production bundle exec rake db:migrate:down VERSION=20170409170753
```

### gitを更新前に戻します

```
$ git checkout 7447e7a
```

### ローカルブランチのmasterを消して更新前をmasterにしなおします

```
$ git branch -d master
$ git checkout -b master
```
これでgitは元の状態に戻りました

### Mastodonの起動準備をします
あらためてひととおり実行

```
$ bundle install
$ RAILS_ENV=production bundle exec rake db:migrate # 何も実行されないはず
$ RAILS_ENV=production bundle exec rake assets:precompile
```

### 鯖を上げる

```
$ /etc/init.d/mastodon_web start
$ /etc/init.d/mastodon_sidekiq start
```
node.js は残念ながらまだ手動で再起動しています。

### おわり
* いつのまにかタグが付いてるバージョンを使った方がいいよって追記されてた。ぐぬぬ。
 * https://github.com/tootsuite/mastodon/pull/1927/files
Heroku Postgres 定期運用コマンド


## バックアップの状態確認

````
 heroku pg:backups --app sushi
=== Backups
ID    Backup Time                Status                              Size    Database
----  -------------------------  ----------------------------------  ------  --------
b013  2015-03-18 19:03:16 +0000  Running                                     IVORY
b011  2015-02-18 17:55:38 +0000  Finished 2015-02-18 17:55:39 +0000  1.9GB   IVORY
b010  2015-02-17 19:14:43 +0000  Finished 2015-02-17 19:14:48 +0000  1.9GB   IVORY
b004  2015-02-11 19:00:55 +0000  Finished 2015-02-17 19:14:48 +0000  1.9GB   IVORY

==== Restores
ID    Restore Time               Status                              Size    Database
----  -------------------------  ----------------------------------  ------  --------
r002  2015-03-16 17:33:19 +0000  Finished 2015-03-16 17:33:19 +0000  1.9GB   IVORY
r001  2015-03-15 12:13:44 +0000  Failed 2015-03-15 12:13:47 +0000    1.7GB   IVORY
````

スケジュールの状態確認は以下で

````
$ heroku pg:backups:schedules --app sushi
Current backup schedules:
RED: daily at 2:00 (America/Los_Angeles)
````

## バックアップの作成

手動でのバックアップ作成は以下のコマンドで

````
$ heroku pg:backups:capture --app sushi
````

## バックアップのリストア

以下のコマンドでリストアが可能

````
$ heroku pg:backups:restore b101 DATABASE_URL --app sushi
````

例えば本番バックアップを他のアプリに移す場合は以下のコマンドで

````
$ heroku pg:backups:restore sushi::b101 DATABASE_URL --app sushi-staging
````

## 出展

https://devcenter.heroku.com/articles/heroku-postgres-backups#restoring-backups
Reactのアニメーションアドオン'react-transition-group'を試してみた


ドキュメントに書かれていますが`ReactTransitionGroup`と`ReactCSSTransitionGroup`はReact v15.5.0以上では非推奨となったようです。
代わりに`react-transition-group`の`TransitionGroup`と`CSSTransitionGroup`を使うことが推奨されるようです。
マニュアル通りですが備忘録てきに...

https://github.com/reactjs/react-transition-group

## react-transition-groupのインストール

```bash
$ yarn add react-transition-group
```

インストールはこれだけです。

## サンプルソース

ほとんどサンプルのままですが完成形は以下のようになります。

```js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
// React-Transition-Groupをインポート
import CSSTransitionGroup from 'react-transition-group/CSSTransitionGroup';

class TodoList extends Component {
	constructor(props) {
		super(props);
		this.state = {
			items: []
		};
	}
	handleClick() {
		// プロンプトを表示し追加された内容をstateに追加
		let val = prompt('Please enter something.');
		if (val === null) return;

		const newItems = this.state.items.concat([val]);
		this.setState({ items: newItems });
	}
	handleRemove(index) {
		// クリックした行をstateから削除
		let newItems = this.state.items.slice();
		newItems.splice(index, 1);
		this.setState({ items: newItems });
	}
	render() {
		// stateに保存されているリスト
		const items = this.state.items.map((item, i) => (
			<li key={ i } onClick={ () => this.handleRemove(i) }>
				{ item }
			</li>
		));
		return (
			<div>
				<button onClick={ this.handleClick.bind(this) }>Add</button>
				<CSSTransitionGroup
					component="ul"
					transitionName="example"
					transitionEnterTimeout={ 500 }
					transitionLeaveTimeout={ 300 }>
					{ items }
				</CSSTransitionGroup>
			</div>
		);
	}
}

ReactDOM.render(<TodoList />, document.querySelector('#app'));
```

jsファイルではまず`react-transition-group/CSSTransitionGroup`をインポートします。
あとはコンポーネントとして使用するだけです。

|属性|型|値|説明|
|:--|:--:|:--|:--|
|transitionName|string|example|CSSのclass名（任意）|
|transitionAppear|bool|true|マウント時のアニメーション|
|transitionAppearTimeout|number|500|マウント時のタイムアウト|
|transitionEnter|bool|true|追加時のアニメーション|
|transitionEnterTimeout|number|500|追加時のタイムアウト|
|transitionLeave|bool|true|削除時のアニメーション|
|transitionLeaveTimeout|number|300|削除時のタイムアウト|

`CSSTransitionGroup`はデフォルトで`span`タグが出力されます。公式サンプルでは`div`で囲んでいるので良いかもしれませんが上のサンプルでは`li`にしてみたのでそのような場合は`component="ul"`とすればOK。

```scss
.example-enter {
	opacity: 0.01;
	&#{&}-active {
		opacity: 1;
		transition: opacity .5s ease-in;
	}
}
.example-leave {
	opacity: 1;
	&#{&}-active {
		opacity: 0.01;
		transition: opacity .3s ease-in;
	}
}
```

`{transitionName}-appear`、`{transitionName}-enter`と`{transition}-leave`が基本の形になります。`-active`でアニメーションのcssを書くことで動作します。（classの規約を変更することもできるようです）

## JSのマイグレーション

上のサンプルで動作することは確認ができましたがコンソールに以下のWarningが表示されます。

> Warning: Accessing PropTypes via the main React package is deprecated. Use the prop-types package from npm instead.

これもReact v15でPropTypesが非推奨になったためのようです。

### 参考サイト

https://github.com/reactjs/react-codemod
http://blog.koba04.com/post/2017/04/14/react-dot-js-v155-and-v16/
http://qiita.com/azu/items/9d1985bf0140576894aa
AzureでUbuntu17.04を使う方法

# Ubuntu 17.04をAzureで利用するためのTips

Ubuntu 17.04がリリースされました。 これまでもUbuntuのリリース後すぐにAzureでは利用することができましたので、今回も確認してみます。

# そもそも利用できるのか？

Azureで利用可能なOSイメージとしてUbuntu 17.04が登録されているかを確認する必要があります。ここではAzure CLI 2.0を使っての確認方法をご紹介しておきます。

コマンドは以下の通り。今回はパブリッシャーがCanonicalになりますので

   az vm image list --all -p Canonical -o table

と実行すると、Azure上にCanonicalが公開しているOSイメージの一覧を取得できます。

出力を見てみると17.04の文字が見つけられるので、利用することは可能であることがわかります。

# マーケットプレイスからのデプロイは可能か？

2017年４月１６日現在、Azure MarketplaceにてUbuntu Serverを選んでも最新は16.10となっており、17.04を選ぶことができません。

https://azuremarketplace.microsoft.com/en-us/marketplace/apps/Canonical.UbuntuServer

こちらはCanonicalさんがマーケットプレイスに登録されている内容を更新することで対応されるため、時間の問題だと思います。今しばらく待ちましょう。

# 何か楽な方法は無いの？

とても簡単にUbuntu 17.04をAzureで利用する方法をご紹介します。

以下、手順です。

1. Githubで公開されているAzure QuickStart Templates の「very simple deployment of a Linux VM」を使う
2. テンプレートをちょっと変更して「17.04」を選択肢に追加する
3. デプロイする

では、少し細かく見ていきます。

まず１から。１は以下のURLで公開されているテンプレートです。

https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-simple-linux

こちらはAzure上でLinuxVMを作成するサンプルのテンプレートです。Github上で公開されており、Deploy to Azureボタンを押すと、実際にテンプレートをAzure上に読み込んでVMを作成することができます。こちらのテンプレートはUbuntuが利用されるようになっており、デプロイの過程でバージョンを選択することができるようになっています。

Deploy to Azureボタンをクリックし、テンプレートが読み込まれたポータルが表示されるところまで進めます。（前提：すでにAzureが利用できるアカウントを持っていること）

カスタムデプロイの画面が表示されたら、画面にある「テンプレートの...」というボタンをクリックします。

画面が切り替わり、読み込まれたテンプレートのソースが表示されますので、その中にある「ubuntuOSVersion」という部分を探します。
（２３行目くらいのはず）

```
        "ubuntuOSVersion": {
            "type": "string",
            "defaultValue": "16.04.0-LTS",
            "allowedValues": [
                "12.04.5-LTS",
                "14.04.5-LTS",
                "15.10",
                "16.04.0-LTS"
            ],
```

選択可能なバージョンが記載されている箇所に"17.04"を追加しましょう。
このとき、区切りのカンマに注意します。最後に追加する場合は、"16.04.0-LTS"の最後にカンマを追加し、次の行に"17.04"と書きましょう。

```
        "ubuntuOSVersion": {
            "type": "string",
            "defaultValue": "16.04.0-LTS",
            "allowedValues": [
                "12.04.5-LTS",
                "14.04.5-LTS",
                "15.10",
                "16.04.0-LTS",
                "17.04"
            ],
```


追記が終わったら、画面左下にある保存をクリックします。

保存が終わると元の画面に戻りますので、あとは必要項目を入力し、Ubuntu OS Versionにて17.04を選びます。

あとは画面の指示に従ってデプロイを待てばUbuntu 17.04のVMが作成されます。

とりあえず、すぐに使って見たい方はこのやり方が一番楽だと思いますのでお試しあれ。
Docker for Mac で Amazon Linuxのコンテナイメージを動かす

## はじめに
macbook air をクリーンインストールしたついでに、開発環境をイチから構築していました。
Docker の コンテナイメージ何にしようかと探していたら Amazon Linuxがコンテナ化されていたんですね。
(今更しりました…。)
ということで、折角知ったので macで Amazon Linuxのコンテナを動かしてみます。

## 前準備
### docker for mac のインストール
```bash:
$ brew cask install docker
```
```bash:
$ docker -v

Docker version 17.03.1-ce, build c6d412e
```
### aws cli の インストール と 設定
```bash:
$ brew install awscli
```
```bash:
$ aws --version

aws-cli/1.11.76 Python/2.7.10 Darwin/16.5.0 botocore/1.5.39
```
```bash:
$ aws configure

AWS Access Key ID [None]: `IAMのアクセスキー`
AWS Secret Access Key [None]: `上記IAMのシークレットキー`
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
## ここから本番

AmazonLinuxコンテナが配布されているECRへのログインコマンドを取得します。

```bash:
$ aws ecr get-login --region ap-northeast-1 --registry-ids 137112412989
```
```bash:
docker login -u AWS -p 'パスワード' -e none https://137112412989.dkr.ecr.ap-northeast-1.amazonaws.com
```

上記のコマンドが表示されるので、コピペして実行します。

```bash:
Flag --email has been deprecated, will be removed in 1.14.
Login Succeeded
```

ログイン成功したようなので、イメージの種類を ```aws ecr list-images```で確認してみます。

```bash:
$ aws ecr list-images --region ap-northeast-1 --registry-id 137112412989 --repository-name amazonlinux | grep 'imageTag'

"imageTag": "2016.09.0.20161028-with-sources",
"imageTag": "2016.09.1.20161221",
"imageTag": "with-sources",
"imageTag": "2016.09.0.20161118",
"imageTag": "2016.09-with-sources",
"imageTag": "latest-with-sources",
"imageTag": "latest",
"imageTag": "2016.09.1.20161221-with-sources",
"imageTag": "2016.09",
"imageTag": "2016.09.0.20161118-with-sources",
"imageTag": "2016.09.0.20161028"
```

ここでは もちろん latestをローカルにpull してみます。

```bash:
$ docker pull 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest
```
```bash:
$ docker images

REPOSITORY                                                      TAG                 IMAGE ID            CREATED             SIZE
137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux   latest              ff59a593059d        3 months ago        292 MB
```

試しに実行してみます。 ```docker run```

```bash
$ docker run -it 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest /bin/bash

bash-4.2# cat /etc/system-release
Amazon Linux AMI release 2016.09
```

おお。できてますね！
必要最低限のパッケージしか入っていないみたいなので、次回はこれを使って環境構築をしていきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/34731/b731a310-1105-f760-d790-0ee55fcbf389.png)

※ [classmethod](http://dev.classmethod.jp/cloud/aws/amazon-linux-container-image-on-mac/)さんの記事に cawsayが載っていたので、真似してみました。:-)

## SEE ALSO
- [Amazon Linux Container Image](http://docs.aws.amazon.com/AmazonECR/latest/userguide/amazon_linux_container_image.html)
- [dakull/linux_fun.md](https://gist.github.com/dakull/6615458)
- [Amazon LinuxのコンテナイメージをDocker for Mac上で動かす](http://dev.classmethod.jp/cloud/aws/amazon-linux-container-image-on-mac/)
HDP2.6がリリースされました

[Dataworks Summit Munichi 2017](https://dataworkssummit.com/munich-2017/)でも発表されましたが、今月(2017年4月)にHDP2.6がリリースされました。

今回はこのHDP2.6について説明していきたいと思います。

HDP2.6のハイライトは以下になります。

* Interactive Query in Seconds: Hive with LLAP and ACID Merge
* Enterprise Spark at Scale: Spark 2.1 and Zeppelin 0.7
* Real-Time Applications: HBase/Phoenix and Druid Support
* Streamlined Operations: Apache Ambari 2.5
* Dynamic Security: Enhanced Administrator Productivity

それぞれ簡単に説明していきます。

# Interactive Query in Seconds: Hive with LLAP and ACID Merge

HDP2.6からLLAP（Low Latency Analytical Processing）とACID Mergeが正式にサポートされました。

LLAPは、Hiveの新しいアーキテクチャで、最適化されたインメモリキャッシュと、YARNクラスタ内でクエリエグゼキュータをデーモン化することで、HadoopスケールでMPPパフォーマンスを実現します。LLAPはHDP2.5でテックプレビューとして入ってましたが、HDP2.6から正式にサポートされました。
LLAPの詳細については以下の資料をご覧ください。

https://www.slideshare.net/HadoopSummit/llap-subsecond-analytical-queries-in-hive-74811820

ACID Mergeは、Hadoopのデータメンテナンスのための機能です。insert、update、およびDeleteをシングルパスで処理することができるので、開発者はHadoopにデータを入れるためにこれまでやってきたような、複数ステージの更新パイプラインを実装する必要はなく、複雑なロールバックやリトライロジックを開発する必要もありません。さらに、HiveのACIDシステムは、書込みの競合を制御してくれるので、データを書き込み中に読み込みをしても問題ありません。
ACID Mergeの詳細については以下の資料をご覧ください。

https://www.slideshare.net/HadoopSummit/apache-hive-acid-project

それ以外にもHive関連では、TPC-DSのすべてのクエリがサポートされたり、AmbariのHive View 2.0もリリースされています。

# Enterprise Spark at Scale: Spark 2.1 and Zeppelin 0.7

Spark2.1が入り、SparkSQLでRow Columnレベルのセキュリティがサポートされました。またLivyもGAとなり正式サポートされています。また、Zeppelin0.7では、Spark2.xがサポートされ、その他にもKnoxベースのLDAPインテグレーションやSmartSenceのインテグレーション、そしてJDBCの改善がされています。

# Real-Time Applications: HBase/Phoenix and Druid Support

HBase(とSpark)のアップデートとしては、Spark-HBase(RDD)コネクタが正式にサポートされました。また、Phoenixとしてはインデックス機能の安定化等がされています。
そして、HDP2.6からDruidがテックプレビューとして追加されています。Druidは、大規模なデータに対するリアルタイムな探索的分析のために設計されたオープンソースのデータストアです。列指向のデータフォーマットとなっており、分散型でシェアードナッシングのアーキテクチャー、そして高度なインデックス構造を組み合わせて、低レイテンシなクエリ実行を実現しています。
Druidについて詳細に知りたい方は以下のドキュメントをご覧ください。

http://druid.io/docs/0.9.2/design/design.html

# Streamlined Operations: Apache Ambari 2.5

Ambariは2.5になっています。アップデートとしては、以下になります。

* ノードを再起動させた時に、起動させるコンポーネントを選べるようになった
* Grafana上でHDFSのアクティブなユーザやオペレーション数の上位N件のビジュアライズ
* ログローテーションの設定が簡単になった


HDFSのオペレーション数の上位N件のビジュアライズ
![image](https://qiita-image-store.s3.amazonaws.com/0/8576/63ec7e91-e905-b702-b2ce-d26673735879.png)

HDFSのアクティブなユーザの上位N件のビジュアライズ
![image](https://qiita-image-store.s3.amazonaws.com/0/8576/0f5d5378-edb9-b595-4400-d5e9309f6066.png)

# Dynamic Security: Enhanced Administrator Productivity

Rangerのアップデートは以下です。

* Seamless Policy Portability: Moving security policies en masse from one environment to another
* Easy of Use: Support for $username & Macro Variables in Ranger Policies
* Enterprise Ready: SSL Support for Spark Streaming Connections to Kafka

Atlasのアップデートは以下です。

* Ease of Use: Streamlined APIs makes it easy for customers and partners to build extensions
* Enterprise Ready: Extend Tag-based Policy Support to HDFS, Kafka and HBase
* Ease of Use: Knox SSO for Atlas UI
【iOS】ReactNativeで⌘+Rなどをできるようにする

iosのアプリ開発を行ったことがある方々には当たり前かと思いますが、React Nativeからネイティブアプリ開発に入門した人は知らないと分からないと思うので備忘して残しておきます。

## やること
SimulatorでHardware->KeyboardでConnect Hardware Keyboardがチェック付き状態にする。

これで、⌘+Rや⌘+Dができるようになる。

初めの時はこれが分からなくて、なんで俺のは⌘+Rや⌘+Dができないんだー！！ってなりました。。。
rails-dev-boxを使ってRailsの開発環境を作る


## はじめに

簡単にサクッとRuby on Railsの環境を作りたいかつ、ローカルのPC内はクリーンに保っておきたいと思いVagrantで環境を作ることにした。 rbenvでプロジェクトごとにRubyのバージョンも様々なプロジェクトに対応出来るようにするのがゴール。



環境は以下

* Vagrant 1.9.2
* Virtualbox 5.1.14

まずは上記の[Vagrant](https://www.vagrantup.com/)と[Virtualbox](https://www.virtualbox.org/)を各種OSに合わせてインストールします。

MacでHomebrewを入れていればcask形式でもinstallが出来ます

```
$ brew cask install virtualbox
$ brew cask install vagrant
```
　
　

## 1.rails-dev-boxをcloneする

適当に開発用のフォルダを作り、そこにrails-dev-boxをcloneする。
cloneが終わり、`vagrant up`をするとプロビジョニングが走るため、10数分以上待つこともあります。


```
// homeディレクトリに移動
$ cd
// Workspaceフォルダを作成
$ mkdir Workspace
// Workspace内に移動
$ cd Workspace
// rails-dev-boxをcloneする
$ git clone https://github.com/rails/rails-dev-box.git
// rails-dev-box内に移動
$ cd rails-dev-box
// vagrantを起動
$ vagrant up

```
 
 

## 2.rbenvとruby-buildを追加する

rbenvを使うことでプロジェクトごとにRubyのバージョンを切り替えられて便利なので、rbenvを導入します。

```
// vagrantが起動している状態で
$ vagrant ssh


// apt-getを最新にしておく
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y libreadline-dev
// rbenvをclone
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
// ruby-buildをclone
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

// 追加したrbenvまでのパスを追加
$ export PATH="$HOME/.rbenv/bin:$PATH"
$ eval "$(rbenv init -)"
$ source ~/.profile

```


## 3.任意のバージョンのRubyをインストール

```
// インストール可能バージョンの確認
$ rbenv install --list

//使いたいバージョンのRubyをインストール。以下例
$ rbenv install 2.4.0

// インストールしたバージョンが入っているか確認
$ rbenv versions

// 全体で使うRubyのバージョンを指定
$ rbenv global バージョン

//プロジェクトごとに切り替えたい場合
//プロジェクトのルートディレクトリに移動して
$ rbenv local バージョン


```

## 4.rails newをやってみる

実際にrails newが出来るところまでやってみる

```
// rails-dev-boxディレクトリまで移動してから起動
$ vagrant up

// 起動を確認
$ vagrant status

// vagrant内に入る
$ vagrant ssh

// rubyのバージョンを確認
$ ruby -v

// 作業ディレクトリに移動
$ cd /vagrant/


// rails newする
$ rails new app名

// app名フォルダに移動
$ cd app名

// railsサーバーを起動する
$ rails s -b 0.0.0.0


```

ここまでやったら[http://0.0.0.0:3000](http://0.0.0.0:3000)をブラウザのURLバーに入力することでRailsのwelcome画面が確認できるかと思います。

## 5.編集方法

サーバーの起動やrailsコマンドなどはsshでvagrant内に入って行わなければいけませんが、ファイルの編集はいちいちsshをしなくても行うことが出来ます。
sshをした先の`/vagrant/app名`はVagrantfileがあるディレクトリとリンクしているので、そこのファイル群を編集すればお手元のテキストエディタなんかで編集ができます。

## 6.vagrantコマンド一覧

```
// 起動
$ vagrant up

// ステータスを確認
$ vagrant status

// 停止
$ vagrant halt

// ssh接続
$ vagrant ssh
```


間違っている箇所等ありましたら、コメント頂ければとおもいます。
Ubuntu16.04とWindows10のデュアルブートマシンでWindowsを再インストールする

デュアルブートですでにWindowsが入っているマシンにUbuntuを入れる記事はあるが，その逆は少ない。

まずはいくつか調べる。
http://christina04.blog.fc2.com/blog-entry-183.html
http://htmlspecial.net/2015/11/15/ubuntu-windows8/

まずは
/dev/nvme0n1p1 システムで予約済み 500MiBぐらい
/dev/nvme0n1p2 380GiBぐらい　Windows10が入っているパーティション
の二つをGPartedで削除してntfsでフォーマット。
再起動してWindowsインストールディスクから起動。

それでwindows再起動したらubuntuのgrubが開くが，このwindowsは前のままなので，　ubuntu開いて

```
sudo update-grub2
```
やる。grub-installはなんかやるとまた問題ナルト思ってこれだけ。一応新しく認識してくれてwindows開ける。最初はなんどもwindows再起動して更新プログラムをインストールしてくれる。

前は更新プログラムのインストール自体ができなかったので，これはつまりかなりの進歩。嬉しいいいい。
あとはgpuやらcpu，マザボドライバ入れて,pythonやらの環境整えて，adobe，office，cad関係入れればいいかな。半日コースか。ま明日朝来てやろう。ここまでこれば一安心。
雑にQiitaの記事をバックアップする

ちょっと他に今までの記事を移行したいと思った時は、以下のコマンドでバックアップするとよい。

認証すれば、http://qiita.com/api/v2/docs#get-apiv2authenticated_useritems を見ればわかるとおり`GET /api/v2/authenticated_user/items`で自分の記事を取得できる。
しかし、認証は面倒なので、`/api/v2/items`でユーザ名を指定することで、上記と同等の結果を認証せずに取得できる。

```shell-session
$ curl "qiita.com/api/v2/items?query=user%3Aakameco&per_page=100"
```

zshrcか何かに雑に以下のコマンドを書いておくと捗る。

```bash
qiita-items() {
	curl "qiita.com/api/v2/items?query=user%3A$1&per_page=100"
}
```

こうすることで雑に整形してバックアップするのも簡単。

```shell-session
$ qiita-items akameco | jq -r . > backup.json
```
Cloudflare の DNS で設定したサブドメインをはてなブログの独自ドメインとして使うときは Status を DNS Only にする


# 結論

Cloudflare の DNS ではてなブログの独自ドメイン用に CNAME レコードを登録しているときは、そのレコードの Status を `DNS and HTTP Proxy (CDN)`（オレンジ雲アイコン）から `DNS Only`（グレー雲アイコン）に変更しましょう。雲をクリックすると変更できます。

![スクリーンショット_2017-04-16_22_26_16.png](https://qiita-image-store.s3.amazonaws.com/0/62097/35b91074-a0ee-1f78-05e9-66ddca954b4d.png "スクリーンショット_2017-04-16_22_26_16.png")


# 問題

Cloudflare の DNS で、自分で持っているドメイン `example.com` （例です）の A レコードを登録していました。このとき、はてなブログの独自ドメイン `blog.example.com` を設定するために、このドメインのサブドメイン `blog.example.com` を `hatenablog.com` のエイリアスとする CNAME レコードを作りました。しかし、はてなブログの管理画面で「ドメイン設定をチェック」をクリックしても `エラー レコードが見つかりませんでした` と表示されて、独自ドメインが設定できませんでした。

# 解決方法と理由

最初に「結論」で述べたとおりの方法で解決します。

`DNS and HTTP Proxy (CDN)`（オレンジ雲アイコン）のときは通信が Cloudflare を経由しているのですが、このときに該当のドメインを解決すると、CNAME ではなく、Cloudflare のサーバに向いている A レコードになってしまっていたのでした（ドメイン名は例に置き換えています）。

```
$ dig blog.example.com
; <<>> DiG 9.8.3-P1 <<>> blog.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15144
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;blog.example.com.                        IN      A

;; ANSWER SECTION:
blog.example.com.         300     IN      A       104.28.16.93
blog.example.com.         300     IN      A       104.28.17.93

;; Query time: 92 msec
;; SERVER: 192.168.10.1#53(192.168.10.1)
;; WHEN: Sat Apr 15 14:33:51 2017
;; MSG SIZE  rcvd: 64
```

`DNS Only`（グレー雲アイコン）に変更すると、Cloudflare をバイパスし DNS だけ使うようになるので、ドメイン解決の結果、該当の DNS レコードが期待どおり CNAME になっていることがわかります。

```
$ dig blog.example.com
; <<>> DiG 9.8.3-P1 <<>> blog.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49533
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;blog.example.com.                        IN      A

;; ANSWER SECTION:
blog.example.com.         300     IN      CNAME   hatenablog.com.
hatenablog.com.         6       IN      A       52.197.171.58

;; Query time: 92 msec
;; SERVER: 192.168.10.1#53(192.168.10.1)
;; WHEN: Sat Apr 15 14:45:37 2017
;; MSG SIZE  rcvd: 73
```

これで、はてなブログがこのサブドメインを認識できるようになります。

# 参考資料

- [はてなブログを独自ドメインで利用する - はてなブログ ヘルプ](http://help.hatenablog.com/entry/customdomain)
メモ：セキュリティ関係のヘッダ

今後のためのメモ。

Twitterウィジェット、GoogleAnalytics、Googleタグマネージャ、Googleフォントを使っている状態の設定。

これをベース設定します。

```php
// XSS攻撃を検知させる（検知したら実行させない）。
header("X-XSS-Protection: 1; mode=block");
// IEにコンテンツの内容を解析させない（ファイルの内容からファイルの種類を決定させない）。
header( "X-Content-Type-Options: nosniff" );
// JavaScriptの実行を許可する対象を 同一オリジンと一部ドメインに制限する
header("Content-Security-Policy: default-src 'self'; ".
       "connect-src 'self'; ".
       "style-src 'self' 'unsafe-inline' *.googleapis.com *.twitter.com *.twimg.com; ".
       "script-src 'self' *.twitter.com *.twimg.com *.googleapis.com *.googletagmanager.com *.google-analytics.com; ".
       "img-src 'self' 'unsafe-inline' data: *.twitter.com *.twimg.com *.google-analytics.com;".
       "font-src 'self' fonts.gstatic.com; ".
       "frame-src 'self' *.twitter.com;"
);
```
mysqlのカラムごとに重複を許可しない設定

mysqlでテーブルを作った後にカラムをユニークにしたくなったので、その時にやったこと。

#カラムにuniqueを設定する方法

```
alter table t_name add unique (col_name);
```

これだけでいけました。



この後にinsertしようして重複があると、下のようなエラーが出ました。

```
`_query': Duplicate entry '' for key 'col_name' (Mysql2::Error)
```

##エラーをさせない方法

```
insert ignore into col_name (col_name, ..) value ("value", ...)
```

普通のinsert文にignoreを追加するだけでした。
ローカルリポジトリをリモートにpushするまで

ローカルで作ったプロジェクトをGithubにあげる際の手順。
ちょいちょいやるのに毎回忘れるので、備忘録。

### 前提

公開鍵は作れているものとして、進めていきます。
もし、公開鍵を作成していない場合は[こちら](http://ken-sayama.hateblo.jp/entry/2016/01/04/235603)を参考に設定してください。

### では実践


```
// cdコマンドを使って、該当のディレクトリまで移動
// 今回はworkspace/hogeを例に
$ cd workspace/hoge

// gitを初期化
$ git init

// ステージングにあげる
$ git add .

// 最初のコミットメッセージを書く
$ git commit -m "first commit"

// リモートにアクセス
$ git remote add origin ここにgithubで作ったリポジトリのURL
// 例
$ git remote add origin https://github.com/hoge/hoge.git

//masterへpush
$ git push origin master

```

以上で完了です。
Rでplot（複数データのプロット）

Rでできる基礎的プロットからちょっとだけ進歩。

複数のデータ（時系列データなど）を同じ図の中に描くことをやってみます。例によって、いきなりコードの紹介

#まずは何も考えずmatplot
とりあえず、やってみます。

```r:qiita.rb
x <- 1:10
y1 <- 0.8*x
y2 <- 1.0*x
y3 <- 1.2*x
 
y4 <- matrix(0,10,4) 
 
y4[ ,1] <- x
y4[ ,2] <- y1
y4[ ,3] <- y2
y4[ ,4] <- y3
 
matplot(x,y4[ ,2:4])
```


このコードを、Rのコンソール画面にコピペしてエンターを押すと。以下の図が出ます。

![matplot1.png](https://qiita-image-store.s3.amazonaws.com/0/176129/1a69294c-e8ae-fb75-edba-ef1974c58284.png)

・・・ダサいですね（笑）
Rって万能だと思いきや、いきなりダサいです。言うこと聞いてくれていません。

プログラミング言語は、その名の通り、相手との対話が必要なようです。では、イメージ通りに複数データを表現するには何が足りなかったのでしょう。。。

#matplotを基本修正

とりあえず、以下のように変更してみます。

```r:qiita.rb
matplot(x,y4[ ,2:4],type=“l”)
```

すると。こうなります。

![matplot2.png](https://qiita-image-store.s3.amazonaws.com/0/176129/1fb2b4c7-ea4e-5d7e-5312-1c3898e2bac4.png)

おー！なんかそれっぽいです。この調子です。

#matplotでよく使うグラフィックパラメーター
そして、plot, matpoltなどで設定したい、基本的なグラフィックパラメーターは以下のものでしょうか。

```r:qiita.rb
#複数のデータをプロット
matplot(x,y4[,2:4],type="b",lwd=1.0,lty=1:3,pch=2:4,xlab=“xdata”,ylab=“ydata")

#凡例を書く
legend(2,10,c("y1","y2","y3"), col=1:3,lty=1:3,pch=2:4)

#表題を書く
title(main=“marplot sample”,sub=“by d-cassette”)   
```

これを実行すると、以下になります。

![matplot3.png](https://qiita-image-store.s3.amazonaws.com/0/176129/7e19369d-0ed8-823a-ca37-787f4b2b2b49.png)

とまぁ、この辺はググれば沢山情報はでてきますが、私が個人的によく使うコードを記録してみました。

その他の詳しい情報も含め、以下に記しています。
http://demacassette2.hateblo.jp/entry/2015/01/14/001031


では。
Gistをファイルシステムとしてマウントする

Gistをファイルシステムとしてマウントできるものを、Goで書いてみました。

https://github.com/ueokande/gist-fs

まだ以下の機能しか実装してませんが、それだけでも十分Gistを堪能できます。

- Gist一覧の取得
- ファイルの取得
- ファイルの更新

使い方
------

まず `go get` で取得します。

```
go get github.com/ueokande/gist-fs
```

次に、Gistにアクセスできる[personal access token](https://github.com/settings/tokens)を生成します。そしてコマンドラインから、gist-fsに引数を渡して起動します。`<username>`はGitHubのユーザ名、`<access_token>`は生成したpersonal access tokenを、そして引数の最後にマウント先のディレクトリを指定します。

```
gist-fs -u <username> -p <access_token> path/to/mount/point
```


使ったもの
----------

ファイルシステムにマウントするために、FUSEのGoライブラリである[hanwen/go-fuse](https://github.com/hanwen/go-fuse)を使いました。go-fuseの日本語の解説は、@lufiaさんの記事が参考になりました。

- [GoでFUSEを使ってGitHubのIssuesをマウントする](http://qiita.com/lufia/items/7719dcf5c49b2c5c8d8d)

また公式ドキュメントとサンプルも大変参考になります

- [hanwen/go-fuse/example](https://github.com/hanwen/go-fuse/tree/master/example)
- [go-fuse - GoDoc](https://godoc.org/github.com/hanwen/go-fuse)

そしてGistの[GitHub Developer Guide](https://developer.github.com/v3/gists/)を見ながらせっせと作ってました。

感想
----

驚く程に、簡単にファイルシステムを実装できて、楽しかったです。モチベーションとしては、リソースの場所を意識せず手元のエディタで編集したいだとか、他の言語への移植が面倒なシステムでもファイル操作だけでアダプタが書けるといった点でしょうか。
同一性・同値性判定(==,===,eql?,equal?)

Rubyの同一性・同値性判定について軽い備忘録。

あらゆるオブジェクトは値と一意的なIDをもつ。
オブジェクトIDは .object_idメソッドで確かめられる。
例えば、

```Ruby
a  = 2.0
b  = 2
c = "2".to_i
d = 2.0.to_i
e = 2.to_f

puts a.object_id  #=>  23370708
puts b.object_id  #=>  5
puts c.object_id  #=>  5
puts d.object_id  #=>  5
puts e.object_id  #=>  23370708
```

2つのオブジェクトを比較するとき、「.equal?」、「.eql?」、「==」、「===」などを使う。aとbを比較すると

```Ruby
puts a.equal? b  #=>  false
puts a.eql? b    #=>  false
puts a == b      #=>  true
puts a ===b      #=>  true
```

==,===については同値性を、equal?はID同一性を確かめている。
eql?はクラスによって振る舞いが変わる。Stringに対しては同値性(なので「==」と同じ)、Numericに対しては同一性(なので「equal?」と同じ)の判定を行う。
別の例として

```Ruby
s = "puyo"
t = "pu"
u = "yo"
v = t+u
w = "pu"+"yo"

puts s  #=>  puyo
puts v  #=>  puyo
puts w  #=>  puyo
```

IDと同一性・同値性を確かめると

```Ruby
puts s.object_id  #=>  23433564
puts v.object_id  #=>  23367516
puts w.object_id  #=>  23367480

puts s.equal? v  #=>  false
puts s.equal? w  #=>  false
puts s.eql? v    #=>  true
puts s.eql? w    #=>  true
puts s == v      #=>  true        wとの比較も同様
puts s === v     #=>  true        wとの比較も同様
```

関連してIDについて触れておくと、NumericとStringとで決まり方が異なる

```Ruby
a = 2
b = 2
c = 1 + 1
puts a.object_id  #=>  5
puts b.object_id  #=>  5
puts c.object_id  #=>  5

α = "pu"
β = "yo"
x = α+β
puts x.object_id  #=>  23532144

γ = "pu"
δ = "yo"
y = γ+δ
puts y.object_id  #=>  23532084

z = "puyo"
puts z.object_id  #=>  23532060

z = "puyo"
puts z.object_id  #=>  23532036
```

Numericは値に対してIDが決まるが、Stringについては変数に値を格納する毎にIDが変わる


最後にハッシュについて。
ハッシュの値参照を行う際、ハッシュオブジェクトの内部では.eql?メソッドでキーIDを比較している。そのため次のような振る舞いをする。

```Ruby
h = {"i"+"d" => "value"}
puts h["i"+"d"]     #=> value
puts h["id"]        #=>  value

k = {2.0 => :valuable}
puts k[2.0]         #=>  valuable
puts k[2]           #=>  nil
```
Milkcocoaのチュートリアルを実装【入門者向け】

#はじめに
Milkcocoaのチュートリアルを見て詰まっている入門者向けの記事です。
チュートリアルの補足をしていきたいと思います。

#実行環境
OS X 10.12.4
Milkcocoa v0.6.0

#事前準備
5 minutes Tutorialの「1. Milkcocoaを使う準備をする」まで終了しておいてください。

#チュートリアル実装
1. 「2. スマートフォン側のコードを書く」の ```index.html``` と ```main-sp.js``` を同じディレクトリ（便宜上SPと名付けます）に置いて下さい。
2. 「3. PC側のコードを書く」の ```index.html``` と ```main-pc.js``` を同じディレクリ（便宜上PCと名付けます）に置いて下さい。
3. SPディレクトリ、PCディレクトリをそれぞれ異なったポート番号でローカルサーバにあげて下さい。ローカルサーバの構築方法について分からない方は[こちら](http://qiita.com/pafu/items/06f78b391d8ae72dfcc5 "一行のコマンドでローカルサーバを構築する【Mac】")を参考にして下さい。
4. スマホでSPディレクトリがあるサーバに、MacでPCディレクトリがあるサーバにアクセスすれば動作確認ができると思います。スマホからアクセスする方法がわからない方は[こちら](http://qiita.com/pafu/items/10d2cf13681c8a28f2dc "Macで立てたローカルサーバにスマホからアクセスする")を参考にして下さい。

#補足
PC側のサイトでスマートフォンの表示が見切れてしまうって方は

```HTML:index.html
~省略~

<div style="text-align:center">
  <img id="image" src="https://s3-ap-northeast-1.amazonaws.com/new-tutorial/smartphone.min.svg" alt="スマートフォン">
</div>

~省略~
```

と ```<div style="text-align:center"> ~ </div>``` を追加すると見やすくなります。

#おわりに
Milkcocoaでリアルタイム通信やってみたかったぜ…。でもチュートリアルすら(´・ω・`)
って方の参考になってれば嬉しいですm(_ _)m
私も最初は「で？このファイルどうしたらいいの？」って感じだったので…（・・；）
[Vue.js] ディレクティブと式のTips


#一つの`v-on`に２つのメソッドを指定する
```html
<button @click="foo() + bar()">ボタン</button>
```
このように`+`で繋ぐとクリック時に`foo()`と`bar()`の２つのメソッドが発火します。
`+`が特別な意味を持つというわけではなく`*`でも`-`でも同じで、JavaScript式として普通に評価されるためです。
短絡評価を使って、`@click="disabled || foo()"`などのように書くことも出来ます。

#`$emit`の引数を`v-on`内の式で直接処理する
`$emit('nice-event','foo!!!','bar???')`とイベントを発火するとき、
Vue2.0初期のドキュメントでは、`v-on:nice-event="foo = arguments[0];foo = arguments[1];"`というやり方が書かれていましたが、
現在は次のようにアロー関数で書くことが推奨されてるみたいです。

```html
<my-component 
v-on:nice-event="(x,y)=>{ 
    foo = x; 
    bar = y; 
}"
></my-component>
```

#標準ビルトインオブジェクトが使用できる
```html
<p v-if="Math.random() > 0.5">気まぐれに表示</p>
```
`Math`や`Date`などホワイトリストに登録されている標準のグローバルオブジェクトを式の中で使用できます。
で、そのホワイトリストはどこなんだって話ですが、[ここ](https://github.com/vuejs/vue/blob/master/src/core/instance/proxy.js)です。
`const allowedGlobals`ってやつですね。


#`require`が使用できる
```html
<p>{{require('util').formatDate(date,'MM月dd日')}}</p>
```
ホワイトリスト見てもらえばわかりますが、実は`require`も使えます。
汎用的なテキスト関数は、Vueのグローバルに登録するのは嫌だし、mixinで毎回登録するのも億劫で、個人的にはよくエイリアス張って`require`を使ってます。

#`v-bind`に直接オブジェクトが渡せる
```html
<p v-bind="{
  class:['aaa','bbb','ccc'],
  style:"color:red",
  id:'main'
}">test</p>
```
`v-bind:class=""`とやるのが推奨されていますが、v-bindに直接オブジェクトを渡すこともできます。
優先度はオブジェクトで渡したほうが高いみたい。
使い道としては、不定な属性名を使いたいときや、属性を付けたり消したりしたいときとか？

#`v-bind`でDomのプロパティを操作する
```html
<p v-bind:inner-html.prop="'baz'"></p>
```
`.prop`修飾子を使うと属性ではなくDOMのプロパティに対してバインディングできます。
vue.jsだけ使ってる場合にはあまり意味はないですが、他のライブラリと組み合わせる時、どうしても必要になったりします。
シェルスクリプトで「ls -l」等で列挙されたファイル毎に処理をするときのメモ

初歩的ですが、いつも都度調べちゃうので備忘のために。

例えば下の出力結果のうち、所有権が「user」のtxtファイルのみバックアップファイル(.bak)を作りたいとする。
ついでに作成日時をバックアップファイル名に記載する(例：aaa.txt.20170401-1200.bak)

```
# ls -l
(1)        (2) (3)  (4)   (5) (6) (7) (8)   (9) 
-rw-r--r-- 1   user group 10  Apr 1   00:00 aaa.txt
-rw-r--r-- 1   root group 10  Apr 2   00:00 bbb.txt
-rw-r--r-- 1   user group 10  Apr 2   00:00 ccc.txt
```

そんなときはこんな感じでシェルスクリプトを書く。

```sh:sample.sh
#! /bin/sh

TSTMP=`date "+%Y%m%d-%H%M"`

ls -l | grep user | while read LINE

do
    FILE=`echo ${LINE} | awk '{print $9}'`
    cp -p ${FILE} ${FILE}.${TSTMP}.bak
done
```

最初に戻って初歩的ですが、いろんなファイルに対して何かする処理をやりたいときになんだかんだで重宝します。
(数100ファイルとかあったらいちいち手を動かしてられないっすもんね・・・)

そんな感じです！
さくらサーバ・UTF-8に対応したWEBブラウザにMecabで形態素解析した結果を出力する

#概要
さくらサーバにおいて、UTF-8に対応したWEBブラウザに
Mecabで形態素解析した結果を出力する。

プログラミング言語は、python2.7を使って解説します。
Mecabの出力結果をWEB上に出力する際の参考になれば幸いです。


Mecab本体のインストール、および、MecabのPythonからの呼び出しは、
前回の記事を参照してください。

さくら共有サーバーにmecabをインストールしてpythonから呼び出してみる
http://qiita.com/Jshirius/items/3a067486e2a693544c32

文字コードは、UTF-8を使っています。
Mecabの文字コードは、デフォルト「euc-jp」になっており、UTF-8で結果を出力するのハマった。
よって、メモを残しておく。

#前提条件
前提条件
この記事では、以下のディレクトリをWebのRootとします。
/home/orehome/www/test

プログラムを置く場所
/home/orehome/www/test/cgi-bin

ソースファイルのファイル名
mecab_sample.py



#内容
(1)ソースコードを書く
以下のようなソースコードを書きます。

```py:mecab_sample.py

#!/usr/bin/env python
# coding: UTF-8

import MeCab

#辞書ファイルの場所をフルパスで指定します（相対パスだと何故か読み込みに失敗した）
userdic_path="-d /home/orehome/local/lib/mecab/dic/ipadic"
t = MeCab.Tagger("-Ochasen " + userdic_path)

text = u'すもももももももものうち'
# utf8へ変換
encoded_text = text.encode('utf-8')
meData = t.parse(encoded_text )

#改行コードを<br>に変換
meData = meData.replace("\n","<br>")


html_body="""
<html><body>
入力文字例：<br>%s
<br><br>
形態素解析結果<br>
%s
</body></html>"""



print "Content-type: text/html\n"
#以下のmetaタグがないと、Cromeで文字化けが発生する
print "<meta charset=utf-8 />"
print html_body % (encoded_text,meData)
```

作成したソースコードは、サーバの任意の位置に置いてください。
ただし、ソースコードはcgiで動くため、cgi-binディレクトリ以下においてください。

この例では、以下の場所にファイルを置きます。
/home/orehome/www/test/cgi-bin/mecab_sample.py

(2)アクセス権限を実行可能に変更する
アクセス権限を実行可能にする。
これを忘れて、WEBページにアクセスしたら、ブラウザは、
真っ白になって解決に1時間も要しました・・・。
`chmod 755 mecab_sample.py`

(3)pythonのWEBサーバを起動する
「cgi-bin」の一つ上の階層に移動して以下のコマンドを入力してサーバを動かします。
この記事の場合は、/home/orehome/www/testに移動して以下のコマンドを入力しています。

`python -m CGIHTTPServer`

ログアウトしてもサーバを動いている状態にしておく方法は以下の通り
`nohup python -m CGIHTTPServer &`

~~※nohup使う方法が、本番環境で運用する場合、正しいのかわかりません。
もし知っている人がいたら教えてください！~~

2017年4月18日追記
本番環境で運用する場合は、以下の資料が参考になります！
さくらでシンプルなPYTHON CGIを動かしてみる（環境設定編）
http://www.mwsoft.jp/programming/python/sakura/010_010.html

(4)WEBブラウザ動作確認
私の環境は、python2.7を使っています。
ブラウザから該当のURLを叩きます。

http://domain_name:8000/cgi-bin/mecab_sample.py

ただしく動作していると以下のように表示されます。

![スクリーンショット 2017-04-16 14.10.48.png](https://qiita-image-store.s3.amazonaws.com/0/46535/ead43f7c-5a94-b1e2-5e54-d699da2f92c7.png)
Gitの森を歩く

参考にしたもの
https://git-scm.com
http://dev.classmethod.jp/tool/git/hub/

# Gitコマンド

## リモートリポジトリの登録

```
git remote add origin <repository>
```

githubの場合

```
git remote origin git@github.com:kentakozuka/sample.git
```

## リポジトリの登録を削除

```
git remote rm origin
```

## リモートリポジトリのブランチへのプッシュと削除


`<remote-repository>`リポジトリの`<remote-branch>`ブランチに`<local-branch>`ブランチをプッシュする

```
git push <remote-repository> <local-branch>:<remote-branch>
```

ブランチ名が同じ場合は省略可能

```
git push origin master
```
は以下と同じ

```
git push origin master:master
```

以下のようにすると`origin`リポジトリの`sample`ブランチを削除できる

```
git push origin :sample
```

これは

```
git push origin <empty-branch>:sample
```

と考えればよい


## フェッチ
トラッキングブランチを最新にする。
リモートブランチ（origin）から最新の情報を取ってきて、トラッキングブランチ（origin/master）を更新する

```
git fetch origin
```

## マージ

```
(git checkout <branch-to-be-merged>)
git merge <branch-to-merge>
```

masterブランチにworkブランチをマージする場合

```
(git checkout master)
git merge work
```

マージコミットを残す

```
git merge work --no-ff
```

## プル
リモートブランチからフェッチしてマスターブランチ（master）へマージする

```
git pull origin
```

以下と同じ

```
(git checkout master)
git fetch origin
git merge origin/master
```

## ブランチを作成

```
git branch <new-branch> <original-branch>
```

現在いるブランチから新しいブランチを作成する場合

```
git branch <new-branch>
```

## ブランチの削除

```
git branch -d <branch>
```

## ステージングをキャンセル

```
git rm --cached ファイル名
```

## diff

### ブランチ間

```
git diff [ブランチ名A] [ブランチ名B]
```
### インデックスと作業ディレクトリの差分

```
git diff
```

HEADとインデックス

```
git diff –cache
```

２つのコミット

```
git diff [COMMITID1] [COMMITID2]
```

ファイル指定

```
git diff [FILE]
``` 

## コミット

### コミットを新しい順に表示

```
git log
```

### コミットの取り消し
3つの重要なオプション
--soft
コミットだけ

--mixed (デフォルト）
コミットとインデックス

--hard
コミット・インデックスに加え、ワークディレクトリの内容も書き換える



#### 直前のコミットの取り消し

```
git reset HEAD^
```

### 直前のコミットに上書き

```
git commit --amend
```




#hubコマンド

hubコマンドをgitコマンドで使用できるようにする
evalでhub alias -sが展開されてalias git=hubとなる

```
vim .bashrc
...
eval "$(hub alias -s)"
...
```

##アカウントの設定

GitHub の Settings の中にある Personal access tokens にて生成

```
---
github.com:
- protocol: https
  user: <ユーザ名>
  oauth_token: <トークン>
```

##hub pull-request
cliからプルリクエストを作成する

```
hub pull-request -b <upstream-repo>:<branch> -h <downstream-repo>:<branch>
```

エディタが立ち上がる
1行目がタイトル
2行目は空白
3行目からが本文



# vim fugitive

ステータスを見る

```
:Gstatus
```

差分を見る

`:Gstatus`の一覧画面で`D`