helloworlds

not a noun, it's a verb

【VR】仮想店舗(Virtual Store)!? Oculus Goで考える #1

これまで過去の記事で、Oculus Goの開発環境(Unity)などを整えていきました。 Oculusのアセットをインポートして、コントローラーを追加し移動できるようにするところまで進めたかと思います。

今回の記事は考察よりの内容です!

o21o21.hatenablog.jp

以前から個人的に色んな方のVRのコンテンツを少々拝見させてもらっていました。

Oculus Goでまず試したい!おすすめアプリ・ゲーム特選 | Mogura VR - 国内外のVR/AR/MR最新情報

すごいですよね~! VRChatとかVRの中で映画をみんなで観る鑑賞会とかが開かれていたり!

私は参加したことない(参加するのが怖いのでお誘いお待ちしておりますw)ので気になることがあるのですが、 充電とかフレームレートとか...

まあそんなことを思っていても、開発していかないと知見がたまらないので、

仮想店舗 (Virtual Store)」を開発してみようと思います!

ECサイトあるからええやん!というご意見はさておき、 なんとなくわくわくするので個人的に開発してみようかな~。

Unity Asset Store

私は日頃Unity使わないので、初めてちゃんとあさってみたのですが、すごい沢山アセットがあるんだな~、 と今更ながら思いました。

assetstore.unity.com

一番驚いたのが、こちら! WillHuangさんという方が作成したもの。

assetstore.unity.com

もう、すっごい綺麗ですね。。!! 購入はしていませんが、このアセットはOculusに対応しているとのこと。 (グラボを積んでいるPCでないといけないみたいです!)

$50か~、このクオリティなら十分に納得ができる。

が、ちょっと高いな~。

と、思っていたところ値段もクオリティもお手頃なアセットを発見した。

assetstore.unity.com

これも十分綺麗ですね! $16くらい。これなら購入してもよさそうだと思って購入。

ちょっと購入前に気になったのが、棚に並んでいる商品。

サンプル動画を観る限り、けっこう色んな種類の商品オブジェクトがあるみたい。 VRでこの店舗に訪れて商品に近づくと、商品にオブジェクトに文字が書いてあるが、 それがどうやって映るんだろう、なんて考えました。

購入はクレカで即購入できちゃいます!

Unityにインポート

f:id:o21o21:20180622110916p:plain

「おお!一気にそれらしい!」

是非店内を歩きたいということで、ビルド!!

f:id:o21o21:20180622123815p:plain

「やったー!!歩けた!!」

「あれ?でも....」

実機で見るとわかるのですが、オブジェクトがけっこうかくついている。。。 フレームレートの問題なのか?

Oculus Goのリフレッシュレートは、60Hz72Hzでコンテンツにより変化するらしい。 なるほどー。

原因がまだわからないけど、おそらくそこらへんに問題がありそうです。 もしわかる方いあたら是非連絡お待ちしております。!

店舗が暗い問題

最初アセットをインポートしてビルドしたとき、店舗が暗かったのです。 これはどうもLightingの問題だったようです。

メニューWindow > Lighting > Settings

Realtime LightingのAuto Generateチェックボックス外して

Generate Lightingに設定&押下でOK!

まとめ

次は、商品が取れて、商品単体でポップアップみたいに確認できるようにしようかな! そのあと、サーバーとの通信方法を考えよう!

今回は考察ということで、仮想店舗について考えました。

現状、ECサイトのみで店舗がない会社とか、VRで仮想店舗なんかあると面白そうだよね! 求められるというより、ワクワクを追っていきます!!

以上

過去記事>>

o21o21.hatenablog.jp

o21o21.hatenablog.jp

【Go】go-ethereumを使用して簡易ブロックエクスプローラーを構築!

先日、etherscanのようなブロックチェーンに記録された取引情報などを確認できるようなシステムをローカルに構築する勉強会に参加してきました。

etherscan自体は、こちらにあります。

Ethereum (ETH) BlockChain Explorer

俗にエクスプローラと呼ばれる仮想通貨の領域で使用されるシステムです。

私は今のところいくつか仮想通貨を所有していますが、ほぼ放置しています...w たしか、2017年、年末くらいがすごい盛り上がっていましたよね〜 ブロックチェーンという技術に興味はありますが、仮想通貨自体まだそんなに本腰を入れて模索していません。

ですが、ブロックチェーンの技術的な面であったり、それに付随してくるシステムには関心があるといったところです。

まだまだ、国内では仮想通貨に関する本はありますが、ブロックチェーン技術についてはなかなか(最新の書籍は)ないですよね。

今回は、etherscanシステムの簡易バージョン、 基、ローカル環境で動作するブロックエクスプローラを構築させます。

では準備から取り掛かっていきましょう。

環境 : macOS

準備

まず、構築で絶対必要なのが、GoGeth (, Git)です。

Golangのインストールやプロジェクト構成については、過去記事があるので そちらを参考にしてみて下さい!

o21o21.hatenablog.jp

そして、Gethなのですが、Go Ethereumの略でEthereumが提供しているクライアントソフトです。

golangで開発されていて、Ethereumをコマンドラインで操作する目的のソフトというかんじ。

github.com

このGethをインストールするのは簡単です。

