OmniAICreator/Qiita-1.07M huggingface dataset:
Php-phantomjs 導入時のひとてま

win7の環境に、[Php-phantomjs](http://jonnnnyw.github.io/php-phantomjs/4.0/3-usage/) を [Installation](http://jonnnnyw.github.io/php-phantomjs/4.0/2-installation/) に従って composer で導入するも、

```
Message: Error when executing PhantomJs procedure - File does not exist or is not executable: bin/phantomjs
```
とエラーが発生したため、今後のために、メモ。

[Introduction](http://jonnnnyw.github.io/php-phantomjs/4.0/) を参考に、以下の追記が必要だった模様。

```
$client->getEngine()->setPath('absolute_path/bin/phantomjs.exe');
```

> Important
By default the PhantomJS library will look for the PhantomJS executable in the bin folder relative to where your script is running ~/bin/phantomjs. If the executable cannot be found or if the path to your PhantomJS executable differs from the default location, for example you have installed PhantomJS globally, you will need to define the path to your PhantomJS executable manually.

Installation のページじゃなくて、Introduction のページに掲載されていたので、確認に少し時間がかかってしまった＾＾；
golang ソースコード -- import文のチェック内容 (1.8)

goでimport文をチェックする実装はそんなに難しくないので。

実装内容を網羅していない。
主要な所をひっぱってきただけ。
実際はソースコードで。


# ソースコード

https://github.com/golang/go/blob/release-branch.go1.8/src/go/build/build.go#L486

# importが空白の場合は残念

```go:build.go
if path == "" {
		return p, fmt.Errorf("import %q: invalid import path", path)
	}
```

path変数はチェック対象のimport文で指定した文字列の１つ


# ローカルインポート判定

```go:build.go
// IsLocalImport reports whether the import path is
// a local import path, like ".", "..", "./foo", or "../foo".
func IsLocalImport(path string) bool {
	return path == "." || path == ".." ||
		strings.HasPrefix(path, "./") || strings.HasPrefix(path, "../")
}
```

# ローカルインポート時は事前チェック無し

ここではエラーで止めていない。

とりあえず、実際に読み込んでみてエラーになったらダメというやり方。
（no such file or directoryエラー)

GOROOT、GOPATHの中になくてもOK

# これより以下はローカルインポートでは無い場合


# 絶対パスは残念

```go:build.go
if strings.HasPrefix(path, "/") {
	return p, fmt.Errorf("import %q: cannot import absolute path", path)
}
```


# Vendorは GOROOT もしくは GOPATH の中

```go:
if searchVendor(ctxt.GOROOT, true) {
	goto Found
}
for _, root := range gopath {
	if searchVendor(root, false) {
		goto Found
	}
}
```
searchVendorの引数は
searchVendor := func(root string, isGoroot bool) bool {...}

import文で指定のモノがみつかったら goto Found 


# Vendorを確認するディレクトリかどうかのチェック

```go:
searchVendor := func(root string, isGoroot bool) bool {
	sub, ok := ctxt.hasSubdir(root, srcDir)
	if !ok || !strings.HasPrefix(sub, "src/") || strings.Contains(sub, "/testdata/") {
		return false
	}
```

この辺りはひっかかりそう。


# GOROOTのsrc内を確認

```go:
if ctxt.GOROOT != "" {
	dir := ctxt.joinPath(ctxt.GOROOT, "src", path)
	isDir := ctxt.isDir(dir)
	binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga))
	if isDir || binaryOnly {
		p.Dir = dir
		p.Goroot = true
		p.Root = ctxt.GOROOT
		goto Found
	}
	tried.goroot = dir
}
```

みつかったら goto Found 
みつからなかったら tried.goroot 変数にいれとく（エラー表示用目的）

path変数はimportで書いた文字列

# GOPATH のsrc内を確認

```go:
for _, root := range gopath {
	dir := ctxt.joinPath(root, "src", path)
	isDir := ctxt.isDir(dir)
	binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(root, pkga))
	if isDir || binaryOnly {
		p.Dir = dir
		p.Root = root
		goto Found
	}
	tried.gopath = append(tried.gopath, dir)
}
```

gopathに設定したpathの数だけチェック

# import文がどれにも合致しなかったら残念

```go:build.go
return p, fmt.Errorf("cannot find package %q in any of:\n%s", path, strings.Join(paths, "\n"))
```
ある関数の逆関数を数値的に作るいろいろな方法　導入編

インボリュート関数という関数を題材に、いろいろな方法で数値的に逆関数を作るということを行ってみたいと思います。Pythonには技術計算に使えるライブラリがたくさん揃っているので、そのライブラリを活用してそれぞれの手法の限界も見ていきたいと思います。
試してみる方法は以下の５つです。
- 多項式回帰 (scikit-learn)
- サポートベクターマシン (scikit-learn)
- Newton-Raphson法 (SciPy)
- Akimaスプライン (SciPy)
- ライブラリに頼らない実装

## 問題の確認
### インボリュート関数とは
インボリュート関数は歯車の歯の形を決めるときに使う関数で、その定義自体は非常に簡単です。
$f(\alpha) = tan\ \alpha - \alpha$
歯車の計算をする過程でこの関数の逆関数を計算する必要があります。

### 逆関数とは
$inv\alpha = f(\alpha)$ が既知の時に $inv\alpha$ から逆に $\alpha$ を求める必要があるということです。
数学の記号を使えば $\alpha = f^{-1}(inv\alpha)$ と簡単に表すことができますが、実際にその計算をするのはそれほど簡単ではありません。
（注意：$inv\alpha$ は $involute(\alpha)$ の意味で使っています。invはinverseの略ではありません。）

### インボリュート関数をプロットしてみる
作業はJupyter Notebookで行っていきます。
まずは必要なライブラリをインポートします。
ベクトルデータを扱うためにNumPy、プロットをするためにBokehをインポートします。

```py3:Notebook
import numpy as np
from bokeh.plotting import output_notebook, figure, show
output_notebook()
```

インボリュート関数を定義します。

```py3:Notebook
def involute_ufunc(α):
    return np.tan(α) - α
```
ここでは、プロット作業を簡単にするためにNumPyを利用しています。
NumPyには配列（numpy.ndarray）の要素すべてに一括で関数を適用できるブロードキャストという機能があります。math.tan関数はブロードキャストに対応していないので、ブロードキャストに対応しているnumpy.tan関数を使っています。
involute_ufunc関数は引数$\alpha$で配列を受け取り、配列の要素すべてにインボリュート関数を適用して配列を返します。

```py3:Notebook
x = np.linspace(- np.pi / 4, np.pi / 4, 1000)
fig = figure(width=400, height=400)
fig.line(np.degrees(x) , involute_ufunc(x))
fig.xaxis.axis_label = '圧力角α (deg)'
fig.yaxis.axis_label = 'invα'
show(fig)
```

<img width="410" alt="インボリュート関数.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/2051763a-c41e-6df2-9c84-798e49efc988.png">

インボリュート逆関数はこれの縦軸と横軸を入れ替えたものになります。
<img width="413" alt="インボリュート逆関数.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/691fa083-133f-c89c-9b0a-476a9a203e81.png">

## ソースコード
説明に使ったNotebookはGistにアップロードしています。
[インボリュート関数のプロット.ipynb](http://nbviewer.jupyter.org/gist/yin-yang-alchemist/85bd194bb588ea4559348adcbdcfafa6)

## 記事へのリンク
[ある関数の逆関数を数値的に作るいろいろな方法その１　多項式回帰編 - Qiita](http://qiita.com/alchemist/items/2612f516afb10d98abe1)
nkfで文字コード変換

参考にしたサイト
http://tweeeety.hateblo.jp/entry/2014/12/17/230611



文字コードを表示

```
nkf -g sample.txt
```

UTF-8に変換

```
nkf -w --overwrite sample.txt
```


オプション

|option|description|
|---|---|
|-g|自動判別|
|-w|UTF-8コードで出力|
|-e|EUC-JPコードで出力|
|-s|Shift-JISコードで出力|
|--overwrite|直接上書き|
JavaScript の奇妙な挙動クイズ

- [JavaScriptの==による配列の等価性比較の挙動クイズ](http://sucrose.hatenablog.com/entry/2017/03/12/235853)

これで思い出した JavaScript の奇妙な挙動クイズ。

```js
> parseInt(1 / 0, 21)
18
```

なんでこうなるのか、パッと見でわかったあなたは JavaScript マスター！

Enjoy!
link > What is special about rectifier neural units used in NN learning? > ReL / softplus / max function (hard max) / ReLU / gradient vanishing problem

```txt:動作環境
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)
```

TensorFlowを使って、input:100 node, output:100 nodeのネットワークの学習を試行中。

[TensorFlowで input:100, output:100のネットワークでの学習を検討 v0.9 / v0.8 > output のactivation functionを３つ試した > Linear / softplus / sigmoid](http://qiita.com/7of9/items/31d93a6bc53e0c3ef02a)において試したactivation functionについてあまり理解できていない。

「softplus sigmoid」をキーワードとして以下を見つけた。

[What is special about rectifier neural units used in NN learning?](https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning)

以下は気になった部分の抜粋。

### Suvash Sedhain氏の回答

> The softplus function can be approximated by max function (or hard max ) ie max(0,x+N(0,1)) . The max function is commonly known as Rectified Linear Function (ReL).

ReLUでなくReLというキーワードもあるようだ。

> Sigmoid function has range [0,1] whereas the ReL function has range [0,∞]. Hence sigmoid function can be used to model probability, whereas ReL can be used to model positive real number.

この範囲の違いは学習の差異を生じるのかもしれない。

> The gradient of the sigmoid function vanishes as we increase or decrease x. However, the gradient of the ReL function doesn't vanish as we increase x.

(中略)

> ReLU doesn't face gradient vanishing problem as with sigmoid and tanh function. Also, It has been shown that deep networks can be trained efficiently using ReLU even without pre-training.

### Alexandre Holden Daly氏の回答

gradientが消える、消えないについての詳細な記述へのリンクがある。

### Anonymous

ReLUを使うと速い理由について　

### Chatavut Viriyasuthee氏の回答

> Since a softplus is relatively computationally expensive to compute, people have invented a neat approximation to it - Rectified linear

### Anirbit Mukherjee氏の回答

a lot of exciting ideas about these networksについての論文リンクが掲載されている。

> For example we show that with one hidden layer and with one input these networks are trainable in polynomial time!
技術英語 > We are running a loop over each of the seven letters in the string 'letters' / cycle over each of the menu links

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2366 / 12833)


http://ideone.com/TolDeK

```py
word = 'letters'
letter_counts = {letter: word.count(letter) for letter in word}
print(letter_counts)
```

```txt:結果
{'s': 1, 'r': 1, 'e': 2, 'l': 1, 't': 2}
```

Pythonのdictionary comprehensions。

> We **are running a loop over** each of the seven letters in the string 'letters'

意訳「7文字のそれぞれに対して、string 'letters'の走査を行う」

これを自分で英訳できるか微妙だ。overがeach of the にかかるようには自分では思いつかない。

We are runnig a loop for each of the seven letters in the string 'letters' over the string.
だろうか。冗長な気もする。

<hr>
(追記 2017/03/13)
over each of theの他の例

https://teamtreehouse.com/community/how-to-use-the-method-we-used-to-cycle-over-each-of-the-menu-links-pass-in-an-anonymous-function-too
> how to use the method we used to cycle over each of the menu links.
メールアドレスの正規表現

メールアドレスの正規表現は以下の通りです。
以下はマッチしたそのものを表示します（ファイル名）。

```bash
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" $1
```
以下はファイル名を除いてマッチした行全体を返します。

```bash
grep -E -h "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" $1
```
Gitbook 3でmermaid.jsを使う

別プロジェクトに移ったのでローカルのGitbookを最新版のv3で作ったところ、今まで使っていた **gitbook-plugin-mermaid-2** は[動かなくなっていました。](http://qiita.com/uzuki_aoba/items/e0e27ab623b97a678a7e#追記20170228)

GitHubのページにもissueで上がってますが、しばらく動きなさそう。

ということで、 [Gitbook Plugins](https://plugins.gitbook.com) で探したところ、今までと一番使い勝手が似ていそうなので、 **gitbook-plugin-mermaid-gb3** を試して見ました。

[gitbook-plugin-mermaid-gb3](https://plugins.gitbook.com/plugin/mermaid-gb3)

## 良いところ
gitbook-plugin-mermaid-2 と同じで、コードブロックで書けます。

<img width="318" alt="スクリーンショット 2017-03-13 3.01.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/52410/46f9a26a-5667-7d18-62e8-73037c6e8191.png">
<img width="442" alt="スクリーンショット 2017-03-13 3.02.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/52410/d9ed2a75-a092-2fb1-8e2c-c3656855dd5c.png">

また、mermaid.jsのバージョンが最新の6.0になっているので、その辺りが嬉しいです。

## 気に入ってないところ

gitbook-plugin-mermaid-2 と違い、テーマの指定が行えません。

```json:book.json
{
    "plugins": [
       "mermaid-2"
    ],
    "pluginsConfig": {
      "mermaid-2": {
         "theme": "forest" 
      }
    }
}
```
こういうの。

この辺りは今後かなぁ。


## その他

Gitbook-cliのグローバルバージョンに引っ張られて面倒&仕様書とか書くときによく同じプラグインをセットアップするので、Boilerplateを作ってみました。

https://github.com/TakuroFukamizu/gitbook-specification-boilerplate

mermaid.js の他に、PlantUmlやtocなどがセットアップされているので、ひとまず仕様書的なサムシングが書けると思います。

### 前提

- macOS
- node.js(v6でテスト済み。)
- npm

### 使い方

git cloneで自分のディレクトリにおろしてきて、npmでインストールしてください。

`your-book-name` の部分を自分のbook名にして以下のコマンドをターミナルで実行すると作れます。

```bash
export PJNAME=your-book-name && git clone --depth 1 https://github.com/TakuroFukamizu/gitbook-specification-boilerplate.git ${PJNAME} && cd ${PJNAME} && npm install && rm -fr .git && npm run serve
```

以上。
ぜひ、Excel仕様書スレイヤーライフをお過ごしください。
SharePoint Frameworkの開発環境をDocker上に構築する（Linuxベース編）

[前回](http://qiita.com/ya_asuka/items/33d5a3f08eb1916b1044)、Nano Serverのイメージ上でSharePoint Framework（SPfx）の開発環境を構築しましたが、プロジェクトを作るときとかにコンテナがハングして応答がなくなってしまうことが多々発生したので、Linux(Debian)ベースのコンテナを使うことにしました。

# 忙しい人向け（再掲）
waldekmさんがDocker Hubでイメージを公開されているので、それを使うのが手っ取り早いです。

[Docker Hub - waldekm/spfx](https://hub.docker.com/r/waldekm/spfx/)
>In the command line (on macOS):
> `cd [your project]`
> `docker run -h spfx -it --rm --name ${PWD##*/} -v $PWD:/usr/app/spfx -p 5432:5432 -p 4321:4321 -p 35729:35729 waldekm/spfx `

>In the command line (on Windows, assuming your project is located at c:\projects\spfx-helloworld):
> `cd c:\projects\spfx-helloworld`
> `docker run -h spfx -it --rm --name spfx-helloworld -v /c/projects/spfx-helloworld:/usr/app/spfx -p 5432:5432 -p 4321:4321 -p 35729:35729 waldekm/spfx `

# 動作環境
本手順は以下の環境で確認しています。
- Windows 10 Pro Insider Preview(Build 15055)
- Docker Version 17.03.0-ce

# 流れ
Nano Serverのときは、いったんServer Coreのイメージを作ってからデータコピーとかやってましたが、Linuxベースなら一発で作成できます。

0. Linux Containersへ切り替え
1. Node.jsのイメージに必要なモジュールをインストール

## 0. Linux Containersへ切り替え
DockerがWindows Containersで動いている場合は、Linux Containersにモードを切り替えます。
![2017031301-2.png](https://qiita-image-store.s3.amazonaws.com/0/40644/0fc48a8c-52a3-0c28-d17f-53f827488036.png)

## 1. Node.jsのイメージに必要なモジュールをインストール
DebianベースのNode.jsのイメージはDocker Hubで公開されているので、それを元にしてイメージを作っていきます。Dockerfileは以下。

```bash:Dockerfile
FROM node:6.10.0

EXPOSE 5432 4321 35729

RUN apt-get -yq update && \
    apt-get -yq install git sudo && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

RUN adduser --disabled-password --gecos '' spfx && \
	adduser spfx sudo && \
  	echo "%sudo ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

ENV HOME /home/spfx

RUN npm install -g yo gulp gulp-save
RUN npm install -g @microsoft/generator-sharepoint@1.0.0
RUN chown -R spfx:spfx /home/spfx/

RUN mkdir /app && chown spfx:spfx /app
WORKDIR /app

USER spfx

CMD /bin/bash
```

コンテナ上のrootユーザーだと、権限の問題でプロジェクトの作成時にファイルが作成できなかったりしたので、spfxというユーザーを作成して、そのホームディレクトリ配下にYeomanとかをインストールしています。また、`npm install -g npm`を実施するとその後のnpmコマンドが使えなくなるので、実施しないようにしています。

また、/appというディレクトリですが、この下にプロジェクトを作っていくことを想定して作っています。コンテナの起動時に/appにホストのディレクトリをマウントするイメージです。
あと起動時にはbashをデフォルトで起動させています。

上記のDockerfileを使ってビルドしてイメージ作成は終わりです。
`docker build -t spfx:1.0.0 .`

# プロジェクトを作る
作成したイメージを使って、SharePoint Frameworkのプロジェクトを作成できることを確認します。

コンテナを起動します。
` docker run -it --rm spfx:1.0.0 bash`

Hello Worldを作ってみます。

```
mkdir helloworld
cd helloworld
yo @microsoft/sharepoint
```

無事にプロジェクトが作成できました。
![2017031303.PNG](https://qiita-image-store.s3.amazonaws.com/0/40644/7cae8cbb-a473-cec8-cfb1-ef2a0256c881.png)

実際にプロジェクトの開発やデバッグについては、またあらためて書きたいと思います。

# おまけ
ベースのDebianのバージョンは8.7のようです。
![2017031302.PNG](https://qiita-image-store.s3.amazonaws.com/0/40644/527271d4-1f64-227f-fbd4-5ff585b3b6d1.png)

また、イメージのサイズは785MBと、Nano Serverの1.03GBよりもさらに小さくなりました。
![2017031304.PNG](https://qiita-image-store.s3.amazonaws.com/0/40644/cb78e3a5-b8da-8f4f-7f21-96d149c520b4.png)
gitのpre-push hookでmasterブランチにpushする際にプロンプトで確認するようにする

会社のGitを使っているときに、自分のブランチで作業しているつもりが間違ってmasterブランチで作業しており、気づかずにpushしそうになって肝を冷やしたことがあるので、masterにpushする際はプロンプトで確認するようにした。

## 環境
* Mac OS X Yosemite 10.10.5
* Git 2.11.1

## gitテンプレートディレクトリを作成
特定のレポジトリではなく、PC上で扱う全てのレポジトリのコミットをhookするため、グローバルの.gitテンプレートディレクトリを準備する。
（なお、特定のレポジトリでだけhookしたい場合は、以下で作るpre-pushファイルをレポジトリの`.git/hooks/`におけばよい）

```bash
mkdir -p ~/.git_template/hooks
```

## .gitのテンプレートに.git_templateを指定

```bash
git config --global init.templatedir ~/.git_template/
```
これで新たにgitレポジトリを作ったりcloneすると.git_templateディレクトリの設定が有効になる。

## hookファイル作成
```bash
vi ~/.git_template/hooks/pre-push
```

内容は以下のようにする。

```bash
#!/bin/bash

while read local_ref local_sha1 remote_ref remote_sha1
do
  if [[ "${remote_ref##refs/heads/}" = "master" ]]; then
    echo "Warning: push to remote master, continue? [y/N]"

    exec < /dev/tty
    read ANSWER

    case $ANSWER in
      "Y" | "y" | "yes" | "Yes" | "YES" ) echo "OK. push start.";;
      * ) echo "push failed.";exit 1;;
    esac
    exit 0
  fi
done
```

gitのhookは普通にはインタラクティブなことができないらしく、readが使えなかった。
```exec < /dev/tty```
を追加することでreadができるようになる。

## hookファイルのパーミッション変更
パーミッションを変えて実行可能にする
これをしないとhookされない。

```bash
chmod +x ~/.git_template/hooks/pre-push
```

## 結果
以上の設定をすると、masterブランチにpushする際に

```
Warning: push to remote master, continue? [y/N]
```
と訊かれるようになる。
`Y`, `y`, `yes`, `Yes`, `YES`と入れるとpushされ、それ以外だとpushが失敗するようになる。
masterでなく、他のブランチをhookしたい場合はpre-hookファイルのmasterの部分を置換すればよい。


## 参考
* 「master への push を禁止するローカル git hook の正しい書き方」 http://thinca.hatenablog.com/entry/20150306/1425639218
* 「How do I prompt the user from within a commit-msg hook?」 http://stackoverflow.com/questions/3417896/how-do-i-prompt-the-user-from-within-a-commit-msg-hook
* 「たまに見かける[Y/n]での分岐処理のサンプル」 http://qiita.com/m0r1/items/d894e764cbc7d9c56c70

## 2018/03/18追記
複数ブランチに対応。
例えばmasterとdevelopブランチにpushする前にチェックしたい場合は以下のようにすればよい。

```bash
#!/bin/bash

while read local_ref local_sha1 remote_ref remote_sha1
do
  for branch in "master" "develop"; do
    if [[ "${remote_ref##refs/heads/}" = "${branch}" ]]; then
      echo "Warning: push to remote ${branch}, continue? [y/N]"

      exec < /dev/tty
      read ANSWER

      case $ANSWER in
        "Y" | "y" | "yes" | "Yes" | "YES" ) echo "OK. push start.";;
        * ) echo "push failed.";exit 1;;
      esac
      exit 0
    fi
  done
done
```
gitのpre-commit hookを使ってuser.nameやuser.emailが未設定だったらコミットを弾く

Gitで新しいレポジトリにコミットするときにうっかりuser.nameやuser.emailの設定を忘れて、意図しない名前やメールアドレスでコミットされてpushしてしまう、ということを結構やってしまう。
そこで、pre-commit hookを使ってuser.name、user.emailが未設定だったらコミットを弾くようにした。

## 環境
* Mac OSX
* Git 2.11.1

特定のレポジトリではなく、PC上で扱う全てのレポジトリのコミットをhookするため、グローバルの.gitテンプレートディレクトリを準備する。
## ディレクトリを作成
```bash
mkdir -p ~/.git_template/hooks
```

.gitのテンプレートに.git_templateを指定する。

```bash
git config --global init.templatedir ~/.git_template/
```
これで新たにgitレポジトリを作ったりcloneすると.git_templateディレクトリの設定が有効になる。

## hookファイル作成
```bash
vi ~/.git_template/hooks/pre-commit
```

内容は以下のようにする。

```bash
#!/bin/sh

if [ -z `git config user.name` ] || [ -z `git config user.email` ]
then
	cat <<\EOF
Error: Your name or email address is empty.
commit fails.

EOF
	exit 1
fi

```

## hookファイルのパーミッション変更
パーミッションを変えて実行可能にする。
これをしないとhookされない。

```bash
chmod +x ~/.git_template/hooks/pre-commit
```

## 結果
以上の設定をすると、以降作ったりcloneしてきたレポジトリでuser.nameやuser.emailが設定されていない場合に

```
Error: Your name or email address is empty. commit fails.
```
とメッセージが出てコミットが失敗するようになる（既存のレポジトリには反映されないので注意）。

## 参考
* 「git-commit前にsyntaxチェックする」 http://qiita.com/ymko/items/9209aa8ed811db795024
* 「git hook のテンプレート」 http://please-sleep.cou929.nu/git-init-templatedir.html
rails5 apiモードで、deviseとdevise_token_authを両方とも使いたかった欲張りな人の話

## 背景

ネイティブアプリが使うapiをrails apiモードで書いてた。初めはwebサイト側で何かしら書く必要なんて無いと思ってたんだけど、よく考えたらパスワードのリセットとかのプロセスをwebサイトで書く必要があることに気づいてとても焦った話です。一通り調べてもぴったりと解決に導いてくれた記事がないのでまとめてました。

大まかな流れは[この記事](http://qiita.com/Philomagi/items/4fc83d49a6065002273e)と同じなんだけど、自分の場合は「エラーその２」の後に、まだハマるポイントがあったのでその補強になればと思ってます。

一応認証には、devise_token_authを使っている。devise側が
> api only appではdeviseじゃなくて、devise_token_auth使ってください

ってお願いしてる関係もあってdevise_token_authを使うことにしました。

deviseでviewを作りたかったのは、passwordをリセットするところの入力フォームのみ。これだけのためにすごくハマったから、もしかしたら別の効率のいいやり方があるのかもしれません。rails歴たかが２ヶ月の自分としては、０から実装には踏み切れなかったのですが、これは少し反省してます。笑

## 前提

devise_token_authで追加のパラメタを許可する必要があったので、そのinitiallizerで次の設定をしています。

```app/controllers/application_controllers.rb

class ApplicationController < ActionController::API
  include DeviseTokenAuth::Concerns::SetUserByToken

  before_action :configure_permitted_parameters, if: :devise_controller?


  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:additonal, :params])
  end
end

```


## 問題点

[Rails5 + APIモードで後からdeviseを使おうとした時のエラー対応](http://qiita.com/Philomagi/items/4fc83d49a6065002273e)にもあるように、apiモードでdeviseのviewを呼び出そうとすると色々問題が発生します。csrf対策とかはapiモードには組み込まれていないし、、

この方の書かれている通りに、実装するとdevise_token_authでsign_upをしようとした時にエラーがでます。なので、以下の通りに実装してください。


### 1. undefined method 'flash' for#<ActionDispatch::Request> に対して

まずこのエラーが出ると思います。flashメッセージが出ないみたいなので、それ用のmodule(?)を追加してあげます。

```config/application.rb
config.middleware.use ActionDispatch::Flash
```

### 
2. undefined method `protect_against_forgery?' for #<Class> に対して

次にでてくるエラーはこれかと思います。ここまでは先ほどの方の記事と同じです。csrf対策をしないといけないので、親のコントローラーを変更してあげます。

```config/initializes/devise.rb
config.parent_controller = 'ActionController::Base'
```

### strong parameterでエラーが出る
2. のエラーを解消すると、deviseはapplication_controllers.rbを経由せずに、直接ActionController::Baseを継承するようになります。そのため、前提の部分で定義していた、strong parameterへの追加の部分が読み込まれなくなります。これを解消するのが地味に大変でした。


色々試行錯誤をした結果、devise_token_authのリセット用のコントローラーをoverrideする形で解決することにしました。次のように書いてあげれば、同様にこのエラーを解消できるかと思います。

```app/controllers/registrations_controller.rb
class RegistrationsController < DeviseTokenAuth::RegistrationsController
  # GET /users/sign_up
  def create
    super
    @resource = resource_class.new(sign_up_params)
  end

  private
  def sign_up_params
    params.permit(
      :add,
      :additional,
      :params,
      :wanna,
      :permit
    )
  end
end
```

これが僕の考えた中では最適なやり方でした。もっといいやり方は100%あるはずなので、教えて頂けると幸いです。
マネージドサービスとか出てきていますが、システム設計について整理しました

最近、AWSやGCPのマネージドサービスなどもあり、自分らでミドルウェアを運用しないほうが良い的な話を聞いたりして、なんか良く分からなくなったので整理したいなぁと思って書きます。

僕が考えていることなので、こんな意見もあるんだなぁ程度で見てもらえると幸いです。

# システムで一番大事だと思うこと

正しく動き続けることだと思います。

レスポンスの速度とか、SEO対策とか、SSL通信とか、SPA（シングルページアプリケーション）とか、モダンな見た目等々、色々とありますが、まともに動かないシステムは使われないと思います。

# どうやったら正しく動くシステムを作れる？

ハードウェアの動作と、使用されているソフトウェアの動作を掌握した上で、システムを作ることだと思います。

[「パブリッククラウドvsプライベートクラウドの終わり」の始まり](http://d.hatena.ne.jp/okachimachiorz/20170105/1483618649)

> 便利だけど不透明ってのは、実は「便利」じゃないんだよね。多少不便だけど「正確に内容がわかる」方が実はトータルで見ると「便利」だったりする。

こちらの記事でも言われているように透明さが重要なのかと。そうなると下記でシステム開発するのが良さそうです。

- ハードウェアは自分たちで作る（FPGAを使うとか）
- OSも自分たちで作る（Linux使わないで独自OSにする）
- 開発言語も自分たちで作る
- ミドルウェアも自分たちで作る

これなら全部自分たちで掌握できるので、

- システムの自由度
- システムの速度
- システムの開発工数

が全部極大となります。。。こんなことが出来るのはIBMとか、Appleとか、Googleとか、Microsoftくらいじゃないですかね？普通の会社の普通の開発者はどうすればよいのだろうか？

# エンジニアのタイプや企業のフェーズ

会社に行くとエンジニアがいるという会社がどれくらいあるのか？分かりませんが、エンジニアと言っても、色々なタイプがいると思います。インフラ系が得意な人、アプリケーションコードを書くのが得意な人、フロントエンドが得意な人。

おそらく、バランス良くエンジニアを雇っている会社のほうが少ない気がします。そうなってくると不得意な部分は、クラウドなりマネージドサービスを使って補う必要があると思います。また、ベンチャー企業のようにシステムが完成しないとお話にならないフェーズなどでは、マネージドサービスなど使えるものはすべて使って、ともかく最速で構築する必要があったりすると思います。

逆に売れているシステムがあって、そちらの開発コストを下げたいという要望や、パフォーマンスを改善したいなどの要望であれば、マネージドサービスを使うよりは自分らで作ったほうが良くなるのだと思います。

[チャットワークのScala移行と大規模メッセージDB再構築、本当にできたんですね！（前編）](http://hrnabi.com/2017/02/24/13750/)

> バックエンドがAmazon Auroraだったんですけど、サービスで一番上のランクを使っていても限界で、もうフルマネージドサービスでは耐えきれないなと。寿命が見えていました。

こちらの記事に例が出ていました。

# システム設計が大事なのではないか？

Webシステムを開発する際に、何かしらのミドルウェアを使ったり、ライブラリを使ったりすると思うのですが、マネージドサービスもその延長線上にあるのだと思います。

そうなってくると大事なのは、後から取り換えられるように作ってあることなのではないでしょうか？

OSI参照モデルのように、レイヤードアーキテクチャでしっかりと作成されている場合、一層を取り換えることは普通の実装よりは容易になります。

- オニオンアーキテクチャ
- ヘキサゴナルアーキテクチャ
- クリーンアーキテクチャ

最近のアーキテクチャを見ても、レイヤードアーキテクチャという点では共通しているので、この辺をしっかり守って開発していって、企業のフェーズやエンジニアの技量によって取り換えていくのが望ましいのではないかなぁと思いました。

# シンプルさの必要性

[シンプルさの必要性](http://eed3si9n.com/ja/simplicity-matters)

こちらの記事にもありますが、いくら切り替えられる設計で作っても、ミドルウェアやライブラリを多用するとそれだけで、不透明ポイントが増えることになると思います。出来るだけ依存モジュールを少なく、シンプルにシステムを作成することも必要なのではないでしょうか？

# システムのレスポンス速度

個人的に速いことは正義だと思っています。レスポンスが遅いとイライラするタイプのようです。

[RAIL モデルでパフォーマンスを計測する](https://developers.google.com/web/fundamentals/performance/rail?hl=ja)

[ページを1秒以内に表示するための最新技術、そしてSEOの未来（テクニカルSEOの復権 最終回）](http://web-tan.forum.impressrd.jp/e/2017/02/20/24816)

この辺の記事と僕自身を見ても、パフォーマンスって大事だなぁと思うので、JavaやGoなど、最初から実行速度の速い言語を使っておくことも大切なのかなぁと思ったりします。（同じ性能で良いなら速いほうが、サーバ台数が少なく済むとも思います。）（また、言語のリプレイスはめっちゃ大変な気がします。。。）

ともかく速く作らねばという状況であれば、Rubyなどの開発速度の速い言語を使うのも良いかと思います。（個人的には、Go言語であれば設計次第ですが、開発速度を速くすることもできるのでは？と、思っています。）

# 流行のフレームワークとか

ReactやAngularJS2などフロントエンドは流行が激変しましたが、一昔前はjQueryでサイト作っていたのだから、案件にもよりますが、シンプルなものを使っていくのも悪くないのだと思います。最近だとVanilla JSですかね？

余談ですが、仮想DOMを使いたいだけなら、jQueryでもできるみたいです。
[ReactをjQueryの数行に要約する](http://postd.cc/boiling-react-down-to-a-few-lines-in-jquery/)

# ライブラリ選定

盲目的に流行りのライブラリやフレームワークを使うのではなく、自分らでコントロールできる範囲で、シンプルなライブラリやミドルウェアを使っていくのが良いのではないかと思います。
（ブラックボックス的に使わざるをえない場合は、なるべく枯れているものを使うのがベストだと思います。）

また、たとえ流行ってないライブラリだとしても、自分らで内容を把握でき、十分コントロールできる（プルリクエストを投げられるとか）のであれば、採用しても良いのではないでしょうか？

# 最後に

色々と書きましたが、トレードオフが多すぎて大変かと思いますが、まとめると、

- シンプルに
- 取り換えられるように
- 状況に応じて

ということになるかと思うので、そのへん注意して作っていきたいなぁと思います。何か突っ込みあればよろしくおねがいします。
デレステの限定ガシャ2種を引ける確率を可視化してみた話

# 背景

先週、デレステの限定三船さんガシャで20万ほど爆死して引けずに撤退、
代わりに響子ちゃんを4枚ほど入手したので、
せっかくなのでどれくらいの確率なのか、可視化してみようかと思います。

たしか、無償石と合わせてトータル750連くらい回したと思います。
複数日に分けて徐々に爆死したので、正確な回数は覚えてないです。

# 環境

`jupyter notebook` on `anaconda3-4.2.0`

最初に以下を実行しておいてください。

```py3
import scipy.stats as st
import matplotlib.pyplot as plt

%matplotlib inline
```

# まずはSSRの排出確率

を見ていきます。
SSRの排出確率は1.5%なので、幾何分布の累積確率分布を見てみます。

```py3
v = st.geom.cdf(range(0 , 500), 0.015)
plt.ylim(0, 1)
plt.grid()
plt.plot(v)
```

![1.5%.png](https://qiita-image-store.s3.amazonaws.com/0/41925/d6b102c4-e122-3ac7-5b8c-3a50aeade38f.png)

100連でおよそ8割ってところでしょうか。
期待値は `1 / 0.015 = 66.6` 回です。

昨年大槻唯で爆死したPが
> [体感5万円で1SSRって感じ](https://twitter.com/beni6666/status/749364207322148864) 

と感想を述べてます。

**9800円 == 8400ジュエル** なので、50000円で端数切捨てると42000ジュエル。
それをすべて10連にぶっ込むと[^1]、こちらも端数切捨てで16回（160連）。

```
50000 // 9800 * 8400
# -> 42000
10 * (42000 // 2500)
# -> 160
```

グラフを参照すると、160連でおおよそ90%程度なので、体感的にも合ってそうです。

# 限定SSRの排出確率

[該当のガシャ](http://jin115.com/archives/52167820.html)は、限定三船さんと限定響子ちゃんの2枚がピックアップで、
排出確率はそれぞれ `0.3%` だったはずなので、

限定どちらか1種の累積確率分布は

```py3
v = st.geom.cdf(range(0 , 2000) , 0.003)
plt.ylim(0, 1)
plt.grid()
plt.plot(v)
```

![0.3%.png](https://qiita-image-store.s3.amazonaws.com/0/41925/fdec7714-0b61-15d8-160c-42e9af470c01.png)

形状は同じですが、横軸のレンジが広がってるのに気をつけてください。
500連でおよそ8割くらいでしょうか。
期待値は `1 / 0.003 = 333.3` 回です。

直感的には「500連回せば引けるんじゃね？」ってなりそうな気もしますが、
実際は5人に1人が「500連回しても目当ての限定が引けない」ことになります。

# 最後に

では、冒頭に書いた部分、響子ちゃんを何故か4枚も引いてしまう確率はどうでしょうか。
負の二項分布[^2]の累積確率分布で見てみます。

```py3
v = st.nbinom.cdf(range(5000), 4, 0.003)
plt.ylim(0, 1)
plt.grid()
plt.plot(v)
```

![nbinom.png](https://qiita-image-store.s3.amazonaws.com/0/41925/10e1f659-4eb1-2b38-b46d-0ea73e183141.png)

えっ

1800連ほど回してようやく確率8割といったところでしょうか。

750連で4枚引いたのはかなりの強運というか、確率的には10％ちょい。
けど、そっちじゃないんだよなぁ…

# おまけ

ツイッターの方にスクショ貼ってないのを思い出したので、こっちに貼っておきます。
ガシャでスクショ撮る習慣が無いので、事後の一覧画面ですが。

まだ[チュートリアル](http://blog.livedoor.jp/dstage/archives/14082997.html)すら終わってない無（理のない）課金勢ですが、今後ともよろしくお願いします。

![Screenshot_20170312-113731.jpg](https://qiita-image-store.s3.amazonaws.com/0/41925/3f8eb805-b4a6-8772-7ce9-cddaff16c2ec.jpeg)


[^1]: [実質無料](http://dic.nicovideo.jp/a/3000%E5%86%86%E6%89%95%E3%81%88%E3%81%B0%E7%84%A1%E6%96%99%E3%81%A710%E9%80%A3%E3%81%BE%E3%82%8F%E3%81%9B%E3%82%8B)ですが。

[^2]: 負の二項分布で k=1 としたものが幾何分布([参考](http://mathtrain.jp/negativebinom))
【shell】圧縮・解凍　ほかいろいろ

###<font color="Blue">新規ディレクトリ作成</font>
```
mkdir NewFolder
```

###<font color="Blue">ディレクトリに存在しない時だけ新規ディレクトリ作成 -p</font>
```
mkdir -p NewFolder
```

###<font color="Blue">dataFileを.tar.gz圧縮する</font>
```
tar zcvf dataFile.tar.gz dataFile
```

###<font color="Blue">.tar.gzを解凍する</font>
```
tar -zxvf dataFile.tar.gz
```

###<font color="Blue">.tar.gzを解凍先ディレクトリ指定で解凍する -C</font>
```
mkdir -p NewFolder
tar -zxvf dataFile.tar.gz -C NewFolder
```

###<font color="Blue">圧縮ファイル .tar.gzから　文字を検索する  zgrep</font>
2017-03-01.tar.gz
2017-03-02.tar.gz
の中から"004”を検索する

```
zgrep "004" *.tar.gz
```
出力結果
Binary file 2017-03-01.tar.gz matches
Binary file 2017-03-02.tar.gz matches

###<font color="Blue">Binary file matches　対処方法 -a</font>
```
grep -a "004" *.tar.gz
```
出力結果
2017-03-01.tar.gz:4,"kapibara@test.com",004,"ああああ","いいいい"
続　エンジニアを辞めたい

# エンジニアを辞めたい。
大学を卒業して７年。
１年半はフリーター。
そこからネットワークエンジニア（CCNA取得）でSES１年少し。
業務委託と常駐、自社案件、
Java、PHP、Node.js、AWSとかサーバインフラを見て、
ゲーム運用の派遣に入って、契約打ち切り、
半年間の契約社員後は正社員になるはずだったが、
自社からも雇用止を言われた。

# 何故か、自社案件にしがみついてた。
雇用止を言われても、
営業から納期について連絡が来なくても、
何故か自社の納品系の案件の作業をしていた。
昨日も、今日も。ずっと。

## なんでエンジニアなのか
恩返しがしたかった。
私の中ではただそれ一つだけだった。
### 趣味の話
ずっと、お世話になっていた楽器屋さんがいる。
大学生の頃からずっと。
楽器屋さんはたまにテレビでギターの鑑定をしている。
その人に言われたのが
「定年退職したら、自分の持ってるコレクションを売り払って生活していかなくちゃ」
という一言だった。
楽器屋でバイトの経験もあって、その業界の手取りの収入とか、いろんな事情は知ってる。
で、その人の将来を少しでも良い方向に結びつけたかった。
### その人のためにできること。
楽器屋さんからは頻繁に相談を受けていた。
勤め先のECサイトの運用方法だったり、
どうしたら集客が上がるのかだったり。
いつも御茶ノ水の徳兵衛でろくでもない話をしているなかで、
真剣な話をぽつりぽつりされていた。
定年後の話になるといつもつらそうだった。
### 楽器屋さんにはなれないから。
楽器屋さんに弟子入りすることも真剣に考えた。
楽器屋さんからは私がWebのエンジニアとして働いていることも分かってて、
楽器屋の業務プラスエンジニアとして店頭に居て欲しいと言われた。
でももうその時は、どっぷり会社に入っていた。
手取りの給与も良くなってた。
もう、エンジニアとして手に職つけてしまったから、派遣でもなんでもエンジニアでいようとしてしまった。
### 楽器屋さんのために作りたい
楽器屋さんの定年退職後のために作りたい物。
ECサイトだった。
楽器って生物なのは自分でもよくわかってる。
アマゾンとか楽天とかそういうところでポンポン買えるのは
生物みたいな、価値の高い竿物楽器ではない。
だから、生物の取り扱えるECサイトが作りたかった。

## 今の自社案件
しがみついてる案件は私が作りたいものに近い物を納品することだった。
だから、やれることはひとしきりやりたいし、
出来る限りのことを吐き出して、
出来る限りのことを吸収したかった。
しがみついた。
チャットワークで営業に納期について連絡もした。
でも返信は無い。
無いから無駄になってもいいから書いてた。
HTML５とPHPとMySQL、AWSのEC2
とりあえずこれを動かして。
ECサイトの諸々の必要な機能を全部組み込み。
１人でこれを頼まれた３週間前から。
常駐しながらやってた。

## タイムアップ
雇用止を言われて１週間。
雇用止を言われながらも自社案件の作業もしてた１週間。
もう新しい週が来てしまった。
無理っす。
これでまた常駐先を休めば勤怠不良といわれ追いやられるんだろう。
3月末まで、常駐先がある。
休めない。
雇用止になるのは４月半ば。
空白の2週間何をして会社にいるんだろうと思う。
不安だ。
何も作業がなければ自社の掃除でもしていよう。

あ。やりたいことあった。
Jenkinsのチャットワーク通知。
Debugging Ruby


![](https://ruby.tw/logo.gif)

http://qiita.com/chimame/items/56e48ab3145312ff1786

http://dev.classmethod.jp/tool/visual-studio-code-ruby-debug/

http://tbpgr.hatenablog.com/entry/2016/12/15/231752


developementのgroup

```
gem 'ruby-debug-ide'
gem 'debase'
```
`bundle install --path vendor/bundler`

* Windowsならspringは使えない

```launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for rdebug-ide",
      "type": "Ruby",
      "request": "attach",
      "cwd": "${workspaceRoot}",
      "remoteHost": "127.0.0.1",
      "remotePort": "1234",
      "remoteWorkspaceRoot": "${workspaceRoot}",
      "useBundler": true
    }
  ]
}
```
Kivyの１行入力ボックスの作成方法

公式サイトにやり方はのってたみたいなんだけど、いろいろ試したけど読解力がだめで初心者に優しいterateilってサイトで質問しました。

#teratailとは
15分調べてもわかんないならとりあえずここで聞いてくれ！答えくれるから！

っていう初心者に優しいサイト！
リンクはこちら
**https://teratail.com/**

#自分でしてみた質問
**https://teratail.com/questions/68831**

ここからとべます。

早速質問を見てくれて答えてくれた方の**コードをそのままコピペ**して
**複数行ではなく1行だけを入力する処理（イベント？）**を教えていただたいたので実行。

試しに適当に文字をうってEnterをおすと**改行されない！**

しかしこのままではウィンドウいっぱいに枠が表示されてしまう。

#ｋｖファイル

思い出したのがkvファイル。

kvファイルというのは**HTMLでいうCSS**のようなもの。

オブジェクトの位置や大きさなどを変更することができる。

**直接メインファイルに書き込むこともできる**けど分けた方がすっきりするから利用するしかない。
こんなmainファイルがあったとする

```python:test.py
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput

class testApp(App):
    def build(self):
        layout = FloatLayout()
        ti = TextInput(text='Hello world', multiline=False)
        ti.bind(on_text_validate=self.on_enter)
        layout.add_widget(ti)
        return layout

    def on_enter(self, ti):
        print("on_enter[%s]" % (ti.text))

if __name__ == "__main__":
    testApp().run()
```

同ディレクトリ（フォルダ）の中に**test.kv**っていうファイルを用意する

中身はこんな感じ
テキストで書きたかったけど記号のせいか上手くいかなかったので画像です
![bandicam 2017-03-12 23-26-38-187.jpg](https://qiita-image-store.s3.amazonaws.com/0/158551/fae9e0f4-a988-94b6-d468-e70616e6762e.jpeg)

こう書くことでtest.pyファイルを実行すると・・・

**ドーン！**
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/158551/2717ae99-31bc-df5a-077e-62e926bb7d62.png)

上手くいきました！これで1歩前進！ということで1行入力ボックスの作成＆場所指定方法でした！

(※terataliで回答してくださった方ありがとうございました！)

#今回使用しているVersion

- Windows10
- Anaconda3(python3.5.2)
- kivy1.9.1
GANで文章の生成(Controllable Text Generation - Arxiv.orgより)

(勉強会より：論文読みレポート)

"人工知能に適当に会話させたいのだけど、言語の生成ってどのレベルまでできるの？"というのは、リアルな開発現場でもお客様が良くする質問です。

![Screen Shot 2017-03-12 at 10.49.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/76304/226be07c-e5ff-c8c4-5c2c-b708d132753c.png)


上記が米カーネギーメロン大学の先週の研究論文ですが、
コーパス(Web上の文章を巡回取得したデータベース)をGAN(生成のニューラルネットワーク)にかけて学習させた事例です。

"Controllable Text Generation"
https://arxiv.org/abs/1703.00955

途中の数式は読み飛ばした部分もあるので恐縮ですが、

アウトプットだけ見ると；

I will regret it (私は後悔するだろう=ネガティブ表現)
を
I will enjoy it(私は楽しむだろう=ポジティブ表現)

に自動言い換えできるレベルにはなって来ている事がわかります。

これは、画像生成で言うところの；

サングラスをかけていない顔画像
を
サングラスをかけている顔画像

に変換している作業に近いものがあります。

ベースデータがあり、数式に表せる様な加工フィルターがあると、目的に近いアウトプットが出せる様になって来ています。

Controllableというタイトルになっている部分もミソで、
現状自由に言語生成のアウトプットを出すと、
Microsoftのりんなちゃんの様にややシュールな不思議系会話になるので、
それを如何に実用レベルの安定管理できる技術に発展させるかが、研究領域で課題になっています。

GANは非常に熱い分野だけに、今後様々なバリエーションのデータ生成ができてくると、産業の各領域で生産性が上がるため、注目すべき技術だと思います。
【shell】数値フォーマットファイル出力

#<font color="Blue">数値フォーマットファイル出力</font>

```test03.sh
#!/bin/sh
for i in {1..10}
do 
    #数値をフォーマット00
    number=$(printf "%02d" $i)
    #ファイル名
    FILENAME="2017-03-${number}.csv"
    #中身
    for j in {0..4}
    do
      echo "$j,\"kapibara@non.com\",\"ああああ\",\"いいいい\"" >>./dataFile/${FILENAME}
    done
done
```


##出力結果
![dataFile.png](https://qiita-image-store.s3.amazonaws.com/0/93155/618ad458-2108-b87e-2c29-f973d8244fe5.png)

```
0,"kapibara@non.com","ああああ","いいいい"
1,"kapibara@non.com","ああああ","いいいい"
2,"kapibara@non.com","ああああ","いいいい"
3,"kapibara@non.com","ああああ","いいいい"
4,"kapibara@non.com","ああああ","いいいい"
```
（本当は「今までの復習を兼ねてつまったところを順番に体系的にまとめる」ということをやりたかった）

1.「Cloud9すげぇぇぇぇ！」
→クラウド９はローカル開発環境でちょこっとプログラミングを触っていた自分にとって、楽園とでもいえるほどの環境でした。とにかくプログラミングのハードルが下がる下がる。ちょこちょこと触っていると、本格的に何か作りたいなと、そう思いいたったのです。

2.「node.jsかっけぇぇぇ！」
→WEBアプリを作る、っていうのは前提としてあったわけです。でもちろんクライアントはhtml,css,javascriptが三種の神器でデファクトスタンダードなわけですけれども、さぁ、サーバーサイドはどうしましょう、となったわけです。（以下昔話...）初めてサーバーサイドを触ったのはPHPで、いろいろもちゃもちゃと触って違和感なく作れたのですが、いろいろあってプログラミングから離れていました。そうこうしているうちに「rubyOnRailsってすごいらしいよ」という噂を耳にし、どんなものかと触っていると、「PHPでもちゃもちゃやっていた、あの面倒くさいやつ（ルーティングに該当することだと思う）が仕組みとして組み込まれてるなんてすばらしい！DRYって素敵！設定より規約ってなんかすごそう！あと開発者のDHHってなんか、響きがかっこいい！！しかもrubyって日本人の開発者なんだすげぇ！」ってなりました。でも、まぁ、一応作っては見たんですけど、まぁ、なんというかあんまし理解できなかったというか。「感動したけど、いまいちrailsって“ピン”と来ないな…」という印象でした。すごく複雑そうに見えたんです。rubyは直観的で好きなんですけど、railsは直観的でない。そう感じたんです。（...以上昔話）ということで、さわったことのあるrubyOnRailsの勉強の仕切り直しをするか、はたまた別の言語でいくのか…。いろいろ調べているうちに「Node.js、最近、キテるらしいよ」という噂を耳にし（流されやすい人）、調べてみると、結構よさげらしいじゃないですか。少し前（数年前）までは、勝手な認識ですけど「javascriptで無理やりサーバーサイドをかける、キワモノ」みたいに思ってたんです（笑）。とにかくnode.jsは非同期と相性がよさそうだし、クライアントサイドは結局javascript使うんなら、いちいち言語を切り替える必要もないのでよいと。まぁ、使ってみて「最高にクールなんだなjavascript」って思えましたけどね！

3.「expressしんぷるぅぅぅ！」
→言語選びにさんざん悩んだ挙句、さらに今度はフレームワーク選びで悩みました。nodeにはデファクトスタンダードなフレームワークがない、らしく…。railsライクなSailsやらやたらカッコよくて自己完結型のMeteorやら、シンプルなExpressやら…。実はこの段階でもまだ、「やっぱりrailsのほうがいいんじゃないだろうか」とかもう、いろいろ触りながら試行錯誤してました。で、結局Expressにしました。理由は単純「Qiitaの投稿数が多かったから」です。Rails触ったことあるし、Sailsにしようかな、とも思ったんですが「Sailsの中身が何やっているのかわからない」っていうのが、足枷になりそうな気がしたからやめました。

4.「socket.ioあしんくぅぅ！」
→nodeを選んだなら、非同期ライフを満喫したい。なにやら非同期を簡単に実装できそうじゃありませんか。でまぁ、そこそこ躓きながらも、なんとか実装できました。はい。便利ですね、非同期、楽しいですね、非同期。

5.「mongoDBそのまんまくえりぃぃ！」
→mongoDBはそのままjavascriptのオブジェクトを投げれば使える（＝言語を切り替える必要がない）ということらしいので、mongoにしました。本番環境（？）に環境を移す時のことを考えると、mySQLがなにやら難しそうなことが調べると書いてあったのと「SQLじゃないのにDB」ってところが最高にキュートだと思えたので、ここはあまり迷わなかった気がします。

6.「mLabしんぷるぅぅ！」
→gitHub経由でHerokuにデプロイすることは規定路線だったので、本番環境（？）上でのDBの設定を行いました。まぁ、予想通りおおはまりしましたが、実はかなり懸念していた部分だったので、無事連携できてよかったです。

7.「gitHubおおぷんん！！」
→gitHubもまともに使えたことがなかったので、うれしいです。ちなみに自分のPCにはgitはいれません。ファイルも保存しません。

8.「herokuでぷろぃぃ！！」
→herokuの「変な外国人の思い描いたJAPAN色満載のデザイン」には未だになれませんが、無料デプロイ環境といえば、Herokuですよね。スケールしやすい（らしい）そうなので、それも夢が広がっていいですよね。

まとめ：
本当は「今までの復習を兼ねてつまったところを順番に体系的にまとめる」ということをやりたかったのですが。記憶の欠落が多くてかけない、かつ、その記事をまとめていると、その記事を書くのに時間が費やされ過ぎて、実際にモノを作る（コードを書いたり、デザインしたり）時間が無くなってしまう、という理由で断念しました。つまったところは都度まとめないとだめですね。調べ物をしながらメモをとって、それをもとに記事にする、っていうようにやらないと。まぁ、Qiitaの利用方法も手探りです。
【shell】入力ファイルにヘッダー行、フッター行を追加する

#<font color="Blue">入力ファイルにヘッダー行、フッター行を追加する</font>

```file02.csv
A101,A201,A301,A401
B101,B201,B301,B401
C101,C201,C301,C401
D101,D201,D301,D401
E101,E201,E301,E401
```


```test02.sh
#!/bin/sh
#入力ファイル
FILENAME="file02.csv"
#出力ファイル　新規作成
: > output02.csv

CNT=0
cat $FILENAME | (while read LINE || [ -n "${LINE}" ]; do
  CNT=$((CNT+1))
  if [ "$CNT" -eq "1" ];then
    #ヘッダー　日付
    echo "111,20170301" >> output02.csv
  fi
  #明細部
  echo "222,${LINE}" >> output02.csv
done;
#フッター　件数
echo "333,${CNT}" >> output02.csv
)
cat output02.csv
```


##出力結果　output02.csv
```
111,20170301
222,A101,A201,A301,A401
222,B101,B201,B301,B401
222,C101,C201,C301,C401
222,D101,D201,D301,D401
222,E101,E201,E301,E401
333,5
```
Apache Shiroのチュートリアル翻訳まとめ

# 概要
[Apache Shiro](https://shiro.apache.org/)を勉強するためにチュートリアルのドキュメントを読んで訳していました。全部訳したわけではないですが、主なものは読み終わった（と思う）ので、訳したものの一覧を作ることにしました。

# Apache Shiroのドキュメントと自分の翻訳との対応一覧
* [10 Minute Tutorial on Apache Shiro](https://shiro.apache.org/10-minute-tutorial.html)
 * http://kagamihoge.hatenablog.com/entry/2017/01/18/225741
* [Java Authentication Guide with Apache Shiro](https://shiro.apache.org/java-authentication-guide.html)
 * http://kagamihoge.hatenablog.com/entry/2017/01/24/231540 
* [Java Authorization Guide with Apache Shiro](https://shiro.apache.org/java-authorization-guide.html)
 * http://kagamihoge.hatenablog.com/entry/2017/02/03/230020
* [Apache Shiro Architecture](https://shiro.apache.org/architecture.html)
 * http://kagamihoge.hatenablog.com/entry/2017/03/05/151312
* [Apache Shiro Terminology](https://shiro.apache.org/terminology.html)
 * http://kagamihoge.hatenablog.com/entry/2017/03/12/225210
ArduinoでSigFoxを使って通信してみた

# 概要

[某勉強会](https://sigfox.connpass.com/event/51165/)に参加してSigFoxとArduinoを使ってデータを転送するところまでやってみた。
以下2つをUSBで接続し、Arduinoにプログラムを書き込むことでデータを転送することができる。

* 【SigFoxの通信デバイス】
![DSC_0130_fix.jpg](https://qiita-image-store.s3.amazonaws.com/0/152676/253fbe68-f514-4c99-f312-1ffcd661610b.jpeg)
* 【Arduino、センサー】
![DSC_0134.JPG](https://qiita-image-store.s3.amazonaws.com/0/152676/ca14e90a-1adb-91ff-e087-5abcf7553477.jpeg)

# SigFoxとは
## 概要
* LPWA規格の1つ
* 仏SigFox社、および各国の事業者(1社のみ)が基地局を構築
  * 日本の場合は京セラ

## 特徴
1. 各デバイスがSigFoxが管理する個別のIDを所持し、IPアドレス不要で通信
1. SIMカード・アクセスポイント不要のグローバル用ネットワーク
1. スループットが小さいが、通信距離が長く、消費電力が小さい

1, 2は、他のLPWA規格の通信(LoRA,Wi-SUN,...etc)と異なるかも？
3は、他の無線通信(3G/LTE、BLE,...etc)との違い

## 通信方法
* デバイスが複数の基地局に対してデータを転送
* 基地局のデータを[SigFoxクラウド](https://backend.sigfox.com/auth/login)にて受信
* SigFoxクラウドが他のIoTプラットフォームへデータを転送

![fig1.jpg](https://qiita-image-store.s3.amazonaws.com/0/152676/d3a35b60-a813-e0b4-2e50-d0afe52ee373.jpeg)

# 使用方法
## 実施手順
1. SigFoxクラウドへアカウント登録(今回は実施せず)
2. SigFoxクラウドへデバイス登録(今回は実施せず)
3. Arduinoの組み立て
4. Arduino IDEによるプログラムの書き込み

## Arduinoの組み立て
使用したもの
* [Arduino Uno R3](https://www.switch-science.com/catalog/789/)
* [USBホストシールド](https://www.switch-science.com/catalog/1933/)
* 温度センサー([ロームセンサ評価キット](http://www.rohm.co.jp/web/japan/sensor-shield-support)のものを使用)

## Arduino IDEによるプログラムの書き込み
以下2つを組み合わせて使用  
* [SigFoxのサンプルソース](https://github.com/RyosukeF/SIGFOX201703.git)  (リンク切れ)
* [BD1020HFV用ソフトウェア](http://micro.rohm.com/jp/download_support/sensor_module/kiyaku.php?file=data/software/BD1020HFV.zip&_ga=1.145043824.577396218.1489198786)

# 実行結果
![sensor.JPG](https://qiita-image-store.s3.amazonaws.com/0/152676/77ffcc21-bc06-4d77-e1a4-9ebc29d87b6e.jpeg)

# 所感
今回は、サンプルソースの実行をしただけのため、使用する分には特に問題がなかった。(多分、ライブラリの作成とかイロイロ苦労がありそう)
実行結果を見て分かる通り、他の基地局も含めて使って何度か通信が発生している模様。
デバイスと基地局との通信品質は、契約数でデバイスの数を把握できるので、それに合わせて基地局を順次増やしていく予定なのかな？
そういえば、暗号化しているのかどうかとか、イロイロ技術的な話を聞き忘れていたのが心残り。
Node.jsでMinecraftサーバーを実行する

##サンプル
```js
const proc = require('child_process');

// サーバーの実行
var server = proc.spawn(
    "java",
   ['-Xms1024M', '-Xmx1024M', '-jar', 'minecraft_server.jar', 'nogui'],
   { cwd: "C:/user/yuta/desktop/server" } // サーバーファイルのディレクトリ
);
// ログを表示する
server.stdout.on('data', function (log) {
   console.log(""+log);
});
server.stderr.on('data', function (log) {
   console.log(""+log);
});

// コマンドを実行する 以下ではhelpコマンドを実行している
server.stdin.write("help" + "\r");
```
FuelPHPのクイックインストールができない

FuelPHPでクイックインストールしようとしたらエラー出た場合

```
$ curl get.fuelphp.com/oil | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   239  100   239    0     0    402      0 --:--:-- --:--:-- --:--:--   402
sh: line 1: syntax error near unexpected token `newline'
sh: line 1: `<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">'
```


※この問題の理由は、``https``での取得に変更になったからのようです。

### 解決方法

```
$ curl https://get.fuelphp.com/oil | sh
```

これで``oil``コマンドが使えるようになるので

```
$ oil create hoge_project
```
とすればfuelのプロジェクトが生成されます。
offset()の基点はドキュメントの左上、について(結構、どうでもいい)


jQueryのoffset().topの算出方法を見てみると、

①var rect = element.getBoundingClientRect();
 　rect.top　　　　　　　　　　　　　　　　　　＝　要素のビューポート位置(y座標)
②window.pageYOffset;　　　　　　　　　　　　＝　スクロール位置
③document.documentElement.clientTop;　　　　　＝　ルート要素のborder-topの幅

戻り値　＝　①　＋　②　ー　③　

となっています。
leftも同様、border-leftの幅が引かれます。

ルート要素(htmlではhtml要素)のborder幅が引かれているので、
つまりはルート要素のpaddingの上端部分を基点とした値が戻ってくるわけです。

まぁ、ルート要素にborderをつけることはあまりないと思いますが、、、
生javascriptのoffsetTopもoffsetParentのpaddingの上端を基点とするので
それに合わせているのかな？
【shell】ファイル 最終行 読み込み

#<font color="Blue">改行コードなしでも最終行まで読み込む</font>

```file01.csv
A101,A201,A301,A401
B101,B201,B301,B401
C101,C201,C301,C401
D101,D201,D301,D401
E101,E201,E301,E401←改行コードなし
```


```test01.sh
#!/bin/sh
FILENAME="file01.csv"
cat $FILENAME | while read LINE || [ -n "${LINE}" ]; do
  echo $LINE
done
```


##出力結果
```
A101,A201,A301,A401
B101,B201,B301,B401
C101,C201,C301,C401
D101,D201,D301,D401
E101,E201,E301,E401←改行コードなし
```
PrometheusのContainer_exporterを入れてみた

# 環境
Azureに仮想マシン（CentOS7.3)を立て、Dockerコンテナ上にPrometheusをインストール
監視対象となるサーバも同環境で、Docker導入済みです。


# 前書き
今時、監視もDockerに対応せねば・・・ということで、Prometheusを検証しています。
今回は、Container_exporterを導入してみましょう。


# Container_exporter インストール
Container_exporterは、node_exporter同様、専用のコンテナを立ち上げます。

```
<インストールしたいDockerホスト上>
## docker run --privileged -p 9104:9104 --name container_exporter -dt -v /sys/fs/cgroup:/cgroup -v /var/run/docker.sock:/var/run/docker.sock prom/container-exporter /sbin/init

```

※ ポイントは、-v オプションの2つです。これをつけないと、container_*** と言ったような値が取得できず、グラフの項目にも出てきません。


# 残作業
毎度ながら、FW のポート開け（今回は、9104ポートでした）、やっておきましょう。
[ios] firebase crash reportingセットアップしてみた

# firebase crash reporting とは？

- firebaseの機能の一つ
- どこでクラッシュが発生したかレポートにしてくれる


# アカウントセットアップ

firebaseでアカウント登録、アプリ登録し、firebase consoleが見れる状態にしておく

# cocoapods

```
pod 'Firebase/Crash'
```
Podfileに追記し、 pod installする


# import

```title:objc
@import Firebase;
// または
#import <Firebase/Firebase.h>
```

```title:swift
import Firebase
```

# サービスアカウント設定

- firebase consoleで歯車アイコン＞サービスアカウント＞クラッシュレポートを選択

- 新しい秘密鍵を生成を押すと、jsonファイルがDLされるので、そのファイルをxcode projectのあるディレクトリに移動させる

# run script設定

- xcodeでrunscriptを追加する

```
# Replace this with the GOOGLE_APP_ID from your GoogleService-Info.plist file
GOOGLE_APP_ID=1:my:app:id　#←書き換える

# Replace the /Path/To/ServiceAccount.json with the path to the key you just downloaded
"${PODS_ROOT}"/FirebaseCrash/upload-sym "/Path/To/ServiceAccount.json" # ← さっき移動したファイルのファイル名にする（proj直下なら/Path/To/は不要のはず
```

# テスト

appdelegate内などで、

```
# for objc
assert(false);
# for swift
fatalError()
```

を実行し、わざとクラッシュさせる

ログを確認

```
2017-02-27 16:38:49.997 futaba[1734] <Debug> [Firebase/Core][I-COR000018] Already sending logs.
```

問題なさそう


🔺のクラッシュログをfirebaseのコンソールから確認することはできなかったが、リリース後コンソールを見てみると


![image](https://qiita-image-store.s3.amazonaws.com/0/48695/a8d343ed-1c76-0eca-b40b-b2e35c6dd1c2.png)


きちんと集計されていた


![image](https://qiita-image-store.s3.amazonaws.com/0/48695/518d0c3f-a353-b0cf-97be-d52f374b620d.png)

Firebase Analyticsでもデータを集計していると、ユーザがどういう行動をした結果クラッシュしたかまでデータをマッチングさせて表示してくれる

これは便利！
2017.3.6~3.12やったことまとめ

#方向変換
先週は
【 5日でできる】はじめての Linux 入門
を終了させることを目標としました。
しかしながら、やはり最初は裾野を広げることより、一つのことを集中して行い、ある程度できるようになってから、裾野を広げることに方向転換しました。
まず、何を集中してやるか。
私は初学として、HTML,CSS,javascript,python,PHP,Ruby on Rails等をProgateにて行いました。
HTML,CSS,javascriptは、極めると、いろいろやれることがわかる一方、bootstrapやwordpressなど便利なものがあるので、極めることを飛ばしました。
PHPと、Ruby,python共に、サーバ側のプログラミングなので、どれを選ぶのか、迷いました。
最近はPythonが流行っているとのことですので、Pythonでやっていこうと決めました。
しかし、こちらもネットの情報なので、怪しいところですが・・・
機械学習やら、ニューラルネットワーク、AI、画像認識、ビッグデータやら、いろいろPythonには向いているらしく、初学者の私にはさっぱりわかりませんが、とりあえず、一つのことに極めます。
#最初の一歩
まず、初学として、Udemyにて、Pythonの演習。
こちらは先日行いましたので、よく理解できました。
続いて、次の段階の関数やら、リストをしっかりと学びたいと思いました。
#Webサービスの作成について
実は、行いたいWebサービスがあり、そちらを実装させるのが、目標であります。
どのようなWebサービスを作成したいのかと言いますと、私が日々作成しております、エクセルの計算書類をPythonにて実装してみたいというのがあります。
本当に、Pythonであっているのかはさっぱりわかりませんが、とりあえずやってみます。
#現状の問題
２つの選択されたものから共通する項目を選択。（２次元配列？）
スマホでoverflow:auto;が効かない

※この記事は、2016年7月に他のブログ(WordPress)で書いた記事をQiitaに移行したものです。

---

スマホ（iOSのSafari）で、当ブログを見ていたら・・・
preタグで囲ったソースコードが、改行されまくっている！！
見づらい！！(´；ω；｀)
この問題を、ググッて解決できたので、載せます。

## 当ブログでのソースコード表示
まず、当ブログにソースコードを載せる際は、ソースコードをpreタグで囲っています。
preタグで囲うことで、改行やインデントを、整形せずにそのままの形で表示してくるんですね。
しかし、以下の問題がありました。

* スクロールする必要がなくても、縦横にスクロールバーが表示されて、あまり格好良くない・・・。
* 背景が白色で、ソースコードっぽくない。

## CSSをいじってみる
PCではいい感じになったのですが、スマホ（iOSのSafari）で見ると、
横スクロールせずに全て改行されることに気づきました。

## 結論
調べて、いくつか試した結果、preタグに

    word-wrap: normal;

を指定することで解決しました。

今回、preタグに指定したものは、以下になります。

    overflow: auto !important;
    background-color: #f7f7f7;
    word-wrap: normal;

![pre-no-187x300.png](https://qiita-image-store.s3.amazonaws.com/0/102964/02960a19-a6b9-ae7d-cf88-dfeb23a4eb19.png)

これで

* 必要なときだけ横スクロールバーが表示される
* 背景色をグレーにして、ソースコードっぽく
* スマホで見てもソースコードが改行されない

の３つを実現できました。

見づらいかもしれませんが、画像のような形になりました。

今回は以上です。
リアルタイムWebアプリにおいてWebSocketを直接つなぐのとFirebaseを挟むのではどの程度レスポンスタイムが変わるか

実際に測定してみた。

# 動機
そこそこリアルタイム性が求められるWebアプリにおいて、できればFirebaseを使いたいが、パフォーマンスが悪くなるならあきらめてWebSocketを直接つなごうと思った。
例えばシムシティのような協力プレイゲームを作っているとして、

 - 自分の操作を他の人に反映させたい
 - お金が足りているかバリデーションをサーバーサイドでやりたい

という場合のことを考えた。  
Firebaseを使えたら認証やその他諸々をFirebaseだけで完結させることができる。
しかし、パフォーマンス上成り立たないなら、あきらめてWebSocketを別につなぐことになる。
そこで、実際にどの程度差がつくのか調査してみた。

# 方法
## WebSocket
Dartで下記処理をするサーバーを書く

 - WebSocketを待ち受ける
 - WebSocketから文字が来たら同じ文字を送り返す

Dartで下記処理をするクライアントを書く

 - ブラウザ立ち上げ直後は遅そうなので取り合えず10秒まつ
 - サーバーにWebSocketをつなぐ
 - 100msごとにWebSocketに現在時刻を書き込む
 - WebSocketからさっき書き込んだ時刻が返ってくるので現在時刻から引き算しレスポンスタイムを調べる
 - 以上を100回繰り返し平均を出す

サーバーは

 - GCP asia-northeast1-c
 - 1vCPU
 - 3.75メモリ
 
僕が日本に住んでるので日本に建てた。
ただし名古屋市民のため、都民だともうちょっと速いかも。

## Firebase
Dartで下記処理をするサーバーを書く

 - Firebaseの/requestをListenする
 - /requestに書き込みがあったら同じ内容を/responseにpushする

Dartで下記処理をするクライアントを書く

 - ブラウザ立ち上げ直後は遅そうなので取り合えず10秒まつ
 - Firebaseの/responseをListenする
 - 2s（※）ごとに/requestに現在時刻を書き込む
 - /responseにさっき書き込んだ時刻が書き込まれるので、現在時刻から引き算しレスポンスタイムを調べる
 - 以上を100回繰り返す

（※ 一回100msごとに書き込んで試してみたのだが、イベントが詰まるようで明らかにパフォーマンスが劣化するので間隔を広げた。この点は厳密な比較になっていないので注意）

サーバーは

 - GCP us-central1-c
 - 1vCPU
 - 3.75メモリ

Firebaseがアメリカにあるらしいのでアメリカに建てた。
アメリカのどこにあるのかわからないので、探せばもっと速い場所が見つかるかも。

# 結果
| 調査の種類 | 平均レスポンスタイム | （参考）自宅PCにサーバーを立てた場合　 |
|:--|--:|:--:|
| WebSocket| 123.66ms | 0.93ms |
| Firebase | 254.74ms | 440.34ms |

# 感想
意外とWebSocket自体が遅かった。さくらのVPSを使ってた頃は20ms切ってた覚えがある。  
ものすごくはっきりした差が出たわけではないので使い方によると思う。

# 参考情報
簡単にもっとCPUとメモリの多いサーバーで試してみたが、大して変わらなかった。同時接続数がとても低いのであまり関係ないようだ。
10分で終わる！SEO対策の準備

※この記事は、2016年8月に他のブログで書いた記事をQiitaに移行したものです。

---

SEO対策って、面倒で後回しになりがちですが、**準備だけなら、意外とすぐ** できます。
今回は、その方法をまとめてみました。

具体的には、Googleアナリティクスと、SearchConsoleの登録方法です。

では、実際にやってみましょう。

## Googleアナリティクスにサイトを登録する

### アカウントを作成する

https://www.google.com/intl/ja_jp/analytics/ にアクセスして、「アカウントを作成」をクリックする。

![Googleアナリティクス登録.jpg](https://qiita-image-store.s3.amazonaws.com/0/102964/140ded92-7dc8-0a27-dc25-01a5b1d68c36.jpeg)

### 必要項目の入力
「アカウント名」「サイト名」「サイトURL」「業種」「タイムゾーン」を入力し、「トラッキングIDを取得」をクリックする。

![Analytics02-2.png](https://qiita-image-store.s3.amazonaws.com/0/102964/6c76ee0d-f92e-2846-8ae8-3f8b0d47183a.png)

### 取得したトラッキングコードを、サイトのhead終了タグの直前に埋め込む

## SearchConsoleにサイトを登録する

### サイトを追加する
https://www.google.com/webmasters/tools/home?hl=ja にアクセスし、サイトURLを入力して、「プロパティを追加」をクリックする。

![Search-Console-ホーム.png](https://qiita-image-store.s3.amazonaws.com/0/102964/6db5d16d-17d4-5dbd-e63f-89ccd8da2a37.png)

### サイトの所有権を確認する

先ほどの、Googleアナリティクスのトラッキングコードをサイトに埋め込んだ状態で、「確認」を押してください。

![Search-Console.png](https://qiita-image-store.s3.amazonaws.com/0/102964/81e796bd-17e1-36dc-1d24-4e88c21ae04e.png)

### 登録完了
下の画像のように表示されれば、完了です。

![Search-Console2.png](https://qiita-image-store.s3.amazonaws.com/0/102964/347f8403-0ade-5649-9bc7-8adbca7c5972.png)

お疲れ様でした！いかがでしたか？
意外とすぐでしたよね。
今後も、このブログで実践しつつ、SEO対策のやり方を継続的に
投稿していきたいと思います。
[備忘録]ArchLinuxのGnomeでs2diskしたときのメモ

# やりたかったこと
ArchlinuxをThinkpadHelix2(Versapro)にインストールしたが、Windowsと同じくスリープやハイバーネートなどの動作が宜しくない。`pm-utils`と`systemd`との相性が良くないようなので*1  `Uswsusp`を使えるようにした。
# やったこと
- AURから`uswsusp-git`をインストールする。現在（2017/03/12）では`compress`オプションを設定してしまうと、起動プロセスが途中で停止してしまうのでとりあえずこのオプションは外しておくのがオススメ。

- 一通り適切な設定を行い`# s2disk`コマンドの動作を確認する。

- `systemd`にデフォルトで用意されている`suspend`の設定を編集する。まずはデフォルトの設定ファイルをコピーする。

```
sudo cp /usr/lib/systemd/system/systemd-suspend.service /etc/systemd/system
```

次に、デフォルトのサスペンドの代わりに`Uswsusp`の`s2disk`を使用するようにする

```bash:/etc/systemd/system/systemd-suspend.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Suspend
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target
After=sleep.target

[Service]
Type=oneshot
# ExecStart=/usr/lib/systemd/systemd-sleep suspend
ExecStartPre=-/usr/bin/run-parts -v -a pre /usr/lib/systemd/system-sleep
ExecStart=/usr/bin/s2disk
ExecStartPost=-/usr/bin/run-parts -v --reverse -a post /usr/lib/systemd/system-sleep

```

- 私はGnomeユーザーなのでtweakツールで蓋を閉じたときの動作を「なし」に設定し、設定パネルから電源ボタンを押したときの動作を「サスペンド」に設定した。

## 参考文献
*1 https://wiki.archlinuxjp.org/index.php/Pm-utils
https://wiki.archlinuxjp.org/index.php/Uswsusp
http://qiita.com/a_yasui/items/f2d8b57aa616e523ede4