脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

HTC VIVE初期設定

HTC Vive初期設定の方法です
ですが実はViveはInstallガイドがすごい丁寧なので、雰囲気だけさらっと紹介します

setupツールのダウンロード

以下の公式HPからsetupツールをダウンロードして実行します
http://www.htcvive.com/us/setup/
f:id:portaltan:20160426201508p:plain

setup

起動するとまず言語が選べます。そしてまさかの日本語対応しているので大分セッティングが楽です
f:id:portaltan:20160426201457p:plain

セッティングを開始するとまずどれくらいの時間がかかるかの予想が出てきます
f:id:portaltan:20160426201603p:plain

ソフトウェアの設定だけでなく、ハードの接続も順番に指示を出してくれ、ポイントポイントで動画や図で説明してくれるのでとてもわかりやすいです
f:id:portaltan:20160426201739p:plain

ソフトウェアもこのツール経由でダウンロードすることができます
f:id:portaltan:20160426201828p:plain

room-scaleの設定

ソフトウェアのダウンロードやハードの設定が終わるとroom-scaleの設定に移ります
十分な空間を確保できない人用に、あまり動かない立位用モードもあります
f:id:portaltan:20160426202123p:plain

下の画面は立位用モードの設定画面です
f:id:portaltan:20160426202246p:plain

接続が成功しているマシンは以下のようにアイコンが緑色になります
f:id:portaltan:20160426202341p:plain

すべてのアイコンが緑色になって接続と設定が完了すればデモが開始します

Ansible playbook tips

モジュール関係

get_url

wgetのようにURLからファイルをダウンロードする

- hosts: all
  tasks:
    - name: download
      get_url: 
        url:  # downloadしたいURL
        dest: # 配置先(/usr/local/src/somepackageとか) 
        validate_certs: no # 認証チェックでひっかかる&信頼できる場合
        timeout: 30       # v1.8から
command
- hosts: all
  sudo: yes
  tasks:
    - name: change permission
      command: chown -R hoge:fuga /usr/local/src
lineinfile

configファイルなどファイルを編集(置換)します

- hosts: all
  tasks:
    - name: make backup of config file
      command: cp /etc/config/hoge.conf /etc/config/hoge.conf.org
      # ちなみにcp /etc/config/hoge.conf{,.ofg}のような書き方は出来ませんでした

    - name: edit config file
      lineinfile: >-
        dest='/etc/config/hoge.conf'      # 編集したいファイルの指定
        state=present
        backrefs=yes                      # 正規表現にバックスラッシュを利用できるようにする
        regexp='{{ ^enabled= }}'          # 置換したい行を正規表現でしてい(^は行頭) 
        line='{{ enabled=true }}'         # 置き換えたい文字列を指定

複数置換したいポイントがある場合はwith_itemsを使用します

- hosts: all
  tasks:
    - name: make backup of config file
      command: cp /etc/config/hoge.conf /etc/config/hoge.conf.org

    - name: edit config file
      lineinfile: >-
        dest='/etc/config/hoge.conf' 
        state=present
        backrefs=yes                 
        regexp='{{ item.regexp }}'    
        line='{{ item.line }}'
      with_items:
        - regexp: '^enabled='
          line: 'enabled=true'
        - regexp: 'path=/temp'
          line: 'path=/usr/local/src'

変数関係

利用方法

ansibleの変数は

{{ 変数名 }}

で利用する

作業中の自分のサーバのIPを取得する
{{ ansible_eth1["ipv4"]["address"] }}
自分で変数を設定して利用する

group_vars/all.ymlファイルを作成し、変数宣言をする
group_vars/all.yml

version: 1.0.0
user: vagrant
storage0: 192.168.33.21
storage1: 192.168.33.22

他の変数と同じく{{}}で囲んで使う

その他

グループ内のサーバに番号をつけたい

以下のようにipアドレスのあとに指定することで変数として格納できます
hostsファイル