$ brew tap ethereum/ethereum
$ brew install ethereum

インストールが完了したら、確認してみます。(helpオプション)

$ geth --h


NAME:
   geth - the go-ethereum command line interface

   Copyright 2013-2018 The go-ethereum Authors

USAGE:
   geth [options] command [command options] [arguments...]
   
VERSION:
   1.8.10-stable
   
COMMANDS:
   account           Manage accounts
   attach            Start an interactive JavaScript environment (connect to node)
   bug               opens a window to report a bug on the geth repo
・
・
・
・

こんなかんじでヘルプ内容がどっしり出力されたらOKです。

本来であれば既にGethがインストールできているので、色々コマンドを実行できるのですが、 今回はさらに環境を整えます。

ちなみに以下のような手順書もあるので、ここからは合わせて参考にするといいかもしれません。

まずは Ethereum に触れてみる · Ethereum入門

Gethをインストールする · Ethereum入門

ブロックエクスプローラーを構築

さて、ここからは以下のリポジトリを使用します。

GitHub - curvegrid/toy-block-explorer: A blockchain explorer written in Go to learn about building server-side applications that work with the Ethereum blockchain.

このGoコードで、自分のブラウザでEthereumの情報が確認できるようにします。

基本的にREADMEを実行していけば大丈夫なのですが、 順番を間違えたりして詰まるとモチベーションが落ちるので(www) ここでは上から順におってみていきます。

1. リポジトリをおとしてくる

まず、toy-block-explorerリポジトリをおとしてきます。 おとしてくるくるときは、zipでもgit cloneでも構いませんが、 step-finalブランチを指定して下さい。

まず、任意のディレクトリに移動してクローンします。

$ git clone https://github.com/curvegrid/toy-block-explorer.git

クローンが完了すると、toy-block-explorerというディレクトリが確認できるかと思いますので、移動し以下を実行します。

$ cd toy-block-explorer
$ git submodule init
$ git submodule update --recursive

.gitmodulesファイルが存在するかと思います。 こちらのファイルを元に、git submoduleをしましたので、 toy-block-explorer/geth/配下にeasy-geth-dev-modeというリポジトリを生成しました。

easy-geth-dev-mode自体のリポジトリは、こちらにあります。

今は無事にコマンドが実行できたらOKです。

現状はこんな構成になっているかと思います。

toy-block-explorer/
├── LICENSE
├── README.md
├── build.sh
├── erc20.go
├── geth
│   ├── easy-geth-dev-mode
│   └── sample-chaindata
├── main.go
├── screenshot.png
├── templates
│   ├── footer.tmpl
│   └── header.tmpl
├── toy-block-explorer
└── www
    ├── css
    ├── images
    ├── index.html
    └── js

2. サンプルデータを作成

仮想通貨をある程度知り尽くしていたらいいのですが、いきなり本番のデータを扱うのは怖すぎるので(この記事では本番のデータ操作については割愛)、 ローカルで動作させるためのデータを作成します。

プロジェクトルートで以下を実行します。

$ cp -R geth/sample-chaindata geth/easy-geth-dev-mode/chaindata

3. Gethを起動させる

先程、git submoduleしてきたeasy-geth-dev-modeディレクトリに移動します。

easy-geth-dev-mode/
├── README.md
├── attach43.sh
├── chaindata
│   ├── geth
│   ├── history
│   ├── keystore
│   ├── log
│   └── sample-chaindata
├── js
│   ├── base-geth-snippets.js
│   ├── start-rpc.js
│   └── useful-geth-snippets.js
├── launch43.sh
├── net43
│   ├── README.md
│   ├── attach43.sh
│   ├── chaindata
│   ├── js
│   ├── launch43.sh
│   └── stop43.sh
└── stop43.sh

そしてlaunch43.sh を実行します。

$ cd geth/easy-geth-dev-mode
$ ./launch43.sh --ipcdisable --startrpc

launch43.shでgethコマンドを実行しています。 データが格納されているディレクトリを指定し、dev modeで、データをjsに渡すようにオプションが付与されています。

起動できると以下のようになるかと思います。

$ ./launch43.sh --ipcdisable --startrpc


== Disabling IPC
== Enabling RPC
== Attaching via RPC
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.10-stable/darwin-amd64/go1.10.2
coinbase: 0x5e4d047cd9173fd13c220a0bf756c7e25c00f587
at block: 3 (Sat, 09 Jun 2018 15:41:28 JST)
 datadir: /Users/user-name/path/to/toy-block-explorer/geth/easy-geth-dev-mode/chaindata
 modules: admin:1.0 debug:1.0 eth:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0

> 
> 
> 

これでGethが起動できました。 このGethを停止する場合は、./stop43.shを実行しましょう。

一旦、ブラウザで確認できるまで起動させたままで構いません。

また、何度か試していると、

geth net43 testnet appears to be running or zombie pid file remains at './chaindata/log/geth.pid'
Try running 'stop43.sh' to make it exit.

このようなメッセージが出力されるかと思います。 同様にstop43.shを実行してから再度起動を試すといいかもしれません。

3-1. トラブルシューティング

  • Gethが実行できない

けっこう起動できない方がいたようです。 まずgethが起動しているのか、プロセスから調べてみます。

