ちら帳

喉元を過ぎると熱さを忘れる自分の為の、ちら裏メモ帳ブログです。

pipをグローバルで使っていた環境でyumで入れたパッケージがおかしくなった話

※過去に自分が他の媒体で書いていた記事を移動してきたものなので、情報が古い可能性があります。ご注意ください。

yumとpipの競合

pipのインストール状況によりますが、yum経由でインストールしたPythonパッケージも、pipでグローバルにインストールしたパッケージも同じディレクトリにインストールされてしまうことがあります(例:/usr/lib/python2.7/site-packages/)

このような状態でグローバルでpipを使用すると、yum経由でインストールしたPythonパッケージを上書きできてしまいます。

競合によって発生する問題

yumでインストールしたパッケージがエラーで利用できなくなることがあります。

また、yumからはpipがPythonパッケージを更新したことを検知できないため、yumによるパッケージの管理で一部の依存関係が自動で解決できなくなります。

実際に起きたpipによるPythonパッケージの上書きが原因となった問題

SSL証明書の更新で利用しているcertbotがある日、モジュールの不整合を起こすようになりました。

ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer. · Issue #5534 · certbot/certbot · GitHub

一見、pyOpenSSLのバージョン不整合が問題のようですが、実際はyumのrequests, urllib3, sixのPythonパッケージをpipで上書きしてしまったのが原因でした。

問題となっているパッケージをpipでアンインストールして、yumで再インストールしたところ、エラーが発生しなくなりました。

sudo pip uninstall requests
sudo pip uninstall urllib3
sudo pip uninstall six

sudo yum reinstall python-requests
sudo yum install python-urllib3
sudo yum install python-six

競合を起こさないようにするには

システムにpipをインストールせず、仮想環境内でのみpipを扱うようにします。

少なくともCentOSは7でもシステムの使っているPythonが2.7.5なのでpipが付属していません(執筆当時の情報なので変わる可能性があります) そのため、python2-pipなどをインストールしなければ、誤ってシステムで使ってしまうことはありません。

yumpython-virtualenvをインストールします。

sudo yum install python-virtualenv

仮想環境を作り、その中でpipを使うようにします。

virtualenv myenv
source myvenv/bin/active

virtualenv内で使えるpipはおそらくバージョンが古いため、開発等をおこなう前にアップデートをおこないます。pipが使用するsetuptoolsのパッケージもアップデートします。

pip install -U pip
pip install -U setuptools

すでに競合が起きている場合

競合の見つけ方

rpm -qV {パッケージ名} でパッケージのファイルの検証ができます。 元のパッケージから変更されている箇所があれば、そのファイルの変更状態が出力されます。変更が無ければ何も出力されません。

$ rpm -qV httpd
S.5....T.  c /etc/httpd/conf.d/autoindex.conf
S.5....T.  c /etc/httpd/conf/httpd.conf
  /run/httpd/htcacheclean が見つかりません。 (許可がありません)
..?......    /usr/sbin/suexec
  /var/cache/httpd/proxy が見つかりません。 (許可がありません)

yumで管理しているpythonのパッケージ名が大体わかっているのであれば、検証用のシェルを書いて一気に処理を回してしまっても良いかもしれません。

#!/bin/sh

for package in `rpm -qa | egrep "python|pytz|yum"`
do
    echo $package
    rpm -qV $package
done

あるいはpipでパッケージをインストールした時のログが残っているのであれば、内容からpipが上書きした可能性のあるパッケージにあたりをつけることができます。

# ログ中にこの記述がある場合、yumのパッケージをpipで上書きしている可能性があります
Found existing installation: urllib3 1.10.2
    Uninstalling urllib3-1.10.2:
      Successfully uninstalled urllib3-1.10.2

競合の直し方

pipでアンインストールして、使っているパッケージ管理ソフトで再インストールします。

pipはyumのように履歴からロールバックができないので、現在のパッケージのインストール状況を復元できるようにバックアップを取っておきます。

pip freeze > packages_requirements.txt

pipでパッケージをアンインストールします。 依存パッケージは自動でアンインストールされないので、必要があれば依存するパッケージも手動でアンインストールします。

sudo pip uninstall urllib3

yumでパッケージを再インストールします。 yum reinstallでエラーが起こる場合はコマンドをyum installに変更してください。

