OmniAICreator/Qiita-1.07M huggingface dataset:
2017年版(？)マテリアルインスタンス（アクタ別マテリアルパラメータ）変更のやり方

表題のやり方がなかなか見つからなかったので改めてまとめてみた
#プロジェクトの準備、編集内容の設定
実行環境　UE4.17.1

準備
Grayちゃんモデルデータ&プロジェクトをダウンロード（執筆時の最新はVer0.5.0）
http://rarihoma.xvs.jp/products/graychan/

同梱のプロジェクトを開き、キャラクターを追加で配置する

マテリアルが乗ってるディレクトリを開く
![a.png](https://qiita-image-store.s3.amazonaws.com/0/198123/8a4b1823-f64a-986b-c4b6-0981513a3217.png)

今回は服を編集するのでM_GrayChan_Clothを開く（他にテクスチャは絡んでいる）
開くとこのような画面になる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198123/d3c4928c-e00c-9d99-7b57-5b4c9dd971dc.png)

今回は服のテクスチャ、色補正、ラフネスを変更する



#マテリアル、マテリアルインスタンスでの操作
マテリアルインスタンスを作成
![スクリーンショット (45).png](https://qiita-image-store.s3.amazonaws.com/0/198123/5bf2a5e5-dfc5-f603-ad7c-5b881bc85b4c.png)


開くとこのような画面が表示される
![スクリーンショット (46).png](https://qiita-image-store.s3.amazonaws.com/0/198123/13e9af19-b9be-d2d9-f9c9-eebba05b9e56.png)

Parentに元マテリアルを読み込む
![スクリーンショット (47).png](https://qiita-image-store.s3.amazonaws.com/0/198123/5d471816-2d5b-7250-d8a2-731846442a3b.png)

テクスチャをパラメーターに変換
![スクリーンショット (48).png](https://qiita-image-store.s3.amazonaws.com/0/198123/c654d056-d681-f24f-ee78-331737fb7221.png)

パラメーターネームを設定（今回はins_tex）
![スクリーンショット (50).png](https://qiita-image-store.s3.amazonaws.com/0/198123/9f08a2fb-16d7-cd1e-02bf-ca9a70fd3ccd.png)

マテリアル側で保存を押す
インスタンス側を開くとパラメーターが乗ってる
今回はデフォルトは元マテリアルと同一にする
![スクリーンショット (51).png](https://qiita-image-store.s3.amazonaws.com/0/198123/c671a43f-6961-3409-452d-6df09291ce0b.png)

Constant3VectorでRGBの定数が作れる
インスタンス化させる（名前はins_col）
値を(1,1,1)にする

ラフネスはテクスチャで設定されているので今回はそこに倍率をかける
Constantをインスタンスにする(名前はins_rau)
値は1

ここまでの設定を画像にするとこうなる
![スクリーンショット (54).png](https://qiita-image-store.s3.amazonaws.com/0/198123/f3d81184-1d73-618b-3f93-f37820333308.png)

保存してインスタンスに戻ると
3つのパラメーターが表示されている
![スクリーンショット (55).png](https://qiita-image-store.s3.amazonaws.com/0/198123/79afb6f1-695b-a920-810b-3beadc2d6056.png)

#Actor(Pawn)側での操作
続いてキャラのブループリントを開く
BeginPlayでモデル固有のインスタンスを作成し割り当て
biginPlayの最初の状態はこれ
![スクリーンショット (57).png](https://qiita-image-store.s3.amazonaws.com/0/198123/04cd9fae-1203-d404-15b0-fcfe3a152453.png)

以下のように編集する
整数は今回は2番
SourceMaterialはConstantのほう
![スクリーンショット (61).png](https://qiita-image-store.s3.amazonaws.com/0/198123/463c300a-21da-fe9b-5cfd-22af01c28e02.png)

tickイベントを設定し以下のように設定する（色は今回は0.5,0.5,0.5）
![スクリーンショット (62).png](https://qiita-image-store.s3.amazonaws.com/0/198123/1faffae6-6736-5433-f05b-1e049e4ccc05.png)

再生するとプレイヤーだけテクスチャとラフネスが変わっている（色は黒くなっているがテクスチャが違うのでピンとこない）
![スクリーンショット (63).png](https://qiita-image-store.s3.amazonaws.com/0/198123/7a829bd1-4ce5-92a4-85d1-d9f097941eb9.png)

ins_colを0.05に設定するとこのようになる
![スクリーンショット (64).png](https://qiita-image-store.s3.amazonaws.com/0/198123/c8a9cc90-e155-0ac3-7c63-6e253907458b.png)

#あとがき
以上のことがあれば苦労せずプログラムからマテリアルがいじれるようになるかなあと思います（初学者の戯言）

参考動画（英語）
https://www.youtube.com/watch?v=UPc2PUVJm2A
aws RDSのm3 m4 r2全インスタンスでスペック比較した

さくらVPSでDBを立てていたんだけど、どうも重い。AWSへの乗り換えの検討の為色々比較してみた。

select文をEXPLAIN ANALYZEしただけという前提はあるが、＄5/hのdb.m4.10xlargeと＄0.1/hのdb.t2.mediumが5%しか違わないのがへっ？となった。
ソートはBのAVG。t2.midiumが4069でm4.10xlargeが3955。オリジナルのExcelファイルはこちら https://github.com/fushihara/aws-rds-cost

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/b74fab8d-d7f9-6242-dfe2-ba0420a78eec.png)

ただt2もmidiumとlargeは早いけどsmallとmicroになると4倍の時間がかかってるから、クエリがメモリに入り切らなくなった？ら急に重くなる可能性がかなりあるのかもしれない。そうなるとm4の一番少ないlargeがベストかもしれない。しかし月2万円。DBはお高い。

以下、比較条件

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/51cc77cd-a3ea-94c0-274b-191fdd918695.png)

以下のクエリを10回投げて、かかった時間をソート。一番多い値と少ない値を一つづつ取り除いて8個の最大値・最小値・平均を取った。クエリAとBがあるけど、上記の図のBというのはクエリBの事。こっちの方が重いのでそっちの値を図に出した。

```
クエリA
select * 
from home_timeline_tweet_ids left join tweet on home_timeline_tweet_ids.tweet_id = tweet.tweet_id 
where home_timeline_tweet_ids.user_id = 123456 order by home_timeline_tweet_ids.tweet_id desc limit 100

クエリB
select to_char(tweet.created_at, 'yyyy/mm/dd') as time , count(*) as cnt from home_timeline_tweet_ids
left join tweet on home_timeline_tweet_ids.tweet_id = tweet.tweet_id 
where home_timeline_tweet_ids.user_id = 123456 and 
tweet.text ~ 'テスト' 
group by to_char(tweet.created_at, 'yyyy/mm/dd')
 order by to_char(tweet.created_at, 'yyyy/mm/dd') desc limit 100

こうやって10回測定 from linux
export Q="select ほにゃらら"
i=1; while [ $i -le 10 ]; do psql -d twitter -h xxxxx.ap-northeast-1.rds.amazonaws.com  -U twitter -c "EXPLAIN ANALYZE ${Q}" | grep  "Execution time" ; i=$(expr $i + 1);done



測定時間の結果をchromeのdevtoolのコンソールで計算
a=`[user@fushihara.io ~]$i=1; while [ $i -le 10 ]; do psql -d twitter -h twitter-r3-2xlarge.czpa3unkkrto.ap-northeast-1.rds.amazonaws.com -U twitter -c "EXPLAIN ANALYZE ${Q}" | grep  "Execution time" ; i=$(expr $i + 1);done
 Execution time: 4312.636 ms
 Execution time: 4314.856 ms
 Execution time: 4339.720 ms
 Execution time: 4319.702 ms
 Execution time: 4301.736 ms
 Execution time: 4306.114 ms
 Execution time: 4312.707 ms
 Execution time: 4317.436 ms
 Execution time: 4306.224 ms
 Execution time: 4307.491 ms`;//例
b = a.split("\n").
    map((i)=>i.trim()).
    map(i=>i.match(/time: ([0-9.]+) ms/)[1]-0).
    sort().slice(1, 9);
console.log(`MAX=${b[0]} MIN=${b[7]} AVG=${b.reduce((a,b)=>{return a+b})/8}`);

```

さくらvpsの使ってるプランはこちら。メモリ8GB、HDD 800GBモデル。この1台をDB専用にしてる訳ではなく、他にもnginxとか入ってるけど参考までに。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5825/80600944-4d08-642d-ae4e-894e1be32547.png)

VPSが月8000円とすると、t2.midium相当。それでも自鯖だと6100ポイントが4000ポイント。自鯖がDB専用じゃない事を考えると、AWSにはもっと頑張って欲しい所だけどどうしよう…
[GAS] 実行する権限がありません。についての対策まとめ

Google Apps Scriptでシンプルトリガーを使用したときに実行できない関数がありますが、
それについて調べたことまとめです。
自分が使いたかったのは他のスプレッドシートを開く SpreadsheetApp.openById()

#原因
onEditやonOpen等は記述するだけで実行されるシンプルトリガーという便利なものなんですけど、
これで実行された場合は権限が最低らしく、セキュリティで実行できる関数に制限があるとのこと。
なので onEditから他ファイルにアクセスする関数等は実行できない。

#対策

##プロジェクトのトリガー　を設定する。
シンプルトリガーでは動かなくても個別設定したトリガーでは動作するので、登録しちゃおうということ。

編集→現在のプロジェクトのトリガー　から登録すればOK
※ onEdit等シンプルトリガー名のままだと2回実行されるようになるので注意。

しかし、トリガーはスプレッドシートをコピーするといなくなるので、
毎日コピーして行う業務だったりのときに凄く手間です。
なので今回の対策として以下2つめ

##トリガービルダーを使う
今のままだと、　スプレッドシートをコピーした際に、
スクリプトを開いて、トリガーを設定して……。なんて面倒臭いことをやらなければならず、
しかも誰にも使えるとは言えない状況なので、それの対策で、初期化処理を作ります。

Script Servicesにトリガービルダーがあるのでそれを使った初期化ボタンを作成。

[Class SpreadsheetTriggerBuilder](https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder)
[Class Trigger](https://developers.google.com/apps-script/reference/script/trigger)

```js:onEdit


//初期化処理
function init()
{
  Logger.log('init: START');
  
  //現在の設定されているトリガーを種痘
  triggers = ScriptApp.getProjectTriggers();
  
  for (var i = 0; i < triggers.length; i++) {
   if (triggers[i].getHandlerFunction() == 'actionOnEdit') {
     Logger.log('init: トリガー登録済');
     Browser.msgBox('初期化は既に実行されました。');
     return 0;
   }
  }
  
  Logger.log('init: run');
  var sheet = SpreadsheetApp.getActive();
  try{
    //トリガーの設定をスクリプトで
    ScriptApp.newTrigger('actionOnEdit')
    .forSpreadsheet(sheet)
    .onEdit()
    .create();
  }catch(e){
    Browser.msgBox('初期化に失敗しました。' + e);
  }
  
  Logger.log('init: End');
  Browser.msgBox('初期化が完了しました。');
}

//onEditで実行したい処理
function actionOnEdit()
{
  var spreadsheet = SpreadsheetApp.openById({ID});
  ...
}
```

あとはスプレッドシート上に　図形を描画→スクリプトの割当をして、最初に使うときに押してもらえばOK
一手間いるけど、許容範囲だと思う。

もう少し調べればonEdit()とかからスクリプト内で認証を経由して実行できるようにとかできるのかもしれないけど、
見つからなかったので今のところこれが一番手間いらずかな。

#参考
[[GAS]実行に失敗: その操作を実行する権限がありません。に悩んだこと](http://qiita.com/VirgomanBros/items/41a46d778dc6fcac0d0b)
[GAS 「実行する権限がありません」にハマりました](https://www.embedded-property.net/2016/09/gas-%E3%80%8C%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%A8%A9%E9%99%90%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%8D%E3%81%AB%E3%83%8F%E3%83%9E%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F/)
[Rails] Railsの404, 500エラーページはなぜ静的ファイルで用意されているのか考察してみた

## 背景

Railsのエラーページってデフォルトで静的ファイルで用意されていますよね。

public/404.html
public/500.html

ただ、実際に商用Webアプリを作っていると

* 「共通ヘッダ・フッタ」も表示したい！
* 他の動的部分で使っているcssとか画像を読み込ませたいけど静的ファイルだからassets_pathのパス解決ができない！

などのニーズが出て来ることも多いと思います。

そこで

http://morizyun.github.io/blog/custom-error-404-500-page/
のように `rescue_from` を使ってRailsアプリ側でエラーハンドリングしたり
[rambulance](https://github.com/yuki24/rambulance) を使って
404や500を動的表示できるようにカスタマイズしている人も多くいるようです。

## 考察

なぜRailsはエラー画面を静的ファイルで用意しているのか理由を自分なりに考えてみた。

### 1. 動的にViewを表示しようとするとそこにたどり着くまでに別のエラーが起こるリスクがある

例えばRailsのルートで404と判定→404のViewを表示するまでの間にエラーが発生した場合、それは404ではないエラーとユーザーに表示させてしまうことになります。

### 2. 404, 500はRailsの外でも使うケースがあり、静的ファイルの方が流用しやすい

商用環境になると、Railsをスタンドアロンで動かすことはないでしょう。
自分が携わっているRailsプロダクトではAWS環境上で運用することが多く

* CDN(Cloudfront)
* ロードバランサ（ELB） 
* EC2（Nginx+Puma+Rails）
* ファイルストレージ（S3)

の構成にしています。

このケースを例にとると
Cloudfront, ELB, S3の部分にも404, 500エラーページ（それ以外のステータスも）を設定してあげる必要があります。そこで使えるのはもちろん静的ファイルなので、Railsで使っている404.html, 500.htmlがそのまま使えるとそれを配置するだけなので楽です。

### 3. そもそも動的に入り組んだことをさせるほどユーザーに見せてはいけないページ

基本的には

* 404エラー → リンク切れ
* 500エラー → 原因不明の障害

実装上の理由で上記が発生しているのであれば、それは実装で早急に解決すべきことです。
ユーザー操作の範囲で起こるものであれば、まとめて共通の500エラーを表示するのではなく、別途個別のControllerレイヤーでハンドリングしてエラーの旨を表示するのが筋です。

## 結論

上記の理由により静的ファイルに落ち着いているのだと推測しました。
完璧なDRYではないのかもしれないですが、特に考察2の用途を考えると静的ファイルで持ち回ったほうが生産的です。

以上、Railsの404, 505に関しては極力カスタマイズはせずRails wayに従って静的ファイルのままいきたいと思う今日このごろでした。
QPython+SL4A Androidスマホのアプリを開発できないか？

・開発メモです。
・AIの勉強から、Python の勉強を始め、Androidスマホでも利用できたので、自分用のアプリを作成中
・必要なところから、泥縄で勉強中。

# スマホアプリ(APK)をPythonで開発
・qpythonでお手軽に、アプリが開発できそうなのは分かった。
・でも、コンソールから起動するのは、手間がかかる。
・APKの作成を調査中

# 参考にさせていただいてます
http://17-m.seesaa.net/article/342858168.html
「PythonでAndroidアプリを書いてAPK作成までAndroid端末だけで行う」
・AIDEをつかったAPKビルドの流れが分かる
http://17-m.seesaa.net/article/335203008.html
・こちらは、環境設定
wikipedia の api をつかって、記事のアクセスを見る

# wikipedia の記事へのアクセスログ

簡単にとれるのでつくってみました。タブ区切りで結果が出力されるので、エクセルなどにはりつけてすぐにグラフ化できます。記事の題名かえて適宜ためしてみてください。

```py

#!/usr/bin/env python
# -*- encoding:utf-8 -*-
import requests
import json
import urllib

t1='{x_type}/{x_lang}.wikipedia/all-access/all-agents/{x_article}/daily/{ymd_from}/{ymd_to}'
x_type='https://wikimedia.org/api/rest_v1/metrics/pageviews/per-article'

# 英語 Shinzō_Abe
#x_article='Shinz%C5%8D_Abe'
#x_lang = 'en' # 英語の指定

x_article = urllib.parse.quote('前川喜平') # 
x_lang = 'ja' # 日本語の指定
ymd_from='2017050100' # 日付開始
ymd_to='2017053000'   # 日付終わり

req = requests.get(t1.format(ymd_from=ymd_from,x_lang=x_lang,x_type=x_type,x_article=x_article,
                             ymd_to=ymd_to))#req.text
for one in json.loads(req.text)['items']:
    print(one['timestamp'] + "\t" + str(one['views']) )
```
### [前川喜平](https://ja.wikipedia.org/wiki/%E5%89%8D%E5%B7%9D%E5%96%9C%E5%B9%B3)へ
の9月のアクセスログです。グラフ化しました。

![chart_20170924_1.png](https://qiita-image-store.s3.amazonaws.com/0/48387/87c6a4f1-118c-df04-dae0-15ccf2f24851.png)
Digest 認証のクライアント　curl,php,python3

サイト　http://example.com
ユーザー　scott
パスワード　tiger123
のダイジェスト認証のページへのアクセス方法です。

```bash
#
curl --digest --user "scott:tiger123" "http://example.com"
#
```

```php
#! /usr/bin/php

<?php

$ch = curl_init("http://example.com");

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);

curl_setopt($ch, CURLOPT_USERPWD, "scott:tiger123");

$response = curl_exec($ch);

curl_close($ch);
?>
```

```py3
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#					Sep/24/2017
# ----------------------------------------------------------------
import sys
import requests
from requests.auth import HTTPDigestAuth
#
# ----------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="http://example.com"
user="scott"
password="tiger123"
rr=requests.get(url, auth=HTTPDigestAuth(user,password))
print(rr.status_code)
print(rr.text)
#
sys.stderr.write("*** 終了 ***\n")
# ----------------------------------------------------------------
```
Railsでcontroller名/stylesheet名/CoffeeScript名を変更すると、なぜかassetsが読み込まれない

命名規則を間違えてしまい、 `rails g controller`で生成されたファイルを全て手直しでファイル名変更していきました。
変更したファイルは、

* controller名
* 作成されたviewフォルダ名
* coffeescript名
* scss名
* routesパスのコントローラー名
* helper名
* 対応specファイル名

以上を全て手直ししていきました。
…これがそもそもの間違えでした。。。


## エラーメッセージ(Sprockets::Rails::Helper::AssetNotPrecompiled)

```
[INFO]2017-09-24 09:46:38 +0900:  :   Rendered viewフォルダ名/index.html.erb within layouts/application (64.2ms)
[ERROR]2017-09-24 09:46:38 +0900:  : Sprockets::Rails::Helper::AssetNotPrecompiled
 Asset was not declared to be precompiled in production.
Add `Rails.application.config.assets.precompile += %w( 対応するstylesheet名.css )` to `config/initializers/assets.rb` and restart your server
```

`index`ページをなんど表示させても同じメッセージが出ていました。
変更ファイルがいくつもあったので、それが原因だろうとばかり思っていて、何回もファイル名を見直しました。。。
確認したのですが、ルートの設定も全て問題なかったのです。
ちゃんとエラーメッセージを見ていればこんなことにはならなかったんですが。。。

## 解決
エラーメッセージの`restart your server`が解答でした。

サーバーを起動し直さないと、scssからcssへのコンパイルが正しく行われないようです。
同じエラーメッセージが出た際は気をつけてください。。。


てか、そもそも最初からコマンドで作り直せばよかったんですけどね。
Neural Network Console 使ってみた 1:初期設定

ダウンロードして解凍したまではいいが、最初の一歩で躓いたのでメモ的に。
Docsタブにいろいろ説明があることに気づくまでに時間がかかったため。

https://dl.sony.com/ja/
  ⇒ Docsタブを押す。と、↓のURLに飛ぶ。
https://support.dl.sony.com/259/


解凍に際しての注意をここで初めて確認したので、念のため記載。

> ご注意
> 
> Neural Network Consoleはパスに2バイト文字が含まれない、アプリケーションから自由に書き込み可能なフォルダに配置する必要があります。Neural Network Consoleは2バイト文字が含まれているフォルダや、Program Filesのようなアプリケーションから書き込み不可なフォルダでは正しく動作しません。

これ、案外やりがちな、ユーザーのダウンロードフォルダで解凍したりすると動かないってことなので注意。
あと、ユーザ名が日本語だったので動かない状況に陥ったりしました。注意。

次にGPU設定。
詳しくはWebで。(https://support.dl.sony.com/259/)

設定が終わったらチュートリアル。

2017/10/08 追記
GPUを設定したがエラーが連発でどーにもチュートリアルが進まない。
こんなエラー。
> RuntimeError: target_specific error in nbla::CudnnHandleManager::handle
C:\Users\gitlab-runner\builds\543b17d2\0\nnabla\nnabla-builder\nnabla-ext-cuda\src\nbla\cuda\cudnn\cudnn.cpp:205
Failed `status == CUDNN_STATUS_SUCCESS`: NOT_INITIALIZED

⇒どうやらcuDNNをインストールしていないことが原因？
インストールしてみる。
https://developer.nvidia.com/cudnn

2017/09/26時点で最新の、「cuDNN v7.0.2 (Sept 7, 2017), for CUDA 9.0 RC」をチョイス。
インストールガイドに従って設定していく。
解凍先フォルダを「 C:\Program Files\NVIDIA GPU
Computing Toolkit\CUDA\v9.0」にする。
⇒ここであればデフォルトで読み込んでくれそう。

ここでもそもそもの環境に問題あり。
GPUがIntel HD Graphics だったのだが、このCUDAが対応していないらしい・・・。

というわけで四苦八苦した結果、とりあえずチュートリアルはCPUで動かすことにしました。
今更と言われるかもしれないが、初心者でも使えると謳うのであれば前提環境は記載しておいていただけるとありがたかったですねー。
危うくここでNNCから遠ざかるところでした。
仮装通貨だけではないブロックチェーン技術の可能性をオンラインメディアの記事から 

ビットコインに関する記事もさまざまなメディアによく取り上げられていますが、そのビットコインをささえる技術であるブロックチェーン技術に関する話題も、仮想通貨に限らず結構目にするようになってきました。
自動運転、シェアリングエコノミー、さまざまな分野への適用の可能性がとりあげられている「ブロックチェーン技術」。
ブロックチェーンとは何か、何が革新的でなぜ仮想通貨以外にもさまざまな分野にも適用できる可能性があるのか、ブロックチェーン技術を使った開発を行う環境はどこまで用意されつつあるのかなどWeb上のさまざまなサイトからピックアップして紹介します。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/] (https://www.techcrowd.jp/related/)



#[「なぜビットコインは重要か」 by マーク・アンドリーセン](http://www.makfive.com/why-bitcoin-matters/)

Webの創世記の代表的な起業家、マーク・アンドリーセンがNew York Timesに寄稿した記事を、「ITハッカー」というブログに日本語訳したものを掲載してくれたものです。ビットコイン、ブロックチェーンが何で、どのような可能性があるのかをわかりやすく解説してくれています。

・ビットコインはそもそも最も基本的なレベルで、コンピューターサイエンスにおけるブレイクスルー

・インターネットのような信頼のおけないネットワークにおいて、見知らぬ人とどうやって信頼を築きあげるかという命題に対するはじめての実践的な解決策

・ビットコインは、インターネットのユーザーが、固有のデジタル財産を他の人に転送することを、初めて可能にした。そしてその取引は安心安全で、誰もがそれが行われたことを確認でき、その正当性を誰も疑うことが出来ない。このブレークスルーの重要性は、どれだけ誇張しても言い過ぎることはないだろう。

・ビットコインは、インターネット上に広がる決済サービスで初めて、手数料がゼロ又はほとんどかからないシステム。先進国でさえ、既存の決済システムはだいたい２、３％を取る。

・ビットコイン関連のイノベーションで即座に明らかかつ大きな領域が１つあるとすれば、それは国際送金。手数料がゼロか又はかからないビットコインに変更することで、これら移民者や移民者の家族の生活の質は高まる。実際、世界の貧しい国々の沢山の人に、これ以上に早く、ポジティブな効果を与えられるものを考えるのは難しい。

・さらに魅力的な使い道は、少額決済である。ビットコインはいくらでも小額のお金を任意に設定できる。そしてそれを世界中の誰にでもタダ同然で送れる。

・コンテンツのマネタイズについて考えてみよう。新聞のようなメディアビジネスがコンテンツに課金することに上手くいっていない理由の１つが、全てを課金するか全く課金しないかの選択肢しかなかったことである。ビットコインがあれば、1記事あたりの課金が可能になる。

 

#[野口悠紀雄の「ブロックチェーン」講義](http://shuchi.php.co.jp/the21/detail/3588?)

PHP研究所のオンラインメディア「THE 21 ONLINE」に掲載された野口悠紀雄先生のブロックチェーン講義の第二回目です。

まずは、ビットコインなどの「パブリックブロックチェーン」と、三菱東京UFJ銀行が発表したMUFJコインのような「プライベートブロックチェーン」の違いを解説してくれています。新聞の記事などではあまりふれられない「根本思想」に違いがあるとのこと。

また、ブロックチェーン技術のビジネス分野への応用として重要な分野のひとつとして「シェアリングエコノミー」をとりあげています。不特定多数の人が同じものを共有するシェアリングエコノミーの世界においてインターネット上で「信頼の確立」を実現することができるブロックチェーンの技術はシェアするために必要なセキュリティをローコストで実現することを可能とするとしてスマートロック(電子キー)のスタートアップ企業の例などを紹介しています。

 

#[Coco Framework – Microsoftが提供するエンタープライズ向けブロックチェーンプラットフォーム](http://gaiax-blockchain.com/coco-framework)

ブロックチェーン技術の活用に取り組んでいる株式会社ガイアックスが運営している、Blockchain.bizにおける記事です。

エンタープライズ向けのブロックチェーン推進に取り組んでいるMicrosoftが2017年8月10日、ブロックチェーンアプリケーションの統合的な開発環境を提供するオープンフレームワークを実装するミドルウェア「Coco Framework」を発表したことをしりあげています。

Microsoftは2015年11月9日に、Ethereumのブロックチェーン環境を提供するサービス「Blockchain as a Service（BaaS）」を発表し、クラウドベースのブロックチェーン開発環境に着手して以来、技術開発を進めてきましたが

Coco Frameworkにより、ビットコインを代表とした不特定多数のメンバーが参加するパブリック型ブロックチェーンの他にEthereumのような既存ブロックチェーンのネットワーク上で、コンソーシアム型の企業間でなされる機密性の高い取引も可能となるとのこと。

Coco Frameworkは、マイクロソフト社のクラウドサービスであるMicrosoft Azureのほか、オンプレミスや他社のクラウド上でCoco Frameworkのノードを稼働させることもできるように実装されたミドルウェアとして提供されます。

 

#[多くの賢い人がビットコインを学ばず後悔するというよくある話](https://qiita.com/hshimo/items/caeff8db543d5c871937)

Qiitaに掲載されているブロックチェーンに関するまとめ記事ですが、googleで「ブロックチェーン」
で検索すると一位に表示される、別のQitaの記事と同じ執筆者の記事です。

[わかりやすいブロックチェーン(blockchain)とは何か? の説明] (https://qiita.com/hshimo/items/1881fba8957c2a6e17ca)

O’Reillyから出版されている「Mastering Bitcoin」をとりあげています。ブロックチェーンのネットワークが通貨のネットワークではなく「非中央集権化された信用のネットワーク」であると、またこの本質を理解するのに時間のかかるものであるということを紹介してくれている簡潔なまとめ記事です。
VirtulBoxでSierraを動かす（ISOで起動以外の方法）

# はじめに
Xcode9を動かすために用意したくなったので
5月くらいからハマってて放置してたエラー回避の方法が見つかってました。

ISOでAppleのインストーラーを起動させる方法は、`10.12.4`以降では次の画面で停止してしまって積んでしまってました。
<img width="738" alt="スクリーンショット 2017-09-24 8.18.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/62f5ad0e-7912-70d1-04ea-122a7aaf2f1d.png">

AppleからのインストーラーのダウンロードもSierraからHigh Sierraへの切り替えがあるので
インストーラーがほしい人はこれが最後の機会になるかもしれません。


# vdiを直に作成する

<img width="826" alt="スクリーンショット 2017-09-24 8.25.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/23a1a475-82ce-0bca-3a41-53b202e89362.png">


https://github.com/geerlingguy/macos-virtualbox-vm/issues/24#issuecomment-301333154

## github
https://github.com/jonanh/osx-vm-templates

## 使い方

VDIファイルを作成する場合は

>$ prepare_vdi.sh 

を実行すると使い方が表示されますのでそちらを参考に、root権限を使いますのであとは自己責任で。
個人的には特に問題はない印象ですが、なにか気づいた方がいれば教えてください。

### 作成できるOSのバージョン
vdiを作成する場合は作成するゲストOSのバージョンとホストOSを合わせると必要があるようです。
>Unfortunately prepare_vdi can only generate images of same version as the host

とメッセージが表示されました。

# さいごに

仮想環境での利用はEULAで規定されていますので、そこは踏まえて進めています。
https://images.apple.com/legal/sla/docs/macosx107.pdf
>(iii) to install, use and run up to two (2) additional copies or instances of the Apple Software within
virtual operating system environments on each Mac Computer you own or control that is already
running the Apple Software.
TensorFlowでkeras その11

#概要
TensorFlowでkerasやってみた。
fizzbuzz学習してみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/8edf4f0e-3703-8ff4-89ce-06f3012bf940.png)

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#サンプルコード

```
import numpy as np
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Dense, Activation
from tensorflow.contrib.keras.python.keras.models import Model

def binary_encode(i, num_digits):
	return np.array([i >> d & 1 for d in range(num_digits)])

def fizz_buzz_encode(i):
	if i % 15 == 0:
		return np.array([0, 0, 0, 1])
	elif i % 5  == 0:
		return np.array([0, 0, 1, 0])
	elif i % 3  == 0:
		return np.array([0, 1, 0, 0])
	else:
		return np.array([1, 0, 0, 0])

def fizz_buzz(i, prediction):
	return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]

NUM_DIGITS = 10
trX = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
trY = np.array([fizz_buzz_encode(i) for i in range(101, 2 ** NUM_DIGITS)])

model = Sequential()
model.add(Dense(128, input_dim = 10))
model.add(Activation('tanh'))
model.add(Dense(4, input_dim = 128))
model.add(Activation('softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(trX, trY, epochs = 3600, batch_size = 128)
f = open('fizzbuzz2.json', 'w')
f.write(model.to_json())
model.save('fizzbuzz2.hdf5')
print ("save model")

numbers = np.arange(1, 101)
teX = np.array([binary_encode(i, NUM_DIGITS) for i in range(1, 101)])
teY = np.array([fizz_buzz_encode(i) for i in range(1, 101)])
score = model.evaluate(teX, teY, verbose = 0)
print ('Test loss    : {:>.4f}'.format(score[0]))
print ('Test accuracy: {:>.4f}'.format(score[1]))



```
[Unity] 画面を回転したときに見た目の大きさが変わらないように fov を調整する

## これはなに

Unity の FieldOfView は垂直方向の視野です。
よって、 ScreenOrientation.AutoRotation などに対応する場合、 Landscape にしたとき対象物が小さく見えます。

![no-fix.png](https://qiita-image-store.s3.amazonaws.com/0/21888/4cbbe8b7-d3a7-b637-2c11-78eded816067.png)

iPhone 4 Tall (640x940) / Wide (940x640)

これが、同じ大きさに見えるように、 FieldOfView を調整するスクリプトを書きました。

![fixed.png](https://qiita-image-store.s3.amazonaws.com/0/21888/447b39c9-5b17-2eb0-4c2d-d010e23e8881.png)


## スクリプト

Camera と同じ GameObject に挿してください。

### 毎フレーム更新しちゃう版

```FixFieldOfViewOrientation.cs
using UnityEngine;

[RequireComponent(typeof(Camera)), ExecuteInEditMode]
public class FixFieldOfViewOrientation : MonoBehaviour
{
    [SerializeField, HideInInspector] private Camera _camera;
    [Range(1, 179)] public float fieldOfView;

    private bool IsLandscape => _camera.aspect > 1;

    void Update()
    {
        _camera.fieldOfView = FixedFieldOfView(fieldOfView, _camera.aspect, IsLandscape);
    }

    private static float FixedFieldOfView(float fieldOfView, float aspect, bool isLandscape)
    {
        if (isLandscape) return fieldOfView / aspect;
        return fieldOfView;
    }

    void OnValidate()
    {
        _camera = GetComponent<Camera>();
    }
}

```

- EditMode で動く
- Camera.fieldOfView set でなにをやってるかわからないので、毎フレーム呼んで大丈夫かがほんの少しだけ不安

### Camera.fieldOfView を無駄に更新しない版

```FixFieldOfViewOrientation.cs
using UniRx;
using UnityEngine;

[RequireComponent(typeof(Camera))]
public class FixFieldOfViewOrientation : MonoBehaviour
{
    [SerializeField, HideInInspector] private Camera _camera;
    [Range(1, 179)] public float fieldOfView;

    private bool IsLandscape => _camera.aspect > 1;

    void Start()
    {
        Observable.EveryUpdate()
            .Select(_ => FixedFieldOfView(fieldOfView, _camera.aspect, IsLandscape))
            .DistinctUntilChanged()
            .Subscribe(x => _camera.fieldOfView = x)
            .AddTo(this);
    }

    private static float FixedFieldOfView(float fieldOfView, float aspect, bool isLandscape)
    {
        if (isLandscape) return fieldOfView / aspect;
        return fieldOfView;
    }

    void OnValidate()
    {
        _camera = GetComponent<Camera>();
        _camera.fieldOfView = FixedFieldOfView(fieldOfView, _camera.aspect, IsLandscape);
    }
}
```

- EditMode で画面サイズ変えても反映されない
  - ほしければ、 Rx 使わないで普通に Update で前フレームとの比較書けばいいと思う
- Camera.fieldOfView set を無駄に叩かない

## 補足など

Camera は sealed class なので継承で解決できません。
今回のケースに限っては継承したほうがエレガントに解決できそうな気もしましたが、いずれにせよ、です。
外部のスクリプトから変更する場合など、こちらのコンポネントを経由するように注意する必要があります。
Camera.fieldOfView を自分が更新したのか、外部から更新されたのかをがんばって判別してゴニョゴニョするほどではないかなと思ってやっていません。

そもそも Camera.fieldOfView set に関しては、一応気にしてみましたが、恐らく問題ないと思うので、基本的には上を使うで良いと思います。たぶん。

ちなみに uGUI は、 Canvas Scaler を用いて類似の問題を解決できます。
[Unity - マニュアル: 複数の解像度のための UI 設計](https://docs.unity3d.com/jp/540/Manual/HOWTO-UIMultiResolution.html)

それでは、レッツ複数解像度対応!!
JavaScriptで非同期関数を順々に実行

個数が分かってて順々に実行するなら、

```ts
async function fn(): Promise<void> {
  await a();
  await b();
  await c();
  return;
}
```

とにかく並行に実行なら、

```ts
await Promise.all([a, b, c].map(fn => fn());
```

個数が分からなくて順々に実行するなら？ » `for..of`とかで回せば良さげ。

```ts
async function fn(): Promise<void> {
  for (const fn of [a, b, c]) {
    await fn();
  }
}
```

## 例

```ts
function genNumber() {
  return Math.floor(Math.random() * 10);
}

function sleep(): Promise<{}> {
  return new Promise(resolve => {
    setTimeout(resolve, 1000);
  });
}

function log(text: string): () => Promise<void> {
  return async () => {
    await sleep();
    console.log(text);
  }
}

const fns = Array<string>(genNumber())
  .fill('')
  .map(() => log(String(genNumber())));

(async () => {
  for (const fn of fns) {
    await fn();
  }
})();

```

> ```bash
# 4
# 1
# 2
# 9
# 3
# 2
# 1
# 3
```

---

» ちょっと悩んだ。
mysql_secure_installationのインタラクティブな入力が自動化の妨げになる

掲題の通り。

最初は`expect`してたのですが「minimalで入らないパッケージに依存して何が自動化だ」と。
考え直して`/usr/bin/mysql_secure_installation`の中身を読みました。

結果。
してることは至極単純で以下SQLを発行してるだけでした。

```SQL
UPDATE mysql.user SET Password=PASSWORD('********') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
FLUSH PRIVILEGES;
```

`grep do_query /usr/bin/mysql_secure_installation`すれば抽出できます。


以上より、`expect`はやめてこんな感じにしました。

```bash
# ランダムパスワード生成
vMariadbRootPasswd="$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 16 | tee -a ~/.mysql.secrets)"

# mysql_secure_installation
mysql -u root --password= -e "
    UPDATE mysql.user SET Password=PASSWORD('${vMariadbRootPasswd}') WHERE User='root';
    DELETE FROM mysql.user WHERE User='';
    DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
    DROP DATABASE test;
    DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
    FLUSH PRIVILEGES;"
```

以下の500,000,000倍いいですね。

```bash
expect -c '
    set timeout 10;
    spawn mysql_secure_installation;
    expect "Enter current password for root (enter for none):";
    send "\n";
    expect "Set root password?";
    send "y\n";
    expect "New password:";
    send "'"${vMariadbRootPasswd}"'\n";
    expect "Re-enter new password:";
    send "'"${vMariadbRootPasswd}"'\n";
    expect "Remove anonymous users?";
    send "y\n";
    expect "Disallow root login remotely?";
    send "y\n";
    expect "Remove test database and access to it?";
    send "y\n";
    expect "Reload privilege tables now?";
    send "y\n";
    interact;'
```

おわり。
slimvでroswellを使う設定

roswellを使いはじめて、`ros run`で走る環境とslimvのreplの環境が違うのが気になったのでslimvのreplをroswellのものにしたいと思った。
\> ググって出てきた記事を真似するも微妙に上手くいかない（なんで）
\>\> 色々試す
\>\>\> 上手くいったので共有.
# ソース
vimrcに以下を追加しました。

```vim:.vimrc
let g:slimv_swank_cmd = "!ros -e '(ql:quickload :swank) (swank:create-server)' wait > /dev/null 2> /dev/null &"
let g:slimv_lisp = 'ros run'
let g:slimv_impl = 'sbcl'
```
SwiftでJSON文字列の比較がしたい

SwiftでJSON文字列の比較がしたくなって、試行錯誤したのでそのメモです。

# JSON文字列比較をユニットテストに利用したい

例えばこんなケース。

**API通信処理のHttpリクエストボディのJSONが正しく生成できているかチェックしたい**

例)この2つのJSONが一致するかユニットテストを書きたい

 - プログラムで生成したJSON `{"id": "001", ""query": "hoge", "keyword": "cat"}`
 - 期待するリクエストJSON `{"id": "001","query": "hoge", "keyword": "dog"}`

※上記のJSONの場合、keywordキーの部分が異なっていることをテストで検出したい

# JSON文字列を比較する際に考慮が必要なこと
SwiftのString型はEquatableプロトコルに準拠しているため、==演算子で比較できますが、JSONの文字列を単純に1文字ずつ比較しても今回の要件は満たせません。

JSON文字列の形式が一致しているか厳密に比較したいのでなく、以下のように形式は違えど、JSONデータの中身が同じであれば等しいものと考えたいからです。

 - Minified形式（改行やホワイトスペースを削除し、ファイルサイズを圧縮した形式）
 - キーの記載順序が異なる
 - インデント数やスペースの挿入箇所が異なる（表示形式のゆらぎ）

# SwiftyJSONで比較できないか
JSONのパース処理にはSwiftyJSONというJSONを扱いやすくするライブラリをよく利用しています。

SwiftyJSON
https://github.com/SwiftyJSON/SwiftyJSON

ドキュメントを読んだり、compareやEquatable等でリポジトリを検索しても欲しいものはないようでした。また、JSON構造体を==で比較することはできますが、上記の要件は満たせませんでした。

# JSON文字列を比較するメソッドを実装して見る
JSON文字列を比較するメソッドを実装してみます。
（命名や、DictionaryのExtension実装などはあまり深く検討していません）
JSON文字列をDictionaryに変換するため、SwiftyJSONを利用しています。

```swift:JSON文字列を比較するメソッド
func isEqualJson(_ jsonString1: String, _ jsonString2: String) -> Bool {
    // Jsonの形式差異（Minifiedかどうか、キー順序）をなくすため、Dictionaryに変換する
    guard let dict1 = JSON(parseJSON: jsonString1).dictionaryObject,
        let dict2 = JSON(parseJSON: jsonString2).dictionaryObject else {
            return false
    }
    
    // isEqual(to:)メソッドを利用するため、NSDictionaryに変換する
    return NSDictionary(dictionary: dict1).isEqual(to: dict2)
}
```

ポイントとしてはまず、Jsonの形式差異（Minifiedかどうか、キー順序）をなくすために、Dictionaryに変換している点です。


また、Dictionaryは比較できないため、`NSDictionary(dictionary:)`イニシャライザでNSDictionaryに変換し、NSDictionaryの`isEqual(to:)`メソッドで比較しています。

```swift:Dictionaryを比較しようとした場合
let dict1: [AnyHashable: Any] = ["String": "hoge", "Int": 1, "Bool": true]
let dict2: [AnyHashable: Any] = ["String": "hoge", "Int": 1, "Bool": false]

// ==演算子が利用できないためコンパイルエラー
// error: binary operator '==' cannot be applied to two '[AnyHashable : Any]' operands
print(dict1 == dict2)
```

NSDictionaryの`isEqual(to:)`メソッドは、辞書内にNSObjectを継承したクラスや独自のクラスオブジェクトが含まれていた場合、同じインスタンスでなければfalseを返します。

```swift:NSObjectを継承したクラスや独自のクラスオブジェクトの比較はできない
class SomeObject {
    let hoge: Int
    init(hoge: Int) {
        self.hoge = hoge
    }
}

let object1 = SomeObject(hoge: 1)
let object2 = SomeObject(hoge: 1)
let dict1: [AnyHashable: Any?] = ["Object": object1]
let dict2: [AnyHashable: Any?] = ["Object": object2]

// false（クラスの値は同じだが、別インスタンスなのでfalseとなる）
print(NSDictionary(dictionary: dict1).isEqual(to: dict2))
```

しかしJSONに含まれる**文字列型、数値型、Bool型、null**は
同じインスタンスでなくても比較が可能なため、今回の要件を満たします。
（ネストした辞書型、配列型となっていても同様に比較可能）
※JSON定義→http://www.json.org/

```swift
let dict1: [AnyHashable: Any?] = ["String": "hoge", "Number": 1, "Bool": true, "Null": nil]
let dict2: [AnyHashable: Any?] = ["String": "hoge", "Number": 1, "Bool": true, "Null": nil]

// true
print(NSDictionary(dictionary: dict1).isEqual(to: dict2))
```

NSプレフィックスのついた型はObjective-C時代の遺産なのであまり使いたくないのが正直なところですが、簡潔に実装するのであれば、上記の方法で問題なさそうです。その他何かもっと良い方法があれば、コメントなどで教えていただけるとうれしいです。
docker serviceのリバランス(再配置)の仕方

# やり方
`docker service update --detach=false --force foo_service` という感じに__アップデートするパラメータは何も指定せず `--force` だけを付けて `docker sercice update` すれば良い__らしい。
すべてのサービスでリバランスしたければ↓こんな感じか（`--detach`は本質的には関係ないが纏めて実行する時はfalseにしておけば待たずに済む）。

```bash
for s in $(docker service ls -q); do
  docker service update --detach=false --force "$s"
done
```

# 利用シーン
例えば２ノードに対してレプリカ数６で `docker service create --replicas=6 foo_service` のような感じにサービスを作成した場合、各ノードには３つずつのタスクが作成される。
ここで新たなノードが `docker swarm join` で追加されて３ノードになった時はタスク数が各ノードに２つずつになるよう、既存ノードからは１個ずつ停止して新ノードでは２つ起動する、ということをやってほしいが自動的にはこれは行われない。つまり何もしなければ親ノードにはいつまでたっても何のタスクも起動せず旧ノードもずっと３タスクずつ起動しっぱなしということになる。
もちろん既存ノードがサーバ再起動などしてタスク実行が出来なくなったりすれば数を保つために新ノードの方にもタスクが起動し始めてくれるが、この挙動はサーバリソースを公平に使ってほしい場合は嬉しくない。
タスクを各ノードにリバランスする為のコマンドが無いかと思ってひと通り見てみたが、どうやらサブコマンド名やオプション名からそれらしいものは無いっぽいと分かる。が、ググったら [#24103](https://github.com/moby/moby/issues/24103) のIssueに答えが書いてあって、試したら期待通りに動作してくれたのでここにメモを残す。
PythonでNelder-Mead法

## PythonでNelder-Mead法

名前の通り。だが実際は

- Qiitaを使ってみたかった
- GitHubを使ってみたかった
- 他人のコードを見て勉強したかった

などの背景があるので結構雑。

- Nelder-Mead法について

最初は改訂シンプレックス法だとか滑降シンプレックス法だとか呼ばれていた（原著論文にも書いてあるし…）が、[wiki](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%AB%E3%83%80%E3%83%BC%E2%80%93%E3%83%9F%E3%83%BC%E3%83%89%E6%B3%95)にも書かれているとおり、基本的にはシンプレックスとは無関係。
論文：　Nelder, John A.; R. Mead (1965). “A simplex method for function minimization”. Computer Journal 7: 308–313

詳しいことは（英語だが）[こちら](https://codesachin.wordpress.com/2016/01/16/nelder-mead-optimization/)に分かりやすくまとめてある。
ざっくり言うと、n次元の最適化したい関数にn+1次元の点の単体（simplex）をコロコロと変形させて最小値を探し出す。というもの。

例えば二次元空間を探索するならば、三角形を形成して探索をする。
参考サイトでは分かりやすく動画でその例を説明しているのでそこだけ見ても何となく分かる。


実はScipyに標準機能としてあったりもする
https://docs.scipy.org/doc/scipy/reference/optimize.minimize-neldermead.html
が、検索をしていてPythonで実際に書いている人を見つけたので、ついでに他人のコードを見てPythonの勉強をする。

探索する様子を可視化出来たら面白いなと思ってちょっとだけコードを改変させてもらった。
Jupyter notebookで書いたものを貼り付けた程度なので動かなかったらごめんなさい。

https://github.com/ftamon/nelder_mead_method.git
![nelder_mead_method_animation.gif](https://qiita-image-store.s3.amazonaws.com/0/203812/269ded4b-4c31-46aa-3496-1d6587c54ed1.gif)

以上。
CentOS/RedhatでCDやDVDをyumのリポジトリに設定する方法

CD/DVDをドライブにセットしてから、以下のスクリプトをrootで実行します。

```yum_media_setup.sh
#!/bin/sh

if [ ! -d /media/cdrom ]
then
  mkdir /media/cdrom
  if [ $? -ne 0 ]
  then
    echo "Couldn't create /media/cdrom ($?)".
    exit 1
  fi
fi


mountpoint -q /media/cdrom
if [ $? -ne 0 ]
then
  mount -r /dev/cdrom /media/cdrom
  if [ $? -ne 0 ]
  then
    echo "Couldn't mount /dev/cdrom ($?)."
    exit 2
  fi
fi


if [ ! -f /etc/yum.repos.d/Media-User.repo ]
then
  touch /etc/yum.repos.d/Media-User.repo
  chmod 0644 /etc/yum.repos.d/Media-User.repo
  chown root:root /etc/yum.repos.d/Media-User.repo

  echo "[c-media]">>/etc/yum.repos.d/Media-User.repo
  echo "name=Linux-\$releasever - Media">>/etc/yum.repos.d/Media-User.repo
  echo "baseurl=file:///media/cdrom/">>/etc/yum.repos.d/Media-User.repo
  echo "gpgcheck=1">>/etc/yum.repos.d/Media-User.repo
  echo "enabled=0">>/etc/yum.repos.d/Media-User.repo

  if [ -f /etc/centos-release ]
  then
    RELEASE_VER=`cat /etc/redhat-release | awk '{print $4}' | awk -F. '{print $1}'`
    echo "gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$RELEASE_VER">>/etc/yum.repos.d/Media-User.repo
  else
    echo "gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release">>/etc/yum.repos.d/Media-User.repo
  fi
fi

yum clean all

exit 0

```

実際に使用するときの例は以下の通りです。（例：sambaをインストールする場合）

```
yum --disablerepo=¥* --enablerepo=c-media install samba
```

CentOSにはCentOS-Media.repo等のメディア用のyumファイルがもともと存在しますが、
バージョン(6と7)で名前が違ったり、Redhatと共通化したかったりするため、自前でrepoファイルを作っています。
Buttonに設定したClickイベントのコールバック関数内で呼び出し元のButtonの情報を得る

#環境
Unity2017.1.1p3

#概要
インスペクター上でClick用のコールバック関数を設定した場合を想定しています
実際にButtonをClickした時に、何らかの処理中で一時押せないようにしたい場合等に、Button自体の参照が必要ですが、コールバック関数には渡ってきません
「EventSystem.current.currentSelectedGameObject」というのがありました
知りませんでした

#プログラム

~~~c#
	public void OnButtonClick()
	{
		var button = EventSystem.current.currentSelectedGameObject.GetComponent<Button>();
		Debug.Log( "OnButtonClick:" + button.name );
	}
~~~
【VMware vSphere】VMのOSインストール中にVMware ToolsをマウントしたらOSの起動ができなくなった

マシン起動後に

```
An operating system wasn't found. 
Try disconnecting any drives that don't contain an operating system. 
Press Ctrl +Alt +Del to restart 
```

って怒られてOS起動できなかったらBIOSでBootドライブの順番変えなよって話。実はVMwareあんまり関係ないかも。

## 環境
業務関連のため詳細な環境は書けないので悪しからず。

・VMware vSphere Web Client
・ISOイメージファイルからWindows Server 2012をインスコしたかった 

## 事故内容
1. `CD/DVD drive 1`を`Datastore ISO File`にしてISOイメージを設定
2. VMをパワーオンにしてWindowsを普通にインストール開始
3. インストール中ヒマだからvSphere管理画面で遊ぶ
4. `Summary`にある `VMware Tools is not install on this virtual machine`に釣られて`Install VMware Tools`をクリック

5. アラート出現： `Click Cancel if the guest OS is not running. The guest OS of the virtual machine must be running to install VMware Tools.`
 
6. runningどころかinstalling nowだったが無視してMount
7. なんかエラー出てインストール失敗（エラー内容ちゃんと見てなかった）
8. VM再起動
9. 

```
An operating system wasn't found. 
Try disconnecting any drives that don't contain an operating system. 
Press Ctrl +Alt +Del to restart 
```

＼(^o^)／

### 試行錯誤
ドライブを外せってことなのでイメージファイルを何度も何度も何度も何度も何度も抜き差ししたけど`An operating system wasn't found.`は変わらず。。 
VMware Toolsのマウントを解除するために設定周り色々見てみるけどそれっぽい部分は見つからず。。。


## 解決策
BIOSでドライブの起動順序を変えればOKだった。
ちなみにブラウザ上のVMの画面でF2を必死に押してもBIOSは起動しない。
1. VMのパワーをオフ
2. `Summary`から`Edit Setting`開いて、`VM Option` > `Boot Options` > `Force BIOS Setup` にチェック。これで起動時にBIOSが立ち上がる。
3. VMのパワーオン
4. BIOSが起動するのでBootタブでCD-ROM Driveを一番上に
5. 再起動
6. 復活！！


## まとめ
以上、初心者がvSphereでアホなことして事故った話でした。
レアケースすぎて需要なさそうだけど戒めとしてメモっとく。
まぁvSphere関係なしに OS起動しない！→BIOSでドライブの起動順序変更して解決！ はよくある話かも。というか学生時代にリアルマシンで一回やったような記憶がある。
Docker-for-WinのDocker-composeでエラーが出る件

### 問題
別環境にDockerとnodejsなどの環境を構築しようと思ったら
いきなりその前段階でエラーが出たのでメモ

Docker-for-Winをお試しでインストールし、Composeで連携させてーと考えていたところ
Docker-Composeがいきなりエラーを吐いたので対応のメモ

インストールは割愛

```
PS C:\dev\docker> docker-compose
Traceback (most recent call last):
  File "docker-compose", line 3, in <module>
  File "compose\cli\main.py", line 67, in main
  File "compose\cli\main.py", line 97, in dispatch
  File "compose\cli\utils.py", line 85, in get_version_info
  File "compose\cli\utils.py", line 106, in get_build_version
  File "ntpath.py", line 85, in join
UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 7: ordinal not in range(128)
Failed to execute script docker-compose
```

### いろいろ試す

+ バイナリをおとしてきてみたり…
https://github.com/docker/compose/releases

### 原因
Microsoftアカウントで作られてしまった日本語ユーザー名で実行すると
作業フォルダがドライブ直下でもエラーになる模様…
PythonとWindowsだとよくあるエラーのようですが…

バイナリでなくスクリプトのままならば回避方法ありそうだけれど…
取り敢えず同じエラーが出た方ように上げておきます
（今の所ユーザー作り直せ！っていう使えない情報ですが…
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第四章 ドメインを隔離する5

# 他の選択肢 ヘキサゴナルアーキテクチャ

[前回](https://qiita.com/YasuhiroKimesawa/items/367d0ab40433cfe2d57a)はレイヤーアーキテクチャをDIを使用して完全にモデルを他の層から分離することを学びました。

レイヤーとは他の考え方として、層ではなく、外部（ビューやデータベース・アクセス)と内部（モデル）があるだけという考え方があるそうです。

AlistairCokburnの**ヘキサゴナルアーキテクチャ**がその考え方の１つです。

![ヘキサゴナル (1).png](https://qiita-image-store.s3.amazonaws.com/0/150455/af0e4514-bc7e-3c3c-90fa-4e27203bae8b.png)

ビューやデータベースアクセスなどそれぞれがそれぞれのアダプタを持っていて、各アダプタがアプリケーションの内部に合わせた形式に変換します。

六角形の各辺がポートを表して、入力、または出力に対応しています。
各辺のポートの定義は厳密ではなく、ある一辺は永続化を担当、ある一辺はビューからの入力を担当、またある一辺はメッセージングによる通知を担当などなど。。。

このヘキサゴナルアーキテクチャは最近できた概念ではなく、2004年の[PoEAA](www.amazon.co.jp/dp/B01B5MX2O2)本に記載されていましたし、2002年ごろには既にWikiにて紹介されていたそうです。([ヘキソゴナルアーキテクチャの日本語訳](http://blog.tai2.net/hexagonal_architexture.html)より)

PoEAAでの紹介では、ヘキソゴナルアーキテクチャを採用する動機として、
> レイヤアーキテクチャでは、ユーザーを中心に考えてきたが、実際は他にバッチ処理だったり、Webサービスなど人間を介在しないこともあります。そう見ると、プレゼンテーションレイヤとデータソースレイヤ(インフラストラクチャ)には外部との接続に関するレイヤとして多くの類似点があるようにみえます。

と挙げています。

特に、現在では、非同期メッセージングやRestなど、外部と接触する技術が増えてますので、この考え方は理にかなっているように見えます。

## 実装
ポートなりアダプタなり実装の仕方はどうするの？という疑問が湧くと思いますが、多分[前回](https://qiita.com/YasuhiroKimesawa/items/367d0ab40433cfe2d57a)とそんなに変わらないです。

アダプタはMVCのコントローラなり、インフラストラクチャのRepository実装だったりでOKだと思います。ポートはビューならSpringなどのフレームワークの仕組みをそのまま利用できるし、DBとの接続用のもMybatisなどの仕組みを使えます。

## ファウラーの考え方
ヘキソゴナルアーキテクチャは対称性があるアーキテクチャで、レイヤアーキテクチャは非対称のアーキテクチャと考えられます。

> しかし、私はこの非対称性こそ有用だと思っています。他へのサービスとして提供するインターフェイスと、他のサービスを利用することの間には、歴然とした違いがあるからだ。・・・プレゼンテーションは、他者に対してシステムが提供するサービスの外部インターフェースである。・・・データソースは、サービスを提供するものへのインターフェースである。クライアントが異なるとサービスの考え方が変わるので、これらを分けて考えることは有用であると私は考える。([PoEAA](www.amazon.co.jp/dp/B01B5MX2O2)第一部レイヤ化 より)

自分もどちらかと言えば、この考え方に賛成です。とは言え、外部との接続技術は増えて整理することが困難になりつつあります。もう少しアーキテクチャについて考えていきたいと思います。

ただ、**どんなアーキテクチャもモデルを分離すること**が一番大事です。
Ionic2 - Local Notification設定に必要なプラグインを追加時、そもそものCordovaのプラグイン導入が失敗する問題への対応

# 前提
## 環境情報
OS: OS X El Capitan
node: v6.10.2 (npm v3.10.10)

# 問題
## 内容
Ionicでローカル通知を実装する場合に必要なプラグインをインストールする方法は、公式ドキュメントのでは以下の記述となっているが、 `ionic cordova plugin add` が動作してくれず `cordova is not a valid task` とプラグインのインストールが始まらない、

```
$ ionic cordova plugin add de.appplant.cordova.plugin.local-notification
$ npm install --save @ionic-native/local-notifications
```
参考:
https://ionicframework.com/docs/native/local-notifications/

## 対応
下記コマンドを実行することで解決。
→ `ionic` を絡めず `cordova` 単体でプラグインをインストールするように変更。

実行コマンド:
`cordova plugin add de.appplant.cordova.plugin.local-notification --save`

## 備考
対応の内容は調査をしていたところ下記質問を発見。
 `cordova` 単体でプラグインをインストールする記述があり、もしやと思い実行したところ問題なく終了したため採用。
https://github.com/katzer/cordova-plugin-local-notifications/issues/1345
Cordovaアプリ作るからメモメモ

# またAndroidアプリ作る
## 環境
Cordovaは使える
前の手順を忘れた
## 手順
1. プロジェクトファイルを作る<br>
`cordova create cordovaSample com.example.hello CordovaSample`
2. プロジェクトディレクトリ内に移動<br>
`cd cordovaSample`
3. 環境追加<br>
`cordova platform add android@6.2.3 browser`
4. エミュレーター起動<br>
`ordova emulate browser`

基本はこれでOKかな
for文内での関数定義

for文内で関数定義し、定義した関数を実行した時の挙動で困ったのでメモ

#for文内で関数定義
for文内で関数を定義して、それをfor文の外で呼び出して実行しようとしました。

```js:sample1.js
var functions = []
for (var i = 0; i < 3; i++) {
    functions.push(function(){
        console.log(i);
    });
}
functions[0]();
functions[1]();
functions[2]();
```

0,1,2と表示されることを期待していましたが結果は以下のように。

```
3
3
3
```

あれ？と思ったのですが、少し考えるとループを回している変数iは定義したfunctionの外のスコープにあることに気がつきました。

#即時関数でスコープを作る
0,1,2と表示させるために、定義したfunctionでスコープを作りスコープ内で定義した変数を参照させるようにします。そこで即時関数を用います。即時関数は今あるスコープとは別に新たなスコープを作成するので、即時関数を使用して以下のように書き換えました。

```js:sample2.js
var functions = [];
for (var i = 0; i < 3; i++) {
    //即時関数
    (function () {
        var x = i;
        functions.push(function () {
            console.log(x);
        });
    })();
}
functions[0]();
functions[1]();
functions[2]();
```

すると期待通りの結果に。

```
0
1
2
```

即時関数は、定義＋実行の目的以外に、今回の場合やスコープ汚染を防ぐために利用するそうです。

#letを使う
ES6で追加された宣言letを使ってfor文を回します。letによってfor文のブロックでスコープを構築します。

```js:sample3.js
var functions = [];
for (let i = 0; i < 3; i++) {
    functions.push(function(){
        console.log(i);
    });
}
functions[0]();
functions[1]();
functions[2]();
```
すると期待通りに。

```
0
1
2
```
Googleカレンダーの予定をGASでスプレッドシートに取り込む

#ゴール
実現したいのは、
![Screen Shot 2017-09-23 at 23.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/160676/d3c00fd3-a07b-96dc-3829-82d9e0d995c6.png)
こんな感じの予定(架空)を取り込んで、

![Screen Shot 2017-09-23 at 23.59.15.png](https://qiita-image-store.s3.amazonaws.com/0/160676/ef198a9c-17a4-388e-2995-7d55e1ffe5d8.png)
こんな感じに表示することです。
#やり方
カレンダーのIDが分かれば非常に簡単に取り込む事ができます。
カレンダーのID?となる方はGoogleで検索すればいろんなサイトで教えてくれているのでご参照ください。

```calendar.gs
//関数名は適当に
function obtainCalendarData() {
  //IDを指定してカレンダーを取得
  var calendar = CalendarApp.getCalendarById('ここにカレンダーのIDを指定する');
  
  //対象の日付を範囲指定(今回は対象となる1週間分を指定)して予定を取得
  var events = calendar.getEvents(new Date('2017/10/01'), new Date('2017/10/07'));
  
  //アクティブなシートを取得
  var sheet = SpreadsheetApp.getActiveSheet();
  
  //各行のタイトルを指定
  sheet.getRange('A'+(1)).setValue('イベント名')
  sheet.getRange('B'+(1)).setValue('開始時刻')
  sheet.getRange('C'+(1)).setValue('終了時刻')
  sheet.getRange('D'+(1)).setValue('所要時間')
 
  //繰り返す回数は予定の個数分(列を指定するためにforEachは使わない)
  for (var i=0; i < events.length; i++) {
    var title = events[i].getTitle();
    var startTime = events[i].getStartTime()     
    var endTime = events[i].getEndTime()
    //単位の変換も同時に
    var duration = (endTime - startTime) / (1000 * 60 * 60)
    
    //iが0から始まることとタイトル分を考慮して +2している
    sheet.getRange('A'+(i+2)).setValue(title);
    sheet.getRange('B'+(i+2)).setValue(startTime);
    sheet.getRange('C'+(i+2)).setValue(endTime);
    sheet.getRange('D'+(i+2)).setValue(duration + 'h');
  }
}
```
各コードの動きはコメントに書いた通りです。
実行すればスプレッドシートに上記の通りに出力されます。
初めて実行する際には下のようなポップアップが出ますが、個人の範囲であれば気にせず許可してあげましょう。

![Screen Shot 2017-09-23 at 23.54.18.png](https://qiita-image-store.s3.amazonaws.com/0/160676/bcaea636-4232-6ca5-4004-c132c8659d58.png)
※ポップアップ内の「10月予定管理」はGASのプロジェクト名です。

#まとめ
自分でもまだほとんど使いこなせていないGASですが、非常に簡単に扱える事がわかりました。
今回はただカレンダーの予定を取得しただけですが、内容を工夫すればかなり応用ができそうです。
gphoto2を使ってラズパイからカメラ制御する(2) (設定考察編)



[その1](https://qiita.com/clses/items/9e65d630a3e4f3959ffe)にて、一眼カメラで朝日タイムラプス自動設定の構想を書いた。

設定を時間に合わせて逐次変更する必要がある訳だが、実際どのくらいの設定の幅があるのか調べてみた。
カメラをやっている割に、EV値という単語をこの調査で知ったわけだが、↓のサイトがとてもわかり易く、早見表が大変参考になった。
http://photo.nyanta.jp/EV.html

最適なAV値(F値:絞り)、TV値(SS:シャッタースピード)、ISO値(感度)を、その状況でのEV値(明るさ)に合わせる必要がある。
**EV値 = AV値 + TV値 +　ISO値** という感じらしい。(換算表などはリンク参照のこと)

上記サイトでは、おおよそ薄明かりがEV値が0、晴天がEV値15という幅となっている。
随分な幅だ。
というわけで、ちょっとEV0→15までの設定を仮に入れてみた。

|EV値| AV値(F) |TV値(SS) |  ISO  
|----|--------|---------|-------
|  0 | 5 (5.6)|-2   ("4)|-3 (800)
|  1 | 5 (5.6)|-1   ("2)|-3 (800)
|  2 | 5 (5.6)| 0   ("1)|-3 (800)
|  3 | 5 (5.6)| 1    (2)|-3 (800)
|  4 | 5 (5.6)| 2    (4)|-3 (800)
|  5 | 5 (5.6)| 3    (8)|-3 (800)
|  6 | 5 (5.6)| 4   (15)|-3 (800)
|  7 | 5 (5.6)| 4   (15)|-2 (400)
|  8 | 5 (5.6)| 4   (15)|-1 (200)
|  9 | 5 (5.6)| 4   (15)| 0 (100)
| 10 | 5 (5.6)| 5   (30)| 0 (100)
| 11 | 5 (5.6)| 6   (60)| 0 (100)
| 12 | 5 (5.6)| 7  (125)| 0 (100)
| 13 | 5 (5.6)| 8  (250)| 0 (100)
| 14 | 5 (5.6)| 9  (500)| 0 (100)
| 15 | 5 (5.6)|10 (1000)| 0 (100)

全然熟考したものではないけれど、とりあえず

- 最初はシャッタースピードを早くすることを優先。
- 絞りはピントに影響する可能性があるので動かさない
- シャッタースピードが1/10を超えてまぁまぁ早くなった段階でISOを戻す。

という感じで上記表となった。

そして、書いている最中で思い出したが、
これはあくまでそのEV値の時の推奨な設定ということなので、
これだと **暗いところも明るくしてしまう** じゃないか。
オートモードでの勝手に行われる設定をわざわざやる必要はない。
やりたいのは、 **暗いときには暗く、明るいときには明るく撮る** ことだ。

明るくなった状態で白飛びすると目立つので、明るいときの設定は適切にし、
暗いときに暗くなるように設定を調整すればいいのか。

というわけで以下に書き直し。

|環境EV値| AV値(F) |TV値(SS) |  ISO値 | 設定EV値 |
|----|--------|---------|-------|----|
|  0 | 5 (5.6)| 4   (15)|-1 (200)|8
|  1 | 5 (5.6)| 4   (15)|-1 (200)|8
|  2 | 5 (5.6)| 4   (15)| 0 (100)|9
|  3 | 5 (5.6)| 4   (15)| 0 (100)|9
|  4 | 5 (5.6)| 5   (30)| 0 (100)|10
|  5 | 5 (5.6)| 5   (30)| 0 (100)|10
|  6 | 5 (5.6)| 6   (60)| 0 (100)|11
|  7 | 5 (5.6)| 6   (60)| 0 (100)|11
|  8 | 5 (5.6)| 7  (125)| 0 (100)|12
|  9 | 5 (5.6)| 7  (125)| 0 (100)|12
| 10 | 5 (5.6)| 8  (250)| 0 (100)|13
| 11 | 5 (5.6)| 8  (250)| 0 (100)|13
| 12 | 5 (5.6)| 9  (500)| 0 (100)|14
| 13 | 5 (5.6)| 9  (500)| 0 (100)|14
| 14 | 5 (5.6)|10 (1000)| 0 (100)|15
| 15 | 5 (5.6)|10 (1000)| 0 (100)|15

周囲の実際のEV値は`環境EV値`、設定上での相当EV値を`設定EV値`と仮称する。
最初の時点では、環境EV値が0なのに、設定EV値は8を選んでいる。
(環境EV値が8だったら適切な明るさで撮れる設定を使用しているということ)

つまり最初は8段分暗く撮られることになる。
**・・・8段って暗すぎのような気が・・・**

まぁ実際に検証しながら微調整していくということで。とりあえず机上での構想まで。
Threadripperを買ったのでESXiでGPUパススルーしよう

# Ryzen ThreadripperでESXiを構築する
Ryzen Threadripperが出てスレッド数の暴力・メモリ大容量でせっかくなのでESXiを構築し、GPUパススルーで普段のパワー用メインマシンとTV録画用のマシンを別々に立てようかと思いました。

**2017/09/28時点**
GPUパススルーできました。
GTX1080とRadeion6450のどちらもできました。

# 揃えたパーツ
- CPU：AMD Ryzen Threadripper 1920X
- マザボ：MSI X399 GAMING PRO CARBON AC (BIOS:7B09v15)
- メモリ：Crucial DDR4-PC4-19200 16GB×４枚（64GB）
- PCI：EVGA 1080 GTX （メインVGA）
- PCI：玄人志向　Radeon HD 6450（ESXi用VGA）
- PCI：Intel Ethernet Server Adapter I210-T1
- PCI：AREA SD-PE4U3-3E1L
- PCI：PLEX PX-W3PE4
- 電源：CORSAIR RM750x
- ESXi：ESXi 6.5u1
- 仮想マシン1：Windows 7   Pro（メイン）

## BIOSの設定
マザーボードが8/10時点ではSVMやIOMMUの項目が見当たらなかったので
7B09v15に上げる。
IOMMUとSVMを有効にする。
![BIOS設定CPUのSVMとIOMMU.png](https://qiita-image-store.s3.amazonaws.com/0/127591/1d44332b-1589-8c0b-a032-a70a283252d6.png)

# ESXiのインストールディスクを作る
高いRAIDカードを購入する気にはなれなかったので、
SATAで接続できるようにESXiのドライバーに追加するのでESXiカスタムする。

## 必要なもの
 - Powershell 4.0
 - VMware PowerCLI
 - ESXi-Customizer-PS

## 追加ドライバー
xachiのドライバーのみ追加

## 若干嵌った部分
ESXi-Customizer-PSのパワーシェルについている署名の有効期限が切れているので
ISOを作成できない・・・なのでパワーシェルの署名部分を削る。
（セキュリティ的にはどうなんだこれ・・・というか署名部分更新できないのか・・・）

# ESXiインストール
サーバー用NICアダプタを購入してましたが、
特に問題なくマザーボード側のアダプタも認識しインストール完了


## ESXi設定
1.GPUをパススルー設定するため、[ホスト]-[管理]から[ハードウェア]-[PCIデバイス]でGPUをパススルー設定
![2017-09-23_234024.png](https://qiita-image-store.s3.amazonaws.com/0/127591/ea609be9-781f-0ded-51f6-08166a033e81.png)

2'.ESXiの「/etc/vmware/passthru.map」を編集
ESXiのSSHサービスを有効化し、SSHで接続し、下記文言を追加。
（ベンダーIDとハードウェアIDと電源管理と共有化？の設定）
```bash:
10de  1b80  d3d0     false
10de  10f0  d3d0     false
```
![2017-09-28_210529.png](https://qiita-image-store.s3.amazonaws.com/0/127591/7e358a35-8fbd-2e7f-827f-7b29eee5f136.png)



## 仮想マシンの設定
1.起動方法をEFIに設定
![2017-09-24_000141.png](https://qiita-image-store.s3.amazonaws.com/0/127591/1e0b2c57-9466-c84f-faa6-48ae4c1d46e7.png)

2.CPUのCPU/MMU仮想化を[ハードウェアのCPUおよびMMU]に設定
![2017-09-24_000444.png](https://qiita-image-store.s3.amazonaws.com/0/127591/fa4c6ce7-0353-6b15-cf39-dcb816138920.png)

3.Windowsのインストール
インストール後シャットダウンしてGPU設定を行う。

## GPU設定
1.[設定の編集]-[仮想マシンオプション]-[詳細]-[構成の編集]で下記良く見かけるパラメータを追加
hypervisor.cpuid.v0="FALSE"
![2017-09-24_000520.png](https://qiita-image-store.s3.amazonaws.com/0/127591/032f41bd-1afa-6d56-b658-e230ce2780b1.png)

1'.今回の認識させるのに[設定の編集]-[仮想マシンオプション]-[詳細]-[構成の編集]で更にパラメータを追加
```ESXi
vhv.enable = "TRUE"
hypervisor.cpuid.v0 = "FALSE"
pciHole.start = "1200"
pciHole.end = "2200"
pciPassthru0.msiEnabled = "FALSE"
pciPassthru1.msiEnabled = "FALSE"
```
※pciPassthru[X].msiEnabledの部分は追加するPCI何番目かで変わる。


2.[設定の編集]-[その他のデバイスの追加]-[PCIデバイス]からGPUとAUDIOを追加
　※ついでにPCIのUSB拡張カードも追加
![2017-09-24_000111.png](https://qiita-image-store.s3.amazonaws.com/0/127591/0823d873-6c3c-b6a7-ec30-ece84c77e299.png)

3'.ESXi自体を再起動
上記設定を行っても、そのまま仮想マシンを起動してもダメで、ESXi自体を再起動させないとだめだった。

# 結果
GPUを認識！
![2017-09-29_062043.png](https://qiita-image-store.s3.amazonaws.com/0/127591/c31857b0-16ff-156e-8230-e67226a9e50e.png)
Rubyのフレームワークまとめ

Rubyには数多くのフレームワークがあったので、まとめる。

#RubyOnRails
みんな大好きRails。Railsには、「設定より規約（Convention over Configuration、CoC）」や「同じことを繰り返さない（Don’t Repeat Yourself、DRY）」といった設計思想がある。MVCアーキテクチャが採用されている。レールに乗せるだけで短時間で開発できるため、Rubyのフレームワークの中で一番シェアが多い。

#Hanami
Hanamiは拡張可能なフレームワーク。コードが短く済むため軽量。MVCで、ライブラリが豊富。豊富なモジュールやライブラリを事前に用意してくれているため、安心してプログラミングをしていくことが可能だ。スレッドセーフというサーバのアクセスダウンを防ぐ機能を備えている。

#Sinatra
Sinatraは小規模なアプリケーションに特化したフレームワーク。インストールが非常に簡単だが、拡張性はあまりない。メソッドがそれぞれのアクションごとに分かれており、変更しやすい。

#Padrino
Padrinoは、Sinatraの拡張フレームワーク。Padrinoは複数人で行うような大規模アプリケーションの開発に向いている。MVCを採用しており、メールの基本テンプレート、テストツールなどが使える。Rails

#cuba microframework
Cubaはシンプルで軽量なフレームワーク。CubaのWebサイトには、“Ceci n’est pas un framework（Cubaはフレームワークではない。）”と書かれている。機能を最小化したためにマイクロフレームワークという位置付けになっている。

#Ramaze
ラマゼ。KISSの原則(Keep it simple, stupid/シンプルにしろ！)やPoLSの法則(Principle of least surprise/驚き最小の法則)などの法則というか概念を取り入れたフレームワーク。

#Camping
Campingは、非常に軽量なフレームワーク。MVCを採用。Campingで作成したアプリケーションはRailsへ移行させることも容易。