$ ps -ef | grep geth

数件gethでヒットしていたら起動はできているかもしれません。

  • それでも起動がうまくいかない
$ geth --dev --datadir ./chaindata --rpc console

rpc : gethのRPCサーバとしてのAPIを有効化

4.

ここまでGethを起動できたので、すでにgethのコンソールからコマンドを実行できる状態ではあります。 ですが、まだブラウザでは何も確認できないので、portを開けて確認できるようにしましょう。

コマンドライン(ターミナル)の新しいウィンドウなりタブを開いて、 toy-block-explorerのプロジェクトルートに移動します。 ここにbuild.shというファイルがあるかと思います。 こちらを実行します。

$ ./build.sh

build.shの中では、go-ethereumgo getで取得し、 アプリtoy-block-explorerをbuildさせています。

無事ビルドできたら、toy-block-explorerを実行します。

$ ./toy-block-explorer

2018/06/09 16:04:10 Connecting to Ethereum node at http://localhost:8545
2018/06/09 16:04:10 Web server started on :8080
2018/06/09 16:04:16 Request from [::1]:64800: /
2018/06/09 16:04:17 Request from [::1]:64800: /

起動させ、ブラウザを開いて確認します。

http://localhost:8080/

確認できましたか?

f:id:o21o21:20180620185220p:plain

これでローカル環境に簡易版ブロックエクスプローラーを構築できました!

あとは、gethのコマンドで色々とコマンドを試すことができます。

main.goの内部が面白い

toy-block-explorerのプロジェクトルートにあるmain.goを見てみましょう。

コード上部にGetBlockchainInfoがあるかと思います。 他にも、データをweb3(Ethereum JavaScript API)を使用して受け渡していたり...

たくさん勉強になることが多そうです。 シェルが用意されているので、ほとんど自分で考えることがありませんが、 よーく構造を理解していくと面白い分野なので(特に今回扱ったリポジトリなんかは) 一度ローカルに落としてみて、時間をかけて理解してみてもいいかもしれませんね!

以上.

【VR】Oculus Go Unityでコントローラーを追加し移動してみる

さて、前回は、Unityのプロジェクトを作成しました。

o21o21.hatenablog.jp

続いてOculus Goに付属しているコントローラー(Replacement Controller)をUnityへimportしてみます。 そして、一人称で動けるようにします。

f:id:o21o21:20180612161059p:plain

アセットのインポート

アセットのインポートを最小限に済ませたい方は、UnityのAsset Storeから直接アセットをインポートしましょう。 まとめてUtilitiesをインポートしたい方は、こちらからダウンロード。 ダウンロードしたら、UnityのメニューAssets > Import Package > Custom *Package ... からダウンロードして解凍したファイルをインポートします。

以下、Asset Storeからの手順。 UnityのAsset StoreOculus Integrationというアセットがあります。

  1. UnityのAsset Storeにアクセス
  2. 検索フォームに"Oculus Integration"とタイプ f:id:o21o21:20180611222450p:plain
  3. "DOWNLOAD"を押下(無料です!) f:id:o21o21:20180611222723p:plain
  4. ダウンロードが完了したら、"Import"を押下
  5. ポップアップウィンドウが表示され、全てにチェックボックスが入っていることを確認し、"Import"。 f:id:o21o21:20180611223038p:plain
  6. versionの確認(Yes or No)
  7. Unityのrestartの確認(→ Yes)
  8. 再起動後、Asettsフォルダに存在を確認 f:id:o21o21:20180611223849p:plain

これでアセットのインポートを完了です!

OVRCameraRigを追加

インポートしてきたOculusフォルダを確認してみます。

Assets > Oculus > VR > Prefabs > OVRCameraRig

OVRCameraRigを、Hierarchyに追加します。 デフォルトのプロジェクトでは、Main Cameraがあると思います。 こちらは不要になるので、削除するか、Inspectorの方でチェックを外します。

f:id:o21o21:20180612121337p:plain

これでSceneからMain Cameraが消えたと思います。

OVRCameraRigの位置ですが、任意で大丈夫ですが、 私はUnityの三人称キャラ、Ethanをシーンに追加して目線を合わせてみました。 ※Ethanのインポートは、メニューAsetts > Import Package > Characters、全てをインポートすると、 Assets/Standard Assets/Characters/ThirdPersonCharacter/Prefabs/配下にEthanがいます。

Ethanの身長は、約168cmとされているようですが、ちゃんと調べるには自分で立方体を設置して測ってみるとよさそうですw

f:id:o21o21:20180612123347p:plain

コントローラーの設定

いよいよコントローラーの設定をしていきます。

1. コントローラーを追加

Oculus/VR/Prefabs/TrackedRemote.prefab

こちらをOVRCameraRigのLeftHandAnchorRightHandAnchorドラッグ&ドロップします。

f:id:o21o21:20180612123750p:plain

そうすると、以下のようにOculus Goのコントローラーが確認できるかと思います。

/RightHandAnchor/TrackedRemote/OculusGoControllerModel
/LeftHandAnchor/TrackedRemote/OculusGoControllerModel

f:id:o21o21:20180612124256p:plain

2. ポインタを設定する

