OmniAICreator/Qiita-1.07M huggingface dataset:
RDF/XMLデータモデルのSAXパーサによるパース、のメモ

RDF/XMLのためのSAXパーサの実装（イベントハンドラの実装）をしたら大変だったのでメモ。
大変なので、可能な限りライブラリを使いましょう。たぶんrdf4jとかで大抵のことはできるような気がします。

将来の（色々なことを忘れたときの）自分用のメモなので、感想ポエムを含んだイントロになっています。
実際のソースコードは載っていません。再実装するときや実装を読み解く時のヒントとして。

# イントロ
## RDFとは

https://ja.wikipedia.org/wiki/Resource_Description_Framework

 - 有向グラフで表されるデータ構造。
 - 有向辺自体がPredicate、辺の始点がSubject、終点がObjectとそれぞれ呼ばれる
 - グラフを辺集合の形で、 `<Subject,Predicate,Object>` の対で表す
 - 頂点は「ノード要素」（名前がややこしいが、この記事では、グラフ理論上のノードは「頂点」と表記している。「ノード」とあるものは「ノード要素」を指している。）と「プロパティ要素」がある。
 - Subject は 必ずノード要素である
 - Object は ノード要素あるいはプロパティ要素がありうる
 - したがって `(ノード要素) × (弧) × (ノード要素 or プロパティ要素)` の集合としてデータを表している
 - ノード要素はIDを持つ
 - ノード要素のIDは明示的に与えられている場合と、そうでない場合があり、後者はblank node（一般的な訳語：空白ノード。「無名ノード」とかの方がJavaプログラマにはわかりやすい気がする）と呼ばれる

## RDF/XML

 - 上記の `(ノード要素) × (弧) × (ノード要素 or プロパティ要素)` の集合をXMLで表したもの。
 - 基本は以下の2つで表される
 
``` Objectがノード要素.xml
<rdf:Description rdf:about="SubjectのノードID">
  <Predicate>
    <rdf:Description rdf:about="ObjectのノードID">
    </rdf:Description>
  </Predicate>
</rdf:Description>
```

``` Objectがプロパティ要素.xml
<rdf:Description rdf:about="SubjectのノードID">
  <Predicate>
    Objectのプロパティの値
  </Predicate>
</rdf:Description>
```

 - が、省略記法のルールが多く存在し、パースするのは大変である
 - （たぶん、RDFモデルを人間様が見てもわかりやすいように出力するために、さまざまな省略ができるようになっているように見え、パースするコンピュータ様（のためにパーサを書くためのレベル低めのプログラマ）には優しくない仕様、に見える。※レベル低めのプログラマの感想）

## プログラムで扱うときに困ること
 - グラフ構造になっているので、DOM的な辿り方はできない
    - DOM的なXMLツリーの場合は、「HogeのFugaのPiyoが見たい（例：A部署のBさんの電話番号）」と思ったときに、ツリー化されたXMLであれば、 `Hoge/Fuga/Piyo` (`/部署[@部署名=A]/社員[@氏名=B]/電話番号/text()`) 的なものを取ってくればよいが、XMLとしてはツリー化されないので、HogeのID⇒FugaのIDを取ってきて、FugaのID⇒Piyoの値を取ってくる、みたいなプロセスを踏む必要がある。データ量が大きい場合は、ノード要素のIDでインデクス（ソート木でもハッシュテーブルでも）を作っておいて、検索できるようにしておかないと、常に全部走査することになって遅くなる
 - XMLとして等価でなくても、RDFとして（表現される構造）は等価でありうる
    - 省略記法がたくさんあってつらい
  
といったことがあるので、XMLそのままでは色々と都合が悪く、`(ノード要素) × (弧) × (ノード要素 or プロパティ要素)` の集合の形に書き直す必要がある。

## SAXパーサで書く時のポイント

そんなわけで、SAXパーサで頭から読んでいって、確定した`(ノード要素) × (弧) × (ノード要素 or プロパティ要素)`の値を外（ファイルなりDBなり）に書き出していく。
SAXパーサ（のイベントハンドラ）を実装していくうえでのポイントは以下。

 - パーサに状態を持たせて、モードに合わせて状態遷移させる必要がある
    - `rdf:parseType="Collection", rdf:parseType="Literal", rdf:parseType="Resource"`
    - 特に指定のない場合に2パターン
 - ↑後者の、指定のない場合に2パターンいるのは、主語が読み込み終わっている場合（次の要素をPredicateとしてパースする）と、Predicateまで読みこみ終わっている場合（次の要素をObjectのノード要素あるいはプロパティ要素）で状態を分けるため。


状態は {Root, S1, S2, Collection, Resource, Literal} があって(S1はPredicateのパースが未了、S2はPredicateのパースが済んでいる)、エレメントが開くたびに状態が遷移する。状態遷移のたびに現在の状態をスタックに積む。エレメントが閉じた場合は、スタックからポップして状態を戻す。
エレメントが開いたときの状態遷移は以下。

```
Root  （+ 任意のエレメント）|-> S1
S1 （+ rdf:parseType="Collection|Resource|Literal" のエレメント）|-> Collection|Resource|Literal 
S1 （+ rdf:Resourceを含む=ノード要素 のエレメント）|-> S1
S1 （+ rdf:Resourceを含まないエレメント）|-> S2
S2 （+ 任意のエレメント）|-> S1
Resource （+ rdf:parseType="Collection|Resource|Literal" のエレメント）|-> Collection|Resource|Literal 
Resource （+ rdf:Resourceを含む=ノード要素 のエレメント）|-> S1
Resource （+ rdf:Resourceを含まないエレメント）|-> S2
Collection （+ 任意のエレメント）|-> S2
```

となる。

あとは読みかけの文（SubjectあるいはSubject×Predicate）と、上記の状態をスタックに積んで、PushしたりPopしたりしながら読んでいくと、SAXでちゃんとパースできる。
bin/rails db:migrate でエラー@ActionMailer構築中


