OmniAICreator/Qiita-1.07M huggingface dataset:
DockerでpythonのTensorFlowとOpenCVの実行環境を構築する

# はじめに
PCをメイン機とサブ機で使い分けており，メイン機で書いたプログラムを出先でサブ機で確認したい時がよくあるんですが，サブ機にも同じ環境を作るのが大変．
特にPythonとかOpenCVってバージョンで動く動かないがあって結構面倒．
なので今回は，簡単にtensorflowとopencvのプログラムの実行環境を使えるようにdocker上で環境を構築しました．

(2018/11/5 追記)
DockerfileのOpenCVのインストールのオプションのWITH_IPP=ONだと，関連ファイルをダウンロードできずエラーとなるので修正しました．加えてPythonのインストールを公式のイメージを利用するように変更しました．

(2020/4/23 追記)
opencvをインストールしてビルドするのではなく，libopencv-devを利用するように変更しました．


# Dockerfile
環境はUbuntuの安定版の16.04で固定．

~~まずPythonでOpenCVを扱うには，OpenCVのビルドが必須．そのために必要なgccやwgetもインストール．
これが結構時間がかかる．~~

~~pipでインストールするライブラリは，tensorflow以外にnumpyは最低あれば十分か？
必要になり次第追加して行く感じで．~~

```dockerfile:./Dockerfile
FROM python:3.6

# opencv-devのインストール
RUN apt-get update -y && apt-get install -y libopencv-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
 
# TensorflowとOpencvのインストール
RUN pip3 install numpy tensorflow opencv-python

ENV APP_NAME tensor-docker
WORKDIR /home/$APP_NAME

CMD [ '/bin/bash'  ]
```

# 実行
dockerfileができたら以下のコマンドでビルド，実行．

```sh
# コンテナをビルド
$ docker build -t tensor-docker:0.1 .
# ~~~ いっぱい出力されるが省略 ~~~~
 ---> 45043a9b7a4c
Successfully built 45043a9b7a4c
Successfully tagged tensor-docker:0.1
# コンテナにログイン
$ docker run --rm -it tensor-docker:0.1 /bin/bash　　　　　　　
# Pythonのインストールチェック
$ root@55f3f91f7319:/home/tensor-docker# Python3 
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
# tensorflowとopencvがインストールされているか確認
>>> import tensorflow as tf　　
>>> import cv2
```

コンテナ内の`/home/tensor-docker`にログインできていて，ライブラリのインポートにエラーが出なければとりあえず環境構築は完了．

## コンテナとローカルのフォルダの共有

実行環境はコンテナ内に立ち上がったが，コンテナ内でソースコードを編集する場合はviを使うしかない．
普段からIDEを使っている人にとってはviの編集はとても苦痛を伴うので，ローカルで編集→コンテナ内で実行といったサイクルを導入したい．
そのためにdockerのマウント機能で，コンテナのVolumeをローカル環境にマウントする．

`docker run`時に`-v`コマンドをつけて共有化したいディレクトリを指定することで，コンテナとローカルでディレクトリを共有可能になる．
実際に共有化できているのか確認してみる

```sh
# 今のファイル構造を確認
$ ls 
Dockerfile	img		util
# コンテナにログイン
$ docker run --rm -v `pwd`:/home/tensor-docker -it tensor-docker:0.1 /bin/bash
# コンテナ内でファイルを作成
$ root@55f3f91f7319:/home/tensor-docker# touch test.py
# 作成されていることを確認
$ root@55f3f91f7319:/home/tensor-docker# ls
Dockerfile  img  test.py  util
$ root@55f3f91f7319:/home/tensor-docker# exit
exit
# ログアウトしてローカルで先ほど作成したtest.pyが存在しているかを確認．
$ ls
Dockerfile	img		test.py		util
```

コンテナ内で作成したtest.pyをローカルでも確認することができた．

# おわりに
ソースコードはこちら
https://github.com/sey323/docker-tensorflow



Docker便利！
AIで架空のプロ野球選手を生成してみた

#背景
敵対的生成ネットワークを知り、その可能性にときめいた
Pythonが好き
プロ野球が好き
[日本野球機構（NPB）オフィシャルサイト](http://npb.jp)の選手名鑑なら、顔写真を大量に取得できると気が付いた
Chainerを使えるようになりたかった
GPUはGTX1050ti-4GB　を使用

#参考にしたサイト
- @rezoolabさんの記事([Chainerを使ってコンピュータにイラストを描かせる](https://qiita.com/rezoolab/items/5cc96b6d31153e0c86bc))
- @mattyaさんの記事（[Chainerで顔イラストの自動生成](https://qiita.com/mattya/items/e5bfe5e04b9d2f0bbd47)）
- [Chainerの公式サンプル](https://github.com/chainer/chainer/tree/master/examples/dcgan)

#訓練データとパラメータ
- NPB.jp の選手名鑑から各選手の[顔写真](http://npb.jp/bis/players/51255118.html)を使用
- 収集のためにPythonでスクレイピングコードを書いた
- NPB.jp は現役選手のデータしかないため、[Internet Archive](https://archive.org)を利用し、2017年から2010年（それ以前のサイトには顔写真がない）までのプロ野球選手の顔写真約7，0００枚を入手

#学習結果
#### 1 － 100epoch
![JkXIV5k716jaoMPqCEbC1581555245-1581555706.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246384/25bbabb2-98c6-c0e7-6d41-406d689dc35b.gif)



#あとがき
- 割とクリチャー
- 当環境ではメモリーエラーが起き、学習が停止した
- 画像を小さくすることで難を逃れた
- パラメータをいじればまた結果は変わるかもしれない
- 生成された画像をより洗練させるプログラムを別で書く必要がある
- 結果を早く得たいのであればマシン性能に頼るしかない
- 力こそパワー
iOSアプリOTAインストール用サーバ構築トラブルシュート



### はじめに

開発中のiOSアプリをOTAインストールするため、[この記事](https://qiita.com/HIkaruSato/items/851ba853892916fabe26)を参考にオレオレ証明書でHTTPSサーバを構築したのですが
何点かつまづいたことがあったので備忘のため内容を残しておきます。

### 構築環境

#### HTTPSサーバ
- OS：　Windows Server 2012 R2 Standard
- Webサーバ：　IIS 6.2

#### 証明書発行環境
- OS：　MacOS Sierra
- OpenSSL：　1.0.2n
- easy-rsa：　3.0.4

#### iOS端末
- OS：　11.0.2

### つまづいたこと

1. ipaとmanifest.plistにアクセスできない

2. HTTPSで動作させているが、インストールリンクを開くと「xxxに接続できません」というエラーがでる

3. クライアントにインストールしたCA証明書の信頼設定ができない

### ipaとmanifest.plistにアクセスできない

これは調べたらすぐに分かりましたが、サーバ側のMIMEの設定が足りていなかったことが原因でした。
サーバに次のように設定をすることで解決しました。

|拡張子|MIMEの種類|
|-----|---------|
|.ipa|application/octet-stream|
|.plist|text/xml|

### HTTPSで動作させているが、インストールリンクを開くと「xxxに接続できません」というエラーがでる

![接続できません.png](https://qiita-image-store.s3.amazonaws.com/0/200963/e3576f7f-7be5-112a-0087-ed041dab899f.png)


原因はいくつかあると思いますが、自分の場合はHTTPSサーバの設定が正しくされていないことが原因でした。
正しく設定できているかはSafariでは分かりづらいのでChromeで確認するのがオススメです。
Chromeの場合だとURLの左の鍵マークをタップするとエラー内容が表示されるので問題解決しやすいです。

#### 足りなかった設定

- IPAのインストールの前にiOS端末にオレオレCAの証明書をインストールする
  参考にした記事では証明書をインストールするためのプロビジョニングプロファイルを作成してインストールを行っていましたが、
  証明書をPEM形式などでエクスポートしてSafariからアクセスすることでもインストールすることができました。

- iOS端末でインストールしたCA証明書を証明書信頼設定で信頼の置けるCAだと設定する
　インストール後そのままだとオレオレCAで発行したサーバ証明書は自動的に信頼されない。
　設定アプリを開き、
> 一般＞証明書信頼設定

 を開くと先ほどインストールした証明書が表示されているのでトグルスイッチをONに設定する。

- CA証明書のCN（コモンネーム）はHTTPSサーバのFQDNかIPアドレスを設定する
 証明書を発行する際にCNを入力するがこれが実際のサーバの値と異なるとブラウザ側でエラーとなる。
 エラーを回避するためには同じ値を入れること。
 例）サーバのIPアドレスが192.168.10.5だったらCNに192.168.10.5を入力する
 そうしないと、Safariでは分かりづらいがChromeでは下記のようにエラーとなる。
![プライバシーが保護されない.png](https://qiita-image-store.s3.amazonaws.com/0/200963/b5203af4-6e46-3f28-f008-27039816e62e.png)

### クライアントにインストールしたCA証明書の信頼設定ができない
IISに搭載している機能を使ってもオレオレ証明書を作ることができるがこの場合、CNだけ値が入ることになり他のorganization情報は空になる。
この場合証明書をiOS端末にインストールしたとしても証明書信頼設定に何も出てこない状態になる。
easy-rsaで証明書を作る場合はデフォルトでorganization情報が省略になるため注意が必要。
設定するためにはvarの
> \#set_var EASYRSA_DN	"org"

のコメントアウトを外してやれば設定できるようになる
GA前に作ったAzure BotServiceをマイグレーションする

昨年12月にAzure Bot ServiceがGA（正式製品化）しました。
GA前から作っていたリソースはそのまま2018年3月31日まで使える状態だったのですがずっと放置していて今日がその3月31日…マイグレーションしました。せっかくなので記録残しておきます。

##Azureポータルログイン
ボットサービスリソースを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/f7e9b9b9-c014-fb3a-e542-b4bf0c91b184.png)

GA前はシンプルなUIで設定項目も少なかったのです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/af8e0173-cf21-3368-5019-4426751a5e5c.png)


##マイグレーション
[MIGRATE THIS BOT]をクリックしてみます。ドキドキ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/98214b9b-ad39-6b36-229a-87d7ca5fb2dd.png)
一瞬クルクル出て
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/ddb2da7a-57ee-63b7-8ecd-ca6a32b5b72c.png)
ぉお。リソースの名前変えられるのか。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/2083125f-04d8-4e1e-7b9e-14af150b4776.png)
ん？S1プランってなんだっけ？まぁいいや。Migrateクリックしてみる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/9eb94086-69dd-501e-9bd2-31d79e94db5a.png)
同意して[Agree]クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/6e8c49c5-7dc2-66b2-0fe0-0c98f9f8d021.png)
くるくるが数分続いて
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/8dd21f6e-f8df-b441-8f94-64b028e0e3b1.png)
おわたー[Open the new bot]クリックしてみる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/58d37976-c331-260b-461c-8868575d44de.png)
別ブラウザタブで見慣れた新しいFunctionsボットがでけたー。そっか。GA前のボットサービスはFunctionsBotになるのか。Web Appの方のボットにマイグレーションはできないってことなのかも。
今日までならロールバックもできるっぽい。ゴイスー。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/99b3beed-83cf-257d-83ac-b98872223053.png)