何か操作をするときにどこをコントローラーが指しているか知る必要があります。

まず、Hierarchyで空のGameObjectを作成します。 Hierarchyのところで、右クリ > Create Emptyで作成します。 そして、名前を付けます(例: LaserPointer)

このオブジェクトにコードを追加したいので、任意の場所で Create > C# ScriptC#のファイルを作成します。 ファイル名は自分がわかればいいでしょう!

エディタを開いて、以下のコードを貼り付けます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LaserPointer : MonoBehaviour {

    // 右手
    [SerializeField]
    private Transform _RightHandAnchor;

    // 左手
    [SerializeField]
    private Transform _LeftHandAnchor;

    // 目の中心
    [SerializeField]
    private Transform _CenterEyeAnchor;

    // 距離
    [SerializeField]
    private float _MaxDistance = 100.0f;

    // LineRenderer
    [SerializeField]
    private LineRenderer _LaserPointerRenderer;

    // コントローラー
    private Transform Pointer
    {
        get
        {
            // 現在アクティブなコントローラーを取得
            var controller = OVRInput.GetActiveController();
            if (controller == OVRInput.Controller.RTrackedRemote)
            {
                return _RightHandAnchor;
            }
            else if (controller == OVRInput.Controller.LTrackedRemote)
            {
                return _LeftHandAnchor;
            }
            // どちらも取れなければ目の間からビームが出る
            return _CenterEyeAnchor;
        }
    }

    void Update()
    {
        // コントローラーを取得
        var pointer = Pointer;

        // コントローラーがない or LineRendererがなければ何もしない
        if (pointer == null || _LaserPointerRenderer == null)
        {
            return;
        }
        
        // コントローラー位置からRayを飛ばす
        Ray pointerRay = new Ray(pointer.position, pointer.forward);

        // レーザーの起点
        _LaserPointerRenderer.SetPosition(0, pointerRay.origin);

        RaycastHit hitInfo;
        if (Physics.Raycast(pointerRay, out hitInfo, _MaxDistance))
        {
            // Rayがヒットしたらそこまで
            _LaserPointerRenderer.SetPosition(1, hitInfo.point);
        }
        else
        {
            // Rayがヒットしなかったら向いている方向にMaxDistance伸ばす
            _LaserPointerRenderer.SetPosition(1, pointerRay.origin + pointerRay.direction * _MaxDistance);
        }
    }
}

なるほどー。こんな関数もあるんだー。勉強になります。

シーンにあるすべてのコライダーに対して、 origin の位置から direction の方向に maxDistance の距離だけレイを投じます。 Physics.Raycast - Unity スクリプトリファレンス

保存したら、さっき作成したLaserPointerゲームオブジェクトに配置させます。 ドラッグ&ドロップでも、InspectorのAdd Componentからでも追加できます。

f:id:o21o21:20180612130816p:plain

スクリプト中の変数の値をHierarchyのオブジェクト、

  • RightHandAnchor
  • LeftHandAnchor
  • CenterEyeAnchor

をそれぞれ設定します。

こちらもドラッグ&ドロップか、変数名の値の横の丸ぽちでも設定可能です。

f:id:o21o21:20180612131259p:plain

3. レーダーを設定する

Line Rendererというものを設定します。 LaserPointerゲームオブジェクトのAdd Componentを押下。 Searchフォームで、lineと入力すると、Line Rendererが選択できるかと思います。

このLine Rendererに設定をします。 沢山の項目がありますが、今は最小限にします。

  • Cast Shadows: Off
  • Materials>Element 0: Sprites-Default (丸ぽち押下し検索フォームに"Sprites"と入力)
  • Width: 任意 (0.003 ~ くらいからがいいかな?)
  • Color: 任意

値を設定したら、変数に設定します。

f:id:o21o21:20180612132652p:plain

これで完了です。

4. 実機で確認

ここまでできたら1度実機で確認してみます。

保存して、ビルドしましょう。

f:id:o21o21:20180612134105p:plain

おう!レーダー出てますね! これでまたコードを書いて、オブジェクトに対しての操作も考えられそうです!

前々回前回の記事を観覧して頂いているかたは、 PCへUSB接続し、クロームからアプリ(Vysor)を起動。Oculusのデバイス接続が確認できたら"View"でOculus Goの画面がPCで確認できるはずです。

f:id:o21o21:20180612134216p:plain

いったん休憩

ここまでコントローラーを追加し設定しました。 あとは、コントローラーでオブジェクトに対して処理を行うコードを追加したり、 今回作成したLine Rendererでレーザーの細かい設定をしたりして、修正できます。

docs.unity3d.com

docs.unity3d.com

ここまでこちらを参考にさせて頂きました。ありがとうございます。

さらに公式でも関数についてなど記載があります。(英語)

OVRInput

次は、一人称視点で動くことをやっていきます。

Playerを設定し、動いてみる

Oculus Goに付属しているOculus Go Controllerタッチパッドで 直感的に一人称で動けるようにしてみます。

OVRCameraRigにComponentを追加

  1. HierarchyでOVRCameraRigを選択
  2. Add Componentを押下
  3. 以下を加える
  4. Capsule Collider
  5. Rigidbody
  6. C#スクリプトを追加(名前は任意)