# エラーメッセージ
```
yukiya025:~/workspace (mailer) $ rake db:migrate
rake aborted!
PG::ConnectionBad: could not connect to server: Connection refused
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `initialize'
...
...
...
```
# エラーの原因
1. PosgreSQLサービス自体が動いていない
2. postgresqlに必要なデータベース (test, development, productionの3つ) がなかった
3. config/database.ymlがpostgresqlのときの記法ではなく、sqlite3のときの記法のままだった

#「1. PosgreSQLサービス自体が～」の対処

```
yukiya025:~/workspace (mailer) $ psql
psql: could not connect to server: Connection refused
```
$ psql でPosgreSQLが動いていないことが判明したので

```
$ sudo service postgresql start
```
を打つ。

# 「2. postgresqlに必要なデータベース～」の対処
test, development, productionの3つのデータベースをpospresql開始後 ($ psqlを打った後)に作成する。

```
yukiya025:~/workspace (mailer) $ psql
psql (9.3.15)
Type "help" for help.
ubuntu=# create database test; 
CREATE DATABASE
ubuntu=# create database development; 
CREATE DATABASE
ubuntu=# create database production; 
CREATE DATABASE
```

# 「3. config/database.ymlがpostgresql～」の対処
database.ymlの各データベース (test, development, production) の書き方を以下のようなpostgresql記法にする。

```ruby:config/database.yml
database: test
database: development
database: production
```

# 上記3つの対処が終わったら$ rake db:migrate!
$ rake db:migrateで以下のようになったら成功ですd(>u< )

```
yukiya025:~/workspace (mailer) $ rake db:migrate
== 20170805062406 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0117s
== 20170805062406 CreateUsers: migrated (0.0117s) =============================
```
DialogflowをSlackに連携させる

前回
[Dialogflowでチャットボットを作る](http://qiita.com/ume1126/private/5955a0680c430a1cf25f)
[Dialogflowで天気情報を呼び出す](http://qiita.com/ume1126/private/f60335179b1cee25fa2f)

# Slackとは
「[Slack](https://slack.com/)」はビジネス向けチャットとして人気のコミュニケーションツールです。
なにがどうスゴイのかは、[コチラ](https://seleck.cc/424)を参考にしてください。
</br>

今回の目標はこれです。
![1503027988Nf6PhZJ2RMAiQPa1503027480.gif](https://qiita-image-store.s3.amazonaws.com/0/192887/e50c3161-4030-0bab-575b-eef88440f3a1.gif)

Slackの中に「Dialogflow Bot(旧apiai_bot)」というボット用ユーザーを追加し、メッセージを送り合うという形をとります。
また、このapiai_botはチームに紐づけられます。


# 目次
1. Slackに登録する
2. Dialogflowで連携させる
3. ためしてみる

</br>
</br>
</br>
</br>
</br>

# 1.Slackで新しくチームを作る。

今回はDialogflow Botのための専用ワークスペースを作ります。
[Slack](https://slack.com/)のサイトにアクセスし、新しくチームを作成してください。
チームの作成方法については、こちらを参照してください。
→[【登録編入門】slack使い方【世界一丁寧な解説初心者用】](http://qiita.com/dasisyouyu/items/4f227e1616417dd31673)

</br>
</br>
</br>
</br>
</br>

# 2.Dialogflowで連携させる

チームは作成できましたか？
Dialogflowに戻ります。
</br>
</br>
左のメニューから「Integrations」を選び、Slackのボタンをチェックします。
![スクリーンショット 2017-08-14 11.27.30.png](https://qiita-image-store.s3.amazonaws.com/0/192887/462997f4-d9f2-7fd6-0ddc-f436db11d245.png)

</br>
</br>
セッティング画面に移るので、そのまま「TEST IN SLACK」を押します。

![スクリーンショット 2017-08-14 11.30.55.png](https://qiita-image-store.s3.amazonaws.com/0/192887/5878fb69-7466-5c4f-2ddd-41ce290fc9b5.png)
</br>
</br>

ログインされている状態であれば、先ほど作った新しいチーム名が表示されるはずです。
(筆者はweatherというチーム名を作りました)
「Authorize」で進みます。
![スクリーンショット 2017-08-14 12.03.47.png](https://qiita-image-store.s3.amazonaws.com/0/192887/897bd81f-dfe4-6a3c-5f2b-ef3bf6470cbb.png)


Dialogflowに自動で戻り、
![スクリーンショット 2017-08-14 12.10.25.png](https://qiita-image-store.s3.amazonaws.com/0/192887/2880e33f-0789-b454-47ea-d2f9199345d7.png)
このようになれば成功です。
「CLOSE」で画面を閉じます。

</br>
</br>
</br>
</br>
</br>

# 3.ためしてみる
Slackにログインします。
App欄に自動生成された「Dialogflow Bot」を開きます。
![スクリーンショット 2017-08-14 12.12.06.png](https://qiita-image-store.s3.amazonaws.com/0/192887/677b7c87-6d33-68f8-940a-02ce570d865e.png)
</br>
</br>
会話を始めてください。
>―――――――――――――――――――
サンフランシスコの天気は？
―――――――――――――――――――

![スクリーンショット 2017-08-14 12.14.13.png](https://qiita-image-store.s3.amazonaws.com/0/192887/93f84368-fb6c-dbdc-cc1d-18571eadb310.png)
![スクリーンショット 2017-08-14 12.14.34.png](https://qiita-image-store.s3.amazonaws.com/0/192887/0115cb4e-0187-6c25-ff1a-8289ca2108bf.png)
連携成功です。

</br>
</br>
</br>
</br>
</br>

# おわりに
おつかれさまでした。
たくさん学習させ、たくさんトレーニングさせて、
思い思いのチャットボットを作ってみてください。
レスポンスの語尾を「〜〜〜だゾォ」とするだけで、クレヨンなんちゃら風に、
「〜〜〜ナリ！」とするだけで、キテレツなんちゃら風になります。
せっかくなので楽しんで、オリジナルのbotを作ってみてください。
</br>
筆者は愛犬コティさん(7歳/メス/犬種：オーストラリアンラブラドゥードル/特徴：おバカでかわいい)の気持ちを代弁してくれるチャットボットを鋭意作成中です。
railsでの共通のテンプレート、アクションの書き方

# 共通のテンプレート、コントローラを書く所

基本的にはapplication〜は全部のページ共通のものを書く。

* application.html.erb
* application_controller.rb

application.html.erbのyeilde部分に各テンプレートが入ってくる。

# アクションの適用範囲

基本的にはアクションは同じ名前のviewファイルにしかきかない。しかし、before_actionで設定するとそのコントローラー内のアクションの対象ビュー全部に適用できる。before_actionはメソッドを指定する。

# フィルターについて

フィルターというのはcontrollerに記述してアクションの前後で共通で行うものを指定するためのもの。アクションメソッドの前に共通して行うのをbefore_action、後に行うのをafter_action、どちらにも行うものをaround_actionという。

```ruby:rei.controller.rb
before_action:login
```

# before_actionの使い方

下記のようにして対象範囲を絞ることもできる

```ruby:rei
before_action:login , {only:[:index,:show]}
before_action:login , {except:[:index,:show]}
```
サーバーを立てて、OSをインストールして、PHPとapacheでwebページを公開する。②sshをrsa認証にしてセキュリティをよくする

#セキュリティ
rootユーザー（なんでもできる）ユーザーでログインできる状態にして置くと、パスワードを破られたとき、情報を抜き取られ、最悪の場合犯罪の片棒を担ぐことになります。
ログイン方法を制限して、さらにわかりづらいログイン方法にします。


#まずはログイン
sshでログインします
![qiita7.jpg](https://qiita-image-store.s3.amazonaws.com/0/195504/e88ed06a-d9df-2c4a-dafd-7abe4c1bd373.jpeg)
その後コマンドを実行ユーザー名はここではuserとしています。
パスワードの作成などしてください。
ユーザーをスーパーユーザーに設定して、そのユーザーにログインします
ユーザーの権限を確認するためにsudoコマンドを使ってみます
最後まで実行してslが走ったらOK!
下準備としてフォルダを作ります

```
adduser user
usermod -G sudo user
su user
sudo apt-get install sl
sl
mkdir .ssh
```



#まずは鍵の作成
ターミナルで鍵を作成するコマンドを打ちます。上から順番に実行。
ファイル名とパスフレーズ（パスワードではない）を打ちます。
user nameは自分で決めたもので送ります。

```
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa

scp id_rsa.pub user@172.104.100.125:/home/user/.ssh
```

#ログイン
サーバーにログインし直します。
macのターミナルに以下のようにうちます。パスワードは新しいユーザーです
```
ssh ando@172.104.100.125
```

#sshの設定
以下のコマンドで設定をひらけます
```
sudo nano /etc/ssh/sshd_config
```

下のように設定を変更してください。
ポートは22以外を指定することをオススメします。
RSA認証を有効にして、パスワード認証をオフにします。

```
port 10022　　　　　　　#好きな番号で

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/id_rsa.pub

PasswordAuthentication no
```

そして再起動してあげると設定が完全に反映されます

```
sudo reboot
```

#確認
接続できるか確認します。
できたら終わりです

```
ssh -p 10022 user@172.104.100.125
```

次回はmysqlを導入します
-ActiveDirectory-きめ細かいパスワードポリシー(PSO)の設定

#きめ細かいパスワードポリシー(PSO)とは

GPOで設定可能なパスワードポリシー設定とは異なり、ユーザごと、グループごとにパスワードポリシーの設定ができるもの。

#設定方法
※今回設定を行ったのはAWSのMSAD、win2012の環境です※

スタート > ActiveDirectory管理センター > 該当ドメインフォルダ > [System] > [Password Setting Container]
![PSO01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/60d31443-9037-3a5a-3d7c-b7adb4577466.png)

CustomerPSO-01〜05まで表示があります。
優先順位は数が小さいものから優先されます。
今回は01のもので設定を行いました。

[パスワードの設定]で希望の設定値に設定を行ったら、[直接の適用先]で適用を行いたいユーザやグループの選択を行います。

![PSO.png](https://qiita-image-store.s3.amazonaws.com/0/174392/ba66c071-81cd-3060-9080-807154eae78d.png)

設定を行ったのち[OK]をクリックすれば設定は完了です。

#適用後の確認方法
今回頭を悩ませたのが、この確認方法です。

はじめはNet Userコマンドでユーザの情報を確認していたためPSOで適用したはずのポリシー内容が反映されていませんでした。

よくよく調べてみると、Net Userコマンドでは、カスタムパスワードポリシーの情報を取得することがきないとのこと。
カスタムパスワードポリシーが適用されているかどうかを確認する場合は、以下のコマンドで。

> Get-ADUserResultantPasswordPolicy -Identity <ユーザー名>

もしくは、以下。

```
> dsget user “CN=test,OU=Users,OU=test,DC=test,DC=intra” -effectivepso
  effectivepso
  “CN=CustomerPSO-01,CN=Password Settings Container,CN=System,DC=test,DC=intra”
