OmniAICreator/Qiita-1.07M huggingface dataset:
FreeBSDにApacheをインストールする準備

# FreeBSDの導入

今回はVirtualBoxを仮想化ソフトウェアを自分のパソコンにインストールし、FreeBSDにWebサーバとしてのフリーソフトウェアをインストールして作業を行いたいと思います。

 - VirtualBox
 - FreeBSD
 - Apache

今回主に使っていくのは以上の３つのソフトウェアになります。なぜ今回このような記事を書いていくかというと、Apacheに関して勉強していこうと思ったけど、書籍やネットで書かれたことはCentOSやUbuntuがほとんど…FreeBSDに関する情報はごくわずか！これでは私も含め今後勉強しようと思った人も苦労する…というわけで書いていきます。作業していくにあたって必要があればプラスαでインストールしながら書いていこうと思います。それでは早速やっていきましょう。

ちなみに今回技術評論社の **「サーバの構成の実際がわかるApahce[実践]運用/管理　鶴長鎮一[著]」** と言う書籍をベースに進めていきます。この書籍もCentOSやUbuntu向けに書かれているので、FreeBSD版に翻訳しながら進めていきたいと思います。
## VirtualBoxのインストール  


まずは、これからガンガン作業を行なっていく作業場のVirtualBoxですが、これは様々なWebサイトに掲載されていると思うので省略したいと思います。
VirtualBox公式Web：https://www.virtualbox.org



## FreeBSDのインストール

さていよいよ先ほどインストールしたVirtualBoxに新たなOSをインストールします。まずはVirtualBox上にFreeBSDの箱？を作ってあげましょう。箱の作り方はこちら↓ https://qiita.com/ken1ma/items/86748d03c2e8c192dce6
だいたい２．までやってくれれば大丈夫です。  

