2020年4月11日土曜日

「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のどこが原因かは定かではありません.なんとなくですが,ポート番号が怪しい(ポート番号の指定は無視されデフォルトのポート番号が使われているような)気がしています.

2020年3月30日月曜日

SPRESENSEで自作MQTTパブリッシャを動作させる方法

SPRESENSEで自作MQTTパブリッシャを動作させてみようと下記の「MqttPublisherTest.ino」というプログラムを実行したところ, 次のようなエラーに出くわしました.

mosquitto
New connection from 192.168.1.21 on port 1883.
Client  has exceeded timeout, disconnecting.
シリアルモニタ
failed, rc=-4

どうも使っているライブラリが怪しかったので,「SparkfunESP8286WiFi.cpp」というコードの(1)の部分を修正したところ, 上記のエラーは解消することができました, ただ,今度は次のような別のエラーが表示されるようになりました.

mosquitto
New connection from 192.168.1.21 on port 1883.
New client connected from 192.168.1.21 as ESP8266Client-0 (p2, c1, k15).
Socket error on client ESP8266Client-0, disconnecting.
シリアルモニタ
failed, rc=-1

処理内容を細かくチェックすると,MQTTブローカからの返信を処理していない箇所があったので, 「SparkfunESP8286WiFi.cpp」というコードの(2)の部分を追加したところ, シリアルモニタのエラーは解消することができました.

mosquitto
New connection from 192.168.1.21 on port 1883.
New client connected from 192.168.1.21 as ESP8266Client-5165 (p2, c1, k15).
Socket error on client ESP8266Client-5165, disconnecting.
シリアルモニタ
なし

引き続き処理内容を細かくチェックすると,コネクションの状態を返すべきところがWiFiの接続状態を返している箇所があったので, 「SparkfunESP8286Client.cpp」というコードの(3)の部分を修正したところ, ようやく期待通りの動作をさせることができました.

2019年10月31日木曜日

Tomcat 9がEclipseから起動しない問題を解消する方法

インストーラー付きのTomcat 9をWindowsにインストールし,Eclipseから起動すると次のメッセージが表示されて失敗する問題に出くわしました.

Starting Tomcat V9.0 Server at local host has encountered a problem.
This server cannot be started because one or more of the ports are invalid.
Open the server editor and correct the invalid ports.

この問題の解消方法をメモしておきます.

  • インストーラーでインストールしたTomcat 9を削除
  • Tomcatのサイトから「64bit Windows zip」をダウンロード
  • ZIPファイルを展開し,所望の場所にインストール
  • Eclipseの「Preferences > Servers > Runtime Environments」でTomcat 9を登録
  • 「Servers」ビューにTomcat 9を登録
  • Tomcatを起動

2019年5月2日木曜日

Eclipse上でポート番号を指定してApp Engineを起動する方法

Eclipse上でポート番号を指定してApp Engineを起動する方法をメモしておきます.

手順は以下の通り.

1Project Explorer内の当該プロジェクト上で右クリック.
2ポップアップメニューにある「Debug As」と「Debug on Server」をこの順番で選択.
3Debug on Serverダイアログで「Manually define a new server」を選択.
4「Select the server type」内のツリーメニューにある「Google」を「App Engine Standard」をこの順番で選択.
5「Server port」に指定したいポート番号を入力.
6「Finish」を押下.

ちなみに上記の手順はGoogle App Engine Javaのものです.他の言語の場合は異なるかもしれません.

2018年6月12日火曜日

SSHポートフォワーディング(ローカルフォワード)を利用する方法

SSHポートフォワーディング(ローカルフォワード)を利用する方法をメモしておきます.

ローカルマシンの8080ポートからリモートマシン(remote)を経由してターゲットマシン(target)の80番ポートにアクセスする場合のコマンドは以下の通り.

$ ssh -L 8080:target:80 remote

2018年5月26日土曜日

読了:アテンション

「アテンション」を読みました.

Ben Parr: アテンション, 飛島新社, 2016-03 [アマゾン, 楽天]

本書についてのメモを以下に記しておきます.

情報が満ち溢れる現代において,人々の注目は風のある日の風見鶏のようにあちらこちらに向けられている.1つの対象に対して向けられる注目の時間は昔より少なくなっているのだ.そのような状況において,1つのものに注目を寄せ続けてもらうのは難しい.だから,注目について理解し,その性質に従って適切に振る舞うことが重要になってくる.

注目は即時,短期,長期の3種類に分類される.即時の注目とは,まわりの世界に対する人々のすばやい無意識の反応のことである.この注目は,ほんの数秒しか持続しないので,すぐに忘れ去られるか,短期の注目に移るかのいずれかとなる.次に,短期の注目とは,特定の出来事や刺激に対する人々の短期的な集中のことである.この集中を持続させることができれば,長期の注目を獲得できる.最後に,長期の注目とは,人々の興味を途切れなく,深くつなぎ止めた段階のことである.この段階に至れば,作り手の思惑通りに事が進む可能性が高まる .

3つの注目には,それぞれを獲得するための手法がある.それは,自動,フレーミング,破壊,報酬,評判,ミステリー,承認の7種類のトリガーである.即時の注目を獲得するのに有効なのは,自動トリガーである.自動トリガーとは,対比か無意識の連想によって,特定の感覚的手がかりに注意を向ける傾向このことである.次に,短期の注目を獲得するのに有効なのは,フレーミングトリガー,破壊トリガー,報酬トリガーである.フレーミングトリガーとは,相手の世界観にしたがうか,それを覆すことによって注意を向けてしまう傾向のことである.破壊トリガーとは,人々の期待をあえて裏切り,注目するものを変えさせるのに効果がある.報酬トリガーとは,報酬により人々のモチベーションを向上させる傾向である.最後に,長期の注目を獲得するのに有効なのは,評価トリガー,ミステリートリガー,承認トリガーである.評価トリガーとは,専門家,権威者,大衆の評価を用いて,対象への信頼性が高まったり,魅力が高まったりする傾向である.ミステリートリガーとは,謎や不確実性やサスペンスを作り出して,最後まで関心をつなぎ止める働きのことである.承認トリガーとは,自分を承認し,理解してくれる人に寄せる関心のことである.これら7つのトリガーを適切に組み合わせれば,即時から長期まで注目を維持することができる.

「いいものさえ作れば客は来る」?まったく困った考え方だ.このフレーズを見たとき,ドキッとした.なぜなら,「いいものさえ作れば客は来る」は自分がいつも念頭に置いているポリシーだからだ.いきなり脳天を撃ち抜かれた感はあったが,逆にどうしてそんなことが言えるのか興味をそそられてしまった.多分,最初に紹介したフレーズは本書に記されているフレーミングトリガーなのだろう.相手の世界観を覆すというその手法により,まんまと自分の注目は本書に寄せられてしまったようだ.本書で紹介されている7つのトリガーはいずれも使いやすい手段のように思える.それらの効果は,実践を通して確かめていきたい.