元のブラウザの×クリックすると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/0c3835a3-2b61-f979-3318-68d511afc891.png)

もうないぜって言われる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/bab1e914-78cd-c6b3-b387-15b108e42a56.png)

あら？前のリソースも残ったままなのか。とりあえず明日以降どうなるか様子見よう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/98167e71-2f52-3465-cf4e-dd3c3ff8a1b7.png)

マイグレーションするとAppServiceのプランがS1になるみたいなんで無料にしたい場合にはF0に変えた方がいいかもね。DirectLineチャンネルとかで独自のチャットとつないでる人はS1のままっぽい。詳細は[こちら](https://azure.microsoft.com/en-us/pricing/details/bot-service/)参照。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/eb198ce5-537e-d37c-139a-153c24726f0d.png)
Python3.4.3 × Jupyter notebook ('module' object has no attribute 'ensure_future')

# 背景
久しぶりにUbuntu機でjupyter notebookしようとしたらエラーが出た

```
$ jupyter notebook
Traceback (most recent call last):
  File "/usr/local/bin/jupyter-notebook", line 7, in <module>
    from notebook.notebookapp import main
  File "/usr/local/lib/python3.4/dist-packages/notebook/notebookapp.py", line 44, in <module>
    from zmq.eventloop import ioloop
  File "/usr/local/lib/python3.4/dist-packages/zmq/eventloop/__init__.py", line 3, in <module>
    from zmq.eventloop.ioloop import IOLoop
  File "/usr/local/lib/python3.4/dist-packages/zmq/eventloop/ioloop.py", line 78, in <module>
    while _IOLoop.configurable_default() is not _IOLoop:
  File "/usr/local/lib/python3.4/dist-packages/tornado/ioloop.py", line 350, in configurable_default
    from tornado.platform.asyncio import AsyncIOLoop
  File "/usr/local/lib/python3.4/dist-packages/tornado/platform/asyncio.py", line 25, in <module>
    from tornado.gen import convert_yielded
  File "/usr/local/lib/python3.4/dist-packages/tornado/gen.py", line 1295, in <module>
    _wrap_awaitable = asyncio.ensure_future
AttributeError: 'module' object has no attribute 'ensure_future'
```

どうも、'ensure_future'がないとのこと。
調べてみたら、Python3.4.4からasyncioでのensure_futureができたらしい。
自分のPythonが3.4.3なのでエラーでたみたい。

# 対処法
- Pythonのバージョンをあげる
- エラー箇所をダウングレードする（今回はこっち）

普通ならPython3.6系とかにすればいいと思うのですが、いろいろな理由により、後者で対応しました[^1][^2]。

[^1]: 大学院修了後の残った実験だけに使うので、バージョンあげて実験しなおすのがめんどくさい。
[^2]: 大学での作業は、なるべく安定性のある最新のOSでやったほうがいい（なんでUbuntu14.04なんて使ってるんだろう…）

## やったこと
```
$ pip freeze | grep XXX
```
これで、現在pipで入っているライブラリのバージョンが見えます。
私は実験用のPCを3台もってて、運良く1台はjupyterが動いていたので、差分を探しては、ひとつずつダウングレードさせていきました。

```
$ pip uninstall XXX
$ pip install YYY==version
```

変更部分は、以下の通りです。

```
notebook==5.2.2
jupyter-client==5.2.1
tornado==4.5.2
```

これでなんとか動いたので良しとします。（というか最初のエラーがtornadoだったので、tornadoだけでもよいと思います）
人に見せたくない一時的な変更の含まれたコミットを消してRemoteにpush

備忘録。
# 何がしたかったか
- 他人のgithubのprojectをgitlabにクローンしてきて社内公開を前提に開発を進めていた。
- 後日、githubにも公開したくなった。
- gitlab公開前提に作っていたので社外の人には見せたくない変更をしていたコミットが多々あった
- それらの変更を打ち消すようなコミットを作っても、このままpushすると過去の見せたくない変更が含まれたコミットも結局一緒に公開されてしまう。それは避けたい。（途中の変更はなかったことにしたい。）
- また、localには社外公開したくないコミットも残しておきたかった。
- さらに、クローン元のprojectがgithubにクローンしたときにはgitlabにクローンしてきた時より開発が進んでいて、githubにクローンしてきたものにはどっちみちそのまますんなりlocalの変更をpushできないことが判明した。

# 解決法
## ざっくりな流れ
localのmasterの先頭に新しいブランチ作成
→新しいブランチでは、squashで見せたくないコミットは全部まとめてしまう
→新しいブランチをremote(github)のmaster（元projectのクローンしただけ）にリベース（＆コンフリクトの解決）＆push

## 詳しく
<img width="300" alt="画像1.png" src="https://qiita-image-store.s3.amazonaws.com/0/245217/8a99d1a8-e60d-9b70-8297-b41d3edbd59e.png">

1. 元の状態。過去に行った社外の人に見せたくない変更を含んだコミットが過去にたくさん。社外の人に見せられるのは最新状態のみ。加えて、remote(github)のmaster（元projectのクローンしただけの状態）とlocalのmasterがそもそもこのままpushしたら競合するようになってしまっている。
<img width="294" alt="画像2.png" src="https://qiita-image-store.s3.amazonaws.com/0/245217/f48f67cc-6fd1-acd9-0cf6-966f37f54bb9.png">

1. localのmasterの戦闘に新しいブランチ作成
<img width="183" alt="画像3.png" src="https://qiita-image-store.s3.amazonaws.com/0/245217/0fa6fa51-7e33-787f-671c-aa31658b7d5b.png">
1. 新しいブランチでは、squashで見せたくないコミットは全部まとめてしまって、なかったことにする。
<img width="170" alt="画像4.png" src="https://qiita-image-store.s3.amazonaws.com/0/245217/d2d2009b-970d-614d-d8c6-8941f6a73900.png">
1. 新しいブランチをremote(github)のmasterにリベース。競合が発生するのでその解決をして、push。


- こうすることによって
 - 社外の人に見せたくない過去の変更は一切外に出ない（なかったことになる）
 - localには社外に見せたくない変更を含めて過去のすべての変更を残しておくことができる
 
を両方実現できた。
Nginxのlogrotateがローテートしないでログファイルが肥大していって困った


## 背景
- [Nginxログローテートの設定の実例](https://qiita.com/koudaiii/items/23322bf7037c6a7b1cea)を参考にlogrotate.dでローテート設定を行った
- 古いログファイルを握ったまま離さない現象になり困った。 

## 解決策
- [nginx に USR1 シグナルを送ってログを開き直す](https://qiita.com/white_aspara25/items/7c0352cb2c24e5d7268b)を参考にログファイルのディレクトリに実行権限を与えたら離してくれた。

## 所感
- nginxのworkerのオーナーがnginxユーザーだったのだが、ログファイルに実行権限がなかったのが原因だった
Railsで特定のコンテキスト「以外」のときだけバリデーションする

Railsのバリデーションは、[```:on```](https://railsguides.jp/active_record_validations.html#on)オプションをつけることで任意のコンテキストのときだけ実行させることができます。

```
validates :name, presence: true # 常にバリデーションする
validates :description, presence: true, on: :hoge # context: :hogeのときだけバリデーションする
```

しかし、```context: :hoge```**以外**のときだけバリデーションしたいときはどうすればいいのでしょうか。```:on```で```:hoge```以外のコンテキストを全て指定するなどというのは流石にありえませんが、Railsガイドには説明がありません。

そのようにしたい場合は、以下のように```validation_context```を参照したlambdaやProcを```:unless```に渡して条件を指定すれば実現できます。

```
validates :name, presence: true # 常にバリデーションする
validates :description, presence: true, unless: -> { validation_context == :hoge } # context: :hoge以外のときだけバリデーションする
```

なぜこのような書き方になるのでしょうか。

まず```:unless```で指定できるのは、以下のように```:on```を```:if```に読み替えており```:on```と```:if```は同等、```:unless```は:```:if```の逆なので```:unless```は```:on```の逆となるためです。

```
# https://github.com/rails/rails/blob/5-2-stable/activemodel/lib/active_model/validations.rb#L154

def validate(*args, &block)
  options = args.extract_options!

  if args.all? { |arg| arg.is_a?(Symbol) }
    options.each_key do |k|
      unless VALID_OPTIONS_FOR_VALIDATE.include?(k)
        raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{VALID_OPTIONS_FOR_VALIDATE.map(&:inspect).join(', ')}. Perhaps you meant to call `validates` instead of `validate`?")
      end
    end
  end

  if options.key?(:on)
    options = options.dup
    options[:on] = Array(options[:on])
    options[:if] = Array(options[:if])
    options[:if].unshift ->(o) {
      !(options[:on] & Array(o.validation_context)).empty?
    }
  end

  set_callback(:validate, *args, options, &block)
end
```

また```validation_context```を参照できるのは、```save```する際に呼ばれる以下の処理において、引数から渡ってきた```:context```を```self.validation_context```にセットしているためです。

```
# https://github.com/rails/rails/blob/5-2-stable/activemodel/lib/active_model/validations.rb#L336

def valid?(context = nil)
  current_context, self.validation_context = validation_context, context
  errors.clear
  run_validations!
ensure
  self.validation_context = current_context
end
```

[Railsでこの時だけ特定のバリデーションを検証したくないときしたこと](http://hatappi.hateblo.jp/entry/2017/04/13/201505)
[Rails のバリデーションを特定のコンテキスト「以外」で実行させる](http://labs.timedia.co.jp/2014/07/rails-validation-not-on-context.html)

なお[条件付きバリデーションをwith_optionsでグループ化する記法](https://railsguides.jp/active_record_validations.html#%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%99%E3%82%8B)がありますが、ここでも同様に、以下のように```validation_context```を参照して特定のコンテキスト以外の条件をグループ化することができます。

```
with_options unless -> { validation_context == :hoge } |not_hoge| # context: :hoge以外のときだけバリデーションする
  not_hoge.validates :name, presence: true 
  not_hoge.validates :description, presence: true
end
```
質問をすることの重要性と質問をする意味

わざわざ聞いたりしてるのは
質問しようとすると何が分かってないかとかわかるようになり自分で解決出来るようになるから
質問を明確にする練習をやってみて。

VARI
エンジニアリングもマーケティングもセールスも経営も
Visualize ログを出力する(可視化する)
Analyzeログを見る(分析する)
Research ググる・レファレンス調べる(調査する)
Improve 他社事例や競合を参考にする(競合より商材の品質を上げる)
これを繰り返す感じになる。もう永遠にこれ


ログの出し方は
- rails c 使う
- railsの場合は既にログ出てる(logger.debugなど知ると尚良)
ログの見方
- よく読む
- 知識が必要なので本やサイトで知識をつけておく
ググる・レファレンス調べる
- ググる、qiitaやstack overflow見る
- 公式サイトの情報でかつ、versionが合ったものの情報を探す(最近はgithubがメイン)
他社事例を見る
- Google Developer Console使えれば大体解決する
- あとは業界知識や幅広い知識が必要なので本やサイトで知識をつける 


質問するってことはこれのどこかが出来ていないということだから、徐々に何が足りないか分析しながら聞いてみて
- この場合のログの出し方がわかりません
- 調べても答えが出てきません
- GDCの使い方がわかりませんとか
- この前勉強したのですが忘れてしまいましたとか。

https://qiita.com/seki_uk/items/4001423b3cd3db0dada7
https://qiita.com/y-tsuna/items/fd16e185cc0191abe964
https://qiita.com/syou007/items/3e0c14512ee29659ec82
https://qiita.com/zakuro9715/items/5bde95f992e7ddf2dc7f
plotly で 3D プロットを描く

次のようなグラフを作成します。

![plotly_mar3002.png](https://qiita-image-store.s3.amazonaws.com/0/179446/4222acc8-f99e-44d4-e84f-f2eee1c839ce.png)

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<!--
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
-->
<script src="/js/plotly-latest.min.js"></script>
</head>

<body>  
<h2>サンプル</h2>
<div id="myDiv"></div>
<script src="scatter.js"></script>
Mar/30/2018<p />
</body>
</html>
```

```js:scatter.js
// ---------------------------------------------------------------
//	scatter.js
//
//					Mar/30/2018
//
// ---------------------------------------------------------------

aa= [5,3,8,9,2,6,4,8,4,3,7,9]
bb= [1.2,7.2,4.2,3.2,8.2,2.2,3,5,1,2,7,9]
cc= [5.2,3.4,8.1,9.2,2.3,6.1,4.5,8.2,4.1,3.5,2,3]


var data=[
    {
        opacity:0.8,
       type: 'scatter3d',
	mode: 'markers',
	 marker: {size:3, color:'rgb(55,126,184)', line:{width:0}},
        x: aa,
        y: bb,
        z: cc,
    }
]

	Plotly.newPlot('myDiv', data)

	console.log(aa)
	console.log(bb)
	console.log(cc)
// ---------------------------------------------------------------
```
Flutterでウィジェットを重ねて表示する方法


アプリを作っているとこんな感じで、画像の上にテキストやボタンを重ねて表示したいことがあります。
本エントリはFlutterでこのレイアウトを実現する方法の紹介です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/18273/5b5cd901-bb0c-8e01-6b6a-105bdbb0462a.png" width="300">

ウィジェットを重ねるには`Stack`ウィジェットを使います。
`Stack`の`children`に重ねたいウィジェトの配列を指定します。最初の要素ほど、最初に配置されます(奥に配置される)。
また`fit`プロパティを`StackFit.expand`にすることで、全画面に表示されるようにしています。

```dart
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Stack(
          children: <Widget>[
            new Image.asset("assets/comp.jpg",
              fit: BoxFit.cover,
            ),
            new Align(
              alignment: new Alignment(0.0, 1.0),
              child: Container(
                margin: new EdgeInsets.only(bottom: 30.0),
                child: new RaisedButton(
                  onPressed: () {
                    print("pressed");
                  },
                  child: new Text("YES YES YES",
                    style: new TextStyle(color: Colors.white),
                  ),
                  color: Colors.pink[500],
                ),
              ),
            ),
            new Center(
              child: new Container(
                margin: new EdgeInsets.all(30.0),
                child: new Text("Let's Cooking!!",
                  style: new TextStyle(
                    fontWeight: FontWeight.bold,
                    fontSize: 50.0,
                    color: Colors.pink[500],
                  ),),
              ),
            )
          ],
          fit: StackFit.expand
      ),
    );
  }
```

`fit`プロパティを`StackFit.expand`にしたことで、childrenの全てのウィジェットのサイズが全画面になってしまっているので、それぞれ適切な位置になるように以下の方法で調整しています。

- `Center`ウィジェットでLet's Cookingを画面中央に配置
- `Align`ウィジェットで垂直方向を下寄せにして、YES YES YESボタンが画面の下部に配置

ネイティブや他のフレームワークでもそうですが、何通りも実現する方法はありそうです。
とりあえずビギナーの私が最初に見つけた方法がこちらです。

このレイアウト作って感じたのは、結構ウィジェットのネストが深くなりがちだなーってことです。
Windows環境にchocolateyをインストールし、使う

## chocolateyとは
Windowsで使えるパッケージマネージャ
簡単にいろいろなツールをインストールできるため、おすすめ
https://chocolatey.org/

## Requirements
公式ページよりコピー
- Windows 7+ / Windows Server 2003+
- PowerShell v2+
- .NET Framework 4+ (the installation will attempt to install .NET 4.0 if you do not have it installed)

That's it! All you need is choco.exe (that you get from the installation - scripts) and you are good to go! No Visual Studio required.

## インストール

詳しいことは公式ページ
https://chocolatey.org/install
に書かれているが、ここにもメモをしておく。
管理者権限でcmd.exeを開く

```cmd.exe
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

Proxyサーバを使用している場合は下記のスクリプト

```cmd.exe
@powershell -NoProfile -ExecutionPolicy Bypass -Command "[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
```

## 使用例

Google Chromeをインストールしてみる

```powershell
choco install googlechrome
```

PythonのディストリビューションAnacondaを検索してみる

```powershell

> choco search anaconda
Chocolatey v0.10.9
anaconda3 5.0.1 [Approved]
Miniconda 4.3.21 [Approved] Downloads cached for licensed users
miniconda3 4.4.10 [Approved]
anaconda2 5.0.1 [Approved]
nteract 0.8.4 [Approved] Downloads cached for licensed users
nteract.install 0.1.0.20170315 [Approved] Downloads cached for licensed users
6 packages found.
```

## インストールできるパッケージ
https://chocolatey.org/packages
上記のサイトにあるものがインストールできるようです。  

## 感想
便利だが、そもそも開発環境としてWindowsを選択したくないなあ。
Dockerを使える環境なら、Docker上のLinuxに開発環境を構築した方がよいと思います。
RailsでDBの初期化

最近webページを作っている時によくわからないエラーが出てしまったので、その時の解決方法の一つをメモがてら書き残しておく。

#動作環境
- Mac OS High Sierra 10.13.3
- postgres (PostgreSQL) 10.1
- Rails 5.1.5

##前提条件
今回の記事では`Rails`と`PostgreSQL`のインストール方法やセットアップについては省略します。

##本記事で用いている用語
- DB_name:データベースの名前

#Railsの動作状況
データベースにテスト用のデータを流し込み、動作確認をした後で一旦データベースをリセットしようとした時に発生したエラーです。

```bash:bash
$ rails db:migrate:reset
PG::ObjectInUse: ERROR:  database "DB_name" is being accessed by other users
DETAIL:  There are 2 other sessions using the database.
...省略...
```

今回はこんなエラーが出た時の対処法の1つを紹介します。

#対処法
この現象について調べていると様々な対処法を見つけたのでまずはこれらを試してみました。

##db:reset
参考記事：[rails db:migrate:resetできなかったのでrails db:resetした](https://qiita.com/mom0tomo/items/a252ff8a42eea00f81b1)

`db:migrate:reset`はそもそも`migrate`と`reset`を一度にやるらしく、たまにエラーが出るらしい。そこで`migrate`と`reset`を別々に実行してみる。

```bash:bash
$ rails db:reset
PG::ObjectInUse: ERROR:  database "DB_name" is being accessed by other users
DETAIL:  There are 2 other sessions using the database.
```

なんか自分の場合は他に原因があるらしい。

##強制策
参考記事：[PostgreSQLで強制的にデータベースを削除する](https://qiita.com/sayama0402/items/b3d96c25ecb60733beb9)

これは接続しているデータベースに直接アクセスして、その中身を削除する方法です。

##サーバーを閉じる
強制策が書かれた記事の中にヒントがありました。
>他のユーザーがdetabaseにアクセスしてるから、そのデータベースは消せないよというエラー。

つまり先にログインしているやつらを追い出せということですね。
この時私はRailsサーバーを立ち上げたままにしていたのでそれを閉じてあげました。

```bash
^C- Gracefully stopping, waiting for requests to finish
=== puma shutdown: yyyy-mm-dd hh:mm:ss +0900 ===
- Goodbye!
Exiting
```

その後`rails db:migrate:reset`を実行します。

```bash:bash
$ rails db:migrate:reset

Dropped database 'DB_name'
...省略
```

とりあえず成功ですね！！
お疲れ様でした＼＼\٩( 'ω' )و //／／

#ちょっとした雑談
今回は初めて触ったRailsで思わぬエラーに遭遇してしまいましたが、なんとか自己解決につながりました。これからも少しづつ日々精進していきたいものです。

#参考にした記事
[rails db:migrate:resetできなかったのでrails db:resetした](https://qiita.com/mom0tomo/items/a252ff8a42eea00f81b1)
[PostgreSQLで強制的にデータベースを削除する](https://qiita.com/sayama0402/items/b3d96c25ecb60733beb9)
Spine フレームレートの変更

#自分用：フレームレート変更手順
###■再生ビュー
**[ビュー]＞[再生]＞[DopeSheetFPS]**

1. 右上ビュー（プルダウン）
2.  再生を選択すると再生ビューが表示される
3.  DopeSheetFPSの数値を変更（デフォルトは30）


![SS00.jpg](https://qiita-image-store.s3.amazonaws.com/0/245651/7d50dfb1-36ce-b179-d3fd-c8703c00bdd8.jpeg)
SAML認証はどのように機能するのか

クラウドベースのSaaSアプリケーションなどにシングルサインオンをしたいという場合、SAML (Security Assertion Markup Languag)認証を用いることが一般的です。SAML認証はどのように機能するのかを、クラウド認証プラットフォーム Auth0を利用してSAML認証を簡単に実装するかをチュートリアルを使用して解説します。

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


#SAML認証チュートリアルを見る
<img width="424" alt="スクリーンショット 2018-03-30 13.18.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/9c176d07-25a8-dc83-4faf-04c354029e38.png">


SAML 認証チュートリアルは以下のURLからアクセスすることができます。
[Auth0 - SAML 認証チュートリアル](https://auth0.com/blog/jp-how-saml-authentication-works/) 

また、シングルサインオンに関するより詳しい資料は、以下のURLからダウンロードすることができます。
[Auth0 - The Definitive Guide to Single Sign-On](https://resources.auth0.com/definitive-guide-to-single-sign-on/?utm_source=qiita_auth0_saml)


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したSAML以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_saml&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
Implicit invocation Intent内のEntityにはスペースが必要

公開していたアプリのImplicit invocationがいつの間にか動かなくなっていた。
Google様のお助けを借りた結果Dialogflowで設定しているIntent内でEntityとの間にスペースが必要になってることが分かった。
今まではGoogleシステム側で自動的にスペースを入れていたらしいが、今は入らなくなってるらしい。
多分すぐに直してくれると思いますが、ハマる人もいるかもしれないので投稿。

#スペースを入れない場合
りんごの後ろにスペースを入れない
<img width="997" alt="g001.png" src="https://qiita-image-store.s3.amazonaws.com/0/200860/7d33ca47-7dab-3980-cffb-0e7ee7c6d61f.png">
<br><br>
なんか赤くなってて怪しいですね。
<img width="745" alt="g002.png" src="https://qiita-image-store.s3.amazonaws.com/0/200860/0469c80e-17db-a514-89c8-64004d62cff8.png">

#スペースを入れた場合
りんごの後ろにスペースを入れる
<img width="969" alt="g003.png" src="https://qiita-image-store.s3.amazonaws.com/0/200860/55560854-bd37-739e-ba82-6c8f4e983cd2.png">
<br><br>
ちゃんと青くなりましたね！
<img width="775" alt="g004.png" src="https://qiita-image-store.s3.amazonaws.com/0/200860/a950a363-3894-d98d-63c2-bdaa711e3f93.png">
Athena の datetime 型のある Schema にて 時間・分・秒単位での行数を知る方法

## datetime 型あり

```
SELECT format_datetime( DATETIME_COLUMN_NAME,'YYYY-MM-dd HH'), count(*)
FROM "ATHENA_DATABASE"."ATHENA_TABLE"
WHERE year=2018
        AND month=3
        AND (day=29
        OR day =30)
        GROUP BY format_datetime(DATETIME_COLUMN_NAME,'YYYY-MM-dd HH')
        ORDER BY format_datetime(DATETIME_COLUMN_NAME,'YYYY-MM-dd HH') ASC
```

## format_datetime とかつかって datetime 型に変換するなら

```
SELECT format_datetime(date_parse(DATE_STR_COLUMN_NAME,'%d/%b/%Y:%H:%i:%s +0000'),'YYYY-MM-dd HH'), count(*)
FROM "ATHENA_DATABASE"."ATHENA_TABLE"
WHERE year=2018
        AND month=3
        AND (day=29
        OR day =30)
        GROUP BY format_datetime(date_parse(DATE_STR_COLUMN_NAME,'%d/%b/%Y:%H:%i:%s +0000'),'YYYY-MM-dd HH')
        ORDER BY format_datetime(date_parse(DATE_STR_COLUMN_NAME,'%d/%b/%Y:%H:%i:%s +0000'),'YYYY-MM-dd HH') ASC"
```

## 分

YYYY-MM-dd HH -> YYYY-MM-dd HH-mm

## 秒

YYYY-MM-dd HH -> YYYY-MM-dd HH-mm-ss
Ubuntu系でRパッケージインストール時に足りないものがあった時

CRAN上のRパッケージはWindows向けにはバイナリで提供されていることがほとんどですが、Linux向けにはソースで提供され、コンパイルが必要です。
このため、`install.packages('hoge')`すると、

```
configure: error: "ODBC headers sql.h and sqlext.h not found"
```

といったメッセージが返ることがあります。

ほうほうODBCね、と思ってbashで

```bash
apt search odbc
```

するとうんざりするほどのodbcを名前に含むパッケージが!

経験豊かな人でなければ、どれを入れればいいか分かりません。

# grepする

例えば、開発者向けパッケージが怪しいなら

```bash
apt search odbc | grep dev
```

として、grepで絞り込むことができます。

`|`はパイプで、左側の結果を右側のコマンドに渡してくれます。
この場合、左側の結果の中から、grepでdevを含むパッケージを絞り込みます。

バージョン(新旧)やアーキテクチャ(x64 or i836)の違いを除くと以下にまで絞れます。

- libghc-haskelldb-hdbc-odbc-dev - HaskellDB support for the HDBC ODBC driver
- libghc-hdbc-odbc-dev - unixODBC HDBC (Haskell Database Connectivity) Driver for GHC
- libiodbc2-dev - iODBC Driver Manager (development files)
- libocamlodbc-ocaml-dev - UnixODBC database bindings for OCaml
- unixodbc-dev - ODBC libraries for UNIX (development files)                                                    

なんとなくunixodbc-devがprimitiveっぽくて怪しい気がしますが自身は持てません。
結局sql.hとsqlext.hを含んでいないものをインストールしてしまうと残念。

# apt-file findする

apt-file findであるファイルを含むパッケージがどれか調べることができます。
これを用いてsql.hとsqlext.hを含むパッケージを探しましょう。

apt-fileが未インストールであればインストールします。

```bash
sudo apt update
sudo apt install apt-file
```

apt-fileを使いましょう

```bash
apt-file update
apt-file find ^sqlext.h$
```

まずupdateすることでファイル一覧を入手します。
その後findで欲しいファイルを含むパッケージを見つけます。

manには1つのファイルを含むパッケージを見つけるとあるので

```
apt-file find sql.h sqlext.h
```

としても両方含むものを見つけることはできません。
うまく結果を統合したいですが私のshell力が足りない。

sqlext.hを含むパッケージは

- libiodbc2-dev: /usr/include/iodbc/sqlext.h
- libwine-development-dev: /usr/include/wine-development/windows/sqlext.h
- mingw-w64-common: /usr/share/mingw-w64/include/sqlext.h
- mingw-w64-x86-64-dev: /usr/x86_64-w64-mingw32/include/sqlext.h
- unixodbc-dev: /usr/include/sqlext.h
- wine1.6-dev: /usr/include/wine/windows/sqlext.h

ですので、やはりunixodbc-devでよさそうです。

```
apt install unixodbc-dev
```

すればsql.hとsqlext.hが手に入ります。

# Enjoy!!


# 追記: cran2debとかc2d4uの依存関係を見る

2018/03/30 16:23

yutannihilationさんに教えて頂きました。
ちょっとまだ試せていませんが、取り急ぎ。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">知ってるかもですが、cran2debとかc2d4uの依存関係を見るのが確実です。 <a href="https://t.co/Cy9ibZ2nWA">https://t.co/Cy9ibZ2nWA</a> あとは、あんまり使ったことないけど <a href="https://t.co/4wqwyeYMXU">https://t.co/4wqwyeYMXU</a> も便利かも。</p>&mdash; Hiroaki Yutani (@yutannihilation) <a href="https://twitter.com/yutannihilation/status/979595083661025280?ref_src=twsrc%5Etfw">March 30, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
plotly で折れ線グラフを描く

次のようなグラフを作成します。
![plotly_mar3001.png](https://qiita-image-store.s3.amazonaws.com/0/179446/1c5f352d-848a-8cb0-98ed-9db8c05d50ba.png)

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<!--
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
-->
<script src="/js/plotly-latest.min.js"></script>
</head>

<body>  
<h2>サンプル</h2>
<div id="myDiv"></div>
<script src="ex01.js"></script>
Mar/30/2018<p />
</body>
</html>
```

```js:ex01.js
// ---------------------------------------------------------------
//	ex01.js
//
//					Mar/30/2018
//
// ---------------------------------------------------------------
var trace1 = {
      x: [0,1,2,3,4,5],
      y: [3,10, 15, 13, 17,12],
      type: 'scatter'
}

var trace2 = {
      x: [0,1,2,3,4,5],
      y: [5,16, 5, 11, 9,8],
      type: 'scatter'
}

var trace3 = {
      x: [0,1,2,3,4,5],
      y: [7,10, 8, 12, 4,3],
      type: 'scatter'
}

var data = [trace1,trace2,trace3];

Plotly.newPlot('myDiv', data);

// ---------------------------------------------------------------
```
[Keras]keras2.1.3~2.1.5の環境下でResNet50やInceptionV3のFine-tuningがうまくいかない。

# 起こった問題
keras2.1.5の環境下でkeras2.0.6の環境下の時に正しく学習できていたFine-tuningのコードが正常に動かなくなりました。

# 検証環境
keras2.0.6, 2.1.2, 2.1.3, 2.1.5
tensorflow-gpu1.4.1
python3.5.5

# 対策
keras2.1.2を使いましょう。

# 原因っぽいところ
https://github.com/keras-team/keras/issues/9214
上記のissueでもあげられていますが、ResNet50やInceptionV3のFine-tuningがうまくいかない問題が起きているようです。
私の環境で検証したところ、keras2.1.2ではうまくいきkeras2.1.3では計算結果がおかしくなっていたため、2.1.3で不具合が発生しているようです。
2.1.3のリリースノートにおいて、

```
trainable attribute in BatchNormalization now disables the updates of the batch statistics (i.e. if trainable == False the layer will now run 100% in inference mode).
```
と書かれていますので、この層の固定化の変更が不具合を引き起こしているのではないかと思っています。
Media Processing Service を使う

# ワークフローを使用する
[前回]()はトランスコードタスクを使用したので今回はワークフローを使用してみたいと思います。

ワークフローが設定されると、メディアファイルがOSSにアップロードされるときに、OSSは自動的にメディア処理をして、特定のOSSバケットとオブジェクトに一致するアクティブなワークフローを識別します。一致したワークフローが自動的に実行されます。

## 使用手順
初めに、メディアバケットを指定する必要があります。前回使用したバケットがあるので入力メディアバケット・出力メディアバケットに追加します。

![スクリーンショット_0030-03-30_12_54_38.png](https://qiita-image-store.s3.amazonaws.com/0/234379/b5eb34af-2837-d6e1-48b5-893dd505b29c.png)

次にワークフロー作成をクリックします。

![スクリーンショット_0030-03-28_19_27_36-2.png](https://qiita-image-store.s3.amazonaws.com/0/234379/1a9f7156-311c-8668-079c-7d023888a849.png)

ワークフロー名: 文字は1〜128まで入力可能です。
プリセット: 今回はカスタマイズのままです。
トポロジー: ここでフローの設定をしていきます。

![スクリーンショット_0030-03-30_12_45_28.png](https://qiita-image-store.s3.amazonaws.com/0/234379/6c19b00b-5d25-a9ad-3691-38cb9484300a.png)

入力の編集をクリックします。
入力パス: ここで入力メディアバケットに設定したバケットを選択します。
MPSキュー: 今のところ選択できません。
メッセージタイプ: メッセージを送信する必要はないのでこのままです。
![スクリーンショット 0030-03-30 13.03.19.png](https://qiita-image-store.s3.amazonaws.com/0/234379/d31424a4-7997-7729-6da6-92ff1d3a6898.png)


入力の[+]をクリックしてトランスコードを選択します。
![スクリーンショット 0030-03-30 13.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/234379/fcce69ab-779b-da5d-2a68-bed0c09f4f55.png)

[入力]と[公開]の間にトランスコードが追加されます。
![スクリーンショット 0030-03-30 13.08.05.png](https://qiita-image-store.s3.amazonaws.com/0/234379/b7d15895-c552-5169-34a8-c2f5b18851d2.png)

次にトランスコードの編集をクリックします。（画像では分かりませんがゴミ箱の隣にあります。）
名: 自動的に割り当てられますが、変更することも可能です。
テンプレート: 変換方式の選択します。
出力場所:出力メディアバケットに設定したバケットを選択します。
ウォーターマーク: する or しない
![スクリーンショット 0030-03-30 13.11.34.png](https://qiita-image-store.s3.amazonaws.com/0/234379/4696f92e-55f8-9db8-91d3-e0811c77836d.png)

公開
メディアタイプ: 自動とマニュアルがあります。
![スクリーンショット 0030-03-28 19.33.20.png](https://qiita-image-store.s3.amazonaws.com/0/234379/a73eb61b-70a3-859d-0b46-4792f6b4deb5.png)

ここでよければ次へをクリックするとバケットのドメインの設定をすることができます。完了をクリックするとワークフローが作成されます。

![スクリーンショット 0030-03-28 19.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/234379/9ee6d580-c5e4-f870-e6d3-1d05550462f8.png)


![スクリーンショット 0030-03-30 12.32.36.png](https://qiita-image-store.s3.amazonaws.com/0/234379/515ffe71-cfa8-cd15-f327-69c955d409de.png)

## 最後に
AlibabaCloudのOSSはAWSのS3より使いやすい
Media Processing Service を使う

# Media Processing Service
2018/3/22に日本コンソールに[Media Processing Service](https://jp.alibabacloud.com/product/mts?_ga=2.133157646.125468439.1522371892-1983018408.1517290668&_gac=1.213715360.1522371892.EAIaIQobChMIn7n7m-2S2gIVxA0rCh07zAZDEAAYASAAEgKGh_D_BwE)がリリースされましたので　早速使用してみました。
今回試すのはトランスコードタスクと呼ばれるサービスです。

## 事前準備
- OSS(alibabacloudのストレージサービス)にインプットとアウトプット用のバケットが必要になるので。それぞれ用意しておきます。
途中の画面からバケットを作成することは出来ますが出戻り作業が発生するので先に作成しておくのがベターです。
- テスト用のサンプルファイル。適当な動画ファイル(.mov)で構いません。このファイルをインプット先のバケットに置いておきます。

## 実行
コンソールの画面の[タスク作成]をクリックします。
![MPS.png](https://qiita-image-store.s3.amazonaws.com/0/234379/c24bf551-ec95-fa71-1436-22ca94624b00.png)



- 入力： OSSのインプット先のファイルURL(参照からファイルを選択できます)
- MPSキューのトランスコード： mts-service-pipeline 今のところこれしか選択できません。
- 出力名： 文字の長さは1〜64まで。　英字、漢字、ひらがな、カタカナ、数字、および共通の句読点を含むことが出来ます。拡張子は追加することでができません。
- 出力場所： OSSのアウトプット先のファイルURL(参照からファイルを選択できます)

![MPS-2.png](https://qiita-image-store.s3.amazonaws.com/0/234379/ce63ac8b-3e43-4d3d-1252-f36863d3fcb9.png)

次にテンプレートを選択します。ここでは出力するフォーマット、ウォーターマークの有効化、ビデオクリップ、イメージの回転等の設定をすることができます。（選択は一つのみ）
![Banners_and_Alerts_と_MPS.png](https://qiita-image-store.s3.amazonaws.com/0/234379/0a087ad4-a6e4-9caf-6518-b86af1eb0989.png)

フォーマットの選択をして、トランスコードをクリックするとファイルの変換作業が始まります。変換が終わるとレコードに表示されます。
3MBのファイルでしたが1分もかからず終わった気がします。
![スクリーンショット_0030-03-30_11_02_38.png](https://qiita-image-store.s3.amazonaws.com/0/234379/ae85fad7-40df-61d2-fd1d-ce916de2cd44.png)

# 料金
プロダクトの[料金](https://jp.alibabacloud.com/product/mts?_ga=2.133157646.125468439.1522371892-1983018408.1517290668&_gac=1.213715360.1522371892.EAIaIQobChMIn7n7m-2S2gIVxA0rCh07zAZDEAAYASAAEgKGh_D_BwE#price)に載っています。
何回かトランスコーディングをしてみたのですが利用状況の金額がJPY 0のままだった（謎）
GCPのBitnami WordPressで無料SSL（Let's Encrypt）を導入する

GCP（Google Cloud Platform）で提供されているWordPress（Bitnami版、通常版はうまく動かないことが多い）でSSLを導入する手順をまとめました。

## Let's Encryptとは？
Let's Encryptで無料でSSL（https）を導入することができます。これはSSLを普及させるため公開されているオープンなプロジェクトで、Internet Security Research Groupが公益法人として運営しています。
詳しいことはわかりませんが、公式サイトによれば、認証局（CA）サイドとウェブサイト管理者の安全なサーバ構築の補助の両面から、最先端の TLS を実装している、ということです。

・公式サイト
https://letsencrypt.jp/

## コマンドで導入
ドメイン名は各自変更してください。

```:コマンドライン
 
cd /tmp && git clone https://github.com/letsencrypt/letsencrypt #/tmpにletsencryptをclone
cd letsencrypt
./letsencrypt-auto
./letsencrypt-auto certonly --webroot -w /opt/bitnami/apps/wordpress/htdocs/ -d ドメイン名
sudo cp /etc/letsencrypt/live/ドメイン名/fullchain.pem /opt/bitnami/apache2/conf/server.crt
sudo cp /etc/letsencrypt/live/ドメイン名/privkey.pem /opt/bitnami/apache2/conf/server.key
sudo /opt/bitnami/ctlscript.sh restart apache
 
```
## 証明書の更新

```:コマンドライン
/tmp/letsencrypt/letsencrypt-auto renew
$ sudo crontab -e
cp /etc/letsencrypt/live/<ドメイン名>/privkey.pem /opt/bitnami/apache2/conf/server.key
cp /etc/letsencrypt/live/<ドメイン名>/fullchain.pem /opt/bitnami/apache2/conf/server.crt
/opt/bitnami/ctlscript.sh restart apache
```

# まとめ
BitnamiのWordPressはとっても安定してて安く、無料でSSLもいけますよ。
Actions on Google で作ったテストアプリを Google Home 実機で共有使用する

Actions on Google でアプリを作成して、レビューに出す前、テストバージョンの状態で他の人に Google Home を使って試してもらおうとして実行できなかったことってありませんか？そんな人向けです。

なんかできないケースがあるなーと思い、色々と確認して、とりあえず実行するのに必要な条件はこれじゃないかというものがわかったので書いておきます。（まだこんな設定も必要だよということがあれば是非教えてください！）

確認できた必要な条件は2つ。

- セットアップしたアカウントと開発するアカウントが同じ
- テストアプリを試す人がアカウントリンクをしていない

以下、詳細。

# セットアップしたアカウントと開発するアカウントが同じ

Google Home をセットアップしたGoogleアカウントで Actions on Google アプリを開発する必要があります。逆に言うと、Actions on Google アプリを作ったアカウントで Google Home をセットアップする必要があります。

上で言うセットアップとは、だれかにセットアップされた Google Home にアカウントリンクしたというものではないので注意してください。

だれかがセットアップした Google Home にアカウントリンクした場合、アプリ開発者本人はテストアプリを実行することができますが、他の人はテストアプリを実行することができない状態になります。


# テストアプリを試す人がアカウントリンクしていない

テストアプリを試してもらいたい人が、テストアプリを持ったGoogle Homeにアカウントリンクしている状態だとテストアプリを実行することができません。
アカウントリンクが行われていると、Voice Match 機能が働くようで、試す人のアカウントにテストアプリが存在しないという判定が優先されるようです。


# まとめ

上記2点を押さえておけば、他の人に実機で試してもらうって時に動かないからといってワタワタしなくてよくなります。

確認作業としては、下記をすればいいかと。

1. 「Google Home」アプリの「デバイス」で対象デバイスを選び、「設定」から「リンク済みアカウント」を確認
2. 「リンク済みアカウント」の一番最初にテストアプリを開発したアカウントが存在するか確認
3. 同じく「リンク済みアカウント」にテストしてもらう人のアカウントがないか確認
4. テストアプリを試してもらう

もし、既にセットアップされている Google Home を持ってこられて、「この Google Home でそのテストアプリを実行できるようにして」と言われた場合、上記した仕様を踏まえた上での確認事項として、

- 開発者アカウントで再セットアップしてもいいか
- （テストアプリを利用する人の）アカウントに紐付いた機能が使えなくなるがいいか

と言うことを伝える必要が出てくるかなと思っています。こんな具体的なケース結構ありませんか？ありませんね。
あとそんな状況になったら7日毎に「Test Draft」ボタンを押さなければならないので大変そうですね。

（テストバージョンじゃないエンタプライズバージョンのような実行の仕方が増えるのを待っています。

ゲストモードのオンオフは何回か切り替えてみたのですが、関係ないようです。


# 小ネタ

ウェイクアップワードの「OK, Google」の部分だけ開発者が言えば、上記条件にしてなくても使えました。（録音でも可）
Node.js アプリを構築し、JSON Web Token を用いて認証を行う

クラウド認証プラットフォーム Auth0を利用して、Express.jsを用いてNode.jsバックエンドアプリケーションのユーザー認証およびAPI認可をJSON Web Token(JWT)を用いて簡単に実装する手順を、Auth0およびGithubに公開されたサンプルソースを使用して解説します。

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


#JWTを用いた Node.js 認証チュートリアルを見る
<img width="473" alt="スクリーンショット 2018-03-30 13.06.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/d25c3f2a-5c3b-abb7-c6df-9e374185bb58.png">



Node.js 認証チュートリアルは以下のURLからアクセスすることができます。

[Node.js アプリを構築し、JSON Web Token で認証する](https://auth0.com/blog/jp-building-and-authenticating-nodejs-apps/) 

##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したNode.js以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_jwt&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
EXCEL2016 > 時刻項目にある(')を取り除く > VALUE()を使う

```txt:動作環境
Windows 8.1 Pro (64bit)
Excel 2016 (以下EXCEL)
```

### 方法1 > csv出力 + csv読込み (お薦め: 方法2)

時刻項目に`'`が付いている.xlsxファイルがある。
(例: `'11:30:53`)

このままでは時系列グラフを作成できない。

以下の手順で変換する。

1. .csvファイルに出力する
2. .csvファイルをEXCELに読込む

.csvファイルに出力した時点で`'`は削除されている。

セルに対する式(RIGHT()やTRIM()など）では文字`'`は削除できるが、そのセルを使ったグラフ描画時に日時として認識できなかった。

### 方法2 > VALUE()を使う

@nukie_53 さんの[コメント](https://qiita.com/7of9/items/b54fc59628d049da947c/#comment-0686c4f4d71a3fce8b57)を参照ください。

情報感謝です。
自宅 IoT

---
title: 自宅 IoT
published: true
description: 
tags: 
---

# Echo
![Echo](https://images-na.ssl-images-amazon.com/images/G/09/kindle/dp/2017/879894539601/e/e_prod_v4._CB500873058_.jpg)

(https://www.amazon.co.jp/Amazon-Echo-New%E3%83%A2%E3%83%87%E3%83%AB-%E3%80%81%E3%83%81%E3%83%A3%E3%82%B3%E3%83%BC%E3%83%AB-%E3%83%95%E3%82%A1%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF/dp/B071ZF5KCM)

# Roomba
![Roomba Serial](https://community-home-assistant-assets.s3-us-west-2.amazonaws.com/optimized/2X/c/c1a32634d0727a8b8e8d1db0a5ec1219799d5ccc_1_323x300.png)

![Roomba](https://community-home-assistant-assets.s3-us-west-2.amazonaws.com/original/2X/a/a258c7253f8bd3fe76ad9e7aa1202b60bd113d74.jpg)
​
# esp2866
![ESP2866](https://images-na.ssl-images-amazon.com/images/I/613Q6IxkivL._SL1000_.jpg)

https://www.amazon.co.jp/dp/B0718T232Z

# aliexpress

https://m.aliexpress.com/item/32711658237.html

# 赤外線リモコン

![image.jpeg](https://qiita-image-store.s3.amazonaws.com/0/3949/da988a56-7990-f383-1133-e0eddb9c4030.jpeg)
ASP.NET Core 2.0 アプリケーションを JWT でセキュアする

クラウド認証プラットフォーム Auth0を利用して、ASP.NET Core 2.0で作成したWeb APIアプリケーションのユーザー認証およびAPI認可を簡単に実装する手順をAuth0およびGithubに公開されたサンプルソースを使用して解説します。

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


#ASP.NET Core 2.0 認証チュートリアルを見る
<img width="481" alt="スクリーンショット 2018-03-30 12.34.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/0b41452e-01ce-5bdb-91e8-0b6eb3c369f8.png">


ASP.NET Core 2.0 認証チュートリアルは以下のURLからアクセスすることができます。

[Auth0 - ASP.NET Core 2.0 認証チュートリアル](https://auth0.com/blog/jp-securing-asp-dot-net-core-2-applications-with-jwts/) 

##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したASP.NET Core 2.0以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
Athena で S3 Log の datetime を parse して任意の文字列に format する方法

```
SELECT format_datetime(date_parse(datetime, '%d/%b/%Y:%H:%i:%s +0000'),'YYYY-MM-dd HH-mm-ss') FROM "S3LOG_DATABASE"."S3LOG_TABLE" limit 10
```

formate_datetime は http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html なので注意。
[Ruby]Base64エンコードされたデータをSCPでアップロードする

## 概要

API経由でBase64エンコードされたデータを、指定サーバにアップロードするようなケースを想定してます。

## 必須Gem

- [net-scp](https://github.com/net-ssh/net-scp)

```terminal
$ gem install net-scp
```

## サンプル

```ruby
# coding: utf-8
require 'tempfile'
require 'net/scp'
require 'base64'

contents = Base64.encode64("contents")
save_path = "/var/tmp/test.txt"
host = "localhost"
user = "username"
password = ""

Tempfile.create("upload") do |tf|
  tf.binmode
  tf.write(Base64.decode64(contents))
  tf.rewind
  file_size = tf.size
  Net::SCP.start(host, user, 
                 password: password) do |scp|
    scp.upload! tf.path, save_path
  end
end
```

- Tempfileを利用し、一時ファイルからサーバへ直接ファイルを送信
- 一時ファイルに書き込む際に、デコードを行う
- 保存先のファイル名は、APIから送信されてきたファイル名を用いる等の工夫は必要
Linuxにhttpdサーバを立てる

sudo yum install httpd
sudo systemctl start httpd
>Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

エラーが出たので修正
sudo vim /etc/httpd/conf/httpd.conf
>User nobody
Group nobody

起動した！

ついでに.htmlでphpを動作させるために
sudo vim /etc/httpd/conf.d/php.conf
><IfModule mime_module>
   AddType application/x-httpd-php .html
</IfModule>
Jestのmockとimport記法を使う

# はじめに
ちょっと前まで、Jestではimportが利用できませんでした。
理由はbabelでimportをトランスパイルする際にrequireに変換するのですが、そのときにいろいろ問題があったようです。
そのため、私の場合は、automockを利用して、モック不要なものだけをdontMockする、という面倒な手法を利用していました。
しかし、jestがトランスパイルする際に、jest.mockを特別扱いするように変わりました。
(参考：https://facebook.github.io/jest/docs/ja/manual-mocks.html#es-module-import)

# 使い方
普通に使うだけです。

```ts:app.ts
import { foo, bar } from "./utils";
export function foobar() {
  return `${foo()}${bar()}`;
}
```

```ts:utils.ts
export function foo() {
  return "foo";
}

export function bar() {
  return "bar";
}
```

```ts:app.test.ts
import { foo, bar } from "../utils";
import { foobar } from "../app";

jest.mock("../../utils"); // ここが重要。

describe("foobar", function() {
  beforeAll(() => {
    (bar as jest.Mock).mockReturnsValue("foo");
  });
  it("when util.foo returns foo, sould returns foofoo", function() {
    expect(foobar()).toEqual("foofoo");
  });
});
```

サンプルは[こちら](https://github.com/naoki-tomita/jest-mock-test/tree/typescript/do-not-use-automock)

以上です。よろしくお願いいたします。
Azure Data Lake を Azure Storage Explorerから操作する

先月２０１８年２月からPreviewとしてAzure Storage Explorerから直接Azure Data Lakeのストレージの操作が可能になりました！
Azure Data Lake Storage (ADLS)を操作するためにはAzure PortalからWeb版のData Explorerを利用するか、Visual Studio 内のData Explorerを使うしかなかったのですが、データの移動などがしにくいという難点がありました。何がよくなったのか、古い時代のものから見ていきましょう。


# Azure Portal の Data Explorer

[Azure Portal で Azure Data Lake Store の使用を開始する](https://docs.microsoft.com/ja-jp/azure/data-lake-store/data-lake-store-get-started-portal)

以下のADLSのペインよりData Explorerというボタンを押して操作が可能です。Azureってこういうところが地味で、どこから入ればデータを参照できるかわかりにくいですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/12dd1eec-a59f-9f03-d851-059ebefd7cf0.png)

Data Explorerは以下のような形で完結ですが、Upload,Download,Delete,New Folderなどしかサポートしていないため、中々容易に整理などをすることは難しいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/2b69c18a-3362-bf5a-e82c-bf192362961f.png)

# Visual Studio の Azure Data Lake Explorer

Azure Data Lake Analytics用のAzure Data Lake Tools for Visual Studioをインストールすると使えるようになります、。Storage Explorerにビルトインされますので、Azure Data Lake上のストレージが見えるようになります。Databaseなども見えますが、csvなどファイルストレージを使うのにも便利でしょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/a80c5720-4bca-6b94-b49f-52b2a4fbb3fd.png)

ただし、このツールもUpload,Download,Delete,New Folderなどだけなので、フォルダーなどをつかってオーガナイズするには向きません。Azure Data Lake Analyticsを使う場合にスキーマの自動生成などや、データのプレビューをするには必須ですが。

# Azure Storage Explorer の Azure Data Lake Store対応

プレビューで2月にリリースされたようです。プラグインやオプションの設定はいりません、最新のStorage Explorerにアップデートするだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/50acad08-4032-75fe-d575-0961a558c847.png)

以下のようにコピーができるので、フォルダ間の移動などに便利です。ただし、移動（元のファイルを削除）は直接できません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/c6d0f9f0-618c-e559-90d4-27034f76ae19.png)

これで、ずいぶんと管理がしやすくなりましたね。
bundle installでmysql2のgemがインストールできなかった時に試したこと

# 環境
macOS High Sierra
Ryby 2.3
Rails 4.2.1

# 現象
`bundle install`実行時にmysql2のgemインストールでコケた。

```
Fetching mysql2 0.4.9
Installing mysql2 0.4.9 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
```
かなしい。

# 試したこと

## エラーログに書かれているコマンドを実行

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

まずはエラーログに書かれているコマンドを実行。

```
$ gem install mysql2 -v '0.4.9'
```
コマンドは通るものの、`bundle install`実行時の状況は変わらず。

## Xcodeを最新にアップデート

Xcodeを最新にアップデートすると解決することが多いとのことでやってみる。
Xcodeが入っていない環境だったのでApp Store経由で最新版をインストール。

念のためコマンドラインツールも確認。

```
$ xcode-select --install
```
状況変わらず。

## mysqlをインストール

ログの上の方を見てみると

```
mysql client is missing. You may need to 'brew install mysql' or 'port install mysql', and
try again.
```

と書かれていた。

そもそもこの環境にmysqlが入っていなかったっぽい…
ってことでインストール。

```
$ brew install mysql
```

mysqlインストール後に`bundle install`叩いたら無事解決。

# 結論
赤字になっていなかったログを見過ごしていた。
ログは最初から読もう。
広告制作会社で働くプログラマの自動化施策 (2018年3月時点)



サーバ周りの面倒を見る人間が、私一人しかいなかった。
2017年、立て続けにAWSでWEBサーバを構築することがあり、自動化にいたった。

Pythonでプログラミングしたかったのが本音。


以下のような成果物をアップするための環境の構築を前提としています

- PHP/Laravelで開発したシステム
- WordPress
- LPサイト

## サーバの調達

基本的には以下のようなWEB-DB構成です。

- EC2 × n台
- RDS
- S3

これを、Python3系とBoto3を使用して調達/VPC/セキュリティグループの設定等を行なっている。

Boto3 : https://aws.amazon.com/jp/sdk-for-python/


## ミドルウェアのインストール

- LAMP環境の構築
- タイムゾーンの設定
- CloudWatch用のメモリィ/HDD使用量の監視スクリプトのcron設定
- S3のマウント

これは、Ansibleを使用しています。

Ansibleサイトにあるベストプラクティスなディレクトリ構成ではない。

Ansible : https://www.ansible.com/


## デプロイ

Python3系とFabric3で実施したい。

実戦では実施できていない。

個人的な検証は実施中。

私がデプロイするなら、fabコマンドを叩くだけでよいのだが、ディレクター/フロントエンドエンジニアの人たちに使ってもらうには優しくない。

Jenkinsと組み合わせてボタン一発でデプロイできるようにしたい。

Fabric3 : https://github.com/mathiasertl/fabric/


## CI

実戦では実施できていない。

個人的な検証でJenkinsを使用中。

デプロイなら、JenkinsからFabric3を叩く感じを想定している。

テストの自動化は、ユニットテストを書くところから始めよう・・・


## Docker

個人的にごにょごにょ勉強しているが、本番環境では導入は今のところ考えていない。
Oracle Direct NFS Client(dNFS)

#特徴
+ 並列処理数がOSのNFS機能に比べ多い
+ DBプロセスからの直接コネクション
+ 複数のネットワークパスを利用可能

[12cその他新機能](http://www.oracle.com/technetwork/jp/ondemand/20131017-db12c-othernf-4-otn-v03-2047414-ja.pdf)　に詳しい説明がある。

#dNFS有効・無効化手順
DBインストールユーザ(通常oracle)でログインし、環境設定後下記を実施

```Console
$ cd $ORACLE_HOME/rdbms/lib/
有効にする場合
$ make -f ins_rdbms.mk dnfs_on
無効にする場合
$ make -f ins_rdbms.mk dnfs_off
```

#TIPS
+ DBHOME単位で有効・無効を設定可能
+ 有効にしても、DBFやRMAN等の対象ファイル以外はOSの機能でアクセスされる
+ 12cよりRAC(One含む)環境ではdNFSがデフォルト有効
    - Oracle Databae Appliance(ODA)はSAS接続の共有DISKがあるが、NFS接続ではないため対象外
    - 11g、12cシングルDBでも有効化すれば使える
+ NFSサーバによってはdNFS利用不可(Ex. solaris ZFS)

#参考
[使用状況の確認](https://www.veritas.com/content/support/ja_JP/doc/130252712-130252720-0/uxrt-731_v57946432-130252720)
[Direct NFSについて(11g)](http://d.hatena.ne.jp/yohei-a/20110112/1294786963)