dsget 成功
```

PSOの設定を行ったユーザのプロパティ > 属性エディターからも確認できます。
属性エディターの[msDS-ResualtantPSO]に適用したPSOが表示されていればOK。
ちなみに[msDS-ResualtantPSO]既定では非表示になっているため[フィルター]から[構築済み]を選択すると表示されるようになります。

![PSO03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/42599939-92fe-163e-4743-ba4b135d5cd6.png)


#PSOの設定を行った場合のポリシーの適用順位

PSOとGPOの両方が設定されている場合、適用される優先順位は以下の通り。

```
1.PSOのユーザー
2.PSOのグループ
3.ドメイン配下のGPO（Default Domain Policy）
```
PSOが設定されていないユーザに関してはGPOが適用されるようになっています。
3minネットワーキングを読んで（自分用メモ）


## はじめに
[3minNetworking](http://www5e.biglobe.ne.jp/%257eaji/3min/index.html)を読んで自分用に知らなかったこと、忘れそうなことをメモ。

## レイヤ１ネットワークデバイス
+ ハブやリピータはハブ・リピータの経由可能台数に制限がある
 - 10BASE-T：４つ
 - 100BASE-T：２つ

## トポロジ
+ ５種類のトポロジがある。
 - バス型
 - リング型、二重リング型
 - スター型、拡張スター型
 - ツリー型
 - 完全メッシュ型、部分メッシュ型
+ 物理トポロジと論理トポロジ
 - 物理トポロジ：物理的な機器の配置
 - 論理トポロジ：データの動きでわける

## レイヤ2
+ MACアドレスはNICにつけられている
+ 異なる帯域同士をスイッチで接続しても通信できているのは、ストアアンドフォワード方式という方式で、
  ポートから来たデータを一時的にバッファして、キューのように順番に送信しているため。かつそのため、衝突も発生しない。
+ Full duplex はイメージは「電話」、Half duplexはイメージは「トランシーバ」

## レイヤ3
+ ICMPのパケットのICMPメッセージ内の「type」はエラー切り分けに有効
  + 下記がその一覧
  
| code	| 説明	| 意味 |
|:---:|:---:|:---:|
| 0 | 	Net Unreachable |	ネットワークへ到達不能 |
| 1	| Host Unreachable | 	ホストへ到達不能 |
| 2	| Protocol Unreachable	| そのプロトコルは使用できない |
| 3	| Port Unreachable	| 対象ポートが閉じている |
| 4	| Fragmentation Needed and DF was Set	| パケットサイズが大きいため分割したいが、分割が不可になっている |
| 5	| Source Route Failed	| ソースルートが不明。|
| 6	| Destination Network Unknown	| 宛先ネットワークが不明 |
| 7	| Destination Host Unknown	| 宛先ホストが不明 |
| 8	| Source Host Isolated	| 宛先ホストがネットークから分離されている |
| 9	| Communication with Destination Network is Administratively |  Prohibited	宛先ネットワークとの送信が禁止中 |
| 10 | Communication with Destination Host is Administratively Prohibited	| 宛先ホストとの送信が禁止中 |
| 11 | Destination Network Unreachable for Type of Service	| 指定したサービスタイプでは宛先ネットワークへ到達不能 |
| 12 | Destination Host Unreachable for Type of Service	| 指定したサービスタイプでは宛先ホストへ到達不能 |

## レイヤ4
+ 3 way handshake で、切断する場合は、双方向で"FIN"が送られなければ切断されない

## DNS
+ DNSヘッダの中身。

| ビット数	| 名前	| 略称 |  意味 | 解説 |
| :---: | :---:  | :---:  |  :---:  |  :---:  |
| 1	| 問い合わせ/応答	| QR	| 0…問い合わせ<br>1…応答 |リゾルバからの問い合わせは0でネームサーバからの応答は1 |
| 4	| オペレーションコード	| OPcode	| 0…問い合わせ<br>1…逆問い合わせ<br>2…サーバ状態要求<br> | 正引きか逆引きか |
| 1	| オーソリティ応答	| AA |	0…反復の結果の応答<br>1…そのネームサーバからの応答 | ネームサーバへの問い合わせが0で、その問い合わせに対して名前解決可能ならば1|
| 1	| 切捨て	| TC |	0…データサイズ512バイト以下<br>1…512バイト超 | 問い合わせパケットを分割する必要があるかないか|
| 1	| 再帰要望	| RD |	0…反復問い合わせ<br>1…再帰問い合わせをネームサーバに要求 |ネームサーバに問い合わせることをさあいど問い合せで1、問い合わせたネームサーバが別のネームサーバに問い合わせることを反復問い合わせで0 |
| 1	| 再帰有効	| RA |	0…再帰不可能<br>1…再帰可能 |再帰問い合せ 可能か否か|
| 3	| 予約	|--|	すべて0 | |
| 4	| 戻りコード	| Rcode	| 0…応答成功<br>3…問い合わせの名前なし | ドメイン名の解決ができたら0で、できなかったら3|


+ 逆引きの仕組みは、逆引き用に正引きと同じゾーンが存在しており、そのゾーンを引くことで逆引きができている

## HTTP
+ 重要な情報(名前、住所、電話番号、クレジットカード番号、パスワードなど)はCookieには保存しない。クロスサイトスクリプティングなどで情報を盗まれるおそれがあるため
xautomationでマウスクリックを自動化

```
apt install -y xautomation
```

* `mousemove`の座標はx,y
* `mouseclick 1` は左クリック

```sh:autoclick.sh(例)
export DISPLAY=:0

autoclick() {
    xte -x :0 "mouseclick 1"
}

start() {
    xte -x :0 "mousemove 590 840"; autoclick
    sleep 0.1
}

reload() {
    xte -x :0 "key F5"
}

loop() {
    for i in `seq 2000`
    do
	start
        echo $i
    done
    reload
}

for i in `seq 50`
do
  loop
