OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習で精度をレポートするときの指標あれこれ

機械学習で予測モデルを作ったあとに精度を出すことが多い。その際に「精度って何？」ってことを定義しておきたい。統計は医療の現場で使われることが多いからか、「陽性（Positive）／陰性(Negative)」という用語が使われる。

以下がその4象限。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/53489/d5ab4e06-556c-9e25-e719-548b21d43c0c.png)

予測が陽性で、実際にも陽性の場合には、True Positive、つまり「陽性であたり」ということ、TrueがあたりでFalseがはずれということ。

## 正解率

```
 (TP + TN) / ALL
```

![無題のプレゼンテーション (3).png](https://qiita-image-store.s3.amazonaws.com/0/53489/3ce4c2cb-e90b-f6f1-5708-e968c2297764.png)


全サンプルを分母として、陽性のあたりと、陰性にあたりを分子とする。直感的にはわかりやすい。ただし、これだと、砂漠の天気を当てに行くときには、「全部晴」とバカみたいに言うのが一番制度が高くなってしまう。（実際にそういうまやかしレポートもある）


## 再現率

```
TP /  ( TP + FN ）
```

![無題のプレゼンテーション (1).png](https://qiita-image-store.s3.amazonaws.com/0/53489/1b541777-41af-a230-24b8-d34c80d7068b.png)


True Positive（陽性のあたり）に注目したのが、再現率。砂漠の天気予報で、「雨を陽性としてあてにいく」時には、全部晴という予測をしたのでは大外れしてしまう。ただし、今度は多めに雨予報（陽性）を出しても、「False Positive」が増えるだけなら、再現率はある程度高くできちゃう。

ただし医療の現場だと、False Positve（偽陽性）は、ちょっと多めに出るくらいがいい。健康診断でいう「再検査」ってやつ。重病を見逃すくらいなら、偽陽性がちょっとくらい増えても構わない。

反対に、陰性と良いながら外すことの方が医療現場ではまずい。

## 適合率

```
TP / ( TP + FP ) 
```
![無題のプレゼンテーション (2).png](https://qiita-image-store.s3.amazonaws.com/0/53489/c2b5b5c0-3e86-9cba-1b61-6939d873251d.png)

陽性と予測をしているうちの、実際に当たってる比率。無駄に陽性判定を出すと、適合率は低くなる。

検索システムとかは余計な検索結果がヒットすることの方が満足度は低くなるので、適合率が高い方が重要になってくる。

## まとめ

正解率だけだと、ごまかしができちゃう。
とりこぼしたくないなら、再現率を大事に。
ノイズが増えてやだなぁというときには、適合率を大事に。

参考：
https://mathwords.net/kensa
MongoDB のアップグレード 3.4 to 3.6

いつのもように `pacman` でアップグレードしたら、[MongoDB] が上がってこない。ログを確認するとアップグレードしろとのこと。

>2018-01-07T10:53:02.579+0900 F CONTROL  [initandlisten] ** IMPORTANT: UPGRADE PROBLEM: The data files need to be fully upgraded to version 3.4 before attempting an upgrade to 3.6; see http://dochub.mongodb.org/core/3.6-upgrade-fcv for more details.

[MongoDB] のアップグレードがあったようだ。この前のアップグレード時も大変な思いをしたような気がする。

指示に従い、[Upgrade a Standalone to 3.6](https://docs.mongodb.com/manual/release-notes/3.6-upgrade-standalone/) を見る。事前に次のコマンドを実行しろとのこと。

    db.adminCommand( { setFeatureCompatibilityVersion: "3.4" } )

既にバイナリはアップグレード済みなので、バイナリのダウングレードから始める必要がある。[パッケージのダウングレード](https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89) を見ると、まずは `/var/cache/pacman/pkg` を探せとのこと。消してはいないので次のパッケージをダウングレード。

    $ sudo pacman -U /var/cache/pacman/pkg/mongodb-tools-3.4.9-1-x86_64.pkg.tar.xz
    $ sudo pacman -U /var/cache/pacman/pkg/wiredtiger-2.9.3-1-x86_64.pkg.tar.xz
    $ sudo pacman -U /var/cache/pacman/pkg/boost-libs-1.65.1-2-x86_64.pkg.tar.xz

3.4 を起動後、`mongo` で接続して上記のコマンドを実行。この辺は、[Arch Linux の MongoDB](https://wiki.archlinux.jp/index.php/MongoDB) の記事を参考にした。普通に `systemctl` で起動した方が良いかもしれないが、コマンドラインで実行するとログが見えてよかったので。ただし所有権を戻すのがちょっと面倒かな。

再度 `pacman` でアップグレードを実施。その後 `systemctl` で起動。

    [sadayuki@betelgeuse pkg]$ systemctl status mongodb
    ● mongodb.service - High-performance, schema-free document-oriented database
       Loaded: loaded (/usr/lib/systemd/system/mongodb.service; enabled; vendor pres
       Active: active (running) since Sun 2018-01-07 11:16:51 JST; 3s ago
     Main PID: 851 (mongod)
        Tasks: 23 (limit: 4915)
       CGroup: /system.slice/mongodb.service
               └─851 /usr/bin/mongod --quiet --config /etc/mongodb.conf

目出度し。でもまたやりそう。

[MongoDB]: https://www.mongodb.com/jp
UbuntuにおけるR環境の整備

Windows版で動かしてもいいんだけど、なぜかグラフィクスとかはLinux版のほうがきれいな気がする

### Rのダウンロード

[統計数理研究所のミラーサイト](https://cran.ism.ac.jp/)から最新版のRをダウンロードする
`sudo apt install r-base`でインストールされるRは最新版ではないことも多いので…
この時ダウンロードしたのは`r-base-core_3.4.3-1xenial0_amd64.deb`.
ダウンロードしたら`sudo dpkg -i r-base-core*.deb`でインストール.

### 不足しているライブラリをインストール
上記の工程でエラーが出た場合は下記のコマンドで不足しているライブラリをインストールする

```
$sudo apt-get install -f
```

### Rstudioのダウンロード
結局一番良いIDEはこれだと思う. Ubuntuの場合Desktop版だと日本語入力ができないのでローカルで動かすのみでもServer版をインストールすることを薦める.

インストールとサーバーの起動方法は[ここ](https://www.rstudio.com/products/rstudio/download-server/)に書いてある.
アドレスはデフォルトで`http://localhost:8787/`.

### Tidyverseのインストール
Rの定番ライブラリ
Ubuntu本体に必要なライブラリのインストール

```
$sudo apt install libcurl4-openssl-dev libssl-dev libxml2-dev liblapack-dev libblas-dev gfortran
```

Rにインストール

```
>install.packages("tidyverse")
```
optimize.minimizeが理解したかった。

#概要
optimize.minimizeが理解したかった。


#写真
![mle3.png](https://qiita-image-store.s3.amazonaws.com/0/18104/804dbcdb-dfd0-5304-7f63-e7d84786ea10.png)


#サンプルコード

```
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize

def pc(p, x):
	return p[0] * np.sin(p[1] * x) + p[2]

def cost(p, x, y):
	c = 0
	for n in np.arange(60):
		c += (y[n] - pc(p, x[n])) ** 2
	return c

dx = np.arange(-3, 3, 0.1)
dy = np.sin(dx)
p0 = [1.4, 1.0, 0.4]
bound = [(0, None), (0.0001, None), (0, None)]
mle = minimize(cost, p0, args = (dx, dy), method = 'l-bfgs-b', jac = None, bounds = bound, tol = None, callback = None, options = {
	'disp': True,
	'maxls': 20,
	'iprint': -1,
	'gtol': 1e-05,
	'eps': 1e-08,
	'maxiter': 150,
	'ftol': 2e-08,
	'maxcor': 4,
	'maxfun': 150
})
acc = np.zeros(60)
for i in np.arange(60):
	acc[i] = pc(mle.x, dx[i])
plt.plot(dx, dy, 'b', dx, acc, 'r--')
plt.savefig("mle3.png")
plt.show()

```

以上。
remi-safeを無効にしてremi-php70からダウンロードしたい

状況としてremiリポジトリが混在している状況でした。
【コマンド解説：yumでインストールされたものでphpというキーワードを持つものを表示する】

```shell
yum list installed | grep php 
php.x86_64                             7.0.23-1.el7.remi               @remi-php70
php-cli.x86_64                         7.0.23-1.el7.remi               @remi-php70
php-common.x86_64                      7.0.23-1.el7.remi               @remi-php70
php-devel.x86_64                       7.0.23-1.el7.remi               @remi-php70
php-gd.x86_64                          7.0.23-1.el7.remi               @remi-php70
php-json.x86_64                        7.0.23-1.el7.remi               @remi-php70
php-mbstring.x86_64                    7.0.23-1.el7.remi               @remi-php70
php-mysqlnd.x86_64                     7.0.23-1.el7.remi               @remi-php70
php-pdo.x86_64                         7.0.23-1.el7.remi               @remi-php70
php70-php-common.x86_64                7.0.24-1.el7.remi               @remi-safe
php70-php-json.x86_64                  7.0.24-1.el7.remi               @remi-safe
php70-php-xml.x86_64                   7.0.24-1.el7.remi               @remi-safe
php70-runtime.x86_64                   1.0-5.el7.remi                  @remi-safe
```

これを統一する必要がありました。



# リポジトリの優先順位を確認
【コマンド解説：yumのリポジトリリスト一覧を表示、allオプションでstatusも表示され現在の使用状況もわかる】

```
yum repolist all
```

# 現状のいらないパッケージを削除
【コマンド解説：rpmコマンドにeオプションでパッケージをアンインストールするというもの、このようにスペース区切りにすることで複数を一気に削除できる。--nodepsオプションはパッケージ同士の依存関係を無視して強制的に削除するという意味合い】

```
sudo rpm -e --nodeps php70-php-common.x86_64 php70-php-json.x86_64 php70-php-xml.x86_64 php70-runtime.x86_64
```

# リポジトリの無効化、有効化
まずいらないリポジトリを無効化

```
sudo yum-config-manager --disable remi-safe
```

確認

```
yum repolist all
```

有効化

```
sudo yum-config-manager --enable remi-php70
```

確認

```
yum repolist all
```

パッケージインストール

```
sudo yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt
```

最終確認

```
yum list installed | grep php
```
cloudfront+ELB+EC2環境でのSSL化(ACM)のざっくり流れだけ

#ACMにて証明書取得
2つ取得する。現時点でcloudfrontは東京リージョンの対応がなく、ELBとEC2を東京リージョンで運用する際はこちらの証明書も必要になるため、現状では2つ取得する必要がある。

#cloudfront,elbに上記証明書を適用
コンソール画面から適用できる。

#ELBのリスナー設定
HTTPS	443	HTTP	80

#セキュリティグループを設定
ELBとEC2の設定をHTTPS対応にしてHTTPのポートは最小限開く設定にする。

#備考
ELBとEC2間をSSL通信するとするとACMの証明書がEC2に適用できないという問題にぶつかる。
これを回避するにはさらに一つACM以外での証明書を取得する必要があり
さらにapacheに設定、鍵のアップロードなどが必要になる。（前述のELBリスナーも設定変更）
URL への Facebook のいいねの取得

URL への Facebook へのいいねの取得です。

実行結果
![facebook_jan0701.png](https://qiita-image-store.s3.amazonaws.com/0/179446/5df42caa-2b6e-6824-fb1b-d5bf01bc3f1b.png)

プログラムです。
APP_ID　と　APP_SECRET　は変更して下さい。


```bash
#
#	url_likes.sh
#
rm -f result.json
#
APP_ID="11111111111111111"
APP_SECRET="2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a"
ACCESS_TOKEN=$APP_ID"|"$APP_SECRET
URL_TARGET="https://cdp-japan.jp/"
#
URL_GRAPH="https://graph.facebook.com/v2.12/"
ARGS="&fields=og_object%7Bengagement%7D%2Cengagement&access_token="$ACCESS_TOKEN
#
curl $URL_GRAPH"?id="$URL_TARGET$ARGS -o result.json
#
jq . result.json
```

参考ページ
[Graph API V2.9でFacebookのイイね数を取得した話](http://program-designer.xyz/graph-api/)
情報処理安全確保支援士試験（SC）2017年秋季　午前2のキーワード

# 始めに
情報処理安全確保支援士試験（SC）2017年秋季　午前2の問題で理解が不十分だと感じた単語を列挙した<br>
言葉のおおよその意味は理解していても、自分の中でもやもやしている言葉も列挙している

# 抽出方法
## 単語のマークアップ
[情報処理安全確保支援士試験（SC）2017年秋季　午前2用に作ったxml](https://github.com/triple4649/jyouhousyori/blob/master/xml/sc/2017/autumn/2017h29a_sc_am2_qs.xml)にマーカー用のタグをつける形で実現している<br>
マーカーはとりあえず、searchとした
## 単語のマークアップした単語の抽出
JavaのＪSoupを使って抽出してみた<br>
ソースは[GitHub](https://github.com/triple4649/MLLearning_Java/blob/master/src/jyouhousyori/xml/XMLReader.java)に上げている

# 抽出したキーワード
- CRL  [https://www.google.co.jp/search?q=CRL](https://www.google.co.jp/search?q=CRL)
- OCSP  [https://www.google.co.jp/search?q=OCSP](https://www.google.co.jp/search?q=OCSP)
- SAML  [https://www.google.co.jp/search?q=SAML](https://www.google.co.jp/search?q=SAML)
- XKMS  [https://www.google.co.jp/search?q=XKMS](https://www.google.co.jp/search?q=XKMS)
- エクスプロイトコード  [https://www.google.co.jp/search?q=エクスプロイトコード](https://www.google.co.jp/search?q=エクスプロイトコード)
- カミンスキー攻撃  [https://www.google.co.jp/search?q=カミンスキー攻撃](https://www.google.co.jp/search?q=カミンスキー攻撃)
- SPF  [https://www.google.co.jp/search?q=SPF](https://www.google.co.jp/search?q=SPF)
- Smurf  [https://www.google.co.jp/search?q=Smurf](https://www.google.co.jp/search?q=Smurf)
- ステートフルインスぺクション  [https://www.google.co.jp/search?q=ステートフルインスぺクション](https://www.google.co.jp/search?q=ステートフルインスぺクション)
- ITU-TX.400  [https://www.google.co.jp/search?q=ITU-TX.400](https://www.google.co.jp/search?q=ITU-TX.400)
- PCIDSS  [https://www.google.co.jp/search?q=PCIDSS](https://www.google.co.jp/search?q=PCIDSS)
- PMS  [https://www.google.co.jp/search?q=PMS](https://www.google.co.jp/search?q=PMS)
- OP25B  [https://www.google.co.jp/search?q=OP25B](https://www.google.co.jp/search?q=OP25B)
- EAP  [https://www.google.co.jp/search?q=EAP](https://www.google.co.jp/search?q=EAP)
- RADIUS  [https://www.google.co.jp/search?q=RADIUS](https://www.google.co.jp/search?q=RADIUS)
- サブネットマスク  [https://www.google.co.jp/search?q=サブネットマスク](https://www.google.co.jp/search?q=サブネットマスク)
- ニューラルネットワーク  [https://www.google.co.jp/search?q=ニューラルネットワーク](https://www.google.co.jp/search?q=ニューラルネットワーク)
- バックプロパゲーション  [https://www.google.co.jp/search?q=バックプロパゲーション](https://www.google.co.jp/search?q=バックプロパゲーション)
- ポー卜べクタマシン [https://www.google.co.jp/search?q=ポー卜べクタマシン](https://www.google.co.jp/search?q=ポー卜べクタマシンは機械学習)
- システム及びソフトウェア製品の品質要求及び評価(SQUARE)  [https://www.google.co.jp/search?q=システム及びソフトウェア製品の品質要求及び評価(SQUARE)](https://www.google.co.jp/search?q=システム及びソフトウェア製品の品質要求及び評価(SQUARE))

# 感想
## カミンスキー攻撃について
カミンスキー攻撃に代表されるDNSに対する攻撃については[新たなるDNSキャッシュポイズニングの脅威](https://jprs.jp/related-info/guide/009.pdf)を一通り読めば十分かも

## SAMLについて
あまり見慣れないキーワードだった。<br>
[シングルサインオン](http://www.cybernet.co.jp/onelogin/function/saml.html)に関する仕組みらしい

## RADIUS,EAPについて
RADIUSEAPという言葉を覚えるより、IEEE 802.1Xの枠組みの中でどのような働きをしているのか理解したほうがよさそう<br>
IEEE 802.1Xについては[wikipedia](https://ja.wikipedia.org/wiki/IEEE_802.1X)に詳しい仕組みが載っている
Python > textwrap > 文字列を指定の長さで区切る

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

Jupyter Notebookにて長い文字列を表示した時、スクロールバーが表示される。
スクロールバーでなく、適当な長さで改行するには自作の関数を用意するか、textwrapを使う方法がある。

https://docs.python.jp/3/library/textwrap.html

Jupyter code

```py
import textwrap as tw

#1. prepare text
text = ''
for idx in range(200):
    text += '.'

#2. print    
print(text)

for elem in tw.wrap(text, width=80):
    print(elem)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a490b53a-69f8-9b47-3b9d-8db0d1e50d89.png)

ここで、水平スクロールバーは`print(text)`により表示されている。
ubuntu 16.04 で、昔ながらのインターフェース名を利用する

Ubuntu 16 からは、interface名が重複しないように、とあるルールに従って、命名されます。
昔ながらの利用者であるワタシには、馴染まないので、固定的に割り当てることにしました。

こんな感じで、/etc/udev/rule.d/70-persistent-net.rulesを編集するだけです。

```/etc/udev/rule.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="XX:XX:XX:XX:XX:XX", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="VV:VV:VV:VV:VV:VV", NAME="eth1"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="ZZ:ZZ:ZZ:ZZ:ZZ:ZZ", NAME="wlan0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="CC:CC:CC:CC:CC:CC", NAME="wlan1"
```

編集後、再起動で、いつも同じインターフェースとして認識されます。

おしまい
Javaの開発環境を構築する（Mac) 

# 初めてのJava。
### このサイト（https://crowdtech.jp/blog/?p=2741） 通りにやっていけば、問題なくできた。　PythonやRubyに比べると、開発環境の構築がとても簡単で感激。

### このサイト（https://www.javadrive.jp/android/adt/index1.html） を参考にアンドロイドアプリ開発に必要なプラグインを入れる。

### とりあえず、ここで（http://gihyo.jp/dev/serial/01/androidapp） １２回の連載Java講座を読んでみる。
julia で小規模なcsvファイルを読み込み・操作・保存・確認まで(Julia1.0 対応)

# 本日は

２０１８/10/1更新（Julia1.0対応のためにコードを書き換えました。）
更新前は `DataFrames` を使っていましたが、CSV.jlでファイルの入力、出力を制御することを推奨されています。

https://juliadata.github.io/DataFrames.jl/stable/man/getting_started.html#Importing-and-Exporting-Data-(I/O)-1

> For reading and writing tabular data from CSV and other delimited text files, use the CSV.jl package.

If you have not used the CSV.jl package before then you may need to install it first:

# ここでやること

ファイル操作の一環として次の流れをJuliaでやってみたいと思います：

```text:sample.csv
1,2,3
4,5,6
7,8,9
```

1. 上記のcsvファイルの読み込み
- データの編集
- 保存
- 確認

# 環境
PCはMacOSX，Juliaのバージョンは1.0.0です．

# 実装例

実装には　`DataFrames`　および `CSV` パッケージを使いました．

1. csvファイルの読み込みで　`CSV.read` を用いる
- `size` 関数で　`dataframe` の行数と列数を得る．
- 各列を列の値倍(`c`倍)する． 
- 保存は `CSV.write` で行う．



```julia:handlecsv.jl
# `add CSV` to install CSV.jl
using CSV

function main()
    dataframe = CSV.read("sample.csv", header=false, delim=',')
    @show dataframe
    row,col=size(dataframe)
    for  c =1:col
        dataframe[c] *= c
    end
    @show dataframe
    dataframe |> CSV.write("output.csv",delim=',', writeheader=false)
end

main()
```
[Swift] protocolを使ったテクニック Self縛り

# Self縛り
* ある特定の型に依存したデフォルト実装が行える
* ただし縛る方の型がそのプロトコルを適合している必要がある

```Self縛り例.swift
protocol P {}
// UIViewControllerにPを適合することで初めてSelf縛りにUIViewControllerが使える
extension UIViewController: P {}

// Self縛り
extension P where Self: UIViewController {
// UIViewControllerに依存したデフォルト実装が行える
}
```

----

**Warning:** Self縛りという言葉は私の造語です。

---
入門EMアルゴリズム

線形回帰
---------

$N$個のデータの組 $(x_i, y_i)$ があるときにその関係 $y = a x+b$ を求めよ

![index.png](https://qiita-image-store.s3.amazonaws.com/0/30426/cbbecbd0-b9a1-0b87-9be2-8b232a6a79b2.png)

----

推定
----

観測データからパラメータを計算する関数
$$\hat{a} = \phi_a(\hat{x}, \hat{y}), \hat{b} = \phi_b(\hat{x}, \hat{y})$$
を**推定量**と呼ぶ。

- 観測データがランダムに生成されていると、そこから計算した推定量もランダムな値を取る
- 推定量のうち、その期待値 $E[\hat{a}]$ が真のパラメータ値 $a$ に一致するものを不偏推定量と呼ぶ

----

最尤推定
--------

- パラメータがある値 $a, b$ だった時にそのデータが出力される確率 $p(x,y|a,b)$ を **尤度** と呼ぶ
- 尤度を計算するにはノイズを含めた **確率モデル** が必要
- ノイズは正規分布に従ってると仮定する($\sigma^2$は簡単のため既知とする)：
$$ p(x,y|a,b) = \mathcal{N}_{\sigma^2}(y-(ax+b)) \propto \exp(-|y-(ax+b)|^2/2\sigma^2) $$
- 個々の観測が独立に得られていると仮定する：
$$ p(\hat{x}, \hat{y}|a, b) = \prod_i p(x_i, y_i|a, b) $$
- 尤度が最高になるように$a, b$を選ぶ(**最尤推定**)：
$$ \phi_{a,b}(\hat{x}, \hat{y}) = \text{argmax}_{(a, b)} p(\hat{x}, \hat{y}|a, b)$$

----

最小二乗法
--------

- $\log$は単調増加関数なので$p(..)$の最大値は$\log(p(..))$の最大値と同じ：
$$ \log(p(\hat{x}, \hat{y}|a, b)) = \sum_i \log(p(x_i, y_i|a, b)) = -\sum_i |y_i -(ax_i +b)|^2/2\sigma^2 $$
- これが最小二乗法のコスト関数
- $a, b$に対する2次式なので平方完成できる
- 実際$\sigma^2$は計算に出てこない

----

ベイズ線形回帰
-------------

- パラメータの確率分布を考える $p(a, b)$
- パラメータの事前分布を仮定する：
$$ p(a, b) \propto \exp(-(a^2 + b^2)/2\sigma_a^2)$$
- 観測データ$(x_i, y_i)$が入るたびに更新する（事後分布）
$$ p(a,b| \hat{x}) \propto p(\hat{x}|a,b) p(a,b) $$
- 事後分布に対して最尤推定を行う：
$$ \log(p(\hat{x}, \hat{y}|a,b)) = -\sum_i |y_i -(ax_i +b)|^2/2\sigma^2 - (a^2+b^2)/2\sigma_a^2$$
- 正則化項が追加され、$\sigma^2$に意味が出てくる

----

Evidence function
-------------

- ハイパーパラメータ$\sigma^2$, $\sigma_a^2$はどうやって決めればよかったのか？
- $\sigma^2$, $\sigma_a^2$を決めると$a$, $b$の推定量$\phi_{a,b}$が一意に決まるのでそれについて平均をとる(Eステップ)
$$
p(\hat{x}, \hat{y}|\sigma^2, \sigma_a^2) = \int da \int db p(\hat{x}, \hat{y}|a, b, \sigma) p(a, b|\sigma_a^2)
$$
- これを最大化する$\sigma^2$, $\sigma_a^2$が良いハイパーパラメータ
- でもどうやって計算する？？

----

EMアルゴリズム
--------------
- $p(\hat{x}, \hat{y}|\sigma^2, \sigma_a^2)$ の最大化問題では$(a, b)$は積分されてしまっているので、隠れ変数とみなせる
- EMアルゴリズムは観測できる変数($X$)と隠れ変数($Z$)がある場合のパラメータ($\theta$)を最尤推定するためのアルゴリズム
$$ p(X|\theta) = \int dZ p(X, Z|\theta) $$

---

EMアルゴリズム（for ベイズ線形回帰)
-------
- Eステップ：固定したハイパーパラメータ($\sigma^2, \sigma_a^2$)に対してパラメータ$a, b$の事後分布$p(a,b|\hat{x}, \hat{y})$を計算する
- Mステップ：その分布に対して平均した $E_{a,b}[\log p(\hat{x}, \hat{y}, a, b|\sigma^2, \sigma_a^2)]$を最大化する
【nginx】phpコンテナへアクセスする

phpコンテナへアクセスしたいのですが、nginxの設定周りで困ったのでメモ。
#docker-compose.ymlについて
```yaml:docker-compose.yml
version: "3"
services:
    nginx_docker:
        image: nginx
        ports:
            - "8888:80"
        volumes:
            - ../web/public:/var/www/html
            - ./default.conf:/etc/nginx/conf.d/default.conf
        links:
            - php_docker

    php_docker:
        image: php:7-fpm
        volumes:
            - ../php/:/var/www/html
```
nginx_dockerのvolumesでは、フロントエンドのソースコードのマウント、default.confの上書きを行う。
php_dockerのvolumesではサーバーサイド側のソースコードのマウントを行う。

#default.confについて

```default.conf
server {
    listen 80;
    server_name localhost;

    root  /var/www/html;
    index index.php;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(\.+)$;
        fastcgi_pass php_docker:9000; 
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
```
fastcgi_passの設定で困ったが、ここではdocker-compose.ymlでphpコンテナにつけた名前が入る。ただ、どこで名前解決されているんだろう。ということで名前解決を行ってみる。

#(補足)名前解決を行う
digコマンドを使えるようにして、名前解決を行ってみる。

```
apt-get install dnsutils
dig php_docker
```

以下のようになった。
DNSサーバは127.0.0.11#53ということだ。

```
; <<>> DiG 9.10.3-P4-Debian <<>> php_docker
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50076
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;php_docker.			IN	A

;; ANSWER SECTION:
php_docker.		600	IN	A	172.18.0.2

;; Query time: 13 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Sun Jan 07 00:58:11 UTC 2018
;; MSG SIZE  rcvd: 54
```

127.0.0.11について以下のページを見つけたためメモしておく。
>Docker 内蔵 DNS サーバ
Docker デーモンは内蔵 DNS サーバを動かし、ユーザ定義ネットワーク上でコンテナがサービス・ディスカバリを自動的に行えるようにします。コンテナから名前解決のリクエストがあれば、内部 DNS サーバを第一に使います。リクエストがあっても内部 DNS サーバが名前解決できなければ、外部の DNS サーバにコンテナからのリクエストを転送します。割り当てできるのはコンテナの作成時だけです。内部 DNS サーバが到達可能なのは 127.0.0.11 のみであり、コンテナの resolv.conf に書かれます。ユーザ定義ネットワーク上の内部 DNS サーバに関しては ユーザ定義ネットワーク用の内部 DNS サーバ をご覧ください。
http://docs.docker.jp/engine/userguide/networking/dockernetworks.html

resolv.confに書かれているらしいので、nginxコンテナを確認してみると、

```/etc/resolv.conf
nameserver 127.0.0.11
options ndots:0
```

#参考文献
【linksとdepends_onがまとまっている】
https://qiita.com/mochizukikotaro/items/b398076cb57492980447
【nginx-php連携がわかりやすかった】
https://tech.recruit-mp.co.jp/infrastructure/post-12795/
【digするときに参考にした】
https://qiita.com/tsukapah/items/677b1f5c89dcbe520344#dns%E3%81%AB%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E3%81%BF%E3%82%8B
SeleniumでChromeDriverを使用するときに、画像表示を無効にする方法

```
// Chrome起動時の引数
String disableImageArgument = "blink-settings=imagesEnabled=false";

// ChromeOptionに引数を設定
ChromeOptions options = new ChromeOptions().addArguments(disableImageArgument);

// ChromeOptionを適用してDriverを作成
ChromeDriver driver = new ChromeDriver(options);

// リクエスト送信
driver.get("http://example.com");
```
Gitでリポジトリ間のmergeをする


お久しぶりです。あけましておめでとうございます。
前回投稿してから約1年経っていました。

今回は仕事上必要になったことを備忘録として記事にします。
また今後も定期的に投稿していきたいと思っていますので頑張っていきます。

#本題
二つのリポジトリがあります。どちらも似たようなリポジトリなのですが、ポイントは片方のリポジトリを周りに見せないようにするという点です。（後から気づいたのですが、forkする手もありました。）←でもこれ確認できちゃうんですよね、privateにしない限り…。

# リポジトリ間でマージを行う

そこで見せないようにするリポジトリにリポジトリ間でマージを行います。

```git
git fetch [取り込みたいリポジトリ名]
git merge [取り込みたいリポジトリ名/取り込みたいリポジトリのブランチ名]
```

すると今チェックアウトしている方のリポジトリに全て配置されます。
# 終わりに
他に方法が思いつかないのでご教示いただけると幸いです。
今年も宜しくお願い致します。
自分用メモ1

##バージョンが変わってない

問題
ダウンロードは出来てるのにバージョンが切り替わらなかったら

解決

```
$ eval "$(rbenv init -)"
```
パスもこれでおkだた

rbenvでバージョンがうまく切り替わらなかった時にやったこと
https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf



##10分でRailsブログを作成
https://qiita.com/schroneko/items/0208a4f16fc1e4b6f152






問題2

```
$ bundle install
```
でrbenv: bundle: command not found

解決

```
$ gem install bundler
```
新しいRubyのバージョンをインストールすると`bundle install`できない
https://qiita.com/opiyo_taku/items/f4459ce4f42e18d08e28


メモ
サーバー立ち上げた後、ターミナルを別窓開いたら、当たり前だけど

```
$ cd blog
```
して入る

ここでまた

```
$ eval "$(rbenv init -)"
```


問題
```
$ rails generate controller Comments
````
でターミナルに出るエラー

```
undefined method `resources' for main:Object (NoMethodError)
```

routes.rbないのend抜けてた

これまでずっとハマってたとこはターミナルをちゃんと読めばわかった



問題
コメントできない
ActiveModel::ForbiddenAttributesError
なんかセキュリティらしい
http://ruby-rails.hatenadiary.com/entry/20140813/1407915718
>Railsではセキュアなアプリケーションの開発を促すためにいくつかのセキュリティ機構が存在します。そして、今そのセキュリティ機構によりエラーが発生しました。この機構は、Strong Parametersと呼ばれ、Railsは、私たちに「パラメーターのどの値を取得したいか」をコントローラー内に明示することを要求しています。今回の場合で言うと、パラメーター内のtitleとtextの値を取得したいので、次のように変更して下さい。


ForbiddenAttributesErrorが発生
http://jangajan.com/blog/2014/09/24/forbiddenattributeserror-in-rails/

これを見て

```
class CommentsController < ApplicationController

def new

end

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])
    redirect_to post_path(@post)
  end

  def destroy
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:id])
    @comment.destroy
    redirect_to post_path(@post)
  end

end

```

こうなってたのを

```
class CommentsController < ApplicationController

def new

end

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(comment_params)
    redirect_to post_path(@post)
  end


  private
    def comment_params
      params.require(:comment).permit(:commenter, :body)
    end


  def destroy
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:id])
    @comment.destroy
    redirect_to post_path(@post)
  end

end
```

こうした。


問題
コメントが「削除」で消せなかった
destroyのactionが見つかんないと言われたので

解決

上記の

```
  private
    def comment_params
      params.require(:comment).permit(:commenter, :body)
    end
```
を下にしたらできた

```
class CommentsController < ApplicationController

def new

end

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(comment_params)
    redirect_to post_path(@post)
  end





  def destroy
    @post = Post.find(params[:post_id])
    @comment = @post.comments.find(params[:id])
    @comment.destroy
    redirect_to post_path(@post)
  end

  private
    def comment_params
      params.require(:comment).permit(:commenter, :body)
    end

end
```


ここにきて毎回バージョンとパスがリセットされることにいらついてきた
でも仕様らしい


```
# bash起動時にrbenvの初期化を行うように設定。
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```
Elasticsearchで位置情報検索をする

位置情報を使った検索をしたくて調べたので、そのメモです。

# 環境
- elasticsearch 5系
- ruby 2.4
- rails 5.1
- elasticsearch-rails

# やったこと
mappingは以下のようにしました。

```
{
  "es_index_name_place":
    {
      "aliases":{},
      "mappings":{
        "place":{
          "_all":
            {
              "enabled":true,
              "analyzer":"kuromoji_analyzer"},
              "properties":{
               "id":
                {"type":"integer"},
               "location":
                 {
                   "type":"geo_point",
                   "fields":{
                     "lat":{"type":"keyword"},
                     "lon":{"type":"keyword"}
                   }
    // 以下省略 

}
```

上記のようにlocationというpropertyを定義してtypeをgeo_pointにします。で、緯度経度の値をlatとlonに入れるようにします。ここを違う値にしていたのですが、それだとmapping作成時にerrorが出て、(lat、lonが定義されていないというエラー)ダメだったので。
またtypeはkeywordです。ここもそれでないと怒られました。


# 検索
検索は以下のようにします

```
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "20km",
                    "location" : {
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}
```

これだけです。このgeo_distanceを使うとlatとlonで指定した緯度経度の場所を中心にして半径20kmの範囲で検索します。
DockerコマンドでIBMコンテナ・レジストリへログインする方法


ローカル（PC）環境のDockerコマンドで、IBMコンテナ・レジストリへログインして、コンテナイメージを取得する方法について、紹介したものです。[Docker Hub](https://hub.docker.com/explore/) は、ユーザー認証なしで無償で利用できるDockerコンテナのリポジトリサービスですが、[IBMコンテナ・レジストリ](https://console.bluemix.net/docs/services/Registry/registry_overview.html#registry_overview)は、無償から利用でき、脆弱性検査の機能やプライベートに利用できるIBMが運用するサービスです。


この方法の利点は、bx loginをしなくても、トークンを共有すれば dockerコマンドだけで、IBMコンテナ・レジストリからコンテナのイメージをプルする事ができる点です。 もちろん、トークンを追加したり失効させることも可能です。 



## 認証情報の取得


IBM Cloud へログインして、下記のコマンドで、レジストリのアドレスを取得します。 `docker login`コマンドで「Container Registry API エンドポイント」を利用するのでメモっておく。

~~~
$ bx cr info
                                           
Container Registry                    registry.ng.bluemix.net   
Container Registry API エンドポイント   https://registry.ng.bluemix.net/api   
IBM Cloud API エンドポイント            https://api.ng.bluemix.net  
<以下省略>
~~~

IBMレジストリへアクセスするためのトークンIDのリストする。

~~~
$ bx cr token-list
<中略>
トークン ID                            読み取り専用   有効期限   説明   
182e86d5-91e0-5876-99f9-ff7b1ce6a8b6   true           0          mycluster2   
1f01ba7b-2405-5e73-b073-f840e517ee7c   false          0          tok02   
OK
~~~


トークンIDを指定して、トークンの本体を取得する。

~~~
$ bx cr token-get 182e86d5-91e0-5876-99f9-ff7b1ce6a8b6
固有 ID が「182e86d5-91e0-5876-99f9-ff7b1ce6a8b6」のレジストリー・トークンを取得中...
                 
トークン ID   182e86d5-91e0-5876-99f9-ff7b1ce6a8b6   
トークン      eyJhbGciOiJIU<以下省略>
~~~


## dockerコマンドでログインする

dockerコマンドで、レジストリへログインします。 この時のユーザーIDは、`token`で固定です。 トークン形式としているので、パスワードの文字列だけで、ユーザーIDとも紐づく様になっているためです。

~~~
$ docker login -u token -p eyJhbGciOiJIU<以下省略> https://registry.ng.bluemix.net/api  
~~~

トークン形式なので、bx loginをしなくても、トークンを共有すれば dockerコマンドだけで、IBMレジストリからコンテナのイメージをプルする事ができる点がメリットです。 もちろん、トークンを失効させることも可能です。



## コンテナ・イメージをローカルへプルする

bxコマンドで、IBMレジストリのイメージをリストして、目的のイメージをリストして、目的のリポジトリ名をメモっておく。

~~~
$ bx cr image-list
~~~


dockerコマンドで、IBMコンテナ・レジストリのコンテナ・イメージをリポジトリ名を指定して、ローカル環境へプルする。

~~~
$ docker pull registry.ng.bluemix.net/takara/webapp1:v1
~~~


## レジストリのリージョンを変更する

次のコマンで、メニュー形式で変更できる。 変更先を指定したいときは、コマンドの後に、例えば`ap-south`などのキーワードを指定する。

~~~
$ bx cr region-set
領域を選択してください
1. ap-south ('registry.au-syd.bluemix.net')
2. eu-central ('registry.eu-de.bluemix.net')
3. international ('registry.bluemix.net')
4. uk-south ('registry.eu-gb.bluemix.net')
5. us-south ('registry.ng.bluemix.net')
Enter a number ()> 
~~~


この後に、`bx cr login`を使って、レジストリにログインして、`bx cr info`でエンドポイントを取得して、あとは同じ操作でアクセスできる。


以上
サンプルデータとしてIrisデータを読み込む



可視化などのためにサンプルデータが欲しくなることはありますか？
私はよくあります。

で、そんなときはこんな感じでやったらいいかな？と思った次第です。

```python
import numpy as np
import pandas as pd
def load_iris_data():
    from sklearn.datasets import load_iris
    iris = load_iris()
    df = pd.DataFrame(np.array(iris.data))
    df.columns = map(lambda x: x.split(" (")[0].replace(" ", "_"), iris.feature_names)
    target = pd.DataFrame(np.array(iris.target),columns=["target"])
    return pd.concat([df, target], axis=1)
```

こんなかんじでつかう

```python
df = load_iris_data()
pd.plotting.scatter_matrix(df.drop("target", axis=1), s=80, c=df.target, edgecolor="Black",
                           figsize=(15, 15), diagonal="kde")
```

こんな感じのグラフになりました。

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/133166/d93b729c-78f4-a523-fc53-325946d8272d.png)


以上、超小ネタでした。
なお、pythonやpandasの中級者以上ならもっと綺麗にできるのかもしれません。
Qiitaやはてなのエンジニア記事を丸ごとコピーしているサイトを発見

#Qiitaに投稿した記事が丸ごとコピーされているサイト発見

ずいぶん前にQiitaに書いたAWSの記事が、たまたまGoogleで検索かけたら ***丸ごとコピーして掲載しているサイト*** を発見。

しかも私のQiitaでのユーザー名や記事中の画像すらコピー。
一字一句何も手を加えていないのがすごい度胸。

ちなみに丸ごとコピーされた記事の掲載されているサイトURLはこちら。

> http://helloworld-yaruzo.com/author/schabibi/

![screencapture-helloworld-yaruzo-author-schabibi-1515276455401.png](https://qiita-image-store.s3.amazonaws.com/0/178773/3e0f3800-3ece-6c07-41b6-72b89e2f5e9c.png)


私の書いた元のQiita記事はこちら。

> 「Route 53 で独自ドメインをホストして、Amazon s3で静的ウェブサイトを公開」https://qiita.com/schabibi/items/bb2e6bd4e5a1f29eeb90

![screencapture-qiita-schabibi-items-bb2e6bd4e5a1f29eeb90-1515276595315.png](https://qiita-image-store.s3.amazonaws.com/0/178773/3a6804bc-a07b-2676-3caa-05916de7bac0.png)


さらに呆れたのが、 ***他のエンジニアの方のQiita記事やはてな記事もたくさん丸ごとコピー*** しているところ。

> http://helloworld-yaruzo.com/

ドメイン名が「Hello, world. やるぞ」の時点で明らかにテキトー感が伝わりますね。

WordPressの超初期でテーマを有効化したときに掲載される、サンプルページの文章も、恥ずかしくないのか、そのまま載せられています。

AWS関連の記事をQiitaやはてななどで掲載されているエンジニアの方、気をつけてください。

（※ Googleにすでに通報済みです）

## 追記
この記事すらアップロードした瞬間にコピーされてるって感じなので、フィードリーダーのボットかなという感じがしますが。
Integromatの使い方

# はじめに
最近[Integromat]( https://www.integromat.com/en/ )というwebサービスにハマっていて、とても便利に使っているのですが、いかんせん日本語情報が少ないせいか、流行っていない感じがします。
日本語圏でもIntegromatを流行らせたいので日本語で紹介してみたいと思います。

# Integromatとは？
## 概要
公式サイトにある一文が全てを表しています。
「Integromat is the glue of the internet」
（Google先生訳：Integromatはインターネットの接着剤です）

Integromatはwebサービス間の協調動作を行うためのサービスで、
IFTTTのようなタスクランナーサービスです。
・分岐や繰り返し、エラーハンドリングなど複雑な処理を行う事ができる
・データストアを持つ事ができる
・データ処理用のビルトイン関数がある(文字列操作や数値計算など)
というのが特徴です。
IFTTTが一般ユーザー向けなのに対し、Integromatはプログラマ向けに作られているように感じます。
<img width="957" alt="スクリーンショット 2018-01-06 14.56.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/66abc5f2-3223-7cdb-357a-4c962ed3845e.png">
Integromatでは、上記のように、アプリモジュールをつなぎ合わせて「シナリオ」を作成します。
コードを書く必要はありませんが、ある程度複雑な分岐処理等ができるようになっています。
「シナリオ」は一定間隔で実行するよう設定する事も可能ですし、Webhookやメール受信といった「トリガー」をきっかけに実行する事も可能です。

## 連携できるwebサービス
毎週のように増え続けています。
現在連携できるwebサービスは下記を参照してみてください。
https://www.integromat.com/en/integrations

汎用の[HTTPモジュール](https://www.integromat.com/en/integrations/http)や[SOAPモジュール](https://www.integromat.com/en/integrations/soap)、[JSONモジュール](https://www.integromat.com/en/integrations/json)等があるので、使いたいwebサービスのモジュールが無い場合や、自分で作ったwebサービスに接続したい場合でも、コードを書かずに簡単に連携可能です。

また、労力はかかりますがユーザー定義でモジュール化する事もできるようです。(私はまだやったことないですが)
[Integromat Apps Developer Platform](https://integromat.github.io/apps/)


# ヘルプとチュートリアル
Integromatはヘルプとチュートリアル動画が充実しています。
全て英語ですが、英語が苦手な方はGoogle先生の力を借りて翻訳して読むとなんとなく雰囲気をつかめるのではないでしょうか。
チュートリアル動画についても字幕があるので、[字幕表示を日本語にする](https://www.howtonote.jp/youtube/play_video/index6.html)
事である程度理解できるでしょう。
ここでは特に重要な概念の説明ページとチュートリアルへのリンクを紹介します。

### 特に重要な概念
・[トリガー](https://www.integromat.com/en/feature/triggers)
・[ルーター](https://www.integromat.com/en/feature/router)
・[イテレーター](https://www.integromat.com/en/feature/iterators)と[アグリゲーター](https://www.integromat.com/en/feature/aggregators)
・[フィルター](https://www.integromat.com/en/feature/filters)
・[エラーハンドリング](https://www.integromat.com/en/feature/error-handlers)
### チュートリアル
・[シナリオ作成のチュートリアル](https://www.integromat.com/en/kb/first-scenario.html)
### その他便利機能
・[データストア](https://www.integromat.com/en/feature/data-stores)
・[関数(これは英語で読んだ方が早いかも)](https://www.integromat.com/en/kb/functions.html)
### 動画一覧
・[チュートリアル動画一覧](https://www.integromat.com/en/kb/video-tutorials.html)
# Integromat使ってみた記事
私が書いたIntegromat使ってみた系の記事です。
ご参考になればと思います。
・[Integromat + AzureFunctionsでスクレイピングしてみた](https://qiita.com/nendocode/items/d8a33ffbc7cb08115234)
・[Integromatによるプログラミングレス/サーバーレスwebAPI作成 その1(データ定義編)](https://qiita.com/nendocode/items/756b59b33d3e0cab4108)
・[Integromatによるプログラミングレス/サーバーレスwebAPI作成 その2(Create/Update編)](https://qiita.com/nendocode/items/c0d2f9fd1e812ea3e3bd)
・[Integromatによるプログラミングレス/サーバーレスwebAPI作成 その3(Read/Delete編)](https://qiita.com/nendocode/items/f71982042018ddb8c74a)
デザイナーの考える「余白」とは何か書き下してみる

## 直近だと…（2022/01/13追記）

あれから4年近く経ち、私も転職したことで、デザイナーではなくなりました…。

この記事がたまに見られてるっぽいので、一応アップデートしておきます。
現代だと、gap という、まさしくこの記事の意図を表現するプロパティが出来たため、そちらを使うことを推奨します。

https://developer.mozilla.org/ja/docs/Web/CSS/gap

この記事の内容で書かれていた方は、コード内を `margin-top` で検索すれば、置き換えはそんなに難しくないのではないかと思います。

## この記事は...

[「CSSで「余白」を制してデザイナーに好かれよう」](https://qiita.com/rhirayamaaan/items/78544723724ccc2a50e9)というとても素晴らしい，本当に有難い記事が上がっていたのを見て，じゃあデザイナー(_主語がでかい_)は余白をどう考えているのかを，CSSを書いている一デザイナーの身から書き下してみよう、というものです．

## 「余白」の意味の書き下しと『**marginは下ではなく「上」で取る！**』ことが多い理由の分析

「余白」において重要なのは以下の二つです

- **「marginで書く余白」**というのは基本的に**「隣接している物の隙間」**を指している
- 隣接には，隣接が発生する**「方向」**がある

ひとつづつ見ていきます

### **「marginで書く余白」**というのは基本的に**「隣接している物の隙間」**を指している

一つ目は言葉通りですが，余白というのは単体では生じず，何かと何かが隣接してできるものです．
ですので，cssでもそれが表現できるとスタイルファイルはより意図(_最近僕はこれを「振る舞い」と呼ぶようにしています_)を表現できていることになります．

### 隣接には，隣接が発生する**「方向」**がある

二つ目の「方向」というのは，以下の図のようなことを指します

![sample.PNG](https://qiita-image-store.s3.amazonaws.com/0/99270/10a08e34-0cad-bcfc-1845-6db9158e863d.png)

グレーの四角にもう一つ足すことで隣接が発生しますが，その発生する方向があるということです．
グレーの四角に，青い四角Aの隣接が発生することで余白ができるわけなので，余白はこのAにつけるべきということになります．

そして，一般的なwebサイトではボックスは下に下に積み上げていくことが多いです．(つまり，**隣接を下に発生させることが多い**)
そのため，隣接を発生させる下のボックスに余白を持つことで，『**marginは下ではなく「上」で取る！**』ことが多くなります，

また，横並びの時は右に並べていくことが多いと思いますので，横方向のmarginは左にとることが多いかと思います．

#### 補足
横(縦)並びで，1行(列)あたりの個数が可変で，2行(列)以上になる場合，行(列)頭という概念をCSSでは表現できないので(僕が知らないだけかもですが)，右(下)に積む場合でも，右(下)にmarginを取らざるを得ないことがあります．ちょっと悲しい...．

### 「余白(隣接間の余白)」をCSSで表現する

![sample.PNG](https://qiita-image-store.s3.amazonaws.com/0/99270/30452771-4a24-94fb-9043-d423302832b5.png)

上の画像の余白の振る舞いは，以下のCSSだと良く表現できていると考えます．

```scss
.gray-box + .blue-box {  // グレーに隣接している青のボックスは…
  margin-top: 10px;      // 余白が(上に)10pxある
}
```

これは，参考記事([CSSで「余白」を制してデザイナーに好かれよう](https://qiita.com/rhirayamaaan/items/78544723724ccc2a50e9)) にも記述あり，僕も常用していています．

### 上に隣接する・左に隣接する例

基本的にWebページでは下・右に隣接していきますから，上・左の隣接というのがイメージしにくいかと思いますので，具体的な例を挙げたいと思います．

#### 注意

いろいろ考えたり議論したところ、どうも下の例はmargin-top, leftで解決したほうが良さそうというところに落ち着いています(コメントを参照してください)
margin-bottom, rightはflex-boxのflex-direction: hoge-reverseのような隣接方向が逆になる場合のみと考えるほうがシンプルに書けそうです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/d092c530-8364-5fba-89ea-009a58033782.png" alt="sample1.PNG" width=600>

これはよくある動画サムネイルとタイトル・投稿者名のセットですが，


<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/e2e58640-3683-0329-f555-eb493387d1f3.png" alt="sample2.PNG" width=600>

場所によっては，投稿日が追加されることがあるとします．これは下のまとまりの上に積まれ隣接が発生していると考え，margin-bottomを使うことがあります．

#### 補足
この状態であっても日付の下にタイトルを積んでいると考え，タイトルにmargin-topをつけると考えることもあります．
しかし，僕の考えとしては「サムネイルの隣にタイトルがないという状態は考えられない」ことは明らかのように思うので，タイトルの上に積まれると考えています．(が，コメントにも書きましたが，margin-topだけのほうが良手かもしれませんがまだ迷ってる)
--補足ここまで--

<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/184882f8-4517-faec-2946-6f08c1e06cca.png" alt="sample3.PNG" width=600>

時によっては投稿時間の横に「新着」ラベルがつくこともあるかと思います．これも先ほどと同様にして左に隣接が発生していると考え，margin-rightを使うことがあります．

### さいごに

以上のように，適切にmarginを表現してあげると，参考記事でも書かれているように保守コストが大きく下がることを僕も体感しています．
最近のCSSはよりよく表現できるようになっており，**思った通りそのまま**(変にハックをしないようにして)に振る舞いを記述してあげると保守や可読性も大きく向上します．
デザイナーからも，どういう振る舞いなのかをきちんと見極めて表現していけたらなぁと思います．

去年はCSSを65000行も書いてしまったので，今年はなるべく書きたくないなぁと思っている次第です…．
Optional(2018)年を小細工で避けてみる

iOS界隈で

```
Optional(2018)年
```
というワードが流行り、ブームが過ぎ去った頃だと思いますが、今更ながら便乗してみました。



---

```Swift
extension Optional: CustomStringConvertible {
    
    public var description: String {
        switch self {
        case .none:
            return ""
            
        case .some(let wrapped):
            return "\(wrapped)"
        }
    }
}

let year: Int? = 2018

print("\(year)年あけましておめでとうございます。") // 2018年あけましておめでとうございます。

```

要は、ユーザーに"Optional"という文字列を見せなければいいんですよ、という思想。


---
まぁ`Optional<Int>`を`"\()"`の中に入れようとした時点でwarning出ますけどね。**¯\\\_(ツ)\_/¯**

![スクリーンショット 2018-01-07 3.28.21.png](https://qiita-image-store.s3.amazonaws.com/0/105182/b30b19f1-213b-226a-4982-abbf0a3810a0.png)
Spring boot における静的ファイルのアクセス優先順位

spring-boot における静的ファイルのアクセスについてのメモです。

### Spring boot における静的ファイルの配置可能な場所

spring boot は、デフォルトの設定だと、
`projectDirectory/src/main/resources/META-INF/resources/` 
`projectDirectory/src/main/resources/` 
`projectDirectory/src/main/resources/static/` 
`projectDirectory/src/main/resources/public/`  
の下に配置することで、アクセスが可能となる。

例として、
それぞれのディレクトリに、下記のようにHTMLを配置した場合

```
project root
  └─ src
      └─ main
          └─ resources
              ├─ static
              |   └─ html
              |       └─ 1.html
              ├─ public
              |   └─ html
              |       └─ 2.html
              ├─ resources 
              |   └─ html
              |       └─ 3.html
              └─ META-INF
                  └─ resources
                      └─ html
                          └─ 4.html
```

それぞれのHTMLへは、
`http://localhost:8080/1.html`
`http://localhost:8080/2.html`
`http://localhost:8080/3.html`
`http://localhost:8080/4.html`
という形でアクセスが可能となる。

### Spring boot における静的ファイルのアクセス優先順位

下記のように、それぞれのディレクトリに同じ名前のファイルが存在した場合

```
project root
  └─ src
      └─ main
          └─ resources
              ├─ static
              |   └─ html
              |       └─ test.html
              ├─ public
              |   └─ html
              |       └─ test.html
              ├─ resources 
              |   └─ html
              |       └─ test.html
              └─ META-INF
                  └─ resources
                      └─ html
                          └─ test.html

```

`http://localhost:8080/test.html` とアクセスすると、
`META-INF/resources/html/test.html` が返される

静的ファイルの検索順は、

1. `resources/META-INF/resources/`
2. `resources/`
3. `resources/static/`
4. `resources/public/`

の順で検索され、先に見つかったものが画面に返される。

### プロジェクトで使用する場合について考えてみる

1. `resources/META-INF/resources/`
2. `resources/`

は、設定ファイルも置かれるので、静的ファイルを配置するには、適していないと思われる。

実際にプロジェクトで使用する場合には、

3. `resources/static/`
4. `resources/public/`

に配置することになるかと思う。

名称的に、

`resources/static/` に、ライブラリなど変化しないもの。
`resources/public/` プロジェクト固有のcssやjs などを配置

って感じだろうか。。。

うーむ。この辺ベストプラクティス的なものを知らないので、これでいいのかわからん。
教えて知ってる人( ；∀；)
knitr to PDFでの複雑なテーブル（行グループのタイトルを追加する）

Rstudio Cloudのリンクは[こちら](https://rstudio.cloud/project/9036)です。

rmakrdownとkableを使ってテーブルをかいてたところ、複雑なテーブルを書く際にkableExtraというパッケージがとても有用だということがわかったのでメモ。


```
library(knitr)
library(kableExtra)

#Motor Trend Car Road Tests in datasets package is loaded.
dt <- mtcars[1:5, 1:4]

# LaTeX Table
kable(dt, format = "latex", booktabs = T, caption = "Demo Table") %>%
  kable_styling(latex_options = c("striped", "hold_position"),
                full_width = F) %>%
  add_header_above(c(" ", "Group 1" = 2, "Group 2[note]" = 2)) %>%
  add_footnote(c("table footnote"))
```

<img width="307" alt="Untitled.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/224794/0ac5f31f-09fc-698f-1217-646fa187120f.jpeg">

ひとつの表の中に行グループのタイトルをつける。

```

  kable(dt, booktabs = T,
          format = "html", digits=2, #pdf出力の際はformat="latex"
        caption ="test table") %>% 
  kable_styling() %>%
  group_rows("group A", 1, 2) %>%
  group_rows("group B", 3, 3) %>% 
  group_rows("group C", 4, 5)

```

<img width="354" alt="Untitled.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/224794/43718474-9e14-8306-29fa-f3cf4fa9ab99.jpeg">
Macでcomposerのコマンドを実行すると"Operation timed out"になる時の対処法

Macでcomposer updateしようとした際に

```bash
The "https://packagist.org/packages.json" file could not be downloaded: failed to open stream: Operation timed out
Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info
```

といったエラーが出てcomposer系のコマンドが実行できない場合がある。

https://github.com/composer/composer/issues/4388#issuecomment-284262091
https://getcomposer.org/doc/articles/troubleshooting.md#operation-timed-out-ipv6-issues-

上記に記載してある様にIPv6の設定が正しくされていないと発生するらしく、
中間証明書を設定などすればいいとの情報もあるが暫定的にIPv6をoffにして対処する方法。

Wi-Fiを利用しているので

* IPv6を無効にする

`networksetup -setv6off Wi-Fi`

* IPv6を有効にする

`networksetup -setv6automatic Wi-Fi`

一度IPv6を無効にしてcomposer updateなどを実行すればOK。
Arduino UNO 互換機「Seeeduino v4.2」を Arduino IDEで扱うための設定

## Seeeduinoとは
seeedから出されている、Arduino UNO の互換機です。

![Seeeduino v4.2](https://qiita-image-store.s3.amazonaws.com/0/228034/9d11887b-be16-1671-05d6-c20cf4329a64.jpeg)

[Seeeduino v4.2 製品ページ](http://wiki.seeed.cc/Seeeduino_v4.2/)

昨年v4.2になった際に値下げされたようで、スイッチサイエンスで1000円ちょっとで購入できる、安価な UNO 互換機になり興味を持ちました（[スイッチサイエンスのSeeeduino v4.2ページ](https://www.switch-science.com/catalog/2651/)）。

## 私にとっての魅力（純正UNOと比べて）

+ 5Vと3.3Vを切り替えることができる。
+ USB端子が　micro-B
+ リセットボタンが端っこにあり、シールドを乗せても押せる。
+ GROVE端子が３つ（I2C用×2, UART用×1）・・・使ったことないけど多分便利（笑）
+ 赤色＆黄色のピンソケットがなかなかかっこいい。

## Seeeduino v4.2 を Arduino IDE（Mac版）で使うために
UNOと同等に使えると書いてあったので、Arduino IDE でも UNO を使うときの設定そのままで使えるかと思ったら、さすがに一手間必要でした。

ちなみに方法は、公式ページ書いてあります。

[How to Add Seeed boards to Arduino IDE
](http://wiki.seeed.cc/Seeeduino_v4.2/)

私は途中つまづいたので、メモがわりに書きます。

### ドライバのインストール
Macでは必要なかったので省略。
Windowsでは必要なようですので、前述の公式設定ページを参照願います。

###ボードの追加
UNOと互換なら不要かと思っていましたが、この作業が必要でした。

![ボードマネージャの追加画面](https://qiita-image-store.s3.amazonaws.com/0/228034/cce5ca2f-1f1b-d731-a38c-9aa5c43a1eef.jpeg)

メニューの「Arduino→Preference」を開き、追加のボードマネージャのURLを入れます。
入れるURLは以下のものです。

`https://raw.githubusercontent.com/Seeed-Studio/Seeed_Platform/master/package_seeeduino_boards_index.json`

###ボードのインストール
メニューの「ツール→ボード→ボードをインストール」を選び、インストールします。ここの画像を取れなかったので、前述の公式ページの画像を参照願います。

###ボード、シリアルポート、書き込み装置を選択
実はここでひっかかりました。
といっても、ボードは選択していたものの、シリアルポートの選択を忘れていて、書き込めなかったようです。私の環境の場合は「dev/cu.usbmodemFA121」でした。
書込装置は、UNOと同じく「AVRISP mkII」で大丈夫でした。

これで晴れて、使えるようになります。

Arduino IDE、昔は互換メーカーのボードのインストールは大変だったり専用のIDE使わないといけませんでしたが、ずいぶん楽になり便利になりましたね。
React Nativeを使って、Android開発する。➀

作成日：2017年12月30日

ReactNativeの学習を目的に、エンジニア歴8カ月の私が書き留める。
同じ境遇の方の参考になれば、と思います。
熟練の方、間違っている点や、助言よろしくお願いします。

●やること
➀Android Studioをインストールする。
➁Android StudioでReactNativeを扱えるようにする。
➂ReactNativeを触ってみた感想！
※内容ややることは仮置きです。

本記事は、
ReactNativeを学ぶために、「➀Android Studioをインストールする。」までを扱います。

前提：
・Windows8　64bit
・RAM 4GB
・Java JREダウンロード済
　
#➀Android Studioをインストールする。

[Android StudioとSDKツールをインストールする。](https://developer.android.com/studio/index.html?hl=ja)より、赤で囲ったANDROID STUDIOをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/0db11d8e-27ec-984c-e4ed-144199fbb425.png)

ダウンロードしたexeファイルをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/2ff8ae0b-cbc6-76dd-5447-ce324acde058.png)

基本的にそのまま「はい」と「next」をクリックしていけばOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/ccae87cf-ea5e-b84e-4efb-c05b6fd6e05f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/2dfd5a3b-09f8-b56f-5cf9-dc922cb71be6.png)

「Finish」でインストール完了です。とりまお疲れ様です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/396736df-11bf-6159-b66f-2933cd4398f6.png)

そのまま起動します。
下の画像のように、そのままOKをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/afe2ffdd-6921-6980-7d42-f1dfe5ce0cad.png)

歯車マークのConfigureから、SDK Managerを選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/682655a1-8841-2c33-34ec-b09320403fb4.png)

SDKのインストール先を指定して、そのままNextで行きましょう♪
<font color="Red">※ SDKのインストール先を覚えておきましょう！</font>
※ Pathに日本語が入っているとできないらしいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/01857f2c-4ad4-7418-4c83-9c03b18ab114.png)

この画面に戻ると、「SDK Tools」タブに移動します。
「Google USB Driver*1」にチェックを入れて、インストールします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/8b9574b9-5ddb-3abe-152f-9e84f6017b2d.png)


そのままOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/e6b378e3-f2db-f950-5df2-604b59b992a5.png)

acceptにチェックを入れ、next。その後、finishです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215898/9ae340a6-73b0-b840-cd09-9156acc19037.png)


##環境変数の設定
コントロール パネル>システムとセキュリティ>システム>システムの詳細設定  から、
システムのプロパティを開き、環境変数をクリック。
先ほどのSDKのインストール先を環境Pathに設定します。
私の場合だと、
　　　　[ C:\Users\akAki\AppData\Local\Android\Sdk\platform-tools ]
になります。
コマンドプロンプトで、「abd」*2と打ち、文字がズラーっと出ると成功です。
エラーが生じる場合は、Pathを確かめてみてください。

#小まとめ

だいたいインストール時間も含め、1時間ほどです。
次は、ReactNativeを扱えるようにして見ます。。
どーやるのか。。。


参考サイト：
➀[【随時更新】2017/12/22更新 Android SDKのインストール方法 (SDK,ADVのGUI廃止版)](https://jukeizunosekkeisya0502.blogspot.jp/2017/05/20176android-sdk-sdkadvgui.html)
➁[Windows10でAndroidStudioの環境構築](https://qiita.com/k_moto/items/cefb4bca13f6a99b2ea2)
➂[[Android] Android Studioをセットアップする（Windows版）
](http://www.programing-style.com/android/android-tool/android-android-studio-setup-windows/)

【よくわからなかったシリーズ】
*1 [Google USB Driver](https://developer.android.com/studio/run/win-usb.html?hl=ja)
memo: Windows で開発をしており、テストのために実機に接続する必要がある場合は、適切な USB ドライバをインストールする必要があります。お手持ちの端末用の USB ドライバをダウンロードするには、このページに掲載された相手先ブランド製品製造企業（OEM）のウェブサイト一覧からリンク先のページをご確認ください。
*2　[abdコマンド](https://developer.android.com/studio/command-line/adb.html?hl=ja)
riak-ts SELECT関連のクエリサンプル

## 概要

* 検索時に使いそうなriak-tsのクエリのメモ

## SQL

* 他のDBと同じでSELECTでデータの参照を行う
* WHEREでキーにしている時間の範囲を指定する必要がある
* サブクエリとかややこしいGROUP BYとかしなくていいのですごく楽
* 早い

### 時間指定で参照

```sql
> SELECT * FROM Hoge WHERE time < 1515254386 AND time > 1515250386;
```

* 参照しようとするカラムが多いと省略して表示される

```sql
> SELECT time, column_1 FROM Hoge WHERE time < 1515254386 AND time > 1515250386;
```

* カラム指定できる
* asはできない

### 時間 + カラム指定で参照

```sql
> SELECT * FROM Hoge WHERE time < 1515254386 AND time > 1515250386 AND column_1 = 'fuga';
```

* 特定の範囲の時間に特定のデータを持つrowを取得できる
* この辺までは他のDBと一緒

### 特定の範囲内の最新のrowを参照

```sql
> SELECT max(time), column_1 FROM Hoge WHERE time < 1515254386 AND time > 1515250386 AND column_1 = 'fuga';
```

* SELECTでmax(time)すると最新のtimeを持つrowのみを参照できる

### 特定の範囲のrowの数を取得する

* 上記のと組み合わせてrowの数を取得できる

```sql
> SELECT max(time), column_1, count(time) FROM Hogehoge WHERE time < 1515254386 AND time > 1515250386 AND column_1 = 'fuga';
```

* COUNTが使える

### 特定の範囲のrowの特定のカラムの積算、平均を求める

* 上記のと組み合わせてrowのカラムの積算と平均を求めることもできる

```sql
> SELECT max(time), column_1, count(time), sum(column_2), avg(column_2) FROM Hogehoge WHERE time < 1515254386 AND time > 1515250386 AND column_1 = 'fuga';
```

* 使えるのはSUM, AVG
* 使用できる関数はhelp sql selectで見れる

### GROUP BYでまとめて取得

* 複数のデータを集計して取得したい場合はGROUP BYを使う

```sql
> SELECT id, AVG(column_1) FROM Hogehoge WHERE time < 1515254386 AND time > 1515250386 GROUP BY id;
```

* GROUP BYも使える
* LIMIT OFFSET, ORDER BYなどもある
劇的ビフォ◯アフターで学ぶデザインパターン〜facade pattern〜

![20170806-00074217-roupeiro-000-11-view.jpg](https://qiita-image-store.s3.amazonaws.com/0/74851/234f722e-3942-f361-df00-7e9fb11d7f78.jpeg)

# カレーを作るクラスを考える

玉ねぎきって、

じゃがいもをむいて切って、

カレールーをとかす。

そんな料理を実現するクラス群を作って考えてみます。


# before

まずはfacade patternを使わずに書いてみます。

## ソースコード

```typescript

class Onion {
    cut() {
        console.log('玉ねぎが刻まれました');
    }
}
class Potato {
    peel() {
        console.log('じゃがいもの皮をむきました');
    }
    cut() {
        console.log('じゃがいものをきりました');        
    }
}
class CurryBase {
    dissolve() {
        console.log('ルーを溶かしました');
    }
}

class Main {
    static cookingStart() {

        /** 玉ねぎ２個を刻む */
        const onion1 = new Onion();
        onion1.cut();
        const onion2 = new Onion();
        onion2.cut();

        /** じゃがいも２個を剥いて切る */
        const potato1 = new Potato();
        potato1.peel();
        potato1.cut();
        const potato2 = new Potato();
        potato2.peel();
        potato2.cut();

        /** カレーのルーを溶かす */
        const curryBase = new CurryBase();
        curryBase.dissolve();
    }
}
Main.cookingStart();
```

## クラス図

![画面全体 (4).png](https://qiita-image-store.s3.amazonaws.com/0/74851/50fffd02-5bbe-c1d8-7ddf-0f85a750a992.png)

これを見ると、

使う側のクラス（Mainクラス）が

使われる側のクラスを３つも知っていることになります。

使う側と使われる側の依存性が高いといえます。

この場合、使われる側のクラスのメソッド名などを修正した際、

使う側のクラスも修正しなくてはいけません。


# after

今度はfacade patternを使って書いてみます。

## ソースコード

```typescript
class Onion {
    cut() {
        console.log('玉ねぎが刻まれました');
    }
}
class Potato {
    peel() {
        console.log('じゃがいもの皮をむきました');
    }
    cut() {
        console.log('じゃがいものをきりました');        
    }
}
class CurryBase {
    dissolve() {
        console.log('ルーを溶かしました');
    }
}

class Chef {
    cook() {
        
        /** 玉ねぎ２個を刻む */
        const onion1 = new Onion();
        onion1.cut();
        const onion2 = new Onion();
        onion2.cut();

        /** じゃがいも２個を剥いて切る */
        const potato1 = new Potato();
        potato1.peel();
        potato1.cut();
        const potato2 = new Potato();
        potato2.peel();
        potato2.cut();

        /** カレーのルーを溶かす */
        const curryBase = new CurryBase();
        curryBase.dissolve();        
    }
}

class Main {
    static cookingStart() {
        const chef = new Chef();
        chef.cook();
    }
}

Main.cookingStart();
```

## クラス図

![画面全体 (5).png](https://qiita-image-store.s3.amazonaws.com/0/74851/9d73e36c-3775-7a4f-7092-c85eaaedae69.png)

なんということでしょう。

先ほどMainクラスは3つのクラスのことを知っている必要がありましたが、

今は1つ（Chefクラス）だけ知っていればOKとなりました。

匠（facade）のお陰で随分疎結合な設計となりました。


PotatoやCurryBase等のクラスのメソッド名などを修正しても、

使う側のクラス（Main）は修正する必要はありません。

すばらしいですね。


# まとめ

facade patternは、

**使う側と使われる側を疎結合にする**

デザインパターンでした。

そうすることにより、

クラス修正による影響を使う側がうけないので、

修正に対して強くなります。