sudo yum reinstall python-urllib3

pipのアンインストール

yumからpipをインストールした場合は、yumでアンインストールします。 pipに依存するパッケージも一緒に削除されるので、依存関係をよく確認してからremoveを実行してください。

sudo yum remove pip

get-pip.pyを実行してpipをインストールした場合は、pipコマンドでpipをアンインストールします。 インストール時にpipとwheelがまとめてインストールされているはずなので、wheelも一緒にアンインストールします。

sudo pip uninstall wheel
sudo pip uninstall pip

Pythonのバージョンによっては、標準でpipが付属していますが、その場合はアンインストールはしないようにしてください。

参考ページ

Tadej Janež – Don't mix yum/dnf and pip for installation of system-wide Python packages

[Fix] ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer. - GetPageSpeed

Gitで作業中のブランチを最新化するときのあれこれ

※過去に自分が他の媒体で書いていた記事を移動してきたものなので、情報が古い可能性があります。ご注意ください。

自分用の備忘録です。

開発環境のdevelopブランチの内容を自分のブランチに取り込みたい

# コミットしていないファイルがあるときは退避
$ git stash

# origin/developの内容を取り込み
$ git pull --rebase origin develop

# 退避したファイルがある場合はもとに戻す
$ git stash pop

プロジェクトの規約などでrebaseが使えない場合はこっち。

# コミットしていないファイルがあるときは退避
$ git stash

# origin/developの内容を取り込み
$ git fetch
$ git merge origin/develop

# 退避したファイルがある場合はもとに戻す
$ git stash pop

git fetch, git merge origin/developとしている部分はgit pull origin developに置き換え可能。

pull --rebaseで他のブランチを取り込もうとしたら、コンフリクトしたので解消したい

# コンフリクトファイルの確認
$ git status
$ git diff [file path]

# a. コンフリクトしている箇所でorigin/developの内容だけを採用したいときはこちら
$ git checkout --ours [file path]

# b. コンフリクトしている箇所で手元のブランチの内容だけを採用したいときはこちら
$ git checkout --theirs [file path]

# c. 両方のブランチの変更を取り入れたいときはmergetoolやエディタでコンフリクト箇所を修正する
$ git mergetool

# git mergetoolを使う以外の方法でコンフリクトを直したら、該当ファイルをaddする
$ git add [file path]

# rebaseを続行
$ git rebase --continue

他のブランチの内容を取り込もうとしたら、Your local changes to the following files would be overwritten by mergeとメッセージが出た

コミットも退避もしていないファイルがあるときに出る。

# 不要な変更であればcheckoutで差分をなかったことにする
$ git checkout [file path]

# 取り込み中はいったん退避するならstash
$ git stash

# 取り込み前にコミットしていいならコミット
$ git add [file path]
$ git commit

もっと細かい単位でaddやcheckoutをおこないたい場合はgit checkout -p [file path]git add -p [file path]を利用する。

git rebase --continueしたら、No Changes - did you forget to use 'git add'?とメッセージが出てrebaseが続行できない

特定のコミットを取り込もうとしたら何も変えるところがなかったため、エラーが出ている。 該当コミットの取り込みをスキップする。

# addしていないコンフリクト解消済みファイルなどないか確認
$ git status
# 今取り込もうとしているコミットをスキップする
$ git rebase --skip

rebaseによる取り込み操作を途中でやめたい

$ git rebase --abort

pull(rebaseなし)やmergeで他のブランチを取り込もうとしたら、コンフリクトしたので解消したい

# コンフリクトファイルの確認
$ git status
$ git diff [file path]

# a. コンフリクトしている箇所でorigin/developの内容だけを採用したいとき(rebaseとは逆になるので注意)
$ git checkout --theirs [file path]

# b. コンフリクトしている箇所で手元のブランチの内容だけを採用したいときは(rebaseとは逆になるので注意)
$ git checkout --ours [file path]

# c. 両方のブランチの変更を取り入れたいときはmergetoolやエディタでコンフリクト箇所を修正する
$ git mergetool

# git mergetoolを使う以外の方法でコンフリクトを直したら、該当ファイルをaddする
$ git add [file path]

# 最後にコミットしてpull/mergeを完了する
$ git commit

rebaseやpull/mergeによる取り込み操作を完了したが、やっぱり取り込み前に戻りたい