done
```
Cognos Analytics での監査ログ機能のセットアップ手順

##概要
Cognos Analyticsで監査機能のセットアップ行う方法を記述します。

##Cognos Analyticsの監査機能について
監査機能とは、Cognos Analyticsにユーザーがログイン、レポートを実行、ログオフ、等の作業を行ったタイミングで、監査データベースのテーブル内に処理情報を保管し、レポートによる履歴データの参照が行える機能となります。
参照のためのレポートは、サンプルとして提供されているものもありますが、プロジェクト毎に要件に応じたレポートを作成する事も可能です。
監査ログのDBへの取得、サンプルレポートのセットアップまでの一連の手順を記載します。

##監査機能の注意点
Cognos Analyticsにはレポート実行モードとして、互換(CQM)モードと動的(DQM)モードが存在しますが、動的モードで実行されたレポートの監査の際に、ネイティブクエリーの監査を行う事はできません。

監査ログはDBのテーブルに保管されますが、保管された履歴データを自動的に削除する機能は提供されていないため、SQLを用いてマニュアルで消しこみを行う必要があります。

Cognos Analyticsでは、監査テーブルのCOGIPF_PARAMETER表にCOGIPF_LOCALTIMESTAMP列が追加されました。
これまで、以下のTechnoteのように、他テーブルとJOINをしたSQLのDELETE文を発行していましたが、この様な対応は必要無くなり、COGIPF_PARAMETER表に関しても、TIMESTAMPを指定したメンテナンスが可能になりました。

【Technote:監査データベースのレコード削除について】
http://www-01.ibm.com/support/docview.wss?uid=swg21452461

##手順
**監査DBの作成**
1.Content Store作成の際に使用した、以下のフォルダに存在する、created.sqlファイルを監査DB作成時に使用するため、コピーします。名称をcreateAuditDb.sqlとします。
※<Cognos_Install>\configuration\schemas\content\db2に存在

2.createAuditDb.sqlファイルをメモ帳等で開き、以下の置き換えを行います。
   ContentStoreDB名 → 監査DB名
   IBM Cognos Content Store → IBM Cognos Audit

3.DB2コマンドウィンドウ上で、db2 –tvf createAuditDb.sql を実行し、監査DBを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/8bedf6bd-92a5-74d1-7429-d4deb3b9d24a.png)

**監査DBへの接続**
1.Cognos Configrationを起動します。

<2019/10/8追記>
1.5 「環境」→「ログ記録」で「TCPを使用」を「有効」に変更。
<img width="675" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f1e92439-f86b-70b8-db98-f6c988cc7be6.png">

2.「環境」→「ログ記録」を右クリックし「新規リソース」→「宛先」を選択します。

3.名前に任意の名称(例：AuditLogDB)、タイプに「データベース」を選択しOK。

4.作成したエントリ(AuditLogDB)を右クリックし「新規リソース」→「データベース」を選択します。

5.名前に任意の名称(例：AUDIT)、タイプに「DB2データベース」を選択しOK。

6.「データベース・サーバーとポート番号」「ユーザーIDとパスワード」「データベース名」を記載し、AUDITを右クリックしテストします。

7.Cognos Configrationを保存します。

8.Cognos Configurationで、Cognosを起動します。
※起動はサービスからではなく、Cognos Configurationで実施してください。起動中に監査用のテーブルが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/0a838954-8e4f-1cae-f143-5d8fe40acc00.png)

**サンプル監査レポートのセットアップ**
1.<CognosInstall>\webcontent\samples\contentからIBM_Cognos_Audit.zipファイルを、 <CognosInstall>\deploymentにコピーします。

2.ブラウザからシステム管理者ユーザーでCognosに接続し、「管理」メニューから「管理コンソール」を選択し、Cognos Administrationを起動します。

3.「設定」タブの「コンテンツ管理」から「インポートの新規作成」アイコンを選択し、IBM_Cognos_Auditをインポートします。
チームコンテンツフォルダ直下に、Samples_Audit→監査フォルダが作成され、各種サンプルレポートが配置されます。

4.データソースを定義します。Cognos Administrationの「設定」タブの「データソース接続」から「データ・ソースの新規作成」を選択します。

5.名前に「Audit」を指定し、作成された監査DBへの接続定義を記載し、接続確認を行い保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/dbb4d922-8237-ce50-e2ee-c960914f5c31.png)

**監査情報の出力設定**

1.Cognos Administrationの「設定」タブの「ディスパッチャとサービス」から、カテゴリに「ログ記録」を選択し、「最小限」となっているログ記録のエントリーを「標準」に変更します。
※この設定で、ユーザーのログイン・ログオフ及びレポートの実行タイミングは記録されますが、ネイティブクエリーの監査は行われません。
ネイティブクエリーの監査を行う場合は、「Report サービス用ネイティブ・クエリーの監査」及び「Batch Report サービス用ネイティブ・クエリーの監査」にチェックを入れて下さい。
前述の通り、DQMパッケージのレポートでは、ネイティブクエリーの情報を保管する事はできません。

2.設定を保存し、何らかのユーザーでログイン後、レポートを実行し、サンプルレポートの「ユーザー別実行履歴」レポートにて、監査履歴が表示される事を確認してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/ce8f1082-29ab-07ea-0e59-a8ec8608709f.png)
既存のDynamoDBのテーブルをjsonフォーマットに変換するワンライナー

# はじめに

* AWS cliでテーブル作っていたのですが、jsonで作っておくべきだった・・・。と大変後悔しました。
* 既存のDynamoDBのテーブルからjsonを出力するスクリプトの記事を見つけたのですが、GlobalSecondaryIndex、LocalSecondaryIndexが無いテーブルの場合はエラーになってしまいますので少し改良したのでご紹介します。
    * 参考：[既存のDynamoDBテーブルからテーブル定義を作成する](https://www.hands-lab.com/tech/entry/188.html)
* このスクリプトをうまく利用することでテーブルの差分をみるのに使えたりするのでオススメです。

# スクリプト

* ここではDynamoDBLocalにあるAssetというテーブルをAsset.jsonというファイルに出力しています。
* describe-tableでは余計なものがいっぱいついてくるので要素を削除しています。

```
aws dynamodb describe-table --table-name Asset --endpoint-url http://localhost:8000 |
jq '.Table' |
jq 'del(.TableArn)' |
jq 'del(.GlobalSecondaryIndexes[]?.ItemCount)' |
jq 'del(.GlobalSecondaryIndexes[]?.IndexStatus)' |
jq 'del(.GlobalSecondaryIndexes[]?.IndexArn)' |
jq 'del(.GlobalSecondaryIndexes[]?.IndexSizeBytes)' |
jq 'del(.GlobalSecondaryIndexes[]?.ProvisionedThroughput.NumberOfDecreasesToday)' |
jq 'del(.GlobalSecondaryIndexes[]?.ProvisionedThroughput.LastIncreaseDateTime)' |
jq 'del(.GlobalSecondaryIndexes[]?.ProvisionedThroughput.LastDecreaseDateTime)' |
jq 'del(.LocalSecondaryIndexes[]?.IndexStatus)' |
jq 'del(.LocalSecondaryIndexes[]?.IndexArn)' |
jq 'del(.LocalSecondaryIndexes[]?.ItemCount)' |
jq 'del(.LocalSecondaryIndexes[]?.IndexSizeBytes)' |
jq 'del(.LocalSecondaryIndexes[]?.ProvisionedThroughput.NumberOfDecreasesToday)' |
jq 'del(.LocalSecondaryIndexes[]?.ProvisionedThroughput.LastIncreaseDateTime)' |
jq 'del(.LocalSecondaryIndexes[]?.ProvisionedThroughput.LastDecreaseDateTime)' |
jq 'del(.ProvisionedThroughput.NumberOfDecreasesToday)' |
jq 'del(.ProvisionedThroughput.LastIncreaseDateTime)' |
jq 'del(.ProvisionedThroughput.LastDecreaseDateTime)' |
jq 'del(.TableSizeBytes)' |
jq 'del(.TableStatus)' |
jq 'del(.ItemCount)' |
jq 'del(.IndexArn)' |
jq 'del(.CreationDateTime)' > Asset.json
```

# 出力されたスクリプトを利用してcreate-tableする

```
aws dynamodb create-table --endpoint-url http://localhost:8000 --table-name Asset --cli-input-json file://Asset.json
```
Android N で CONNECTIVITY_CHANGE を BackGround で受け取る

ネットワークの状態変更をAndroid Nでも常時受け取りたいと思ったのですが、ちょっと調べた範囲では「Activityでやりましょう」という記事が多かったため、メモがてら実行結果を残しておきます。

## Android Nからの変更点
ご存知のように、Android Nから[バックグラウンド処理の最適化](https://developer.android.com/about/versions/nougat/android-7.0-changes.htmliter)が行われるようになりました。
そのため、Android Nからは以下のように AndroidManifest.xml に記載しても開発中は警告が出ますし、実際に起動させても通知してくれません。

```xml:AndroidManifest.xml
<manifest ...>

    <application ...>

        <receiver android:name=".ConnectivityBroadcastReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

    </application>

</manifest>
```

## 代替案
そのため、CONNECTIVITY_ACTION を registerReceiver で登録してあげることでAndroid N以降も動作するようになります。
試してみたところ、私の手元の端末2台では、Activity でも Service でも動作を確認できました。
以下は Service での例になります。

```kotlin:ConnectivityChangeService.kt
class ConnectivityChangeService : Service() {
    override fun onBind(intent: Intent?): IBinder = Binder()

    // 変更時処理
    private val receiver = object: BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            if (intent == null || context == null) {
                return
            }
            val action = intent.action
            if (action != ConnectivityManager.CONNECTIVITY_ACTION) {
                return
            }