[storage]
192.168.33.21 order=0
192.168.33.22 order=1
192.168.33.23 order=2

こんな風に微妙に設定パラメータを変えたりするときに使える

- hosts: storage
  tasks:
    - name: edit config file
      lineinfile: >-
        dest='/etc/storage.conf'
        state=present
        backrefs=yes
        regexp='target: storage'
        line='target: storage_{{ order }}'
           # 192.168.33.21ではstorage_0 になる
           # 192.168.33.21ではstorage_1 になる
           # 192.168.33.21ではstorage_2 になる
sleep/wait処理
- hosts: all
  tasks:
    - name: wait 
      pause:
        seconds: 15
notify/handler

notifyを指定することで次のタスクを指定できます

- hosts: all
  tasks:
    - name: first processing
      command: # 最初の処理
      notify: next processing

  handlers:
    - name: next processing
      command: # 次の処理
debug

ansibleから各サーバへ送った命令の実行結果を取得して標準出力に出します

- hosts: all
  tasks:
    - name: check status
      command: ls -l
      register: ls_result

    - debug: var=ls_result.stdout_lines # ここで出力します
proxy設定

Proxy環境下でAnsibleを利用するときは各サーバでProxyの設定がされていないと動かない場合がある
対象のサーバ側で直接設定してもいいのだが、playbook側でも利用するProxyを指定することができる

- hosts: all
  vars:
    hogehoge_proxy:  # 名前はなんでもよい
      http_proxy: http://hogehoge-proxy.co.jp:8080
      https_proxy: https://hogehoge-proxy.co.jp:8080

  tasks:
    - name: download package via proxy
      command: wget ************
      environment: hogehoge_proxy  # taskごとに作成したProxyの設定を指定する

Ansibleの設定方法

f:id:portaltan:20160426192818p:plain
AnsibleはChefのようなDeployツールで以下のような特徴があります

  • agent less
    • 対象のサーバにAnsibleの命令を受け取るAgentをインストールする必要がない
  • interactive mode
    • レシピファイル内にすべて記述せずに対話的に設定をしていくことが可能らしい
  • GUI web console
    • Ansible TowerというGUIの管理ツールがある(有料)

使い方

1. Ansibleのインストール(Ansibleサーバ)

sudo apt-get install ansible

cd /etc/ansible
ls -l
  total 20
  drwxr-xr-x  2 root root 4096 Apr 25 05:31 ./
  drwxr-xr-x 84 root root 4096 Apr 25 05:32 ../
  -rw-r--r--  1 root root 6119 Apr  1  2014 ansible.cfg
  -rw-r--r--  1 root root  982 Apr  3  2014 hosts

2. 対象のサーバを指定

Ansibleサーバからアクセスするターゲットサーバの指定をします

vi hosts
==================================================
[gateway]
192.168.33.21
[webserver]
192.168.33.22
[database]
192.168.33.23
192.168.33.24
[application]
192.168.33.25
==================================================

フォーマットは色々ありますが、今回は以下の書式をで書きます

[Group名]
IPアドレス

3. setting ssh agent

ansibleは対象のサーバにsshで接続するので、ssh agentなどを設定してパスワードレスでアクセスできるようにしてやる必要があります
ここらへんは過去ポストをご参照ください
パスワード入力なしでssh接続する方法①(ssh-agent) - 脳汁portal
パスワード入力なしでssh接続する方法②(.ssh/config) - 脳汁portal

sshの設定が完了したら、ansibleのpingモジュールを利用して実際に接続出来るか確認します

$ ansible all -m ping
192.168.33.21 | success >> {
    "changed": false,
    "ping": "pong"
}
192.168.33.22 | success >> {
    "changed": false,
    "ping": "pong"
}
192.168.33.23 | success >> {
    "changed": false,
    "ping": "pong"
}
.
.
.

またはコマンドを直接送ることも可能です。
今回はサーバグループを指定して実行してみます

