OmniAICreator/Qiita-1.07M huggingface dataset:
pritunlの使い方


利用者がやること

- pritunl cliantのインストール
- PIN、プロファイルの取得
- プロファイルの設定

管理者がやること

- ユーザーの作成、PINの設定
- 利用者へPIN、プロファイルの共有(ファイルorURI)

# クライアントの操作
### インストール
公式に各OSのpritunl cliantが用意されているのでインストール。
https://client.pritunl.com/

### プロファイルの取得
管理画面から接続するためのプロファイルを取得できる。
ファイルでダウンロード、もしくはURIでpritunl cliantにインポート可能。
今回は一番下の`for Pritunl Client`にて24時間有効なURIを取得。
<img width="1170" alt="2018-06-06_2_30_57.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/97541/9a94c2c7-b692-5960-3af0-7dabda0c4731.jpeg">


### プロファイルの設定
`Import Profile URI`に先ほど取得したURIを入力しImport。
![ 2018-06-06 2.33.40.jpg](https://qiita-image-store.s3.amazonaws.com/0/97541/da420a9d-0d70-bdac-6f1e-10b803fed784.jpeg)

### pritunl接続
右上のメニューから`Connect`、ユーザー作成時に設定したPINを入力して接続。
![ 2018-06-06 2.48.02.jpg](https://qiita-image-store.s3.amazonaws.com/0/97541/127a57ba-e920-56fa-2aa4-75c60ab5be34.jpeg)

### 接続確認
グローバルIPが`SERVERS ADDRESS`と同じになってればOK。
https://www.cman.jp/network/support/go_access.cgi

![2018-06-06_2_52_07.jpg](https://qiita-image-store.s3.amazonaws.com/0/97541/d0c0b477-60fb-8ce6-2239-2254fdf89e33.jpeg)

# 管理画面の操作
### Organizationの追加
1社で使う場合は社名、部署、チーム名など、数社で使う場合は社名などを設定。
<img width="1165" alt=" 2018-06-06 2.15.04.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/97541/b49952ab-e1de-cbc7-5f2f-59e4fcc898d8.jpeg">

### Userの追加
PINはpritunl cliantから接続する際に入力する。数字6文字〜で設定。
あとで利用者に配布する場合はメモしておく。
<img width="1160" alt=" 2018-06-06 2.15.59.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/97541/2df6bd24-18a7-b2b3-57bd-dfe58391d35b.jpeg">

### Serverの追加
ポートは構築時に設定したudpのポートを設定。pritunl cliantから接続する際に2段階認証も設定可能。
<img width="1161" alt=" 2018-06-06 2.18.49.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/97541/02e98824-e5c2-5683-874a-a3a8f7a8273d.jpeg">

### Attach Organization
作成したServerをAttachしてStart Serverで起動。
<img width="1161" alt=" 2018-06-06 2.27.58.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/97541/621521a1-231c-e46e-f303-c281859232ce.jpeg">
[Swift4] NavigationBarのBackボタンを、遷移先別にカスタムする方法

# 状況
ViewController(以降VC)間の遷移において、*NavigationBarの戻るボタン*を**画面ごとに**カスタムしたい

# こうやる
## こんな場面を例に
- VC_A → VC_B の時は、戻るボタンのテキストを"hoge_AtoB"にしたい。
- VC_A → VC_C の時は、戻るボタンのテキストを"fuga_AtoC"にしたい。
- また、VC_A → VC_C の時は、**戻る時に処理を行ったり、遷移をキャンセルしたり**もしたい。

## 実装

```swift
class VC_A: UIViewController, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationController?.delegate = self
    }

  func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController is VC_B {
            navigationItem.backBarButtonItem = UIBarButtonItem(
                title: "hoge_AtoB", 
                style: .plain, 
                target: nil, 
                action: nil)
        }
        if viewController is VC_C {
            navigationItem.backBarButtonItem = UIBarButtonItem(
                title: "fuga_AtoC", 
                style: .plain, 
                target: nil, 
                action: #selector(VC_A.backAction(sender :)))
        }
    }

    @objc func backAction(sender: UIBarButtonItem)  {
        // ここで色々処理できる

        self.navigationController?.popViewController(animated: true)
    }

}
```

## ポイント
- **遷移元で**、Backボタンを定義する
- NavigationControllerのdelegateメソッドを利用し、navigationのタイミングで、**遷移先別に**処理を行う
React + ExpressでExpressにレンダリングをまかせてみたらドハマりした件

## はじめに
技術的なことはあまりないです。
ご了承を。

## 経緯
モダ～ンと噂の **` React + Express `** の使い方を軽くでも知っておこうと思い、
手を出しました。
express-react-viewsなるものがあり、これを使えばサクッとReact+Expressができるぞ！と意気込んでいました。
そしてコケた次第です。

## 結論
Expressにレンダリングをまかせると、React側でクリックイベントとかとか拾えなくなります。
~~気が付けず辛かった。。。~~

## やったこと

まずはパッケージのインストールから。

```
yarn add babel babel-cli babel-core babel-register babel-preset-env babel-preset-react babel-plugin-runtime babel-polyfill babel-plugin-module-alias eslint express express-react-views nodemon path react
```

babel-registerでESの記述ができるようにします。

```js:root/index.js
require('babel-register')();
require('./server');
```

つぎにローカルホストを立てるためものを。

```js:root/server.js
import express from 'express';

const app = express();

app.listen(3000);
```

scriptsを追記します。

```json:package.json
...
"scripts": {
  "dev": "nodemon ./index.js"
}
...
```

` yarn dev ` ！

ブラウザで` localhost:3000 ` にアクセスすると、Cannot GET /　が表示。

次にもろもろの設定をする。

```js:root/server.js
import express from 'express';
import expressReactViews from 'express-react-views';
import path from 'path';
import routes from './routes';

const app = express();

app.set('views', path.join(__dirname, './src/components'));
app.engine('jsx', expressReactViews.createEngine());
app.set('view engine', 'jsx');

app.use(express.static(path.join(__dirname, './src/assets')))
app.use('/', routes);

app.listen(3000);
```

```js:root/routes/index.js
import express from 'express';
const router = express.Router();

router.get('/', (req, res, next) => {
  res.render('./src/components/pages/App');
});
```

これで下準備は大丈夫なはず。

Reactの記述はcreate-react-appを参考にちまちまと書きました。

```jsx:App.jsx
import React, { Component } from 'react';

export default class App extends Component {
  render() {
    return (
      <html lang='ja'>
        <head>
          <meta charSet="UTF-8" />
          <meta httpEquiv="X-UA-Compatible" content="ie=edge" />
          <meta name="viewport" content="width=device-width, initial-scale=1.0" />
          <title>react-express-sample</title>
          <link rel="stylesheet" href="/css/reset.css" />
        </head>
        <body>
          <div>Hello React!</div>
        </body>
      </html>
    )
  }
};
```

(まさかメタタグとかが書けるとは思わなかった...)

無事にレンダリングができているようでなにより。
そしてAPIの実装に入る前に、動作確認をしようと思った。
ここで盛大に事故る。

```jsx:App.jsx
export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      value: 0
    };
  }

  onClick() {
    this.setState({ value: this.state.value += 1 });
  }

...
        <body>
          <div>{ this.state.value }</div>
          <div onClick={ this.onClick }>click</div>
        </body>
...
```

これでぽちぽちすると数字が増えていくはず！


ぽちぽち
......ぽちぽちぽち
...ぽちぽちぽちぽちぽちぽちぽちぽちｐ


ふへぁ...っ!!

悲しきことに無反応である。
タイポや設定し忘れ、console.logを張ったり、バインドの記述を追記してみたり、設定ミスを探すも(ディレクトリ構成は触れない方向)致命傷はないよう。。。

もんもんとしながら検索をかけてみた。
同じことをやってるやってる。

express-react-viewsなんていうからReactとにたことができる！
と勘違いしてしまった我の救いようのなさよ。

仕方がない。できないものは仕方がない。
react-domとreact-routerでレンダリングとかとかしよう。そうしよう。

## まとめ
React + ExpressでExpressにレンダリングは丸投げできない。
このひとことに尽きます。

## その他

日本語不自由なため、読みにくい文章だったとおもいますが、
最後まで付き合っていただき、ありがとうございます。


ExpressでMySQLに接続できることを知った今日この頃。
【Octave】sum関数は第二引数を指定しよう

# ex◯の実行結果はあってるはずなのに提出時に合格点にならない・・・

Courseraのプログラミング課題で、テストコードを実行した際には期待通りの結果がでているが、
課題提出の際にscoreが加算されていないことがありました。
フォーラムをみたり、[テストケース](https://www.coursera.org/learn/machine-learning/discussions/all/threads/0SxufTSrEeWPACIACw4G5w)を実行してみたりして原因究明をしてみたところ、
`sum`の第2引数を指定していなかったのが原因でした。

# sumを使った勾配計算の実装
線形回帰において、勾配は以下の式で求める。

```math

\frac{\partial J(\theta)}{\partial \theta_{0}} = \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)}） - y^{(i)})x_{j}^{(i)} \qquad for \quad j > 0 \\

\frac{\partial J(\theta)}{\partial \theta_{j}} = \Bigl( \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)}） - y^{(i)})x_{j}^{(i)} \Bigr) + \frac{\lambda}{m} \theta_{j} \qquad for \quad j \geq 1

```

以下のような訓練データ_X_、ラベルデータ_y_、θが与えられるとする。

```math
X = 
\begin{bmatrix}
x_1^{(1)} & x_2^{(1)} & \cdots & x_n^{(1)} \\
x_1^{(2)} & x_2^{(2)} & \cdots & x_n^{(2)} \\
\vdots & \vdots & \ddots & \vdots \\
x_1^{(m)} & x_2^{(m)} & \cdots & x_n^{(m)}
\end{bmatrix}

\\

y = 
\begin{bmatrix}
y^{(1)} \\
y^{(2)} \\
\vdots \\
y^{(m)}

\end{bmatrix}

\\

\Theta =
\begin{bmatrix}
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n

\end{bmatrix}


```

正規化なしの項を以下のように実装してみる。

```matlab
grad = (1 / m) * sum(((X * theta) - y) .* X)';
```

適当なデータを作成して計算させてみると、問題なさそうに見える。

```matlab
octave:1> m = 5;
octave:2> X = rand(m, 3)
X =

   0.719964   0.384009   0.471899
   0.254826   0.660515   0.465894
   0.188693   0.822077   0.075419
   0.604758   0.614742   0.231738
   0.730915   0.114709   0.894736

octave:3> y = rand(m, 1)
y =

   0.312361
   0.106697
   0.524671
   0.493868
   0.063764

octave:5> theta = rand(size(X, 2), 1)
theta =

   0.57806
   0.13361
   0.78240

octave:6> grad = (1 / m) * sum(((X * theta) - y) .* X)'
grad =

   0.26277
   0.10417
   0.28947

```

しかし訓練データが1つのときに、スカラー値が返る。

```matlab

octave:7> x1 = X(1, :)
x1 =

   0.71996   0.38401   0.47190

octave:8> y1 = y(1)
y1 =  0.31236

octave:9> grad = (1 / 1) * sum(((x1 * theta) - y1) .* x1)'
grad =  0.82630

```

これはsumしているものが前者が行列、後者がベクトルであるためである。

```matlab
octave:12> ((X * theta) - y) .* X
ans =

   0.377508   0.201353   0.247437
   0.125725   0.325882   0.229860
  -0.046560  -0.202848  -0.018610
   0.072067   0.073256   0.027615
   0.785089   0.123211   0.961052

octave:13> ((x1 * theta) - y1) .* x1
ans =

   0.37751   0.20135   0.24744
```

sumの挙動について以下の通り。
> Built-in Function: sum (x, dim)
> 次元dim方向の和を計算する。 dimが省略されたときは，1を指定した（列方向に和をとる）とみなす。
> 例外として，xがベクトルでdimを省略したとき，要素の和を返す。

第２引数の指定がなかったため、ベクトルの要素をsumしてしまっていました。
これを防ぐためにsumの第2引数に`1`を指定しましょう。

```matlab
octave:17> grad = (1 / m) * sum(((X * theta) - y) .* X, 1)'
grad =

   0.26277
   0.10417
   0.28947
```

# まとめ
sum関数を使うときは第２引数を指定しましょう。
プログラミング課題は対象の週の[ディスカッションフォーラム](https://www.coursera.org/learn/machine-learning/discussions/all/threads/0SxufTSrEeWPACIACw4G5w)を見たり、[テストケース](https://www.coursera.org/learn/machine-learning/discussions/all/threads/0SxufTSrEeWPACIACw4G5w)を実行してデバッグすると原因がわかるかもしれません。

# 参考文献
[GNU Octave: 19.4 和と積](http://www.obihiro.ac.jp/~suzukim/masuda/octave/html/octave_97.html)
HighSerra / Xcode9.4 での Cocoapods？


- [CocoaPodsのpod updateでGitHubへのアクセスでエラーになる - Qiita](https://qiita.com/satoshi-iwaki/items/ed2c267127dcc80baa21)

最初エラーになってたのでこの記事参考に順にやってあった状態。
それでも pod update とかするとエラーになっていた。

あれやこれやググってやってみたんだけども
結局のところは

~~~
$ rbenv global system
$ pod setup
~~~

としたら直ったっぽい。
（途中で何かやってたかもしれないがすでに記憶が定かではない）

参考まで ```$ pod env``` としたときの情報

~~~
### Stack

   CocoaPods : 1.5.3
        Ruby : ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin13.0]
    RubyGems : 2.2.0
        Host : Mac OS X 10.13.5 (17F77)
       Xcode : 9.4 (9F1027a)
         Git : git version 2.14.1
Ruby lib dir : /Users/sadoru/.rbenv/versions/2.1.0/lib
Repositories : master - https://github.com/CocoaPods/Specs.git @ 54ac2d25ccdf63a661b57984bb947e18f7805fad


### Installation Source

Executable Path: /usr/local/bin/pod


### Plugins
cocoapods-deintegrate : 1.0.2
cocoapods-plugins     : 1.0.0
cocoapods-search      : 1.0.0
cocoapods-stats       : 1.0.0
cocoapods-trunk       : 1.3.0
cocoapods-try         : 1.1.0
~~~

rubyバージョン

~~~
$ rbenv versions
* system (set by /Users/sadoru/.rbenv/version)
  2.1.0
  2.1.2
  2.2.2

$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
~~~
Word VBA | 選択範囲内で置換

# やりたいこと
Word VBAで検索、置換を自動化するには、Findオブジェクトを使った方法が知られています。

[Word VBAで文字列を置換する方法！いくつかの基本パターンを徹底解説](https://tonari-it.com/word-vba-replace-replacement/)

この方法は、Wordの仕様で、文章全体、上方向、下方向のいずれかしか検索、置換できません。つまり、選択範囲内の文章だけを対象にして検索、置換できないことが不便です。そこで、選択された文章を対象にして、置換を行うVBAコードを作りました。

# 単純な置換
## 一番簡単な方法 (Findオブジェクトの利用)
下記のコードの、"検索したい単語"、"置換したい単語"を実際に検索したい単語と置換したい単語に置き換えれば使用できます。
こちらは、Wordに標準搭載されている検索機能を使うVBAのため、最も簡単です。

```vb:Module1
'選択範囲内で置換
Public Sub replaceInSelected()
    Dim strSearch As String, strRep As String
    Dim rng As Range
    Set rng = Selection.Range
    strSearch = "検索したい単語"
    strRep = "置換したい単語"
    
    rng.Collapse wdCollapseStart
    Do
        With rng.Find
            .ClearFormatting
            .Text = strSearch
            .Execute Replacewith:=strRep, Replace:=wdReplaceOne
            If .Found = False Then Exit Do
        End With
        If rng.End > Selection.Range.End Then Exit Do 'エラー回避
        Set rng = ActiveDocument.Range(rng.End, Selection.Range.End)
    Loop
    
End Sub
```

## もう一つの方法 (RegExpオブジェクトの利用)

ちなみに、正規表現をWordで取り扱うためのRegExpオブジェクトを使用しても同じことができます。
こちらは、Wordの標準機能でないため、CreateObjectでVBScriptのRegExpオブジェクトを呼び出して使用します。
Findオブジェクトより癖がないので、使いやすい反面、String型でデータを渡しているので、書式が消えてしまうのがデメリットです。

```vb:Module2
'選択範囲内で置換-2
Public Sub replaceInSelected2()
    Dim strSearch As String, strRep As String
    strSearch = "検索したい単語"
    strRep = "置換したい単語"
    
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Pattern = strSearch
        .ignorecase = False
        .Global = True
        Selection.Range.Text = .Replace(Selection.Range.Text, strRep)
    End With
    
End Sub
```

# 書式の置換

太字の単語にアンダーラインを付ける場合のマクロです。書式を変更する場合は、Findオブジェクトの方がはるかに簡単です。

```vb:Module3
'選択範囲内で書式の置換
Public Sub replaceInSelected3()
    Dim rng As Range
    Set rng = Selection.Range
    
    rng.Collapse wdCollapseStart
    Do
        With rng.Find
            .ClearFormatting
            .Font.Bold = True
            With .Replacement
                .ClearFormatting
                .Font.Underline = wdUnderlineThick
            End With
            .Execute Format:=True, Replace:=wdReplaceOne
            If .Found = False Then Exit Do
        End With
        If rng.End > Selection.Range.End Then Exit Do
        Set rng = ActiveDocument.Range(rng.End, Selection.Range.End)
    Loop
    
End Sub
```

#参考
* [選択範囲内で文字列検索を行うWordマクロ](https://www.ka-net.org/blog/?p=1199)
* [【VBA入門】正規表現で文字列を抽出、置換する方法(RegExp)](https://www.sejuku.net/blog/33541)
PDCA支援ツールを作ろう その２　画面を作る

# 画面設計

さて、今日は画面を決めていこうかと。
（UIに関しては正直あんまり詳しくないので参考書籍とかあったらこそっと教えてほしい。）


前回の記事で１画面に納めるという方針に決めたので、
それに沿ってサクッと作っていきます。
~~今日はなんか眠くて長いこと昼寝してたのであんま時間が無かったりします。~~

で今回はPDCAサイクルの大まかな目標を設定する[プロジェクト]があり、
その下に個別の小さな目標である[ケース]を複数持つ形でデータを保持したいと思います。

ファイルシステムをそれに見立て、以下のようなイメージで取り扱うことにします。

| データ | 実体 |
|:--:|:--:|
| プロジェクト  | ディレクトリ  |
| ケース  | XMLファイル  |

TabControlを使ってプロジェクト/ケースの選択Tabとケースの編集タブを作ろうか…とも考えたものの、
それもなんかイケてないので変更。

ファイル選択はツールバーにでも一任した方がよさそうです。

# とりあえず完成
ってことで出来た画面がこちら。

![skelton](https://qiita-image-store.s3.amazonaws.com/0/259679/407034b1-f797-8096-9014-8d026141c7b2.jpeg)

ざっくり解説するとこんな感じ

![画面説明_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/259679/d2f27685-244f-f4e2-631a-e50ee222bab7.jpeg)

1. いわゆるメニューバー。System.Windows.Forms.MenuStripを利用。
1. プロジェクト、ケース名の表示部分。テキストじゃなくてラベルの方がいいかも。
1. テキスト編集箇所。System.Windows.Forms.RichTextBoxを利用。重なってるけどPDCAの各工程向けに4枚配置している。
1. 表示する工程を選択する部分。System.Windows.Forms.RadioButtonを利用。
1. 次工程への遷移、別ケースからのAct情報を継承するためのボタン。見た目どおりSystem.Forms.Buttonを利用。
1. ステータスバー。 System.Windows.Forms.statusStripを利用。

<details><summary>RadioBoxの見た目を変更する方法はこちら</summary>
<div>

* コードから設定する場合
   RadioButton.Appearanceプロパティの値を"System.Windows.Forms.Appearance.Button"に設定する。

* VisualStudioのGUIから設定する場合
   [プロパティウィンドウ]-[表示]-Appearanceの項目を"Button"に設定する。

CheckBoxも同様。</div></details>

それっぽい見た目にはなったと思いたい。
ってことで今日はこれまで。
本日の稼動は03:02:32也。デザイン考えるのは時間かかる…
ポアソン分布と二項分布

#ポアソン分布 (Poisson distribution)
単位時間あたりに平均 λ 回ランダムに起こる現象が、単位時間にk 回起きる確率を表すのに使われる確率分布がポアソン分布である。Po(λ) と表現され、確率質量関数は以下で与えられる。
　$\begin{eqnarray*}f(x)=\frac{e^{-\lambda}\lambda^x}{x!}\end{eqnarray*}$

#電話の例
1分間に1回、つまり1時間に60回電話がかかって来る会社があるとする。1分間または1時間にx回電話がかかって来る確率はどの程度のものだろうか。二項分布と共にポアソン分布をpythonでグラフ表示してみる。

```python:ポアソン分布と二項分布
import datetime
print(str(datetime.datetime.now() ) + " 開始" )
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as sct
from scipy.misc import comb     # comb()は組み合わせを計算する関数
#日本語を使う場合はフォントを準備
from matplotlib.font_manager import FontProperties
fp = FontProperties(fname='C:\WINDOWS\Fonts\msgothic.ttc', size=14)


def poisson_pmf(k, lamb):
    ret= np.e**(-lamb)
    for i in range(k):
        ret *= lamb / (i + 1)
    return ret


plt.figure(num=1,figsize=(14,8))
j = 0
#二項分布の1分単位の試行回数。[2]なら30秒間を1回の試行として電話の事象の有無を確認する。
for n_count in [2,10]:
    p=1/n_count #1回の試行で電話の事象が起こる確率　λ=np

    #1分単位なら1回電話がかかってくるのでλ=1(回)、60分単位ならλ=60(回)
    for lam in [1,60]:
        j += 1
        n=n_count * lam

        #ポアソン分布
        x_poi = np.arange(0,100)
        y_poi=[poisson_pmf(k, lam) for k in x_poi]
        #y_poi=sct.poisson.pmf(x,lam)
        #二項分布:n回ベルヌーイ試行を繰り返してその確率を計算。試行の計算は内包表記。
        x_bin = np.arange(0,n+1)
        y_bin=[comb(n, z)*p**z*(1-p)**(n-z) for z in x_bin]

        plt.subplot(2,2,j)
        plt.xlabel('x')
        plt.ylabel('p(x)')
        plt.title("ポアソン分布と二項分布 %d分単位" %(lam), fontproperties=fp)
        plt.xlim(lam-lam**0.5*4,lam+lam**0.5*4) #範囲制限
        #ポアソンの棒グラフは左側にずらして表示する
        plt.bar(x_poi-0.4, y_poi, align="center", width=0.4, color="blue"
                ,alpha=0.5, label="Poisson λ= %d" % lam)
        plt.bar(x_bin,     y_bin, align="center", width=0.4, color="red"
                ,alpha=0.3, label="Binomial n=%d, p=%.3f" %(n,p) )
        plt.legend(loc="best", prop=fp)    #凡例を表示
        plt.grid(True)

plt.tight_layout()#一部が出力画像からはみ出る場合にグラフの位置サイズを調整
plt.savefig('figure.png')
print(str(datetime.datetime.now() ) + " 終了" )
plt.show()
```

![figure.png](https://qiita-image-store.s3.amazonaws.com/0/244452/6b30e154-3975-af1b-9162-0ce8ab49c0a2.png)

4つのどのグラフも、1分間に1回の頻度で電話が掛かってくる事を仮定している。ただし右列のグラフの単位は1時間である。
上段のグラフは、30秒間中に電話がかかる確率を0.5として二項分布を描いている。下段のグラフは、6秒間中に電話がかかる確率を0.01として二項分布を描いている。
まれに発生する事象がポアソン分布の対象になると言われる事があるが、グラフ右列の電話コールの例の様に、単位時間あたり60回も発生するランダムな事象でも、ポアソン分布に従う。
二項分布における試行回数nが大きく確率pが小さいとき、二項分布からポアソン分布を導く事ができる為、「まれに発生する事象」という表現が使われる事が多いのだろう。
choosenimでnim環境構築

pythonでいうpyenvみたいな感じ
nim用の環境管理ツールを使ってnim開発環境を構築する

# 手順

* リポジトリに全部書いてある
    * https://github.com/dom96/choosenim
* 今回はdebianのdockerコンテナで環境構築

## インストール

* README.mdに書いてあるスクリプトを実行

```bash
$ curl https://nim-lang.org/choosenim/init.sh -sSf | sh
```

* プロンプトが出るので確認してインストール

```
choosenim-init: Downloading choosenim-0.3.2_linux_amd64
    Prompt: Can choosenim record and send anonymised telemetry data? [y/n]
        ... Anonymous aggregate user analytics allow us to prioritise
        ... fixes and features based on how, where and when people use Nim.
        ... For more details see: https://goo.gl/NzUEPf.
    Answer: y
```

* 諸々のダウンロードが終わると実行したユーザの.nimble/binにパスを通すように言われるのでexportしてパスを通す

~/.nimble/binに含まれるバイナリたち

```
% ls ~/.nimble/bin 
total 12M
-rwxr-xr-x 1 hiro 4.2M Jun  5 15:06 choosenim*
-rwxr--r-- 1 hiro 2.0M Jun  5 15:06 nim*
-rwxr--r-- 1 hiro 2.0M Jun  5 15:06 nimble*
-rwxr--r-- 1 hiro 2.0M Jun  5 15:06 nimgrep*
-rwxr--r-- 1 hiro 2.0M Jun  5 15:06 nimsuggest*
```

* 現時点では0.18.0がインストールされる

## choosenimの使い方

* 引数なし or -hでヘルプが出るのでだいたいわかる

### stable版に切り替える

```
$ choosenim stable
```

### 最新のstableを取得

```
$ choosenim update stable
```

### githubの最新にする

```
$ choosenim #head
```

### バージョン指定

```
$ choosenim 0.16.0
```
curlでJSONをPOSTするとき値にシェル変数を使う方法について

# IFTTTのWebhookで困った
↓こういうの行けると思ったが…

```
curl -X POST -H "Content-Type: application/json" -d '{"value1":"＄VAR1","value2":"$VAR2","value3":"$(cmd)"}' https://maker.ifttt.com/trigger/${EVENT_NAME}/with/key/${TOKEN}
```
Bad Requestが帰ってくる。
bash -xで調べると$VAR1や$(cmd)が文字列のまま実行されていた
シングルクォートのせい

## とりあえず解決策
```
curl -X POST -H "Content-Type: application/json" -d @- https://maker.ifttt.com/trigger/${EVENT_NAME}/with/key/${TOKEN} << EOS
{"value1":"＄VAR1","value2":"$VAR2","value3":"$(cmd)"}
EOS
```
もっといい方法がありましたらご教示ください

この記事はDeveloper I/Oさんを参考にしました。
https://dev.classmethod.jp/server-side/os/how-to-inject-variable-to-json-on-bash/
初心者が学ぶ TypeScript 入門 Ver.0.5 【準備編】

# 前回のあらすじ

[TypeScript入門 Ver.0.2](https://qiita.com/ikkitang/items/5ee36fe5786893be5eee)

TypeScriptを扱うにあたって、node.jsを一度勉強してみる事にした。

- Hello World 
- URL ルーティング
- HTMLファイルの読込

# node.js　の勉強

- 3. テンプレートエンジンを使用してみる。

まずは、テンプレートエンジンを読み込みます。

```terminal
$ npm install ejs
```

次に ejs のテンプレートファイルを作成します。 これは `~~.ejs` というようなファイル形式で作成します。

テンプレートの展開形式として今回は二種類を使います。

- `<%= 値 %>`
中にあるJS変数の値をエスケープして展開する記述方式です。
<や>がエスケープされて出力されるので、HTMLタグを扱う場合は下の方式を使用します。

- `<%- 値 %>`
中にあるJS変数の値をエスケープしないで展開する記述方式です。
JS変数がHTMLの場合はこちらを使いますがスクリプトインジェクションには注意して使用します。

```html:sample.ejs
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>サンプル ejs</title>
</head>
<body>

<h1><%= title %></h1>

<%- content %>

<p>ランダム生成された値は <%= randomNumber %> です。</p>

</body>
</html>
```

続いて `server.js` 側も `sample.ejs`に値を渡すように書き換えてみます。

```js:server.js

const http      = require('http');
const ejs       = require('ejs');
const filSystem = require('fs');
const server    = http.createServer();

let message  = '';
// テンプレートファイルを扱う.
let template = filSystem.readFileSync(__dirname + '/sample.ejs', 'utf-8');

let randomNumber = 0;

server.on('request', function(request, response) {
    randomNumber = Math.round(Math.random() * 100);

    let data = ejs.render(template, {
        title: 'Hello Hello',
        content: "<h2>アクセスありがとうございます！</h2>",
        randomNumber: randomNumber,
    });

    response.writeHead(200, {'Content-Type' : 'text/html'});
    response.write(data);
    response.end();
});

server.listen(3000);

```

```terminal
$ node server.js
```

`http://localhost:3000` とブラウザでアクセスすることで ejsのテンプレートにて変数が展開されて ページが表示される。

![スクリーンショット 2018-06-06 0.00.52.png](https://qiita-image-store.s3.amazonaws.com/0/66498/97030296-3b70-fcb9-a0c3-30392c9e9b4a.png)


# まとめ

ひとまず、こんなもんで node.jsはOkかな。

TypeScript書いてみよー！

# 宣伝

転職をきっかけにいろいろな試みをやってます。

## ほぼ日AWS

[ほぼ日AWS](https://ikkitang1211.hatenablog.jp/archive/category/%E3%81%BB%E3%81%BC%E6%97%A5AWS)

AWSの各ソリューションについて 「このソリューションはどういうもの？」 って観点でまとめてみたものです。

## もくもく独書 for Swift実践入門

[もくもく独書 for Swift実践入門](https://ikkitang1211.hatenablog.jp/archive/category/Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80)

Swift実践入門の書籍を毎日読みながら必要に応じてコードを書いてまとめていっているものです。
VisualStudioCodeをインストールしてみた

AtomからVisual Studio Codeに乗り換えようと思い、Visual Studio Codeをインストールしてみた。ちなみにAtomは半年前より利用中。

## インストール

- [公式サイトへアクセス](https://code.visualstudio.com/)しファイルをダウンロード

- ダウンロードしたexeファイルを実行
VSCodeSetup-x64-1.23.1.exe

- セットアップウィザードの開始
使用許諾契約書の同意
→インストール先の指定
→プログラムグループの指定
→追加タスクの選択（PATHへの追加）
→インストール
→完了

- VSCodeの起動
起動すると、以下のメッセージが表示されるのでそれぞれ対応

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/209489/8e94b2d6-d704-1a14-64d8-f3e14be258c6.png)

1.Japanese Language Pack for Visual Studio Codeをインストール
2.[オプトアウト](https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting)する方法を確認
　ファイル→基本設定→設定
　ユーザー設定に以下を追加

```json
{
    "telemetry.enableTelemetry": false,
    "telemetry.enableCrashReporter": false
}
```
　保存（Ctrl+S）し再起動。

3.Gitは今使っていないので今後は表示しない

## 拡張機能の追加
- [参考](https://qiita.com/EbXpJ6bp/items/4b87a092a3d6a0ecf595)で調べたもの、Atomで使っているパッケージなどをインストール。
時間がなかったのでとりあえず、3つほど。

 - Project Manager
 - Restore Editors
 - vscode-icons

- テーマのインストール
ファイル→基本設定→配色テーマ→その他の配色テーマをインストール
Atomでも使っているseti-themeをインストール→再読み込みし、
もう一度、ファイル→基本設定→配色テーマでsetiを選択。
エクスプローラーの色は変わらなかったが、一旦ここまで。。

## 拡張機能の利用
- 現在開いているプロジェクトをProjectManagerに保存する  
コマンドパレット（Ctrl+Shift+P）を開き、  
ProjectManager:SaveProjectでプロジェクトを保存

## 使用感（Atomと比較して）
- とにかく起動が早い
- minimapが標準で入っていた
- ProjectManagerはVSCodeの方が使いやすい気がする
- 拡張機能のインストールは時間がかかるものがある（たまたま？）  
テーマのインストールで何故か固まった。。
- Emmetが標準で使えるらしい（まだ使ってないのでなんとも）

使い始めてまだ１日しか使っていないけど、使い勝手は上々。
HTTP認証について

# HTTP認証

## Basic認証

- ユーザー名とパスワードを:で区切り, BASE64でエンコードした文字列をHTTPヘッダのAuthorizationに指定する.
- 認証情報を平文で送るため盗聴される恐れがあるため, SSLにより通信を暗号化する等の対策が必要になる.

### Base64

- バイナリをテキストに置換する変換方式.
- 英大文字, 英小文字, 数字,+ ,/の64文字が使用される.
- 元データを6 bitずつに区切り, 整数値(0-63)を変換表に従って置換する. 6 bitに満たない場合は0でパディングする.
- 変換表は以下の通り.

|整数値|変換後文字|
|---|---|
|0-25|A-Z|
|26-51|a-z|
|52|+|
|53|/|

- byte単位でデータを扱うため,変換後の文字列は4文字単位の必要がある. 4文字に満たない場合は=でパディングする.


## Digest認証

- クライアントでユーザー名, パスワード, ランダムな文字列をMD5でハッシュ化し, サーバーに送信する. サーバー側でもハッシュ値を計算し, クライアントから送信されたハッシュ値と合致するかを検証する.
- ハッシュ値を送信するため, パスワードを平文で送らないという点でBasic認証に比べて盗聴に耐性がある.

### フロー

1. クライアントは認証ページにアクセスする.
2. サーバーは401を返し認証を要求する. その際にランダムな文字列であるnonceをレスポンスに含める.
3. クライアントでユーザー名とパスワードを入力する.
4. クライアントでランダムな文字列であるcnonceを生成し, ユーザー名, パスワード, nonce, cnonceをMD5でハッシュ化しサーバーに送信する.
5. サーバーでもユーザー名, パスワード, nonce, cnonceをMD5でハッシュ化し, クライアントから送信された値と合致するか検証する.
6. 成功した場合はコンテンツを返す.

## 参考

- https://ja.m.wikipedia.org/wiki/Basic認証
- https://ja.m.wikipedia.org/wiki/Digest認証
- http://e-words.jp/w/BASE64.html
PythonでHTTP POST

Python 3時間目～4時間目
HTTP POSTを行いたい。

環境 Python 3.6



```
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request

#自己証明サイトへのポスト時に
#import ssl
#ssl._create_default_https_context = ssl._create_unverified_context

class SampleHttp:

    def get(self):
        url = 'https://www.yahoo.co.jp/'
        with urllib.request.urlopen(url) as response:
            html = response.read()
            print(html)

    def post(selfs):
        #405 エラー
        #url = 'https://www.google.co.jp'
        #values = {'q': 'hello'}

        url = 'https://www.yahoo.co.jp/'
        values = {'q': 'hello'}

        data = urllib.parse.urlencode(values)
        data = data.encode('ascii')
        req = urllib.request.Request(url, data)
        with urllib.request.urlopen(req) as response:
            html = str(response.read(), "utf-8")
            print(html)
            response.close()

#
http = SampleHttp()
http.post()
```

* unicodeという関数はpython 2の時代の物。python 2とpython 3で文字列の仕様が結構変わった？
* googleへのポストに失敗・・・
WWDC2018で発表されたiOS12の機能をまとめてみる

# WWDC2018の発表で思ったこと

今年のWWDCでハードウェアの発表があるかと思ったらなんと残念、
新しいハードウェアの発表はありませんでした。
できれば新型のMacBookProが登場して欲しかったです。
今のマイマシンはAirですが、メモリが4Gしかありませんので事あるごとにマシンが固まってしまって
億劫になってしまいます。

## ARKit2

今年のWWDCではARKitがパワーアップして二人以上いれば「体験の共有」ができるようになりました。
そのプレゼンがまたシュールでおじさん2人がそれぞれiPadを操作して画面上でレゴを操作していました。
この時の会場の雰囲気ってとてもシュールな気がしますね。
まあ、でもUnityと合わせてAPIを最大限まで活用すれば面白いアプリはできそうではないかな。
個人的には写真アプリが充実してきそう。
3Dカメラも作れるようになってきてるしね。
そろそろARKitでなんかアプリ作ってみたいなw。

## ARKit2のメジャーな機能について

- Persistent AR Experiences(1)
- Shared AR Experiences(2)
- Object Detection and Tracking(3)

1.はARで仮想おもちゃを仮想で放置しても、その状態を保存して次回は同じ状況からアプリを再開する事が可能になる。何言ってるのか自分でもよくわからないがARKitは空間情報を保存できるのかな。
同じ空間にいることはあんまりなさそうだけど。
(実験できるとしたら近くのカフェで試しにできるくらいか)    

2.これが「体験の共有」らしい。
二人以上で同じARを共有して同時に体験を可能にするらしい。
誕生日会とか結婚式とかイベント系に使えそう。    
3. ARKit2はオブジェクトの従来の平面画像に加えて、現実のオブジェクトのトラッキングも可能になったみたい。
既存のリアルの物体をトラッキングして上から別の物体を装飾できるそうになったんだとか。
この機能を使ってプレゼンではレゴで操作してなんかやっていました。


## Siriショートカット機能

Siriショートカットという細かい機能がアップデートするんだそうです。
Appleはどうやら本気でSiriを全面展開したがっているのが見えてきましたね。
Siriがもう少し優秀になったら「amazon Echo」くらいまで進化してほしい。
あそこまで頑張ったら多分いろんなところで使われ出すよ、きっと。

## メジャーアプリ

多分、あれはカメラ機能を使ってそれに写る実体の長さを測っていました。
個人的にメジャー(測定)アプリで考えたのが洋服屋で寸法を測る時に使えそうかなと思ったくらいです。

## ミー文字

よくわからんw。

## FaceTimeが32人まで共有可能に

なるそうです。
日本じゃFaceTimeが流行ってないからあんまり使われなさそうである。
そもそも日本じゃラインが一強なのでグループラインで済んでしまうんですよね。

## 総括

Siriといい、ARKitといいAppleはどうにかして人工知能や仮想現実(バーチャルリアリティ)の方面を強化していきたい方針を見せていたね。
それよりも新しいプロダクトを創り出してほしいんだけどねw。


Appleのスタンスはライフスタイルの充実にあるからそういう近未来の分野を攻めようとしてるんでしょうね。
開発者サイドからはこれからiOS12のβ版が順を追って仮リリースされていくからその新情報を追うのが本当に大変である。
Apple Developerサイトにログインしたら多分もうiOS12のベータ版ダウンロードできると思う。

なんかもうiOSは10で完成された感があるからiOS11も12もあまり新鮮味がなかったな。
iOSエンジニアとしてはちょっと残念感はありますね。
だからこそ、機械学習には魅力を感じてしまいます。
google検索結果ページの真似

作成物
https://jsfiddle.net/ghost7492/yzhe6d8p/
制作期間4日

block要素が、初期で親要素の幅100%なのを知った。
今回は、中身の要素に影響されて、親要素の幅を超えて欲しかったので
inline-blockを使用した。
Ionic3に入門してみる～その8 Angular4チュートリアル⑥～

# サービス
## Observable データ
HeroService.getHeroes()(この記事でいうとheroProvider.getHeroes()のことです)は同期的なメソッドです。
現状、HeroesComponentでも同期的に取得できるという想定で書かれています。
しかし実際にはこれではダメです。
なぜなら、HeroService.getHeroesはサーバー側から何らかのデータを取得する想定だからです。
チュートリアルではObservableを返すようにします。
これは、後にヒーローデータの取得で利用する Angular の HttpClient.get() メソッドが Observable を返すからです。

## Observable HeroService
HTTP に関する章はもうすこし先にありますので、詳しいことはここでは出てきません。
この章ではRxJSライブラリのof()関数を使ってサーバーからデータ取得する風にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/6496be49-b267-d587-3bf5-b77f5cb47401.png)

## HeroesComponent での Subscribe
HeroService.getHeroes()(heroProvider.getHeroes())をObservable<Hero[]>に対応させましょう。
下記のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/94a5d598-f189-71c7-b78b-e4d061f16420.png)
これでHeroたちが非同期で取得できるようになりました。(表示は変わりませんが)

## MessagesComponent の作成
CLIからコンポーネントを作成。
>ionic generate component messages
app.htmlに作成したものを加えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/c0a8a0ce-bea3-95de-1b78-7bbb1db60fe0.png)
app.module.tsにも忘れずに加えておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/52dbe93f-4f9d-6cbd-10ac-e8ace1da23ca.png)

とりあえずコンポーネントが下部に追加されたことだけを確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/89b15e41-c02e-9d6b-9da6-275025b41276.png)


## MessageService の作成
続いて、MessageService を作成します。(ここではMessageProviderのことです)
ionic generate provider message

作成したら下記のようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/9070c414-17b5-5e57-ec0b-d1ddc9567165.png)

## HeroService への注入
HeroServiceに注入します。
下記のようにしてみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/7df10749-5085-a76b-34e2-60014ebcfec2.png)
これでserviceからserviceを利用する準備が整いました。


## HeroService からメッセージを送る
getHeroesメソッドを呼び出したときにmessageServiceにメッセージを追加するようにしてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/6db3a5e3-13ad-4085-102a-b201204b4aa3.png)

## MessageService へバインドする
html側もmessageServiceを利用できるように変えておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/7d3da078-54cb-1373-6897-d4244c9a3aee.png)

あわせてmessageComponentも変えておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/ff86d40f-d7a1-dff4-cad0-0abf5cd9666e.png)

下記のように表示されていれば成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/bd440201-7c97-cfeb-7091-c38fd6212b0e.png)
MCP 70-410 を取得しました。

MCP 70-410 「Windows Server 2012 のインストールと構成」を受験し、無事合格できたので勉強のやり方などを残しておきます。

2017年よりWindows Server 2016 試験（70-740、70-741、70-742）の提供が開始されているため、今後本受験の需要は減ると思われますが、これから受験される方のご参考になれば幸いです。

#試験名
MCP 70-410 「Windows Server 2012 のインストールと構成」日本語版

# 概要
試験時間：120分
問題数：43問
合格点：700点以上
受験料：￥21,103

#出題範囲の確認
公式サイトはこちらです。
https://www.microsoft.com/ja-jp/learning/exam-70-410.aspx

### サーバーをインストールおよび構成する（15〜20％）
* サーバーをインストールする
* サーバーを構成する
* ローカル記憶域を構成する

### サーバーの役割と機能を設定する（15〜20％）
* ファイルとアクセスの共有を構成する
* 印刷サービスとドキュメントサービスを設定する
* リモート管理用にサーバーを構成する

### Hyper-V の構成 (15～20％)
* 仮想マシン設定の作成と構成
* 仮想マシンの記憶域を作成および構成する
* 仮想ネットワークを作成および構成する

### コアネットワークサービスの導入と構成（15-20％）
* IPv4とIPv6のアドレス指定を設定する
* 動的ホスト構成プロトコル（DHCP）サービスの展開と構成
* DNSサービスの展開と構成

### Active Directoryのインストールと管理 (15～20％)
* ドメイン コントローラーをインストールする
* Active Directory ユーザーおよびコンピューターを作成および管理する
* Active Directory グループおよび組織単位 (OU) を作成および管理する

### グループ ポリシーの作成と管理 (15～30%)
* グループ ポリシー オブジェクト (GPO) の作成
* セキュリティポリシーを構成する
* アプリケーション制限ポリシーを構成する
* Windows ファイアウォールを構成する

#Microsoft社 公式動画　【2018/7/28更新】
[mstep オンライン](https://partner.microsoft.com/ja-jp/training/mstep-mcp) にて受験対策セミナーの動画が、無償提供されております。

わかりやすく試験内容が説明されており、出題範囲の把握のためにも、一通り目を通しました。

~~※現時点で「2018 年 6 月提供終了予定」と記載がありますので、今後閲覧できなくなるかもしれません。~~
2018年7月末時点で確認したところ、mstep オンラインからの記載が消えておりました。

# 勉強方法

* MCP教科書 Windows Server 2012 試験番号70-410 R2対応版　※赤本

　メインで活用しました。模擬問題含めて、3周、学習しました。
　付録の試験直前チェックシートはほぼ内容を暗記しました。

* MCP教科書 Windows Server 2012（試験番号：70-410） - スピードマスター問題集 ※白本

　1周、問題を解きました。

* 実機学習

Windows10 Pro上にHyper-VでWindows Server 2012の仮想マシンをインストール。
MCP教科書に記載のあるPowerShellコマンドレットを実行しながらオプションなどの確認をしました。
下記URLも参考にしました。

参考URL：http://www.tecknowledgebase.com/38/exam-70-410-installing-and-configuring-windows-server-2012-powershell-commands/

#まとめ

高得点ではないもの合格点を超えることができどうにか試験には合格できました。

実機学習でPowerShellをやったのがかなり功を奏しました。
webpackでriotのcssをコンパイルしたい

riotのcssに自動でベンダプレフィックスをつけたかっただけなのに地味にハマったのでメモします。

## ダメなパターン

```webpack.config.js
const postcss = require('postcss');
const prefixer = require('autoprefixer')({ browsers: ['last 2 version'] });
module.exports = {
  // ・・・省略
  module: {
    rules: [
      // ・・・
      {
        test: /\.tag$/,
        exclude: /node_modules/,
        use: [{
          loader: 'riot-tag-loader',
          options: {
            hot: 'false',
            style: 'postcss',
            parsers: {
              css: {
                postcss: (tagName, css) => postcss([prefixer]).process(css).css
              }
            }
          }
        }]
      }
    ]
  }
};
```

実行すると以下のエラーが出ました。
`Module build failed: Error: Riot parser "css.postcss" is not registered.`
どうやらpostcssというパーサが登録されてないっぽいです。おかしいですね。
ちゃんとparsersの下にかいたはずなんですけどね。
調べてみたらあっさり解決法が出ました。>>> https://github.com/riot/tag-loader/issues/4


## OKパターン

```webpack.config.js
const postcss = require('postcss');
const prefixer = require('autoprefixer')({ browsers: ['last 2 version'] });

// new !!
const riot = require('riot');
riot.parsers.css.postcss = (tagName, css) => postcss([prefixer]).process(css).css

module.exports = {
  // ・・・省略
  module: {
    rules: [
      // ・・・
      {
        test: /\.tag$/,
        exclude: /node_modules/,
        use: [{
          loader: 'riot-tag-loader',
          options: {
            hot: 'false',
            style: 'postcss'
          }
        }]
      }
    ]
  }
};
```

どうやら`riot-tag-loader`がカスタムパーサの登録をサポートしてない(?)ようで、riotに直接登録するとうまくいきます。

## 最後に
optionにriot.config.jsの内容をそのまま書けばいいと思ってもので地味にハマりました。
Windowsファイルエクスプローラのプレビュー表示は、PNGのgAMAチャンクに対応していない



# 環境
* Windows10 HOME
    - バージョン：1803
    - OSビルド：17134.48
    - Microsoftフォト 2018.18041.15210.0
* Windows7 Home Pentium
    - バージョン：6.1
    - ビルド：7601(Service Pack 1)
* ImageMagick 7.0.4-10 Q16 x64 2017-02-18


# 背景
ImageMagickのconvertコマンドを使って、PNGのgAMAチャンクを変更しました。

```shell-session
# 元の画像のgAMAチャンクの値
$ identify -verbose original.png
...
  Properties:
    png:gAMA: gamma=0.45455 (See Gamma, above)

$ # ガンマ補正値を"3"に設定する
$ convert original.png +gamma 3 converted.png
$ # 画像の詳細情報を出力する
# 元の画像のgAMAチャンクの値
$ identify -verbose converted.png
...
  Properties:
    png:gAMA: gamma=3 (See Gamma, above)

```

変換後の画像はガンマ補正値が"3"で、元の画像より薄く表示されます。
（Firefoxで「薄く表示されること」を確認した）

![original.png](https://qiita-image-store.s3.amazonaws.com/0/37903/992ff5a6-8022-488e-5fdb-2d051247cedc.png)

![converted.png](https://qiita-image-store.s3.amazonaws.com/0/37903/681129f3-6f22-9560-5ae2-dd570e704308.png)


# 起こったこと

Windows10のファイルエクスプローラでプレビュー表示（特大アイコン）すると、"converted.png"は"origina.png"のプレビュー表示と同じでした。

![image](https://qiita-image-store.s3.amazonaws.com/0/37903/7249d3e6-9941-bdb1-ddf1-bbb8069ce4ac.png)


Windowsフォトで"converted.png"を開いたあと、ファイルエクスプローラを更新したら、"converted.png"の色が薄くなりました。


![image](https://qiita-image-store.s3.amazonaws.com/0/37903/33788c35-75e1-7af2-8062-bfc7cc6041a2.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/37903/13e1a6fe-5812-d853-3926-d52516872bf1.png)

# gAMAチャンクに対応しているかどうか
様々なソフトで、gAMAチャンクが対応しているかどうかを調べました。

| OS        | ソフト                                 | 結果  |
|-----------|----------------------------------------|:-------:|
| Windows7  | ペイント                               | NG    |
| Windows7  | フォトビューア                         | NG    |
| Windows7  | ファイルエクスプロラーのプレビュー表示 | NG    |
| Windows10 | ペイント                               | NG    |
| Windows10 | Microsoftフォト                        | OK    |
| Windows10 | ファイルエクスプロラーのプレビュー表示 | NG/OK（上述参照） |
| Xubuntu | ristretto 0.8.0 | NG |
| Xubuntu | Eye of GNOME Image Viewer 3.18.2 | OK |
| Xubuntu | Thunar 1.6.11 プレビュー表示 | NG |
| macOS High Sierra | Finder 10.13.5 プレビュー表示 | OK |


# まとめ
* プリインストールされているWindows関係の画像編集/閲覧ソフトでは、PNGのgAMAチャンクに対応しているものが少ない
* Microsoftフォトは、gAMAチャンクに対応している
* Windows10のファイルエクスプロラーのプレビュー表示は、Microsoftフォトに影響する

# 分からないこと
なぜ、Microsoftフォトで開くと、ファイルエクスプローラのプレビュー表示が変わるのでしょうか？


# 補足

### ImageMagickの`+gamma`オプションの説明

>Use +gamma value to set the image gamma level without actually adjusting the image pixels. This option is useful if the image is of a known gamma but not set as an image attribute (e.g. PNG images). Write the "file gamma" which is the reciprocal of the display gamma; e.g., if your image is sRGB and you want to write a PNG gAMA chunk, use

https://www.imagemagick.org/script/command-line-options.php#gamma 引用
Ink to Code を使ってみた

## はじめに

Microsoft の [Ink to Code](https://www.microsoft.com/en-us/garage/profiles/ink-to-code/)を使ってみました。（OS の言語を英語に変えたときに、たまたまダウンロードできたので…）

## 何ができるの？

- アプリの画面をお絵描き感覚で作成することができます
- 作成した画面を UI コードにエクスポートすることができます

## 使い方

使い方を簡単に記載しておきます。

### メイン画面

Ink to Code を起動すると以下のようなメイン画面が表示されます。

![MainScrenn](https://gist.githubusercontent.com/tafuji/eeba48c32100be9fdd6d3d303d9b434d/raw/dd828a5fbf48c4b17de3b28cd604e669f26259f7/01-MainScreen.png)

- サイドメニュー
    - 描画に利用するメニューが提供されています
        - ペン
        - 消しゴム
        - コントロールを整列させるための制約
        - ルーラー（定規）
        - Undo, Redo
        - 拡大、縮小

- ツールメニュー（上部）
    - プロジェクトの新規作成、ファイルのオープン・保存、アプリケーションの UI コードへのエクスポートメニューが提供されています

### View を作る

View は長方形を描くことで作成できます。

![CreateView](https://gist.githubusercontent.com/tafuji/eeba48c32100be9fdd6d3d303d9b434d/raw/dd828a5fbf48c4b17de3b28cd604e669f26259f7/02-CreateView.gif)

View を作成したら、View の中にコントロールを描いていきます。以下のコントロールを描くことができます。

- Label
- Textbox
- Button
- Image
- Paragraph

Guide ボタンを押すと、各コントロールの描き方が表示されるので、参考にするとよいと思います。

![Controls](https://gist.githubusercontent.com/tafuji/eeba48c32100be9fdd6d3d303d9b434d/raw/dd828a5fbf48c4b17de3b28cd604e669f26259f7/03-Controls.gif)

### コントロールの整列

手描きで描いた複数のコントロールを整列させることができます。サイドメニューの「Constraint Pen」を選択して、基準線を描いた後、基準線と整列したいコントロールを選択すると、コントロールを整列させることができます。

![Constraint](https://gist.githubusercontent.com/tafuji/eeba48c32100be9fdd6d3d303d9b434d/raw/dd828a5fbf48c4b17de3b28cd604e669f26259f7/04-Constraint.gif)

### エクスポート機能

Ink to Code には、作成した View をアプリケーションの UI コードにエクスポートする機能が提供されています。以下の種類のアプリケーションの UI コードをエクスポートすることができます。

- Android 用の XML ファイル
- UWP 用の XAML ファイル

以下のサンプルを Android にエクスポートしました。

![SampleView](https://gist.githubusercontent.com/tafuji/eeba48c32100be9fdd6d3d303d9b434d/raw/b7386bcad1b974e69f384937602580a7d9dd4f57/05-SampleView.png)

エクスポートした UI コードを Xamarin.Android プロジェクトに取り込んでみたのが、以下のスクリーンショットです。

![AndroidXml](https://gist.githubusercontent.com/tafuji/eeba48c32100be9fdd6d3d303d9b434d/raw/b7386bcad1b974e69f384937602580a7d9dd4f57/06-ExportedAndroidXml.png)

```ImageView``` の ```src``` 属性と ```Button``` の ```text``` 属性に適当な値を入れて、アプリケーションを実行した結果が以下のスクリーンショットです。

![AndroidXml](https://gist.githubusercontent.com/tafuji/eeba48c32100be9fdd6d3d303d9b434d/raw/b7386bcad1b974e69f384937602580a7d9dd4f57/07-Result.png)


## まとめ

- 良い点
    - お絵描き感覚で View がデザインできる点
        - 操作になれるのに時間がかかるかも
- 改善してほしい点
    - エクスポートしたコードに不要なタグが出力されているように見える
        - 例えば、Android にエクスポートした場合に、不要と思われる ```TextView``` 要素が出力されていた
            - 文字の編集、削除を何度か行っていたので、その残骸のようなものが残っているのかもしれない
    - テキストのサイズ調整が難しい
        - サイズを小さくする場合には、ペンで描きなおす必要がある
    - テキストを書く時の認識制度がよくない
        - OS が日本語環境だからかもしれませんが、英語、日本語ともに、なかなか認識してもらえません
            - 途中で、文字入力はあきらめました…
- 追加してほしい機能
    - コントロールの種類を増やしてほしい
    - カラーパレットがない
        - 手軽に View を描くことができるので、色も塗りたくなる
    - Xamarin.Forms の XAML にエクスポート機能
    - 複数の View が作成できるので、画面遷移も定義できるとうれしい

## 参考リンク

以下に参考になる YouTube のリンクを記載します。

- [YouTube: Ink to Code, a Microsoft Garage Project](https://www.youtube.com/watch?v=0xSnzh0pm5s)
- [YouTube: Drawing Xamarin Apps to Life with Ink to Code | The Xamarin Show](https://www.youtube.com/watch?v=45uKd5xbL9w)
Oracle勉強中。

## 概要
- 最近OracleDBやる機会があったので、基礎知識から整理。
- 内容は大したことないです。自分のメモ用です。
- 書いてないところも気が向いたら更新するかも。

## 基礎知識
- SGA：System Grobal Area -> プロセス間で共有するメモリ領域。バッファやらキャッシュやら。
    - データベースバッファキャッシュ：同じブロックの読み取りを効率化（キャッシュ）、メモリ・ディスクの処理性能差を埋める（バッファ）

- SID：インスタンスに紐づく固有の識別子

- マルチテナント
    - 複数のDB（PDB：プラガブルDB）を１つのCDB(コンテナDB)に統合し、1つのインスタンスで管理する

- リスナー
    - 接続要求を受けたらプロセスを生成する
    - セッション自体はサーバプロセスとクライアント間で確立される
    - ローカルの場合はリスナーを使用せずにDBプロセスに直接接続できる

- Oracle12cからマルチスレッド実行モデル
    - 一度に実行するプロセス数が減る

- バックグラウンドプロセス
    - SMON：インスタンスの状態監視
    - PMON：プロセス状態監視
    - CKPT：チェックポイントを各ファイルに書き込む

- Sharding
    - 複数のサーバを単一の論理DBに
    - https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1201492_2274.html
    - 　Oracle は GDS(Global Data Services)を使う
        - 　どのShardにデータがあるかなど・・・
    - 　Sharding KeyがどのShardにデータを入れるかきめる


## 高可用性
TAF
http://otndnld.oracle.co.jp/tech/oci/pdf/taf_10.2.pdf

http://www.oracle.com/technetwork/jp/database/availability/client-failover-2280805-ja.pdf

## ASM
http://www.oracle.com/technetwork/jp/database/database-technologies/cloud-storage/oracle-12c-asm-overview-1965430-ja.pdf



## Oracle Enterprise Manager

## Oracle Real Application Cluster
- Cache Fusion：複数ノードのデータの一貫性を自動的に保持
    - キャッシュミスの場合、リモートノードのメモリ上からデータブロックを転送

## Oracle Advanced Security
https://www.oracle.com/assets/advanced-security-wp-12c-1896139-ja.pdf
DB暗号化

- TDE
    - Disk IOで暗号化/複合化
    - Oracle Wallet(11gまで)/Oracle Keystoreにマスタ暗号鍵が格納
    - マスタは列暗号鍵、表領域暗号鍵を暗号化
- RMANも暗号化

## Oracle Vault
特権ユーザのアクセスコントロール
IPアドレスや時間帯によって制御

## Oracle Goldengate
バージョンの異なるOS/DB間でのレプリケーションを実現

- REDOログから更新情報を抽出
- Trailファイルに格納
- Trailファイルから転送
- 転送した先でTrailファイルに格納
- Trailファイルから更新分についてSQLに変換し、DBを更新

## Oracle Active Dataguard

## Oracle Database Replay

## Oracle Real Application Testing

## PDB

## 参考URL
http://www.oracle.com/technetwork/jp/ondemand/db-technique/b-3-rac-1484714-ja.pdf
http://www.oracle.com/technetwork/jp/ondemand/db-technique/d-4-rac11gr2-1448379-ja.pdf
windows server 2016 停止手順

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/262410/43cc4aa6-da9e-2059-d736-454146cbca6f.jpeg)

スタートボタンクリック

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/262410/52271aef-9a12-fda8-8b13-186dc8a33ff0.jpeg)

メニュー出ます

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/262410/a0064efa-3832-4b06-0c43-8dffe5a6dfdc.jpeg)

シャットダウン押します

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/262410/d4ba7b70-a428-8001-23de-5fb085b1b001.jpeg)

適当な理由を選びます

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/262410/a5476e04-d316-d7a6-97f2-f20303ab93ae.jpeg)

続行でシャットダウン
Python Oracleで取得したデータをDataFrameに入れてpandasで棒グラフ表示

#Oracleから取得したデータをお手軽にグラフにする

Oracleからデータを取得してグラフする簡単なコード

```python:ora_graph.py
import cx_Oracle
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

#サーバ名 / IP
HOST = "xxxxx"
#ポート
PORT = 1521
#SID
SID = "orcl"

tns = cx_Oracle.makedsn(HOST, PORT, SID)
conn = cx_Oracle.connect("scott", "tiger", tns)

#SCOOTユーザのEMP表でJOB単位でSAL列を集計
#ここでdataFrameに結果を格納
df = pd.read_sql_query(
    "  select job,sum(sal) as sal from emp5 group by job ",conn)

conn.close

#x軸を JOBにするため、インデックス変更
df.set_index('JOB',inplace=True)

fig = plt.figure(figsize=(5, 3))
ax = fig.add_subplot(1,1,1)

#棒グラフ
df.plot(ax =ax ,kind='bar')

#表示調整
plt.title("SALARY SUM", fontsize=12)
plt.xlabel("", fontsize=7)
plt.ylabel("", fontsize=7)
plt.subplots_adjust(bottom = 0.3)
plt.tick_params(labelsize=7)

plt.show()

```

plt.show()で出た画面

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261475/36df9c8c-4869-fc47-24c9-ab6a99cf324e.png)

#コードの補足

Python で Oracleに接続する方法は、前の投稿を参照ください
>Windows環境のPythonからOracleに接続してみる
-　https://qiita.com/kngsym2018/items/04514d623248a070adee

>PythonからOracle接続をSID指定ではなく、SERVICE_NAME指定で接続する
-　https://qiita.com/kngsym2018/items/f50499dc235db5dd0736



SQLで取得したデータをDataFrameに格納。

pandas.read_sql_query を使用します。
引数はSQL文とDBコネクション を設定して、
戻り値は DataFrameにデータが格納された状態で戻ります。

```python

df = pd.read_sql_query(
    "  select job,sum(sal) as sal from emp5 group by job ",conn)
```

取得したDataFrameの結果イメージ
(jupyterで確認)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261475/41811f3c-7c6f-fdcb-411c-630ecab96f94.png)


インデックスが自動で作成された状態でDataFrameが作成される。


pandasでグラフ作成する際、デフォルトだと x軸はインデックスなので、インデックスを[JOB]に変更
set_indexで列を指定、inplaceでそのDataFrameのインデックスを変更。

```python

#x軸を JOBにするため、インデックス変更
df.set_index('JOB',inplace=True)
```

インデックスを変更した後のイメージ
(jupyterで確認)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261475/96918665-68ad-4680-dee4-a527795cbd38.png)



上記処理をしてグラフ作成。

x軸が名称になっているので
plt.show()で出た画面を出すと文字が切れてしまいました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261475/b26dacaf-7d6c-d2c9-a0e1-233f386fc1cf.png)


なので、名称が全てでるように
plt.subplots_adjust　で調整しました。

```python

plt.subplots_adjust(bottom = 0.3)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261475/2d0fac29-fa1a-f468-bc41-ecb312518dd6.png)




#追記　グラフのx軸設定

df.plot の引数に x軸の列、y軸の列を指定することでもグラフは作成できますね。

```python

# x軸を JOBにするため、インデックス変更　をコメント
#df.set_index('JOB',inplace=True)

fig = plt.figure(figsize=(5, 3))
ax = fig.add_subplot(1,1,1)

# x軸、y軸を指定
df.plot(ax =ax ,kind='bar',x='JOB',y='SAL')
```

plt.show()で出た画面。
ちゃんとできた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261475/f9f11da1-d973-d7a8-a228-d0f712c9bf3b.png)

たけど、軸ごとに色が違う。。
Vagrant+WIndows10+VirtualBoxで共有フォルダを作るときのメモ

自分用のざっくりメモです。お役に立てれば幸いです。

Windows10 OS上で、VirtualBoxで立てたCentOS7とフォルダを共有したいと思ったのですが、大分詰まってしまいメモを残します。

この手の記事を見てる人は、Virtual Box上からGuest Additionsを入れるとかいろいろやった人かもしれません。(僕もよく中身もわかっていないままやろうとしたので詰まりました。)

ですが、一番手っ取り早かったのは、VagrantのVagrantfileを修正することでした。

多分、手元にあるvagrantfileには以下の一文があるはず。<br><br><br><br>



####"  #config.vm.synced_folder "../data", "/vagrant_data"     "<br><br><br><br><br><br>



なんのこっちゃ知らんという人のために言うと、これはホストOSとゲストOSの共有フォルダのパスを表しています。
左のダブルクォーテーションがホスト、右がゲストです。
僕は試しにここを、<br><br><br><br>

####"#config.vm.synced_folder "../data", "/vagrant_data" "<br>
→
####"" config.vm.synced_folder "D:/share", "/vagrant_data" "<br><br><br><br>
と#を外してパスを書き直しました。

その後、再度、vagrant up でCentOSを起動すると、、、、

Guest Additionsがないから、いれろよボケといわれてしまいました。。。<br><br><br>

結局、そこに戻るのかとほほと思いつつ、気を取り直してggrっていると、<br><br>

####vagrant plugin install vagrant-vbguest<br><br><br>

をたたけば、Guest Additionsを勝手にインストール(or更新)してくれるという記事が、、


さっそく、再度このコマンドをたたき、vagrant upを実行。

とりあえず、インストールし終わった後、フォルダを見るとD/Share, /vagrant_dataフォルダができていることを確認。

試しに、D:/shareにテキストファイルを入れて、CentOS側でも確認すると、

共有できてました！！

<br><br><br><br>
とまあこんな感じで、VirtualBox マネージャー側の設定を触らなくても、共有フォルダの設定をすることはできました。

私も初心者なので、間違えていたらごめんなさい。



以上です。
AWS CLIについて

# AWS CLIとは
AWSのサービスとやり取りするためのコマンド群
AWSマネジメントコンソールで提供されるすべての機能をコマンドで操作できる、と公式が言ってる

## インストール
```bash
$ pip install awscli --upgrade
```
注：公式は--userオプションをつけてるがpathの設定が面倒なのではずした


```bash
$ aws --version
aws-cli/1.15.32 Python/3.6.5 Darwin/17.5.0 botocore/1.10.32
```

```bash
$ aws configure
AWS Access Key ID [None]: *********************
AWS Secret Access Key [None]: F6NV9idI5AyxZqY6jisSehOvbWQU5qSAtkfXv3mF
Default region name [None]: F6NV9idI5AyxZqY6jisSehOvbWQU5qSAtkfXv3mF
Default output format [None]: json
```

## 参考
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html
sessionStorageを扱う

#Sessionのテンプレート

```js
//セッションへの格納
window.sessionStorage.setItem(['Key'],['Body']);

//セッションの個数の取得
window.sessionStorage.length

//セッションのBodyの取得
window.sessionStorage.getItem(['key']);

//指定したセッションの削除
window.sessionStorage.removeItem(['key']);

//全てのセッションの削除
window.sessionStorage.clear();
```

#例

```js
window.sessionStorage.setItem(['unique'],['UniqUniq']);
window.sessionStorage.setItem(['personality'],['PersPers']);

var test_size = window.sessionStorage.length
console.log(test_size); 
//結果 => 2

var test = window.sessionStorage.getItem(['unique']);
console.log(test);
//結果　=> UniqUniq

window.sessionStorage.removeItem(['unique']);
var test = window.sessionStorage.getItem(['unique']);
console.log(test);
//結果 => nil

window.sessionStorage.clear();
var test1 = window.sessionStorage.getItem(['unique']);
var test2 = window.sessionStorage.getItem(['personality']);
console.log(test1);
console.log(test2);
//結果=> nil
//　　　　　　　　　  nil
```
【ESP32】ロケットの電装を制作してみた話

#制御が必要
電子工作を初めてまもない私がしばらくやっていて変わったことがある。例えば、冷蔵庫でも最近のものは手をかざすだけで扉が開閉する仕組みの物が多い。
これは、人感センサーで手の存在を判定し、マイコン=制御部を通して、ドアパッキンが解除したりしているんだなあと仕組みを考えるようになった。
意外と簡単な仕組みだなあ！と思いつつ、完全な動作を実行するまでの設計やエラー、実装はやってみると血の滲むよう。

#電装
電装自体の基礎部は完成した。
フライトピンが解除されると(=ロケットの発射)、ロケットに載っているセンサーデータを取得して、そのデータでパラシュートを開閉するといったもの。

完成したものはこんな感じ。

![fullsizeoutput_3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/253129/bde4400d-4049-29ee-0789-d5a889bd620a.jpeg)

開発途中。テスト用のマイコンと動作用のマイコンが仲良く並んでいる。

![IMG_6028.JPG](https://qiita-image-store.s3.amazonaws.com/0/253129/a4da9e65-fa40-c6c1-2dd5-836c07fc3985.jpeg)

#材料
- Arduino IDE
- ESP-WROOM-32
- MPU9250[9軸センサー]
- BMP180[温度湿度気圧センサー]
- CK-40[microSDモジュール]
- SG92R[サーボモーター]
- 9V電池
- 三端子レギュレータ(9Vから降圧)

#困った点
- SDモジュールとの連携(SPI通信の不良)
- ESP32の度重なる書き込みエラー

ESP32では指定ピンや電子回路、ドライバの問題で度重なるエラーが出た。本来ならArduino類のAVRマイコンで実装するのだが、新しいマイコンにチャレンジしたいとのことでESP32を選んだ。だから、エラーの連鎖には少し泣きそうになった。

#プログラム
githubを見て！
おそらくまだ修正箇所はあるので随時編集していくよ！

https://github.com/LostGeneration1999/ESP32_rocket

#習得した点
- ハードウェアに関する興味
- I2CやSPI,PWM制御に関する知識
- Arduino環境の基礎理解とプログラム
- 簡易な電子回路を組む力
- 下手な半田付け能力(もっと練習せねば)

#今後の課題
- デバッグ能力もっとくれ
- GPSモジュールや高温度センサーの使用(別基盤)
- パラシュートにおける分離にプログラムの微調整
- 取得センサー値における初期値の微調整
- データを解析しやすいように(csvに投げれるように)微調整
- 固定

#ハード関連で今後したいこと
- XbeeやTwe-liteなどの無線通信の活用
- AWS IoTを使ったサーバーレスなIoT
- KiCADマスター

#参考文献
[ESP32勉強会③](https://qiita.com/networkyohan69/items/f40dd4e63d2d85bbc968)
Chefでユーザーによるdeep_mergeを必要としないnodeオブジェクトのjson書き出し

レシピの最後のあたりで、以下の様に書く。

Rubyの地の文で書く例

```ruby:recipes/default.rb

...

require 'json'
IO.write('/tmp/node.json', JSON.pretty_generate(node.to_hash))
```


nodeオブジェクトはhashを拡張したもの(mash)で、.to_hashでdefault, force_defaultなどがマージされる。

attributeの値のチェックのみならこれで良いが、レシピ実行により変更されたOSの最新情報も取り込みたいのであれば、ohaiをリロードして、Ruby blockで書き出す。

ruby_blockによる例

```ruby:recipes/default.rb

...

ohai 'reload'

ruby_block 'write node.json' do
  block do
    require 'json'
    IO.write('/tmp/node.json', JSON.pretty_generate(node.to_hash))
  end
end
```


#参考
[ChefのAttributeについて](http://metasearch.osdn.jp/wiki/index.php?Chef%A4%CEAttribute%A4%CB%A4%C4%A4%A4%A4%C6)
要素がarrayの場合、レベルによってマージのされ方が異なる。なのでユーザーによる安易なマージは危険かもしれない。マージはChef自身にさせた方が無難か。

[InSpecでchefのattributeを使う](https://qiita.com/dai624fuji/items/0da0544c9cff153ef230)
書き出したattributeをInSpecで使う方法