OmniAICreator/Qiita-1.07M huggingface dataset:
html/templateで共通のボイラープレートを使いまわして異なるコンテンツを出す

# やりたいこと

Goでwebアプリを書く際にサーバサイドで `html/template` を使って複数のコンテンツをHTMLにレンダリングするが、ボイラープレートを抜き出して共通化したい。

# やりかた

あらかじめ、初期化時にすべてのテンプレートをパースしておく。このとき、ボイラープレート中で `"content"` を未定義としておき、コンテンツでも定義しないでおく。レンダリング時、コンテンツ毎に `"content"` をそのコンテンツのパース済みのテンプレートへの別名として定義しレンダリングする。

# 具体例

ボイラープレートを `layout.html` 、異なる２つのコンテンツとして `foo.html` と `bar.html` を使った例を考える。

 `foo.html` と `bar.html` は個別のコンテンツを含むが、 `<html>` や `<body>` といったボイラープレートが無い不完全なテンプレートであり、一方 `layout.html` は `"content"` が未定義なのでこのままではレンダリングできないテンプレートである。

これら３つのテンプレートを含む `*template.Template` をクローンし、 `"content"` を `foo.html` または `bar.html` の `*parse.Tree` に紐付けることで、ボイラープレートを使ったテンプレートが得られる。

https://play.golang.org/p/yLlFoOe2ET

```go
package main

import (
	"html/template"
	"os"
)

// 実際には `var ts = template.Must(template.ParseGlob("./views/*.html"))` とかでやりそう
var ts *template.Template
func init() {
	ts = template.Must(template.New("layout.html").Parse(`
<html>
<body>
  {{ template "content" . }}
</body>
</html>
`))
	ts = template.Must(ts.New("foo.html").Parse(`<div>this is foo</div>`))
	ts = template.Must(ts.New("bar.html").Parse(`<div>this is bar</div>`))
}

func main() {
	t := template.Must(ts.Clone())
	t = template.Must(t.AddParseTree("content", t.Lookup("foo.html").Tree))
	if err := t.ExecuteTemplate(os.Stdout, "layout.html", nil); err != nil {
		panic(err)
	}
	
	t = template.Must(ts.Clone())
	t = template.Must(t.AddParseTree("content", t.Lookup("bar.html").Tree))
	if err := t.ExecuteTemplate(os.Stdout, "layout.html", nil); err != nil {
		panic(err)
	}
}
```

実行すると、共通のボイラープレートを使った完全な `foo.html` と `bar.html` がそれぞれ出力される。

```

<html>
<body>
  <div>this is foo</div>
</body>
</html>

<html>
<body>
  <div>this is bar</div>
</body>
</html>

```
Cloud Vision APIでのテキスト検出


Cloud Vision APIのテキスト検出APIを試してみた。
いろいろな言語でのライブラリが公式から出ているようだが、
今回はRubyのものを使って試してみた。