# いくつ前の操作に戻ればいいか確認
$ git reflog
# n番目の操作に戻る
$ git reset --hard HEAD@{n}

git merge を使っているときはこちらでも戻れる。

# どのコミットに戻ればいいか確認
$ git log
# merge前の操作に戻る
$ git reset --hard [mergeコミットの一つ前のコミットのハッシュ値]

退避していたファイルを戻したらコンフリクトした

# a. stashの内容を無視する
$ git checkout --ours [file path]

# b. stashの内容でファイルを上書きする
$ git checkout --theirs [file path]

# c. 両方の変更を取り入れたいときはmergetoolやエディタでコンフリクト箇所を修正する
$ git mergetool

# git mergetool以外の方法でコンフリクトを解消したときはgit addする
$ git add [file path]

# コンフリクトを解消したファイルをまだステージしたくないときは取り下げる
$ git reset [file path]

# コンフリクトしたときはstashがdropされないので消しておく
$ git stash drop

Laravel5.5でAmazon SESのMessage-IDをロギングする

※過去に自分が他の媒体で書いていた記事を移動してきたものなので、情報が古い可能性があります。ご注意ください。

SESのMessage-IDとは

Amazon SES へのリクエストが成功すると、Amazon SES は成功のレスポンスを送信者に返します。このメッセージには、リクエストを一意に識別する文字列であるメッセージ ID が含まれます。メッセージ ID を使用すると、送信した E メールの識別や、送信中に発生した問題の追跡を行うことができます。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/sending-email-with-ses.html

※送信中に発生した問題の追跡については、バウンスメールをSNSに転送して内容を確認する方法もあります。

LaravelでSESのMessage-IDをロギングする

メール送信イベントをフックし、メールのヘッダーからMessage-IDを取得してロギングします。

<?php
 
namespace App\Listeners;
 
use Illuminate\Mail\Events\MessageSent;
use Log;
 
class LogSentMessageId
{
    /**
     * Handle the event.
     *
     * @param  MessageSent  $event
     * @return void
     */
    public function handle(MessageSent $event)
    {
        $message = $event->message;
        $messageId = optional($message->getHeaders()->get('X-SES-Message-ID'))->getFieldBody();
 
        foreach ($message->getTo() as $toEmail => $toName) {
            Log::info('To: '.$toEmail.', ID: '.$messageId);
        }
    }
}
<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
 
class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\Event' => [
            'App\Listeners\EventListener',
        ],
        'Illuminate\Mail\Events\MessageSent' => [
            'App\Listeners\LogSentMessageId',
        ],
    ];
 
    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();
 
        //
    }
}

SESのMessage-IDにはこういう問題もありますが、送信後に取得しているのでたぶん大丈夫なはず…です。 SES SMTP インターフェイスで Message-ID が上書きされる問題と対応 - Qiita

SESを使っていない時はIDがnullになります。

銀VRでVR間違い探しのお手伝いをしてきました

ブログではご無沙汰しております。ちらです。 今年もよろしくお願いします。

昨年の夏以降は、色々と忙しくて全然ブログを更新できませんでしたが、春くらいからは、また少しずつ記事を上げていきたい所存です。

さて、そんな風に私が毎日を流されるように過ごしているなか、友人のしち君は頑張ってVRコンテンツ開発をしていたようで、いつの間にかVR間違い探しなるものを作っていました。偉い。

自分も何か作らなきゃなあと思いつつ、仕事に追われてなかなか作業に着手できない日々を過ごしていると、しち君は更に勉強会にコンテンツを展示したり、銀VRに出展の申し込みをしたりしていました。とっても偉い。

そんな中、しち君の友人の中でたまたま今日の予定が空いてた私が、ついうっかりVR間違い探しの展示のお手伝いを引き受けることになりまして、本日は銀座まで行ってきました。

VR間違い探しには最初のテストプレイぐらいしか携わっていませんし、アテンドなんて全く向かない人間なので、本当についうっかりという感じです。

まあ私のどうでも良い話は置いておいて、本日はたくさんの方にVR間違い探しを体験していただけました。 また、アンケートの方もご協力ありがとうございました。回収率は計算していませんが、回答数を見る限り高そうです。