$ ansible gateway -a "/bin/date"
192.168.33.21 | success | rc=0 >>
Thu Apr 21 05:06:25 GMT 2016
  
$ ansible webserver -a "/bin/date"
192.168.33.22 | success | rc=0 >>
Thu Apr 21 05:09:31 GMT 2016

$ ansible database -a "/bin/date"
192.168.33.23 | success | rc=0 >>
Thu Apr 21 05:21:30 GMT 2016
192.168.33.24 | success | rc=0 >>
Thu Apr 21 05:26:30 GMT 2016
192.168.33.25 | success | rc=0 >>
Thu Apr 21 05:29:39 GMT 2016

4. playbookの作成

playbookはChefでいうレシピファイルになります
(Chefを使ったことがないので違ったらすいません

playbookはymlファイルで構成します。

sample
vi playbook_hogehoge.yml
========================================
- hosts: all  # 指定したすべてのサーバで行いたい場合
  sudo: yes   # sudoを利用するかどうか
 tasks:      # Tasks以下に実際に行う処理を記述していく
    - name: download from url       # 処理の名前
      get_url:                      # ansibleのget_urlモジュールを使用
        url: ダウンロードしたいURL       # ダウンロード先のURLの指定
        dest: /usr/local/src/hoge.tar.gz # ファイルの配置先の指定
        timeout: 30                      # タイムアウトの指定(v1.8から

  - name: apt de git install suru
      command: apt-get install git  # コマンドを直接指定することもできる

- hosts: gateway  # 特定のグループのみに作業させることも可能
  tasks: 
  .
  .
  .

========================================

5. Playbookの実行

playbookの作成が完了したらansible-playbookコマンドで実行できます

ansible-playbook playbook_hogehoge.yml

パスワード入力なしでssh接続する方法②(.ssh/config)

それぞれのサーバでやること

アクセス先のサーバでやること
  • 秘密鍵と公開鍵の作成
  • 公開鍵を認証リストに加える
  • アクセス元サーバに秘密鍵を渡す
アクセス元サーバ

実際の手順

アクセス先サーバ
cd ~/.ssh
ls -l
  total 4
  -rw------- 1 vagrant vagrant 389 Apr 21 01:21 authorized_keys # 認証リスト

# 鍵の発行
ssh-keygen -t rsa -f id_rsa_hogehoge
  ...
  Enter file in which to save the key (/home/vagrant/.ssh/id_rsa_hogehoge):
  Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  ...

ls -l
  -rw------- 1 vagrant vagrant  389 Apr 21 01:21 authorized_keys
  -rw------- 1 vagrant vagrant 1675 Apr 21 03:31 id_rsa_hogehoge      # 秘密鍵
  -rw-r--r-- 1 vagrant vagrant  411 Apr 21 03:31 id_rsa_hogehoge.pub  # 公開鍵

# 公開鍵を認証リストに追加する
cat id_rsa_hogehoge.pub >> authorized_keys
アクセス元サーバ
cd ~/.ssh

# 秘密鍵をとってくる(vagrantの場合)
scp ${ユーザ名}@${アクセス先サーバ}:/home/vagrant/.ssh/id_rsa .


# ssh/configの編集
vi config
===================================================================================
Host ${アクセス先サーバIP}
  IdentityFile ${秘密鍵PATH})
Host 192.168.33.11
  IdentityFile /home/vagrant/.ssh/id_rsa_hogehoge
===================================================================================

# 確認
ssh ${アクセス先サーバ}

パスワード入力なしでssh接続する方法①(ssh-agent)

それぞれのサーバでやること

アクセス先のサーバでやること
  • 秘密鍵と公開鍵の作成
  • 公開鍵を認証リストに加える
  • アクセス元サーバに秘密鍵を渡す
アクセス元サーバ
  • アクセス先サーバから秘密鍵を受け取る
  • ssh-agentの起動
  • 秘密鍵をagentに登録する

実際の手順