次にFreeBSDを使っている端末にダウンロードします。以下のURLから画面中央のDownloadFreeBSDをクリック。https://www.freebsd.org
![image_2.png](https://qiita-image-store.s3.amazonaws.com/0/241572/a0a7f7c6-0d6e-b548-8693-ba13afa07475.png)







そしてInstaller Imagesのamd64をクリック。今回はディスクイメージをダウンロードしたいのでFreeBSD-11.1-RELEASE-amd64-disc1.isoをクリック。
![image_3.png](https://qiita-image-store.s3.amazonaws.com/0/241572/6ef4a583-7c27-92c3-d209-f7d6e92ddb92.png)





 
さあそれでは先ほど作った箱にFreeBSDを入れていきます。VirtualBox初期画面からFreeBSDを選択し、設定をクリック。
![image_1.png](https://qiita-image-store.s3.amazonaws.com/0/241572/cfa6bee5-8038-0425-3abf-cdfbeef218ac.png)





メニューバーからストレージをクリックし、「空」を選択した状態にする。そして「IDEプライマリスレーブ」横のディスク（DVDのような画像）をクリックし「仮想光学ディスクファイルを選択」を選択クリックし、先ほどダウンロードしたFreeBSDの.isoファイルを選択。
![image_4.png](https://qiita-image-store.s3.amazonaws.com/0/241572/8a45c9ad-506c-e091-5ece-3c651fb2c4c8.png)





ここまでできたらOKを押して設定画面を閉じます。
VirtualBox初期画面からFreeBSDを選択して「起動」をクリック。FreeBSDの様々な設定をしていきますがここも他のWebサイトを活用して欲しいと思います。今回はここまでにしておきます。次回は適当なユーザーをFreeBSD内で作成したことを前提に様々な設定をしていきたいと思います。
[Swift] 便利なビット操作5つ

# はじめに
昔ビットボードを実装した時に定義した関数たち

*覚えたてで書いたものであり、最速/最適な手法ではありません。例えばビットカウントは、[Goの標準パッケージ"math"](https://golang.org/src/math/bits/bits.go?s=4586:4616#L124)に見られるような書き方が良さそうです。

# 1. ビットを逆向きにする
例: **0x800E000000000000 → 0x000000000000E008**

```swift
func bitReverse(_ bit: UInt64) -> UInt64 {
    var bit_revesed: UInt64 = 0x0000000000000000
    // 左右両端を起点とするmask
    var mask: UInt64  = 0x8000000000000000
    var mask_: UInt64 = 0x0000000000000001
    // 逆向きのビット列を生成する
    for _ in 0..<64 {
        if bit & mask == mask {
            bit_revesed = bit_revesed | mask_
        }
        mask = mask >> 1
        mask_ = mask_ << 1
    }
    return bit_revesed
}
```

# 2. 「0」の数をカウントする
```swift
func bitCount(_ num: UInt64) -> Int {
    var mask: UInt64 = 0x8000000000000000
    var count: Int = 0
    for _ in 0..<64 {
        if mask & num != 0 {
            count += 1
        }
        mask = mask >> 1
    }
    return count
}
```

# 3. 立っているフラグの位置を取得する
```swift
// 注： フラグが複数立っている場合は、最初の位置を返す
func getFlagPlace(bit: UInt64) -> Int {
    var mask : UInt64 = 0x8000000000000000
    for i in 1..<64+1 {
        if mask == (mask & bit) {
            return i
        }
        mask = mask >> 1
    }
    return -1
}
```

# 4. 指定した位置にフラグが立っているか
```swift
// 注： placeは0~63
func isFlag(bit: UInt64, place: Int) -> Bool {
    let mask : UInt64 = 0x8000000000000000 >> place
    return mask == (mask & bit)
}
```

# 5. 指定した位置のみを「0」にする
```swift
// 注： placeは0~63
func dropFlag(bit: UInt64, place: Int) -> UInt64 {
    var mask : UInt64 = 0x8000000000000000
    var x: UInt64 = 0
    for i in 1..<64+1 {
        if i == place+1 {
            mask = mask >> 1
            continue
        }
        if mask == (mask & bit) {
            x |= mask
        }
        mask = mask >> 1
    }
    return x
}
```
pythonで2進数を表す

## そもそも2進数とは？
2進数は英語で「binary number」と言います。

いきなり2進数と言われても、意外と忘れていることも、、、
（僕は完全忘れていました（笑））

そもそも2進数ってなんだろう？
調べてみると分かりやすいサイトがありました！

http://www.infonet.co.jp/ueyama/ip/glossary/binary_g.html

##pythonで2進数を表すには？

pythonで2進数を表す方法には以下の2つが考えられます。

(a)1と0で表された整数（または文字列）を2進数として扱う
(b)ある数値を2進数表記の文字列に変換

詳しく見てみましょう。

###(a)1と0で表された整数（または文字列）を2進数として扱う
1と0で表せれた整数の型がint型の場合は、プレフィックス0bをつけると整数を2進数として扱うことができます。
  
```
bin_num = 0b10
# 2
```
ちなみに得られた値の方はint型です。
  
```
print(type(bin_num))
# <class 'int'>
```

　
　
次に1と0で表された整数の型がstr型であれば
　
int(文字列, 基数)で基数をもとに2進数表記の数値に変換できます。ちなみに基数を省略した場合は10進数とみなされます。
　


```
bin_num = int('10', 2)
# 2
```
　

また、基数を0にすると、文字列のプレフィックス（0b）をもとに変換されます。
　
  
```
bin_num = int('0b10', 0)
# 2
```
　

###(b)ある数値を2進数表記の文字列に変換

```
bin_str = bin(13)
# 0b1100
 
print(type(bin_str))
# <class 'str'>
```

 
みごと10進数を2進数の文字列に表すことができました！
　
また、format()関数でも表すことができます。この場合はプレフィックス（0b）はつきません。
　

```
bin_str = format(13, 'b')
print(bin_str)
# 1100
```
 
　
　
以上がpythonで2進数を表す方法になります。
他にも方法があると思うので、もっと詳しく調べてみます！

　


>引用
　
2進数以外も載っているのでおすすめです。
>>https://note.nkmk.me/python-bin-oct-hex-int-format/
正規表現総まとめ！！

正規表現とは、いろんな文字列を一つの形式で表現するためのものです。
「正規表現とは」は調べたらいくらでも出てくるので、そちらをご覧ください

#文字や数字
特定の文字は<strong>a,b,c,d,e...</strong>など
特定の数字は<strong>1,2,3,4,5...</strong>など

何でもいいけど、とりあえず数字！「1」でも[2]でもいいけど、とりあえず数字を指定したい！っていうときは、「<strong>\d</strong>」
数字は英語で「digits」なので、digitsの「d」ですね、きっと。

数字以外！「a」でも「b」でもいいけど、とりえず数字以外を指定したい！っていうときは「<strong>\D</strong>」です。

任意の英数字を表すときは、<strong>\w</strong>で、
任意の英数字以外の文字を表すときは<strong>\W</strong>です。


#ワイルドカード
.(ピリオド)は任意の単一の文字を表します(文字、数字、空白など全て)

でも、任意の単一の文字ではなく、普通にピリオドを使いたい！っていうときは<strong>「\ .」</strong>

#特定の文字のマッチング
<strong>a,b,cのどれか一文字</strong>というのは、<strong>[abc]</strong>と表します。

例えば、
aii
iii
uii

という文字列を全て正規表現で表現しようとすれば、
[aiu]ii
となります。

#特定の文字を除外する
先ほどは特定の文字とマッチングしましたが、逆に特定の文字を除外します。
つまり、「この文字は入れないで」っていう正規表現ですね。

除外する際は<strong>「^(ハット)」</strong>の記号を使います。

<strong>[^abc]</strong>とした場合、意味は、<strong>aでもbでもcでもない任意の一文字</strong>という意味になります。

※排除する意味でのハットは、[](大括弧の中)で使います。^a とすると、この場合ハットは「行頭」を意味します。詳しくは後ほど。

例えば、
aii　※入れたい
iii　※入れたい
uii　※入れたくない
があるとしたら、

[^u]ii
と表せます。


#連続した文字のうちの1文字が一致

連続した文字を表したい場合は、<strong>「-(ダッシュ)」</strong>を用います。
<strong>[0-9]</strong>は<strong>0から9までの数字のうちの1つ</strong>を意味します。
<strong>[^ad]</strong>は<strong>aからdまでのうちの1文字以外</strong>を意味します。

#文字の繰り返し
<strong>中括弧</strong>を使用して、文字の繰り返しを表現します。

w{3}は「w」がちょうど3回繰り返している表現にマッチ ⇒ www
w{,3}は「w」が3回までの繰り返しにマッチ ⇒ w, ww, www
w{2,3}は「w」が1回以上3回以下の繰り返しにマッチ　⇒　ww, www

#直前のパターンの繰り返し
<strong>直前のパターンを0回以上繰り返し</strong>は<strong>「*(アスタリスク)」</strong>を用います。

さらに、<strong>直前のパターンを1回以上繰り返し</strong>は<strong>「+(プラス)」</strong>を用います。

たとえば、
b+ は<strong>1つ以上のb</strong>
[abc]+ は<strong>任意のaかbかcが1つ以上</strong>

#直前の文字が0回又は1回

<strong>「?(クエスチョンマーク)」</strong>は、<strong>直前の文字が0回又は一回だけ登場すること</strong>を意味します。

たとえば、
ab?d　は、「abd」もしくは「abbd」にマッチします。

#空白、タブ、改行、キャリッジリターン
正規表現で<strong>空白</strong>を表現するには、一般的に<strong>「\s」</strong>で、
<strong>空白以外</strong>を表現するのは<strong>「\S」</strong>

他にも、
<strong>「　(スペース)」「\t(タブ)」「\n(改行)」「\R(キャリッジリターン)」</strong>などがある。

※キャリッジリターンは、カーソルを文頭へ戻すこと示す記号らしいです。

#開始と終了

<strong<^(ハット)</strong>は<strong>「行頭(開始)」</strong>を表す際にも使われます。

一方で、<strong>「行末(終了)」</strong>は<strong>$(ドル)</strong>を使います。

たとえば、
^abc は　abcで始まる文を参照します
abc$ は　abcで終わる文を参照します


#ファイル名を取得

例えば、fileから始まって.jpgで終わるファイルがあるとする
「file_kamogawa.jpg」
「file_osaka.jpg」　みたいな。

この場合は、

^(file.+)\.jpg$

このように書きます。

この丸括弧内の表現は、後で処理するために一時的に記憶できるらしいです。

また、丸かっこで囲まれた部分はひとまとまりと認識されるようです、


#条件(OR)
<strong>または</strong>は、「|」で表されます。
cats or dogs とやりたい場合、、、

cats|dogs
でおっけーです！

#その他の特殊文字
単語の境界を「\b」で表します。
例えば、\bday とすると、単語の境界部分から「day」で始まる文字列を参照してくれます。

これに関しては、以下のサイトがおすすめ
[単語境界/非単語境界(¥b, ¥B)](https://www.javadrive.jp/regex/anchor/index5.html)


#おわり
とりあえず、こんな感じです。
Firebase for Unity の過去バージョン取得

以下のページから、Firebase for Unity の最新版はダウンロードできますが、
[Unity プロジェクトに Firebase を追加する](https://firebase.google.com/docs/unity/setup?hl=ja) 
なぜか過去バージョンがダウンロードできない。
リリースノートのページからもダウンロードリンクがありません。
[Firebase Unity SDK Release Notes](https://firebase.google.com/support/release-notes/unity)

どうしても過去バージョンが欲しい場合は、自分でURLを作ってアクセスすればダウンロードできます。
https://dl.google.com/firebase/sdk/unity/firebase_unity_sdk_[バージョン番号].zip

ex.) 
4.4.0 が欲しい場合
https://dl.google.com/firebase/sdk/unity/firebase_unity_sdk_4.4.0.zip
Atomでjsxを扱う時に設定すると便利なやつ

# 概要

Atomで .jsxのファイルを開くと、標準だとJavaScriptスニペットとして扱ってくれないのでメモ

# インストールするもの

* [react](https://atom.io/packages/react)(atomのパッケージ)
* [emmet](https://qiita.com/nishina555/items/968f9eaca325304f58d2)(jsx記述でもHTML保管してくれる)

# 手順

1.ターミナルで

```
apm install emmet
```

2.Atomのkeymapファイルに

```
'atom-text-editor[data-grammar="source js jsx"]':
  'tab': 'emmet:expand-abbreviation-with-tab'
```
Atom -> Keymapを選択するとkeymap.csonというファイルが開く

3.Atomにて、 `react`パッケージをインストール


## あぁ、最高
IFSを変更せずにmysqlのselectの結果（複数カラム）をbashの変数に入れる

##環境

使用したbashのバージョンです

```bash
$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

##ソースの前に・・・

当初、いろいろググってみたところ本件と同じようなことを紹介しているサイトが
多々見つかったのですが
bashの環境変数に **IFS** というものがあって
これを使用したソースしか見つけられませんでした。

個人的にこういったグローバル的なものは一時的にでもなるべく変更しない
方がよい、と考えているので

これを使わないでどうにか組めないものかと色々やってみた結果になります。

##ソースです

```
#!/bin/bash

sql="select id, name from MEMBER where age < 20"

result=$(mysql --defaults-extra-file=db.conf -B -N -e "${sql}")
if [[ $? -eq 0 ]]; then
  echo "${result}" | while read data
  do
    column=(`echo "$data"`)
    echo "col1=${column[0]}"
    echo "col2=${column[1]}"
  done
else
  echo "db error."
  exit 1
fi

exit 0
```

###出力結果

```
$ ./hogehoge.sh
col1=1
col2=hoge1
col1=2
col2=hoge2
col1=3
col2=hoge3
col1=4
col2=hoge4
col1=5
col2=hoge5
col1=6
col2=hoge6
col1=8
col2=hoge8
col1=9
col2=hoge9
col1=10
col2=hoge10
```

##説明です

上から順に説明します

>>sql="select id, name from MEMBER where age < 20"

>実行するSQLの定義です（説明略）

<br>
>>result=\$(mysql --defaults-extra-file=db.conf -B -N -e "\${sql}")

>mysqlコマンドでsqlを実行します
>一応使用しているオプションの説明です

>--defaults-extra-file=db.conf
>接続情報を書いたコンフィグファイルの指定です。
>
>-Bオプションは列をTAB区切りにする指定
>-Nオプションは列名を非表示にする指定
>-eオプションでSQL指定

<br>
>>if [[ \$? -eq 0 ]]; then

>SQLが正常に投げれたかどうかを判定

<br>
>>  echo "\${result}" | while read data
>>  do
>>
>>  done

>SQLの結果分ループする
>data変数に1レコード分の結果が入っています。

<br>
>>    column=(`echo "\$data"`)

>data変数を配列に変換

<br>
>>    echo "col1=\${column[0]}"
>>    echo "col2=\${column[1]}"

>結果を出力。
>ここで配列に入っている変数を料理する

<br>

こんな感じです

##あとがきとか

selectするカラムが一つしかないときは、スルスルっといけるんですよね・・
複数列の取得になったとたんに面倒に・・・

当初、for ~ in
でやっていたんですが、これだと **IFS** をいじらないとダメでした・・・
while read に変更してうまくいったんですが
[readするときはIFS=を付けておくとstrictな感じで気持ちが良い](https://qiita.com/kawaz/items/00a4b1693bf4cf67e8ca)
という記事もありますし・・・

自分のメモ用/備忘録として投稿しますが
皆様の参考になれば幸いです
Lambda経由でNew RelicにRDSの拡張メトリクスを送る by AWS Serverless Application Repository

# はじめに
AWS Serverless Application RepositoryにNew Relicのメソッドが追加されました。
AWS Serverless Application Repositoryとは、ユーザが作成したLambda Functionをパブリックに共有したり、すでにAWS Serverless Application Repositoryに公開されているLambda Functionの中から、ユーザが自由に選択して使用することができるサービスです。

New Relicでは、INFRASTRUCTUREのAWS Integration機能を使用することで、多くの[AWSサービスのモニタリングを簡単に始めることができます](https://qiita.com/KUROPON/items/c5a6e0aff2fd8b850da0)が、RDSの拡張モニタリングによるメトリクスなどは取得することができません。

今回New Relicは、AWS Serverless Application Repository上に「NewRelic-log-ingestion」を公開しました。このLambda関数を使用することによって、VPCのFlow LogsやRDSの拡張モニタリングで取得可能なメトリクスをモニタリングできるようになります。

# NewRelic-log-ingestion機能概要
"NewRelic-log-ingestion"は、RDSの拡張モニタリングのメトリクスやVPC Flow Logsといった、デフォルトのAWS Integration機能では取得できない値を取得するためのLambda関数です。仕組みとしては、CloudWatch Logsにたまる上記のメトリクスをLmabda経由でNew Relic INFRASTRUCTUREに送る形となります。

それでは、設定方法をご説明します。

# 設定手順
## 1. 必要情報
あらかじめ、設定に必要な下記2点の情報を取得します。KMSキーは、New Relicライセンスキーを暗号化するために必要ですので、発行するようにしてください。

- New Relicのライセンスキー
- KMS暗号化キー(New Relicライセンスキーの暗号化に使用)

## 2. Lambda関数の作成
『関数の作成』画面で[サーバーレスアプリケーションのレポジトリ]を選択します。検索窓に「NewRelic-log-ingestion」と入力し、表示されたアプリケーションを選択します。

![SnapCrab_NoName_2018-3-12_13-33-34_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/dca0a20c-6356-0953-d7c5-8a6294e0c5bb.png)


『設定とデプロイ』画面で[Configure application parameters]のKmsKeyidにあらかじめ作成したKMSのKey ID(ARNの末尾)を入力します。

![SnapCrab_NoName_2018-3-12_13-40-27_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/6c2dfdbd-9304-3883-5929-f57743120881.png)

入力後、[Deploy]を実行します。

## 3. New Relicライセンスキーの設定
作成したLambda関数を開き、[環境変数]の「LICENSE_KEY」に自身のNew Relic License Keyを入力します。

![SnapCrab_NoName_2018-3-12_13-49-7_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/a53ef2f9-b1c5-83c7-7fff-3addc833d132.png)

次に[暗号化の設定]を開き、「伝送中の暗号化のためのヘルパーの有効化」を選択します。
伝送中に暗号化するKMSキーは、1で作成したKMSを指定します。その後、[環境変数]の「LICENSE_KEY」の横に表示された[暗号化]ボタンを押下します。

![SnapCrab_NoName_2018-3-12_13-50-49_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/2f34585a-29ee-4823-f8c2-1ff1839f1036.png)


## 4. トリガーの設定
最後に、メトリクスが保存されているAWSサービスをトリガーとして設定します。今回はRDSの拡張モニタリングメトリクスをCloudWatch Logsに保存しているため、これをトリガーとして設定します。

作成したLambda関数の[設定]から、[トリガーの追加]二表示されているサービス一覧から「[CloudWatch Logs]」を選択します。

次に[ロググループ]から、RDSの拡張モニタリングメトリクスの保存先に指定したグループを指定し、[フィルターの名前]に任意の値を入力、右下の[追加]を押します。

![SnapCrab_NoName_2018-3-12_13-54-42_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/6c3cdb82-46dc-f7e6-d34e-8f05db299279.png)

最後に画面上部の[保存]を押下します。

これで、Lambda関数を介して、New RelicにRDSの拡張メトリクスを飛ばす準備が整いました。

## 5. New Relic Insightsで確認
New RelicのInsightsを開き、『RDS enhanced monitoring』というダッシュボードを開きます。

![SnapCrab_NoName_2018-3-9_17-23-54_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/a947781b-8724-f016-537f-92c03657c994.png)

ダッシュボード画面にRDSの拡張モニタリングで取得可能なRDS OS部分のメトリクスが表示されることを確認します。

# おわりに
AWS Serverless Application RepositoryのNew Relicメソッドを使用することで、Lambda経由でRDSの拡張メトリクスを送るようになりました。同じ手順でVPC Flow LogsについてもNew Relicに飛ばすことができますので、是非試して見てください。
監査レコードの削除機能を試す (Oracle Database 12.2) 



# 監査データの保存先
監査はデータベースに対する操作を記録する機能です。Oracle Databaseはバージョンを重ねるに従い、様々な監査機能が追加されました。
Oracle Database 12cには以下の機能が提供されています。

* 標準監査
 * AUDIT文で監査設定を行います。監査データはOSのファイルまたはSYS.AUD$テーブルに保存されます。ファイルまたはテーブルに保存する設定は、初期化パラメーターaudit_trailで決定されます。監査データの出力先は、初期化パラメーターaudit_file_destでフォルダを指定します。

* ファイングレイン監査
 * 監査設定をより柔軟に設定できます。列単位やレコード単位に監査設定を変更できます。監査データはSYS.FGA_LOG$テーブルに保存されます。

* SYSユーザー監査
 * SYSユーザーが実行した操作を記録します。監査データはOSのファイルに保存されます。
　　監査データの出力先は、初期化パラメーターaudit_file_destでフォルダを指定します。

* 統合監査（UNIFIED AUDITING)
 * すべての監査設定を統合する機能です。Oracle Database 12cではこれまでの監査機能と統合監査機能が両方とも有効になっています。
   監査データの出力先は、SYSAUD.CLI_SWP%テーブルです。

# 監査データの削除機能
  監査データの管理を行うパッケージとして、DBMS_AUDIT_MGMTパッケージが提供されています。以下に監査データの削除を行うための手順を示します。DBMS_AUDIT_MGMTパッケージにより、テーブルに保存された監査データだけでなく、ファイルとして保存された監査データの削除も行うことができて便利です。
　マニュアル https://docs.oracle.com/cd/E82638_01/ARPLS/DBMS_AUDIT_MGMT.htm
 

## 初期化
DBMS_AUDIT_MGMTパッケージのINIT_CLEANUPプロシージャを実行します。パラメーターには、初期化を行う対象とデフォルトの保存日数（最大999）を指定します。

監査対象には以下の定数を使います。

|定数名|説明|
|:---|:---|
|AUDIT_TRAIL_ALL|すべての監査証跡タイプ|
|AUDIT_TRAIL_AUD_STD|標準監査のデータベース設定|
|AUDIT_TRAIL_DB_STD|標準監査、ファイングレイン監査のデータベース設定|
|AUDIT_TRAIL_FGA_STD|ファイングレイン監査のデータベース設定|
|AUDIT_TRAIL_FILES|OS設定またはXML設定|
|AUDIT_TRAIL_OS|OS設定|
|AUDIT_TRAIL_UNIFIED|統合監査|
|AUDIT_TRAIL_XML|XML設定|

例えば、標準監査とファイングレイン監査の設定を初期化し、デフォルト保存日数を最大の999に指定する場合は以下のSQLを実行します。このプロシージャには定数AUDIT_TRAIL_UNIFIEDは使えないようです。

```
SQL> BEGIN
       DBMS_AUDIT_MGMT.INIT_CLEANUP(
		audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD, 
		default_cleanup_interval => 999) ;
     END;
     /
```

## アーカイブ日付の設定
DBMS_AUDIT_MGMTパッケージのSET_LAST_ARCHIVE_TIMESTAMPプロシージャを使って不要になった監査データの日付を指定することができます。last_archive_timeパラメーターには、アーカイブ済（不要）となった時刻を協定世界時(UTC)で指定します。ローカル時刻からUTCに変換するにはSYS_EXTRACT_UTC関数が便利です。
例えば、60日以上古い標準監査データ（テーブル指定）が不要である場合、以下のように実行します。

```
SQL> BEGIN
	DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
		audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 
		last_archive_time => SYS_EXTRACT_UTC (CURRENT_TIMESTAMP - INTERVAL '60' DAY)
	) ;
     END;
     /

```

マニュアルには記載がありませんが、このプロシージャには、複数のタイプを示す定数AUDIT_TRAIL_DB_STD, AUDIT_TRAIL_ALL, AUDIT_TRAIL_FILESは指定できません。
各タイプに対して個別に時刻を指定する必要があります。このプロシージャを実行しても古い監査データが自動的に削除されるわけではありません。

## 監査データの削除
DBMS_AUDIT_MGMTパッケージのCLEAN_AUDIT_TRAILプロシージャを使って不要になった監査データを削除できます。
use_last_arch_timestampパラメーター（デフォルト TRUE）は、SET_LAST_ARCHIVE_TIMESTAMPパッケージで設定した時刻以前の監査データを削除する設定です。
FALSEに指定すると、全監査データを削除します。

```

SQL> BEGIN
    	DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL (
        	audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL, 
	        use_last_arch_timestamp => TRUE
    	);
     END;
     /

```

このプロシージャは複数のタイプをしめす定数AUDIT_TRAIL_DB_STD, AUDIT_TRAIL_ALL, AUDIT_TRAIL_FILESを指定することができます。
教えてもらったコードの理解を深める　

昨日教えてもらったコードのわからないところを調べて自分なりのコメントで説明を書いてみる。

```python:pwj.py

#パスワードジェネレーター ver1.0 (数字　アルファベット小文字大文字混合)
import random

# 0-9の数字とアルファベット大文字小文字の塊？を読み込む
from string import digits, ascii_letters

# charactersの中身は(0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)
characters = digits + ascii_letters

size = int(input("何ケタのパスワードにしますか？ "))

# ''で無を表している？ので　charactersからrandom.choiceで取り出している

password = ''.join(random.choice(characters) for _ in range(size))

print(password)
```

for _ in range(size) の処理は　作るときに求められた桁数を表示するための処理？でいいのかな・・・

今の段階で自分がよく見るforの書き方は

```
for i in range():
    print(i)
```
みたいなやつだったので　_ の部分とかは
どういう処理をしてるんだろう。。
LocalでRailsメールテスト開発環境構築とメールの内容確認

## LocalでRailsメールテスト開発環境構築とメールの内容確認
前提:
- VirtualBox
- 仮想マシン上でpostfixとdovcotをつかいます
- ゲストOSはcentos7.2
- メールは仮想マシンから外にでない
- Railsは既に入っている

(参考)  
[閉じられたネットワーク向けのテスト用メールサーバーを構築する](https://yoshinorin.net/2016/08/07/local-mailserver/)  
上記サイトがわかりやすいです。セットアップは上記を見ればいいかも

### システムのアップデート

```bash
yum -y update
```

### SELinux無効

```bash
vi /etc/selinux/config
SELINUXTYPE=disabled
```


### Postfixの設定(送信用)
インストールして自動起動するようにします。

```bash
sudo yum -y install postfix
sudo service postfix start
sudo chkconfig postfix on
```

Postfixの設定を変更します。  
`vi /etc/postfix/main.cf`

```bash
# 自身のドメイン設定
mydomain = mail-server.test
myorigin = $mydomain

# ローカルホスト以外からも受け付けます
inet_interfaces = all

# ipv4しか使用しないため
inet_protocols = ipv4

# 宛先ドメインに自身のドメインを追加します
mydestination = $myhostname, localhost.$mydomain, localhost, mail-server.test

# 初めはローカルホストで動かすため
mynetworks = localhost

# メールボックスの形式設定
home_mailbox = Maildir/
```

設定反映のためにPostfixを再起動、

`service postfix restart`

- メールテスト用のアカウントを１つ作成

```bash
# user1というアカウントを作成します。
useradd user1 -s /sbin/nologin
# 任意のパスワード入力
passwd ****

# user1が書き込みできるようにします
chmod 777 /var/spool/mail

sudo yum -y install telnet

```

### Dovecot(POP3,IMAPサーバ)
```bash
# インストール
yum -y install dovecot

# 起動
service dovecot start

# 自動起動
chkconfig dovecot on

vi /etc/dovecot/dovecot.conf

```
- 設定ファイル

```bash
# 使用するプロトコル列挙
  protocols = imap pop3 lmtp

# IPv4のみ使用。v6へのバインドを行わない
  listen = *
```

`vi /etc/dovecot/conf.d/10-mail.conf`

```bash
# ファイルの場所を指定
  mail_location = maildir:~/Maildir

```

`vi /etc/dovecot/conf.d/10-auth.conf`

```bash
# 平文認証の許可
  disable_plaintext_auth = no

  auth_mechanisms = plain login
```

設定反映のため、再起動

```bash
service dovecot restart
```
### Railsの設定を確認します。
`view ./config/environments/development.rb`
```ruby
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address: "localhost",
  port: 25,
  enable_starttls_auto: false
}
```

### テスト実施/メールの内容確認
(宛先 user1@mail-server.testで)メール発信テストすると  
/home/user1/Maildir/newにファイルができます。  
(なければ/home/user1/Maildir/cur にはいってるかも)   

`su root -`して  

```bash
cd /home/user1/Maildir/new; chmod a+rw *; cp 対象mail /tmp/test1
exit;
```


`vi /tmp/test1`してファイルのbase64エンコード部分だけ別ファイルに切り出します。    
できたファイルは下記で開いてメールの内容を確認できます。

`cat /tmp/betsu_file | base64 -d `
Fラン大学生が始める始めるウェブ制作

どうも、こんにちは！
大学では文系でプログラミングとは無縁だった人生を送ってきたハルちゃんです。
数ヶ月プログラミングをしてきたので記事的なものを投稿できたらと思います。
<h1>自己紹介</h1>
某Fラン大学に通っている大学３年生です。
就職先はIT企業に決定しておりそこで今後もプログラマーとして力をつけて行こうと思っております。
触れる言語はPHPとJavaになりますがJavaの方は最近全く触っていないので記事の投稿は少なさそうです笑

数ヶ月間全て独学で得た知識となりますので、よろしければご指摘の方をよろしくお願いいたします。
と、まぁ自己紹介はこの辺で、、、

<h2>早速ですが！初投稿の内容ですが</h2>
- 画像投稿画面の作成
- 投稿の確認

投稿した画像のパスはデータベースに保存したいと思いますのでデータベースを１つ用意しておきます。

最初に簡単なカラムを用意します。

<img width="569" alt="スクリーンショット 2018-03-12 14.54.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/240422/b13f470b-93c7-26af-2112-ae74ffb9a141.png">

create table テーブル名(~)でテーブルは作成できます。
次に投稿ページの用意をします。
<img width="712" alt="スクリーンショット 2018-03-12 15.05.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/240422/35b4c020-2ee7-146d-a4f2-a67cceafe4db.png">

次にアップロード完了画面を作ってあげます。
このプログラムではjpeg、jpgの画像ファイルしか投稿できないのでその画像ファイル以外が選択された場合は送信できませんと表示します。
また、1MB以上の画像ファイルも送信できません。
<img width="1440" alt="スクリーンショット 2018-03-12 15.11.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/240422/325b3310-1fca-a709-96e8-2f4ae7c0da04.png"><img width="903" alt="スクリーンショット 2018-03-12 15.11.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/240422/cae09a54-d7fd-047c-d520-2445ad2d64ce.png">

画像が見づらいかもしれませんが、上下の画像です。

最後に画像の表示画面です。
<img width="1440" alt="スクリーンショット 2018-03-12 15.17.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/240422/26997917-ddb0-5540-65b0-d1fe9b3afdad.png">

foreachで画像を取り出していく形になると思います。
実際の画面を表示したかったのですが容量が無理と言われたので質問があり次第投稿したいと思います。

ご静聴ありがとうございました！
ローカル実行するNCMBのスクリプトにパラメータを設定する

# １．はじめに
　NCMBのスクリプトをローカル実行してデバッグする際に、
　パラメータ（引数）を持たせるのに苦労したので記事にします。

# ２．前提
　NCMBのスクリプトの引数はreq.queryに持たせます。
　なお、今回は以下のようなスクリプトを作成しました。
　スクリプトが実行されるとreq.queryの中身がコンソールに表示されるというものです。

```javascript
module.exports = function(req, res) {
  console.log(req.query);
  res.send('finish');
}
```

# ３．パラメータの設定
　NCMBをローカルで実行するための環境設定や手順はNCMBのドキュメントを参照してください。
　実行する際、ブラウザで以下にアクセスします。
　`http://localhost:3000/2015-09-01/script/testScript.js`
　（`testScript`は実行するスクリプトのファイル名に読み替えてください）
　
　以下のパラメータを設定するものとします。
　キー：`key`
　値　：`value`


　この場合、以下のようにURLを作成します。
　`http://localhost:3000/2015-09-01/script/testScript.js?key=value`
　
　実行結果
　`{ key: 'value' }`

　他に、パラメータの中身によって、以下のようにURLを指定します。
　
　パターン１
　キー：`key`
　値　：`aaa,bbb,ccc` (カンマ区切りで配列にできるようにする)
　URL ：`http://localhost:3000/2015-09-01/script/testScript.js?key=aaa,bbb,ccc`
　実行結果：`{ key: 'aaa,bbb,ccc' }`

　パターン２
　キー１：`key1`
　値１　：`aaa`
　キー２：`key2`
　値２　：`bbb`
　URL ：`http://localhost:3000/2015-09-01/script/test.js?key1=aaa&key2=bbb`
　実行結果：`{ key1: 'aaa', key2: 'bbb' }`


　ポイントは、配列はカンマ区切りで、複数パラメータは`&`で区切るということです。

# ４．おわりに
　クエリというキーワードから、このように指定するのは当たり前といえば当たり前かもしれませんが、分かるまでわりと時間がかかったので、書いておきます。


# ５．参考
[【NCMB】スクリプトの使い方](http://mb.cloud.nifty.com/doc/current/script/basic_usage_javascript.html)
JenkinsからSlackへ通知する

## 概要
Jenkinsでビルド後に、結果をSlackへ通知する作業のメモを残します。

## シェルスクリプト
```sh:ターミナル
SLACK_TOKEN='*********************************'
SLACK_TERM='hoge-inc'
SLACK_CHENNEL='#testing'
SLACK_DATA=`cat << EOF
    payload={
        "channel": "$SLACK_CHENNEL",
        "attachments": [{
            "fallback": "フォールバックだよ",
            "color": "#003399",
            "pretext": "プレテキストだよ" ,
            "title": "送信テスト",
            "text": "テキスト @onoshoji"
        }]
    }
EOF`
curl --data-urlencode "${SLACK_DATA}" "https://${SLACK_TERM}.slack.com/services/hooks/jenkins-ci?token=${SLACK_TOKEN}"
```

## 参考サイト
* [Jenkinsで収集したカバレッジの変化情報をSlackに投稿する](https://qiita.com/u-minor/items/e0e30655168dadf2b10e)
* [cobertura_slack.sh](https://gist.githubusercontent.com/u-minor/d285e58a5c92e54d7188/raw/cobertura_slack.sh)
* [シェルスクリプトでslackへ通知を送ってみる](http://swfz.hatenablog.com/entry/2015/11/18/000152)
Docker環境構築メモ on Linux

# インストール

普通にぐぐると新旧入り乱れた情報が出てくるので、オフィシャルのドキュメントを良く読むこと。

## CentOS 7

https://docs.docker.com/install/linux/docker-ce/centos/

## Ubuntu 18.10, 18.04, 16.04

https://docs.docker.com/install/linux/docker-ce/ubuntu/

# 環境設定

## Proxy設定

dockerdのproxy設定は以下を参照。

https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

※以下の設定がどこに適用されるのかわからない。
https://docs.docker.com/network/proxy/

## データ領域設定

デフォルトは /var/lib/docker。
デフォルト以外を指定する場合は以下のように設定。

```json:/etc/docker/daemon.json
{
  "data-root": "/data/docker"
}
```

## ユーザ名前空間 (user namespaces)

* sudoせずにdockerを利用したい場合に設定する必要がある。(ただしCentOS7ではうまく動かない模様)
* コンテナからホスト側のリソースを操作するとき、ホストから見ると、コンテナ内のUID/GIDに/etc/subuid, /etc/subgidで設定したオフセットを足した値のユーザ/グループによって操作される形となる。
* ただし、コンテナ内でのroot権限は特別扱いされるらしく、/etc/subuid, /etc/subgidにて割り当てられた範囲のユーザ/グループが持つリソースへの自由な操作や、この範囲での権限変更(chown, chgrpなど)が可能である。
    * 例えば、UIDの範囲を100000-165536としたとき、`--volume`でマウントしたファイルシステムのディレクトリオーナーのUIDが、ホスト側から見て100000-165536であれば、このディレクトリ以下のファイル/ディレクトリに対して、コンテナ内のrootユーザはchown, chgrpも含めて自由に操作できる。
* 利用途中でユーザ名前空間を有効化した場合、イメージは共有されないので、イメージが巨大でダウンロードに時間がかかるような場合は、あらかじめdocker saveで保存しておくこと。(data-rootをバックアップ⇒展開するだけだと、正しく動かない模様)

### CentOS 7

ユーザ名前空間を有効化した上で、busyboxイメージを起動するとエラーで動作しない。
CentOS 7 の kernelが古い(2018-03-12時点で3.10.0-693.21.1.el7)のが原因?

### Ubuntu 16.04

* ユーザ「dockremap」を追加。(※ dock **er** map ではなく dock **re** map であることに注意)
* dockerを利用する一般ユーザを、グループ「docker」に追加。(グループ設定はログイン中のユーザには反映されないので、使用前に一度ログアウトすること)
* /etc/subuid, /etc/subgid に以下を追記。

```:/etc/subuid
dockremap:100000:65536
```

```:/etc/subgid
dockremap:100000:65536
```

* Dockerの設定ファイルにユーザ名前空間の使用を追記。

```json:/etc/docker/daemon.json
{
  "data-root": "/data/docker",
  "userns-remap": "default"
}
```

https://docs.docker.com/engine/security/userns-remap/

* Dockerサービスを再起動。(sudo systemctl restart docker)  
※reloadでは反映されないので、restartすること。

# よく見る docker run オプション

* -i: インタラクティブモード
* -t: 疑似端末割り当て
* --rm: プロセス終了時のコンテナ自動削除

`-it` で現在の疑似端末とコンテナの疑似端末を紐付けるので、コンテナ内で起動したCLIコマンドを直接操作できる。

Dockerは、イメージからコンテナを作成し、実際の動作はコンテナ上で行われる。
通常起動したときは、コンテナは勝手に消えないので、コンテナでの操作は永続化されないと言っても、コンテナを消さない限り、内部の情報は残ったままとなる。
`-rm` を付けると、docker run で起動したプロセスが終了したとき、コンテナも削除される。
GithubのPullRequestの情報を取得する

## 概要
JenkinsでGithubのPullRequestの情報を取得する作業のメモを残します。

## シェルスクリプト
```sh:ターミナル
TOKEN='*********************************'
OWNER='hoge-inc'
REPO='www.example.com'
NUMBER='50'
payload=`curl -H "Authorization: token ${TOKEN}" "https://api.github.com/repos/${OWNER}/${REPO}/pulls/${NUMBER}"`
url=`echo $payload | jq -r ".url"`
user=`echo $payload | jq -r ".user.login"`
echo "${url} (@${user})"
```

## 参考サイト
* [GitHub Developer - REST API v3](https://developer.github.com/v3/pulls/)
* [GitHubのPR内容をcurlで取得する](https://qiita.com/do7be/items/316d535c786f244dc69e)
rails、君に決めた！！~1

一連の記事の目次
[rails、君に決めた！！~目次](https://qiita.com/satousatou/items/d20b61c198a4d439f2e7)


## 始めに
web開発を始めるにあたり、php,ruby,pythonのどれを使おうか迷いに迷った挙句、ruby、、に決めた！！実はPythonの国でDjangoをかじったことはあるのだが、どうも使いづらいのでオーキド博士に返却して新しいポケモンに手を出すことにしました笑
良さげな本を見つけたので、これに準拠してやっていく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221630/48d570ed-6d6c-b71c-a045-bd289090da6a.png)


## 環境構築
#### rbenvのインストール

```
brew update
brew upgrade
brew install rbenv
```

#### Ruby-buildのインストール

```
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
```

#### rbenvでrubyのインストール

```
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
rbenv install 2.4.1
rbenv global 2.4.1
```

#### Node.jsのインストール

```
brew install node
```

#### gemによるライブラリ管理
英語の意味気になっちゃう人
> gem: 宝石

gemには
1. パッケージ管理システムRubyGemsのこと
2. RubyGemsで管理するパッケージのこと
という二つの意味があるらしい

```
gem install pry
```

#### Bundlerを用いたgemの管理

```
gem install bundler
```

> bundle: 束、塊

gemはパッケージ管理、bundlerは各gemのバージョン管理をするものという理解でいいのかな？？gemがpipだとするとbundlerに対応するものってpythonの国ではなんなんだろう？  
bundlerで遊んでみる。

```
mkdir bundle_project
cd bundle_project
bundle init
echo 'gem "rspec"' >> Gemfile
bundle install --path vendor/bundle
```

アプリケーションのローカルにあるgemを実行するには

```
bundle exec rspec
```

とすればいい。
lsで見てみるとGemfile.lockが生成されている。これがあれば各gemの依存関係を再現できるのか。

#### railsのインストール

```
mkdir rails_app
cd rails_app
bundle init
```

Gemfileを編集。

```
# gem "rails"
のコメントアウトを削除する
```

railsのgemをインストールする。`--jobs=4`は並列処理のオプション。

```
bundle install --path vendor/bundle --jobs=4
```

> Railsのgemのインストールが完了したら、実際にRailsをインストールする

ドユコト？？gemと実際のRailsって別物なのか〜
  
```
bundle exec rails new ./ -B -d mysql --skip-turbolinks --skip-test
```

Gemfileの上書き許可が求められるのでyを入力。
コマンドオプションについて
`-B`: --skip-bundleオプション。デフォルトのGemfileにある余計なものはインストールしない
`-d mysal`: データベースをmysqlにする
`--skip-turbolinks`: 高速画面遷移機能turbolinksをオフにする。

Gemfileを編集してcoffee-railsをコメントアウトしておく。もう主流ではないらしい。よくわからん。

```
# gem 'coffee-rails', '~> 4.2'
```

最後に

```
bundle install
```

環境構築終わり〜、長かった、、、と思ったらエラーでたww

```
An error occurred while installing mysql2 (0.4.10), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.4.10'` succeeds before bundling.

In Gemfile:
  mysql2
```

原因はmysqlが入ってないことらしい。（これ本には書いてないエラー）

```
brew install mysql
bundle install
```

にしたら成功した。
GitHub APIで空コミットをコミットする

# 背景
空コミットしてプルリク作成をスクリプトで自動化したい
gitリポジトリをcloneしてコミットしてpushするのは面倒
GitHubのAPIでcloneなして空コミットができそうだったのでやってみた

# マニュアル
https://developer.github.com/v3/git/

# やり方
* ブランチ(分岐元)のtreeを取得しコミットのshaを取得

```bash
GET /repos/:owner/:repo/git/trees/:branch?recursive=1
  -> "sha": "<commit-sha>" ...(*1)
```

* 取得したコミットのshaを指定してtreeのshaを取得

```bash
GET /repos/:owner/:repo/git/commits/:sha <---(*1)
   -> "tree":{ "sha": "<tree-sha>"} ...(*2)
```

* 取得treeを指定してcommitする(これが空コミットになる)

```bash
POST /repos/:owner/:repo/git/commits -d
  '{
    "message": "create new branch",
    "author": {
      "name": "<commiter-name>",
      "email": "<commiter-email>"
    },
    "parents": [
      "<commit-sha>" <---(*1)
    ],
    "tree": "<tree-sha>" <---(*2)
  }'

  -> "sha": "<new-commit-sha>" ...(*3)
```

* ブランチを新しく作成する

```bash
POST /repos/:owner/:repo/git/refs -d
  '{
    "ref": "refs/heads/<branch-name>",
    "sha": "<new-commit-sha>" <---(*3)
  }'
```

# さいごに
APIでもできた。gitリポジトリによっては(サイズが大きくて重たいものだと)APIでやったほうが早い。
Cache Serverを使ってSwitch Platformを高速にする方法

#設定方法

1. Cache Server用ファイルのダウンロード [Unity ダウンロード アーカイブ](https://unity3d.com/jp/get-unity/download/archive?_ga=2.197247855.1987076617.1497836427-1070006866.1467613377)
![SnapCrab_NoName_2017-6-19_11-8-46_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/555179e8-a0be-aa32-9e1b-f94a7a422bb9.png)
- - -

2. ダウンロードしたzipファイルを解凍
- - -

3. 起動スクリプトを実行 (~\解凍先ディレクトリ\CacheServer-5.6.1f1\CacheServer\RunWin.cmd)
![SnapCrab_NoName_2017-6-19_11-21-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/673ca3b8-c4a2-e0e7-aee4-636355011bfa.png)
(Cacheフォルダ作成先 C:\Users\ユーザー名\AppData\Roaming\Unity\Caches\CacheServer
- - -

4. UnityEditor側でPreference -> Cache ServerでChache ModeをLocalに設定
![SnapCrab_NoName_2017-6-19_11-28-39_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/93b6a0d9-1676-0d3d-8000-44e8a1570aba.png)
- - -

5. Build SettingsからSwitch Platform
- - -

#計測結果(参考)
- 初回 : 2分30秒
- 2回目以降 : 15 ~ 23秒
Implementing Undo/Redo on Vis.js

Uploaded the following sample code in Github.
https://github.com/NomuraS/qiita-undo-redo-vis.js


Undo/Redo functions are not natively supported in [Vis.js](http://visjs.org/). So, such functions would give us better experiences  if we dynamically manipulate a graph of Vis.js. See and try the following example of CodePen (which is based on [one of examples](http://visjs.org/examples/network/other/manipulation.html) in the official site).

<p data-height="265" data-theme-id="0" data-slug-hash="mxJKPE" data-default-tab="js,result" data-user="NomuraS" data-embed-version="2" data-pen-title="undo/redo on Vis.js" class="codepen">See the Pen <a href="https://codepen.io/NomuraS/pen/mxJKPE/">undo/redo on Vis.js</a> by NomuraS (<a href="https://codepen.io/NomuraS">@NomuraS</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

The example depends on jQuery and lodash.js. While I'm not one to avoid using lodash.js, the library is used only for the function "_.differenceBy".
Python×データサイエンス&AIのライブラリをまとめてみた

#はじめに
この業界のスピードは人類史上最速なのではないかと思うレベルなのですが、タイトルの通りPython×データサイエンス&AIの分野で戦うならば当然触ったことあるよねって言うレベルのライブラリをまとめてみました。
(モジュールとライブラリの違いとか知りません。過不足あります。絶対。)

#目次
1.データ加工系
2.データ読み込み系
3.データ可視化系
4.機械学習系
5.自然言語処理系
6.WebApp開発フレームワーク

#1.データ加工系
###Numpy
http://www.numpy.org/
http://cs231n.github.io/python-numpy-tutorial/
###Pandas
https://pandas.pydata.org/
http://pandas.pydata.org/pandas-docs/version/0.15/10min.html
###Scipy
https://www.scipy.org/
http://programming-study.com/technology/python-scipy/
#2.データ読み込み系
###csv
https://qiita.com/okadate/items/c36f4eb9506b358fb608
###db
https://pypi.python.org/pypi/db.py
#3.データ可視化系
###matplotlib
https://matplotlib.org/
https://matplotlib.org/users/index.html
###plotly
https://plot.ly/python/

#4.機械学習系
###scikit-learn
http://scikit-learn.org/stable/
###tensorflow
https://www.tensorflow.org/
###chainer
https://chainer.org/
###theano
http://deeplearning.net/software/theano/
#5.自然言語処理系
###mecab
http://taku910.github.io/mecab/
###gensim
https://radimrehurek.com/gensim/
###juman
http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN

#6.WebApp開発フレームワーク
###django
https://docs.djangoproject.com/ja/2.0/


#おわりに
**とりあえず「Colaboratory」で全部触ってみましょう。**
https://colab.research.google.com

jupyterをGoogle先生が進化させてます。
http://jupyter.org/

#雑感
これらに加えて、データサイエンス&AIの領域では、Rの知識とクラウド（AWSとGCP）の知識、さらに論文ベースのアルゴリズムの知識と、最先端研究の知識。一生、データサイエンス&AIに飽きることなく生きていけそうです。とりあえず、詳しくないのはサンプルコードを叩くか...。
FBに今日のランチを上げました。

facebookにお昼のお弁当の3Dモデルを上げたので
その時踏んだ罠とかキャプチャー手法とか
[今日のお昼](https://www.facebook.com/kouwf/posts/1628918520522797)

#1.フォトグラメトリーでキャプチャ
1.お弁当を買います
2.スマホで周囲からバシャバシャ撮影します。
※今回はお手軽スマホですが、焦点固定の高画質カメラの方がもちろんいいです。
3.[3DF Zephyr Lite](https://www.3dflow.net/3df-zephyr-pro-3d-models-from-photos/)に撮影画像を投げます
※他にもagisoftやRealityCaptureなどフォトグラメトリソフトはあります。商用不可のフリー環境もあります。
4.フォトグラメトリーで点群から深度付きテクスチャに起こしてくれます。
5.3D編集ソフトでリトポします。

#2.glbに変換
1.[FBの3Dチュートリアル](https://developers.facebook.com/docs/sharing/3d-posts/glb-tutorials)見ながら
　フォーマット合わせてglbを吐きます
※FBXの変換ツールもあります。（exeと同階層に吐くから使いにくい）
2.[バリデーションツール](https://developers.facebook.com/tools/3d/validation)にエクスポートしたGLBをチェックさせます。
※データサイズ、テクスチャサイズなど。自分は2^nサイズにしていなくて怒られました。

#3.FBにアップロード
1.FBを飯テロにちょうどいい時間に開きます
2.『今何してる？』窓を開いてGLBファイルを突っ込みます。
3.飯テロ文章を書きます。

*※2018/03/12時点の情報です。*
systemdを書く。(systemctlコマンドに登録する)


ubuntu1804ではCeleryがSystemdに自動で登録されなかったので自分で書くことに。

ファイルを置く対象のディレクトリ
`/etc/systemd/system`

`marumaru .service`

【Celery systemdサンプル】
http://docs.celeryproject.org/en/latest/userguide/daemonizing.html#usage-systemd

## serviceファイルを書く。

/etc/systemd/system/celeryd.service
※【】はコメントです

```
# original write【コメント行なので適当です】

[Unit]
Documentation=man:systemd-sysv-generator(8)   【systemctl statusで見た際にDocs: で表示される文章】
Description=Celery Service　  【systemctl statusで見た際に１行目のサービス名の横に出る文章】
After=network.target 【このサービス起動時に事前にnetwork.targetが起動中であることを確認（Networkが上がってないとだめ。）】

[Service]
User=celery    【サービスを起動するユーザの指定】
Group=celery　　【サービスを起動するグループの指定】
WorkingDirectory=/var/www/celery　【実行ディレクトリの指定】
Type=forking　【Type=simple（フォアグラウンド処理。）、forking(起動後バックグラウンド処理)】
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/usr/local/bin/celery multi start w1 -A celery -l info --time-limit=300 --concurrency=8 --pidfile=/var/run/celery/%n.pid --logfile=/var/log/celery/%n.log 【起動コマンド】
ExecStop=/usr/local/bin/celery multi stopwait w1 --pidfile=/var/run/celery/%n.pid 【停止コマンド】
ExecReload=/usr/local/bin/celery multi restart w1 -A celery -l info --time-limit=300 --concurrency=8 --pidfile=/var/run/celery/%n.pid --logfile=/var/log/celery/%n.log　【restart時のコマンド】

[Install]
WantedBy=multi-user.target　【enableでスタートアップ（？）に登録するときのrunlevel。（runlevel 5）】


```


### systemd の再読込
`systemctl daemon-reload`

### systemd の登録確認
`systemctl`
もしくは
`systemctl list-unit-files`

### サービス起動
`systemctl start celeryd.service`

### サービス停止
`systemctl stop celeryd.service`

### サービス再起動
`systemctl restart celeryd.service`
`systemctl reload celeryd.service`


予めPIDファイルの出力先やログの出力先は作成しておくこと。
プッシュ通知許諾設定の結果によってViewを表示する際にボタンテキストが消える問題の対策

iOSにて、プッシュ通知許諾設定がOFFの場合に「プッシュ通知をオンにしてね」というダイアログやViewを表示するケースがあると思います。
その際に謎の現象に苦しめられたのでメモとして残しておきます。

# 問題
プッシュ通知許諾を確認( `UNUserNotificationCenter.current().getNotificationSettings` )した上で表示するUI上のボタンテキストが表示されない。

# 問題発生コード
### 表示するUIにボタンを設定(storyboard)
<img width="400" alt="button.png" src="https://qiita-image-store.s3.amazonaws.com/0/165931/d22cde4d-0be5-c316-809b-a4ea795a0f90.png">

### Push通知許諾を確認した上でUIを表示
```swift
UNUserNotificationCenter.current().getNotificationSettings { settings in
    guard settings.authorizationStatus != .authorized else { return }

    let nextView = UIStoryboard(name: "second", bundle: nil).instantiateInitialViewController()
    self.present(nextView!, animated: true, completion: nil)
}
```

### 実行結果
<img width="250" alt="screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/165931/559afc93-6024-cdea-b747-85a487d5f6e5.png">
※一度ボタン部分をタップすると文字は表示される

# 対応
presentの処理をMain Threadで実行すると文字部が表示される

```swift
UNUserNotificationCenter.current().getNotificationSettings { settings in
    guard settings.authorizationStatus != .authorized else { return }

    DispatchQueue.main.async {
        let nextView = UIStoryboard(name: "second", bundle: nil).instantiateInitialViewController()
        self.present(nextView!, animated: true, completion: nil)
    }
}
```

# おわり
一応目的の動作を満たすことは出来ました。
あまりスマートな対応とは言えないので、何か知見をお持ちの方がいらっしゃればコメントなど頂ければ幸いです。
ゲーミングマウス(G300s)ヘのキー割当

#ゲーミングマウスいいと思うよ
こういう仕事してるとコピペ/ブラウジング操作とか何百万回もしてると思うし、
それぞれの操作時間は微々たるものでも、つもりつもればそれなりの時間を使っていることになる。
少しでも楽したいよね。
マウスホイールでのタブ切り替え、アプリ切り替えに慣れてしまうと、切り替えの度にキーボードのキーを押すのがめんどくさくなる。

ゲーミングマウスは同業者へのちょっとしたプレゼントにも最適（3000円くらい）な価格。

デメリットとして、初期設定面倒とか、学習コストがわずかにかかるとかは正直ある。
贈った人にも活用してほしいので、自分の設定を載せときます。

ちなみに、自分のは[これ（LOGICOOL Optical Gaming Mouse G300s）](https://gaming.logicool.co.jp/ja-jp/product/g300s-gaming-mouse)。

見た目かっこいいし、ちょうどよい大きさで手になじむし、クリックの打感？も気持ちよい。
安心の有線。無線だと充電に気をつけなきゃいけないのがなんかヤダ。

#セットアップ
詳細なやり方は[ここ](http://gaming-device.com/gaming_mouse/macro/)が詳しい。

##マウスドライバのインストール
[ここ](http://support.logicool.co.jp/ja_jp/product/g300s-gaming-mouse/downloads)から


##マウスボタンへのキーの割り当て
ボタンは9個あって、割り当てはカスタムできます。
自分のWindows環境での設定は以下の通り。

G1 左クリック
G2 右クリック
G3 スクロールホイール & Ctrl+Z(押したとき)
G4 Ctrl (後ほどでてくるAutoHotkey割り当て用)
G5 無変換 (後ほどでてくるAutoHotkey割り当て用)
G6 Ctrl + C
G7 Ctrl + V
G8 モードスイッチ
G9 Ctrl + S

- 割り当てモードは3つ設定できて切り替えできるけど、1つしか使ってない。
- 設定はPC側でなくマウスのオンボードメモリに保存してます。
 （マウスが壊れるなくすなどしたときは困りそうですが、そのときはそのときかなと）
- 連打も設定できるのはゲーミングマウスっぽいけど、業務で連打はしないな。。


##AutoHotkeyのインストール
[ここ](https://autohotkey.com/)から

AutoHotkeyはボタンにキーを割り当てるだけだったら必要ないけど、ボタンとボタンを組み合わせてなんかやるとなると必要
>AutoHotkey とは、Microsoft Windowsが導入されているパーソナルコンピュータに常駐して一連の操作を自動化するためのユーティリティソフトウェアである。
引用元 : <cite>[wiki - AutoHotkey](https://ja.wikipedia.org/wiki/AutoHotkey)</cite>

##AutoHotkeyの設定
設定ファイルを書いて、ダブルクリックで実行
自分の設定ファイルは以下の通り。

```:setting.ahk
;G5ボタン&マウスホイールでWindow切り替え
sc07B & WheelDown::ShiftAltTab
sc07B & WheelUp::AltTab

;G5ボタン&右クリックで選択したテキストをgoogle検索 //201809追記
sc07B & RButton::
        clipboard =
        Send, ^c
    Sleep 100
    Run, http://www.google.com/search?q=%clipboard%
Return

;G4ボタン&マウスホイールでブラウザTab切り替え
^WheelDown::Send,{Blind}^+{Tab}
^WheelUp::Send,{Blind}^{Tab}

;G4ボタン+右クリックでブラウザTab閉じる
^RButton::Send,^{w}
```

[gist](https://gist.github.com/112KA/cf6114323f104b743d16bfb11c686f6e)にも書いた。
アプリやタブの切り替えがマウスでできるのが便利。
スタートアップにこのスクリプトを起動するショートカットを登録しておくとよい。

#自分のchromeブラウジングのやり方
キーボードで文字入力 or テキストを選択してG5+右クリックして検索
↓
検索結果から気になるやつをG4+左クリック（別タブで開く）で開きまくる
↓
G4+マウスホイールでタブ切り替え
↓
気になる記事を読む or 用済みタブはG4+右クリックで閉じる

という感じ。
文字入力以外は大体マウスを動かさずにボタンで楽々操作

#今後(随時追記)
- ~~neokixさんにコメントいただいたみたいなクリップボード検索をブラウジングフローにうまいこと組み込みたい。~~ 201809済

#参考
- [どこからでもGoogle検索](https://qiita.com/_meki/items/34191154386d1137636e)

#最後に
- 正直もっと使い倒したいけど、ボタンにどの機能を割り当てれば良いかアイデアが思いつかない。
設定モードも3つあるうち2つを持て余している。
- [最近midiキーボードでcssいじるやつ](https://github.com/dimitrinicolas/midi-controller-css)みかけたけど、それはtoo muchな気がしている。(自分で書いた方が早そう)
- どなたか開発業務に便利なボタン割り当て、おすすめ便利な使い方ある方がいたらコメントなどで共有していただきたい。
RoomのTypeConverterを拡張関数で書く

Android Architecture ComponentsのRoomでは、直接SQLiteに格納できない型を格納する場合、変換するためのTypeConverterを実装してEntityやDaoなどで指定する必要があります。

[TypeConverter \| Android Developers](https://developer.android.com/reference/android/arch/persistence/room/TypeConverter.html)

変換するためのメソッドに`@TypeConverter`アノテーションを付加するのですが、このアノテーションのドキュメントにはこう書いています。

> Each converter method should receive 1 parameter and have non-void return type.

変換対象を唯一のパラメータとして受け取り、void以外の型を返せばいいようです。

拡張関数で書かれた関数をjavaにデコンパイルしたものを見たことがある方ならご存知かもですが、Kotlinの拡張関数はJavaから見ると拡張元の型を第1引数に持つメソッドになります。

```kotlin
class Sample {
    fun List<Int>.doubleSize() = this.size * 2
}
```

例えば、上記の拡張関数をデコンパイルすると

```java
public final class Sample {
   public final int doubleSize(@NotNull List $receiver) {
      Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
      return $receiver.size() * 2;
   }
}
```

のようになります。

したがって、TypeConverterをKotlinで書く際は次のように拡張関数で書くことが可能です。

```kotlin
class ListTypeConverter {
    @TypeConverter
    fun List<Int>.toCsvString(): String = joinToString(",")

    @TypeConverter
    fun String.toIntList(): List<Int> = split(",").map { it.toInt() }
}
```

クラスではなくobjectにしたい場合は一工夫 -> `@JvmStatic`が必要

```kotlin

object ListTypeConverter {
    @TypeConverter
    @JvmStatic
    fun List<Int>.toCsvString(): String = joinToString(",")

    @TypeConverter
    @JvmStatic
    fun String.toIntList(): List<Int> = split(",").map { it.toInt() }
}
```

## おまけ

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">カラムをnullableにしてたの忘れててクラッシュしたので修正。<br>ほとんど変わってないのはKotlin様〜って感じ <a href="https://t.co/XTWU1Zz8Fq">pic.twitter.com/XTWU1Zz8Fq</a></p>&mdash; ちばっちんぐ (@chibatching) <a href="https://twitter.com/chibatching/status/972352620508602368?ref_src=twsrc%5Etfw">March 10, 2018</a></blockquote>
ベルヌイ試行のz変換（最も簡単なz変換) 2.3

##問題##
\{$X_i$\}を独立なベルヌイ試行列の確率変数とします．すなわち$i$回目の試行結果が1である確率は$P[X_i=1]=p$で，0である確率は$P[X_i=0]=(1-p)$です．ここでN回の試行結果の和を$S_n=X_1+X_2+\cdots+X_N$とします．ただし$N$は平均$\lambda$のポアソン分布の確率変数です．$S_n$は平均$p\lambda$をもつポアソン分布となることを示してください．
##解答例##
$N$を固定して$S_N$を確率変数として，$p_k=P[S_n=k]$とすると，数列{$p_k$}の z変換は

```math
\begin{align}
P(z|N=n)&= \sum_{k=0}^\infty p_kz^k\\
&=E[z^{S_n}] \\
&=E[z^{(X_1+X_2+\cdots+X_N)}] \\
&=E[z^Xz^Xz^X\cdots z^X] \\
&=(E[z^X])^N
\end{align}
```
ここで１回だけの試行のz変換は  0が確率$p_0=1-p$ , 1 が確率$p_1=p$ なので

```math
\begin{align}
E[z^X]&=p_0z^0+p_1z^1 \\
&=(1-p)+pz \\
&=1-p(1-z)
\end{align}
```
これより$P(z|N=n)=(1-p(1-z))^N$となり，$N$をポアソン分布に従う確率変数として考えたときのz変換$P(z)$は$P(z|N=n)$の$N$での平均となって

```math
\begin{align}
P(z)&=\sum_{n=0}^\infty P(N=n)P(z|N=n)  \\
&=\sum_{n=0}^\infty \frac{\lambda ^ n}{n!}e^{-\lambda}(1-p(1-z))^n \\
&= e^{-\lambda}\sum_{n=0}^\infty \frac{(\lambda - p\lambda(1-z))^n }{n!} \\
&=e^{-\lambda}\cdot e^{\lambda - p\lambda(1-z)} \\
&=e^{- p\lambda(1-z)}
\end{align}
```
ここで第３式から第４式へは テーラー展開$e^x=\sum_{n=0}^\infty \frac{x^n}{n!}$を使いました．
最終式は$e^{-a(1-z)}$の形をしており，これは平均値aのポアソン分布のz変換でしたので，逆変換すると以下のような確率シーケンスが得られます．
$$ e^{-p\lambda}\frac{(p\lambda)^n}{n!}$$
ポアソン流の分岐 2.2

##問題##
時間tでの到着頻度の平均が$\lambda$であるポアソン流をいくつかに枝分かれさせます．枝分かれ点は一箇所で，到着イベントを到着ごとに独立に確率$p_i$で$i$番目の枝に振り分けます．各々の支流は平均到着数が$\lambda p_i$のポアソン流となっていることを示してください．

##解答例##
分岐前の本流は時間$t$間で到着数$N$であったものとします．そして$i$番目の支流に$n_i$の到着が振り分けられる確率$P[N_i=n_i]$は，条件として$N$が$N \ge N_i$となっていなければならず，nからniを選び出す組み合わせは$\binom{n}{n_i}$とおりなので，

```math
\begin{align}
P[N_i=n_i]&=\sum_{n=n_i}^{\infty}P[N=n]\binom{n}{n_i}p_i^{n_i}(1-p_i)^{(n-n_i)} \\
&=\sum_{n=n_i}^{\infty}e^{-\lambda t}\frac{(\lambda t)^n}{n!}\binom{n}{n_i}p_i^{n_i}(1-p_i)^{(n-n_i)}
\end{align}
```
ここで$$\binom{n}{n_i}=\frac{n!}{n_i!(n-n_i)!}$$を代入してnを含まない因子と，$(\lambda t)^n=(\lambda t)^{n_i}(\lambda t)^{n-n_i}$に分解して$(\lambda t)^{n_i}$を$\sum$の外に出すと，

```math
\begin{align}
P[N_i=n_i]&=e^{-\lambda t}\frac{(\lambda p_it)^{n_i}}{n_i!}\sum_{n=n_i}^{\infty} \frac{(1-p_i)^{n-n_i}(\lambda t)^{n-n_i}}{(n-n_i)!} \\
&=e^{-\lambda t}\frac{(\lambda p_it)^{n_i}}{n_i!}\sum_{n=n_i}^{\infty}\frac{(\lambda t -\lambda p_it)^{(n-n_i)}}{(n-n_i)!} \\
&=e^{-\lambda t}\frac{(\lambda p_it)^{n_i}}{n_i!}e^{(\lambda t -\lambda p_it)} \\
&=\frac{(\lambda p_it)^{n_i}}{n_i!}e^{-\lambda p_it}
\end{align}
```
なお第2式から第3式への変形は$e^x$のテーラー展開$$e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdots=\sum_{k=0}^{\infty}\frac{x^k}{k!}$$を使っています．
Oracle DatabaseのPL/SQLでsprintfっぽい事をする

#概要
utl_lmsパッケージのformat_message関数は本来エラー処理に使うものらしいですが、
使用にあたり特別な要件がないため、簡易なフォーマット関数(CやPHPでいうsprintf、pythonでいうformat)の代用品として使うことが出来ます。
PL/SQLの中でしか使えないなど制限事項が多いですが、それでも || による無様な文字列結合から開放されますのでデバッグメッセージやexecute immediate等で使う複雑なクエリを構築する場合に便利です。

#utl_lms.format_messageの構文
```sql
function FORMAT_MESSAGE (
   format IN VARCHAR2,
   args ...)
RETURN VARCHAR2;
```
| パラメータ|型|概要|
|:-:|:-:|:-:|
| format|VARCHAR2|書式指定文字列||
| args|(任意)|データ(可変個数)|
|戻り値|VARCHAR2|フォーマット済文字列|

詳細はこちら
https://docs.oracle.com/cd/E16338_01/appdev.112/b56262/u_lms.htm

#補足
- 通常のSQLクエリの中では使えません。PL/SQLのプロシージャだけです（可変引数だからかも）
- 実質、使える型は文字列型(%s)のみ
 - それ以外の型は事前にTO_CHARで変換して%sに割り当てればOK
- 形式指定パラメータのようなもの無いみたいです。 
- 実は整数型(%d)も使えるには使えるのですが・・・
 - 対応している型は**PLS_INTEGERとBINALY_INTEGER**のみです。
 - NUMBER型にはまともに対応しておらず、代入してもエラーにもならず何も出てこないという挙動のため間違えて使うと厄介です。
 - 用途がかなり限定されるので数値を扱うなら素直にTO_CHARで変換して%sに代入したほうが良いです。
- %自体の出力は%%。
- utl_lmsが実装されているのは10g以降。

#実行例

```sql
set serveroutput on

declare
    s char(100);
    I1 PLS_INTEGER  := 1;
    S2 CHAR(10)    := 's2';
    N4 NUMBER(2,0) := 4;
    V5 VARCHAR2(10) := 'VC5';
begin
    s := utl_lms.format_message('INSERT INTO DATA1(KEY,VAL,REMARK)VALUES(%d,''%s'',''%s''); --<%d,%s>', I1, S2, 'A3', N4, V5);
    dbms_output.put_line(s);
end;
/
```
##結果
```sql
INSERT INTO DATA1(KEY,VAL,REMARK)VALUES(1,'s2        ','A3'); --<,VC5>
```
ポアソン流の合成 2.1

## 問題
K個のポアソン流のそれぞれの時間$t$間の到着数平均値を$\lambda_1,\lambda_2,...,\lambda_K$とします．これらを一つに合成すると，平均値$\Sigma_{k=1}^{K}\lambda_k$をもつポアソン流となることを示してください．
##解答
それぞれの平均値が$\lambda_1\lambda_2$である二つのポアソン流が合成されることを考える．平均$\lambda_1$で時間$t$内にn個のイベント生起する確率は$P_1(n)=\frac{(\lambda_1t)^ne^{-\lambda_1t}}{n!}$なので，合成された流れで時間$t$内にn個のイベント生起する確率は

```math
\begin{align}
P(n)&=\Sigma_{j=0}^{n}P_1(j)P_2(n-j) \\
&=\Sigma_{j=0}^{n}\frac{(\lambda_1t)^je^{-\lambda_１t}}{j!}\frac{(\lambda_2t)^{(n-j)}e^{-\lambda_2t}}{(n-j)!} 
\end{align}
```
組合せの総数は $\binom{n}{j}=\frac{n!}{(n-j)!j!}$ でしたので
$$P(n)=\frac{e^{-(\lambda_1+\lambda_2)t}}{n!}\Sigma_{j=0}^{n}\binom{n}{j}(\lambda_1t)^j(\lambda_2t)^{(n-j)}$$
さらに$(a+b)^n=\Sigma_{j=0}^{n}\binom{n}{j}a^jb^{(n-j)}$を適用すると

```math
\begin{align}
P(n)&=\frac{e^{-(\lambda_1+\lambda_2)t}}{n!}(\lambda_1t+\lambda_2t)^n \\
&=\frac{(\lambda t)^ne^{-\lambda t}}{n!}
\end{align}
```
これは平均$\lambda=\lambda_1+\lambda_2$のポアソン流である．さらにここに平均$\lambda_3$のポアソン流を合成すると同じ計算で$\lambda_1+\lambda_2+\lambda_3$のポアソン流となり，K個のポアソン流の合成は平均値$\Sigma_{k=1}^{K}\lambda_k$をもつポアソン流となることがわかりました．
z変換チートシート

##はじめに
待ち行列の問題で特に離散分布の確率を計算するために使われるz変換の変換テーブルのチートシートです．
z変換は制御理論やディジタル信号処理の分野では，$F(z^{-1})=\sum_{k=0}^{\infty} f_kz^{-k}$とされています．それは$z$が$z=exp(j\omega t)$と定義されており，$z^{-1}$が1クロック遅延させるという物理的意味をもち，z変換が離散時間系の伝達関数を表していたからでした．待ち行列での確率計算で使われる変換には伝達関数といった物理的な意味はなく，離散確率分布$p_0,p_1,...,p_k,...$の母関数として計算を簡易にすることを主目的に使われます．このため，z変換の定義を$$f_n\iff F(z)=\sum_{n=0}^{\infty}f_nz^n$$
としています．
##変換表
nが数列のインデックスで，mは正定数とします．

|No.|  数列  |  z変換 |
|---:|:---|:---|
|1| $f_n$（定義） |$F(z)=\sum_{n=0}^{\infty}f_nz^n$|
|2| $A\alpha ^n$ |$\frac{A}{1-\alpha z}$|
|3| $n\alpha ^n$ |$\frac{\alpha z}{(1-\alpha z)^2}$|
|4| $n^2\alpha ^n$ |$\frac{\alpha z(1+\alpha z)}{(1-\alpha z)^3}$|
|5| $\frac{1}{m!}(n+m)(n+m-1)...(n+1)\alpha^n$ |$\frac{1}{(1-\alpha z)^{m+1}}$|
|6| $\frac{1}{n!}$ |$e^z$|
##z変換のもつ定理


|No.|  数列  |  z変換 |
|---:|:---|:---|
|1| $af_n+bg_n$ |$aF(z)+bF(z)$|
|2|$a^nf_n$|$F(az)$|
|3|$f_{n/k} ~ n=0,k,2k,...$|$F(z^k)$|
|4|$f_{n+1}$|$\frac{1}{z}[F(z)-f_0]$|
|5|$f_{n-k}$|$z^kF(z)$|
|6|$nf_n$(平均)|$z\frac{d}{dz}F(z)$|
|7|$n(n-1)(n-2)...(n-m+1)f_n$|$z^m\frac{d^m}{dz^m}F(z)$|
|8|$f_n \bigotimes g_n$畳み込み|$F(z)G(z)$|
|9|$\sum_{k=0}^nf_k$|$\frac{1}{1-z}F(z)$|

## 例題
### 1　等比級数
（問題）
$p_n=(\frac{1}{2})^n$のz変換を求めてください．$p_n$は，サイコロをn回振ってn回全てで偶数の目の出る確率など，比較的よくお目にかかる等比級数です．ただし，$p_0=1$とします
（解答）
定義より$F(z)=1+0.5z+0.25z^2+\cdots$は初項１で公比0.5zの等比級数となりますので，高校数学の公式より$$F(z)=\frac{1}{1-0.5z}$$となります．このz変換は，変換表の第２行を使って$A=1,\alpha=0.5$としても得られます．

### ２　ポアソン分布
（問題）
平均値$\alpha$のポアソン分布の確率をz変換を求めて，平均が$\alpha$になることを確認してください．
（解答）
平均値$\alpha$のポアソン分布で，$k$個のイベントが発生する確率は
$$p_k=\frac{\alpha^k}{k!}e^{-\alpha}$$なので

```math
\begin{align}
P(z)&= e^{-\alpha}+e^{-\alpha}\frac{1}{1!}z+e^{-\alpha}\frac{\alpha}{2!}z^2+e^{-\alpha}\frac{\alpha^3}{3!}z^3+\cdots\\
&=e^{-\alpha}(1+\frac{1}{1!}z+\frac{\alpha}{2!}z^2+\frac{\alpha^3}{3!}z^3+\cdots) \\
&=e^{-\alpha}e^{\alpha z} \\
&=e^{\alpha(z-1)}
\end{align}
```
第２式から第３式へは変換表の第６行と，定理表の第２行を使っています．
$P(z)=p_0+p_1z+p_2z^2+p_3z^3+\cdots$なので，$\frac{dP(z)}{dz}=p_1+2p_2z+3p_3z^2+\cdots$.  
よって平均$E=1p_1+2p_2+3p_3+\cdots$は

$\frac{dP(z)}{dz}|_{z=1}$で求まります．

$\frac{dP(z)}{dz}=\alpha e^{\alpha(z-1)}$なので　　

$\frac{dP(z)}{dz}|_{z=1}=\alpha$

待ち行列の問題では，ポアソン分布の平均値は$\lambda t$で現れることが多く，$e^{\lambda t(z-1)}$の形のz変換が見つかるとポアソン分布に逆変換されるとひらめくことが必要とななります．
rabbitMQサーバ　管理画面の有効化

## rabbitMQserverのインストール。
`sudo apt install rabbitmq-server`


## 管理画面プラグインの有効化
`sudo rabbitmq-plugins enable rabbitmq_management`
※これをしないと管理画面にアクセスできません。

```
# sudo rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
  amqp_client
  cowlib
  cowboy
  rabbitmq_web_dispatch
  rabbitmq_management_agent
  rabbitmq_management

Applying plugin configuration to rabbit@satokazuya-VirtualBox... started 6 plugins.
```

##rabbitMQServerの再起動
`systemctl restart rabbitmq-server.service`


## ブラウザにアクセス。
`http://127.0.0.1:15672/`
![Screenshot from 2018-03-12 13-22-34.png](https://qiita-image-store.s3.amazonaws.com/0/213689/27f4f862-5abd-cf2a-ac42-fd968ad64a06.png)

Username: guest
Password: guest

ログインできると思います。