改めまして、本日は弊ブースにお立ち寄りいただき、ありがとうございました。 あと私から拙いゲーム説明を受けた皆様、嫌な顔ひとつせずに説明を聞いてくださり、ありがとうございました。

これからは自分のアウトプットももっと増やせていけたらいいなと思います。 今後ともよろしくお願いします。

追記: すきまアワードでVR間違い探しが大賞に選ばれました。おめでとうございます。

Chromeが不調でなかなかCluster.に入れなかったのですが、ちょうど入ってすぐぐらいに大賞の発表だったので、 ついテンションが上がってコメントに一人で草を生やしてしまいました。

React VR 番外編:THETA Sで撮った写真や動画を使う

こんにちは。

TourSampleも公開されたことですし、そろそろチェスボード以外の背景が必要とされている時期なのではないかと思うので、今回はTHETAで撮った写真や動画をReactVRで使うお話をしたいと思います。

とはいっても、React VR要素がほぼ0に近しいので、今回は番外編としました。 あと、別にリコーの回し者じゃないです。

準備

パソコン用アプリケーションをダウンロードしておきます。

ダウンロード | RICOH THETA

上記ページから基本アプリをダウンロードしておいてください。

写真

まずはカメラ内の画像をPCに移します。 カメラとPCをケーブルで繋いで画像をインポートするのが手っ取り早いかと思います。

次に基本アプリを使って写真に天頂補正をかけます。

天頂補正の機能を使うと撮影の際に傾いてしまった写真を補正することができます。

Windows用の基本アプリでの天頂補正】

  1. 基本アプリを立ち上げて、ビューアに画像をドラッグ&ドロップします。
  2. ファイル>天頂補正書き出し>XMP付きJPEGデータを選択して適当な名前でファイルを書き出します。

Mac用のアプリは試していませんが、同じ要領で補正ができるのではないかと思います。

補正済みの画像を書き出せたら、React VRのプロジェクト内のstatic_assetsディレクトリ内に画像を置いて、Panoコンポーネントで画像を表示させましょう。

動画

動画も写真と同じようにPCに移してきましょう。

写真と同じ要領でPCに動画を移してくると気付くことがあります。 魚眼画像を2つ並べたような動画になっているのです。

全天球動画として表示するには正距円筒図法の映像になっている必要があります。

専用ビューア以外では全天球表示できないのかと悩みましたが、基本アプリを使うことで魚眼画像の動画を正距円筒図法の動画に変換することができました。

f:id:chira_pym:20170812013228p:plain

ちなみに天頂補正のオプションはデフォルトでチェックがついています。 特に理由がなければつけておいた方がよいと思います。

これで正距円筒図法の動画が出力できます。 このあたりの技術の詳細が気になる方はこちらをご確認ください。

jp.ricoh.com

動画を変換できたら、React VRのプロジェクト内のstatic_assetsディレクトリ内に動画を置いて、VideoPanoコンポーネントで動画を表示させましょう。

全天球動画の再生に関しては公式サンプルがあるので、以下のページを参照してください。サンプルをコピペするだけで動画の再生ができると思います。 github.com

注意点としてフルHDで撮影してもHMDで動画を見る場合には映像は粗めになります。

これに関しては、以下の記事のような試みをされている方がいらっしゃるので、画像処理能力の高いマシンをお持ちの方は参考にされてみてはいかがでしょうか。 izm-11.hatenablog.com

THETA のモデルについて

THETAのサイトではTHETA SとTHETA SCの2つのモデルが紹介されています。 最新モデルはSCですが、Sが最上位モデル、SCはスタンダードモデルの位置づけです。

色々と違いがあるようですが、5分以上の動画を撮りたいのであればSを購入した方が良いです。

SCの購入を検討している方は、9月から初音ミクさんコラボモデルの受注販売が開始されるので、それを待ってもいいのかもしれません。 japanese.engadget.com

またSの購入を検討している方も、4k動画、360°空間音声に対応した次世代モデルが年内に発売予定との話もあるので、こちらの購入を検討するのも良いかと思います。

今日のひとこと

全天球カメラもいいけれども、全天球CGを作れるようになった方が制作の幅が広がる気がします。

React VR: 最近の活動

最近ブログの更新をさぼりがちなちらです。 今回はとりあえず活動履歴的なものを更新してお茶を濁したいと思います。