## 準備
#### ・Google Cloud Platformでプロジェクトを作成
[Google Cloud Vision APIのクイックスタート](https://cloud.google.com/vision/docs/quickstart?hl=ja)
までをやる。

これでAPIで利用する、プロジェクトIDを取得できる。


## 実行

公式の[Text detection samples](https://cloud.google.com/vision/docs/detecting-text?hl=ja)の通り。


### gemをインストール
gemがあるのでinstall。
(これは、テキスト検出に限らず他のcloud-vision APIもまとめて使える)

```
gem install google-cloud-vision
```

### 実行
準備のところで取得したプロジェクトIDを取得し実行。

```
# project_id = "Your Google Cloud project ID"
# image_path = "Path to local image file, eg. './image.png'"

require "google/cloud/vision"

vision = Google::Cloud::Vision.new project: project_id
image  = vision.image image_path

puts image.text
```

## いろいろな画像で試してみる

### ・かなりわかりやすい画像
![test.png](https://qiita-image-store.s3.amazonaws.com/0/19638/7c7d4634-565d-a91b-407d-da32dd0d44a9.png "test.png")
#### 結果
```
image.text
=> #<Text text: "あいうえお\nABC\n", locale: "ja", bounds: 4, words: 2, pages: 1>
```
これは完璧

### ・文字を少し汚す

![test3.png](https://qiita-image-store.s3.amazonaws.com/0/19638/6629402b-a0c8-abf4-e886-7bfcceabd550.png "test3.png")

#### 結果
```
=> #<Text text: "あい うえお\nAB\n", locale: "ja", bounds: 4, words: 3, pages: 1>
```
微妙に読めなくなった。ノイズの色が文字と違っても、文字へのノイズ率？的なのが多いとだめな雰囲気。

### ・文字を汚す

#### 結果

![test2.png](https://qiita-image-store.s3.amazonaws.com/0/19638/054c3d80-f447-bf6c-0576-39051b73f873.png "test2.png")

```
image.text
=> nil
```

認識まったくされなくなった。
文字色は全く違うんだから、そのあたりうまくやってくれそうな気がしてたが甘かった。

### ・文字を回転1

![test4.png](https://qiita-image-store.s3.amazonaws.com/0/19638/377043c6-5f0a-5e40-1a32-cf5ce5d074fb.png "test4.png")

#### 結果
```
image.text
=> #<Text text: "あいうえお\n", locale: "ja", bounds: 4, words: 1, pages: 1>
```

回転された「あいうえお」は認識されたが、回転しなかった「ABC」が認識されなくなった（wordsも2->1に)

### ・文字を回転2

![test5.png](https://qiita-image-store.s3.amazonaws.com/0/19638/70c2628f-75aa-52df-deb0-132601e50b92.png "test5.png")

#### 結果
```
image.text
=> #<Text text: "あいうえお\n", locale: "ja", bounds: 4, words: 1, pages: 1>
```

「文字を回転1」を同じ結果。
回転された「あいうえお」は認識されたが、回転しなかった「ABC」が認識されなくなった。
これ、画像内の文字がみんな同じ（ような？）角度じゃなければだめなのだろうか。

### ・文字を回転3

![test5.png](https://qiita-image-store.s3.amazonaws.com/0/19638/ac9e3dcd-6ae0-2ea2-fff0-1bed139dab44.png "test5.png")

#### 結果
```
image.text
=> #<Text text: "ABC\nあいうえお\n", locale: "ja", bounds: 4, words: 2, pages: 1>

```

同じ角度の回転ならOKのようだ。ABCの認識が先になったので、たぶん画像を逆さのものとして最初っから検出しているようだ
### ・文字を回転4

![test7.png](https://qiita-image-store.s3.amazonaws.com/0/19638/e62d30b4-0071-9e90-e6f7-72d1145c024f.png "test7.png")

#### 結果
```
image.text
=> #<Text text: "ABC\nあいうえお\n", locale: "ja", bounds: 4, words: 2, pages: 1>

```

この角度の回転までならOKのようだ

###・文字を回転5

![test8.png](https://qiita-image-store.s3.amazonaws.com/0/19638/be2ad40d-424a-1378-ae2d-92ab9525509c.png "test8.png")

#### 結果
```
image.text
=> #<Text text: "あいうえお\n", locale: "ja", bounds: 4, words: 1, pages: 1>

```

この角度はだめ

## 所感
公式gemがあり、導入までのハードルはすごく高いもののちょっとした角度やノイズで認識されないのでどういう画像を読み込ませるかはかなり考慮しないといけなそう。
【備忘録】Linux上でAzure IoT HubのPython用SDKをセットアップした話

# あらすじ
Microsoft Azure上のサービスの一つであるAzure IoT Hubを
Python3.x系から使うためのSDKをインストールしようとした時のお話。

いつもどおり「azure iot sdk」とググって情報を集めはじめた所、
以下のサイトがヒット。

・https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-python-getstarted

上記サイトによると、pipでインストール可能なパッケージとして、
以下が既に存在しているとのこと。

・azure-iothub-service-client
・azure-iothub-device-client

何も考えずに以下を入力。

```bash
pip install azure-iothub-service-client
```

しかし。

```bash
Downloading/unpacking azure-iothub-service-client
  Could not find any downloads that satisfy the requirement azure-iothub-service-client
Cleaning up...
No distributions at all found for azure-iothub-service-client
Storing debug log for failure in /root/.pip/pip.log
```

エラー吐きました。

上のサイトをよく見てみると…
「azure-iothub-service-clientとazure-iothub-device-clientのpipパッケージは、WindowsOSでのみ利用可能」
という旨の記載が。Linuxから使う場合は、別の方法でインストールする必要があるとのこと。

# githubからパッケージをcloneしてビルド。
さくっとclone。

```bash
git clone --recursive https://github.com/Azure/azure-iot-sdk-python.git
```

サブモジュールとしてリポジトリに含まれているファイルもビルドで必要になるので、
cloneする時は--recursiveオプションを付ける必要があります。

cloneが終わったら、以下を参考に…

・https://github.com/Azure/azure-iot-sdk-python/blob/master/doc/python-devbox-setup.md#linux

ビルドとインストールをしてくれるスクリプトがあるので、そこまで移動します。

```bash
cd azure-iot-sdk-python/build_all/linux/
```

Python3.4用にビルドしたかったので、以下のようにしました。
--python-version、--build-pythonのオプションを省くと、
いずれも2.7用としてセットアップ/ビルドされるようです。

```bash
sudo ./setup.sh --python-version 3.4
sudo ./build.sh --build-python 3.4
```

build.shが成功すれば、Python3.4環境下でimport出来るようになります。

以上、備忘録まで。
SwiftのUITableViewAutomaticDimensionで可変にならない時

メモ的に簡単に残しとく

UITableViewCell内のUILabelを複数行表示した時に、Cellが可変にならずにtext(UILabel)とその下の要素が被った。

stroyboardはこんな感じ
![スクリーンショット 2017-08-27 19.52.17.png](https://qiita-image-store.s3.amazonaws.com/0/31292/84f24b46-7a61-eeb1-96aa-a26de28a3e9c.png)

###問題点
AutolayoutでimageViewの上下にも制約追加して、
かつimageviewの右のブロックでもheightが決まるような制約を追加していたため、
cellのheightを決める制約が2つありコンフリクト状態みたいになってて、imageViewの制約が適用されてcellが可変にならなかった。

可変にしたいなら可変が想定されるUILabelなどの要素がある方の高さだけをAutoLayoutで設定してやる

###Swift初心者つらい
WindowsでNNabla（Neural Network Libraries）とNeural Network Consoleを試してみた

#NNabla（Neural Network Libraries）とNeural Network Console
NNablaは、Neural Networkフレームワークであり、Neural Networkを構築するためのライブラリでC++とPython2, Python3が利用できる。
2017年8月17日、NNabla用のGUIツールNeural Network Consoleが公開された。
Neural Network Consoleを利用すればコードを書かなくてもGUIでNeural Networkを構築でき自動でいろいろと最適化をしてくれるらしい。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/1AsLmVniy0k/0.jpg)](https://www.youtube.com/watch?v=1AsLmVniy0k)
参考：http://qiita.com/HirofumiYashima/items/10b7773ea00fda17868e


#NNablaのインストール
## 要件
公式で動作保証されているのはWondows8.1とWindows10。
NNablaに必要なソフトは

* Python 2.7 or Python>=3.5: PIP
* Microsoft Visual C++ 2015 Redistributable

オプションで

* CUDA Toolkit 8.0 / cuDNN 6.0 (for NVIDIA GPU users)

が利用できる。

## インストール
1. Microsoft Visual C++ 2015のインストール
 https://www.microsoft.com/ja-JP/download/details.aspx?id=52685

2. Miniconda（Python3）のインストール
https://repo.continuum.io/miniconda/Miniconda3-latest-Windows-x86_64.exe
3. scipy scikit-image ipythonのインストール
インストールされたAnaconda Promptで
```$ conda install scipy scikit-image ipython```
4. CUDAのインストール（オプション）
http://nnabla.readthedocs.io/en/latest/python/install_on_windows.html#cuda-toolkit-8-0-cudnn-6-0
5. NNablaのインストール 
インストールされたAnaconda Promptで
```$ pip install nnabla```

#Neural Network Consoleのインストール
https://dl.sony.com/ja/
メールアドレスを入力して同意するとNeural Network Consoleのダウンロードリンクが送られてくる。（おおよそ1GB）
参考：http://imagingsolution.net/deep-learning/neural-network-console/neural-network-console-download-install/

neural_network_console_100.zipを解凍してneural_network_consoleをダブルクリックでNeural Network Consoleが起動する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131558/ca9e9aa7-1eef-43da-622c-63b736e52f9d.png)

#Neural Networkの構築と学習と評価
お試しのNeural Network構築です。

1. プロジェクトの新規作成
New Projectをクリック
![test.png](https://qiita-image-store.s3.amazonaws.com/0/131558/bf30a235-230e-b751-befb-944504e2c3d0.png)

2. 全結合の3層のニューラルネットワークを構築
 MNISTの学習を想定（入力層28x28、中間層100+活性化関数ReLU、出力層1）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131558/4023f286-4220-6b04-558e-1871ec1dad48.png)

3. トレーニングデータ等の設定
 DATASETのクリック
 ![test2.png](https://qiita-image-store.s3.amazonaws.com/0/131558/9ace3b34-6e80-63c2-c972-8dcf6a00ccc1.png)
TraningとValidationのURIをそれぞれ設定
 Training : mnist_training.csv
 Validation : mnist_test.csv
![test3.png](https://qiita-image-store.s3.amazonaws.com/0/131558/901ce478-7085-053a-e2e0-0376157e93ae.png)

4. 学習
Trainingの再生ボタンを押すと自動的に学習が始まります
![test4.png](https://qiita-image-store.s3.amazonaws.com/0/131558/d172b962-21b4-94b1-5d70-c04ddab7510a.png)

5. 評価
Evaluationの再生ボタンを押すと正解データとNeural Networkの出力値（出力層は1でfloatで出力）が比較できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131558/d52b3e26-c757-05f3-7aa0-80b50a75cd71.png)

#その他
今回雑なネットワークでしたが、ソフトマックスでMNISTの0~9の確率を出すモデルがサンプルで用意されているので参考にしてみてください（ホームの12_residual_learning.sdproj）。
※時間があったら自動最適化とか追記します
#注意書き
私自身SONY社員ですが、個人としての記事であり、組織とは関係ありません。

#参考ページ
https://blog.dl.sony.com/53/
http://arakan-pgm-ai.hatenablog.com/entry/2017/08/23/003000
投稿した数学動画リンク

# 概要

最近、口頭での説明練習も兼ねてYouTubeで数学関係の動画を少しずつ上げている。目標は機械学習に必要な統計学をある程度網羅できるようにすることだが、少しゴールが遠すぎるので、とりあえずは統計学の初歩に出てくるいろいろな確率分布を一通り整理することを目指したい。随時更新予定。

# 動画作成練習
- [eの定義](https://www.youtube.com/watch?v=qSrr-QuAxTs])
    - 自然対数の底の定義と、それが定義になっていることの説明。
- [(1+1/x)^xの極限](https://www.youtube.com/watch?v=qZOt-1hBBSk])
    - 実数の範囲で${\rm lim}_{x \rightarrow \infty} ( 1 + \frac{1}{x})^x = {\rm e}$となることの証明。
- [(1+1/x)^xの極限を用いた極限公式](https://www.youtube.com/watch?v=Rhhcw-G_7ck])
    - ${\rm lim}_{x \rightarrow \infty} ( 1 + \frac{1}{x})^x = {\rm e}$を用いた極限公式。
- [指数関数、対数関数の微分](https://www.youtube.com/watch?v=n57_y6MBuxw])
    - 指数関数、対数関数の微分公式の証明。

# 確率論
- [確率の定義](https://www.youtube.com/watch?v=18bA6walV8w)
    - 標本空間、事象族、確率の組で確率モデルを定義する。
- [確率変数](https://www.youtube.com/watch?v=pFutB5FVMxo)
    - 確率モデルから確率変数を定義する。
- [確率分布](https://www.youtube.com/watch?v=ZqpC6YsZ7Es)
    - 確率密度関数、確率質量関数を定義する。
- [確率モデルと確率分布](https://www.youtube.com/watch?v=DPAiyzWNPFI)
    - 確率モデルと確率分布の関係の補足説明。
- [条件付き確率](https://www.youtube.com/watch?v=5Ml7satR-_s)
    - 条件付き確率の定義。
- [ベイズの定理](https://www.youtube.com/watch?v=USuGOKL4YyU)
    - ベイズの定理の例と証明。
- 期待値と分散
    - 期待値と分散の定義。
- 確率変数の変換
    - ある確率変数を別の確率変数に変換する方法。
- (参考) チェビシェフの不等式
    - 平均から遠い事象が起きる確率を評価する不等式
- (参考) コーシー分布
    - 分散の定義できない確率分布の例

# ロードマップ
- これからやりたいこと一覧
    - サムネイルをなんとかする
    - 動画のHeader(先頭数秒)とFooter(終了数秒)に何かコメントっぽいものを入れる
    - Headerにそれっぽい音楽を入れる
    - Python + Rでの実装との対比
    - 独立サイトで管理する
    - 確率論に長居せず、早めに機械学習理論に倒したい
    - 多分線形代数が必要？
【備忘録】pipでプロキシを突破できなくて詰まった話

# 前提
・Windows7 64bit
・Python3.x（Anacondaにて導入）
・プロキシあり

上記の環境にて、conda installで入れることが出来ないPythonパッケージを、
pipにてインストールしようとしたけどプロキシに阻まれ時間を溶かした話。

# --proxyオプションでは突破できず
最初に試した方法はこれ。

```bat
pip install piyopiyo --proxy http://user:pass@fooooo.proxy.local:8080
```

「pip プロキシ」とかでググると上位に表示されるやつですね。
ただ、実施した環境では上記で解決とはなりませんでした。


# 環境変数を使ったらできました
上記のオプションにつけるタイプと並んでヒットするのが以下。

```bat
set HTTP_PROXY=http://user:pass@fooooo.proxy.local:8080
set HTTPS_PROXY=http://user:pass@fooooo.proxy.local:8080
```
をやって、

```bat
pip install piyopiyo
```

とする方法。
試してないけどLinuxなら以下な感じ？

```bash
export HTTP_PROXY=http://user:pass@fooooo.proxy.local:8080
export HTTPS_PROXY=http://user:pass@fooooo.proxy.local:8080
```


pipは443ポートを使ってパッケージを取りに行ってるっぽいし（エラーメッセージ的に）、
HTTPS_PROXYの設定が決め手なのかも…？

とりあえず、備忘録まで。
組み合わせテストを簡単にするgemを作る


# コンセプト

---
# [pict](https://github.com/Microsoft/pict)や ~~[Pairwiser](https://inductive.no/pairwiser-tool/)~~(2017/12/1でサービス終了) を使って組み合わせテストのパターンを作るのは楽になった

## [参考](http://qiita.com/hanahiro_aze/items/54193a4a286f4e40f831)

---
# が、

---
# rspecで使うためには加工が必要。

---
|No.|first_name|last_name|
|---|---|---|
|1|"aaa"|"bbb"|
|2|"あああ"|""|
|:|:|:|
みたいなやつを

---
```
 where(:id, :name, :comment) do
          [
            [2, "てすと", "コメント"],
            [5, "test", "comment"],
            [6, "a" * 32, "test"],
            [7, "ﾃｽﾄ", "test"],
          ]
        end
```
のようにイイ感じに整形しないといけない。

---
# （yamlのパーサーを書けばよかったのではないか。）

---
# [gem](https://rubygems.org/gems/senju_kan_non)にしました！！！

---
# アルゴリズムの紹介

---
高校数学をちょっと思い出す。

`異なる n 個のものから r 個を選ぶ場合の、組み合わせの数`

```math
nCr = \frac{nPr}{r!} = \frac{n!}{r!(n-r)!}
```

---
# 便利メソッド1
combination

```
[1,2,3,4].combination(2) do |first, second|
  p "(#{first, #{second}})"
end

=> (1,2) (1,3) (1,4) (2,3) (2,4) (3,4)
```

---
# これで、2引数のarrayを組み合わせるのが実現できる。
```
{
  :first=>[1, 1, 1, 2, 2, 2, 3, 3, 3], 
  :second=>["a", "b", "c", "a", "b", "c", "a", "b", "c"]
}
```

---
テーブルにすると、こんな感じ。

|key|v1|v2|v3|・・・|
|---|---|---|---|---|
|first|1|1|1|・・・|
|second|a|b|c|・・・|

---
目指すのはこの形

|No.|first_name|last_name|
|---|---|---|
|1|"aaa"|"bbb"|
|2|"あああ"|""|
|:|:|:|

---
# :thinking:  行列を入れ替えたい。。。

---
# 便利メソッド2
transpose

```
values =  { :first=>[1, 1, 1, 2, 2, 2, 3, 3, 3], 
            :second=>["a", "b", "c", "a", "b", "c", "a", "b", "c"]}
values.transpose

=> [[1, "a"], [1, "b"], [1, "c"], [2, "a"], [2, "b"], [2, "c"], [3, "a"], [3, "b"], [3, "c"]]
```

---
以上をベースに、重複したパターンの削除、テーブル作成時に欠損するデータの補完処理を足した。

---
# これから作るところ

---
- 網羅する水準の指定ができるようにしたい。
- 組み合わせを作るアルゴリズムを高速に。
- 禁則処理
- ~~出力された組み合わせをファイル出力~~ ([0.1.3](https://github.com/hanahiroAze/senju_kan_non/releases/tag/v0.1.3))

---

# 作ってから知ったgem。[pairwise](https://github.com/josephwilk/pairwise)
ペアプロで得られるもの

# ペアプロで得られるもの

2017/08/27 Symfony meetup #１７

@okapon_pon 

* 日本Symfonyユーザー会
* Symfony歴6年

---

## 今日お話すること

1. ペアプロで得られるもの(メリット)
2. ペアプロの難しいところ(デメリット)

---

## 今日お話したいこと

1. ペアプロで得られるもの(メリット)
2. ペアプロの難しいところ(デメリット)

※ よって、Symfony関係ありません

---

## 今日お話しないこと

ペアプロのやり方は話しません
ペアプロにおける開発環境

---

## ペアプロで得られるもの

---

月並みですが

* 成果物の品質向上が期待できる
* コードの共有所有のが進む
* 新メンバー(中途採用や別チームの人)の立ち上がりが早い
* ジュニアの教育として有効
* 開発tipsの共有(環境、ツール)

---

## 成果物の品質向上が期待できる

相談しながら開発するので良いものが生まれやすい

* 機能やUI
* システムの設計
* ネーミング

---

## コードの共有所有のが進む

* 一緒にコードを書くので単にレビューするだけよりも深く理解することができる
* エンジニアの冗長化
    * １人が休んだとしても安心(ビジネス目線)

---

## 新メンバーの立ち上がりが早い

* システム構成が分かる
* コードだけでは読み取れないビジネス背景が分かる

---

## ジュニアの教育として有効

* 直接教えられるのは得られるものが大きい
* PRベースで「直してください」とやり取りしたらコメントだらけ・・・

---

## 実際やってみて分かったこと

---

## 実際やってみて分かったこと


意外と開発効率は落ちない

* 開発はコーディングそのものより考えている時間の方がほとんど
* タイピング中は手元に集中しがちで考えることが難しいが、ナビゲーターはその間も考え続けることができるので次にやるべきことにスムーズに着手できる
* ナビゲーターはミスにもすぐ気が付いてくれる

---

## やってみて感じた最大のメリット

---

## やってみて感じた最大のメリット

PRにおける心理的ストレスからの開放(主観です)

レビュアー、レビュイーどちらの立場でもストレスから開放されます。

---

## レビュアーの立場

---

## レビュアーの立場として辛いこと1

たくさんのレビューをしないといけない

* 特定の人にレビューが集中する（レビュー地獄で開発できない)
* 変更内容の保証まではできない
    * 本当にこれでよいのか判断がつかない
    * どこまで考えられて作られたのか、コードだけで汲み取るのは難しい
    * 下手すると変更の背景自体が良く分からない

---

## レビュアーの立場として辛いこと2

github上のやり取りが辛い
（コミュニケーションコスト）

* コードは直して欲しいけど、それを伝えるのが大変
* PRが巨大化する前に設計相談して欲しかった
    * できれば全部書き直して欲しい（でも今更そこまで言えない）

---

## ペアプロはレビュアーの負担が軽くなる

ペアプロしたものに関しては変更背景が分かっている = レビユー時間が短縮できる

* 実装方針にズレが出ない
* どこまで考えて作て作ったのか、妥協点はどこだったのか
* 特に効果が大きいのはリファクタリング
    * コードのdiffだけで読み解くのは辛い
    * 思考過程が追えるので変更漏れがないか確認も簡単

---

## ペアプロはレビュアーの負担が軽くなる

* 複雑なものほどレビューコストが下げられるし安心
* 書き終わったコードに対して、「こうして欲しい」と後から言う必要がない
* なにより一緒に開発することで、自分の開発時間も確保できている

⇒ 心の健康

---

## レビュイーの立場

---

## レビュイーとして辛いこと1

何度も手戻りが発生してしまう(特にジュニア)

* レビューで何度も差し戻しされて一向にリリースできない

---

## レビュイーとして辛いこと2

動くものはできたけどこれで良いか自信が持てない

* クラス設計、ディレクトリ設計
* URLやネーミング等の簡単なことも含む
* 言語やフレームワークなどのお作法

---

## ペアプロはレビュイーの心理的負担も軽くなる

これから書くコードに自信が持てる = 安心して開発できる

e.g.
* 今回実装すべきこと
* 実装方針
* ネーミング
* テスト

---

## ペアプロはレビュイーの心理的負担も軽くなる

書き終わった時が完成 = 即リリースできる

---

## その一方で

---

## ペアプロの難しいところ

---

## ペアプロの難しいところ1

達成感は得づらい

* 自分で１人でやり遂げたわけではない

ペアでやると窮屈に感じる時もある

* もちろん１人で書きたい時もある
* いいアイデアを思いついたときは一気に書き上げたい

ペアプロは苦手という人はどうしてもいる

---

## ペアプロの難しいところ2

人事評価

* 誰の成果なのか？
* 目標もチームのエンジニア皆同じになりがち・・・

---

## まとめ

---

## まとめ

* ペアプロで得られるメリットは総じて大きい
* 特に心理的ストレスからの開放は計り知れないほど大きい
* 一方デメリットもあるので組織にアジャストする必要性はある

---

## ありがとうございました
Unet通信をEditor上とアプリで実行した時の問題

Unet初心者です。



開発環境
Mac OS : 10.12.3
Unity : 5.6.1f1



テストの仕方
クライアント - Unity Editor
ホスト - Buildしたアプリケーション
※アプリにはRun in backgroundのオプションを付けた



問題点
Playerオブジェクトではないsphereをホスト起動時にSpawnし、クライアント側のマウス入力でそのsphereのpositionを操作しようとしたができない。
ちなみにそのsphereにはNetwork Transform, local client authorityを付加しており、Mouse入力時の動作は、isLocalClientフラグがtrueな時を条件に、[Command]関数内で記述している。



理由?
マウス入力時のisLocalClientのフラグを確認したところ、falseとなっていた。
クライアント側から入力したのに、falseになっているのはおかしい。。
少し気になって、クライアント側の各フレームおきのisLocalClientを確認したところ、フラグがフレームおきにtrue->false->true->falseと変わっていた。
反対にホスト側のisLocalClientはずっとtrueのままだった。

このフラグがフレームおきに切り替わるせいで、クライアント側からのマウス入力時の操作ができなかったのだろうか。。

未だ解決策が見つからない。
node-jt400を試してみた（SQL Update）

#SQL update
```SQLupdate.js
app.get("/update", function (req, res, next) {
    var count = 0;
    pool.update("update member set prof=? WHERE id=?", ["更新してみた", 100])
        .then(function (nUpdated) {
        count = nUpdated;
        res.send(count + "件更新しました");
    });
});
```
コールバックで戻ってくる値は更新された件数がセットされます。
![nodejt07.png](https://qiita-image-store.s3.amazonaws.com/0/146069/0449b6db-0105-1851-5e77-863977c7810c.png)
更新結果
![nodejt08.png](https://qiita-image-store.s3.amazonaws.com/0/146069/42d585ae-dbb7-8ab7-0d54-0376585f3384.png)

#SQL insert
```SQLinsert.js
app.get("/insert", function (req, res, next) {
    var insertIds = "";
    var tableName = "MEMBER", idColumn = "ID", rows = [
        { ID: 105, LNAME: "織田", FNAME: "信長", PROF: "目標達成前に・・", TOKUTEN: 10.5 },
        { ID: 106, LNAME: "豊臣", FNAME: "秀吉", PROF: "天下統一しました。", TOKUTEN: 10.6 }
    ];
    pool.insertList(tableName, idColumn, rows)
        .then(function (listOfGeneratedIds) {
        for (var _i = 0, listOfGeneratedIds_1 = listOfGeneratedIds; _i < listOfGeneratedIds_1.length; _i++) {
            var insertId = listOfGeneratedIds_1[_i];
            insertIds = insertIds + insertId.toString() + ",";
        }
        res.send(insertIds + "を挿入しました");
    });
});
```
こちらは残念ながらV5R4では実行できませんでした。
原因ですが、どうも内部的には以下のSQLが発行されるようです。

```
SELECT ID FROM NEW TABLE(INSERT INTO MEMBER (ID, LNAME, FNAME, PROF, TOKUTEN) VALUES(?, ?, ?, ?, ?), (?, ?, ?, ?, ?)) 
params: [105,"織田","信長","目標達成前に・・",10.5,106,"豊臣","秀吉","天下統一しました ",10.6]

```
このSQLが解釈出来ないようで、エラーになってしまいます。

V7R2では実行できましたので、結果を載せておきます。
![nodejt09.png](https://qiita-image-store.s3.amazonaws.com/0/146069/51bb62ff-da96-5d55-9aa2-74604cd93975.png)

![nodejt10.png](https://qiita-image-store.s3.amazonaws.com/0/146069/e3ca5e61-8388-9fa7-38d4-46eb24639e70.png)

#SQL batch update
```SQLbatchUpdate.js
app.get("/batchUpdate", function (req, res, next) {
    var insertIds = "";
    var data = [
        [107, "徳川","家康","初代",1],
        [108, "徳川","秀忠","二代目",2],
        [109, "徳川","家光","三代目",3]
    ];
    pool.batchUpdate("INSERT INTO MEMBER (ID,LNAME,FNAME,PROF,TOKUTEN) VALUES(?,?,?,?,?)", data)
        .then(function (result) {
        for (var _i = 0, result_1 = result; _i < result_1.length; _i++) {
            var insertId = result_1[_i];
            insertIds = insertIds + insertId.toString() + ","; //result is number of updated rows for each row. [1, 1, 1] in this case.
        }
        res.send(insertIds + "を挿入しました");
    });
});
```
こちらはV5R4で実行できました。
![nodejt11.png](https://qiita-image-store.s3.amazonaws.com/0/146069/7f3f730e-1740-9943-a284-cea2e3f5b14e.png)
戻り値は、それぞれの行に対する更新件数を返すようです。

![nodejt12.png](https://qiita-image-store.s3.amazonaws.com/0/146069/35e4bf17-3e4f-a134-2234-84fc1fb952b2.png)
extensibleのAssociateを使ったEff型を具体型にする

※ 本記事はextensible-effectsパッケージではなくextensibleパッケージの
`Data.Extensible.Effect`モジュールについての記事です


# 解答

```haskell
context :: ( Associate "greet" (WriterEff [String]) xs
           , Associate "message" (WriterEff [String]) xs
           ) => Eff xs ()
```

　上記の型を具体化すると

```haskell
context :: Eff '["greet" >: WriterEff [String], "message" >: WriterEff [String]] ()
```

という具体型になる。


# Data.Extensible.Effectでの抽象的なEff型
　extensible-effectsではこのような抽象化された`Eff`型で、`Writer`モナド相当の操作ができましたが

```haskell
context :: ( Member (Writer [String]) r
           ) => Eff r ()
context = do
  tell ["hi"]
  tell ["thanks !"]
```

　extensibleパッケージでは、`WriterEff`, `ReaderEff`などの
`Data.Extensible.Effect`での作用を名前付き（`Symbol`付き※1）で管理できるので、
重複した作用を別のものとして扱うことができる。

```haskell
context :: ( Associate "greet" (WriterEff [String]) xs
           , Associate "message" (WriterEff [String]) xs
           ) => Eff xs ()
context = do
  tellEff #greet ["hi"]
  tellEff #message ["extensible, OverloadedLabels, and TypeApplications is great"]
  tellEff #greet ["thanks !"]
-- これらを
-- leaveEff . runWriterEff @ "message" . runWriterEff @ "greet"
-- すると
-- (((),["hi","thanks !"]),["extensible, OverloadedLabels, and TypeApplications is great"])
-- という値が得られる
```

- 参考になる公式記事
    - [extensible: Extensible, efficient, optics-friendly data types and effects](https://hackage.haskell.org/package/extensible-0.4.3)
    - [extensible - School of Haskell | School of Haskell](https://www.schoolofhaskell.com/user/fumieval/extensible)

## ※1
　`String`（`[Char]`）を種に昇格すると`Symbol`になるっぽい？ まだ調べてない。

- [GHC.Types](https://www.stackage.org/haddock/lts-9.1/ghc-prim-0.5.0.0/GHC-Types.html#t:Symbol)


# Data.Extensible.Effectでの具体的なEff型
　上の型

```haskell
context :: ( Associate "greet" (WriterEff [String]) xs
           , Associate "message" (WriterEff [String]) xs
           ) => Eff xs ()
```

を解凍する関数

```haskell
leaveEff . runWriterEff @ "message" . runWriterEff @ "greet"
```

の型をGHCのtyped hole機能で調べてみると

```haskell
(Monoid w, Monoid w1)
=> Eff '["greet" >: WriterEff w, "message" >: WriterEff w1] a
   -> ((a, w), w1)
```

と出る。

　ちょうど我々がそこに当てはめている`Monoid`は`[String]`なので、

```haskell
leaveEff . runWriterEff @ "message" . runWriterEff @ "greet"
:: Eff '["greet" >: WriterEff [String], "message" >: WriterEff [String]] ()
   -> (((), [String]), [String])
```

である。

　なので

```haskell
context :: Eff '["greet" >: WriterEff [String], "message" >: WriterEff [String]] ()
```

である。


# 余談
　`#foo`というのは`OverloadedLabels`拡張の機能で、`@ Bar`というのは`TypeApplications`拡張の機能。
extensibleのEffectでIOを使う

※ 本記事はextensible-effectsパッケージではなくextensibleパッケージの
`Data.Extensible.Effect`モジュールについての記事です


# 解答
　こんな感じにする。

```haskell
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}

import Data.Extensible

context :: Eff '["io" >: IO] ()
context = liftEff #io $ putStrLn "hi"

main :: IO ()
main = retractEff context
-- hi
```
[Survey] Kaggle - Data Science Bowl 2017, 7位解法

Kaggleの肺がん検出コンペData Science Bowl 2017[^1](以下DSB2017と表記)の7位解法の調査です．

Name: Niklas Köhler
Title: 7th Place short overview.
URL: https://www.kaggle.com/c/data-science-bowl-2017/discussion/31576

## 環境

- 32GB RAM
- Core i7-4930K
- GTX 1080
- Ubuntu 14.04
- Library: TensorFlow

## 外部データ・セット

- LUNA16[^4]とLIDC[^5]のアノテーションを利用
- ただしLIDCの肺がんのアノテーションに気づかなかったため，肺結節情報のみ利用
- その後，DSB2017の肺がんラベルを使用

## アルゴリズム

### 流れ

1. 肺結節領域の抽出
2. 肺結節の候補点抽出
3. 肺がんの検出

### 肺結節領域の抽出

- LUNAとLIDCの腫瘍のアノテーションを使用
- 腫瘍のあるスライスからランダムに128x128のスライス画像を切り取ってU-Net[^2]で学習
- 肺結節領域は楕円と仮定してマスクデータを作成．
- Axialだけでなく，Sagital, Coronalも利用
- 最終的には軸に沿ったスライスで予測し，3次元での各ボクセルごとの肺結節の存在確率を計算
	- 多分，各スライスを128x128になるように格子状に切り取ってU-Netで存在確率を算出．
	- 3軸で存在確率を求めることで，各ボクセルごとに3次元の確率が得られる．

### 肺結節の候補点抽出

- 候補点(クラスタ)の数が数十に絞れるよう以下の手順で腫瘍の場所を特定
	- 小さい閾値を設定(0.2)
	- 閾値以上のpixelのクラスタを列挙(DBSCAN[^6])
	- クラスタ数が一定以上だった場合は閾値を上げて再実行
- 腫瘍の中心から64x64x64の領域を切り取る．
- LIDCの悪性腫瘍情報を使うべきだったと反省

### 肺がんの検出

- 1サンプルとして同時に20個の候補点を突っ込むモデルを採用(Input Shape=(BatchSize, 20, 64, 64, 2))
- 3D ResNetを使用
    - (20, 64, 64, 64, 2)の5次元テンソル
        - 注) 20はBatch Sizeではなくて，20個の候補点を1サンプルデータとして突っ込んでいる
        - 3D ResNet後は20個の予測が出揃い，そのmax値を取るのが最も性能が良かった．
    - 1チャネル: CTの信号値
    - 2チャネル: 腫瘍の存在確率(UNetで算出)
- 確率MAPを組み込む意図
    - U-Netは128x128と3D-ResNetに比べて広範囲から怪しそうな領域を調べている．広範囲を調べることで分かる情報もあるので，そういう事も判断要素に組み込みたい．
    - U-Netで大局的な判断を行い，その大局的な判断を取り込んだ上で3D-ResNetで局所的な判断を行う2段構え

## 備考

- 時間の都合上，ネットワークのオプティマイザやパラメータはチューニングしてない．
- 前処理+ネットワークトレーニング+予測に72時間かかった
- 確率MAPをチャネルとして追加することは学習時間の短縮に効果がある(これによって10時間の学習で済んだらしい)
- 肺野の抽出処理[^3]を計算量軽減のため実施

## まとめ

- U-Netによって算出された位置ごとの確率をResNetに組み込むことで性能改善を達成．
- 入力に確率MAPを利用することで，コンピュータに注視すべき領域を伝えることは価値が高そう．

## References

[^1]: Kaggle, [Data Science Bowl 2017](https://www.kaggle.com/c/data-science-bowl-2017), 2017.
[^2]: Ronneberger et al., [U-Net: Convolutional Networks for Biomedical Image Segmentation](https://arxiv.org/pdf/1505.04597.pdf), 2015.
[^3]: Zuidhof, [Full Preprocessing Tutorial](https://www.kaggle.com/gzuidhof/full-preprocessing-tutorial), 2017.
[^4]: Open Medical Image Computing, [LUng Nodule Analysis 2016](https://luna16.grand-challenge.org/), 2016.
[^5]: [LIDC-IDRI](https://wiki.cancerimagingarchive.net/display/Public/LIDC-IDRI), 2016.
[^6]: Ester et al., [A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise](https://www.aaai.org/Papers/KDD/1996/KDD96-037.pdf), 1996
複数のfastqを1つのfastqにまとめる

# 概要
複数のfastqを一つのfastqにまとめるスクリプト。

参照：https://www.biostars.org/p/68477/

# スクリプト
```
#!/bin/bash

$list = "sample.list"
$out = "merged.fq"

for i in `cat $list`
do
	cat ${i}.fq | awk -v name="${i}" '{print (NR%4 == 1) ? "@name." ++i : $0}' >> $out
done
```
AndroidアプリからHTMLViewerを呼び出す方法

# はじめに
Webブラウザを使うアプリで、いちいちレイアウトを作ったり、コードを組むのは、若干無駄と言える。
そのときは、Android内蔵のHTMLビューアを使うと、簡易ブラウザ機能が使える。
# コード
まず、HTMLViewerを起動するには、インテントで指定する必要がある。
以下のコードをonCreateの中に挿入しよう。

``` java:MainActivity.java
 Intent intent = new Intent(Intent.ACTION_MAIN);
 intent.setAction("android.intent.action.main");
 intent.setClassName("com.android.htmlviewer","com.android.htmlviewer.HTMLViewerActivity");
 intent.setData(Uri.parse("http://qiita.com/"));
 startActivity(intent);
```

これが起動するコードだ。まず、new Intent()でインテントを作成する。
次に、setActionでメインアクションのみにフィルターを指定する。
setClassNameで、第1パラメータにパッケージ名、次にパッケージ名とアクティビティ名を指定する。
最後に、HTMLViewerでは、プログラムでインテントからgetData()を実行しているので、そこにURLをセットする。URLはUriクラスのparseメソッドを経由して指定する。
そして、startActivity()でアクティビティを起動。
これでHTMLViewerを起動できる。URLには、fileプロトコルで指定することもできる。

今後のアプリ開発に活用しよう。
KVMのhost全体で割り当てているvCPU数とメモリ量の集計

# KVMで仮想マシンのCPU、メモリ集計
ドメイン（仮想マシン）個別の値を表示する機能はあるがホスト全体での数値を知りたかったのでてきとーに集計。

## やりかた
現在稼働中のドメインのみ集計する。見たいのは設定値の上限なのでそこを対象として集計。停止中のものも含める場合は`virsh list --all`に置き換える。

ドメイン数の集計

```
# virsh list | awk 'NR>2 && $1!="" {sum += 1} END {print sum}'
14
```

vCPU数の集計

```
# virsh list | awk 'NR>2 && $1!="" {print $2}' | xargs -n 1 virsh vcpucount | \
awk 'NR%5==1 {sum += $3} END {print sum}'
50
```

メモリの集計

```
# virsh list | awk 'NR>2 && $1!="" {print $2}' | xargs -n 1 virsh dommemstat | \
awk 'NR%3==1 {sum += $2} END {print sum/1024/1024 "GB"}'
97GB
```

ホストの情報を見るとCPUがオーバーコミットなのが分かる。

```
# virsh nodeinfo
CPU モデル:       x86_64
CPU:                 32
CPU 周波数:       2199 MHz
CPU ソケット数: 1
ソケットあたりのコア数: 8
コアあたりのスレッド数: 2
NUMA セル数:      2
メモリー容量:  165205404 KiB
```

## 参考用

```
# virsh version
コンパイル時に使用したライブラリ: libvirt 0.10.2
使用中のライブラリ: libvirt 0.10.2
使用中の API: QEMU 0.10.2
実行中のハイパーバイザー: QEMU 0.12.1

# yum list installed | grep libvirt
libvirt.x86_64                        0.10.2-60.el6             @base
libvirt-client.x86_64                 0.10.2-60.el6             @base
libvirt-python.x86_64                 0.10.2-60.el6             @base
libvirt-snmp.x86_64                   0.0.2-5.el6               @base
```
ROS でpackage 移動するときにpecoを使う

変数`$ROS_PACKAGE_PATH`を使う。

```zsh
function peco-ros () {
    local selected_dir=$(echo ${ROS_PACKAGE_PATH//:/$'\n'} | peco --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-ros
bindkey '^[' peco-ros
```
LinuxのCUIを使ってgoogle翻訳を実行する

#LinuxのCUIでgoogle翻訳を実行する

#インストール
    git clone https://github.com/soimort/translate-shell
    cd translate-shell/
    make && sudo make install

#使ってみる
    trans :ja '文章'
    trans :ja 'hello'
    trans :fr+en 'こんにちわ'
    hello
    /he?l?,h??l?/

    こんにちは
    (Kon'nichiwa)

    Definitions of hello
    [ English -> 日本語 ]

    noun
    今日は
        hello, good day

    hello
    こんにちは, もしもし
#複数の言葉に翻訳する場合は、「:～+～」と記述してやればよい。

いやー、便利です。翻訳するときにいちいちブラウザを開かなくて済むので、素晴らしい。
ブラウザからGoogle OAuthの認証をやってみる

[create react app](https://github.com/facebookincubator/create-react-app)のおかげで、reactを使ってサンプルアプリを作るのが楽になりました。そのおかげで、GoogleのOAuth認証もReactで気軽に試せるようになりました。

今回はGoogleのOAuth(OpenID Connect)を使ってJWTTokenを取得するまでの手順のメモです。

## インストールとセットアップ

create-react-appでサプリケーションを作って、[hellojs](https://adodson.com/hello.js/)をインストールします。hellojsはOAuthによる認証用のライブラリです。

```shell-session
create-react-app oauthsample
cd oauthsample
npm install hellojs
```

## Googleのサーバ設定

[Googleの管理コンソール](https://console.developers.google.com)の認証情報から「認証情報を作成」ボタンを押して、「OAuthクライアントID」を選択します。アプリケーションの種類で「ウェブアプリケーション」を選択して、名前を適当に設定します。「承認済みリダレクトURI」でhttp://localhost:3000/ を指定します。今回はlocalhostからしかアクセスしないので。

これで保存するとclient idとsecret keyが取得できます。それらをあとで利用します。

## auth serverの設定

hellojsは[Auth Server](https://auth-server.herokuapp.com/)を認証用のプロキシとしてこっそり使っているようです。この辺を使うのいろいろ言うところもありそうな気がします。とりあえずは気にしないでおきます。サイトにアクセスしてsign iAnします。適当なIDプロバイダを設定すると、サインアップとログインができます。素敵な世界です。

Manage appsでdomainにlocalhost、client_idとclient_secretをそれぞれGoogleのサーバ設定で取得したもののを設定して保存します。

Auth Serverは自前で立てることもできます。[oauth shim](https://www.npmjs.com/package/oauth-shim)を利用します。

## ブラウザで認証


App.jsを編集してきます。まずはなにはともあれ、hellojsをインポートします。

```js
import hello from 'hellojs';
```

componentDidMountでhellojsを初期化します。すでに認証済みの場合は、getAuthResponse()した時に認証情報も取得できます。optionのscopeでopenid emailを設定しないと、JWTの中にemailの情報がセットされません。
hello.onでログインが成功した場合のイベントを設定します。

```js
  componentDidMount() {
    hello.init({
      google: 'クライアントID'
    }, {
      scope: 'openid email',
      redirect_uri:  window.location.href
    })
    let authResponse = hello("google").getAuthResponse()
    if (authResponse) {
      console.log(authResponse)
    }

    hello.on('auth.login', this.getAuth.bind(this))
  }
```

getAuthの中身はこんな感じ。auth.authResponseのid_tokenでJWTTokenが取得できます。

```js
  getAuth(auth) {
    console.log(auth.authResponse.id_token)
  }
```

ログインボタンを押した時の処理がこれ。見ればわかります。

```js
  triggerLogin() {
    hello('google').login({
      response_type: 'code'
    })
  }
```

最後にhtmlの中にボタンを作っておきましょう

```html
<button onClick={this.triggerLogin.bind(this)}>Sign-In with Google</button>
```

## おしまい

これでJWTTokenが取れました。[tokenのレフレッシュはこれ？](https://github.com/MrSwitch/hello.js/issues/350)。

tokenが取れたのであとは、web appと通信する時にヘッダーのどこかにtokenをのせてやり取りするだけです。サーバ側はtokenをベリファイする必要があります。ベリファイの仕方はそのうち。
クラス図の使いかた（クラス図のメンテナンス量を減らす）

#シーケンス図でクラス図に操作を追加する
クラス図は、クラス間の構造を描く。
そして、クラス間の関連や操作・属性が一目で分かる。
当たり前のことだが、これはとても便利だ。

また、UMLモデリングツールを使っていると、
シーケンス図を書きながらクラスに操作を追加してゆくことができ、
クラス図側にも自動的に操作が追加されてゆくのでさらに都合がいい。

#クラス図の配置メンテナンスの発生
しかしどうだろう、
クラスに操作が増えると、クラスとクラスの間のレイアウトが崩れてくる。
関連線がクラスの下に隠れたり、クラス同士が重なって読めなくなる。

仕方がないから、クラス図のレイアウトを直す。
自動レイアウト機能もあるが、自分の思った通りにレイアウトしてくれるわけではない。

やがては、ダイアグラムのメンテナンスが面倒になってくる。
これでは、ツールを使っているのではなく、ツールに使われ始めている。
何か、本末転倒だ。

#メンテナンスを防ぐ２枚のクラス図
こんなときは、クラス図を2枚用意する。
- クラス間の構造をみるためのクラス図
- クラスの操作を一覧するためのクラス図

##クラス間の構造をみるためのクラス図
一つ目のクラス図では、属性と操作を非表示にしておく。
大抵のUMLモデリングツールにはこの機能がついている。
これで、シーケンス図の編集でクラスに操作が追加されても、レイアウトは崩れてゆかない。
よって、メンテナンス作業は不要だ。

##クラスの操作を一覧するためのクラス図
二つ目のクラス図では、操作が増えてレイアウトが崩れても、
クラス同士が重ならないようにクラスを配置しておく。
関連線も非表示（ダイアグラムから削除）にしておく。
こうしておけば、クラスに操作が追加されても、それを一覧でみることができる。
もし、クラス図が大きくなりすぎるならば、クラスのグループごとに、さらにクラス図を分けておこう。
クラス図に「XXのクラスの操作一覧のためのクラス図」などと名前を付けておくと使いやすいだろう。

#解決策の考えかた
今回の問題は、クラス図から得たい目的が２つあるのに、
その2つの目的を1枚のクラス図で解決しなければならない、
と思い込んでいるところにあるのではないだろうか？

複数の目的を一つの手段で解決しようとすれば、
大抵の場合、片方を立てれば、もう片方が立たなくなる。

ならば、目的ごとに手段を用意してしまえば良いではないか、
と考えてみると、解決できてしまうこともある。

今回の場合は、UMLのモデリングツールを使っている場合なので、
ダイアグラム間の整合性は、ツールがとってくれる。
ならばと、ダイアグラムを多少増やしたところで、手間は増えず、ただ楽になっただけだった。

#アレンジ
あとは、アレンジもあると思う。
クラスの構造を見るクラス図で、主要な操作と属性だけは表示しておきたいのならば、
モデリングツールには、操作や属性を指定して表示非表示を切り替える機能がある。
多少の面倒はあるが、これでクラス図の配置を大幅に直す必要性は、かなり低下する。
Coincheckで閾値を超えたらメール通知する

jq要らなかったかも。

```sh:cron
* * * * * (cd cron/coincheck/; sh check_rate.sh)
```

```sh:check_rate.sh
#!/bin/sh
set -eu
LOGFILE="history"
MAX=800
MIN=700

# 現在のrate値取得 例: 744.1111111
RATE=$(curl -s https://coincheck.com/api/rate/lsk_jpy | jq -r .rate | tr -dc '[^0-9.]')
echo -n [$(date "+%Y-%m-%d %H:%M")] >> $LOGFILE
echo " $RATE" >> $LOGFILE

# 上回った場合
if [ -e "max.txt" ];then
    exit 0 
fi
RESULT=$(echo "$RATE > $MAX" | bc)
if [ $RESULT -eq 1 ];then
    echo $RATE | mail -s "MAX" xxxxxx@icloud.com
    touch "max.txt"
    rm "min.txt"
fi

# 下回った場合
if [ -e "min.txt" ];then
    exit 0 
fi
RESULT=$(echo "$RATE < $MIN" | bc)
if [ $RESULT -eq 1 ];then
    echo $RATE | mail -s "MIN" xxxxxx@icloud.com
    touch "min.txt"
    rm "max.txt"
fi
```
FileMakerProのWEBビューアをIE11（IE9非互換）にする

#主旨
FileMakerPro（以下FMP）ならびにFileMakerProAdvanced（以下FMPA）でのWEBビューアは、IE11（IE9互換）となっている。
これを、IE11（IE9非互換）に設定する。

## 目的
IE9互換だと動かないものいっぱいあるんだもの……
えーと、身近なところでは、flexboxとか使えるようになりますね。やったー。

## 動作検証環境
* Windows10
* FMP15
* FMPA15

※FMP16/FMPA16でのWEBビューアは試していませんが、真っ当になっていると良いですね。


# 手順

* レジストリエディタ（regedit）を起動する。
* 以下を開く。

```
\HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
```

* FileMaker Pro.exe あるいは FileMaker Pro Advanced.exe というキーの値を以下の通りに変更する。

```
2af9(16進数) あるいは 11001(10進数)
```

* 以上。OS再起動の必要等はありません。

### 注意点
* 似たもので次のところにもキーがありますが、ここの値は 1 のままにしておいてください。迂闊にも 1 以外の値にしてしまうと、ブラウザエミュレーション機能が無効化されてしまうようです。

```
\HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BEHAVIORS
```


# 見てみる
試しに何か見てみようと思います。Slackでも。

* before
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37739/2340558b-dc0b-d12d-cdb3-e995ed0dc165.png)
「オメーのブラウザじゃ表示できねーから！」と怒られますが……


* after
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37739/ff9bccf6-1324-54ae-192b-335cfa3d6aac.png)
無事表示されました！


## つぶやき
ホントは好きなブラウザを選択できるようにして欲しいのですけれどもね……
百歩譲って、Win10ならEdgeを指定するとかできないものか。やり方ご存知の方いらしたら教えてください。


# 参照
[Microsoft - Internet Feature Controls (B..C)](https://msdn.microsoft.com/library/ee330730%28v=vs.85%29.aspx)
[FileMakerCommunity - FileMaker 14 Web Viewer works in Compatibility Mode only on Windows](https://community.filemaker.com/message/564159#564159)
参照ファイルを用いて、複数ファイル名の置換を一括で行う

**※プログラミングレベルは高くないので、より良い方法があれば教えてください**

#概要
参照ファイルを用いて、fastq/fastaファイル名の変更を一度に複数に行うためのスクリプト。


#コマンド
xargsを用いたワンライナーを応用（2017/9/2更新）

```
sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' rename.list | xargs -I{} rename '{}' *.fastq
```

旧シェルスクリプト

```
#!/bin/bash

list="rename.list"
ext1="_L001_R1_001.fastq.gz.fastq"
ext2="_L001_R2_001.fastq.gz.fastq"

# 行数分のループを回す
seq=`cat $list | wc -l`

for i in `seq $seq`
do
    name=`cat $list | awk -F'\t' "NR==${i}" | cut -f1`;
    rename=`cat $list | awk -F'\t' "NR==${i}" | cut -f2 `;
    mv $name$ext1 $rename$ext1
	mv $name$ext2 $rename$ext2
done
```

#ファイル
##rename.list

```
AAA-BBB-CCC_S1	AAA-BBB-CCC-1_S1
AAA-BBB-CCC_S2	AAA-BBB-CCC-2_S2

```
lxn/walk を使っている場合に go build -race のエラー回避

[lxn/walk](https://github.com/lxn/walk) を使って Windows で GUI なアラームアプリを作り初めた。
race condition が発生したので、 `go build -race` を実行してみたところビルドに失敗。

```
$ go build -race
# github.com/hokorobi/MultiGoAlarm
C:\path\to\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1
D:/path/to/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: i386 architecture of input file `C:\Users\hokorobi\AppData\Local\Temp\go-link-505336639\000000.o' is incompatible with i386:x86-64 output
collect2.exe: error: ld returned 1 exit status

exit status 2
```

- lxn/walk や外部ライブラリを使わないコードだとエラーにはならない。
- lxn/walk/example でもエラーになる

という状況だったので、lxn/walk で使用する rsrc.syso が原因ではないかと目星をつけた。

rsrc.syso の生成に使用する [akavel/rsrc](https://github.com/akavel/rsrc) を見に行くと `-arch="386": architecture of output file - one of: 386, [EXPERIMENTAL: amd64]` という記載を見つけた。
rsrc を更新して -arch="amd64" をつけて rsrc.syso を生成。
再度の `go build -race` でエラー発生なし。
akavel/rsrc に EXPERIMENTAL とあるので、Race Detector がちゃんと機能するかは不明。

rsrc.syso でなく manifest ファイルを置く場合は問題ないのだと思う（未検証）
VVVVインストール方法(DirectX12対応のPC)


最新のWindowsマシン(OSはWindows10)でのVVVVのインストール方法をまとめます。私のWindowsにはDirect12が入っていたのですが、vvvvはDirectX9 or DirectX11しか対応していないようです。
これを試したのは、2017年8月の情報です。VVVVは開発ペースが早いためすぐ情報が古くなる可能性あるのでご注意ください。

## VVVVをダウンロード
公式サイトよりダウンロードします。32bit or 64bitのどちらかをDLしてください。
[ダウンロードページはこちらは](https://vvvv.org/downloads)

合わせて、addonpackもダウンロードします。

## DirectX11のプラグインを手にいれる
VVVVではpacksというプラグインフォーマットがあるようです、そこからDX11を探します。
[ダウンロードページはこちら](https://vvvv.org/contribution/directx11-nodes)

## インストール
適当なディレクトリにファイルを移動します。解凍したディレクトリ内には、vvvv.exeとsetup.exeがあると思います。
同じ階層に、先ほど落としたaddonpackとpacksを移動します。

## setup.exeを起動します。

おそらく、DirectX9の箇所が赤くなっていると思います。
利用できるDirectX9とDirectX11をインストールします。

ここからインストーラーをDLし、起動します。
[インストーラーはこちらから](https://www.microsoft.com/ja-jp/download/details.aspx?id=35)


## DirectXをインストール
過去分も含めて、インストールされるようです。


## もう一度setup.exeを起動

全て緑マークになれば、インストール完了です。そのまま新規プロジェクトの画面が表示されます。(最初はこの画面が何かよくわかりませんが...)

以上です。
AmazonLinuxにGCC5.xをインストールする

AmazonLinuxではyumでGCCをインストールすると、
バージョン4.8.5がインストールされるのですが、
バージョン5.xが必要だったので手動ビルドをしました。
時間がかかりましたが無事インストールできたましたので、その方法を記載します。

## 環境

* AMI：Amazon Linux AMI 2017.03.1
* インスタンスタイプ：t2.micro
* ストレージ：20GB
* GCCバージョン：5.4.0

## 手順

１．t2.microなので先にSWAPを500MB作成

```
$ SWAP=/tmp/swap
$ dd if=/dev/zero of=$SWAP bs=1M count=500
$ mkswap $SWAP
$ sudo swapon $SWAP
```

２．GCCインストールに必要なツール類をインストール

```
$ sudo yum install gmp-devel mpfr-devel libmpc-devel
```

３．gccのソースをダウンロード

```
$ wget ftp://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.bz2
```

４．ダウンロードしたソースを解凍

```
$ tar xvjf gcc-5.4.0.tar.bz2
```

５．解凍後のディレクトリへ移動

```
$ cd gcc-5.4.0
```

６．ビルドディレクトリ作成

```
$ mkdir build
```

７．ビルドディレクトリへ移動

```
$ cd build
```

８．Makefileを生成

```
$ ../configure --prefix=${HOME}/local/gcc-5.4.0 --disable-multilib
```

９．ビルド実行

```
$ make
```

次のエラーが発生

```
checking for uintmax_t... yes
checking for uintptr_t... yes
checking for int64_t underlying type... long long
configure: error: error verifying int64_t uses long long
make[2]: *** [configure-stage1-gcc] Error 1
make[2]: Leaving directory `/home/ec2-user/gcc-5.4.0/build'
make[1]: *** [stage1-bubble] Error 2
make[1]: Leaving directory `/home/ec2-user/gcc-5.4.0/build'
make: *** [all] Error 2
```

g++コンパイラがないから起きたらしい

１０．g++コンパイラをインストール

```
$ sudo yum install gcc-c++
```

１１．再度ビルドを実行

```
$ nohup make > make.log &
```

ビルドを試したとき数時間経っても終わらなかったため、
nohupでの実行に切り替えました。
専用のログファイルに記録して監視をしました。

__21時間！__ かかって無事終わりました。
ディスク占有は8.8GBとなっていましたので、
t2.microでそのままデフォルトのストレージ容量では厳しそうです。

１２．インストールを実行

```
$ make install
```

１３．homeに戻る

```
$ cd
```

１４．.bash_profileに環境変数追加

```
$ vi .bash_profile
```

以下を最後の行に追加

```
export PATH=$HOME/local/gcc-5.4.0/bin:$PATH
export LD_LIBRARY_PATH=$HOME/local/gcc-5.4.0/lib64/:$LD_LIBRARY_PATH
```

１５．変更を適用

```
$ source .bash_profile
```

１６．バージョンを確認

```
$ gcc --version
gcc (GCC) 5.4.0
```

無事バージョン5.4.0がインストールできました。
機能豊富なツールなので仕方ないとも思いますが、21時間は長いですね。。。

こちらの記事を参考にさせていただきました。

awsでAmazon Linux AMIに最新のGCCを入れる
http://tech.ckme.co.jp/gcc.shtml

Bug 63509 - Misleading error message when building gcc without C++ compiler installed
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63509

---
#### 9/1追記

再度インストール機会があって以下をしたところ、ビルド時間が __2時間__ に短縮されました。
必ず短縮できるとは限りませんが参考までに共有します。

- SWAPを1GBに設定
- /homeをEBSで別ボリュームに指定
EC2にログインできなかった時の対処方法

### 【つまづき/疑問】
ec2にアクセスできない。
`$ ssh -i ~/.ssh/[keypair名] ec2-user@[該当のEIP]`
で、ログインしようにも、待機中になって
`$ ssh: connect to host [該当のEIP] port 22: Operation timed out`
というエラーが返ってくる。
### 【つまづき原因/疑問への仮説】
・ec2インスタンスに何かしら不具合が起こってんのかなと、インスタンスの再起動を試みる→特に変化なし。

・keypairが何かの拍子になくなったとかかな？と思って、
`$ cat ~/.ssh/[keypairファイル名]`
でkeypairが存在するかを確認。→普通に存在していた。

・既存のプロセスが何か邪魔してるのかなと思って、
`$ ps aux | grep java`
で、動いているプロセスを確認して、
`$ kill -9 [プロセス番号]`
で、プロセスを消す→特に変化なし。

・port 22へのオペレーションがタイムアウトになっているということは、sshのportに関連して何かしら問題が起こってんのかなと思って、セキュリティグループのsshのインバウンドのソースをマイIPに変更し直す→ec2アクセスできるように！

### 【解決方法/学び】
sshへのアクセス可能IPの設定が自分のPCのアクセス可能になっていなかったのが原因でした。解決できてよかったよかった。
【Windows 10】bash on Ubuntu on Windowsが起動しなくなった

# 結論

bash環境上のファイルをWindowsから触っちゃダメ。
参照もできるだけやめとこう。

# 起きたこと
## bash on Ubuntu on Windowsが起動しない
起動していたbashを終了してちょいとWindows側で作業・・・そしてやり忘れ作業を思い出していつものように

```cmd:
> bash
```

で起動するはず。。。しない。
エラーがでてる。
【エラー: 0x80070005】
なにこれΣ(￣ロ￣lll

# 調べた結果

先人の知恵を拝借して解決だ！
と思ってエラーコードやらで調べても、再構築しましょうしかないし！！！
それはめんどくさくて嫌だ。
ツール動かすのになんかいろいろ足してたけど、全部忘れたから構築しなおしは避けたい。

# 治った

Windows側でファイル参照していたのを思い出して、開いていたエディタをバシバシ閉じていったら
・・・
あれ？これって、bash上で作成したファイルじゃね？？
編集こそしてないものの、変にロックされるかなんかしてたとかあるんじゃね？？？

もっかい

```cmd:
> bash
```

ｷﾀ――(ﾟ∀ﾟ)――!!
無事起動しました！
Scrapy+SES　でWebページの変化を感知&メールでお知らせ

# 概要
webページの新しい投稿や価格変動...などの更新を知らせて欲しいってことはよくある。本稿では
webスクレイピングフレームワークscrapyで得たwebページの変化を、AWSのSES(Simple Email Service)によりメールでお知らせする方法の片鱗を紹介する。もちろん複数ページ可能。

# 詳細
PasSとして**Scrapinghub**を使う。クラウドサーバーによる定期実行、データベースとして使える。
**spidername.py**と**scriptname.py**を時間差で定期実行する。
(scrapinghub上ではscrapyで制御されたspiderの他、普通のpython scriptも実行できる。デプロイのためにsetup.pyに記載必要。)
![scrapinghub0.png](https://qiita-image-store.s3.amazonaws.com/0/199170/695d2a47-416d-f72b-1f27-ab579fc70780.png)


``` python3:
# Automatically created by: shub deploy

from setuptools import setup, find_packages

setup(
    name         = 'project',
    version      = '2.x',
    packages     = find_packages(),
    package_data={'directoryname0': ['directoryname1/*.html']},
    scripts=['script_directoryname/scriptname.py'],
    entry_points = {'scrapy': ['settings = directoryname0.settings']},
      )
```

**spidername.py**でwebページをクローリング、データ抽出し、pipeline.pyで(scrapyによりsetting.pyで設定してれば自動で行われる。)DBに保存。

**scriptname.py**でDBを参照し、webページの更新などの条件で以下のようにメール送信。

``` python3: 
import boto3
from jinja2 import Environment, PackageLoader
from directoryname0 import settings

jinja_env = Environment(loader=PackageLoader('directoryname0', 'directoryname1'))

def send_email_alert(items):
    html_body = jinja_env.get_template('email.html').render(items=items)

    client = boto3.client("ses",
                        aws_access_key_id = settings.AWS_ACCESS_KEY,
                        aws_secret_access_key = settings.AWS_SECRET_KEY,
                        region_name = settings.SES_REGION)
    client.send_email(
            Destination={'ToAddresses': [settings.EMAIL_ALERT_TO],},
            Message={
                'Body': {'Html': {'Charset': 'UTF-8',
                        'Data':html_body},},
                'Subject': {'Charset': 'UTF-8',
                    'Data': 'Email title',},
                    },
            Source= settings.EMAIL_ALERT_FROM,
                     )
```

#Reference
[HOW TO BUILD YOUR OWN PRICE MONITORING TOOL](https://blog.scrapinghub.com/2016/11/24/how-to-build-your-own-price-monitoring-tool/)
[ScrapyCloud + DynamoDBでサーバーレス・スクレイピング](http://qiita.com/mishan88/items/aeea0b83efc2b3d7a1b5)
HTTP 40X系のエラーを起こすためのdjangoアプリケーション、django-maliceを作って公開したの巻


djangoは開発環境(DEBUG=True)の場合、ビュー上でエラーが起きた場合はおなじみの有用なスタックトレースが記載されたエラー画面を表示する。

しかしプロダクション環境の場合はADMINSに設定されているメールアドレスに対してエラーがあった旨のメールを送信する。

また、[slack_log_handler](https://github.com/mathiasose/slacker_log_handler)を利用していれば、slack上にエラーの内容が送信される。

エラーの後に何かが動作するのならば、それを正しくチェックしなければならないということでdjango-maliceを作成した。

# django-maliceについて

- 以下のエラーをわざと起こすためのViewを提供します
  - HTTP 404 (Not Found)
  - HTTP 403 (Permission Denied)
  - HTTP 500 (Internal Server Error)

また、正常系をチェックする(HeartBeat等)のために HTTP 200 OK を返すページも提供します。

[django-malice (GitHub Repository)](https://github.com/salexkidd/django-malice)


# モチベーション

- 以下をチェックするためにエラーをわざと起こすためのViewを毎回用意するのは面倒。ならば作って配布する。
- エラーレポートが正しく送信されるのかをチェックしたい
- ロギングやエラーをトリガーとした動作が正しく駆動するかチェックしたい


# django-maliceのインストール方法

1. pipにて以下をインストール

```shell
$ pip install django-malice
```

2. INSTALLED_APPSに以下を追加

```python
INSTALLED_APPS = [
    ...
    "malice",
]
```

3. プロジェクトのROOT_URL_CONFに指定してあるurls.pyに以下を追加

```python
url(r'^malice/', include('malice.urls', namespace='malice')),
```

注意: 本番環境の場合はURLを攻撃者が予測不可能な文字列に変更したほうが安全です。

例:

```python
view_urlpatterns = [
    ...
    url(r'^all-your-error-are-belong-to-us-2101/', include('malice.urls', namespace='malice')),
    ...
]
```

4. runserver して以下のURLをブラウザで開きます

```shell
$ ./manage.py runserver 0.0.0.0:8000
```

- http://localhost:8000/malice/200
- http://localhost:8000/malice/404
- http://localhost:8000/malice/403
- http://localhost:8000/malice/500


200以外のURLはエラーを返すことを確認します。

DEBUGがTrueの状態ではADMINSにメールは送信されないので、DEBUGフラグをFalseに設定してエラーリポートが送信されることを確認してください。


# 開発に関して

このアプリケーションは django meetup の時間を通してcircleciでのテスト構築、パッケージ化、Pypiでの配布を行いました。

ここで会を主催してくださった BeProudの [https://twitter.com/hirokiky](@hirokiky) と [https://twitter.com/shimizukawa](@shimizukawa)のご両人に感謝！

もしみなさんもお時間があれば django meetup に参加してみては如何でしょうか！

- [http://djangoproject.jp/](http://djangoproject.jp/)
- [https://django.connpass.com/](https://django.connpass.com/)
Docker docker-compose コマンド 備忘録

## はじめに
最近、Docker、docker-compose環境にて開発をしていて、そこでよく使うコマンドをメモとしてここに残したいと思います。
新しい知識が入り次第更新する予定です。
また環境がRailsでのコマンドも書いていきます。

## 現在のコンテナの稼働状況を確認する
```
$ docker ps
```

## 1つのコンテナだけ起動する

例えば、dbコンテナだけを起動したいときは下記のコマンドを打てばいいです。

```
$ docker-compose up -d db
```

## 関係するコンテナを全て終了する
```
$ docker-compose stop
```

## 1つのコンテナだけ終了する
例えば、webコンテナだけ終了したいときは下記のコマンドを打てばいいです。

```
$ docker-compose stop web
```

## モデルを作る
環境がRailsの場合ですが、以下のコマンドでモデルを作成できます。

```
$ docker-compose run web rails g model モデル名
```

## カラムを追加する
環境がRailsの場合ですが、以下のコマンドでカラムを追加するマイグレーションファイルを作成します。

```
$ docker-compose run web rails g migration AddColumnToTables column_name:string
```

## マイグレーションファイルを実行する
環境がRailsの場合ですが、以下のコマンドでマイグレーションファイルを実行します。

```
$ docker-compose run web rails db:migrate
```

## コントローラーを作る
環境がRailsの場合ですが、以下のコマンドでコントローラーを作成できます。

```
$ docker-compose run web rails g controller コントローラー名
```

## pry-railsによるデバック

docker ps でwebコンテナの名前を確認したあと、下記のコマンドを打つと、pryにアタッチされます。

```
$ docker attach webコンテナ名
```

## rspecでのテスト

```
$ docker-compose run web rspec
```

## 参考
[docker-composeを使うと複数コンテナの管理が便利に](http://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)
[docker-compose で Rails の開発環境を作る](http://qiita.com/skyriser/items/2cf98b747ed6577cc5ee)
[既存のrailsプロジェクトをDockerで開発する手順](http://qiita.com/kkyouhei/items/653760627bf9d4bc9e71)
PCから値が読み取れるUSB接続の温度計を自作する

USB-シリアル変換モジュールのRX/TXを1-Wireセンサーのデータ線に接続してPCから安価にセンサーを利用する、というプロジェクトを見つけました。

- https://github.com/dword1511/onewire-over-uart

この記事によれば、下記のパーツを揃えればUSB接続の温度計が完成することになります。

- USB-シリアル変換モジュール（CP2102, PL2303, CH340などを利用したものが安価です）
- 温度センサ DS18B20
- ダイオード 1N4148
- 4.7kΩ抵抗

海外通販で最安で揃えれば総額250円くらいで調達できそうです[^1]。秋葉原で揃えても500円付近ではないでしょうか。

[^1]: fake品には注意しましょう。1個1ドル付近のチップのfake品があるとか恐ろしい世界やで…

このアイデアの良いところは、各OSのデバイスドライバを自作せずとも、既存のシリアル変換モジュールのドライバが利用できる点です。OSとシリアル変換モジュールの組み合わせ次第では、最初からドライバがインストールされているパターンまでありそうです（鉄板はFTDIなのですが、この用途には少々お高い…）。

もちろん、Raspberry PiなどGPIOが使える環境ならその方が安上がりですが、そうでない環境で気軽に温度が測れるのは魅力だと感じます。個人宅のLinuxサーバで温度測定するのに1個いかがでしょうか。

言うまでもありませんが、シリアル通信経由で1-wireから値を読み取る部分は自分でプログラミングする必要があります。上記プロジェクトにサンプルコードがあるので、それを改造すれば何とかなるはずです。

# 後日談：実際に作ってみました

- [ふつうのLinuxマシンで自作温度計を作る方法 : KLabGames Tech Blog](http://klabgames.tech.blog.jp.klab.com/archives/20171203ac.html)
SourceTreeでURL(SSH)からクローンできないときの対処法

## はじめに
GithubのClone with SSHからソースURLをコピーして、SourceTreeでリポジトリをクローンしようとすると、`ソースパス、またはソースURLとして正しくありません`と出てきてクローンができませんでした。
そこでどうやって解決したかここに書いていきたいと思います。

ちなみにクローンできなかったときのSourceTreeでのエラー文は以下になります。

```
Permission denied (publickey).
fatal: Could not read from remote repository.
```

![SourceTree](https://i.gyazo.com/108496bb39f19ef94531706a58bf1090.png)

## まず、.ssh/configの中身を確認してみた

.ssh/configとは、ssh経由でのリモートサーバーの接続する際に利用される設定ファイルです。
以下のコマンドで中身を確認できます。

```
$ less ~/.ssh/config
Host github  ← ここにはHost名が入る
.
.
```

そうするとHost名が**github**になっていた。

## ソースURLとHost名を合わせる

上記の画像のようにソースURLが

```
git@github.com:rails/rails.git
```

と@以降が`github.com`になっているのでこれを下記の画像のようにHost名の`github`に変えるとうまくいきました。

![SourchTree](https://i.gyazo.com/54401a53add0217beb3d30374265fe2f.png)

## 参考
[~/.ssh/configについて](http://qiita.com/passol78/items/2ad123e39efeb1a5286b)
プリペアドステートメントでテーブル名が指定できない時の対処

PHPでプリペアドステートメントを使ってSQL文に値をバインドしていると思いますが、**プリペアドステートメントはカラムの値にしか適応できない**ようです。

例えば、以下のようにPDOで接続して、SQL文にテーブル名をバインドしようとしてもうまくいきません。

```php
// データベースへの接続開始
$dbh = new PDO($dsn, $user, $password);

// bindParamを利用して値をセット
$sql = 'CREATE TABLE :table_name (id text primary key, pass text not null);';
$sth = $dbh->prepare($sql);
$sth->bindParam(':table_name', $_POST['table_name']);
$sth->execute();
```

セキュリティ的に問題があるかもしれませんが、強引にテーブル名をセットする方法はあります。

```php
// データベースへの接続開始
$dbh = new PDO($dsn, $user, $password);

// bindParamを利用して値をセット
$sql = 'CREATE TABLE ' .$_POST['table_name']. ' (id text primary key, pass text not null);';
$sth = $dbh->prepare($sql);
$sth->execute();
```
POSTしたデータを使ってテーブル名を指定する場合は、入力値チェックを行うなどして、くれぐれもSQLインジェクションに注意する必要があるでしょう。

##参考：
プリペアドステートメントでテーブル名指定できないのか
http://absg.hatenablog.com/entry/2014/10/23/164254