アクセス先サーバ
cd ~/.ssh
ls -l
  total 4
  -rw------- 1 vagrant vagrant 389 Apr 21 01:21 authorized_keys # 認証リスト

# 鍵の発行
ssh-keygen -t rsa
  ...
  Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
  Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  Your identification has been saved in /home/vagrant/.ssh/id_rsa.
  Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
  ...

ls -l
  -rw------- 1 vagrant vagrant  389 Apr 21 01:21 authorized_keys
  -rw------- 1 vagrant vagrant 1675 Apr 21 03:31 id_rsa      # 秘密鍵
  -rw-r--r-- 1 vagrant vagrant  411 Apr 21 03:31 id_rsa.pub  # 公開鍵

# 公開鍵を認証リストに追加する
cat id_rsa.pub >> authorized_keys

# 認証リストのパーミッションを設定する
chmod 600 authorized_keys
アクセス元サーバ
cd ~
scp ${ユーザ名}@${アクセス先サーバ}:/home/vagrant/.ssh/id_rsa ~/.


# agentの起動
eval `ssh-agent`

# プロセスの確認
$ ps aux | grep agent
vagrant   2689  0.0  0.0  10612   316 ?        Ss   08:38   0:00 ssh-agent
vagrant   2709  0.0  0.1  11740   936 pts/0    S+   08:39   0:00 grep --color=auto agent

# 秘密鍵の登録
ssh-add id_rsa
  Identity added: id_rsa (id_rsa)

# 確認
ssh-add -l  

# 実際にsshアクセス
ssh ${アクセス先サーバ}
  Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)

   * Documentation:  https://help.ubuntu.com/
  Last login: Thu Apr 21 03:26:34 2016 from 192.168.33.1
    ### => パスワード入力なしでsshログインできた

Thetaで撮影した360度動画をUnityを使ってOculus Riftで再生する

Thetaで撮影した360度動画をUnityで再生する方法です
Unityで360度動画を再生するには、以下の3つのコンポーネントが必要になります

 ① 360度mp4動画(equireqtangular形式)
 ② 上記の 360度動画(①)を張り付けるTexture Material
 ③ 上記のTexture Material(②)を投影する全天周天球モデル

以下ではそれぞれの設定方法を説明します

1. 動画用意

まずは動画を用意します。

1. 動画撮影

Thetaで普通に動画を撮影します
(今回はサンプルとしてThetaの公式サイトで提供されている空手の動画を利用します)
theta360.com

2. 動画の変換

ThetaSの場合は自動でEquirectangular形式で動画ファイルが出力されるのでこのステップは不要です
Theta m15の場合は魚眼風の二眼MOVファイルとして出力されるので、これをEquirectangular形式に変換する必要があります
以下のサイトからPC用Thetaアプリをダウンロードして起動し、D&DでMOVファイルを指定すると自動でEquirectangular形式のmp4ファイルに変換されます
( ダウンロード | RICOH THETA )
f:id:portaltan:20160418124004p:plain

3. 動画ファイルのImport

EquiRectangularのmp4ファイルが準備できたら、Import New AssetsからMovieをUniryへImportします

f:id:portaltan:20160418130518p:plain

2. 動画を張り付けるUVスフィアの準備

次に動画を張り付けるUVスフィアというマテリアルを作成します

1. UV Sphereの準備

自分で作成する場合はBlender等の作成ツールから作成しますが、今回は以下のサイトで提供されているスフィアを使わせていただきます
No hack, no work • UnityとOculusで360度パノラマ全天周動画を見る方法【無料編】

2. SphereのImport

ダウンロードしたSphere(Sphere100.fbx)を動画と同じようにImport New AssetsでUnityへImportします

3. Sphereの設定

ImportしたSphereをHierarchyへD&Dし、InpectorからScaleを(1000, 1000, 1000)へ拡大します

f:id:portaltan:20160418130853p:plain

3. UVSphereに張り付けるTextureの作成

UVSphereに直接動画は張り付けられないので、動画を張り付けるためのTextureを用意します