MMDモデルの表示に挑戦

とはいっても、ツールで手動でMMDモデルをOBJとMTLに変換してVR空間内に表示させようとしただけなのですが、それでもかなり苦労しました。 結局、PMDファイルはアクセサリーとかを外して、objのデータを少しいじって、テクスチャを上下左右反転させたら、かろうじてうまくいきました。PMXファイルもやってみましたが、足のテクスチャがうまく表示できませんでした(´・ω・`)

Pairsサンプルを動かす

React VRに新しくPairsというサンプルが追加されていたので動かしてみました。

READMEにはA real-time, multiplayer virtual reality matching pairs game と書いてあったのですが、pairs gameが分からなくて、動かすまで一切なんのゲームかわかりませんでした。神経衰弱ゲームって英語でpairs gameっていうんですね。

ターン制じゃないマルチプレイ神経衰弱ゲームで、まだまだ開発途中なのか、ゲームとしてはあまり完成されていませんでした。 ローカルで動かした感じ4人までマッチングできましたが、すぐ通信が切れてしまいました。

見た目が簡素なのであまり面白味はないかもしれませんが、マルチプレイのコンテンツを作る際には参考になりそうな気がします(ソースをちゃんと読んでいないので詳細が語れない)

github.com

ツアーコンテンツを作ってみた

GitHubにいくつかReact VRで作ったツアーコンテンツがあったので、見様見真似で自分も作ってみました。 会社周辺を撮ったパノラマ画像を使って、駅から会社までの間を移動できるコンテンツを作ったのですが、家で見たらすっごくげんなりしました。

ちなみに完成してから数日後、React VRのリポジトリにもTourSampleが追加されたのでそちらも動かして遊びました。

画面遷移やUIの作り方など色々と参考になるので、 こちらはぜひ一度は動かしてみるべき&ソースを読むべきサンプルだと思います。

github.com

WebVRのUIについて考えてみた

WebVRのUIはどういうのが使いやすいのかを色々と考えてみましたが、結局のところ、とりあえずマテリアルデザインみたいな動きとかしてればいいのかなと思いました。

UIはインタラクティブであった方が分かりやすいですし、ユーザーも不安にならないと思うので、適度にアニメーションは入れた方が良いと思います。個人的には少なくともVrButtonのonEnterには必ずアニメーションを入れるようにしたいと思っています。

↓注視すると大きくなる画像

↓注視するとモーダルに変形するボタン

あとローディングに時間のかかるような場面で単にくるくるするアニメーションを使うのはやめた方がいいではないかと思っています。 VRって処理が重いイメージがあるので、読み込み経過が分からないと結構不安になります。

活動を振り返る

Reactの知識がほぼなく、趣味の範囲でやっているため、なかなか思うようにコンテンツが作れてないのが現状です(´・ω・`) JSフレームワークを勉強するならVue.jsと思っていたのですが、VRのためにReactの勉強を頑張ってみようと思います。

また、今回紹介した活動内容ですが、いくつかは気が向いたら詳細な記事を書きたいと思っています。 その頃にはやった内容を忘れていそうですが。

ではでは。

今日のひとこと

スプラトゥーン2を買いました。進捗よさようなら。

React VR : 仮想キーボードを使った入力

React VRで仮想キーボードを扱えるパッケージを見つけたので、使ってみました。

www.npmjs.com

外観はこんな感じになります。キー入力はカーソルを合わせてクリックする方式です。

f:id:chira_pym:20170621205247p:plain

使い方

インストー

React VRのプロジェクト下に移動して仮想キーボードのパッケージをインストールします。

npm install react-vr-textinput

react-vr-textinput/static_assets 内にあるup.pngとdown.pngをプロジェクト内のstatic_assetsにコピーしておきます。

カーソルの設定

キーボードを使うにはカーソルが必要になります。 注視カーソルで入力するのはつらいので、コントローラーかマウスを使うことにします。

コントローラー

コントローラーは公式のサンプルにあるThreeDOFRayCasterを利用すると簡単に実装できます。

github.com

コントローラーの表示はこんな感じになります。

f:id:chira_pym:20170701191344p:plain

マウス

マウス用のraycasterはもともと用意されているものを拡張したクラスを用意します。

import {
    MouseRayCaster
} from 'ovrui';