f:id:o21o21:20180612160208p:plain

作成したスクリプトに以下を追記。 (私は少し自分流にしましたが、コードは先人の方のを使わせて頂きます。Unity初心者なので、こんな関数もあるのかと勉強になります!)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Og_Player : MonoBehaviour
{

    Rigidbody m_Rigidbody;

    // Use this for initialization
    void Start()
    {
        // 自分のRigidbodyを取ってくる
        m_Rigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        float x = 0.0f;
        float z = 0.0f;
        Vector2 touchPadPt = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad);

        //右方向
        if (touchPadPt.x > 0.5 && -0.5 < touchPadPt.y && touchPadPt.y < 0.5)
        {
            // 十字キーで首を左右に回す
            transform.Rotate(new Vector3(0.0f, 0.5f, 0.0f)); 
            x += 0.5f;
        }
        //左方向
        if (touchPadPt.x < -0.5 && -0.5 < touchPadPt.y && touchPadPt.y < 0.5)
        {
            // 十字キーで首を左右に回す
            transform.Rotate(new Vector3(0.0f, -0.5f, 0.0f));
            x -= 0.5f;
        }
        //上方向
        if (touchPadPt.y > 0.5 && -0.5 < touchPadPt.x && touchPadPt.x < 0.5)
        {
            z += 5.0f;
        }
        //下方向
        if (touchPadPt.y < -0.5 && -0.5 < touchPadPt.x && touchPadPt.x < 0.5)
        {
            z -= 5.0f;
        }

        m_Rigidbody.velocity = z * transform.forward + x * transform.right;
    }

}

docs.unity3d.com

実機で確認

再度ビルドを実行して、実機で確認します。

f:id:o21o21:20180612161259p:plain

移動してEthanに会ってみました!

少し感度というか、自分が操作に慣れてないから移動に手間取りました。。 なんかタッチパッドが少し小さいかな?と個人的には思いました。

まとめ

今回はコントローラーを追加して、自分視点でフィールドで移動できるようにしました。 UnityのAsset Storeでは無料のフィールドもあるようなので、活用できそうですね!

【Go】GoでQuine(クワイン)を考えてみる

とある記事でクワイン(quine)というものを知った。

けっこうプログラミングの世界では、遊び?というかやっている内にハマっちゃうらしくて少し触れてみました。

Quineとは?

Quineとは、 自身のソースコードと同じ文字列を出力させるものです。

言語はなんでもいいらしい。 最初は、「なんか頑張ればできそうだな」とか 思ってたんですが、以外とムズいことに気づきました。

Pythonと迷ったのですが、先人の記事が少しあったので 今回はgolangでやってみようかと思います。

手始めに考えたこと

とりあえずfmt.Printしてみる!ww まあ、それはすぐムズいことに気づく。それにわしはgolangのすごい慣れ親しんではまだいない。

以下糞コード。

package main

import "fmt"