            // TODO
        }
    }

    override fun onCreate() {
        registerReceiver(receiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int = START_REDELIVER_INTENT

    override fun onDestroy() = try {
        unregisterReceiver(receiver)
    } catch (e : IllegalArgumentException) {
        // エラー処理
    }
}
```

※ **Build.VERSION.SDK_INT**での分岐は適宜行ってください<(_ _)>

## 雑感
Android NでもCONNECTIVITY_CHANGEは受信可能になりました！
バージョンごとに次々と変更点が増えていくので、しっかりドキュメントを読んで代替案を使えるようにしていきたいと思います。
UnityのImage Effectでモザイクをかける

UnityのImage Effectでモザイクをかけるためのshaderです。
`_BlockNum`プロパティでモザイクのブロックの数を変更できます。

```:Mosaic.shader
Shader "MyEffect/Mosaic"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_BlockNum ("Number Of Blocks", Float) = 10
	}
	SubShader
	{
		Pass
		{
			CGPROGRAM
			#pragma vertex vert_img
			#pragma fragment frag
			
			#include "UnityCG.cginc"
			
			sampler2D _MainTex;
			uint _BlockNum;

			fixed4 frag (v2f_img i) : COLOR
			{
				fixed2 f = floor(i.uv * _BlockNum);
				fixed size = 1.0 / _BlockNum;
				fixed2 lb = f / _BlockNum; // left bottom
				fixed2 lt = lb + fixed2(0.0, size); // left top
				fixed2 rb = lb + fixed2(size, 0.0); //right bottom
				fixed2 rt = lb + fixed2(size, size); // right top
				fixed4 c = (tex2D(_MainTex, lb) + tex2D(_MainTex, lt) + tex2D(_MainTex, rb) + tex2D(_MainTex, rt)) / 4.0;
				return c;
			}
			ENDCG
		}
	}
}
```

![FrameBuffer.gif](https://qiita-image-store.s3.amazonaws.com/0/61569/30e88f3c-50ad-d5a9-ffe7-14442f84d5aa.gif)
ちょっとずつ読むドメイン駆動設計 まえがき1

> オブジェクトコミュニティの底流として、ある哲学が出現してきている。私はその哲学を、ドメイン駆動設計と呼んでいる。(まえがき より)

ドメイン駆動設計は、オブジェクト指向におけるモデリングと設計・実装について、Ericを含めたコミュニティが実践・経験してきたものをEric自身がまとめたものということかな。

なので、「ドメインモデル」そのもののみがテーマであるということではない、(実際、「モデル駆動設計」は１つのパターンとして挙げられている)ということは目次を見てもわかるかと。
ドメインモデルは進化していくもので、その進化のさせ方やプロジェクトのスケールの話しまで幅広く述べられています。

それでも、
> 成功したプロジェクトに共通する特徴は、豊かなドメインモデルがあったということだ(まえがき より)

というように、やはり基本は「ドメインモデル」。

ドメインモデルは成長する、その過程も含めてドメイン駆動設計。
VPC環境でのEC2インスタンスはプライベートIPアドレスは固定

EC2のプライベートアドレスが停止するたびに開放されるということを、聞いたことがあったので、固定の方法を調べた。
結果としてVPC環境で作っていればプライベートIPアドレスは変わらないうことがわかったので、固定する必要性があまりなくなって終了

[Amazon EC2 インスタンスの IP アドレッシング](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-instance-addressing.html)
> EC2-Classic で起動されるインスタンスでは、インスタンスが停止または終了したときにプライベート IPv4 アドレスが解放されます。停止したインスタンスを再開すると、インスタンスには新しいプライベート IPv4 アドレスが割り当てられます。

> VPC で起動されたインスタンスの場合、インスタンスが停止後に再開されたときはプライベート IPv4 アドレスとネットワークインターフェイスの関連付けが維持され、インスタンスが終了されたときは解放されます。
大きなファイルを転送するときのrsyncオプション 【scpは使ってはいけない】

**これを指定しておけば、ロバストな転送ができる**。大きなファイルの転送は必ずrsyncを使い、ベリファイをしない scp は使ってはいけない。

# 必ず `-a` `-c` (`--checksum`) と `--append-verify` をつける
```bash
rsync -ac --append-verify
```


- rsyncはオプションを特に指定しなくてもチェックサムを使って転送したファイルが正しいか調べる
- ただ、すでにファイルがローカルにも有った場合、転送するかどうかは日付やサイズだけに依存する。
    - `-c` (`--checksum`)をつけると、チェックサムが違うと転送するようにできる
- `--append-verify` はリジューム（再開）に有用なオプションで、接続が切れたときにももう一度同じコマンドを叩けば、ベリファイをした後に転送を再開できる。
    - これによって、何度コマンドを叩いてもファイルの冪等性があることになる

# その他便利なtips

## オプション
- `-v` はファイル一覧を出してくれるが、細かいファイルが多いとパフォーマンスが下がるかもしれない
- さらに `--progress` をつけると、1ファイルごとの転送レートや転送の進捗を出すことができる

## tips
- [ssh config](http://qiita.com/keiya/items/dec9a1142ac701b19bd9) でホスト名を書いておくと捗る
    - `rsync -avc --append-verify --progress hostname:~/test.bin ~/target_dir/` 的な。
        - **hostname**からコピーする例。
- **src (転送元)には最後のスラッシュをつけないほうが、思った通りの結果になる**
Porosity: EthereumのEVMバイトコードのデコパンパイラ


メモ




## PDFなスライド

https://www.comae.io/reports/dc25-msuiche-Porosity-Decompiling-Ethereum-Smart-Contracts.pdf

## GitHubのコード

* [comaeio/porosity: Decompiler for Blockchain-based Ethereum Smart-Contracts](https://github.com/comaeio/porosity)


## ブログ記事

[DEF CON 25: Porosity – Comae Technologies](https://blog.comae.io/porosity-18790ee42827)



## ホワイトペーパー(PDF)

https://www.comae.io/reports/dc25-msuiche-Porosity-Decompiling-Ethereum-Smart-Contracts-wp.pdf


## ニュース記事


['First' Ethereum Decompiler Launches With JP Morgan Quorum Integration - CoinDesk](https://www.coindesk.com/first-ethereum-decompiler-launches-jp-morgan-quorum-integration/)
【メモ】Laravelのリソースコントローラーの各メソッドの役割まとめ

| HTTPメソッド       | パス | メソッド    |役割 |
|:-----------------|:------------------|:------------------|:-------|
| GET             | /posts | index |リソースの一覧表示|
| GET           | /posts/create | create |リソースを新規作成するためのフォームを表示|
| POST             | /posts | store |リソースを新規作成|
| GET               | /posts/{post} | show |指定されたリソースの詳細情報を表示|
| GET             | /posts/{post}/edit | edit |指定されたリソースの編集フォームを表示|
| PUT/PATCH          | /posts/{post} | update |指定されたリソースを更新|
| DELETE          | /posts/{post} | delete |指定されたリソースを削除|

(参考)
http://www.dn-web64.com/archives/web/laravel_resourcefull-controller/
機械学習論文読みメモ_92


[Density Estimation via Discrepancy Based Adaptive Sequential Partition](http://papers.nips.cc/paper/6216-density-estimation-via-discrepancy-based-adaptive-sequential-partition.pdf), NIPS2016
あるドメインにおいて定義される絶対連続な分布よりiidな観測が得られている場合において、その確率密度分布を区分定値な関数を用いて学習するノンパラメトリック手法を提案する。
この区分定値関数はバイナリ分割を行っていく事で構築される。
提案手法において鍵となるのは、Quasi Monte Carlo分析の分野より提案されているdiscrepancyの指標を用いる事で分割を制御する事である。
このdiscrepancyは一様性を測る事に用いる事ができる指標である。
結果提案手法は簡単かつ効率的で、また証明された収束レートを持つ。

[Multi-view Anomaly Detection via Robust Probabilistic Latent Variable Models](http://papers.nips.cc/paper/6455-multi-view-anomaly-detection-via-robust-probabilistic-latent-variable-models.pdf), NIPS2016
Multi-viewデータ関して、それらに一貫しない異常データの検出を行う潜在変数モデルを提案する。
提案手法では、１つの潜在変数ベクトルから全てのデータが生成できると仮定する。
異常なデータの場合、2つ以上の潜在変数ベクトルを用いないとそのデータを表現出来ないと仮定する。
あるデータを表現するために必要なベクトル数をDirichlet processで予測し、それによりmulti-view anomaly scoreを計算する。
この提案手法はノイジーなmulti-view dataに対して適用可能な、probabilistic canonical correlation analysisのロバスト化したものと考える事ができる。

[Variance Reduction in Stochastic Gradient Langevin Dynamics](http://papers.nips.cc/paper/6292-variance-reduction-in-stochastic-gradient-langevin-dynamics.pdf), NIPS2016
Stochastic gradient Langevin dynamicsは大規模データに対する事後分布推定のための手法として用いられる。
この手法はミニバッチを用いて計算されるノイズを含んだ勾配を利用する。
しかしこれにより生じる勾配の分散により、性能及び収束速度が低下する問題がある。
本論ではこうした分散を小さく抑える手法を提案する。
提案手法はより良い収束レートを持つ事を証明した。
機械学習論文読みメモ_91


[Efficient Nonparametric Smoothness Estimation](https://arxiv.org/abs/1605.05785), NIPS2016
確率密度分布に対するSobolev quantities（ノルム、内積、距離など）はノンパラメトリック統計の理論において重要だが、実用的な推定器の不足よりあまり利用されない。
その中には様々なapplicationで利用されるL2距離なども含まれている。
本論では不明な確率密度分布に関するSobolev quantitiesに対する推定器を提案、分析した。
提案した推定器の有限サンプルに対する予測誤差、分散のboundを求め、それがminimax rate-optimialである事を示した。
提案した推定器は従来のものと比較して、より計算しやすいものとなっている。

[Fast epsilon-free Inference of Simulation Models with Bayesian Conditional Density Estimation](http://papers.nips.cc/paper/6083-fast-free-inference-of-simulation-models-with-bayesian-conditional-density-estimation.pdf), NIPS2016
多くの統計モデルはシミュレーションが可能だが、計算不可能な尤度関数を持つ。
Approximate Bayesian Computation (ABC)はそうしたモデルに対してMCMCと統計量に基づいたlikelifood-freeな手法を与える。
ABCは観測データのε-ball周りに計算された事後分布サンプリングが存在するよう条件付ける。
MCMCサンプリングにより、近似した事後分布から実際のサンプルを得る事ができる。
これらはε値を０に近づけるほど近似精度が向上するが、計算コストが高くなり、また事後分布以外の分布からのサンプリングも得やすくなってしまう。
本論では、新たなlikelifood-freeな手法として、bayesian conditional density estimationに基づいた手法を提案する。
この手法は初期の限定されたシミュレーションにより得られたサンプルを用いてそれ以後のサンプリングを条件つける。
この方法だと従来のMCMCベースの手法と比較して正確な事後分布の予測をより少ないサンプリング回数で実現する事ができる。

[Rényi Divergence Variational Inference](http://papers.nips.cc/paper/6207-renyi-divergence-variational-inference.pdf), NIPS2016
本論では従来のvariational inferenceをRenyi alpha-divergenceの枠組みで利用可能なより一般化されたvariational Renyi boundを提案する。
この手法は今まで存在したvariationalな手法を統一し、またスムーズな内挿を可能にする。
Reparameterization trick, MCMC, stochastic optimizationなどの手法を取り入れる事で計算可能で統一された最適化フレームワークを提案する。
またalphaが負である場合も考え、それに関する新たあvariatinal inference手法を提案する。
ざっくばらんメモ_3：kaggle、photorealistic画像生成


###[kaggle zillow challenge](https://www.kaggle.com/c/zillow-prize-1/overview)
今回解くべきタスクは各月に対するlogerrorであったが、
現在までは簡単のため月の区別はせずに予測を行っていた。
これは明らかな性能のボトルネックであるので、次に
月毎の予測を行うようモデルを切り替えていきたい。
ただ予測する年月は201610,201611,201612,201710,201711,201712どある一方、
訓練データには2016年のデータしかなく、2017年固有の要素を予測するのは
難しいと思われるので、年の違いは考慮せず、月に対する予測のみを考える。
月毎の予測に切り替えて結果を出したが、
見た感じだと、予測値は月によって変化がなさそうである。
結果：0.0660908で改善なし。
前回stackingありで性能が落ちていた事もあるので、
stackingなしでも試してみる。
結果：0.0660310でほぼ変わらず。
どうにも月に関する情報を活かしきれていないように感じる。
あるいは訓練データには10--12月の情報がないので、月の情報に関する外挿は難しいのかもしれない。
（あるいはバグがあるのかもしれない）


###[Photographic Image Synthesis with Cascaded Refinement Networks](https://arxiv.org/pdf/1707.09405.pdf)
photorealisticな画像をsemanticなレイアウト情報、画像のどのピクセルがどの物体へ属するかの情報、を援用する事で作成するというもの。
生成される画像は、一部うねりがあったりと完全に現実的な訳ではないが、従来手法と比較するとかなりリアルな画像生成ができるようになっているようである。
ある程度綿密なsemanticレイアウト情報が必要となる手法であるが、シミュレーション環境などを用いればシミュレーション画像→対応するsemanticレイアウト→本手法によるphotorealistic画像生成と繋げられるので問題はなさそうである。
サーバーを立てて、OSをインストールして、PHPとapacheでwebページを公開する。

#クラウドサーバーとは
クラウドサーバーとは簡単にいうと、「すごいパソコンを借りて、Webページの公開・ファイルの共有など」を行うものです。
ちなみにVPSとの違いはOSの再インストールとかが簡単にできたり、複数台契約できたり、ストレージの管理だったりもできて、色々安いです。
今回は[linode](https://manager.linode.com)でのサービスを使って説明します。

#下準備
一応PCを持っている前提でお話しします
[linode](https://manager.linode.com)にアクセスして、登録を済ませてください。

#インストール
①プランを選びます
②Tokyo　２,　JPを選んでください。
③add this linode をクリック
![スクリーンショット 2017-08-14 1.19.22.png](https://qiita-image-store.s3.amazonaws.com/0/195504/b16ac43b-d9f2-b3d1-4250-c495659d06f1.png)

#ダッシュボードを開く
自分が契約したサーバーの状況とかを見ることができます。
とりあえずクリック
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/195504/49941a1a-4ea2-be94-2518-ba4c6b99aa60.jpeg)

#OSのインストール
次にrebuildのタブを開く
![qiita3.jpg](https://qiita-image-store.s3.amazonaws.com/0/195504/5fd0797c-95b1-e435-86c2-f58625df38fa.jpeg)

①インストールするOSを選ぶ。Ubuntu 16.04 LTSを選ぶ
②4096MBのディスクがにインストールします
③パスワードを入力してください。おぼえておいてください。忘れるとサーバーが起動できません。
④rebuildをクリック
![qiita4.jpg](https://qiita-image-store.s3.amazonaws.com/0/195504/02d620e1-7d04-c898-0c4f-30e89914c584.jpeg)

#サーバーを起動
①bootボタンを押して
②Remote Accessします。
![qiita6.jpg](https://qiita-image-store.s3.amazonaws.com/0/195504/1ab80d03-e85a-c1f7-a0bf-2c7e47e3557c.jpeg)

#サーバーにアクセス
Macならクリックして接続できます。
![qiita7.jpg](https://qiita-image-store.s3.amazonaws.com/0/195504/d44f9565-1f12-14e1-e1af-a60b5c1dee2a.jpeg)

許可してください
![qiita8.jpg](https://qiita-image-store.s3.amazonaws.com/0/195504/5aad306e-4fa6-81eb-6f28-d144bf7cf749.jpeg)

①yesと入力してEnter
②パスワードを入力してEnter
![qiita9.jpg](https://qiita-image-store.s3.amazonaws.com/0/195504/7cca8616-eb3b-0df3-89e5-64a77dd5d33e.jpeg)

そしたら

```
apt-get update
apt-get install -y php apache2
```

と打って待ちましょう。

とりあえずこんな画面が出てくればOKです。
![スクリーンショット 2017-08-14 9.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/195504/2f34090d-fdba-0069-03ae-3508ce50e46b.png)


###結構時間かかるのでここから先は次回！
kdl-parserを使ってurdfをパースする

#URDFとは？
gazeboで使用されているロボットの物理モデルの表現形式、xmlの書式でロボットのパラメータが記述されている。
urdfのパーサーには以下のものがある。([kdl-parser](http://wiki.ros.org/kdl_parser),[urdf_parser](http://wiki.ros.org/urdf_parser))
/robot_descriptionパラメータにはURDF形式の文字列が入力されており、robot_state_publisher等で参照されている。
今回は/robot_descriptionパラメータからデータを受け取りそれを元にロボットの物理パラメータを取得する。

#kdl-parserを使用する準備

package.xml,CMakeLists.txtにkdl_parserを追加

```xml:package.xml
<package>
  <build_depend>kdl_parser</build_depend>
  <run_depend>kdl_parser</run_depend>
