2021年7月23日金曜日

Eclipse IDE for Enterprise Java and Web Developers上のTomcatにHTTPSでアクセスする方法

Eclipse IDE for Enterprise Java and Web Developers上のTomcatにHTTPSでアクセスする方法をメモしておきます.

1. mkcert -install
2. cd $HOME/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0
3. mkcert localhost X.X.X.X
4. openssl pkcs12 -export -in localhost+1.pem -inkey localhost+1-key.pem -out localhost+1.p12
5. keytool -importkeystore -destkeystore localhost+1.jks -srckeystore localhost+1.p12 -srcstoretype PKCS12
途中パスワードを求められます.
6. Eclipseのプロジェクトエクスプローラーから「Other projects-> Servers -> Tomcat vX.X Server at localhost-config」で辿り着ける場所にあるserver.xmlを開く.
7. 次のコメントの下に
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
  maxThreads="150" SSLEnabled="true">
  <SSLHostConfig>
    <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
    type="RSA" />
  </SSLHostConfig>
</Connector>
-->
次の内容を追加する.
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
  maxThreads="150" SSLEnabled="true">
  <SSLHostConfig>
    <Certificate certificateKeystoreFile="conf/localhost+1.jks"
      certificateKeystorePassword="XXXXXXXX"
      type="RSA" />
  </SSLHostConfig>
</Connector>
XXXXXXXXは,5で指定したパスワードを記す.

2020年12月18日金曜日

Eclipse Java EEのDynamic Web ProjectでJavaScriptライブラリの構成管理をしつつモジュラーハンドラーを利用する方法

Eclipse Java EEのDynamic Web ProjectでJavaScriptのライブラリの構成管理をやりたかったので,ちょっとトライしてみました.

以下の作業をすれば,${PROJECT_HOME}/libにあるJavaScriptのライブラリ,あるいは,${PROJECT_HOME}/src/main/javascriptにある自身のコードが更新した際に,それらを一つにパックしたコードを${PROJECT_HOME}/src/main/webapp/jsに作成することができます.ただ,ライブラリと自分のコードを一つにパックすると,デバッグしずらいし,Builderをプロジェクトごとに登録するのが面倒だし,元々やりたかったのはJavaScriptライブラリの構成管理なので,使わずじまいとなりそうです.ちなみに,${PROJECT_HOME}は,プロジェクトのベースとなるディレクトリのことです.

1.存在しない場合,下記のディレクトリを作成.
  • ${PROJECT_HOME}/lib
  • ${PROJECT_HOME}/src/main/javascript
  • ${PROJECT_HOME}/src/main/webapp/js
2.次のコマンドを実行.
% cd ${PROJECT_HOME}/lib
% npm init -y
% npm install --save-dev webpack webpack-cli
3.次の内容を「${PROJECT_HOME}/lib/package.json」に追加.
{
      :
  "scripts": {
      :
    "build": "webpack --mode=production"
  },
      :
}
4.次の内容のファイルを「${PROJECT_HOME}/lib/webpack.config.js」に作成.
module.exports = {
    entry: '../src/main/javascript/index.js',
    output: {
        path: __dirname + '/../src/main/webapp/js',
        filename: 'main.js',
    },
    resolve: {
        modules: ["node_modules", "../../../lib/node_modules/"],
    }
};
5.次の内容の実行ファイル(実行パーミッションを付与する必要あり)を「${PROJECT_HOME}/bin/npmbuild.sh」に作成.
#!/bin/sh
export PATH="/usr/local/bin:$PATH"
npm run build
6.右ボタンを押下して,表示されるプルダウンメニューから「Properties」を選択.
7.「Properties」ダイアログにおいて次の操作を実行.
1.左にあるメニューから「Builders」を選択.
2. 「New...」ボタンを押下.
8.「Choose configuration type」ダイアログ内の「Program」を選択し,「OK」ボタンを押下.
9.「Edit Configuration」ダイアログにおいて次の操作を実行.
1.「Name」に作成するBuilderの名称を入力.
2. 「Main」タブにおいて,次の操作を実行.
1.「Location」に実行ファイルのパスを入力(「Browse Workspace...」ボタンを押下して表示されるダイアログで当該ファイルを選択可能).
2.「Working Directory」に「package.json」が置かれたディレクトリのパスを入力(「Browse Workspace...」ボタンを押下して表示されるダイアログで当該ファイルを選択可能).
3. 「Refresh」タブにおいて,次の操作を実行.
1.「Refresh resources upon completion」をチェック.
2.「Specific resources」をチェック.
3.「Specify Resources...」ボタンを押下して表示されるダイアログでBuilderを実行する対象となるディレクトリを選択.
4.「Recursively include sub-folders」をチェック.
4. 「Build Options」タブにおいて,次の操作を実行.
1.「Allocate Console」をチェック.
2.「After a "Clean"」,「During manual builds」,「During auto builds」をチェック.
3.「Specify working set of relevant resources」をチェック.
4.「Specify Resources...」ボタンを押下して表示されるダイアログでBuilderを実行する対象となるディレクトリを選択.
5. 「OK」ボタンを押下.
10.「Properties」ダイアログにおいて,次の操作を実行.
1.選択したBuilderがリストの一番上になるまで「Up」ボタンを押下.
2.「Apply and Close」ボタンを押下.

2020年12月9日水曜日

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

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

  • Dynamic Web Projectを作成する.
  • プロジェクトのルートに以下に記すbuild.gradleファイルを作成する.
  • プロジェクトを右クリックして表示されるポップアップメニューで「Configure->Add Gradle Nature」を選択する.
  • srcディレクトリの配下にmain/javaディレクトリを作成する.
  • WebContentディレクトリをsrc/mainに移動し,「webapp」ディレクトリに改名する.
  • プロジェクトを右クリックして表示されるポップアップメニューで「Properties->Deployment Assembly」を選択する.
  • 「Web Deployment Assembly」ダイアログでAddボタンを押下する.
  • 「New Assembly Directive」ダイアログで「Folder」を選択し,Nextボタンを押下する.
  • 「New Assembly Directive」ダイアログで「src->main->webapp」を選択し,Finishボタンを押下する.
  • プロジェクトを右クリックして表示されるポップアップメニューで「Gradle->Refreash Gradle Project」を選択する.
  • buildディレクトリを削除する.

以前同じタイトルの内容[1]を投稿したのですが,こちらのほうが前のよりよい気がしたので,今後はこの方法でやっていこうと思います.

[1] Eclipse EEのDynamic Web Projectにおいてライブラリを管理するためにGradleを使う方法, https://emaizetto.blogspot.com/2020/04/eclipse-eedynamic-web-projectgradle.html

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アプリを作っていこうと思います.以前から構成管理に憧れていて,ずっとやりたかったんだけど,やっと踏み出すことができて良かったです.

「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)の部分を修正したところ, ようやく期待通りの動作をさせることができました.