func main() {
    fmt.Print("
                    package main

                    import "fmt"

                    func main() {
                        
                    }
                   ")
}

でもなんかfmt.Printのとこでreplaceかなんかやればできんじゃね?みたいに思った。

とりあえず色々出力

package main

import (
    "fmt"
  _  "github.com/davecgh/go-spew/spew"
)

func main() {
    hoge := "This is the test"
    fmt.Print(hoge)
}

> This is the test

うんうん、そりゃそのままだなwww

ちょっとvar_dump的なのないのか?と思ったので、 spewというパッケージを使用してみた!

github.com

spew.Dump(hoge)でgo run main.goを実行。

> (string) (len=16) "This is the test"

ほう。 ならこれはどうだ。

hoge := "This is the test.
               That is the test.
              "

>  newline in character literal
> syntax error: unexpected is at end of statement
> newline in character literal

おっと、エラー出た。 そうかダブルクォーテーションじゃ駄目だな〜。 ああ、ヒアドキュメントか。

ダブルクォーテーションを ` で囲む。

> (string) (len=61) "This is the test.\n             That is the test.\n  

正規表現を使って...

きた。\n があるじゃん。

package main

import (
    "fmt"
  _  "github.com/davecgh/go-spew/spew"
)

func main() {
    hoge := `package main
             
             import ( 
                 "fmt"
              _   "github.com/davecgh/go-spew/spew"
             )

     func main() {
        hoge := 
        fmt.Print(hoge[:175] + "\u0060" + hoge + "\u0060" + hoge[:175])
     }
`
    fmt.Print(hoge[:175] + "\u0060" + hoge + "\u0060" + hoge[175:])
}

正規表現についてはググればOK!

Unicode正規化

string型の文字列を分解してただそのまま出力するだけでした。

変数hogeのスライス位置を確かめるのがしんどすぎました。ちゃとスペースとかタブとか考えて記述しないとですね…

なかなか面白かったです。 goの勉強にもなったし! ただ、興味のない言語でやりたいとは思わない...w

以上.

【VR】Unityで開発環境を整える

前回は、Oculus Goの画面をPCへミラーリングさせる方法を記事にしました。

o21o21.hatenablog.jp

こちらの記事でインストール/設定したところは前提で、 今回は「Oculus GoのUnityの開発環境」を整えていこうかと思います。

僕、Unity初心者なので至らない点はよろしくお願いいたします!ww

環境: Windows10

前提

まず前提として、以下をインストールしている前提ですすめます。 もし、インストールや設定をしていない方は、上記の記事を参考にしてみて下さい!

  • Oculus Goの開発者モード
  • Android Studio (v3.1.2)
  • Unity (過去記事では扱っていませんが、ググるとインストール方法は沢山出てくると思うので割愛)

ではやっていきます!!

Android Studio

公式で紹介されている通り、 ビルドに必要なパッケージとツールをAndroid SDK Managerでインストールしていきます。

  1. Android Studioの起動
  2. ウィンドウ下部のConfigure > SDK Manager
  3. 左メニューAndroid SDKを選択し、SDK Platformsタブを選択
  4. Android 5.0 (Lollipop)以上(API Level)21以上にチェックをいれる(前回Level19以上をインストールしているはず)
  5. SDK Toolsタブを選択
  6. NDK、LLDB、Android SDK Build Tools xx.x.x.にチェックをいれる
  7. OK を押下
  8. Component Installerが立ち上がり、インストールを待って完了

トラブルシューティング

  • Android Studioのヴァージョンについて 私のAndroid Studio自体のヴァージョンは、3.1.2です。

  • SDKについて 前回では、API Level19以上のものをインストールしたかと思います。 私が最終的にビルドを試していたときに、(今回はMinimumAPI Levelを24に設定) 「UnityException: Requested minimum Android SDK not installed」のようなエラーが出ました。 ちょっと調査していないので断定できませんが、このようなエラーが出たらAndroid Studio側でアンインストールするなり最低API Levelまわりを確認してみて下さい。

Oculus Go ADB Driver

公式手順はこちらです。

ここからOculus Go ADB Driverをインストールできます。

  1. 落としてきたzipを解凍
  2. \oculus-go-adb-driver-2.0\usb_driver ディレクトリへ移動
  3. android_winusb.infを右クリックでインストール

※もし右クリックでインストールの選択が出ない方はzipのディレクトリにいるのでフォルダを移動させるか、 ALZipをインストールしてみて下さい。

Unity

Unityを起動して、Unityでの設定を行っていきます。 Unityのインストールはこちら

Unityの設定

  1. 新規プロジェクトの作成 f:id:o21o21:20180602014245p:plain

  2. メニューのEdit > Preference を選択

  3. 左メニューのExternal Toolsを選択
  4. AndroidSDKJDKを設定します。

SDKは、以下を確認します。(Android Studio)

f:id:o21o21:20180602211324p:plain

JDKは、おそらく C:/Program Files/Java/jdkx.x.x_xxx このようなPATHかと思います。

トラブルシューティング

  • SDKJDKの項目がない External Toolsの設定をしようとおもった時に、私は以下の画像の赤枠のところが存在しませんでした... これはどうもUnityのヴァージョンの問題だったようです。 もし同様の問題がおこった方は、ヴァージョンを確認して適当なヴァージョンを再度インストールしてみてください。 ここに過去のヴァージョンをインストールできるリンクを貼っておきますーー

f:id:o21o21:20180602215145p:plain

ビルドの設定

  1. メニューFile > BuildSettings...
  2. PlatformをAndroidにする

プロジェクトの設定

  1. メニューEdit > ProjectSetting > Player
  2. 右端にメニューが表示される
  3. OtherSettingの以下を変更 PackageName: 任意 MinimumAPI Level: Android 7.0 Nougat (API level24)
  4. XR Settingsの以下を変更 Virtual Reality Supported: チェックボックス On Virtual Reality SDKs: Oculus

保存して実機で確認

ここまできたら、適当にオブジェクトを配置します。 GameObject > 3D Object > Cube みたいにとりあえず配置。

置けたら、メニューFile > SaveScene でシーンを保存します。 あとはビルドして起動させるだけです。

メニューFile > Build&Run を実行!!

どうでしょうか?Oculus Goの画面にオブジェクトが確認できました。

f:id:o21o21:20180602210058p:plain

トラブルシューティング

  • ビルドが通らない

けっこうここで時間を食いました。 エラーの内容としてはこのような内容でした。 「CommandInvokationFailure: Unable to list target platforms. Please make sure the android sdk path is correct. 」

あれ~何回もSDKのPATHを確認したのにおかしい... と、意気消沈していたところ有力な記事を発見。

原因はAndroid Studioのヴァージョンが起因していたっぽい。 ここからダウンロードしてきたzipを解凍し、 任意のディレクトリに展開。 toolsというフォルダが展開されたと思います。

こちらをSDKのPATH(例 C:\Users\user-name\AppData\Local\Android\Sdk)配下のtoolsと入れ替えましょう。 そしたらビルドが通るようになりました。

まとめ

これであとは実装次第となってくるでしょうか! 私は全然Unity初心者なので、操作から慣れていく必要がありそうですww でもVRで開発なんてとでもわくわくしますね!

あと、日頃からUnityを触ってないのでヴァージョンの依存関係がとても大変だと感じました。 今回だとAndroid Studioとの依存関係で苦労しました。(アンインストールも時間かかるんだね... いつも仮想環境とかいじってるからさくっとなくなるのに...)

ともあれこれからも色々探って開発できたらと思いますーー!

以上

o21o21.hatenablog.jp

【docker】ailed: port is already allocated のエラー解決

dockerを使用していて、コンテナを立ち上げたりダウンさせたり 繰り返していると、コンテナ立ち上げ時に以下のようなエラーにたまーーーに遭遇します。

ERROR: for container-name  Cannot start service service-name: driver failed programming external connectivity on endpoint container-name (5a7832c7cfcefba8c6b18542b8055ba74c306d115530a8ca65ff278a10be944c): Bind for 0.0.0.0:8081 failed: port is already allocated

ERROR: Encountered errors while bringing up the project

特に私の場合は、docker-composeを複数起動させていたので開発中になんか挙動がおかしいときがあります。 その都度containerを削除してもう一回立ち上げても同様のエラー...

仕方なしにdocker自体を終了させて、もう一度起動させても同様のエラー... こんなかんじでした。

エラーの内容としては、「port8081に既に割り当てられているから、このコンテナを起動できないよ」 みたいなかんじ。

「ああ、そうなのか〜」

たまに起こるエラーなので都度ググっていましたが、この際ちゃんと順序をおって 少し無理やりかもしれないけど対応するために、メモがてら解決策を書いていきます。

まず、調べる

エラー内容は大体理解できたので、なんのプロセスが対象のportで使用されているか調べる。

ということで、lsofコマンドを使う。(LiSt Open Files)

使用中のportでなく、「プロセスが使用している(開いている)ファイルを表示させる」 ってのがこのコマンドを使用する際のキーっぽいかんじがする。

ターゲットとなるportにアクセスしているプロセスを特定します。

$ lsof -i:8081

COMMAND   PID            USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
vpnkit  24677 user-name   22u  IPv4 0x5af6653a778ed6e1      0t0  TCP *:sunproxyadmin (LISTEN)
vpnkit  24677 user-name   23u  IPv6 0x5af6653a4a0f6841      0t0  TCP localhost:sunproxyadmin (LISTEN)

「お、確かになんか機能している...」

「vpnkit??」

調べてみると、vpnkitとは、 Docker for MacWindowsにおけるすべてのコンテナトラフィックに傍受ポイントを提供しているものらしい。 今回だとDocker for Macに該当するか。

dockerが急に終了したことで、portを掴んだままになっていたのかもしれない。 つまり、ゾンビプロセスってやつか!!ww (使ってみたかった用語...)

キルする

$ kill -9 PID

再度、docker-compose up したら無事立ち上がりました。

以上.

【VR】Oculus GoをPCへミラーリングさせる(無線)

先日Oculus Goが家に届きました!

私が購入したのは、これ。

www.oculus.com

64GBの方を選びました。 俗に言うスタンドアローンというVR機器になるようです。

カートに入れて、購入完了して数時間で発送しますね!というメールがきました。 大体到着まで5日間ほどで手元に届きました。

「けっこうはやいな!」

中身を見てみるとけっこうシンプルにまとまっていました。 メガネを日頃かけている方でも安心。 メガネをかけている人用のアクセサリーみたいなのも付いていて、 スマホのアプリからOculusの設定をする時に、装着ムービーも丁寧に紹介されていました。

(※ わかりやすいように、画像を載せようかと思っていたのですが、この記事では割愛します。が、その分丁寧に書いてくつもりです! また、後日画像を掲載させていくかもしれません。合わせて詳細も追記していければと思います。)

ここから、"PCへのミラーリング"について順をおって説明します。 今回は以下の記事を参考にさせて頂きました!さっそく先人の方に感謝...!!

Oculus Goの画面をPCにWirelessでミラーリング表示する

準備

まず、色々準備が必要です。 すんなりいけば大丈夫ですが、私はある設定で少し詰まりました... スマホアプリの開発を経験されている方はけっこうすんなりいきそう...

では、まず環境から。 あくまで私の環境ですので、他の環境では試していません。随時、自分にあった環境の設定方法をググる必要があるかもしれません。

環境: Windows10 (デスクトップPC) ブラウザ: Chrome

1. スマホアプリと連携

iPhoneならApp Storeで、AndroidならPlayストアOculusというアプリをダウンロード。

ログインを行い(アカウントを作成する必要があります)、手順に従って連携完了まで行う。

1-2. 開発者モードにする

ミラーリングするにしても、Unityで開発を行うにしても Oculusに対して開発者モードに設定する必要があります。

まず、以下のURLへ移動しログインします。

https://dashboard.oculus.com

そうすると、「新しい団体の作成」という画面が表示されるかと思います。 任意の団体名を記入し、送信し、完了させます。

完了すると以下の画面が出てくるかと思います。

f:id:o21o21:20180531111157p:plain

一旦これでOKです。

スマホアプリに戻ります。

画面下部メニューの"設定" -> 接続しているOculus(シリアルナンバー付)をタップ

-> ”・・・その他の設定” -> "開発者モード" -> スイッチを"有効化" (青色にする)

これで完了です。

2. Android Studioをインストール

続いては、PCの方です。

色々調べてみると、ミラーリングするだけだったらadbコマンド (Android Debug Bridge)が使用できていれば問題なさそうです。 なので、既にAndroidの開発などをされている方は、不要かもしれません。 ここでは将来的にUnityでOculus Goを開発することを目的にしたいので、一気にAndroid Studioをインストールします。

公式: Android Studio概要

以下のURLに行って、ダウンロードします。

Download Android Studio and SDK Tools  |  Android Developers

f:id:o21o21:20180531114053p:plain

  1. ダウンロードした.exeを開きます。
  2. 特に指定がなければ全部デフォルトでインストール&Nextボタン押下で大丈夫です
  3. 全てのインストールが完了すると、Android Studioを起動します
  4. ウィンドウ下部にある、Configure -> SDK Manager を選択
  5. 左メニューAndroid SDKを押下し、タブSDK Platformを選択。
  6. API Level19以上のものにチェックを入れます
  7. タブSDK Toolsを押下し、LLDBGoogle USB Driverにもチェックを入れます
  8. ウィンドウ下部のOKを押下し、Component Installerが開かれインストールが開始されます

ここまでできたらウィンドウを閉じて大丈夫です。

3. adbコマンドを試す

Android StudioをインストールしてSDKもインストールできれば、 Windowsコマンドプロンプトadbコマンドが使用できているでしょう。

ここで、付属していたUSBケーブルとPCを接続します!

私の場合はここでadbコマンドが使用できず、 "’adb’は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません"

と、出力...

「なんでやあああああぁぁ!!!」

とか言いながらググりました。

結果、環境変数のPATHが通っていないことが判明。 いつもやってんのに... 普段Windowsあんまり使わないから見落としてた。 (私の場合は早期に環境変数に気づきましたが、PATHがさらに間違っていたから時間とりましたww)

もしコマンドが使用できないなら、コントロールパネルを開いて、 システムとセキュリティ -> システム -> 左メニューのシステムの詳細設定 -> 詳細設定タブ環境変数(N) -> 環境変数PATHを選択して編集 -> 新規

ここで私は2つPATHに対して新規で追加。

C:\Users\ユーザ名\AppData\Local\Android\Sdk\platform-tools
C:\Program Files(x86)\Android\android-sdk\platform-tools

ちゃんとPATHがは自分で確認してください!! 上記のpathを参考にエクスプローラーからポチポチしていけば確認できかと思います。

そして、いざコマンド実行。

> adb devices
List of devices attached
xxxxxxxxxxxxxxxxxx        unauthorized

「NOOOOOOOOOぉぉぉぉぉ〜〜〜!!!」

なんか権限ないですやん...

まあ、ただadbコマンドは使用できていてOculusは認識しているっぽい。

ふむふむ

ってことは、どっかで権限を有効にしてやるかんじかなと、またググる

本来?というかAndroid端末であればどうやらUSBデバッグの許可の取り消しなるオプションがあるらしい。 ただ今回はOculusさんだぞ...

「どこを探してもない.... おおおおおおおおおお」

ってなってたらオキュラスのレンズから光が見えた!!!!www

USBデバッグの許可は、Oculusの画面から許可してあげる でしたwww

すげえバカでしたが、まあよしとする。

一応なのですが、adbサービスの再起動として、以下のコマンドを実行させます。

# 停止
> adb kill-server

# 起動
> adb start-server

ということで、もう一度デバイスの確認実行。

> adb devices

List of devices attached
xxxxxxxxxxxxxxxxxx        device

OK。

続いてOculusのIPを調べる。 無線LANなのでwlan数値を指定します。 ちなみにeth0は有線。

> adb shell ip addr show wlan0

出力された情報のinetの横にIPが確認できるかと思います。 おそらく192.168.xx.xxみたいに出てるかな?

adbでportを開放

portを開いていきます。 portの範囲は、5555~5585の範囲で奇数を指定したほうがよさそうです。 こちらがadb の仕組みです。

今回は公式で紹介されている通り5555で試します。

> adb tcpip 5555

これでUSBを介して、port5555でTCP/IP 接続をlistenするようにOculusを設定しました。

ここで、PCに接続しているOculusをUSBケーブルを抜きます

※ 接続切れている場合は、adb connect <IP>:5555 で接続にトライしてみてください。

Vysorの設定

ここまできたら、あとはVysor(バイザー)のインストールと設定のみです。

Vysorとは、ブラウザChromeで動くアプリケーションです。 スマホ画面をパソコンへミラーリングさせるアプリのようです。わたくし初見でした。

まず、ブラウザにインストールします。

Vysor - Chrome ウェブストア

すると、chrome://apps/ に追加されていると思います。

起動させます。

起動させたウィンドウ上部にOculusの接続が確認できていればOKです。 もし、確認できていなければ、Settingsの上にあるConnectボタンを押下。

コマンドプロンプトで確認したIPとportを指定して接続します。

これでOculus Goを開始すればミラーリングできているかと思います!!!!!

f:id:o21o21:20180601001606p:plain

自分では見えねえよってかんじですがww

Discordの画面共有で友人にみせてあげましたww

当人いわく、「画面見れてるよ!!! ただお前ほどの感動はない」

とのことでしたwww

やはりVRで見れないので、購入してVR体験してもいいかもしれませんね!!

次回は、Unityでのプロジェクト環境構築&作成考えています。

以上.