export default class MyMouseRayCaster extends MouseRayCaster {

    drawsCursor() {
        return true;
    }
}
client.js

raycastersオプションに各raycasterを指定します。加えてコントローラーの描画にsceneの指定も必要になります。

// Auto-generated content.
// This file contains the boilerplate to set up your React app.
// If you want to modify your application, start in "index.vr.js"

// Auto-generated content.
import {VRInstance} from 'react-vr-web';
import ThreeDOFRayCaster from '../src/ThreeDOFRayCaster';
import MyMouseRayCcaster from '../src/myMouseRayCaster';
import * as THREE from 'three'

function init(bundle, parent, options) {
  const scene = new THREE.Scene();
  const vr = new VRInstance(bundle, 'TestInput', parent, {
    // Add custom options here
    raycasters: [
        new ThreeDOFRayCaster(scene),
        new MyMouseRayCcaster()
     ],
     scene: scene,
     cursorVisibility: 'auto',
    ...options,
  });
  vr.render = function() {
    // Any custom behavior you want to perform on each frame goes here
  };
  // Begin the animation loop
  vr.start();
  return vr;
}

window.ReactVR = {init};

入力フィールドの表示

サンプルコードをもとに仮想キーボードの入力フィールドを表示します。 Submitを押すとフィールドの隣に入力した文字列が表示されるようになっています。

import React from 'react';
import {
  AppRegistry,
  asset,
  Pano,
  Text,
  View
} from 'react-vr';
import TextInput from 'react-vr-textinput'

export default class TestInput extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      text : ''
    };

    this.submitHandler = this.submitHandler.bind(this);
  }  
  
  submitHandler(string) {
    this.setState({text : string});
    console.log('the text received by the submitHandler is ' + string);
  }
   
  render() {
    return (
      <View>
        <Pano source={asset('chess-world.jpg')}/>
        <TextInput onClick={this.clicked} onSubmit={this.submitHandler} rows={1} 
        cols={20} x={-1} y={0.2} z={-1.5} rotateY={null} rotateX={null} textColor={'black'} backgroundColor={'pink'} keyboardColor={null} keyboardOnHover={null}/>
        <Text style={{transform: [{ translate: [0.2, 0.63 , -1.5]}]}}>{this.state.text}</Text>
      </View>

    );
  }
}

AppRegistry.registerComponent('TestInput', () => TestInput);

動作確認

コントローラー

f:id:chira_pym:20170701223222g:plain

マウス

2回目の入力でテキストの位置がおかしくなっていますが、マウス入力だからというわけではなく、 コントローラーで入力しても同じことが起きます。

f:id:chira_pym:20170701223048g:plain

遭遇した不具合

  • 入力フィールドが表示されず、TextInputがないとエラーが出た
      node_modules/react-vr-textinput/index.jsの内容に不備がありました。
//module.exports = require('./src/TextInput'); 
module.exports = require('./src/textInput');

追記:Issueを書いたら迅速に直してもらえました。ありがたや。

  • VRモードにすると入力フィールドが上の方に表示される
      HMDを被った瞬間、上の方に行ってしまうのはなぜなのでしょう。

  • VRモードにするとキーボードにカーソルが合わなくなる
      コントローラーから注視カーソルに変えたら直ったので、コントローラー側の実装とかみ合っていなかったようです。

  • VRモードでカーソルの動きにhoverのアニメーションがついてこれていない
      しばらく待っていると、あとからカーソルを合わせた順にキーが点滅していくので、表示の処理が追いついていないっぽいです。

  • VRモードでたまに入力内容がフィールドに反映されない
      おかしいなと思ってHMDを外して画面を見てみると、ちゃんと入力されているので、表示が間に合っていないようです。

GitHubの方に今後は処理速度の向上を目指していくみたいな記述があったので、アップデートに期待ですね。

This module is fully functional. Our next goal is to refactor for speed and also further enhance customizability through providing users even more props. We are also working on adding auto-complete support for faster typing. This will be an optional component that users can select to enable with their text input box and virtual keyboard. Please feel free to ask for additional functionality and we will try to add features as soon as possible.

今日のひとこと

ZenFone ARが発売されたせいか、最近 DayDreamやTangoについてのツイートを見かける機会が多くなりました。

楽しそうでうらやましいです。