</package>
```

```cmake:CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  roscpp
  rospy
  sensor_msgs
  std_msgs
  tf
  tf2
  roslib
  urdf
  #add kdl_parser to find_package
  kdl_parser
)
```

#C++コードの追加
以下のようなC++コードを追加

```cpp:load_robot_description.cpp
  std::string robot_description_text;
  //get robot_description parameter
  nh.getParam("/robot_description", robot_description_text);
  KDL::Tree robot_tree;
  //parse urdf by using kdl_parser
  kdl_parser::treeFromString(robot_description_text, robot_tree);
  std::map<std::string,KDL::TreeElement> robot_segment = robot_tree.getSegments();
  //access each data by using iterator
  for(auto itr = robot_segment.begin(); itr != robot_segment.end(); ++itr)
  {
    //get link name from std::map
    std::string link_name = itr->first;
    //get link parameters
    KDL::RigidBodyInertia rigid_body_inertia = itr->second.segment.getInertia();
    //get Mass of link
    double mass = rigid_body_inertia.getMass();
    //get Center of Gravity parameters
    KDL::Vector cog_point = rigid_body_inertia.getCOG();
    //get Center of Gravity position
    double cog_point_x = cog_point.x();
    double cog_point_y = cog_point.y();
    double cog_point_z = cog_point.z();
  }
```

nao_descriptionパッケージ内のURDFファイルをパースした結果は以下のとおりです。
ちゃんとリンクの名前が出力されていますね！！

```
CameraBottom_frame
CameraBottom_optical_frame
CameraTop_frame
CameraTop_optical_frame
ChestButton_frame
Head
HeadTouchFront_frame
HeadTouchMiddle_frame
HeadTouchRear_frame
ImuTorsoAccelerometer_frame
ImuTorsoGyrometer_frame
LAnklePitch
LBicep
LElbow
LFinger11_link
LFinger12_link
LFinger13_link
LFinger21_link
LFinger22_link
LFinger23_link
LFootBumperLeft_frame
LFootBumperRight_frame
LForeArm
LFsrFL_frame
LFsrFR_frame
LFsrRL_frame
LFsrRR_frame
LHandTouchBack_frame
LHandTouchLeft_frame
LHandTouchRight_frame
LHip
LInfraRed_frame
LPelvis
LShoulder
LSonar_frame
LThigh
LThumb1_link
LThumb2_link
LTibia
MicroFrontCenter_frame
MicroRearCenter_frame
MicroSurroundLeft_frame
MicroSurroundRight_frame
Neck
RAnklePitch
RBicep
RElbow
RFinger11_link
RFinger12_link
RFinger13_link
RFinger21_link
RFinger22_link
RFinger23_link
RFootBumperLeft_frame
RFootBumperRight_frame
RForeArm
RFsrFL_frame
RFsrFR_frame
RFsrRL_frame
RFsrRR_frame
RHandTouchBack_frame
RHandTouchLeft_frame
RHandTouchRight_frame
RHip
RInfraRed_frame
RPelvis
RShoulder
RSonar_frame
RThigh
RThumb1_link
RThumb2_link
RTibia
base_link
gaze
l_ankle
l_gripper
l_sole
l_wrist
r_ankle
r_gripper
r_sole
r_wrist
torso