1. Textureの作成

まずはMaterialをCreateして名前をつけます(今回はmovieTextureとしました)

2. Textureの設定

InspectorからShaderをUnlit/Textureへ変更します

3. 動画の指定

InspectorのSelectから、importしておいたmp4ファイルを選択します
f:id:portaltan:20160418131532p:plain

4. TextureのSphereへの張り付け

作成したTextureをヒエラルキーのSphereへD&Dで張り付けます
f:id:portaltan:20160418131730p:plain

4. 動画を再生するスクリプトの用意

ここまででコンポーネントの準備は完了したので、実際に動画を再生させる処理を書いていきます

1. C#スクリプトの作成

ProjectからC#スクリプトを作成します
(今回はPlayMovieという名前にしました)
作成したスクリプトに以下ように記述します

using UnityEngine;
using System.Collections;

public class PlayMovie : MonoBehaviour {

	public MovieTexture karate;

	void Start () {
		karate.Play ();
	}
}
2. スクリプトのSphereへの張り付け

Textureと同じようにD&DでSphereへ張り付けます

3. 動画objectの関連付け

スクリプトを張り付けると、InspectorでKarateという変数を設定するエリアが出てくるので、Selectを押して動画を指定します
f:id:portaltan:20160418145553p:plain

4. 実行

これで動画再生の準備は整ったので、再生ボタンを押して確認します
f:id:portaltan:20160418145713p:plain

UnityでObjectのPivotを変更する

Unityでオブジェクトの中心というか重心というかPivotを変更する方法です
これをするとなにがいいかというと、オブジェクトをRotationするときに通常だとオブジェクトの中心を起点にしてしか回転することができませんが、回転の起点を任意に変更することができます

そもそもUnityのデフォルトの機能でできるのかどうか

Changing the pivot point of meshes. - Unity Answers
Move gameobject pivot - Unity Answers
Moving pivot points? - General Discussion - ProCore Forum

色々ぐぐっていると、「出来るよ!」って情報もあれば「それはUnityでは出来ないよ」って情報もあります
なんか見た感じだと、

  • Unity以外のObject作成ツールでPivotを指定して作成し、それをimportした場合は変更できるらしい
  • UnityのEditorから作成したオブジェクトは変更できないらしい
  • 軸をベースに回転することはできるらしい
  • 2Dオブジェクトだとできる?

結局自分の意図した設定はできませんでしたが、最終的に以下の動画を見つけて解決しました
www.youtube.com

Pivot変更の手順

簡単に説明すると、「ObjectのPivotを直接変更することはできないので、Empty GameObjectを作成してそれを仮のPivotとして機能させよう」
という流れです

1. Pivotを変更させたいObjectの用意

今回はCylinderを使います
見やすいようにRotationとScaleを少し変えています
f:id:portaltan:20160415130554p:plain

2. 仮PivotになるGameObjectを作成する

GameObjectからEmpty GameObjectを選択し、Positionを回転の起点にしたい位置にします
f:id:portaltan:20160415130754p:plain

3. GameObjectにスクリプトをセットする(見やすいように)

GizmoというC# scriptを作成し、以下のように処理を記述します

using UnityEngine;
using System.Collections;

public class Gizmo : MonoBehaviour {

	public float gizmoSize = 0.3f;
	public Color gizmoColor = Color.yellow;

	void OnDrawGizmos()
	{
		Gizmos.color = gizmoColor;
		Gizmos.DrawWireSphere (transform.position, gizmoSize);
	}
}

f:id:portaltan:20160415131554p:plain

4. 回転させたいオブジェクトを仮Pivotの子オブジェクトにする

f:id:portaltan:20160415131801p:plain

5. 仮pivotを回転させる

これで仮pivotを回転させれば、仮Pivotを起点にCylinderが回転します


以下のように複数のオブジェクトを一つのPivotで同時に回転させることも可能です
f:id:portaltan:20160415133912p:plain