helloworlds

not a noun, it's a verb

【AWS】Amazon Linux 2だよ〜

今回は少し内容が薄めです...

既にITに精通している方であればご存知だと思います。

去年の冬にAmazonが公式から発表されました。

Amazon Linux 2がきましたーーー!!!

Amazon Linux 2 のご紹介

これが問題とあんる会社は多いのではないでしょうか? 問題というか、ヴァージョンの移行にコミットしなければならず、現状行っている作業が中断なんてことも...??

こういうときにエンジニア不足している会社だと大変ですね。。。

1つ例を挙げてみます。

Elastic Beanstalk

Elastic Beanstalkを使用している方は多いかと思います。 また、開発ではDockerを使用していて、例えばこんな風にDockerfileに記述している。

FROM amazonlinux:latest
・
・
・
・

いつも通りにローカル環境を整えていて、

「あれ? なんか動かないぞ。。。」

なんてこと、あると思います!

これは、 latest と記述しているので、最新のAmazon Linuxヴァージョンを取得しにいっているので、

要はAmazon Linux 2になっているのですね!

FROM amazonlinux:1

こんなかんじでヴァージョンの指定しないと、前と同じ環境は作成されません。

DockerのコンテナイメージもAmazon Linux2を提供しています。

いい面もあります。

Dockerを使用しているなら、Amazon Linux2を試すこともできますね。 言語のバージョンも合わせてアップデートするなら今のうちかもしれません。。。

また、こちらの記事にAmazon Linuxとの違いがうまくまとまっている記事があります。

Amazon Linux 2 の登場と、Amazon Linux との違い、移行方法などをQ&Aから抜粋したメモ

Amazon Linux2とAmazon Linuxの違いについて(メモ)

Amazon Linux自体はこちらのヴァージョンを最後としています。

利用可能になりました – Amazon Linux AMI 2017.09 | Amazon Web Services ブログ

今のヴァージョンの最終的なサポート期間は、 セキュリティアップデートはAmazon Linux 2の最終LTSビルドが発表されてから2年間提供されます。

あっという間というかんじですね..

ひとまず、何か新規プロジェクトを構成するならAmazon Linux2ですね!!

以上.

【npm】configパッケージについて

よくnode.jsで開発しているとconfigパッケージを使用して、 環境別の設定値を切り分けることが多いと思います。

DBの接続情報であったり、APIとかも環境によってわけて使う時などに便利です。

www.npmjs.com

使い方も簡単ですよね!

$ npm install config

あとは、/config というディレクトリを作成して、 環境名のファイルを作成するだけで、コード内で config.get('xxxx.yyyy') みたいに書くだけで値を参照できます。

nodeのプロジェクトをやっていてこのconfigは便利なのですが、 よくdefault.jsonとdevelopment.jsonはどちらが優先されるの? とか、上書きされるの?とか忘れてしまいます。。。

なので、今回はちゃんと確認してみた!という記事になります。

node_moduleの中身を確認!

ということで、configの中身を確認してみました。 (すぐできるのに今まで怠っていました。。。)

version : "^1.30.0"

node_modules/config/lib/config.js

ここに記載されていました。

Application configurations are stored in files within the config directory of your application. The default configuration file is loaded, followed by files specific to the deployment type (development, testing, staging, production, etc.).

訳すと、

アプリケーション構成は、アプリケーションのconfigディレクトリ内のファイルに格納される。デフォルト設定ファイルが読み込まれ、続いて 特定の種類にファイル(development, testing, staging, productionなど)に固有のファイルによって異なる。

なるほど、ってことは、 「さきにdefault.jsonが読み込まれる」ってことだ。

なので、default.json → development.json みたいな順番で、 仮に同じ値(ネスト構成が同じ)があれば、上書きになるってことだ。

あー、すっきりしましたw

以上

【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