```
Behavior Designerで超簡単なAIを作る回 (Day1)

# Behavior Designerを使ってAIを作ってみる
Behavior DesignerをImportし、さっそくAIを作り始める。
Seekを追加したところで"NavMesh"がないよ！と怒られる。
Seekを使うには、NavMeshが必須らしい。

## NavMesh

Unity公式のリファレンスを確認
[ナビゲーションと経路探索](https://docs.unity3d.com/jp/530/Manual/Navigation.html)

簡単にまとめると、**NavMesh**が歩行可能な面のデータであり、**NavMesh Agent**はそのデータを元に経路探索を行う。
連続した面ではなく、溝やフェンスを飛び越えるなどを可能にするには**Off-Mesh Link**を使用する。
また、**NavMesh Obstacle**は障害物となるオブジェクトを指す。

![SnapCrab_NoName_2017-8-12_3-53-49_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/4508a131-85f7-63c7-9967-e03d3cf56744.png)

**NavMesh**はジオメトリから自動的に生成される。

おもちゃラボさんのブログがとてもわかりやすいです。
[【Unity】NavMeshで経路に沿って動かす](http://nn-hokuson.hatenablog.com/entry/2016/08/05/235156)

スクリプトはこんな感じ。

```csharp:NavMeshTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class NavMeshTest : MonoBehaviour
{
    [SerializeField]
    private Transform _target;

    private NavMeshAgent _agent;

    private void Start()
    {
        _agent = GetComponent<NavMeshAgent>();
    }

    private void Update()
    {
        _agent.SetDestination(_target.position);
    }
}
```

とっても簡単に障害物を避けつつ、目標に向かって進むAIが完成。

![SimpleNavMesh.gif](https://qiita-image-store.s3.amazonaws.com/0/82250/21c28214-ddd6-bac1-c16f-6c557ee49bc5.gif)

よく見るとAIの端が障害物にかすってるように見えます。
これはベイク時の初期設定で**Agetn Radius**の値が0.5になっていたからで、Sceneビューで確認すると壁に沿ってパスが引かれてしまっています。

![SnapCrab_NoName_2017-8-12_4-23-5_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/1db0e91f-9d40-2c6e-f66f-67ef433580ad.png)

これを回避するために値を2にします。
こうすることで壁から余裕をもってパスを引くことができました。

![SnapCrab_NoName_2017-8-12_4-26-42_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/b06f57b4-0ebb-86b1-b001-694febf9237d.png)

無事、壁にぶつからず、すれすれで障害物を避けるようになりました。

![SimpleNavMesh2.gif](https://qiita-image-store.s3.amazonaws.com/0/82250/d32136a6-55af-7f09-2331-2504b0901a4c.gif)

## Behavior Designer

また、先ほどエラーで怒られたBehavior DesignerのEditor上で**Seek**を追加することで同様の挙動をすることが確認できました。

![SnapCrab_NoName_2017-8-12_4-48-35_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/1ccf59f6-0a46-32b5-b2e8-ae91f6268e6c.png)

最終的に以下のようにすることでNavMesh内でTargetの探索を行い、視界に捉え次第、捕獲に向かうAIができました。

![SnapCrab_NoName_2017-8-12_5-25-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/82250/33c8ab30-d4ee-d99f-e9c6-5eda98d96598.png)


## おまけ

### Abort Typeの違い
SequenceのInspectorを確認すると、Abort Typeというプルダウンがあり、**None**, **Self**, **Lower Priority**, **Both**の4つから選択することができます。

これが少し紛らわしいのですが、先ほど作成したTreeをベースに説明すると、今回のケースでは実行直後にAIの視界内にTargetはいないので`Can See Object`は**Failure**を返します。
その後は`Search`が**Running**となり、探索を行ったきりになってしまい、`Seek`に行くことはありません。

これはBehavior Designerでは最適化のために他のノードが実行中のとき、他のノードは実行されないからです。

今回のケースでは`Search`中であっても、視界内にTargetを捉え次第`Can See Object`から`Seek`に遷移して欲しいので`Sequence`のAbort Typeを**Lower Priority**に変更します。

このようにすることで`Search`を実行中でも、`Can See Object`は常に評価され、**Success**を返し次第`Seek`が実行されます。

**Self**に変更すると、`Seek`が実行中であっても、`Can See Object`が**Failure**を返し次第`Seek`に遷移させることができます。

**Both**は**Lower Priority**と**Self**、両方を有効にしたい時に使用します。


Day2につづく
[超簡単なAIを作る回 (Day2)](http://qiita.com/zeroichi/items/1ad043c1d1bfa50bb3eb)
CircleCI + PHPUnitで解析したコードカバレッジの推移をRedash + Amazon Athenaでグラフ化する

CircleCIだけでも個々のビルドのコードカバレッジは見ることができますが、ビルド間のコードカバレッジの推移はCodecovやCoverallsなどのサービスを利用しなければ見ることができません。

そこで、最近[v2.0.0](https://github.com/getredash/redash/blob/master/CHANGELOG.md#added)がリリースされてAmazon Athenaとの連携が簡単になったRedashを使って、ビルド間のコードカバレッジ（ラインカバレッジ）の推移をグラフ化してみました。

# S3

バケットに`/phpunit/coverage/line/`というフォルダを作成しました。
このフォルダにコードカバレッジレポートを保存して、Athenaで処理します。

# CircleCI

Athenaがサポートしているファイル形式でPHPUnitのコードカバレッジレポートを出力することができないため、コマンドラインオプションの`--coverage-xml`を使って、いったんXML形式でコードカバレッジレポートを出力します。
そのあとで、下記のようにして雑にXML形式からJSON形式に変換します。

```{bash}
php -r '$xml=simplexml_load_file("/tmp/coverage.xml/index.xml");$attr=$xml->project->directory->totals->lines->attributes();$json=json_encode(["timestamp"=>time(),"total"=>(int)$attr["total"],"comments"=>(int)$attr["comments"],"code"=>(int)$attr["code"],"executable"=>(int)$attr["executable"],"executed"=>(int)$attr["executed"],"percent"=>(string)$attr["percent"]]);echo$json;' > /tmp/line_coverage.json
```

ラインカバレッジの情報しか必要ないので、ラインカバレッジの情報だけを含んだJSONにしています。
AthenaがJSON形式をサポートしているとはいえ、複雑な構造のJSONに対応するテーブルを作成するのは面倒なので、必要最低限の要素だけを含むJSONにあらかじめ加工しておいた方がいいと思います。
JSONにはAthenaでソートする際に使うタイムスタンプを付与しています。
Athenaでクエリを実行する際、JSONのキーに`@`が含まれているとエラーになってしまうようなので、キーも自分で定義しています。

そして、このJSONファイルをS3へアップロードします。

```{bash}
aws s3 cp /tmp/line_coverage.json s3://{バケット名}/phpunit/coverage/line/line_coverage_`date +%Y%m%d_%H%M%S`.json
```

# Athena

S3へアップロードしたJSONファイルを処理するためのテーブルを作成します。
`phpunit_line_coverage_logs`という名前のテーブルにしました。
テーブルのカラム名と型は下記です。

| カラム名 | 型 |
| --- | --- |
|timestamp|timestamp|
|total|int|
|comments|int|	
|code|int|
|executable|int|	
|executed|int|	
|percent|string|


テーブルの作成方法については[こちらの記事](http://dev.classmethod.jp/cloud/aws/athena-json/)が参考になりました。

# Redash

RedashとAthenaを連携します。
連携方法については[こちらの記事](https://blog.manabusakai.com/2017/02/redash-and-athena/)が参考になりました。
リンク先の記事はRedash v1.0.0について書かれていますが、v2.0.0でも同じようにして設定することができました。

Athenaに作成したテーブルに対して下記のようなクエリを実行すれば、コードカバレッジの推移を取得することができます。

```{sql}
SELECT *
FROM {データベース名}.phpunit_line_coverage_logs
ORDER BY TIMESTAMP ASC LIMIT 100;
```

これをビジュアライズしてグラフ化します。

![newplot.png](https://qiita-image-store.s3.amazonaws.com/0/9588/70c15907-9440-c2a9-f18e-0d1b478d3cd3.png)

コードカバレッジの推移をグラフ化することができました。
コードカバレッジが増えていく様子が可視化されると、テストを書くモチベーションが上がっていいですね。

# 参考

- http://dev.classmethod.jp/cloud/aws/athena-json/
- https://blog.manabusakai.com/2017/02/redash-and-athena/
【メモ】Laravelのブロードキャストについて公式で分かりづらかった部分があったので補足

Laravel-Echoでチャット機能を作ろうとしていてLaravel公式のサイトを見たのだが、ブロードキャストのプレゼンスチャンネルの部分で分かりづらい部分あったので補足

(参考)
https://readouble.com/laravel/5.4/ja/broadcasting.html

###(1)プレゼンスチャンネルへの参加
(チャットルームへの参加)

```php
Echo.join('chat.' + roomId)
    .here((users) => {
        //
    })
    .joining((user) => {
        console.log(user.name);
    })
    .leaving((user) => {
        console.log(user.name);
    });
```
JSファイルに記述。
1行目のroomIdってどこから来た？？って思ってたけど、
このroomIdは別途同じJSファイル内で定義しないとダメっぽい。

###(2)プレゼンスチャンネルの許可
(チャットルームへの入室の許可)

```php
Broadcast::channel('chat.{roomId}', function ($user, $roomId) {
    if ($user->canJoinRoom($roomId)) {
        return ['id' => $user->id, 'name' => $user->name];
    }
});
```

これは、(1)のプレゼンスチャンネルに参加する際に参加していいですよ、という認可を与えるための記述。```routes/channels.php```に記載。
1行目の```{roomId}```、```$roomId```ってどこから来た？？って思った。
```{roomId}```は(1)で定義した```roomId```が入り、```{roomId}```に入ってきた値が```$roomId```に渡されるっぽい。

###(3)プレゼンスチャンネルへのブロードキャスト
(チャットルームへのメッセージの投稿)

```php
namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\Eloquent\Message;
use App\Eloquent\User;

class MessagePosted implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Message
     *
     * @var Message
     */
    public $message;

    /**
     * User
     *
     * @var User
     */    
    public $user;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Message $message,User $user)
    {
        //
        $this->message = $message;
        $this->user = $user;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PresenceChannel('chatroom.'.$this->message->room_id);
    }
}
```
これは、```ShouldBroadcast```インターフェースを実装したイベントクラスに記述。
このイベントクラスをどこで呼び出すかというと、例えば投稿ボタンをクリックした後に非同期でメッセージの中身をDBに保存する処理の中で呼び出す。
例えばこんな感じ。

```php
$user = Auth::user();

