2020年4月11日土曜日

Eclipse EEのDynamic Web Projectにおいてライブラリを管理するためにGradleを使う方法

Eclipse EEのDynamic Web Projectにおいてライブラリを管理するためにGradleを使う方法は以下のとおりです.

  • Dynamic Web Projectを作成する.
  • プロジェクトのルートに以下に記すbuild.gradleファイルを作成する.
  • プロジェクトを右クリックして表示されるポップアップメニューで「Configure->Add Gradle Nature」を選択する.
  • ライブラリを更新した場合は,プロジェクトを右クリックして表示されるポップアップメニューで「Gradle->Refreash Gradle Project」を選択する.

ちょっと失われる設定もあるみたいですが,私的には問題ないので,問題がおきないうちはこの環境でWebアプリを作っていこうと思います.以前から構成管理に憧れていて,ずっとやりたかったんだけど,やっと踏み出すことができて良かったです.

plugins {
id 'war'
id 'eclipse-wtp'
}
repositories {
jcenter()
}
dependencies {
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
implementation 'org.json:json:20190722'
compile files('../XXXXXX/XXXXXXXX.jar')
//compile fileTree(dir: "WebContent/WEB-INF/lib", include: '*.jar')
}
project.webAppDirName = 'WebContent'
sourceSets {
main {
java {
srcDir 'src'
}
resources {
srcDir 'src'
}
}
}
eclipse {
classpath {
defaultOutputDir = file('build/classes')
file {
whenMerged {
cp -> cp.getEntries().forEach {
cpEntry -> if (cpEntry.kind == 'src') {
cpEntry.output = cpEntry.output.replace('bin/main', 'build/classes')
}
}
}
}
}
wtp {
component {
contextPath = 'XXXX'
}
}
}
view raw build.gradle hosted with ❤ by GitHub

「org.json.JSONException: Unterminated string at XXXX」に対処する方法

org.jsonライブラリを使ったコードでJSON文字列を処理した際に

org.json.JSONException: Unterminated string at XXXX
という例外に出くわしました.この例外は,文字列に直接記述することが許されていない文字を文字列に記述した際に生じるみたいです.そういうわけで,この例外に対する対処方法は,文字列に直接記述することが許されていない文字については,エスケープシーケンスで記述するということになります.

JSONの仕様[1]によると,値としての文字列に直接記述できる文字は,以下のとおりです.

  1. 0x20-0x21
  2. 0x23-5B
  3. 0x5D-10FFFF

上記の範囲に収まらない文字については,エスケープシーケンスで記述する必要があります.例えば,値として「0\t1\n」という文字列を記したい場合,「0x30,0x09,0x31,0x0a」と記すとNGなので,「0x30,0x5c,0x74,0x31,0x5c,0x6e」と記す必要があります.(0x30='0',0x31='1',0x09='\t',0x0a='\n',0x5c='\',0x6e='n',0x74='t').

今回の例外は,そのことを知らず,エスケープシーケンスで記す必要のある文字を直接記してしまったために発生したということになります.

[1]RFC8259, https://tools.ietf.org/html/rfc8259

2020年4月1日水曜日

Oculus GoでVideoPlayer越しにビデオを再生できない問題を解消する方法

VideoPlayerを使ってビデオを再生するOculus Go用のプログラムを作成した際に,次のメッセージが表示されて再生できないという問題に出くわしました.

Unity : AndroidVideoMedia: Error opening extractor: -10000

数日間試行錯誤を続けたところ,ビデオのURLに原因があることをつきとめました.

今回デバッグのために作成したコードは以下のとおりです. このコードの14行目でビデオのURLを指定しているのですが,それが「https://192.168.1.5:8443/test.mp4」のときに上記のエラーが発生します.このエラーを解消する方法は,ビデオを「https://hogehoge/test.mp4」というURLでアクセスできる場所に置き,そのURLをvideoPlayer.urlの値に指定するというものです.そうすると,ビデオが再生されるようになります.

原因はURLにあるところまではわかったのですが,URLのどこが原因かは定かではありません.なんとなくですが,ポート番号が怪しい(ポート番号の指定は無視されデフォルトのポート番号が使われているような)気がしています.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
public class BehaviourScript : MonoBehaviour
{
public VideoPlayer videoPlayer;
void Start()
{
this.videoPlayer.errorReceived += this.ErrorReceived;
this.videoPlayer.prepareCompleted += this.PrepareCompleted;
this.videoPlayer.url = "https://192.168.1.5:8443/test.mp4";
this.videoPlayer.Prepare();
}
// Update is called once per frame
void Update()
{
}
private void ErrorReceived(VideoPlayer videoPlayer, string message)
{
Debug.Log(message);
}
void PrepareCompleted(VideoPlayer videoPlayer)
{
videoPlayer.prepareCompleted -= this.PrepareCompleted;
videoPlayer.Play();
}
}