$message = new App\Eloquent\Message();
$message->message = request('message');
$message->room_id = request('roomId');
$user->messages()->save($message);

// ここがイベントの呼び出し部分
broadcast(new MessagePosted($message,$user))->toOthers();
```

(1)(2)がページ表示時(入室時)、(3)(4)はメッセージ投稿時に関係してくる感じ？

以上。
CFアプリ開発と管理#21.5 ユーザー提供サービスインスタンス


このトピックでは、ユーザー提供のサービスインスタンスを作成および更新する方法について説明します。

注意事項：この記事は、Cloud Foundry Documentaion [User-Provided Service Instances](https://docs.cloudfoundry.org/devguide/services/user-provided.html) (last updated: May 13, 2017)の独自の翻訳とコメントです。 内容を保証するものではありません。

*コメント: Bluemixでもユーザー提供サービスを利用することができます。また、Bluemixコンソール画面から、バインド／アンバインドができ、アプリケーションにVCAP変数として与えることができます。具体的なユーザー提供サービスの実装例は [Bluemix Pythonマイクロサービスの開発](http://qiita.com/MahoTakara/items/e9cf3266e938edb1845a)へ投稿しました。*

## 概要

ユーザーが提供するサービス・インスタンスにより、開発者はマーケット・プレイスでは利用できないサービスをCloud Foundry上で動作するアプリケーションで使用できます。

ユーザー提供のサービス・インスタンスを使用して、サービス資格情報をアプリケーションに供給したり、アプリケーション・ログのストリームをsyslog互換コンシューマにトリガすることができます。 これらの2つの機能は、単独で、または同時に使用することができます。

作成されると、ユーザー提供のサービス・インスタンスは、マーケット・プレイスを通じて作成されたサービス・インスタンスのように動作します。 リスティング、名前変更、削除、バインディング、およびバインド解除の詳細については、「サービス・インスタンスとアプリケーション・バインディングの管理」を参照してください。


## ユーザー提供のサービスインスタンスを作成する

[cf create-user-provided-service](http://cli.cloudfoundry.org/ja-JP/cf/create-user-provided-service.html)の別名は cf cups です。


## アプリにサービス資格情報を供給する

開発者が、Cloud Foundryの外部で管理されているOracleデータベースと通信するためのURL、ポート、ユーザー名、およびパスワードを取得したとします。 開発者は、カスタム環境変数を手動で作成して、これらの資格情報を使用してアプリケーションを構成することができます（もちろん、これらの資格情報をアプリケーションにハードコードすることはありません）。

ユーザーが提供するサービス・インスタンスにより、使い慣れたアプリケーション・バインディング操作と、Cloud Foundryがマーケット・プレイスサービス（VCAP_SERVICES）の資格情報を自動的に配信するために使用する同じアプリケーション実行環境変数を使用して、開発者がアプリケーションを構成できます。

~~~
cf cups SERVICE_INSTANCE -p '{"username":"admin","password":"pa55woRD"}'
~~~

対話モードでサービス・インスタンスを作成するには、カンマで区切ったパラメータ名のリストとともに-pオプションを使用します。 cf CLIは、各パラメータ値の入力を求めるプロンプトを表示します。

~~~
cf cups SERVICE_INSTANCE -p "host, port, dbname, username, password"
~~~

ユーザー提供のサービス・インスタンスが作成されると、1つまたは複数のアプリケーションに資格情報を配信するには、「[アプリケーション・バインディング]()」を参照してください。



## アプリ・ログをサービスにストリームする

ユーザーが提供するサービスインスタンスにより、開発者はアプリケーションログを市場で入手できないsyslog互換アグリゲーションサービスまたはアナリティクスサービスにストリーミングできます。 syslogプロトコルの詳細については、[RFC 5424](https://tools.ietf.org/html/rfc5424)および[RFC 6587](https://tools.ietf.org/html/rfc6587)を参照してください。

-lオプションを使用してサービスのURLを指定して、ユーザー提供のサービスインスタンスを作成します。

~~~
cf cups SERVICE_INSTANCE -l syslog://example.log-aggregator.com
~~~

アプリケーション・ログをサービスにストリームするには、ユーザー提供のサービス・インスタンスをアプリケーションにバインドします。


## アプリのプロキシ

ユーザが提供するサービスインスタンスにより、開発者はアプリケーション要求を事前処理のために[ルートサービス](https://docs.cloudfoundry.org/devguide/services/#route-services)にプロキシすることができます。 ルートサービスのユーザー提供サービスインスタンスを作成するには、-rオプションを使用してルートサービスのURLを指定します。

~~~
$ cf create-user-provided-service my-user-provided-route-service -r https://my-route-service.example.com
Creating user provided service my-user-provided-route-service in org my-org / space my-space as user@example.com...
OK
~~~

注：ユーザー提供サービスを作成する場合、指定されたルートサービスURLはhttpsでなければなりません。

ユーザー提供のルート・サービスに要求をプロキシするには、サービス・インスタンスをルートにバインドする必要があります。 詳細については、「[ルートサービスを使用したアプリケーション要求の管理](https://docs.cloudfoundry.org/devguide/services/route-binding.html)」を参照してください。


## ユーザー提供のサービスインスタンスを更新する

[cf update-user-provided-service](http://cli.cloudfoundry.org/ja-JP/cf/update-user-provided-service.html)を使用すると、ユーザ提供サービスのインスタンスの属性を更新できます。 新しい資格情報が古い資格情報を上書きし、提供されていないパラメータが削除されます。

update-user-supplied-serviceのエイリアスはuupsです。
ROSのSLAMから、MAPを受信してOpenCV形式で保存する

##目的
　ROSのSLAMパッケージで生成したMap topicを受信して、MapをOpenCV形式で保存する。
　画像を保存するには、map_servar Packageを使えばよいのだが、map_servar Packageは内部で2値化処理を入れていることと、様々な画像形式で出力できるようにするため、OpenCVのcv:mat形式で読み取り、保存する。

##実装
Map Topicを受信し、OpenCV形式で保存する。

Main.cpp

```
#include <iostream>
using namespace std;
#include <ros/ros.h>
#include <nav_msgs/GetMap.h>
#include <tf/tf.h>
#include <opencv2/opencv.hpp>
using namespace cv;

void mapCallback(const nav_msgs::OccupancyGridConstPtr &map) {
	geometry_msgs::Quaternion orientation = map->info.origin.orientation;
	double yaw, pitch, roll;
	tf::Matrix3x3 mat(tf::Quaternion(orientation.x, orientation.y, orientation.z, orientation.w));
	mat.getEulerYPR(yaw, pitch, roll);
	double map_theta= yaw;

	ROS_INFO("Received a %d X %d map @ %.3f m/pix_%f_%f_%f",
	map->info.width,map->info.height,map->info.resolution,
	map->info.origin.position.x,map->info.origin.position.y,map_theta);

	Mat img_out = Mat::zeros(cv::Size(map->info.width,map->info.height), CV_8UC1);

	for (unsigned int y = 0; y < map->info.height; y++){
		for (unsigned int x = 0; x < map->info.width; x++){
			unsigned int i = x + (map->info.height - y - 1) * map->info.width;
			int intensity=205;
			if (map->data[i] >= 0 && map->data[i] <=100)
			intensity= round((float)(100.0-map->data[i])*2.55);
			img_out.at<unsigned char>(y, x)=intensity;
		}
	}

	imwrite("map.png",img_out);

	ros::shutdown();
}

int main(int argc, char* argv[]) {
	ros::init(argc, argv, "map_save");
	ros::NodeHandle n;
	ros::Subscriber map_sub_ = n.subscribe("map", 2, mapCallback);
	ros::Rate r(10.0);
	ros::spin();
	return 0;
}

```


###参考
[ROSのLidarSLAMまとめ](http://qiita.com/nnn112358/items/814c0fb0d2075eb71da0) 

Ros Wiki OccupancyGrid
http://docs.ros.org/api/nav_msgs/html/msg/OccupancyGrid.html

Navigation map_saver
https://github.com/ros-planning/navigation/blob/kinetic-devel/map_server/src/map_saver.cpp
chocolateyでWindows開発機をセットアップ

# 環境

- Windows Server 2016 DataCenter (on Azure)
- chocolatey 0.10.7

# chocolateyのインストール
[ChocolateyInstallation](https://chocolatey.org/install)
管理者権限のpowershellプロンプトを起動して、上記ページのコマンドを貼り付けて実行する。

# 開発に必要なパッケージをインストール

```
# 基本ツール
choco install -y googlechrome
choco install -y atom
choco install -y git
choco install -y 7zip
choco install -y adobereader
choco install -y teraterm
# Java
choco install -y eclipse
choco install -y maven
choco install -y tomcat
# 必要に応じて
choco install -y googledrive
choco install -y sql-server-management-studio
choco install -y intellijidea-community
choco install -y visualstudiocode
```

# OSの日本語化
[Azure IaaS 上に作成した Windows Server 2016 仮想マシンの UI を日本語化する \| 焦げlog](https://kogelog.com/2016/10/18/20161018-01/)